RO Northbound Interface

From OSM Public Wiki
Revision as of 11:21, 11 May 2016 by Tierno (talk | contribs) (Created page with "==Introduction == This document describes the northbound interface of RO (openmano). The Northbound interface is based on REST and it allows performing actions over the foll...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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