Skip to content

openmano api

Gerardo García edited this page Nov 28, 2016 · 3 revisions

This page is obsolete.

The project OpenMANO has been contributed to the open source community project Open Source MANO (OSM), hosted by ETSI.

Go to the URL osm.etsi.org to know more about OSM.


OPENMANO API


#Table of Contents#

# Introduction #

This document describes the northbound interface of openmano Orquestator.

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 vnf-template-2vm.yaml and 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 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