Restored api docs
diff --git a/xos/tests/api/README.md b/xos/tests/api/README.md
new file mode 100644
index 0000000..67db53d
--- /dev/null
+++ b/xos/tests/api/README.md
@@ -0,0 +1,11 @@
+# xos-api-docs
+
+These folder contain the XOS API definition and specs. To run tests visit `configurations/test-standalone` folder.
+
+To document new API:
+- run `npm install`
+- run `npm start`
+- add the appropriate endpont under `source` folder.
+
+_API are documented using (Api BluePrint)[https://apiblueprint.org/] syntax and the documentation is published on (Apiary)[http://docs.xos.apiary.io/#]_
+
diff --git a/xos/tests/api/apiary.apib b/xos/tests/api/apiary.apib
new file mode 100644
index 0000000..43a81c7
--- /dev/null
+++ b/xos/tests/api/apiary.apib
@@ -0,0 +1,461 @@
+FORMAT: 1A
+
+# XOS
+ 
+ 
+# Group ONOS Services
+
+## ONOS Services Collection [/api/service/onos/]
+
+### List all ONOS Services [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "service_ONOS_vBNG",
+                "id": 5,
+                "rest_hostname": "",
+                "rest_port": "8181",
+                "no_container": false,
+                "node_key": ""
+            }
+        ]
+ 
+ 
+# Group vSG
+
+## vSG Collection [/api/service/vsg/]
+
+### List all vSGs [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "service_vsg",
+                "id": 2,
+                "wan_container_gateway_ip": "",
+                "wan_container_gateway_mac": "",
+                "dns_servers": "8.8.8.8",
+                "url_filter_kind": null,
+                "node_label": null
+            }
+        ]
+ 
+ 
+# Group Subscribers
+
+Resource related to the CORD Subscribers.
+
+## Subscribers Collection [/api/tenant/cord/subscriber/]
+
+### List All Subscribers [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "cordSubscriber-1",
+                "id": 1,
+                "features": {
+                    "cdn": false,
+                    "uplink_speed": 1000000000,
+                    "downlink_speed": 1000000000,
+                    "uverse": false,
+                    "status": "enabled"
+                },
+                "identity": {
+                    "account_num": "123",
+                    "name": "My House"
+                },
+                "related": {
+                    "instance_name": "mysite_vcpe",
+                    "vsg_id": 4,
+                    "compute_node_name": "node2.opencloud.us",
+                    "c_tag": "432",
+                    "instance_id": 1,
+                    "wan_container_ip": null,
+                    "volt_id": 3,
+                    "s_tag": "222"
+                }
+            }
+        ]
+
+## Subscriber Detail [/api/tenant/cord/subscriber/{subscriber_id}/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+### View a Subscriber Detail [GET]
+
++ Response 200 (application/json)
+ 
+        {
+            "humanReadableName": "cordSubscriber-1", 
+            "id": 1, 
+            "features": { 
+                "cdn": false, 
+                "uplink_speed": 1000000000, 
+                "downlink_speed": 1000000000, 
+                "uverse": false, 
+                "status": "enabled" 
+            }, 
+            "identity": { 
+                "account_num": "123",
+                "name": "My House"
+            }, 
+            "related": { 
+                "instance_name": "mysite_vcpe", 
+                "vsg_id": 4, 
+                "compute_node_name": "node2.opencloud.us",
+                "c_tag": "432", 
+                "instance_id": 1, 
+                "wan_container_ip": null, 
+                "volt_id": 3, 
+                "s_tag": "222" 
+            } 
+        }
+
+### Delete a Subscriber [DELETE]
+
++ Response 204
+
+### Subscriber features [/api/tenant/cord/subscriber/{subscriber_id}/features/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+### View a Subscriber Features Detail [GET]
+
++ Response 200 (application/json)
+
+        {
+            "cdn": false, 
+            "uplink_speed": 1000000000, 
+            "downlink_speed": 1000000000, 
+            "uverse": true, 
+            "status": "enabled"
+        }
+
+#### Subscriber features uplink_speed [/api/tenant/cord/subscriber/{subscriber_id}/features/uplink_speed/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber uplink_speed [GET]
+
++ Response 200 (application/json)
+
+        {
+            "uplink_speed": 1000000000
+        }
+
+#### Update Subscriber uplink_speed [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "uplink_speed": 1000000000
+        }
+
++ Response 200 (application/json)
+
+        {
+            "uplink_speed": 1000000000
+        }
+
+#### Subscriber features downlink_speed [/api/tenant/cord/subscriber/{subscriber_id}/features/downlink_speed/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber downlink_speed [GET]
+
++ Response 200 (application/json)
+
+        {
+            "downlink_speed": 1000000000
+        }
+
+#### Update Subscriber downlink_speed [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "downlink_speed": 1000000000
+        }
+
++ Response 200 (application/json)
+
+        {
+            "downlink_speed": 1000000000
+        }
+
+#### Subscriber features cdn [/api/tenant/cord/subscriber/{subscriber_id}/features/cdn/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber cdn [GET]
+
++ Response 200 (application/json)
+
+        {
+            "cdn": false
+        }
+
+#### Update Subscriber cdn [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "cdn": false
+        }
+
++ Response 200 (application/json)
+
+        {
+            "cdn": false
+        }
+
+#### Subscriber features uverse [/api/tenant/cord/subscriber/{subscriber_id}/features/uverse/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber uverse [GET]
+
++ Response 200 (application/json)
+
+        {
+            "uverse": false
+        }
+
+#### Update Subscriber uverse [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "uverse": false
+        }
+
++ Response 200 (application/json)
+
+        {
+            "uverse": false
+        }
+
+#### Subscriber features status [/api/tenant/cord/subscriber/{subscriber_id}/features/status/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber status [GET]
+
++ Response 200 (application/json)
+
+        {
+            "status": "enabled"
+        }
+
+#### Update Subscriber status [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "status": "enabled"
+        }
+
++ Response 200 (application/json)
+
+        {
+            "status": "enabled"
+        }
+ 
+ 
+# Group Truckroll
+
+Virtual Truckroll, enable to perform basic test on user connectivity such as ping, traceroute and tcpdump.
+
+## Truckroll Collection [/api/tenant/truckroll/]
+
+### List all Truckroll [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "vTR-tenant-9",
+                "id": 9,
+                "provider_service": 6,
+                "target_id": 2,
+                "scope": "container",
+                "test": "ping",
+                "argument": "8.8.8.8",
+                "result": "",
+                "result_code": "",
+                "is_synced": false,
+                "backend_status": "2 - Exception('Unreachable results in ansible recipe',)"
+            }
+        ]
+
+### Create a Truckroll [POST]
+
++ Request (application/json)
+
+        {
+            "target_id": 2,
+            "scope": "container",
+            "test": "ping",
+            "argument": "8.8.8.8"
+        }
+
++ Response 201 (application/json)
+
+        {
+            "humanReadableName": "vTR-tenant-1",
+            "id": 1,
+            "provider_service": 6,
+            "target_id": 2,
+            "scope": "container",
+            "test": "ping",
+            "argument": "8.8.8.8",
+            "result": null,
+            "result_code": null,
+            "is_synced": false,
+            "backend_status": "0 - Provisioning in progress"
+        }
+
+## Truckroll Detail [/api/tenant/truckroll/{truckroll_id}/]
+
+A virtual truckroll is complete once is_synced equal true
+
++ Parameters
+    + truckroll_id: 1 (number) - ID of the Truckroll in the form of an integer
+
+### View a Truckroll Detail [GET]
+
++ Response 200 (application/json)
+
+        {
+            "humanReadableName": "vTR-tenant-10",
+            "id": 10,
+            "provider_service": 6,
+            "target_id": 2,
+            "scope": "container",
+            "test": "ping",
+            "argument": "8.8.8.8",
+            "result": null,
+            "result_code": null,
+            "is_synced": false,
+            "backend_status": "0 - Provisioning in progress"
+        }
+
+### Delete a Truckroll Detail [DELETE]
+
++ Response 204
+
+ 
+ 
+# Group vOLT
+
+OLT devices aggregate a set of subscriber connections
+
+## vOLT Collection [/api/tenant/cord/volt/]
+
+### List all vOLT [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "vOLT-tenant-1",
+                "id": 1,
+                "service_specific_id": "123",
+                "s_tag": "222",
+                "c_tag": "432",
+                "subscriber": 1,
+                "related": {
+                    "instance_id": 1,
+                    "instance_name": "mysite_vcpe",
+                    "vsg_id": 4,
+                    "wan_container_ip": null,
+                    "compute_node_name": "node2.opencloud.us"
+                }
+            }
+        ]
+
+### Create a vOLT [POST]
+
++ Request (application/json)
+
+        {
+            "s_tag": "222",
+            "c_tag": "432",
+            "subscriber": 1
+        }
+
++ Response 201 (application/json)
+
+        {
+                "humanReadableName": "vOLT-tenant-1",
+                "id": 1,
+                "service_specific_id": "123",
+                "s_tag": "222",
+                "c_tag": "432",
+                "subscriber": 1,
+                "related": {
+                    "instance_id": 1,
+                    "instance_name": "mysite_vcpe",
+                    "vsg_id": 4,
+                    "wan_container_ip": null,
+                    "compute_node_name": "node2.opencloud.us"
+                }
+            }
+
+## vOLT Detail [/api/tenant/cord/volt/{volt_id}/]
+
+A virtual volt is complete once is_synced equal true
+
++ Parameters
+    + volt_id: 1 (number) - ID of the vOLT in the form of an integer
+
+### View a vOLT Detail [GET]
+
++ Response 200 (application/json)
+
+        {
+            "humanReadableName": "vOLT-tenant-1",
+            "id": 1,
+            "service_specific_id": "123",
+            "s_tag": "222",
+            "c_tag": "432",
+            "subscriber": 1,
+            "related": {
+                "instance_id": 1,
+                "instance_name": "mysite_vcpe",
+                "vsg_id": 4,
+                "wan_container_ip": null,
+                "compute_node_name": "node2.opencloud.us"
+            }
+        }
+
+ 
+ 
+# Group ONOS Apps
+
+## app Collection [/api/tenant/onos/app/]
+
+### List all apps [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "onos-tenant-7",
+                "id": 7,
+                "name": "vBNG_ONOS_app",
+                "dependencies": "org.onosproject.proxyarp, org.onosproject.virtualbng, org.onosproject.openflow, org.onosproject.fwd"
+            }
+        ]
\ No newline at end of file
diff --git a/xos/tests/api/dredd.yml b/xos/tests/api/dredd.yml
new file mode 100644
index 0000000..a214c7c
--- /dev/null
+++ b/xos/tests/api/dredd.yml
@@ -0,0 +1,35 @@
+reporter: apiary
+custom:
+  apiaryApiKey: f941658c6714ebf58eeda5e0786e937f
+  apiaryApiName: xos
+dry-run: null
+hookfiles: "./hooks.py"
+language: python
+sandbox: false
+server: null
+server-wait: 3
+init: false
+names: false
+only: []
+output: []
+header: []
+sorted: false
+user: null
+inline-errors: false
+details: false
+method: []
+color: true
+level: info
+timestamp: false
+silent: false
+path: []
+hooks-worker-timeout: 5000
+hooks-worker-connect-timeout: 1500
+hooks-worker-connect-retry: 500
+hooks-worker-after-connect-wait: 100
+hooks-worker-term-timeout: 5000
+hooks-worker-term-retry: 500
+hooks-worker-handler-host: localhost
+hooks-worker-handler-port: 61321
+blueprint: apiary.apib
+endpoint: 'http://127.0.0.1:8000/'
diff --git a/xos/tests/api/gulpfile.js b/xos/tests/api/gulpfile.js
new file mode 100644
index 0000000..2e82210
--- /dev/null
+++ b/xos/tests/api/gulpfile.js
@@ -0,0 +1,17 @@
+var gulp = require('gulp');
+var concat = require('gulp-concat');
+
+
+
+gulp.task('default', function() {
+  gulp.watch('./source/**/*.md', ['concat']);
+});
+
+gulp.task('concat', function() {
+  return gulp.src([
+      './source/base.md',
+      './source/**/*.md'
+    ])
+    .pipe(concat('apiary.apib', {newLine: '\n \n \n'}))
+    .pipe(gulp.dest('./'));
+});
diff --git a/xos/tests/api/helpers/__init__.py b/xos/tests/api/helpers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/xos/tests/api/helpers/__init__.py
diff --git a/xos/tests/api/helpers/subscriber.py b/xos/tests/api/helpers/subscriber.py
new file mode 100644
index 0000000..0ff02c2
--- /dev/null
+++ b/xos/tests/api/helpers/subscriber.py
@@ -0,0 +1,167 @@
+import dredd_hooks as hooks
+import sys
+
+# HELPERS
+# NOTE move in separated module
+import os
+import sys
+sys.path.append("/opt/xos")
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
+import django
+from core.models import *
+from services.cord.models import *
+from services.vtr.models import *
+from django.contrib.auth import authenticate, login
+from django.core.exceptions import PermissionDenied
+from django.contrib.sessions.models import Session
+import urllib2
+import json
+django.setup()
+
+token = ''
+
+
+def doLogin(username, password):
+
+    url = "http://127.0.0.1:8000/xoslib/login?username=%s&password=%s" % (username, password)
+
+    print url
+
+    res = urllib2.urlopen(url).read()
+
+    token = json.loads(res)['xoscsrftoken']
+
+
+def cleanDB():
+    # deleting all subscribers
+    for s in CordSubscriberRoot.objects.all():
+        s.delete(purge=True)
+
+    # deleting all slices
+    for s in Slice.objects.all():
+        s.delete(purge=True)
+
+    # deleting all Services
+    for s in Service.objects.all():
+        s.delete(purge=True)
+
+    # deleting all Tenants
+    for s in Tenant.objects.all():
+        s.delete(purge=True)
+
+    # deleting all Networks
+    for s in Network.objects.all():
+        s.delete(purge=True)
+
+    # deleting all NetworkTemplates
+    for s in NetworkTemplate.objects.all():
+        s.delete(purge=True)
+
+    for s in NetworkSlice.objects.all():
+        s.delete(purge=True)
+
+    print 'DB Cleaned'
+
+
+def createTestSubscriber():
+
+    cleanDB()
+
+    # load user
+    user = User.objects.get(email="padmin@vicci.org")
+
+    # network template
+    private_template = NetworkTemplate()
+    private_template.name = 'Private Network'
+    private_template.save()
+
+    # creating the test subscriber
+    subscriber = CordSubscriberRoot(name='Test Subscriber 1', id=1)
+    subscriber.save()
+
+    # Site
+    site = Site.objects.get(name='MySite')
+
+    # vSG service
+    vsg_service = VSGService()
+    vsg_service.name = 'service_vsg'
+
+    # vSG slice
+    vsg_slice = Slice()
+    vsg_slice.name = site.login_base + "_testVsg"
+    vsg_slice.service = vsg_service.id
+    vsg_slice.site = site
+    vsg_slice.caller = user
+
+    vsg_slice.save()
+
+    vsg_service.save()
+
+    # volt service
+    volt_service = VOLTService()
+    volt_service.name = 'service_volt'
+    volt_service.save()
+
+    # vcpe slice
+    vcpe_slice = Slice()
+    vcpe_slice.name = site.login_base + "_testVcpe"
+    vcpe_slice.service = Service.objects.get(kind='vCPE')
+    vcpe_slice.site = site
+    vcpe_slice.caller = user
+    vcpe_slice.save()
+
+    print 'vcpe_slice created'
+
+    # create a lan network
+    lan_net = Network()
+    lan_net.name = 'lan_network'
+    lan_net.owner = vcpe_slice
+    lan_net.template = private_template
+    lan_net.save()
+
+    print 'lan_network created'
+
+    # add relation between vcpe slice and lan network
+    vcpe_network = NetworkSlice()
+    vcpe_network.network = lan_net
+    vcpe_network.slice = vcpe_slice
+    vcpe_network.save()
+
+    print 'vcpe network relation added'
+
+    # vbng service
+    vbng_service = VBNGService()
+    vbng_service.name = 'service_vbng'
+    vbng_service.save()
+
+    print 'vbng_service creater'
+
+    # volt tenant
+    vt = VOLTTenant(subscriber=subscriber.id, id=1)
+    vt.s_tag = "222"
+    vt.c_tag = "432"
+    vt.provider_service_id = volt_service.id
+    vt.caller = user
+    vt.save()
+
+    print "Subscriber Created"
+
+
+def deleteTruckrolls():
+    for s in VTRTenant.objects.all():
+        s.delete(purge=True)
+
+
+def setUpTruckroll():
+    service_vtr = VTRService()
+    service_vtr.name = 'service_vtr'
+    service_vtr.save()
+
+
+def createTruckroll():
+    setUpTruckroll()
+    tn = VTRTenant(id=1)
+    tn.save()
+
+
+createTestSubscriber()
diff --git a/xos/tests/api/hooks.py b/xos/tests/api/hooks.py
new file mode 100644
index 0000000..6779014
--- /dev/null
+++ b/xos/tests/api/hooks.py
@@ -0,0 +1,194 @@
+import dredd_hooks as hooks
+import sys
+
+# HELPERS
+# NOTE move in separated module
+import os
+import sys
+sys.path.append("/opt/xos")
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
+import django
+from core.models import *
+from services.cord.models import *
+from services.vtr.models import *
+import urllib2
+import json
+django.setup()
+
+
+def doLogin(username, password):
+    url = "http://127.0.0.1:8000/xoslib/login?username=%s&password=%s" % (username, password)
+    res = urllib2.urlopen(url).read()
+    parsed = json.loads(res)
+    return {'token': parsed['xoscsrftoken'], 'sessionid': parsed['xossessionid']}
+
+
+def cleanDB():
+    # deleting all subscribers
+    for s in CordSubscriberRoot.objects.all():
+        s.delete(purge=True)
+
+    # deleting all slices
+    for s in Slice.objects.all():
+        s.delete(purge=True)
+
+    # deleting all Services
+    for s in Service.objects.all():
+        s.delete(purge=True)
+
+    # deleting all Tenants
+    for s in Tenant.objects.all():
+        s.delete(purge=True)
+
+    # deleting all Networks
+    for s in Network.objects.all():
+        s.delete(purge=True)
+
+    # deleting all NetworkTemplates
+    for s in NetworkTemplate.objects.all():
+        s.delete(purge=True)
+
+    for s in NetworkSlice.objects.all():
+        s.delete(purge=True)
+
+    # print 'DB Cleaned'
+
+
+def createTestSubscriber():
+
+    cleanDB()
+
+    # load user
+    user = User.objects.get(email="padmin@vicci.org")
+
+    # network template
+    private_template = NetworkTemplate()
+    private_template.name = 'Private Network'
+    private_template.save()
+
+    # creating the test subscriber
+    subscriber = CordSubscriberRoot(name='Test Subscriber 1', id=1)
+    subscriber.save()
+
+    # Site
+    site = Site.objects.get(name='MySite')
+
+    # vSG service
+    vsg_service = VSGService()
+    vsg_service.name = 'service_vsg'
+
+    # vSG slice
+    vsg_slice = Slice()
+    vsg_slice.name = site.login_base + "_testVsg"
+    vsg_slice.service = vsg_service.id
+    vsg_slice.site = site
+    vsg_slice.caller = user
+
+    vsg_slice.save()
+
+    vsg_service.save()
+
+    # volt service
+    volt_service = VOLTService()
+    volt_service.name = 'service_volt'
+    volt_service.save()
+
+    # vcpe slice
+    vcpe_slice = Slice()
+    vcpe_slice.name = site.login_base + "_testVcpe"
+    vcpe_slice.service = Service.objects.get(kind='vCPE')
+    vcpe_slice.site = site
+    vcpe_slice.caller = user
+    vcpe_slice.save()
+
+    # print 'vcpe_slice created'
+
+    # create a lan network
+    lan_net = Network()
+    lan_net.name = 'lan_network'
+    lan_net.owner = vcpe_slice
+    lan_net.template = private_template
+    lan_net.save()
+
+    # print 'lan_network created'
+
+    # add relation between vcpe slice and lan network
+    vcpe_network = NetworkSlice()
+    vcpe_network.network = lan_net
+    vcpe_network.slice = vcpe_slice
+    vcpe_network.save()
+
+    # print 'vcpe network relation added'
+
+    # vbng service
+    vbng_service = VBNGService()
+    vbng_service.name = 'service_vbng'
+    vbng_service.save()
+
+    # print 'vbng_service creater'
+
+    # volt tenant
+    vt = VOLTTenant(subscriber=subscriber.id, id=1)
+    vt.s_tag = "222"
+    vt.c_tag = "432"
+    vt.provider_service_id = volt_service.id
+    vt.caller = user
+    vt.save()
+
+    # print "Subscriber Created"
+
+
+def deleteTruckrolls():
+    for s in VTRTenant.objects.all():
+        s.delete(purge=True)
+
+
+def setUpTruckroll():
+    service_vtr = VTRService()
+    service_vtr.name = 'service_vtr'
+    service_vtr.save()
+
+
+def createTruckroll():
+    setUpTruckroll()
+    tn = VTRTenant(id=1)
+    tn.save()
+
+
+@hooks.before_all
+def my_before_all_hook(transactions):
+    # print "-------------------------------- Before All Hook --------------------------------"
+    cleanDB()
+
+
+@hooks.before_each
+def my_before_each_hook(transaction):
+    # print "-------------------------------- Before Each Hook --------------------------------"
+    auth = doLogin('padmin@vicci.org', 'letmein')
+    transaction['request']['headers']['X-CSRFToken'] = auth['token']
+    transaction['request']['headers']['Cookie'] = "xossessionid=%s; xoscsrftoken=%s" % (auth['sessionid'], auth['token'])
+    createTestSubscriber()
+    sys.stdout.flush()
+
+
+@hooks.before("Truckroll > Truckroll Collection > Create a Truckroll")
+def test1(transaction):
+    setUpTruckroll()
+
+
+@hooks.before("Truckroll > Truckroll Detail > View a Truckroll Detail")
+def test2(transaction):
+    deleteTruckrolls()
+    createTruckroll()
+
+
+@hooks.before("Truckroll > Truckroll Detail > Delete a Truckroll Detail")
+def test3(transaction):
+    deleteTruckrolls()
+    createTruckroll()
+
+
+@hooks.before("vOLT > vOLT Collection > Create a vOLT")
+def test4(transaction):
+    # transaction['skip'] = True
+    VOLTTenant.objects.get(kind='vOLT').delete()
diff --git a/xos/tests/api/package.json b/xos/tests/api/package.json
new file mode 100644
index 0000000..9a2ba84
--- /dev/null
+++ b/xos/tests/api/package.json
@@ -0,0 +1,28 @@
+{
+  "name": "xos-api-docs",
+  "version": "1.0.0",
+  "description": "Api documentation for XOS",
+  "main": "index.js",
+  "scripts": {
+    "start": "gulp",
+    "test": "dredd",
+    "dry": "dredd --dry-run"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/teone/xos-api-docs.git"
+  },
+  "author": "Matteo Scandolo",
+  "license": "ISC",
+  "bugs": {
+    "url": "https://github.com/teone/xos-api-docs/issues"
+  },
+  "homepage": "https://github.com/teone/xos-api-docs#readme",
+  "dependencies": {
+    "dredd": "^1.0.8"
+  },
+  "devDependencies": {
+    "gulp": "^3.9.1",
+    "gulp-concat": "^2.6.0"
+  }
+}
diff --git a/xos/tests/api/source/base.md b/xos/tests/api/source/base.md
new file mode 100644
index 0000000..564798b
--- /dev/null
+++ b/xos/tests/api/source/base.md
@@ -0,0 +1,3 @@
+FORMAT: 1A
+
+# XOS
\ No newline at end of file
diff --git a/xos/tests/api/source/service/onos.md b/xos/tests/api/source/service/onos.md
new file mode 100644
index 0000000..3b5e623
--- /dev/null
+++ b/xos/tests/api/source/service/onos.md
@@ -0,0 +1,18 @@
+# Group ONOS Services
+
+## ONOS Services Collection [/api/service/onos/]
+
+### List all ONOS Services [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "service_ONOS_vBNG",
+                "id": 5,
+                "rest_hostname": "",
+                "rest_port": "8181",
+                "no_container": false,
+                "node_key": ""
+            }
+        ]
\ No newline at end of file
diff --git a/xos/tests/api/source/service/vsg.md b/xos/tests/api/source/service/vsg.md
new file mode 100644
index 0000000..9247450
--- /dev/null
+++ b/xos/tests/api/source/service/vsg.md
@@ -0,0 +1,19 @@
+# Group vSG
+
+## vSG Collection [/api/service/vsg/]
+
+### List all vSGs [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "service_vsg",
+                "id": 2,
+                "wan_container_gateway_ip": "",
+                "wan_container_gateway_mac": "",
+                "dns_servers": "8.8.8.8",
+                "url_filter_kind": null,
+                "node_label": null
+            }
+        ]
\ No newline at end of file
diff --git a/xos/tests/api/source/tenant/cord/subscribers.md b/xos/tests/api/source/tenant/cord/subscribers.md
new file mode 100644
index 0000000..bd38d04
--- /dev/null
+++ b/xos/tests/api/source/tenant/cord/subscribers.md
@@ -0,0 +1,228 @@
+# Group Subscribers
+
+Resource related to the CORD Subscribers.
+
+## Subscribers Collection [/api/tenant/cord/subscriber/]
+
+### List All Subscribers [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "cordSubscriber-1",
+                "id": 1,
+                "features": {
+                    "cdn": false,
+                    "uplink_speed": 1000000000,
+                    "downlink_speed": 1000000000,
+                    "uverse": false,
+                    "status": "enabled"
+                },
+                "identity": {
+                    "account_num": "123",
+                    "name": "My House"
+                },
+                "related": {
+                    "instance_name": "mysite_vcpe",
+                    "vsg_id": 4,
+                    "compute_node_name": "node2.opencloud.us",
+                    "c_tag": "432",
+                    "instance_id": 1,
+                    "wan_container_ip": null,
+                    "volt_id": 3,
+                    "s_tag": "222"
+                }
+            }
+        ]
+
+## Subscriber Detail [/api/tenant/cord/subscriber/{subscriber_id}/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+### View a Subscriber Detail [GET]
+
++ Response 200 (application/json)
+ 
+        {
+            "humanReadableName": "cordSubscriber-1", 
+            "id": 1, 
+            "features": { 
+                "cdn": false, 
+                "uplink_speed": 1000000000, 
+                "downlink_speed": 1000000000, 
+                "uverse": false, 
+                "status": "enabled" 
+            }, 
+            "identity": { 
+                "account_num": "123",
+                "name": "My House"
+            }, 
+            "related": { 
+                "instance_name": "mysite_vcpe", 
+                "vsg_id": 4, 
+                "compute_node_name": "node2.opencloud.us",
+                "c_tag": "432", 
+                "instance_id": 1, 
+                "wan_container_ip": null, 
+                "volt_id": 3, 
+                "s_tag": "222" 
+            } 
+        }
+
+### Delete a Subscriber [DELETE]
+
++ Response 204
+
+### Subscriber features [/api/tenant/cord/subscriber/{subscriber_id}/features/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+### View a Subscriber Features Detail [GET]
+
++ Response 200 (application/json)
+
+        {
+            "cdn": false, 
+            "uplink_speed": 1000000000, 
+            "downlink_speed": 1000000000, 
+            "uverse": true, 
+            "status": "enabled"
+        }
+
+#### Subscriber features uplink_speed [/api/tenant/cord/subscriber/{subscriber_id}/features/uplink_speed/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber uplink_speed [GET]
+
++ Response 200 (application/json)
+
+        {
+            "uplink_speed": 1000000000
+        }
+
+#### Update Subscriber uplink_speed [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "uplink_speed": 1000000000
+        }
+
++ Response 200 (application/json)
+
+        {
+            "uplink_speed": 1000000000
+        }
+
+#### Subscriber features downlink_speed [/api/tenant/cord/subscriber/{subscriber_id}/features/downlink_speed/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber downlink_speed [GET]
+
++ Response 200 (application/json)
+
+        {
+            "downlink_speed": 1000000000
+        }
+
+#### Update Subscriber downlink_speed [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "downlink_speed": 1000000000
+        }
+
++ Response 200 (application/json)
+
+        {
+            "downlink_speed": 1000000000
+        }
+
+#### Subscriber features cdn [/api/tenant/cord/subscriber/{subscriber_id}/features/cdn/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber cdn [GET]
+
++ Response 200 (application/json)
+
+        {
+            "cdn": false
+        }
+
+#### Update Subscriber cdn [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "cdn": false
+        }
+
++ Response 200 (application/json)
+
+        {
+            "cdn": false
+        }
+
+#### Subscriber features uverse [/api/tenant/cord/subscriber/{subscriber_id}/features/uverse/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber uverse [GET]
+
++ Response 200 (application/json)
+
+        {
+            "uverse": false
+        }
+
+#### Update Subscriber uverse [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "uverse": false
+        }
+
++ Response 200 (application/json)
+
+        {
+            "uverse": false
+        }
+
+#### Subscriber features status [/api/tenant/cord/subscriber/{subscriber_id}/features/status/]
+
++ Parameters
+    + subscriber_id: 1 (number) - ID of the Subscriber in the form of an integer
+
+#### Read Subscriber status [GET]
+
++ Response 200 (application/json)
+
+        {
+            "status": "enabled"
+        }
+
+#### Update Subscriber status [PUT]
+
++ Request 200 (application/json)
+
+        {
+            "status": "enabled"
+        }
+
++ Response 200 (application/json)
+
+        {
+            "status": "enabled"
+        }
\ No newline at end of file
diff --git a/xos/tests/api/source/tenant/cord/truckroll.md b/xos/tests/api/source/tenant/cord/truckroll.md
new file mode 100644
index 0000000..33b67db
--- /dev/null
+++ b/xos/tests/api/source/tenant/cord/truckroll.md
@@ -0,0 +1,81 @@
+# Group Truckroll
+
+Virtual Truckroll, enable to perform basic test on user connectivity such as ping, traceroute and tcpdump.
+
+## Truckroll Collection [/api/tenant/truckroll/]
+
+### List all Truckroll [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "vTR-tenant-9",
+                "id": 9,
+                "provider_service": 6,
+                "target_id": 2,
+                "scope": "container",
+                "test": "ping",
+                "argument": "8.8.8.8",
+                "result": "",
+                "result_code": "",
+                "is_synced": false,
+                "backend_status": "2 - Exception('Unreachable results in ansible recipe',)"
+            }
+        ]
+
+### Create a Truckroll [POST]
+
++ Request (application/json)
+
+        {
+            "target_id": 2,
+            "scope": "container",
+            "test": "ping",
+            "argument": "8.8.8.8"
+        }
+
++ Response 201 (application/json)
+
+        {
+            "humanReadableName": "vTR-tenant-1",
+            "id": 1,
+            "provider_service": 6,
+            "target_id": 2,
+            "scope": "container",
+            "test": "ping",
+            "argument": "8.8.8.8",
+            "result": null,
+            "result_code": null,
+            "is_synced": false,
+            "backend_status": "0 - Provisioning in progress"
+        }
+
+## Truckroll Detail [/api/tenant/truckroll/{truckroll_id}/]
+
+A virtual truckroll is complete once is_synced equal true
+
++ Parameters
+    + truckroll_id: 1 (number) - ID of the Truckroll in the form of an integer
+
+### View a Truckroll Detail [GET]
+
++ Response 200 (application/json)
+
+        {
+            "humanReadableName": "vTR-tenant-10",
+            "id": 10,
+            "provider_service": 6,
+            "target_id": 2,
+            "scope": "container",
+            "test": "ping",
+            "argument": "8.8.8.8",
+            "result": null,
+            "result_code": null,
+            "is_synced": false,
+            "backend_status": "0 - Provisioning in progress"
+        }
+
+### Delete a Truckroll Detail [DELETE]
+
++ Response 204
diff --git a/xos/tests/api/source/tenant/cord/volt.md b/xos/tests/api/source/tenant/cord/volt.md
new file mode 100644
index 0000000..09140fd
--- /dev/null
+++ b/xos/tests/api/source/tenant/cord/volt.md
@@ -0,0 +1,82 @@
+# Group vOLT
+
+OLT devices aggregate a set of subscriber connections
+
+## vOLT Collection [/api/tenant/cord/volt/]
+
+### List all vOLT [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "vOLT-tenant-1",
+                "id": 1,
+                "service_specific_id": "123",
+                "s_tag": "222",
+                "c_tag": "432",
+                "subscriber": 1,
+                "related": {
+                    "instance_id": 1,
+                    "instance_name": "mysite_vcpe",
+                    "vsg_id": 4,
+                    "wan_container_ip": null,
+                    "compute_node_name": "node2.opencloud.us"
+                }
+            }
+        ]
+
+### Create a vOLT [POST]
+
++ Request (application/json)
+
+        {
+            "s_tag": "222",
+            "c_tag": "432",
+            "subscriber": 1
+        }
+
++ Response 201 (application/json)
+
+        {
+                "humanReadableName": "vOLT-tenant-1",
+                "id": 1,
+                "service_specific_id": "123",
+                "s_tag": "222",
+                "c_tag": "432",
+                "subscriber": 1,
+                "related": {
+                    "instance_id": 1,
+                    "instance_name": "mysite_vcpe",
+                    "vsg_id": 4,
+                    "wan_container_ip": null,
+                    "compute_node_name": "node2.opencloud.us"
+                }
+            }
+
+## vOLT Detail [/api/tenant/cord/volt/{volt_id}/]
+
+A virtual volt is complete once is_synced equal true
+
++ Parameters
+    + volt_id: 1 (number) - ID of the vOLT in the form of an integer
+
+### View a vOLT Detail [GET]
+
++ Response 200 (application/json)
+
+        {
+            "humanReadableName": "vOLT-tenant-1",
+            "id": 1,
+            "service_specific_id": "123",
+            "s_tag": "222",
+            "c_tag": "432",
+            "subscriber": 1,
+            "related": {
+                "instance_id": 1,
+                "instance_name": "mysite_vcpe",
+                "vsg_id": 4,
+                "wan_container_ip": null,
+                "compute_node_name": "node2.opencloud.us"
+            }
+        }
diff --git a/xos/tests/api/source/tenant/onos/app.md b/xos/tests/api/source/tenant/onos/app.md
new file mode 100644
index 0000000..a43aae9
--- /dev/null
+++ b/xos/tests/api/source/tenant/onos/app.md
@@ -0,0 +1,16 @@
+# Group ONOS Apps
+
+## app Collection [/api/tenant/onos/app/]
+
+### List all apps [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "humanReadableName": "onos-tenant-7",
+                "id": 7,
+                "name": "vBNG_ONOS_app",
+                "dependencies": "org.onosproject.proxyarp, org.onosproject.virtualbng, org.onosproject.openflow, org.onosproject.fwd"
+            }
+        ]
\ No newline at end of file