RO Northbound Interface
Introduction
This document describes the northbound interface of RO (openmano).
The Northbound interface is based on REST and it allows performing actions over the following entities:
- Tenant: Intended to create groups of resources. In this version no security mechanisms are implemented.
- Datacenters: Is a VIM that contains a specific pool of resources.
- VNFs: SW-based network function, composed of one or several VM that can be deployed on an NFV datacenter.
- Scenarios: topologies of VNFs and their interconnections.
- Instances: Each one of the Scenarios deployed in a datacenter.
Details
HTTP protocol details
- The HTTP HEADER "X-Auth-Token" is ignored in this version, though it will be available in future. Current version does not support security and authentication
- Server supports JSON (by default), and YAML. Use HTTP HEADER "Content-Type:
application/FORMAT" for specifying the input format and HTTP HEADER "Accept: application/FORMAT" for the wanted output format. In this version it does not support the URL suffix .yaml or .json as for example openstack neutron does.
- Server supports URL Query String filters. For example:
HTTP GET /whatever?name1=value1&name2=value2" Will filter by "name1=value1 AND name2=value2"
- In a near future version it will support pagination using limit, market, page_reverse and field filtering in the same way as openstack neutron.
- Possible responses of HTTP Commands are:
200 Ok 400 Bad Request 404 Not Found 405 Method Not Allowed 409 Conflict 503 Service Unavailable 500 Internal Server Error
Openmano Server primitives
Tenants
Get /openmano/tenants
Gets a list of all tenants
Params: None
Response: Content-type: application/json
{ "tenants": [ { "created_at": "2015-08-06T10:38:07", "description": "tenant_de_prueba", "uuid": "76094a2a-3c16-11e5-9fb6-5254004aea96", "name": "tenanttest" }, { "created_at": "2015-12-04T13:06:54", "description": "A description...", "uuid": "8293285c-9a7f-11e5-bc4f-5254004aea96", "name": "John Doe" } ] }
Get /openmano/tenants/{tenant_id}
Get the full description of the tenant identified by tenant_id (tenant´s name or uuid)
Params: None
Response: Content-type: application/json
{ "tenant": { "created_at": "2015-12-04T13:06:54", "description": "A description...", "modified_at": null, "uuid": "8293285c-9a7f-11e5-bc4f-5254004aea96", "name": "John Doe" } }
Post /openmano/tenants
Create new tenant
Params:(Extra parameters are ignored):
- name: tenant name provided by the client
- description: (optional) tenant description provided by the client
Content-type: application/json
{ "tenant": { "name": "John Doe", "description": "A description..." } }
Response Content-type: application/json
{ "tenant": { "created_at": "2015-12-04T13:06:54", "description": "A description...", "modified_at": null, "uuid": "8293285c-9a7f-11e5-bc4f-5254004aea96", "name": "John Doe" } }
Put /openmano/tenants/{tenant_id}
Update tenant identified by tenant_id (tenant´s name or uuid)
Params: (Extra parameters are ignored):
- name: tenant name provided by the client
- description: (optional) tenant description provided by the client
Content-type: application/json
{ "tenant": { "name": "John Doe", "description": " Unknown person..." } }
Response Content-type: application/json
{ "tenant": { "created_at": "2015-12-04T13:06:54", "description": " Unknown person...", "modified_at": null, "uuid": "8293285c-9a7f-11e5-bc4f-5254004aea96", "name": "John Doe" } }
Delete /openmano/tenants/{tenant_id}
Delete a tenant identified by tenant_id (tenant´s name or uuid)
Params:none
Response Content-type: application/json
{ "result": "tenant 9767ac6e-9a82-11e5-bc4f-5254004aea96 deleted" }
Datacenters
Get /openmano/{tenant_id}/datacenters
Get a list of datacenters attached to the tenant identified by tenant_id (tenant´s name or uuid). The parameter 'tenant_id' can be replaced by 'all' to get a list of all datacenters of all tenants.
Params:none
Response Content-type: application/json
{ "datacenters": [ { "vim_url": "http://localhost:9080/openvim", "created_at": "2015-12-09T10:10:00", "uuid": "a01a4b34-9e54-11e5-bc4f-5254004aea96", "name": "John_Doe_data_center" } ] }
Get /openmano/{tenant\_id}/datacenters/{datacenter_id}
Get a the parameters of a datacenter attached to a tenant identified by tenant_id. The parameter 'tenant_id' can be replaced by 'all' to look for the datacenter_id in all tenants.
Params:none
Response Content-type: application/json
{ "datacenter": { "vim_url": "http://localhost:9080/openvim", "created_at": "2015-12-09T10:10:00", "vim_url_admin": null, "uuid": "a01a4b34-9e54-11e5-bc4f-5254004aea96", "name": "John_Doe_data_center" } }
Post /openmano/datacenters
Create a new datacenter
Params:
- name: name of the datacenter to create
- vim_url: url of the machine where is hold VIM (Openvim) (TBC)
Content-type: application/json
{ "datacenter":{ "name": "John_Doe_data_center", "vim_url": "http://localhost:9080/openvim" } }
Response Content-type: application/json
{ "datacenter": { "vim_url": "http://localhost:9080/openvim", "created_at": "2015-12-09T10:10:00", "vim_url_admin": null, "uuid": "a01a4b34-9e54-11e5-bc4f-5254004aea96", "name": "John_Doe_data_center" } }
Response params:
Put /openmano/datacenters/{datacenter\_id_name}
Modify a datacenter.
Params:
Params that can be changed are:
- name: datacenter name
- vim_url: vim url
Content-type: application/json
{ "datacenter":{ "name": "new_datacenter_name", "vim_url": "http://localhost:9080/openvim" } }
Response
If no error, same as "Post /openmano/datacenters"
Get /openmano/datacenters/{datacenter_id}/networks
Get all networks availables for a datacenter identified by datacenter_id
Params:none
Response Content-type: application/json
{ "networks": [ { "multipoint": true, "description": null, "created_at": "2015-12-09T13:25:22", "uuid": "6ed931bc-5c3b-11e5-9272-5254004aea96", "shared": true, "type": "bridge", "name": "Management" }, { "multipoint": true, "description": null, "created_at": "2015-12-09T13:25:22", "uuid": "f8a2e52e-5ae6-11e5-875a-5254004aea96", "shared": true, "type": "bridge", "name": "Service" } ] }
Post /openmano/{tenant\_id}/datacenters/{datacenter_id}/action
(TBC)
perform an action over datacenter, can use both uuid or name
Params:(Extra parameters are ignored)
Content-type: application/json:
To update nets related to datacenter identified by {datacenter_id}:
{ "net-update": null }
To edit a network related to datacenter identified by {datacenter_id}:
{ "net-edit":{ "net": "net_name_to_change", "name": "net_new_name", "description": "new_description", "shared": true }
To delete a network related to datacenter identified by {datacenter_id}:
{ "net-delete":{ "net": "net name" } }
Response Content-type: application/json
Delete /openmano/datacenters/{datacenter_id}
Delete a datacenter
Params:none
Response Content-type: application/json
{ "result": "datacenter e3042842-9e78-11e5-bc4f-5254004aea96 deleted" }
Post /openmano/<tenant\_id>/datacenters/{datacenter_id}
Attach the datacenter identifiedby datacenter_id and openvim tenant to the openmano tenant
Params:none
Response
If no error, same as GET /openmano/{tenant\_id}/datacenters/{datacenter_id}
DELETE /openmano/<tenant\_id>/datacenters/{datacenter_id}
Detach a datacenter and this tenant
Params:none
Response
If no error, same as GET /openmano/{tenant\_id}/datacenters/{datacenter_id}
VNFs
Get /openmano/{tenant\_id}/vnfs
Get a list of vnfs
Params: none
Response Content-type: application/json
{ "vnfs": [ { "description": "VNF1 description", "created_at": "2015-08-24T13:41:20", "uuid": "09c7209c-4a55-11e5-9f62-5254004aea96", "name": "VNF1", "path": "/path/to/VNF1.vnfd", "public": true, "physical": false }, { "description": "VNF1 description"", "created_at": "2015-09-15T13:22:24", "uuid": "09d14bf0-5b9c-11e5-a873-5254004aea96", "name": "VNF2", "path": "/path/to/VNF2.vnfd", "public": true, "physical": false } ] }
Get /openmano/{tenant\_id}/vnfs/{vnf_id}
Get vnf details
Params: none
Response
- VNFC: Array of virtual machines which compose the vnf
- External-connections: array of vnf's connections
* vm_name: name of the internal virtual machine which this connections is connected * external_name: name of the conection to show in the interface * type: type of connection * vpci: Virtual PCI address * bw: bandwidth * internal_name: local iface name of the VM
Content-type: application/json
{ "vnf": { "VNFC": [ { "description": "VM 1 in the MultiVM template", "uuid": "09c73a00-4a55-11e5-9f62-5254004aea96", "name": "VM1" } ], "description": "VNF1 description", "created_at": "2015-08-24T13:41:20", "uuid": "09c7209c-4a55-11e5-9f62-5254004aea96", "external-connections": [ { "vm_name": "VM1", "external_name": "bridge", "uuid": "09c75562-4a55-11e5-9f62-5254004aea96", "type": "bridge", "vpci": null, "bw": null, "internal_name": "eth0", "vm_id": "09c73a00-4a55-11e5-9f62-5254004aea96" } ], "path": "/home/psa/openmano/openmano/vnfrepo/VNF1.vnfd", "physical": false, "nets": [], "public": true, "name": "VNF1" } }
Post /openmano/{tenant\_id}/vnfs
insert a vnf into the catalogue. Creates the flavor and images in the VIM, and creates the VNF and its internal structure in the OPENMANO DB
Params:
See at code /vnfs/vnf-template-2vm.yaml and /vnfs/vnf-template.yaml
- vnf:
* name (required): vnf name * description (optional): vnf description * class (optional): Used to organize VNFs * public (optional): boolean * physical (optional): boolean * external-connections (required): array of objects. Each one describe a connection that the vnf expose to the outside. * name (required): connection name * type (required): type of connection. Types availables are: "mgmt","bridge","data" * VNFC (required): Name of the internal VM to which this connection is connected. Must match with one of the VM name of the VNF section * local\_iface_name (required): interface name of the VM. Must match with one of the interfaces described in the VM description. * description (optional): Connection description. * internal-connections (optional): Array of objects which describes inner connections between VMs that the vnf contains * name (required): inner connection name * description (optional): inner connection description * type (required): type of connection. Types availables are: "bridge","data","ptp" * elements (required): Array of objects. Describes end points of the inner connection * VNFC: Name of the internal VM to which this connection is connected. Must match with one of the VM name of the VNF section * local\_iface_name: interface name of the VM. Must match with one of the interfaces described in the VM description. * VNFC: Array of objects that describes each of the inner VMs. Must contain at least one. * name (required): Name of the VM * description (optional): Description of the VM * VNFC image (required): Path of the image location * image metadata (optional) * architecture * use_incremental: "yes" or "no" * vpci: * os_distro: * os_type: * os_version: * bus: * processor (optional) * model (required) * features * hypervisor * type * version * ram: RAM memory of the VM. Only for traditional cloud VMs. Memory in MBytes (not from hugepages, oversubscription is allowed) * vcpus: Only for traditional cloud VMs. Number of virtual CPUs (oversubscription is allowed). * disk: disk size in GiB, by default 1 * numas: Array of numa nodes description * memory: memory in GBytes * cores | paired-threads | threads (only use one) * cores-id (optional): array of integer to specify each core * paired-threads-id (optional): Array of paired threads. (i.e:[ [0,1], [2,3], [4,5], [6,7], [8,9] ]) By default follows incremental order * threads-id (optional): array of integer to specify each thread * interfaces * name (required): interface name * dedicated (required): available options are "yes"(passthrough), "no"(sriov with vlan tags), "yes:sriov"(sriovi, but exclusive and without vlan tag) * bandwidth (required): bandwidth in Mbps or Gbps. * vpci (optional): Virtual PCI address * mac_address (optional): avoid this option if possible * bridge-ifaces * name (required): bridge interface name * bandwidth (Optional): Informative only * vpci (optional): Virtual PCI address * mac_address (optional): avoid this option if possible * model (optional): ("virtio","e1000","ne2k_pci","pcnet","rtl8139") By default, it is automatically filled by libvirt * devices: extra devices asigned to the VM. The order determines device letter asignation (hda, hdb, ...) * type: ("disk","cdrom","xml") * image: path to image * image metadata: device image metadata. * architecture * use_incremental * vpci * os_distro * os_type * os_version * bus * vpci (optional): depending on the device type (not needed for disk or cdrom) * xml: xml text for XML described devices
Response
Content-type: application/json
Delete /openmano/{tenant\_id}/vnfs/{vnf_id}
delete a vnf from database, and images and flavors in VIM when appropriate, can use both uuid or name
Params: none
Response
Content-type: application/json
{ "result": "VNF 1ec2cdac-6779-11e5-bc4f-5254004aea96 deleted" }
Post /openmano/{tenant_id}/topology/verify
Action:
Params:
Response params:
Scenarios===
Post /openmano/{tenant_id}/scenarios
(TBC)
Add a scenario into the catalogue. Creates the scenario and its internal structure in the OPENMANO DB
Params:
see at code /scenarios/scenario-template.yaml
Post /openmano/{tenant\_id}/scenarios/{scenario_id}/action
take an action over a scenario
Params:
- Deploy an scenario: deploy all VNFs of the scenario. Creates a new instance scenario
* instance_name (required): name of the scenario to deploy * description (optional): a description * datacenter (optional): name of the datacenter where the scenario will be deployed.
Content-type: application/json:
{ "deploy": { "instance_name": "scenario1", "description" : "a description...", "datacenter" : "mydc" } }
- Start an scenario: Equivalent to deploy
* instance_name (required): name of the scenario to start * description (optional): a description * datacenter (optional): name of the datacenter where the scenario will be started.
Content-type: application/json:
{ "start": { "instance_name": "scenario1", "description" : "a description...", "datacenter" : "mydc" } }
- Reserve an scenario: Launch a new instance of the scenario without starting virtual machines.
* instance_name (required): name of the scenario to launch * description (optional): a description * datacenter (optional): name of the datacenter where the scenario will be launched.
Content-type: application/json:
{ "reserve": { "instance_name": "scenario1", "description" : "a description...", "datacenter" : "mydc" } }
- Verify an scenario: deploy and destroy an scenario to check that there is room for it.
* instance_name (required): name of the scenario to verify * description (optional): a description * datacenter (optional): name of the datacenter where the scenario will be verified.
Content-type: application/json:
{ "verify": { "instance_name": "scenario1", "description" : "a description...", "datacenter" : "mydc" } }
Get /openmano/{tenant_id}/scenarios
Get a list of existing scenarios for a tenant identified by tenant_id
Params: none
Response Content-type: application/json
{ "scenarios": [ { "created_at": "2015-09-15T13:02:07", "description": "Scenario1 test", "public": false, "uuid": "34c4db72-5b99-11e5-a873-5254004aea96", "name": "Scenario1" }, { "created_at": "2015-09-15T09:49:47", "description": "Scenario2 test", "public": false, "uuid": "5638c64e-5b7e-11e5-a873-5254004aea96", "name": "Scenario2" } ] }
Get /openmano/{tenant\_id}/scenarios/{scenario_id}
Get details about a scenario. Can use both uuid or name
Params: none
Response Content-type: application/json
{ "scenario": { "description": "Pconcepto-x", "created_at": "2015-09-15T13:02:07", "modified_at": null, "name": "Pconcepto-x", "vnfs": [ { "vnf_id": "1f3d9aca-5b7e-11e5-a873-5254004aea96", "description": "VNF prueba concepto1", "interfaces": [ { "sce_net_id": "34c4f26a-5b99-11e5-a873-5254004aea96", "uuid": "34c5147a-5b99-11e5-a873-5254004aea96", "interface_id": "1f3dce50-5b7e-11e5-a873-5254004aea96" } ], "name": "VNF-pconcepto1", "nets": [], "vms": [ { "description": "prueba para demo", "interfaces": [ { "external_name": "bridge", "uuid": "1f3dce50-5b7e-11e5-a873-5254004aea96", "vpci": null, "bw": null, "internal_name": "eth0", "model": null, "type": "bridge", "net_id": null }, { "external_name": "eth1", "uuid": "1f3de232-5b7e-11e5-a873-5254004aea96", "vpci": null, "bw": null, "internal_name": "eth1", "model": null, "type": "bridge", "net_id": null } ], "name": "VMF-pconcepto1", "image_id": "bbecf86a-5b7a-11e5-a873-5254004aea96", "flavor_id": "09c350f2-4a55-11e5-9f62-5254004aea96", "uuid": "1f3db2e4-5b7e-11e5-a873-5254004aea96" } ], "uuid": "34c4fefe-5b99-11e5-a873-5254004aea96" } ], "nfvo_tenant_id": "76094a2a-3c16-11e5-9fb6-5254004aea96", "nets": [ { "description": null, "vim_id": null, "name": "default", "external": true, "type": "bridge", "uuid": "34c4f26a-5b99-11e5-a873-5254004aea96" } ], "public": false, "uuid": "34c4db72-5b99-11e5-a873-5254004aea96" } }
Delete /openmano/{tenant\_id}/scenarios/{scenario_id}
Delete a scenario from database, can use both uuid or name
Params: none
Response Content-type: application/json
{ "result": "Scenario 5638c64e-5b7e-11e5-a873-5254004aea96 Scenario2 deleted" }
Put /openmano/{tenant\_id}/scenarios/{scenario_id}
Edit an existing scenario. Only can be edited the scenario name, scenario description, graphical topology of the VNFs and VNF name and description.
Params:
(TBC)
Response Content-type: application/json
Instances
Get /openmano/{tenant_id}/instances
Get instance list
Params: none
Response Content-type: application/json
{ "instances": [ { "created_at": "2015-12-14T09:24:00", "scenario_id": "cd4cf84e-5b7a-11e5-a873-5254004aea96", "description": "Instance description", "uuid": "06e9f0ea-a23c-11e5-bc4f-5254004aea96", "name": "Instance 1" }, { "created_at": "2015-12-01T12:20:08", "scenario_id": "fbcab89a-5dd8-11e5-8018-5254004aea96", "description": "Instance description", "uuid": "7abd7196-981d-11e5-bc4f-5254004aea96", "name": "Instance 2" } ] }
Get /openmano/{tenant\_id}/instances/{instance_id}
get instances details, can use both uuid or name
Params: none
Response Content-type: application/json
{ "uuid": "06e9f0ea-a23c-11e5-bc4f-5254004aea96", "description": "Instance x description", "scenario_id": "cd4cf84e-5b7a-11e5-a873-5254004aea96", "datacenter_id": "487c6844-40df-11e5-aaa7-5254004aea96", "vnfs": [ { "vnf_name": "VNF1", "vnf_id": "bbf04ac4-5b7a-11e5-a873-5254004aea96", "uuid": "06ea139a-a23c-11e5-bc4f-5254004aea96", "vms": [ { "status": "INACTIVE", "uuid": "06ea4aae-a23c-11e5-bc4f-5254004aea96", "vim_vm_id": "06e7ca2c-a23c-11e5-92d5-5254004aea96", "created_at": "2015-12-14T09:24:00", "interfaces": [], "name": "VMF1" } ] } ], "scenario_name": "Scenario x", "nfvo_tenant_id": "76094a2a-3c16-11e5-9fb6-5254004aea96", "nets": [], "created_at": "2015-12-14T09:24:00", "name": "Instance x" }
Delete /openmano/{tenant\_id}/instances/{instance_id}
delete instance from VIM and from database, can use both uuid or name
Params: none
Response Content-type: application/json
{ "result": "instance c8d1fca2-677c-11e5-bc4f-5254004aea96 deleted" }
Post /openmano/{tenant\_id}/instances/{instance_id}/action
take an action over a scenario instance
Params:
Content-type: application/json:
No extra parameters are allowed. For reboot, the "type" is ignored
To start an instance:
{ "start": null }
To pause an instance:
{ "pause": null }
To resume an instance:
{ "resume": null }
To shutoff an instance:
{ "shutoff": null }
To shutdown an instance:
{ "shutdown": null }
To forceOff an instance:
{ "forceOff": null }
To rebuild an instance:
{ "rebuild": null }
To reboot an instance:
{ "reboot": { "type": "SOFT" }
Miscellaneous
Physicalview
Get /openmano/{tenant_id}/physicalview/{datacenter}
Deprecated
Topology
Post /openmano/{tenant_id}/topology/deploy
Deprecated