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