MultiCloud Architecture

ONAP MultiCloud Architecture

Value Proposition

ONAP MultiCloud project aims to mediate most interactions (if not all of them) between ONAP and any underlying VIM or Cloud to:

  • enable ONAP to deploy and run on multiple infrastructure environments

  • provide a Cloud Mediation Layer, supporting multiple infrastructures and network backends to effectively prevent vendor lock-in

  • decouples the evolution of ONAP platform from the evolution of underlying cloud infrastructure, and minimizes the impact on the deployed ONAP while upgrading the underlying cloud infrastructure independently

Besides that, ONAP MultiCloud project enables

  • infrastructure providers exposing infrastructure’s resources and features to ONAP for optimization of homing and placement of VNFs

  • support the closed control loop remediation over infrastructure resources

High Level Architecture and Workflows

The following high level architecture and workflow diagram depicts how ONAP MultiCloud is designed and integrated into ONAP end to end workflow

Multicloud icons in MSB

Components:

Broker:

A single broker deployed as micro-service exposes following functionalities:

  • Expose metadata list of supported plugins to ESR

  • Route and forward API requests to appropriate plugin by looking up AAI cloud region with ID of the cloud region

  • Dispatch capacity checking API to all related plugins

Plugin(s):

Plugin adapts API requests to corresponding VIM/Cloud.

There are multiple plugins deployed as micro-services available:

  • Plugin for Wind River: Adapt to Wind River Titanium Cloud R3, R4 or R5

  • Plugin for Ocata/Pike: Adapt to Vanilla OpenStack Releases: Ocata, Pike

  • Plugin for VIO: Adapt to VMware VIO

  • Plugin for Azure: Adapt to Microsoft Azure Cloud.

  • Plugin for kubernetes: Adapt to Kubernetes clusters

Dependencies:

  • MultiCloud micro-services exposed services via MSB

  • MultiCloud relies on MSB for API forwarding between broker and plugin micro-services

  • MultiCloud micro-services relies on AAI for any persistent data storage. e.g. AAI Cloud Region Object

Workflow elaboration:

  1. OOM Deploys ONAP MultiCloud services

  2. ONAP users on-boards underlying VIM or Cloud instances via ONAP ESR GUI.

    ESR creates AAI cloud region object and requests MultiCloud to update the cloud region with discovered infrastructure’s resources and capabilities

  3. SDC distributes Service Model and VNF artifacts

  4. ONAP users deploy services, instantiate VNF

  5. ONAP SO consult OOF for VNF homing and placement hints, OOF matches the

    VNF’s requirement and cloud region’s capabilities and resources to select the best candidates for VNF homing.OOF also consult MultiCloud for checking the capacity for VNF placement.

  6. The VNF instantiating

    The VNF instantiating approach varies with different use case (or VNF artifacts type):

    In case of VIM/Cloud specific artifact type, e.g. HEAT templates, SO invokes MultiCloud directly to instantiate the VNF.

    In case of VNFD in TOSCA artifacts, SO invokes VF-C to decompose the TOSCA artifact to atomic resource level and VF-C invokes MultiCloud for atomic resource instantiating.

    The interaction between SDN-C and MultiCloud is not yet designed.

  7. MultiCloud also supports close loop remediation by relaying FCAPS events and stream to DCAE VES collector.

  8. APP-C might request MultiCloud to perform resource level remediation

API pattern:

MultiCloud broker exposes API exposed with namespace and version as below:

api/multicloud/v1/

MultiCloud Plugins expose their API with namespace and version as below:

api/multicloud-titaniumcloud/v1/
api/multicloud-ocata/v1/
api/multicloud-vio/v1/
api/multicloud-azure/v1/
api/multicloud-k8s/v1/

For most APIs, the ID of a cloud region follows the API version, with which MultiCloud broker will forward the API to corresponding MultiCloud plugin for handling.

api/multicloud/v1/{cloud-owner}/{cloud-region-id}

MultiCloud services are registered into MSB so they can be discovered/reached via MSB API gateway.

e.g. POST msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload

API catalogs

The Northbound APIs can be cataloged as following

  1. Common MultiCloud functionalities

API swagger: API swagger is used for Health Check as well

  1. Infrastructure Provider registration

    The infrastructure provider registration API is to trigger the discovery and registration of infrastructure capabilities (e.g. HPA capabilities) and resource.

  2. Template level APIs

    Template level APIs are the integrating point between SO and MultiCloud which offloads the LCM of infrastructure workload from SO

  3. Atomic resource level APIs:

This set of API falls into either catalog of following

Proxy of OpenStack services

The proxy of OpenStack services exposed all OpenStack services by replacing the endpoints. This is designed to smoothly integrate MultiCloud with existing ONAP projects which have been talking to OpenStack directly. e.g. APPC

The API works the same way as native OpenStack API except the difference of endpionts [1].

Legacy Abstract APIs for VF-C

The legacy abstract APIs for VF-C are inherited from OPEN-O project which abstracted the OpenStack service APIs.

  1. Placement Optimization APIs:

    Aggregate Resource Checking APIs help OOF to optimize the placement of VNF over underlying VIM/Cloud

  2. FCAPS configuration APIs:

    FCAPS Configuration APIs allow users to configure the MultiCloud FCAPS relaying services.

Terminology

  • ONAP MultiCloud, ONAP Multi-VIM/Cloud, ONAP MultiVIM refer to the same project in ONAP.

  • MultiCloud framework is the repo for source code, MultiCloud broker is the entity built from framework

References

MultiCloud API

MultiCloud API v0 Specification

API in json swagger

MultiCloud Broker API v0

API Catalog

1. Scope

The scope of the present document is to describe the VIM Driver API specification.

2. Terms, Definitions and Abbreviations

For the purposes of the present document, the following abbreviations apply:

Abbreviation

NFVO

Network Functions Virtualization Orchestrator

VNFM

Virtual Network Function Management

VIM

Virtualized Infrastructure Manager

MultiVIM

MultVIM driver services for OPEN-O to drive VIM instances

3. Image Management

3.1. Create Image

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/images

Operation

POST

Direction

NSLCM->MULTIVIM

Description

Create Image and Upload the image file to the VIM

3.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

String

Image Name

imagePath

M

1

String

Image Local Path from catalog

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

containerFormat

M

1

string

ami, ari, aki, bare, ovf, ova,  docker

visibility

O

1

string

Visibility for this image.

public, private, shared, or community

properties

O

0..N

List of key-value pairs

Examples:–property vmware_disktype=streamOptimized –property vmware_adaptertype=”lsiLogic”

{

"imageName": "cirros",

"imagePath": "/home/cirros.qcow2",

"imageType": "qcow2"

"containerFormat":"bare"

}
3.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

String

Image UUID in the VIM

name

M

1

String

Image Name

returnCode

M

1

Int

0: Already exist 1: Newly created

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

containerFormat

M

1

string

ami, ari, aki, bare, ovf, ova,  docker

visibility

O

1

string

Visibility for this image.

public, private, shared, or community

properties

O

0..N

List of key-value pairs

vimid

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

202: accepted

500: failed

{
    "id": "3c9eebdbbfd345658269340b9ea6fb73",
    "name": "cirros",
    "returnCode": 1
}
3.2. Delete Image

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/images/{imageId}

Operation

Delete

Direction

NSLCM->MULTIVIM

Description

Delete Image

3.2.1. Request

N/A

3.2.2. Response

204: no content

3.3. List Images

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud_owner}_{region}/{tenantid}/images

Operation

GET

Direction

NSLCM->MULTIVIM

Description

Query Image list

3.3.1. Request

Parameter

Qualifier

Cardinality

Content

Description

limit

O

1

integer

Requests a page size of items. Returns a number of items up to a limit value. Use the limit parameter to make an initial limited request and use the ID of the last-seen item from the response as the marker parameter value in a subsequent limited request.

marker

O

1

string

The ID of the last-seen item. Use the limit parameter to make an initial limited request and use the ID of the last-seen item from the response as the marker parameter value in a subsequent limited request.

name

O

1

String

Filters the response by a name, as a string. A valid value is the name of an image

3.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

images

M

0..N

List

Image List

id

M

1

String

Image ID

size

M

1

int

Image Size

name

M

1

String

Image Name

status

M

1

String

Image Status

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

containerFormat

M

1

string

ami, ari, aki, bare, ovf, ova,  docker

visibility

O

1

string

Visibility for this image.

public, private, shared, or community

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

{
    "vimid": "",
    "vimname": "",
    "imageList": [{
        "status": "active",
        "id": "5e2757c1-f846-4727-915c-9a872553ed75",
        "size": 862016,
        "name": "vim-plus-cgsl40g-z.qcow2"
    }]
}
3.4. Get Image

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/images/{imageid}

Operation

GET

Direction

NSLCM->MULTIVIM

Description

Query Image Information

3.4.1. Request

N/A

3.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

String

Image ID

size

M

1

int

Image Size

name

M

1

String

Image Name

status

M

1

String

Image Status

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

containerFormat

M

1

string

ami, ari, aki, bare, ovf, ova,  docker

visibility

O

1

string

Visibility for this image.

public, private, shared, or community

vimId

M

1

String

vim id

vimName

M

1

string

vim name

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

{
    "vimid": "",
    "vimname": "",
    "status": "active",
    "id": "5e2757c1-f846-4727-915c-9a872553ed75",
    "size": 862016,
    "name": "vim-plus-cgsl40g-z.qcow2"
}

4. Network Management

4.1. Create Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/networks

Operation

POST

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Create network and subnetwork on the VIM

4.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

String

Logical network name

shared

M

1

boolean

Whether to share(1:sharing;0:private)

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

networkType

O

1

String

Network type

flat, vlan, vxlan, gre,

portgroup

segmentationId

O

1

Int

id of paragraph

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router.

{
    "tenant": "tenant1",
    "networkName": "ommnet",
    "shared": 1,
    "vlanTransparent": 1,
    "networkType": "vlan",
    "segmentationId": 202,
    "physicalNetwork": "ctrl",
    "routerExternal": 0
}
4.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

status

M

1

string

Network status

id

M

1

string

Network id

name

M

1

string

Network name

tenantId

M

1

String

Tenant UUID

segmentationId

O

1

int

Segmentation id

networkType

O

1

string

Network type

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

shared

O

1

boolean

Whether to share(1:sharing;0:private)

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router.

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

202: accepted

500: failed

{
    "returnCode": 0,
    "vimId": "11111",
    "vimName": "11111",
    "status": "ACTIVE",
    "id": "3c9eebdbbfd345658269340b9ea6fb73",
    "name": "net1",
    "tenant": "tenant1",
    "networkName": "ommnet",
    "shared": 1,
    "vlanTransparent": 1,
    "networkType": "vlan",
    "segmentationId": 202,
    "physicalNetwork": "ctrl",
    "routerExternal": 0
}
4.2. Delete Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/networks/{networkId}

Operation

Delete

Direction

NFLCM,NSLCM->MULTIVIM

4.2.1. Request

N/A

4.2.2. Response

204: no content

4.3. List Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/networks

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

4.3.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name

O

1

String

Filters the response by a name, as a string. A valid value is the name of a network

4.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

networks

0..N

List

Network list

status

M

1

string

Network status

id

M

1

string

Network id

name

M

1

string

Network name

tenantId

M

1

String

Tenant UUID

segmentationId

O

1

int

Segmentation id

networkType

O

1

string

Network type

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

shared

O

1

boolean

Whether to share(1:sharing;0:private)

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router.

200: ok

500: failed

{

    "vimId": "11111",

    "vimName": "111",

    "networks":

        [{

            "status": "ACTIVE",

            "id": "3c9eebdbbfd345658269340b9ea6fb73",

            "name": "net1",

            "tenant": "tenant1",

            "networkName": "ommnet",

            "shared": 1,

            "vlanTransparent": 1,

            "networkType": "vlan",

            "segmentationId": 202,

            "physicalNetwork ": "ctrl",

            "routerExternal ": 0

        }]

}
4.4. Get Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/networks/{networkId}

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

4.4.1. Request

N/A

4.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

status

M

1

string

Network status

id

M

1

string

Network id

name

M

1

string

Network name

tenantId

M

1

String

Tenant UUID

segmentationId

O

1

int

Segmentation id

networkType

O

1

string

Network type

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

shared

O

1

boolean

Whether to share(1:sharing;0:private)

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router.

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

200: ok

500: failed

{

    "vimId":"11111",

    "vimName":"11111",

    "status": "ACTIVE",

    "id": "3c9eebdbbfd345658269340b9ea6fb73",

    "name": "net1",

    "tenant": "tenant1",

    "networkName": "ommnet",

    "shared": 1,

    "vlanTransparent": 1,

    "networkType":"vlan",

    "segmentationId":202,

    "physicalNetwork ":"ctrl",

    "routerExternal ":0

}

5. Subnetwork Management

5.1. Create Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/subnets

Operation

POST

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Create network and subnetwork on the VIM

5.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

networkId

M

1

String

Network Id

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List of servers

List of servers

hostRoutes

O

1..n

List of routes

List of routes

allocationPools

O

1..n

list of “allocation”

list of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

{

    "tenant": "tenant1",

    "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

    "subnetName": "subnet1",

    "cidr": "10.43.35.0/24",

    "ipVersion": 4,

    "enableDhcp": 1,

    "gatewayIp": "10.43.35.1",

    "dnsNameservers": [],

    "allocationPools": [{

        "start": "192.168.199.2",

        "end": "192.168.199.254"

    }],

    "hostRoutes": []

}
5.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

status

M

1

string

subnetwork status

id

M

1

string

subNetwork id

tenantId

M

1

String

Tenant UUID

networkId

O

1

String

Network Id

networkName

O

1

String

Network Name

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List of servers

List of servers

hostRoutes

O

1..n

List of routes

List of routes

allocationPools

O

1..n

list of “allocation”

list of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

202: accepted

500: failed

{

    "returnCode": 0,

    "vimId": "11111",

    "vimName": "11111",

    "status": " ACTIVE",

    "id": " d62019d3-bc6e-4319-9c1d-6722fc136a23",

    "tenant": "tenant1",

    "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

    "name": "subnet1",

    "cidr": "10.43.35.0/24",

    "ipVersion": 4,

    "enableDhcp": 1,

    "gatewayIp": "10.43.35.1",

    "dnsNameservers": [],

    "allocationPools": [{

        "start": "192.168.199.2",

        "end": "192.168.199.254"

    }],

    "hostRoutes": []

}
5.2. Delete Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/subnets/{subnetId}

Operation

Delete

Direction

NFLCM,NSLCM->MULTIVIM

5.2.1. Request

N/A

5.2.2. Response

204: no content

5.3. List Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/subnets

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

5.3.1. Query

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/subnets?{……}

Parameter

Qualifier

Cardinality

Content

Description

name

O

1

String

Filters fields of the response by a name, as a string. A valid value is the name of a subnet

5.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

subnets

M

0..N

List

Network list

status

1

string

subnetwork status

id

1

string

subNetwork id

tenantId

M

1

String

Tenant UUID

networkId

O

1

String

Network Id

networkName

O

1

String

Network Name

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List of servers

List of servers

hostRoutes

O

1..n

List of routes

List of routes

allocationPools

O

1..n

list of “allocation”

list of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

200: ok

500: failed

{

    "vimId": "11111",

    "vimName": "11111",

    "subnets": [

        {

            "status": " ACTIVE",

            "id": " d62019d3-bc6e-4319-9c1d-6722fc136a23",

            "tenant": "tenant1",

            "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

            "name": "subnet1",

            "cidr": "10.43.35.0/24",

            "ipVersion": 4,

            "enableDhcp": 1,

            "gatewayIp": "10.43.35.1",

            "dnsNameservers": [],

            "allocationPools": [{

                "start": "192.168.199.2",

                "end": "192.168.199.254"

            }],

            "hostRoutes": []

        }

    ]

}
5.4. Get Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/subnets/{subnetid}

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

5.4.1. Request

N/A

5.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

status

1

string

subnetwork status

id

1

string

subNetwork id

tenantId

M

1

String

Tenant UUID

networkId

O

1

String

Network Id

networkName

O

1

String

Network Name

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List of servers

List of servers

hostRoutes

O

1..n

List of routes

List of routes

allocationPools

O

1..n

list of “allocation”

list of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

202: accepted

500: failed

{

    "status": " ACTIVE",

    "id": " d62019d3-bc6e-4319-9c1d-6722fc136a23",

    "tenant": "tenant1",

    "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

    "name": "subnet1",

    "cidr": "10.43.35.0/24",

    "ipVersion": 4,

    "enableDhcp": 1,

    "gatewayIp": "10.43.35.1",

    "dnsNameservers": [],

    "allocationPools": [{

        "start": "192.168.199.2",

        "end": "192.168.199.254"

    }],

    "hostRoutes": []

}

6. Virtual Port

6.1. Create Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/ports

Operation

POST

Direction

VNFLCM->MULTIVIM

6.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

networkId

M

1

string

Network UUID

subnetId

O

1

string

Subnet UUID

name

M

1

string

Port name

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

The IDs of security groups applied to the port.

6.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

status

M

1

string

status

id

M

1

string

Port Id

name

M

1

string

Port name

tenantId

M

1

String

Tenant UUID

networkName

M

1

string

Network name

networkId

M

1

string

Network Id

subnetName

M

1

string

Subnet name

subnetId

M

1

string

SubnetId

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

List of security group names.

6.2. Delete Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/ports/{portid}

Operation

DELETTE

Direction

VNFLCM->MULTIVIM

6.2.1. Request

N/A

6.2.2. Response

204: no content

6.3. List Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/tenantid}/ports

Operation

GET

Direction

VNFLCM->MULTIVIM

6.3.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Port name to filter out list of virtual ports

6.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

Ports

M

0..N

List

ports

id

M

1

string

Port Id

name

M

1

string

Port name

status

M

1

string

status

networkName

O

1

string

Network name

networkId

M

1

string

Network Id

subnetName

O

1

string

Subnet name

subnetId

M

1

string

SubnetId

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

List of security group names.

200: ok

500: failed

6.4. Get Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/ports/{portid}

Operation

GET

Direction

VNFLCM->MULTIVIM

6.4.1. Request

N/A

6.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

status

M

1

string

status

id

M

1

string

Port Id

name

M

1

string

Port name

tenantId

M

1

String

Tenant UUID

networkName

M

1

string

Network name

networkId

M

1

string

Network Id

subnetName

M

1

string

Subnet name

subnetId

M

1

string

SubnetId

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

List of security group names.

200: ok

500: failed

7. Server Management

7.1. Create Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/servers

Operation

POST

Direction

VNFLCM->MULTIVIM

7.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

server name

boot

M

1

String

Start parameters

nicArray

O

1..n

List of nic

List of nic

contextArray

O

1..n

list of context

list of context

volumeArray

O

1..n

list of volume

list of volume

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor id

metadata

O

1

List of metadata

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

userdata

O

1

string

Configuration information or scripts to use upon launch. Must be Base64 encoded.

NOTE: The ‘null’ value allowed in Nova legacy v2 API, but due to the strict input validation, it isn’t allowed in Nova v2.1 API.

securityGroups

O

1

List of names of security group

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

boot

Parameter

Qualifier

Cardinality

Content

Description

type

M

1

int

Startup mode

  1. boot from the volume

  2. boot from image

volumeId

O

1

string

Volume Id(type=1)

imageId

O

1

String

ImageId(type=2)

contextArray

Parameter

Qualifier

Cardinality

Content

Description

fileName

M

1

String

Injection file name

fileData

M

1

string

Injection file content (injection file content inside the <mac>$MAC_1</mac> $MAC_1 need to be replaced by the MAC address, of which 1 is NIC index. )

volumeArray

Parameter

Qualifier

Cardinality

Content

Description

volumeId

M

1

String

Volume Id

nicArray

Parameter

Qualifier

Cardinality

Content

Description

portId

M

1

String

Port Id

{

    "tenant": "tenant1",

    "name": "vm1",

    "availabilityZone": "az1",

    "flavorName": "vm_large",

    "boot": {

        "type": 1,

        " volumeName": "volume1"

    },

    "flavorId": "vm_large_134213",

    "contextArray": [{

        "fileName": "test.yaml",

        "fileData": "…."

    }],

    "volumeArray": [{

        "volumeName": "vol1",

    }],

    "nicArray": [{

        "portId": "port_a"

    }],

    "metada": {

        "foo": "foo value"

    },

    "userdata": "abcdedf"

}
7.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

returnCode

1

int

0: Already exist 1: Newly created

id

M

1

string

server id

name

1

string

server name

tenantId

M

1

String

Tenant UUID

boot

M

1

String

Start parameters

nicArray

O

1..n

List of nic

List of nic

volumeArray

O

1..n

list of volume

list of volume

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor

metadata

O

1

List of metadata

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

securityGroups

O

1

List of name of security group

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

[TBD]

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

[TBD]

status

M

1

string

Server status, 0:INACTIVE,1:ACTIVE,2:ERROR

202: accepted

500: failed

{

"id": "3c9eebdbbfd345658269340b9ea6fb73",

"name": "vm1",

"returnCode": 1,

}
7.2. Delete Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/servers/{serverid}

Operation

DELETE

Direction

NFLCM,NSLCM->MULTIVIM

7.2.1. Request

N/A

7.2.2. Response

204: no content

7.3. List Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/servers

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

7.3.1. Request

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/vms?{……}

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

server name

7.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

servers

M

1

array

server list

id

M

1

string

server id

name

M

1

string

server name

tenantId

M

1

String

Tenant UUID

boot

M

1

String

Start parameters

nicArray

O

1..n

List of nic

List of nic

volumeArray

O

1..n

list of volume

list of volume

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor

metada

O

1

keypair

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

securityGroups

O

1

List of names of security group

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

[TBD]

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

[TBD]

200: ok

500: failed

7.4. Get Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/servers/{serverid}

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

7.4.1. Request

N/A

7.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

id

M

1

string

server id

name

M

1

string

server name

tenantId

M

1

String

Tenant UUID

boot

M

1

String

Start parameters

nicArray

O

1..n

List of nic

List of nic

volumeArray

O

1..n

list of volume

list of volume

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor

metadata

O

1

List of metadata

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

securityGroups

O

1

List of names of security group

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

[TBD]

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

[TBD]

200: ok

500: failed

8. Flavor Management

8.1. Create Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/flavors

Operation

POST

Direction

VNFLCM->MULTIVIM

8.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Flavor Name

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

O

1

int

The size of the ephemeral disk

swap

O

1

int

The size of the swap disk

isPublic

O

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List of keyname-value pairs

EPA parameter

8.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

string

Flavor id

name

M

1

string

Flavor name

returnCode

M

1

int

0: Already exist 1: Newly created

tenantId

M

1

String

Tenant UUID

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

M

1

int

The size of the ephemeral disk

swap

M

1

int

The size of the swap disk

isPublic

M

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List of Key-value pairs

EPA parameter

vimId

M

1

String

vim id

vimName

O

1

string

vim name

8.2. Delete Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/flavors /{flavorid}

Operation

DELETE

Direction

NFLCM,NSLCM->MULTIVIM

8.2.1. Request

N/A

8.2.2. Response

204: no content

8.3. List Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/ flavors

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

8.3.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Flavor name to filter out list

8.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

flavors

M

0..N

list

Vm list

id

M

1

string

Flavor id

name

M

1

string

Flavor Name

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

M

1

int

The size of the ephemeral disk

swap

M

1

int

The size of the swap disk

isPublic

M

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List of keyname-value pairs

EPA parameter

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

8.4. Get Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/flavors/{ flavorsid }

Operation

get

Direction

NFLCM,NSLCM->MULTIVIM

8.4.1. Request

N/A

8.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

string

Flavor id

name

M

1

string

Flavor Name

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

M

1

int

The size of the ephemeral disk

swap

M

1

int

The size of the swap disk

isPublic

M

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List of keyname-value pairs

EPA parameter

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

9. Volume Management

9.1. Create Volume

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/volumes

Operation

POST

Direction

NSLCM->MULTIVIM

9.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Volume name

volumeSize

M

1

int

Volume size

imageId

O

1

string

Image UUID

volumeType

O

1

string

Volume type

availabilityZone

O

1

string

Usable field

{

"tenant": "tenant1",

"volumeName": "volume1",

"volumeSize": 3,

"imageName": "cirros.qcow2",

"volumeType": "volumetype1",

"availabilityZone": "zone1"

}
9.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

status

M

1

string

Volume status

id

M

1

string

Volume id

name

M

1

string

Volume name

volumeType

O

1

string

Volume type

availabilityZone

O

1

string

Availability Zone

202: accepted

500: failed

{

"id": "bc9eebdbbfd356458269340b9ea6fb73",

"name": "volume1",

"returnCode": 1,

}
9.2. Delete Volume

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/volumes/{volumeId}

Operation

DELETE

Direction

NSLCM->MULTIVIM

9.2.1. Request

N/A

9.2.2. Response

204: no content

9.3. List Volumes

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/volumes

Operation

GET

Direction

NSLCM-> MULTIVIM

9.3.1. Request

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/volumes?{……}

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Volume name

9.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

volumes

M

1

Array

id

M

1

string

Volume id

name

M

1

string

Volume name

createTime

O

1

string

Create time

status

M

1

string

Volume status

volumeSize

M

1

int

Volume size

volumeType

M

1

string

Volume type

availabilityZone

M

1

string

Availability Zone

attachments

M

1..n

list of attachment

List of additional information on the cloud disk

200: ok

500: failed

{

    "volumes": [

        {

            "status": "available",

            "name": "test",

            "attachments": [],

            "createTime": "2015-12-02T07:57:23.000000",

            " volumeType ": "ws",

            "id": "91b39ebb-acdc-43f3-9c2e-b0da7ad0fd55",

            "size": 20

        },

        {

            "status": "in-use",

            "name": "wangsong",

            "attachments": [

                {

                    "device": "/dev/vdc",

                    "serverId": "3030e666-528e-4954-88f5-cc21dab1262b",

                    "volumeId": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

                    "hostName": null,

                    "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31"

                }

            ],

            "createTime": "2015-12-02T06:39:40.000000",

            " volumeType ": null,

            "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

            "size": 40

        }

    ]

}
9.4. Get Volumes

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/volumes/{volumeid}

Operation

GET

Direction

NSLCM-> MULTIVIM

9.4.1. Request

N/A

9.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

String

Tenant UUID

id

1

string

Volume id

name

1

string

Volume name

createTime

1

string

Create time

status

1

string

Volume status

volumeType

1

list of string

Volume type

volumeSize

1

int

Volume size

availabilityZone

M

1

string

Availability Zone

attachments

M

1..n

list of attachment

List of additional information on the cloud disk

attachment:

Parameter

Qualifier

Cardinality

Content

Description

device

1

string

Device name

serverId

1

string

VM id

volumeId

1

string

Volume id

hostName

1

string

Host name

id

1

string

Device id

200: ok

500: failed

{

    "status": "in-use",

    "name": "wangsong",

    "attachments": [

        {

            "device": "/dev/vdc",

            "serverId": "3030e666-528e-4954-88f5-cc21dab1262b",

            "volumeId": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

            "hostName": null,

            "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31"

        }

    ],

    "createTime": "2015-12-02T06:39:40.000000",

    "volumeType ": null,

    "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

    "volumeSize ": 40

}

10. Tenant Management

10.1. List tenants

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/tenants

Operation

GET

Direction

NSLCM-> MULTIVIM

10.1.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name={tenantname}

O

1

string

Tenant name to filter output list

10.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenants

M

1

Array

id

M

1

string

tenant UUID

name

M

1

string

tenant name

200: ok

500: failed

{

    " tenants ": [

        {

            "id": "1",

            "name": "test\_a"

        }

    ]

}

11. Limits

11.1. List Limits of resouces

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/limits

Operation

GET

Direction

NSLCM-> MULTIVIM

11.1.1. Request

N/A

11.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

string

Tenant UUID

maxPersonality

O

1

int

The number of allowed injected files for each tenant.

maxPersonalitySize

O

1

int

The number of allowed bytes of content for each injected file.

maxServerGroupMembers

O

1

int

The number of allowed members for each server group.

maxServerGroups

O

1

int

The number of allowed server groups for each tenant.

maxServerMeta

O

1

int

The number of allowed metadata items for each instance.

maxTotalCores

O

1

int

The number of allowed instance cores for each tenant.

maxTotalInstances

O

1

int

The number of allowed instances for each tenant.

maxTotalKeypairs

O

1

int

The number of allowed key pairs for each user.

maxTotalRAMSize

O

1

int

The amount of allowed instance RAM, in MB, for each tenant.

maxTotalVolumeGigabytes

O

1

int

The maximum total amount of volumes, in gibibytes (GiB).

maxTotalVolumes

O

1

int

The maximum number of volumes.

totalVolumesUsed

O

1

int

The total number of volumes used.

totalGigabytesUsed

O

1

int

The total number of gibibytes (GiB) used.

network

O

1

int

The number of networks allowed for each project.

subnet

O

1

int

The number of subnets allowed for each project.

subnetpool

O

1

int

The number of subnet pools allowed for each project.

security_group_rule

O

1

int

The number of security group rules allowed for each project.

security_group

O

1

int

The number of security groups allowed for each project.

router

O

1

int

The number of routers allowed for each project.

port

O

1

int

The number of ports allowed for each project.

200: ok

500: failed

{

"maxPersonality": 5,

"maxPersonalitySize": 10240,

"maxServerMeta": 128,

"maxTotalCores": 20,

"maxTotalInstances": 10,

"maxTotalKeypairs": 100,

"maxTotalRAMSize": 51200,

"maxServerGroups": 10,

"maxServerGroupMembers": 10,

}

12. Host Management

12.1. List hosts

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/hosts

Operation

GET

Direction

NSLCM-> MULTIVIM

12.1.1. Request

N/A

12.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

string

Tenant Name

hosts

M

1

Array of host

List of host information

service

M

1

string

The service running on the host

name

M

1

string

host name

zone

O

1

string

Available zone for the host

200: ok

500: failed

{

    "vimId": "123",

    "vimName": "vimName",

    "tenantId": "tenantId1"

    "hosts": [

        {

            "name": "b6e4adbc193d428ea923899d07fb001e",

            "service": "conductor",

            "zone": "internal",

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "name": "09c025b0efc64211bd23fc50fa974cdf",

            "service": "compute",

            "zone": "nova"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "name": "e73ec0bd35c64de4a1adfa8b8969a1f6",

            "service": "consoleauth",

            "zone": "internal"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "host\_name": "396a8a0a234f476eb05fb9fbc5802ba7",

            "service": "network",

            "zone": "internal"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "name": "abffda96592c4eacaf4111c28fddee17",

            "service": "scheduler",

            "zone": "internal"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        }

    ]

}
12.2. Get host

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/{tenantid}/hosts/{hostname}

Operation

GET

Direction

NSLCM-> MULTIVIM

12.2.1. Request
12.2.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

tenantId

M

1

string

Tenant Name

host

M

1

List of resources

Host resource info

resource

M

1..N

Object

Resource description

cpu

M

1

Int

The cpu info on the host.

memory_mb

M

1

int

The memory info on the host (in MB).

name

M

1

string

host name

project

M

1

string

Value: total, used_now, used_max or specific project_id

disk_gb

M

1

int

The disk info on the host (in GB).

200: ok

500: failed

{

    "cpu": 1,

    "disk\_gb": 1028,

    "name": "c1a7de0ac9d94e4baceae031d05caae3",

    "memory\_mb": 8192,

    "vimId": "123",

    "vimName": "vimName",

    "tenantId": "tenantId1",

    "host": [

        {

            "memory\_mb": 4960,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 92,

            "project": "(total)",

            "cpu": 4

        },

        {

            "memory\_mb": 1536,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 2,

            "project": "(used\_now)",

            "cpu": 2

        },

        {

            "memory\_mb": 1024,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 2,

            "project": "(used\_max)",

            "cpu": 2

        },

        {

            "memory\_mb": 1024,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 2,

            "project": "568f7ec425db472ba348251bf1e7eebd",

            "cpu": 2

        }

    ],

    "vimName": "openstack\_newton",

    "vimId": "dd5b6da9-5984-401f-b89f-78a9776b1a73",

    "tenantId": "568f7ec425db472ba348251bf1e7eebd"

}

13. VIM Management

13.1. Update VIM Info

IF Definition

Description

URI

http://msb.onap.org:80/api/multicloud/v0/{cloud-owner}_{cloud-region}/registry

Operation

POST

Direction

ESR-> MULTICLOUD

13.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

defaultTenant

M

1

string

default tenant name

13.1.2. Response

NA

202: accept

400: failed

13.2. Get registry status

IF Definition

Description

URI

http://msb.onap.org:80/api/multicloud/v0/{cloud-owner}_{cloud-region}/registry

Operation

GET

Direction

ESR-> MULTICLOUD

13.2.1. Request

NA

13.2.2. Response

NA

200: OK

404: failed

500: failed

13.3. Unregistry VIM

IF Definition

Description

URI

http://msb.onap.org:80/api/multicloud/v0/{cloud-owner}_{cloud-region}

Operation

DELETE

Direction

ESR-> MULTICLOUD

13.2.1. Request

NA

13.2.2. Response

NA

204: No content found

400: failed

14. Proxied OpenStack APIs

14.1. Tokens

IF Definition

Description

URI

http://msb.onap.org:80/api/multicloud/v0/{cloud owner}_{region}/identity/v3/auth/tokens

Operation

POST

Direction

NSLCM-> MULTICLOUD

14.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

auth

O

1

Object

Same as OpenStack Identity Tokens API

{

}
14.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

X-Subject-Token

M

1

String

The authentication token in Header

token

O

1

Object

Token response, the same as OpenStack Identity Tokens API

201: Created

401: Unauthorized

403: Forbidden

500: failed

Header:
  X-Subject-Token: a33f3b209e9b471a97fbeab8324a9a45

Body:

    {
         "token" : {
            "user" : {
               "domain" : {
                  "id" : "default",
                  "name" : "Default"
               },
               "id" : "9efb043c7629497a8028d7325ca1afb0",
               "name" : "admin"
            },
            "catalog" : [
               {
                  "type" : "network",
                  "endpoints" : [
                     {
                        "interface" : "public",
                        "id" : "39583c1508ad4b71b380570a745ee10a",
                        "url" : "http://172.16.77.10:80/api/multicloud-titaniumcloud/v0/CloudOwner_RegionOne/network",
                        "region_id" : "RegionOne",
                        "region" : "RegionOne"
                     }
                  ],
                  "name" : "neutron",
                  "id" : "99aefcc82a9246f98f8c281e61ffc754"
               },
               ...
            ]
            "project" : {
               "name" : "admin",
               "id" : "fcca3cc49d5e42caae15459e27103efc",
               "domain" : {
                  "id" : "default",
                  "name" : "Default"
               }
            },
            "is_domain" : false,
            "expires_at" : "2017-09-11T03:52:29.000000Z"
         }
    }

MultiCloud API v1 Specification

The is the specification for MultiCloud API version v1.

Note: “MultiCloud API Specification V1” refers to the specification for MultiCloud API version v0

API Catalog

1. Scope

The scope of the present document is to describe the MutliCloud NorthBound API specification.

2. Terms, Definitions and Abbreviations

For the purposes of the present document, the following abbreviations apply:

Abbreviation

Description

NFVO

Network Functions Virtualization Orchestrator

VNFM

Virtual Network Function Management

VIM

Virtualized Infrastructure Manager

MultiVIM/MultiCloud

MultVIM driver services for OPEN-O to drive VIM instances

3. Image Management

3.1. Create Image

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/images

Operation

POST

Direction

NSLCM->MULTIVIM

Description

Create Image and Upload the image file to the VIM

3.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

String

Image Name

imagePath

M

1

String

Image Local Path from catalog

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

visibility

O

1

string

Visibility for this image. public, private, shared, or community

containerFormat

M

1

string

ami,ari,aki,bare,ovf,ova, docker

properties

O

0..N

List

Examples:–property vmware_disktype=streamOptimized –property vmware_adaptertype=”lsiLogic”

{

"imageName": "cirros",

"imagePath": "/home/cirros.qcow2",

"imageType": "qcow2"

"containerFormat":"bare"

}
3.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

String

Image UUID in the VIM

name

M

1

String

Image Name

returnCode

M

1

Int

0: Already exist 1: Newly created

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

containerFormat

M

1

string

ami,?ari,?aki,?bare,?ovf,?ova, ?docker

visibility

O

1

string

Visibility for this image.

public, private, shared, or community

properties

O

0..N

List of key-value pairs

vimid

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

202: accepted

500: failed

{
    "id": "3c9eebdbbfd345658269340b9ea6fb73",
    "name": "cirros",
    "returnCode": 1
}
3.2. Delete Image

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/images/{imageId}

Operation

Delete

Direction

NSLCM->MULTIVIM

Description

Delete Image

3.2.1. Request

N/A

3.2.2. Response

204: no content

3.3. List Images

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/images

Operation

GET

Direction

NSLCM->MULTIVIM

Description

Query Image list

3.3.1. Request

Parameter

Qualifier

Cardinality

Content

Description

limit

O

1

integer

Requests a page size of items. Returns a number of items up to a limit value. Use the limit parameter to make an initial limited request and use the ID of the last-seen item from the response as the marker parameter value in a subsequent limited request.

marker

O

1

string

The ID of the last-seen item. Use the limit parameter to make an initial limited request and use the ID of the last-seen item from the response as the marker parameter value in a subsequent limited request.

name

O

1

String

Filters the response by a name, as a string. A valid value is the name of an image

3.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

images

M

0..N

List

Image List

id

M

1

String

Image ID

size

M

1

int

Image Size

name

M

1

String

Image Name

status

M

1

String

Image Status

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

containerFormat

M

1

string

ami,?ari,?aki,?bare,?ovf,?ova, ?docker

visibility

O

1

string

Visibility for this image.

public, private, shared, or community

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

{
    "vimid": "",
    "vimname": "",
    "imageList": [{
        "status": "active",
        "id": "5e2757c1-f846-4727-915c-9a872553ed75",
        "size": 862016,
        "name": "vim-plus-cgsl40g-z.qcow2"
    }]
}
3.4. Get Image

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/images/{imageid}

Operation

GET

Direction

NSLCM->MULTIVIM

Description

Query Image Information

3.4.1. Request

N/A

3.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

String

Image ID

size

M

1

int

Image Size

name

M

1

String

Image Name

status

M

1

String

Image Status

imageType

M

1

String

Image Type

ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso

containerFormat

M

1

string

ami,?ari,?aki,?bare,?ovf,?ova, ?docker

visibility

O

1

string

Visibility for this image.

public, private, shared, or community

vimId

M

1

String

vim id

vimName

M

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

{
    "vimid": "",
    "vimname": "",
    "status": "active",
    "id": "5e2757c1-f846-4727-915c-9a872553ed75",
    "size": 862016,
    "name": "vim-plus-cgsl40g-z.qcow2"
}

4. Network Management

4.1. Create Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/networks

Operation

POST

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Create network on the VIM

4.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

String

Logical network name

shared

M

1

boolean

Whether to share(1:sharing;0:private)

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

networkType

O

1

String

Network type

flat, vlan, vxlan, gre, portgroup

segmentationId

O

1

Int

id of paragraph

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router.

{
    "tenant": "tenant1",
    "networkName": "ommnet",
    "shared": 1,
    "vlanTransparent": 1,
    "networkType": "vlan",
    "segmentationId": 202,
    "physicalNetwork": "ctrl",
    "routerExternal": 0
}
4.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

status

M

1

string

Network status

id

M

1

string

Network id

name

M

1

string

Network name

tenantId

M

1

String

Tenant UUID

segmentationId

O

1

int

Segmentation id

networkType

O

1

string

Network type

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

shared

O

1

boolean

Whether to share(1:sharing;0:private)

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router.

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

202: accepted

500: failed

{
    "returnCode": 0,
    "vimId": "11111",
    "vimName": "11111",
    "status": "ACTIVE",
    "id": "3c9eebdbbfd345658269340b9ea6fb73",
    "name": "net1",
    "tenant": "tenant1",
    "networkName": "ommnet",
    "shared": 1,
    "vlanTransparent": 1,
    "networkType": "vlan",
    "segmentationId": 202,
    "physicalNetwork": "ctrl",
    "routerExternal": 0
}
4.2. Delete Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/networks/{networkId}

Operation

Delete

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Delete a network on the VIM

4.2.1. Request

N/A

4.2.2. Response

204: no content

4.3. List Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/networks

Operation

GET

Direction

VNFLCM,NSLCM->MULTIVIM

Description

List networks on the VIM

4.3.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name

O

1

String

Filters the response by a name, as a string. A valid value is the name of a network

4.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

networks

0..N

List

Network list

status

M

1

string

Network status

id

M

1

string

Network id

name

M

1

string

Network name

tenantId

M

1

String

Tenant UUID

segmentationId

O

1

int

Segmentation id

networkType

O

1

string

Network type

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

shared

O

1

boolean

Whether to share(1:sharing;0:private)

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router

200: ok

500: failed

{

    "vimId": "11111",

    "vimName": "111",

    "networks":

        [{

            "status": "ACTIVE",

            "id": "3c9eebdbbfd345658269340b9ea6fb73",

            "name": "net1",

            "tenant": "tenant1",

            "networkName": "ommnet",

            "shared": 1,

            "vlanTransparent": 1,

            "networkType": "vlan",

            "segmentationId": 202,

            "physicalNetwork ": "ctrl",

            "routerExternal ": 0

        }]

}
4.4. Get Network

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/networks/{networkId}

Operation

get

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Get a network on the VIM

4.4.1. Request

N/A

4.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

status

M

1

string

Network status

id

M

1

string

Network id

name

M

1

string

Network name

tenantId

M

1

String

Tenant UUID

segmentationId

O

1

int

Segmentation id

networkType

O

1

string

Network type

physicalNetwork

O

1

string

The physical network where this network should be implemented. The Networking API v2.0 does not provide a way to list available physical networks. For example, the Open vSwitch plug-in configuration file defines a symbolic name that maps to specific bridges on each compute host.

vlanTransparent

O

1

boolean

Whether to support VLAN pass through(1:true;0:false)

shared

O

1

boolean

Whether to share(1:sharing;0:private)

routerExternal

O

1

boolean

Indicates whether this network can provide floating IPs via a router.

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

200: ok

500: failed

{

    "vimId":"11111",

    "vimName":"11111",

    "status": "ACTIVE",

    "id": "3c9eebdbbfd345658269340b9ea6fb73",

    "name": "net1",

    "tenant": "tenant1",

    "networkName": "ommnet",

    "shared": 1,

    "vlanTransparent": 1,

    "networkType":"vlan",

    "segmentationId":202,

    "physicalNetwork ":"ctrl",

    "routerExternal ":0

}

5. Subnetwork Management

5.1. Create Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/subnets

Operation

POST

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Create subnet on the VIM

5.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

networkId

M

1

String

Network Id

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List

List of servers

hostRoutes

O

1..n

List

List of routes

allocationPools

O

1..n

list

List of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

{

    "tenant": "tenant1",

    "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

    "subnetName": "subnet1",

    "cidr": "10.43.35.0/24",

    "ipVersion": 4,

    "enableDhcp": 1,

    "gatewayIp": "10.43.35.1",

    "dnsNameservers": [],

    "allocationPools": [{

        "start": "192.168.199.2",

        "end": "192.168.199.254"

    }],

    "hostRoutes": []

}
5.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

status

M

1

string

subnetwork status

id

M

1

string

subNetwork id

tenantId

M

1

String

Tenant UUID

networkId

O

1

String

Network Id

networkName

O

1

String

Network Name

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List

List of servers

hostRoutes

O

1..

List

List of routes

allocationPools

O

1..n

List

list of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

202: accepted

500: failed

{

    "returnCode": 0,

    "vimId": "11111",

    "vimName": "11111",

    "status": " ACTIVE",

    "id": " d62019d3-bc6e-4319-9c1d-6722fc136a23",

    "tenant": "tenant1",

    "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

    "name": "subnet1",

    "cidr": "10.43.35.0/24",

    "ipVersion": 4,

    "enableDhcp": 1,

    "gatewayIp": "10.43.35.1",

    "dnsNameservers": [],

    "allocationPools": [{

        "start": "192.168.199.2",

        "end": "192.168.199.254"

    }],

    "hostRoutes": []

}
5.2. Delete Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/subnets/{subnetId}

Operation

Delete

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Delete a subnet on the VIM

5.2.1. Request

N/A

5.2.2. Response

204: no content

5.3. List Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/subnets

Operation

Get

Direction

VNFLCM,NSLCM->MULTIVIM

Description

List subnets on the VIM

5.3.1. Query

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/subnets?{……}

Parameter

Qualifier

Cardinality

Content

Description

name

O

1

String

Filters fields of the response by a name, as a string. A valid value is the name of a subnet

5.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

subnets

M

0..N

List

Network list

status

1

string

subnetwork status

id

1

string

subNetwork id

tenantId

M

1

String

Tenant UUID

networkId

O

1

String

Network Id

networkName

O

1

String

Network Name

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List

List of servers

hostRoutes

O

1..

List

List of routes

allocationPools

O

1..n

List

list of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

200: ok

500: failed

{

    "vimId": "11111",

    "vimName": "11111",

    "subnets": [

        {

            "status": " ACTIVE",

            "id": " d62019d3-bc6e-4319-9c1d-6722fc136a23",

            "tenant": "tenant1",

            "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

            "name": "subnet1",

            "cidr": "10.43.35.0/24",

            "ipVersion": 4,

            "enableDhcp": 1,

            "gatewayIp": "10.43.35.1",

            "dnsNameservers": [],

            "allocationPools": [{

                "start": "192.168.199.2",

                "end": "192.168.199.254"

            }],

            "hostRoutes": []

        }

    ]

}
5.4. Get Subnets

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/subnets/{subnetid}

Operation

GET

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Get subnet on the VIM

5.4.1. Request

N/A

5.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

status

1

string

subnetwork status

id

1

string

subNetwork id

tenantId

M

1

String

Tenant UUID

networkId

O

1

String

Network Id

networkName

O

1

String

Network Name

name

M

1

String

SubnetName

cidr

M

1

String

Subnet cidr

ipVersion

M

1

Int

Ip type

4,6

enableDhcp

O

1

boolean

Whether to allow

1: yes;0: no

gatewayIp

O

1

String

Gateway ip

dnsNameservers

O

1..n

List

List of servers

hostRoutes

O

1..

List

List of routes

allocationPools

O

1..n

List

list of allocation

–>allocation

–>start

O

1

String

Start ip

–>end

O

1

String

End ip

202: accepted

500: failed

{

    "status": " ACTIVE",

    "id": " d62019d3-bc6e-4319-9c1d-6722fc136a23",

    "tenant": "tenant1",

    "network_id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",

    "name": "subnet1",

    "cidr": "10.43.35.0/24",

    "ipVersion": 4,

    "enableDhcp": 1,

    "gatewayIp": "10.43.35.1",

    "dnsNameservers": [],

    "allocationPools": [{

        "start": "192.168.199.2",

        "end": "192.168.199.254"

    }],

    "hostRoutes": []

}

6. Virtual Port

6.1. Create Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/ports

Operation

POST

Direction

VNFLCM->MULTIVIM

Description

Create a vport on the VIM

6.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

networkId

M

1

string

Network UUID

subnetId

O

1

string

Subnet UUID

name

M

1

string

Port name

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

The IDs of security groups applied to the port

6.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

status

M

1

string

status

id

M

1

string

Port Id

name

M

1

string

Port name

tenantId

M

1

String

Tenant UUID

networkName

M

1

string

Network name

networkId

M

1

string

Network Id

subnetName

M

1

string

Subnet name

subnetId

M

1

string

SubnetId

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

List of security group names.

6.2. Delete Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/ports/{portid}

Operation

POST

Direction

VNFLCM->MULTIVIM

Description

Delete a vport on the VIM

6.2.1. Request

N/A

6.2.2. Response

204: no content

6.3. List Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/ports

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

List vports on the VIM

6.3.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Port name to filter out list of virtual ports

6.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

Ports

M

0..N

List

ports

id

M

1

string

Port Id

name

M

1

string

Port name

status

M

1

string

status

networkName

O

1

string

Network name

networkId

M

1

string

Network Id

subnetName

O

1

string

Subnet name

subnetId

M

1

string

SubnetId

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

List of security group names.

200: ok

500: failed

6.4. Get Virtual Port

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/ports/{portid}

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

Get a vport on the VIM

6.4.1. Request

N/A

6.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

status

M

1

string

status

id

M

1

string

Port Id

name

M

1

string

Port name

tenantId

M

1

String

Tenant UUID

networkName

M

1

string

Network name

networkId

M

1

string

Network Id

subnetName

M

1

string

Subnet name

subnetId

M

1

string

SubnetId

macAddress

O

1

string

Mac address

ip

O

1

string

Ip address

vnicType

O

1

string

Virtual network card type,

the value of three kinds of normal/direct/macvtap

securityGroups

O

1

string

List of security group names

200: ok

500: failed

7. Server Management

7.1. Create Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/servers

Operation

POST

Direction

VNFLCM->MULTIVIM

Description

Create a vserver on the VIM

7.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

server name

boot

M

1

String

Start parameters

nicArray

O

1..n

List

List

contextArray

O

1..n

list

list of context

volumeArray

O

1..n

List

List

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor id

metadata

O

1

List

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

userdata

O

1

string

Configuration information or scripts to use upon launch. Must be Base64 encoded.

NOTE: The ‘null’ value allowed in Nova legacy v2 API, but due to the strict input validation, it isn’t allowed in Nova v2.1 API.

securityGroups

O

1

List

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

boot

Parameter

Qualifier

Cardinality

Content

Description

type

M

1

int

Startup mode
  1. boot from the volume

  2. boot from image

volumeId

O

1

string

Volume Id(type=1)

imageId

O

1

String

ImageId(type=2)

contextArray

Parameter

Qualifier

Cardinality

Content

Description

fileName

M

1

String

Injection file name

fileData

M

1

string

Injection file content (injection file content inside the <mac>$MAC_1</mac> $MAC_1 need to be replaced by the MAC address, of which 1 is NIC index. )

volumeArray

Parameter

Qualifier

Cardinality

Content

Description

volumeId

M

1

String

Volume Id

nicArray

Parameter

Qualifier

Cardinality

Content

Description

portId

M

1

String

Port Id

{

    "tenant": "tenant1",

    "name": "vm1",

    "availabilityZone": "az1",

    "flavorName": "vm_large",

    "boot": {

        "type": 1,

        " volumeName": "volume1"

    },

    "flavorId": "vm_large_134213",

    "contextArray": [{

        "fileName": "test.yaml",

        "fileData": "…."

    }],

    "volumeArray": [{

        "volumeName": "vol1",

    }],

    "nicArray": [{

        "portId": "port_a"

    }],

    "metada": {

        "foo": "foo value"

    },

    "userdata": "abcdedf"

}
7.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

returnCode

1

int

0: Already exist 1: Newly created

id

M

1

string

server id

name

1

string

server name

tenantId

M

1

String

Tenant UUID

boot

M

1

String

Start parameters

nicArray

O

1..n

List

List

volumeArray

O

1..n

List

List

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor

metadata

O

1

List

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

securityGroups

O

1

List

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

status

M

1

string

Server status,

0:INACTIVE,1:ACTIVE,2:ERROR

202: accepted

500: failed

{

"id": "3c9eebdbbfd345658269340b9ea6fb73",

"name": "vm1",

"returnCode": 1,

}
7.2. Delete Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/servers/{serverid}

Operation

DELETE

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Delete a vserver on the VIM

7.2.1. Request

N/A

7.2.2. Response

204: no content

7.3. List Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/servers

Operation

GET

Direction

VNFLCM,NSLCM->MULTIVIM

Description

List vservers on the VIM

7.3.1. Request

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/vms?{……}

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

server name

7.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

servers

M

1

array

server list

id

M

1

string

server id

name

M

1

string

server name

tenantId

M

1

String

Tenant UUID

boot

M

1

String

Start parameters

nicArray

O

1..n

List

List

volumeArray

O

1..n

List

List

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor

metada

O

1

keypair

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

securityGroups

O

1

List

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

200: ok

500: failed

7.4. Get Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/servers/{serverid}

Operation

GET

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Get a vserver on the VIM

7.4.1. Request

N/A

7.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

id

M

1

string

server id

name

M

1

string

server name

tenantId

M

1

String

Tenant UUID

boot

M

1

String

Start parameters

nicArray

O

1..n

List

List

volumeArray

O

1..n

List

List

availabilityZone

O

1

string

Usable field

flavorId

M

1

String

server Flavor

metadata

O

1

List

Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each.

serverGroup

O

1

List

One or more security groups. Specify the name of the security group in the name attribute. If you omit this attribute, the API creates the server in the default security group.

serverGroup

O

1

string

the ServerGroup for anti-affinity and affinity

200: ok

500: failed

7.5. Heal Server

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/servers/{serverid}/action

Operation

POST

Direction

VNFLCM,NSLCM->MULTIVIM

Description

Act on a vserver on the VIM

7.5.1. Request

Parameter

Qualifier

Cardinality

Content

Description

os-start

M

1

none

The action to start a stopped server.

os-stop

M

1

none

The action to stop a running server.

reboot

M

1

object

The action to reboot a server.

type

O

1

int

The type of the reboot action.

The valid values are HARD and SOFT

7.5.2. Response

Normal response codes: 202

Error response codes: unauthorized(401), forbidden(403), itemNotFound(404), conflict(409)

8. Flavor Management

8.1. Create Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/flavors

Operation

POST

Direction

VNFLCM->MULTIVIM

Description

Create a flavor on the VIM

8.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Flavor Name

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

O

1

int

The size of the ephemeral disk

swap

O

1

int

The size of the swap disk

isPublic

O

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List

EPA parameter

8.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

string

Flavor id

name

M

1

string

Flavor name

returnCode

M

1

int

0: Already exist 1: Newly created

tenantId

M

1

String

Tenant UUID

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

M

1

int

The size of the ephemeral disk

swap

M

1

int

The size of the swap disk

isPublic

M

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List

EPA parameter

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

8.2. Delete Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/flavors /{flavorid}

Operation

DELETE

Direction

VNFLCM->MULTIVIM

Description

Delete a flavor on the VIM

8.2.1. Request

N/A

8.2.2. Response

204: no content

8.3. List Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/flavors

Operation

GET

Direction

VNFLCM,NSLCM->MULTIVIM

Description

List flavors on the VIM

8.3.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Flavor name to filter out list

8.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

flavors

M

0..N

list

Vm list

id

M

1

string

Flavor id

name

M

1

string

Flavor Name

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

M

1

int

The size of the ephemeral disk

swap

M

1

int

The size of the swap disk

isPublic

M

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List

EPA parameter

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

8.4. Get Flavor

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/flavors/{flavorid}

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

Get a flavor on the VIM

8.4.1. Request

N/A

8.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

id

M

1

string

Flavor id

name

M

1

string

Flavor Name

vcpu

M

1

int

Virtual CPU number

memory

M

1

int

Memory size

disk

M

1

int

The size of the root disk

ephemeral

M

1

int

The size of the ephemeral disk

swap

M

1

int

The size of the swap disk

isPublic

M

1

boolean

Whether the flavor is public (available to all projects) or scoped to a set of projects. Default is True if not specified.

extraSpecs

O

0..N

List

EPA parameter

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

200: ok

500: failed

9. Volume Management

9.1. Create Volume

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/volumes

Operation

POST

Direction

VNFLCM->MULTIVIM

Description

Create volume on the VIM

9.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Volume name

volumeSize

M

1

int

Volume size

imageId

O

1

string

Image UUID

volumeType

O

1

string

Volume type

availabilityZone

O

1

string

Usable field

{

"tenant": "tenant1",

"volumeName": "volume1",

"volumeSize": 3,

"imageName": "cirros.qcow2",

"volumeType": "volumetype1",

"availabilityZone": "zone1"

}
9.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

returnCode

M

1

int

0: Already exist 1: Newly created

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

status

M

1

string

Volume status

id

M

1

string

Volume id

name

M

1

string

Volume name

volumeType

O

1

string

Volume type

availabilityZone

O

1

string

Availability Zone

202: accepted

500: failed

{

"id": "bc9eebdbbfd356458269340b9ea6fb73",

"name": "volume1",

"returnCode": 1,

}
9.2. Delete Volume

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/volumes/{volumeId}

Operation

DELETE

Direction

VNFLCM->MULTIVIM

Description

Delete volume on the VIM

9.2.1. Request

N/A

9.2.2. Response

204: no content

9.3. List Volumes

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/volumes

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

List volumes on the VIM

9.3.1. Request

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/volumes?{……}

Parameter

Qualifier

Cardinality

Content

Description

name

M

1

string

Volume name

9.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

volumes

M

1

Array

id

M

1

string

Volume id

name

M

1

string

Volume name

createTime

O

1

string

Create time

status

M

1

string

Volume status

volumeSize

M

1

int

Volume size

volumeType

M

1

string

Volume type

availabilityZone

M

1

string

Availability Zone

attachments

M

1..n

list

List of additional information on the cloud disk

200: ok

500: failed

{

    "volumes": [

        {

            "status": "available",

            "name": "test",

            "attachments": [],

            "createTime": "2015-12-02T07:57:23.000000",

            " volumeType ": "ws",

            "id": "91b39ebb-acdc-43f3-9c2e-b0da7ad0fd55",

            "size": 20

        },

        {

            "status": "in-use",

            "name": "wangsong",

            "attachments": [

                {

                    "device": "/dev/vdc",

                    "serverId": "3030e666-528e-4954-88f5-cc21dab1262b",

                    "volumeId": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

                    "hostName": null,

                    "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31"

                }

            ],

            "createTime": "2015-12-02T06:39:40.000000",

            " volumeType ": null,

            "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

            "size": 40

        }

    ]

}
9.4. Get Volumes

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/volumes/{volumeid}

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

Get volume on the VIM

9.4.1. Request

N/A

9.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

String

Tenant UUID

id

1

string

Volume id

name

1

string

Volume name

createTime

1

string

Create time

status

1

string

Volume status

volumeType

1

List

Volume type

volumeSize

1

int

Volume size

availabilityZone

M

1

string

Availability Zone

attachments

M

1..n

list

List of additional information on the cloud disk

attachment:

Parameter

Qualifier

Cardinality

Content

Description

device

1

string

Device name

serverId

1

string

VM id

volumeId

1

string

Volume id

hostName

1

string

Host name

id

1

string

Device id

200: ok

500: failed

{

    "status": "in-use",

    "name": "wangsong",

    "attachments": [

        {

            "device": "/dev/vdc",

            "serverId": "3030e666-528e-4954-88f5-cc21dab1262b",

            "volumeId": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

            "hostName": null,

            "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31"

        }

    ],

    "createTime": "2015-12-02T06:39:40.000000",

    "volumeType ": null,

    "id": "4bd3e9eb-cd8b-456a-8589-910836a0ab31",

    "volumeSize ": 40

}

10. Tenant Management

10.1. List tenants

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/tenants

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

List tenants on the VIM

10.1.1. Query

Parameter

Qualifier

Cardinality

Content

Description

name={tenantname}

O

1

string

Tenant name to filter output list

10.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenants

M

1

Array

id

M

1

string

tenant UUID

name

M

1

string

tenant name

200: ok

500: failed

{

    " tenants ": [

        {

            "id": "1",

            "name": "test\_a"

        }

    ]

}

11. Limits

11.1. List Limits of resouces

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/limits

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

Get limits on the VIM

11.1.1. Request

N/A

11.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id vimName O 1 string vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id tenantId M 1 string Tenant UUID maxPersonality O 1 int The number of allowed injected files for each tenant.

maxPersonalitySize

O

1

int

The number of allowed bytes of content for each injected file.

maxServerGroupMembers

O

1

int

The number of allowed members for each server group.

maxServerGroups

O

1

int

The number of allowed server groups for each tenant.

maxServerMeta

O

1

int

The number of allowed metadata items for each instance.

maxTotalCores

O

1

int

The number of allowed instance cores for each tenant.

maxTotalInstances

O

1

int

The number of allowed instances for each tenant.

maxTotalKeypairs

O

1

int

The number of allowed key pairs for each user.

maxTotalRAMSize

O

1

int

The amount of allowed instance RAM, in MB, for each tenant.

maxTotalVolumeGigabytes

O

1

int

The maximum total amount of volumes, in gibibytes (GiB).

maxTotalVolumes

O

1

int

The maximum number of volumes.

totalVolumesUsed

O

1

int

The total number of volumes used.

totalGigabytesUsed

O

1

int

The total number of gibibytes (GiB) used.

network

O

1

int

The number of networks allowed for each project.

subnet

O

1

int

The number of subnets allowed for each project.

subnetpool

O

1

int

The number of subnet pools allowed for each project.

security_group_rule

O

1

int

The number of security group rules allowed for each project.

security_group

O

1

int

The number of security groups allowed for each project.

router

O

1

int

The number of routers allowed for each project.

port

O

1

int

The number of ports allowed for each project.

200: ok

500: failed

{

"maxPersonality": 5,

"maxPersonalitySize": 10240,

"maxServerMeta": 128,

"maxTotalCores": 20,

"maxTotalInstances": 10,

"maxTotalKeypairs": 100,

"maxTotalRAMSize": 51200,

"maxServerGroups": 10,

"maxServerGroupMembers": 10,

}

12. Host Management

12.1. List hosts

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/hosts

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

list hosts on the VIM

12.1.1. Request

N/A

12.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

string

Tenant Name

hosts

M

1

Array

List of host information

service

M

1

string

The service running on the host

name

M

1

string

host name

zone

O

1

string

Available zone for the host

200: ok

500: failed

{

    "vimId": "123",

    "vimName": "vimName",

    "tenantId": "tenantId1"

    "hosts": [

        {

            "name": "b6e4adbc193d428ea923899d07fb001e",

            "service": "conductor",

            "zone": "internal",

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "name": "09c025b0efc64211bd23fc50fa974cdf",

            "service": "compute",

            "zone": "nova"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "name": "e73ec0bd35c64de4a1adfa8b8969a1f6",

            "service": "consoleauth",

            "zone": "internal"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "host\_name": "396a8a0a234f476eb05fb9fbc5802ba7",

            "service": "network",

            "zone": "internal"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        },

        {

            "name": "abffda96592c4eacaf4111c28fddee17",

            "service": "scheduler",

            "zone": "internal"

            "vimId": "123",

            "vimName": "vimName",

            "tenantId": "tenantId1"

        }

    ]

}
12.2. Get host

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/{tenantid}/hosts/{hostname}

Operation

GET

Direction

VNFLCM->MULTIVIM

Description

Get a host on the VIM

12.2.1. Request
12.2.2. Response

Parameter

Qualifier

Cardinality

Content

Description

vimId

M

1

String

vim id

vimName

O

1

string

vim name

cloud-owner

M

1

String

cloud owner

cloud-region-id

M

1

string

cloud region id

tenantId

M

1

string

Tenant Name

host

M

1

List

Host resource info

resource

M

1..N

Object Resource description

cpu

M

1

Int

The cpu info on the host.

memory_mb

M

1

int

The memory info on the host (in MB).

name

M

1

string

host name

project

M

1

string

Value: total, used_now, used_max or specific project_id

disk_gb

M

1

int

The disk info on the host (in GB).

200: ok

500: failed

{

    "cpu": 1,

    "disk\_gb": 1028,

    "name": "c1a7de0ac9d94e4baceae031d05caae3",

    "memory\_mb": 8192,

    "vimId": "123",

    "vimName": "vimName",

    "tenantId": "tenantId1",

    "host": [

        {

            "memory\_mb": 4960,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 92,

            "project": "(total)",

            "cpu": 4

        },

        {

            "memory\_mb": 1536,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 2,

            "project": "(used\_now)",

            "cpu": 2

        },

        {

            "memory\_mb": 1024,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 2,

            "project": "(used\_max)",

            "cpu": 2

        },

        {

            "memory\_mb": 1024,

            "name": " c1a7de0ac9d94e4baceae031d05caae3",

            "disk\_gb": 2,

            "project": "568f7ec425db472ba348251bf1e7eebd",

            "cpu": 2

        }

    ],

    "vimName": "openstack\_newton",

    "vimId": "dd5b6da9-5984-401f-b89f-78a9776b1a73",

    "tenantId": "568f7ec425db472ba348251bf1e7eebd"

}

13. VIM Management

13.1. Update VIM Info

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/registry

Operation

POST

Direction

ESR-> MULTICLOUD

Description

Register a VIM instance to ONAP

13.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

defaultTenant

M

1

string

default tenant name

13.1.2. Response

NA

202: accept

400: failed

13.2. Get registry status

IF Definition

Description

URI

http://msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region}/registry

Operation

GET

Direction

ESR-> MULTICLOUD

13.2.1. Request

NA

13.2.2. Response

NA

200: OK

404: failed

500: failed

13.3. Unregistry VIM

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}

Operation

DELETE

Direction

ESR-> MULTICLOUD

Description

Unregister a VIM instance from ONAP

13.2.1. Request

NA

13.2.2. Response

NA

204: No content found

400: failed

14. infrastructure workload LCM

14.1. Instantiate infrastructure workload

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload

Operation

POST

Direction

SO-> MULTICLOUD

Description

Instantiate infrastructure workload

14.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

generic-vnf-id

O

1

string

generif VNF ID to search AAI object

vf-module-id

O

1

string

vf module id to search AAI object

user_directives

O

1

Object

user directives to update template_data

This directives take 1st precedence over the other directives

oof_directives

O

1

Object

oof directives to update template_data

This directives take 2nd precedence

sdnc_directives

O

1

Object

sdnc directives to update template_data

This directives take 3rd precedence

template_type

M

1

string

template type with which the

MultiCloud plugin inteprates template_data “heat”,etc.

template_data

M

1

Object

workload template data to

instantiate workload onto VIM/Cloud instance

vf-module-model-customization-id

O

1

string

uuid which is used to retrieve VNF

{
   "generic-vnf-id": "2115b07a-0c45-46ab-929a-0e98764a6ff3",
   "vf-module-id": "86d30674-e096-4957-8ec0-7e0aef68868c",
   "vf-module-model-invariant-id": "aa83cd86-a6f2-4b97-90d4-46bd7cd8748b",
   "vf-module-model-version-id": "9e4386fb-8cdb-45b8-9b01-ae37bc0ba452",
   "vf-module-model-customization-id": "a9e47763-adb7-4689-8dad-f5b780bf1af4",
   "oof_directives":{},
   "sdnc_directives":{},
   "user_directives":{},
   "template_type":"heat",
   "template_data":{{
       "files":{  },
       "disable_rollback":true,
       "parameters":{
          "flavor":"m1.heat"
       },
       "stack_name":"teststack",
       "template":"<escaped template file content>",
       "timeout_mins":60
   }
}
14.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

template_type

M

1

string

template type with which the MultiCloud

plugin inteprates template_data “heat”,etc.

workload_id

M

1

string

The ID of infrastructure workload resource

template_response

O

1

Object

response from VIM/Cloud instance

which is instantiating workload

workload_status

M

1

string

progress of workload instantiating process:

“CREATE_IN_PROGRESS”,”CREATE_COMPLETE”,”CREATE_FAILED”

workload_status_reason

M

1

Object

stack object which is instantiated

201: Created

202: Accepted

400: Bad Request

401: Unauthorized

409: Conflict

{
  "template_type": "HEAT",
  "workload_status_reason": {
    "id": "dca67f9d-37c1-4863-b5e0-0e3d3c53196e",
    "links": [
      {
        "href": "http://msb-iag.onap:80/api/multicloud-titaniumcloud/v1/CloudOwner/ONAP-POD-01-Rail-06/orchestration/v1/709ba629fe194f8699b12f9d6ffd86a0/stacks/vlb_vfm_ewm_1/dca67f9d-37c1-4863-b5e0-0e3d3c53196e",
        "rel": "self"
      }
    ]
  },
  "workload_status": "CREATE_IN_PROGRESS",
  "workload_id": "dca67f9d-37c1-4863-b5e0-0e3d3c53196e"
}
14.2. Query infrastructure workload

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload/{workload-id}

Operation

GET

Direction

SO-> MULTICLOUD

Description

Query the status of the infrastructure workload

14.2.1. Request

NA

14.2.2. Response

Parameter

Qualifier

Cardinality

Content

Description

template_type

M

1

string

Workload Template type e.g. “heat”,etc.

workload_id

M

1

string

The ID of infrastructure workload resource

workload_status

M

1

string

progress of workload operation process:

CREATE_IN_PROGRESS, CREATE_COMPLETE, CREATE_FAILED DELETE_IN_PROGRESS, DELETE_COMPLETE, DELETE_FAILED UPDATE_IN_PROGRESS, UPDATE_COMPLETE, UPDATE_FAILED

workload_status_reason

M

1

Object

stack object which is instantiated

200: OK

400: Bad Request

401: Unauthorized

404: Not Found

500: Internal Server Error

{
  "template_type": "HEAT",
  "workload_status_reason": {
    "id": "dca67f9d-37c1-4863-b5e0-0e3d3c53196e",
    "links": [
      {
        "href": "http://msb-iag.onap:80/api/multicloud-titaniumcloud/v1/CloudOwner/ONAP-POD-01-Rail-06/orchestration/v1/709ba629fe194f8699b12f9d6ffd86a0/stacks/vlb_vfm_ewm_1/dca67f9d-37c1-4863-b5e0-0e3d3c53196e",
        "rel": "self"
      }
    ]
  },
  "workload_status": "CREATE_IN_PROGRESS",
  "workload_id": "dca67f9d-37c1-4863-b5e0-0e3d3c53196e"
}
14.3. Delete infrastructure workload

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload/{workload-id}

Operation

DELETE

Direction

SO-> MULTICLOUD

Description

DELETE the infrastructure workload

14.3.1. Request

NA

14.3.2. Response

Parameter

Qualifier

Cardinality

Content

Description

template_type

M

1

string

Workload Template type e.g. “heat”,etc.

workload_id

M

1

string

The ID of infrastructure workload resource

workload_status

M

1

string

progress of workload operation process:

DELETE_IN_PROGRESS, DELETE_COMPLETE, DELETE_FAILED

workload_status_reason

M

1

Object

stack object which is instantiated

202: Accepted

204: No Content, The server has fulfilled the request by deleting the resource.

400: Bad Request

401: Unauthorized

404: Not Found

500: Internal Server Error

{
  "template_type": "HEAT",
  "workload_status_reason": {
    "id": "dca67f9d-37c1-4863-b5e0-0e3d3c53196e",
    "links": [
      {
        "href": "http://msb-iag.onap:80/api/multicloud-titaniumcloud/v1/CloudOwner/ONAP-POD-01-Rail-06/orchestration/v1/709ba629fe194f8699b12f9d6ffd86a0/stacks/vlb_vfm_ewm_1/dca67f9d-37c1-4863-b5e0-0e3d3c53196e",
        "rel": "self"
      }
    ]
  },
  "workload_status": "DELETE_IN_PROGRESS",
  "workload_id": "dca67f9d-37c1-4863-b5e0-0e3d3c53196e"
}
14.4. Update infrastructure workload into AAI Inventory

IF Definition

Description

URI

msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload/{workload-id}

Operation

POST

Direction

SO-> MULTICLOUD

Description

Update infrastructure workload into AAI

14.4.1. Request

NA

14.4.2. Response

Parameter

Qualifier

Cardinality

Content

Description

template_type

M

1

string

Workload Template type e.g. “heat”,etc.

workload_id

M

1

string

The ID of infrastructure workload resource

workload_status

M

1

string

progress of workload operation process:

UPDATE_IN_PROGRESS, UPDATE_COMPLETE, UPDATE_FAILED

workload_status_reason

M

1

Object

stack object which is instantiated

202: Accepted

400: Bad Request

401: Unauthorized

404: Not Found

500: Internal Server Error

{
  "template_type": "HEAT",
  "workload_status_reason": {
  },
  "workload_status": "UPDATE_IN_PROGRESS",
  "workload_id": "dca67f9d-37c1-4863-b5e0-0e3d3c53196e"
}

15. Proxied OpenStack APIs

15.1. Tokens

IF Definition

Description

URI

http://msb.onap.org:80/api/multicloud/v1/{cloud-owner}/{region-id}/identity/v3/auth/tokens

Operation

POST

Direction

NSLCM-> MULTICLOUD

15.1.1. Request

Parameter

Qualifier

Cardinality

Content

Description

auth

O

1

Object

Same as OpenStack Identity Tokens API

{

}
15.1.2. Response

Parameter

Qualifier

Cardinality

Content

Description

X-Subject-Token

M

1

String

The authentication token in Header

token

O

1

Object

Token response, the same as OpenStack Identity Tokens API

201: Created

401: Unauthorized

403: Forbidden

500: failed

Header:
  X-Subject-Token: a33f3b209e9b471a97fbeab8324a9a45

Body:

    {
         "token" : {
            "user" : {
               "domain" : {
                  "id" : "default",
                  "name" : "Default"
               },
               "id" : "9efb043c7629497a8028d7325ca1afb0",
               "name" : "admin"
            },
            "catalog" : [
               {
                  "type" : "network",
                  "endpoints" : [
                     {
                        "interface" : "public",
                        "id" : "39583c1508ad4b71b380570a745ee10a",
                        "url" : "http://172.16.77.10:80/api/multicloud-titaniumcloud/v1/CloudOwner/RegionOne/network",
                        "region_id" : "RegionOne",
                        "region" : "RegionOne"
                     }
                  ],
                  "name" : "neutron",
                  "id" : "99aefcc82a9246f98f8c281e61ffc754"
               },
               ...
            ]
            "project" : {
               "name" : "admin",
               "id" : "fcca3cc49d5e42caae15459e27103efc",
               "domain" : {
                  "id" : "default",
                  "name" : "Default"
               }
            },
            "is_domain" : false,
            "expires_at" : "2017-09-11T03:52:29.000000Z"
         }
    }

MultiCloud K8sPlugin API v1 Specification

The is the specification for MultiCloud K8sPlugin API version v1.

API Swagger

The specification of the K8sPlugin v1 API in Swagger format:

k8splugin-v1-api-swagger.json

API Catalog

Warning

In the used Sphinx plugin sphinxcontrib-swaggerdoc some information of the swagger file is not rendered completely, e.g. the request body. Use your favorite Swagger Editor and paste the swagger file to get a complete view of the API reference, e.g. on https://editor.swagger.io/.

definition

POST /rb/definition

Add a new RB Definition

  • Description:

  • Consumes: [‘application/json’]

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

body

body

RB Definition object to create

Responses

200 - successful operation

405 - Invalid input

GET /rb/definition

Get all RB Definitions

  • Description: Multiple RB Definitions

  • Produces: [‘application/json’]

Responses

200 - successful operation

400 - Invalid status value

GET /rb/definition/{rbName}

Get all RB Definitions of specified name

  • Description: Multiple RB Definitions

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

Responses

200 - successful operation

400 - Invalid status value

DELETE /rb/definition/{rbName}

Deletes RB Definitions of specified RB Name

  • Description:

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

Responses

400 - Invalid identifiers supplied

404 - RB Definition not found

GET /rb/definition/{rbName}/{rbVersion}

Get RB Definition by Name and Version

  • Description: Returns a single RB Definition object

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

rbVersion

path

Version of the RB Definition to return

string

Responses

200 - successful operation

400 - Invalid identifiers supplied

404 - RB Definition not found

DELETE /rb/definition/{rbName}/{rbVersion}

Deletes RB Definition

  • Description:

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

rbVersion

path

Version of the RB Definition to return

string

Responses

400 - Invalid identifiers supplied

404 - RB Definition not found

POST /rb/definition/{rbName}/{rbVersion}/content

Uploads Helm package associated with RB Definition

  • Description:

  • Consumes: [‘application/gzip’]

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

rbVersion

path

Version of the RB Definition to return

string

Responses

200 - successful operation

profile

POST /rb/definition/{rbName}/{rbVersion}/profile

Add a new profile for RB Definition

  • Description:

  • Consumes: [‘application/json’]

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

rbVersion

path

Version of the RB Definition to return

string

body

body

RB Profile object to create

Responses

200 - successful operation

405 - Invalid input

GET /rb/definition/{rbName}/{rbVersion}/profile

Get all RB Profiles for RB Definition

  • Description: Multiple RB Definitions

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

rbVersion

path

Version of the RB Definition to return

string

Responses

200 - successful operation

400 - Invalid status value

GET /rb/definition/{rbName}/{rbVersion}/profile/{profileName}

Get RB Profile by Name

  • Description: Returns a single RB Profile object

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition to return

string

rbVersion

path

Version of the RB Definition to return

string

profileName

path

Name of the RB profile

string

Responses

200 - successful operation

400 - Invalid identifiers supplied

404 - RB Profile not found

DELETE /rb/definition/{rbName}/{rbVersion}/profile/{profileName}

Deletes RB Profile

  • Description:

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition

string

rbVersion

path

Version of the RB Definition

string

profileName

path

Name of the RB profile

string

Responses

400 - Invalid identifiers supplied

404 - RB Definition of RB profile not found

POST /rb/definition/{rbName}/{rbVersion}/profile/{profileName}/content

Uploads tgz package associated with RB Profile

  • Description:

  • Consumes: [‘application/gzip’]

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

rbName

path

Name of the RB Definition

string

rbVersion

path

Version of the RB Definition

string

profileName

path

Name of the RB profile

string

Responses

200 - successful operation

instance

POST /instance

Create new RB Instance

  • Description:

  • Consumes: [‘application/json’]

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

body

body

RB Instance properties to create

Responses

405 - Invalid input

GET /instance

Get all RB Instances

  • Description: Multiple RB Instances

  • Produces: [‘application/json’]

Responses

200 - successful operation

400 - Invalid status value

GET /instance/{instanceId}

Get RB Instance by ID

  • Description: Returns a single RB Instance object

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

instanceId

path

ID of the instance

string

Responses

200 - successful operation

400 - Invalid identifiers supplied

404 - RB Definition not found

DELETE /instance/{instanceId}

Deletes RB Instance

  • Description:

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

instanceId

path

ID of the instance

string

Responses

400 - Invalid identifiers supplied

404 - Rb Instance not found

GET /instance/{instanceId}/status

Get RB Instance Status

  • Description: Returns status of a single RB Instance object

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

instanceId

path

ID of the instance

string

Responses

200 - successful operation

400 - Invalid identifiers supplied

404 - RB Instance not found

GET /instance/{instanceId}/query

Get filtered out RB Instance status

  • Description: Returns filtered status of a single RB Instance object

  • Produces: [‘application/json’]

Parameters

Name

Position

Description

Type

instanceId

path

ID of the instance

string

ApiVersion

query

Resource ApiVersion like ‘apps/v1’

string

Kind

query

Resource Kind like ‘Deployment’

string

Name

query

Name of Resource like ‘my-pod-1’

string

Labels

query

One or many pairs of label name/value data for filtering Resources like ‘app=test,version=prod’

string

Responses

200 - successful operation

400 - Invalid identifiers supplied

404 - RB Instance not found

MultiCloud Release Notes

MultiCloud Release Notes

Abstract

This document provides the release notes for the jakarta release.

Summary

Version: 11.0.0

There are no updates to the Multicloud project for the Kohn release

Release Data

Project

MultiCloud

Docker images

onap/multicloud-framework:1.9.0 onap/multicloud-framework-artifactbroker:1.9.0 onap/multicloud-openstack-starlingx:1.5.7 onap/multicloud-openstack-windriver:1.5.7 onap/multicloud-openstack-fcaps:1.5.7 onap/multicloud-openstack-pike:1.5.7 onap/multicloud-k8s:0.10.1

Release designation

kohn

New features

N/A

Bug fixes

N/A

Known Issues

  • MULTICLOUD-359 MultiCloud OpenStack: image creating API cannot handle large image file

  • MULTICLOUD-421 MultiCloud OpenStack: API request to multicloud with authorization header will be rejected

  • MULTICLOUD-601 MultiCloud k8s: move to sigs yaml from ghodss

  • MULTICLOUD-1312 MultiCloud k8s: Query API returns 500 instead of 404

  • MULTICLOUD-1329 MultiCloud k8s: Redundant data in MongoDB created

  • MULTICLOUD-1330 MultiCloud k8s: Consul operation interface problems

  • MULTICLOUD-1331 MultiCloud k8s: Instance status update failure

  • MULTICLOUD-1459 MultiCloud k8s: Multicloud-k8s dockers contain GPLv3

Deliverables

Software Deliverables
Documentation Deliverables

Known Limitations, Issues and Workarounds

System Limitations

N/A

Known Vulnerabilities

MULTICLOUD code has been formally scanned during build time using NexusIQ and all Critical vulnerabilities have been addressed, items that remain open have been assessed for risk and determined to be false positive.

The MULTICLOUD open Critical security vulnerabilities and their risk assessment have been documented as part of the project.

Workarounds

N/A

Security Notes

Fixed Security Issues

CVE issue pertained to multicloud-openstack components reported by https://wiki.onap.org/display/SV/Istanbul+Multicloud has been fixed by upgrading dependencies

CVE issue pertained to multicloud-framework components reported by https://wiki.onap.org/display/SV/Istanbul+Multicloud has been fixed by upgrading dependencies

Known Security Issues

Fixing of CVE issue pertained to multicloud-framework-artifactbroker components reported by https://wiki.onap.org/display/SV/Istanbul+Multicloud is an ongoing effort

Fixing of CVE issue pertained to multicloud-openstack-vmware components reported by https://wiki.onap.org/display/SV/Istanbul+Multicloud will not be fixed due to lack of commitment from community

Test Results

N/A

References

For more information on the ONAP kohn release, please see:

  1. ONAP Home Page

  2. ONAP Documentation

  3. ONAP Release Downloads

  4. ONAP Wiki Page

MultiCloud Deployment

ONAP MultiCloud Deployment Guide

prepare docker environment

Please refer to onap deployment in kubernetes website(https://wiki.onap.org/display/DW/ONAP+on+Kubernetes) to setup kubernets cluster.

After installing kubectl and helm, execute “kubectl cluster-info” command to verify your kubernets cluster.

Clone oom project: git clone http://gerrit.onap.org/r/oom Source the setenv.bash script in /oom/kubernetes/oneclick/, it will set your helm list of components to start/delete Run the one time config pod - which mounts the volume /dockerdata/ contained in the pod config-init.

$ cd  oom/kubernetes/config
$ cp onap-parameters-sample.yaml onap-parameters.yaml
$ ./createConfig.sh -n onap

wait for “onap” namespace created, pod “config-init” created

$ kubectl get namespaces
+------------+------------+------+
| NAME       |     STATUS |  AGE |
+------------+------------+------+
|default           Active    10d |
|kube-public       Active    10d |
|kube-system       Active    10d |
|onap              Active    9d  |
+------------+------------+------+

startup containers

first run kube2msb container.

$ cd oom/kubernetes/oneclick
$ ./createAll.bash -n onap -a kube2msb

run msb container

$ ./createAll.bash -n onap -a msb

run aai container

$ ./createAll.bash -n onap -a aai

Finally run multicloud container

$ ./createAll.bash -n onap -a multicloud

get all pods

$ kubectl get pods --all-namespaces
+---------------+---------------------------------------+--------+-----------+----------+-----+
|NAMESPACE      |  NAME                                 | READY  |   STATUS  |RESTARTS  | AGE |
+---------------+---------------------------------------+--------+-----------+----------+-----+
|kube-system       heapster-4285517626-2k4l1               1/1       Running   1          9d  |
|kube-system       kube-dns-2514474280-mxh18               3/3       Running   3          9d  |
|kube-system       kubernetes-dashboard-716739405-jl6mk    1/1       Running   1          9d  |
|kube-system       monitoring-grafana-3552275057-hrpn5     1/1       Running   1          9d  |
|kube-system       monitoring-influxdb-4110454889-t8tpv    1/1       Running   1          9d  |
|kube-system       tiller-deploy-737598192-8q523           1/1       Running   1          9d  |
|onap-aai          aai-resources-837807428-2t158           1/1       Running   0          2d  |
|onap-aai          aai-service-3869033750-1nvg5            1/1       Running   0          2d  |
|onap-aai          aai-traversal-50329389-gnsnk            1/1       Running   0          2d  |
|onap-aai          data-router-2254557428-zwxx1            1/1       Running   0          2d  |
|onap-aai          elasticsearch-622738319-sx6q1           1/1       Running   0          2d  |
|onap-aai          gremlin-671060974-npsg5                 1/1       Running   0          2d  |
|onap-aai          hbase-3690059193-2pjc5                  1/1       Running   0          2d  |
|onap-aai          model-loader-service-849987455-w6vwn    1/1       Running   0          2d  |
|onap-aai          search-data-service-4105978183-p1nnj    1/1       Running   0          2d  |
|onap-aai          sparky-be-2696729089-mcjbw              1/1       Running   0          2d  |
|onap-kube2msb     kube2msb-registrator-1600827891-1s3s4   1/1       Running   3          7d  |
|onap-msb          msb-consul-3388279333-hbr16             1/1       Running   0          2d  |
|onap-msb          msb-discovery-1109629174-t14q8          1/1       Running   0          2d  |
|onap-msb          msb-eag-3969419634-2fdnr                1/1       Running   0          2d  |
|onap-msb          msb-iag-1114772402-sjlww                1/1       Running   0          2d  |
|onap-multicloud   framework-1225620501-9567n              1/1       Running   0          21h |
|onap-multicloud   multicloud-vio-269945856-rl6w6          1/1       Running   0          21h |
+---------------+---------------------------------------+--------+-----------+----------+-----+

get cluster-ip and port

$ kubectl get svc --all-namespaces
+---------------+----------------------+---------------+-------------+-------------------------------------------------------------------+--------+
| NAMESPACE     |      NAME            |  CLUSTER-IP   | EXTERNAL-IP |               PORT(S)                                             |  AGE   |
+---------------+----------------------+---------------+-------------+-------------------------------------------------------------------+--------+
|default           kubernetes             10.43.0.1       <none>        443/TCP                                                             10d   |
|kube-system       heapster               10.43.96.134    <none>        80/TCP                                                              10d   |
|kube-system       kube-dns               10.43.0.10      <none>        53/UDP,53/TCP                                                       10d   |
|kube-system       kubernetes-dashboard   10.43.9.43      <none>        9090/TCP                                                            10d   |
|kube-system       monitoring-grafana     10.43.210.16    <none>        80/TCP                                                              10d   |
|kube-system       monitoring-influxdb    10.43.32.60     <none>        8086/TCP                                                            10d   |
|kube-system       tiller-deploy          10.43.84.208    <none>        44134/TCP                                                           10d   |
|onap-aai          aai-resources          None            <none>        8447/TCP,5005/TCP                                                   2d    |
|onap-aai          aai-service            10.43.88.92     <nodes>       8443:30233/TCP,8080:30232/TCP                                       2d    |
|onap-aai          aai-traversal          None            <none>        8446/TCP,5005/TCP                                                   2d    |
|onap-aai          elasticsearch          None            <none>        9200/TCP                                                            2d    |
|onap-aai          gremlin                None            <none>        8182/TCP                                                            2d    |
|onap-aai          hbase                  None            <none>        2181/TCP,8080/TCP,8085/TCP,9090/TCP,16000/TCP,16010/TCP,16201/TCP   2d    |
|onap-aai          model-loader-service   10.43.172.213   <nodes>       8443:30229/TCP,8080:30210/TCP                                       2d    |
|onap-aai          search-data-service    None            <none>        9509/TCP                                                            2d    |
|onap-aai          sparky-be              None            <none>        9517/TCP                                                            2d    |
|onap-msb          msb-consul             10.43.41.203    <nodes>       8500:30500/TCP                                                      2d    |
|onap-msb          msb-discovery          10.43.6.205     <nodes>       10081:30081/TCP                                                     2d    |
|onap-msb          msb-eag                10.43.81.104    <nodes>       80:30082/TCP                                                        2d    |
|onap-msb          msb-iag                10.43.188.78    <nodes>       80:30080/TCP                                                        2d    |
|onap-multicloud   framework              10.43.97.54     <nodes>       9001:30291/TCP                                                      21h   |
|onap-multicloud   multicloud-vio         10.43.230.197   <nodes>       9004:30294/TCP                                                      21h   |
+---------------+----------------------+---------------+-------------+-------------------------------------------------------------------+--------+

Now msb,aai and multicloud container are online, navigate to http://msb_docker_host_ip:30081/iui/microservices/index.html, you can see multicloud endpoint have been registered.

No Service Name Version NameSpace Url Protocol Visualrange Control 1 multicloud v0 /api/multicloud/v0 REST InSystem 2 multicloud-vio v0 /api/multicloud-vio/v0 REST InSystem

Then register vio information into AAI service with region name “vmware” and region id “vio”

$ curl -X PUT -H "Authorization: Basic QUFJOkFBSQ==" -H "Content-Type: application/json" -H "X-TransactionId:get_aai_subcr" \
    https://aai_resource_docker_host_ip:30233/aai/v01/cloud-infrastructure/cloud-regions/cloud-region/vmware/vio \
    -d "{
         "cloud-type": "vmware",
         "cloud-region-version": "4.0",
         "esr-system-info-list": {
         "esr-system-info": [
           {
            "esr-system-info-id": "123-456",
            "system-name": "vim-vio",
            "system-type": "vim",
            "type": "vim",
            "user-name": "admin",
            "password": "vmware",
            "service-url": "<keystone auth url>",
            "cloud-domain": "default",
            "default-tenant": "admin",
            "ssl-insecure": false
           }
         ]
        }
      }"

ONAP MultiCloud Administrator Guide

The guide for MultiCloud Administrator.

Configuration

Multicloud doesn’t have any configuration file for now.

Administration

From MSB

After Multicloud is up and running, administrator can check Multicloud services from MSB. Go to MSB UI page, administrator should see several icons with name that starts with multicloud.

Multicloud icons in MSB

The icon named Multicloud is the main framework of Multicloud services. And other icons are the plugin for corresponding backend cloud. For example, multilcloud-vio is the plugin for VMware Integrated OpenStack.

Administrator can manage Multicloud from MSB UI page. By clicking the icon named multicloud, there will be available api URL in the bottom of MSB UI page. After filling required fields, and clicking Try it out!, administrator can perform GET/POST/PUT/DELETE over Multicloud.

From CLI

Besides the MSB UI page, Administrator could manage Multicloud from command line interface(CLI). Multicloud’s CLI is the same as OpenStack’s CLI, and therefore, administrator can use OpenStack Client to manage Multicloud. To make OpenStack Client work with Multicloud, administrator needs to set the environment variables of operation system. An example of environment variables is list as below:

OS_AUTH_URL=http://<msb-ip>:80/api/multicloud/v0/<vim_info>/identity/v3
OS_PROJECT_ID=<project id in backend OpenStack>
OS_PROJECT_NAME=<project name in backend OpenStack>
OS_USER_DOMAIN_NAME=<domain name in backend OpenStack>
OS_USERNAME=<administrator username in backend OpenStack>
OS_PASSWORD=<password of administrator in backend OpenStack>
OS_REGION_NAME=<region name in backend OpenStack>
OS_INTERFACE=internal
OS_IDENTITY_API_VERSION=3

<msb-ip> in OS_AUTH_URL is the IP address of MSB. <vim-info> is composed of cloud_type and cloud_region_id. These two attributes are information of cloud from A&AI. Other environment variables listed above are some information from Multicloud’s backend OpenStack. After exporting above variables into operation system, administrator can use OpenStack Client to manage Multicloud. For example:

nova list

will list the virtual machine in Multicloud’s backend OpenStack.

Logging And Diagnostics

Logging file

The logging file named “runtime_multivimbroker.log” located at /opt/multivimbroker/logs/ directory would record INFO, WARN, ERROR and DEBUG level of information. The format string of logging is “%(asctime)s-%(funcName)s-%(filename)s-%(lineno)d-%(levelno)s-%(content string)s”. If there are any issues happened in framework service, you are able to check ERROR level logging to diagnose the problem. The content of this file list as below:

2017-11-03 07:03:31,646:[multivimbroker.pub.utils.restcall]:[restcall.py]-[63][DEBUG]:request=http://192.168.10.45:80/api/multicloud/v0/vmware_vio/identity/v2.0)
2017-11-03 07:08:38,020:[multivimbroker.pub.utils.restcall]:[restcall.py]-[63][DEBUG]:request=https://192.168.10.26:8443/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/vmware/vio)
2017-11-03 07:08:38,103:[multivimbroker.pub.utils.restcall]:[restcall.py]-[63][DEBUG]:request=http://192.168.10.45:80/api/multicloud/v0/vmware_vio/identity/v2.0)

The stdout of framework service named “nohup.out” located at /opt/multivimbroker/ record each http request. The content of this file looks like as below:

[25/Oct/2017 00:09:27] "POST /api/multicloud/v0/vmware_vio/identity/v2.0/tokens HTTP/1.0" 500 273
[25/Oct/2017 14:17:27] "POST /api/multicloud/v0/vmware_fake/identity/v2.0/tokens HTTP/1.0" 200 5389
[26/Oct/2017 23:44:13] "POST /api/multicloud/v0/vmware_vio/identity/v3/auth/tokens HTTP/1.0" 200 6213

Each line compose with http method, url and response code, so you are able to check the response status of every http request.

ONAP MultiCloud Heat Deployment Guide

Prerequisites

1. A VIO platform install with nova, keystone, horizon, image, neutron and heat service, make sure floating ip is work.

2. A local host as OpenStack client cloud access OpenStack platform, install python, python-pip, virtualenv, python-openstackclient, python-heatclient.

Export os enviroment

we’ll need to create a file call admin.rc with following content

keystone version 2.0 Example:

export OS_AUTH_URL=https://identity.api.opentack.com/v2.0/
export OS_USERNAME=UserName
export OS_TENANT_ID=TenantID
export OS_REGION_NAME=RegionID
export OS_PASSWORD=Password
export OS_IDENTITY_API_VERSION=2

keystone version 3.0 Example:

export OS_AUTH_URL=https://identiy.api.openstack.com/v3/
export OS_PROJECT_ID=ProjectID
export OS_PROJECT_NAME=ProjectName
export OS_USER_DOMAIN_NAME=DomainName
export OS_USERNAME=UserName
export OS_PASSWORD=Password
if [ -z "$OS_USER_DOMAIN_NAME" ]; then unset OS_USER_DOMAIN_NAME; fi

# unset v2.0 items in case set
unset OS_TENANT_ID
unset OS_TENANT_NAME


export OS_IDENTITY_API_VERSION=3

Get VIO pem

Get a copy of vio.pem in load balancer vms(/etc/ssl/vio.pem) in local host, then add the following line to your admin.rc file:

export OS_CACERT=/your/path/vio.pem

Deploy the ONAP

get onap heat files from git repo:

git clone http://<your-account>@gerrit.onap.org/r/a/demo

we will use onap_opentack_float.yaml and onap_openstack_float.env heat templates at ./demo/heat/ONAP/ dirctory.

Set env options in onap_openstack_float.env according to VIO platform env, Finally, heat enviroment contains correct parameters.

Next source the admin.rc file to create shell environment variables we nedd.

source  admin.rc

Then create heat stack

openstack stack create -t onap_openstack_float.yaml -e onap_openstack_float.env  ONAP

This process will take several minutes to spin up

MultiCloud Plugins User Guides

MultiCloud Plugin for Wind River Titanium Cloud

The following guides are provided to describe tasks that a user of ONAP may need to perform when operating ONAP to orchestrate VNF onto an instance of Wind River Titanium Cloud

Supported Features

Proxy endpoints for OpenStack services

MultiCloud plugin for Wind River Titanium Cloud supports the proxy of OpenStack services. The catalog of proxied services is exactly same as the catalog of OpenStack services

VFC specific Northbound API

MultiCloud plugin for Wind River Titanium Cloud supports VFC with the legacy APIs which was inherited from OPEN-O MultiVIM project.

Support enhanced SO/OOF workflow

MultiCloud plugin for Wind River Titanium Cloud supports infra_workload APIs from Casablanca Release.

These APIs enhances the workflow of Heat based VNF orchestration by:

  • offloading Heat template/parameter updating from SO to MultiCloud

    plugins

  • Enabling the “Centralized Representation of Cloud Regions”

  • Automate the heatbridge action by updating the AAI with deployed Heat

    stack resources

Support OOF

MultiCloud plugin for Wind River Titanium Cloud supports capacity check from Beijing Release.

Conform to Consistent ID of a Cloud Region

Northbound API v1 supports the composite keys {cloud-owner}/{cloud-region-id} as the ID of a cloud region

Decoupling between cloud-region-id and OpenStack Region ID

{cloud-region-id} should be populated by users while on-boarding a cloud region. With ONAP A and B release, it must be the same as the “OpenStack Region ID” of the represented OpenStack instance. From ONAP C release, this restriction has been removed.

The backward compatibility is maintained so that user can still populate the {cloud-reigon-id} by “OpenStack Region ID”.

Users could also specify the “OpenStack Region ID” while onboarding a cloud region out of multi-region instances.

Note

There are still restrictions to populate {cloud-owner} and {cloud-region-id}, please refer to section “On-board a Cloud Region”

Support on-boarding of Multi-Region instances

Multiple OpenStack instances federated with the “multi-region” feature can be on-boarded into ONAP with a single click. ONAP user needs to register only the primary region into ONAP, and the multicloud plugin for Wind River Titanium Cloud

Titanium Cloud will discover and on-board all other secondary regions automatically.

This feature supports Titanium Cloud feature “Distributed Cloud” to on-board all subclouds with a single click.

This feature can be controlled by user with configuration options while on-boarding a cloud region

HPA discovery

MultiCloud plugin for Wind River Titanium Cloud supports discover and registration into AAI with regarding to following HPA capability: CPU Pinning, HugePage, …

Cloud Region decommission

MultiCloud plugin for Wind River Titanium Cloud support the decommission of a cloud region with a single API requests.

This API is not yet integrated with ESR GUI portal.

VESagent

MultiCloud plugin for Wind River Titanium Cloud supports VESagent which can be configured to monitor the VM status and assert or abate fault event to VES collector for close loop control over infrastructure resources.

LOGGING

MultiCloud plugin for Wind River Titanium Cloud supports centralized logging with OOM deployed ONAP

Supported Use Cases

vFW/vDNS

The vFW/vDNS are the VNFs modeled with HEAT templates MultiCloud plugin for Wind River Titanium Cloud has been tested with vFW/vDNS use cases from Amsterdam Release.

vCPE

vCPE (HEAT VNF) without HPA orchestration

vCPE is the VNF modeled with HEAT templates, basic Use case from Amsterdam Release does not include any HPA orchestration.

vCPE (HEAT VNF) with HPA orchestration

From Beijing Release,a variation of vCPE use case include HPA orchestration

vCPE (TOSCA VNF) with HPA orchestration

From Casablanca Release (With MultiCloud Release Version 1.2.2), vCPE use case expands to support TOSCA VNF and include HPA orchestration

MultiCloud plugin for Wind River Titanium Cloud has been tested with both cases.

vVoLTE

MultiCloud plugin for Wind River Titanium Cloud has been tested with vVoLTE use case.

Known Issues:

1. MULTICLOUD-359 : The image uploading API from VFC specific NBI does not work with large image file.

Tutorial: Onboard instance of Wind River Titanium Cloud

Prerequisites

Collect ONAP Access Info
With Heat based ONAP:
export ONAP_AAI_IP=<floating IP of VM with name "onap-aai-inst1">
export ONAP_AAI_PORT=8443
export ONAP_MSB_IP=<floating IP of VM with name "onap-multi-service">
export ONAP_MSB_PORT=80
With OOM based ONAP:
export ONAP_AAI_IP=<floating IP of VM with name "k8s_1">
export ONAP_AAI_PORT=30233
export ONAP_MSB_IP=<floating IP of VM with name "k8s_1">
export ONAP_MSB_PORT=30280
Determine the ID of the cloud region:

cloud region is ONAP’s representation of the on-boarded VIM/Cloud instance (Titanium Cloud instance in this case). The ID of a cloud region is specified by ONAP user while on-boarding the VIM/Cloud instance, this ID will be internal to ONAP only, comprised by the composite keys of “cloud-owner” and “cloud-region-id”.

export CLOUD_OWNER="CloudOwner"
export CLOUD_REGION_ID="RegionOne"
Notes:

1, It is suggested to populate “cloud-owner” to be “CloudOwner”. The restriction is that underscore “_” can not be used.

2, There is restriction from ONAP Amsterdam Release that the “cloud-region-id” must be the same as OpenStack Region ID in case that the cloud region represent an OpenStack Instance. From Casablanca Release, the restriction of “cloud-region-id” has been removed by MultiCloud plugin for Wind River Titanium Cloud. It is not mandatory to be populate the “cloud-region-id” with OpenStack Region ID.

The geographic location of the cloud region

make sure there is complex object to represent the geographic location of the cloud region in case you need create a complex object “clli1”:

curl -X PUT \
https://$ONAP_AAI_IP:$ONAP_AAI_PORT/aai/v13/cloud-infrastructure/complexes/complex/clli1 \
-H 'Accept: application/json' \
-H 'Authorization: Basic QUFJOkFBSQ==' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 2b272126-aa65-41e6-aa5d-46bc70b9eb4f' \
-H 'Real-Time: true' \
-H 'X-FromAppId: jimmy-postman' \
-H 'X-TransactionId: 9999' \
-d '{
    "physical-location-id": "clli1",
    "data-center-code": "example-data-center-code-val-5556",
    "complex-name": "clli1",
    "identity-url": "example-identity-url-val-56898",
    "physical-location-type": "example-physical-location-type-val-7608",
    "street1": "example-street1-val-34205",
    "street2": "example-street2-val-99210",
    "city": "Beijing",
    "state": "example-state-val-59487",
    "postal-code": "100000",
    "country": "example-country-val-94173",
    "region": "example-region-val-13893",
    "latitude": "39.9042",
    "longitude": "106.4074",
    "elevation": "example-elevation-val-30253",
    "lata": "example-lata-val-46073"
    }'

On-board Wind River Titanium Cloud Instance

You can on-board the instance of Wind River Titanium Cloud with either way as below

With curl commands
Step 1: Create a cloud region to represent the instance
### on-board a single OpenStack region
### you can specify the Openstack Region ID by extra inputs: {"openstack-region-id":"RegionOne"}


curl -X PUT \
https://$ONAP_AAI_IP:$ONAP_AAI_PORT/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/${CLOUD_OWNER}/${CLOUD_REGION_ID} \
-H 'Accept: application/json' \
-H 'Authorization: Basic QUFJOkFBSQ==' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 8b9b95ae-91d6-4436-90fa-69cb4d2db99c' \
-H 'Real-Time: true' \
-H 'X-FromAppId: jimmy-postman' \
-H 'X-TransactionId: 9999' \
-d '{
    "cloud-owner": "<${CLOUD_OWNER}>",
    "cloud-region-id": "<${CLOUD_REGION_ID}>",
    "cloud-type": "openstack",
    "owner-defined-type": "t1",
    "cloud-region-version": "titanium_cloud",
    "complex-name": "clli1",
    "cloud-zone": "CloudZone",
    "sriov-automation": false,
    "identity-url": "WillBeUpdatedByMultiCloud",
    "cloud-extra-info":"{\"openstack-region-id\":\"RegionOne\"}"
    "esr-system-info-list": {
        "esr-system-info": [
            {
            "esr-system-info-id": "<random UUID, e.g. 5c85ce1f-aa78-4ebf-8d6f-4b62773e9bde>",
            "service-url": "http://<your openstack keystone endpoint, e.g. http://10.12.25.2:5000/v3>",
            "user-name": "<your openstack user>",
            "password": "<your openstack password>",
            "system-type": "VIM",
            "ssl-insecure": true,
            "cloud-domain": "Default",
            "default-tenant": "<your openstack project name>",
            "system-status": "active"
            }
        ]
      }
    }'
### on-board multiple OpenStack regions with a single request by indicating {"multi-region-discovery":true}
### you can specify the Openstack Region ID by extra inputs: {"openstack-region-id":"RegionOne"}

curl -X PUT \
https://$ONAP_AAI_IP:$ONAP_AAI_PORT/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/${CLOUD_OWNER}/${CLOUD_REGION_ID} \
-H 'Accept: application/json' \
-H 'Authorization: Basic QUFJOkFBSQ==' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 8b9b95ae-91d6-4436-90fa-69cb4d2db99c' \
-H 'Real-Time: true' \
-H 'X-FromAppId: jimmy-postman' \
-H 'X-TransactionId: 9999' \
-d '{
    "cloud-owner": "<${CLOUD_OWNER}>",
    "cloud-region-id": "<${CLOUD_REGION_ID}>",
    "cloud-type": "openstack",
    "owner-defined-type": "t1",
    "cloud-region-version": "titanium_cloud",
    "complex-name": "clli1",
    "cloud-zone": "CloudZone",
    "sriov-automation": false,
    "identity-url": "WillBeUpdatedByMultiCloud",
    "cloud-extra-info":"{\"multi-region-discovery\":true, \"openstack-region-id\":\"RegionOne\"}"
    "esr-system-info-list": {
        "esr-system-info": [
            {
            "esr-system-info-id": "<random UUID, e.g. 5c85ce1f-aa78-4ebf-8d6f-4b62773e9bde>",
            "service-url": "http://<your openstack keystone endpoint, e.g. http://10.12.25.2:5000/v3>",
            "user-name": "<your openstack user>",
            "password": "<your openstack password>",
            "system-type": "VIM",
            "ssl-insecure": true,
            "cloud-domain": "Default",
            "default-tenant": "<your openstack project name>",
            "system-status": "active"
            }
        ]
      }
    }'
Step 2: associate the cloud region with the location object

This association between the cloud region and location is required for OOF homing/placement of VNF

curl -X PUT \
https://$ONAP_AAI_IP:$ONAP_AAI_PORT/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/${CLOUD_OWNER}/${CLOUD_REGION_ID}/relationship-list/relationship \
-H 'Authorization: Basic QUFJOkFBSQ==' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 7407d60c-8ce7-45de-ada3-4a7a9e88ebd4' \
-H 'Real-Time: true' \
-H 'X-FromAppId: jimmy-postman' \
-H 'X-TransactionId: 9999' \
-d '{
    "related-to": "complex",
    "related-link": "/aai/v13/cloud-infrastructure/complexes/complex/clli1",
    "relationship-data": [
        {
        "relationship-key": "complex.physical-location-id",
        "relationship-value": "clli1"
        }
        ]
    }'
Step 3: Trigger the MultiCloud Plugin registration process

Make sure trigger MultiCloud plugin to discover and register Infrastructure resources, including HPA

curl -X POST \
http://$ONAP_MSB_IP:$ONAP_MSB_PORT/api/multicloud/v0/${CLOUD_OWNER}_${CLOUD_REGION_ID}/registry \
-H 'Accept: application/json' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 8577e1cc-1038-471d-8b3b-d36fe44ae023'
With ESR GUI Portal

ESR will conduct all steps mentioned above with a single click.

The url of the ESR GUI Portal is:

http://$ONAP_MSB_IP:$ONAP_MSB_PORT/iui/aai-esr-gui/extsys/vim/vimView.html

ESR VIM Registrer GUI Portal

Verification

You may want to verify if the cloud region was registered properly (with HPA information populated) to represent the instance of Wind River Titanium Cloud, you can do it with the curl command as below

curl -X GET \
https://$ONAP_AAI_IP:$ONAP_AAI_PORT/aai/v13/cloud-infrastructure/cloud-regions/cloud-region/${CLOUD_OWNER}/${CLOUD_REGION_ID}?depth=all \
-H 'Accept: application/json' \
-H 'Authorization: Basic QUFJOkFBSQ==' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 2899359f-871b-4e61-a307-ecf8b3144e3f' \
-H 'Real-Time: true' \
-H 'X-FromAppId: jimmy-postman' \
-H 'X-TransactionId: 9999'
Note:

The response of querying a cloud region above should return with a comprehensive cloud region object, you should find out the “hpa-capabilities” under certain flavor object with name prefixed by “onap.”

Tutorial: Cloud Region Decommission:

ESR GUI Portal cannot decommission a cloud region which has been updated by MultiCloud Plugin for Wind River Titanium Cloud, and it does not request MultiCloud to help on that yet. So it is required to issue a rest API request to MultiCloud with a single curl commands:

curl -X DELETE \
'http://$ONAP_MSB_IP:$ONAP_MSB_PORT/api/multicloud-titaniumcloud/v0/CloudOwner_RegionOne' \
-H 'Accept: application/json' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 8577e1cc-1038-471d-8b3b-d36fe44ae023'

Tutorial: Enable ONAP HPA Orchestation to Wind River Titanium Cloud

To fulfil the functional requirement of HPA enablement, MultiCloud plugin for Wind River Titanium Cloud expects the administrator to provision the Titanium Cloud instance conforming to certain conventions.

This tutorial demonstrates how to enable ONAP HPA orchestration to Wind River Titanium Cloud.

Architecture & Policies & Mappings

Please refer to the link for more architecture details:

Please refer to the link for more Policies&Mappings details:

Provision Flavors

configure openstack with proper flavors (with name prefixed by “onap.” to carry HPA information to ONAP), example flavor:

nova flavor-create onap.hpa.medium 110 4096 0 6
#cpu pining
nova flavor-key onap.hpa.medium set hw:cpu_policy=dedicated
nova flavor-key onap.hpa.medium set hw:cpu_thread_policy=prefer
#cpu topology
nova flavor-key onap.hpa.medium set hw:cpu_sockets=2
nova flavor-key onap.hpa.medium set hw:cpu_cores=4
nova flavor-key onap.hpa.medium set hw:cpu_threads=8
#hugepage
nova flavor-key onap.hpa.medium set hw:mem_page_size=large
#numa
nova flavor-key onap.hpa.medium set hw:numa_nodes=2
nova flavor-key onap.hpa.medium set hw:numa_cpus.0=0,1 hw:numa_cpus.1=2,3,4,5 hw:numa_mem.0=2048 hw:numa_mem.1=2048

Access configuration of Titanium Cloud Instance

collect following information for on-boarding this Cloud instance to ONAP:

your openstack project name
your openstack user
your openstack password
your openstack keystone endpoint
your openstack Region ID: e.g. RegionOne

On-board the Titanium Cloud instance

Now you can onboard this Titanium Cloud instance, make sure the multicloud registration process is triggered.

See Tutorial: Onboard instance of Wind River Titanium Cloud

Tutorial: VESagent configuration and Testing

VESagent is a FCAPS relaying service offered by MultiCloud Plugin for Wind River Titanium Cloud. It allows user to monitor specified VM status and report VES collector with onset or abate fault event “Fault_MultiCloud_VMFailure”

VESagent provisoning APIs

### assume OOM deployment as below endpoints:

  • OOM k8s Node IP, e.g. 10.12.5.184

  • OOM k8s Node port for multicloud-titaniumcloud POD: 30294

  • On-boarded cloud region with {cloud-owner}/{cloud-region-id} : CloudOwner/pod01

  • VES collector endpoint: 10.12.6.79:8081

#!/bin/bash
export MC_EP_IP=10.12.5.184
export MC_EP_PORT=30294

export MC_EPv0=http://$OPENO_IP:$MC_EP_PORT/api/multicloud-titaniumcloud/v0/CloudOwner_pod01
export MC_EPv1=http://$OPENO_IP:$MC_EP_PORT/api/multicloud-titaniumcloud/v1/CloudOwner/pod01
1. Setup VESagent backlogs

** Option 1: monitor all VMs of a tenant**

curl -v -s -H "Content-Type: application/json" -d '{"vesagent_config": \
     {"backlogs":[ {"domain":"fault","type":"vm","tenant":"VIM"}],\
     "poll_interval_default":10,"ves_subscription":\
     {"username":"admin","password":"admin","endpoint":"http://10.12.6.79:8081/eventListener/v5"}}}'\
      -X POST  $MC_EPv0/vesagent

** Option 2: monitor specified VMs**

### zdfw1lb01dns01, zdfw1lb01dns02
curl -v -s -H "Content-Type: application/json" -d '{"vesagent_config":\
     {"backlogs":[ {"source":"zdfw1lb01dns01", "domain":"fault","type":"vm","tenant":"VIM"},\
      {"source":"zdfw1lb01dns02", "domain":"fault","type":"vm","tenant":"VIM"}],
     "poll_interval_default":10,"ves_subscription":\
     {"username":"admin","password":"admin","endpoint":"http://10.12.6.79:8081/eventListener/v5"}}}' \
     -X POST  $MC_EPv0/vesagent
2. Dump the VESagent backlogs
curl -v -s -H "Content-Type: application/json" -X GET  $MC_EPv0/vesagent
3. Delete the VESagent backlogs
curl -v -s -H "Content-Type: application/json" -X DELETE  $MC_EPv0/vesagent

VESagent exercises

Step 1: Monitor the DMaaP events

Subscribe to and keep polling DMaaP Topic: “unauthenticated.SEC_FAULT_OUTPUT” with curl command

curl -X GET \
      'http://$DMAAP_IP:3904/events/unauthenticated.SEC_FAULT_OUTPUT/EVENT-LISTENER-POSTMAN/304?timeout=6000&limit=10&filter=' \
      -H 'Cache-Control: no-cache' \
      -H 'Content-Type: application/json' \
      -H 'Postman-Token: 4e2e3589-d742-48c7-8d48-d1b3577df259' \
      -H 'X-FromAppId: 121' \
      -H 'X-TransactionId: 9999'
Step 2: Setup VESagent backlog
### zdfw1lb01dns01, zdfw1lb01dns02
curl -v -s -H "Content-Type: application/json" -d '{"vesagent_config":\
     {"backlogs":[ {"source":"zdfw1lb01dns01", "domain":"fault","type":"vm","tenant":"VIM"}],\
     "poll_interval_default":10,"ves_subscription":\
     {"username":"admin","password":"admin","endpoint":"http://10.12.6.79:8081/eventListener/v5"}}}' \
     -X POST  $MC_EPv0/vesagent
Step 3: Simulate the Faults

Manually stop the monitored VMs,e.g. VM with name ‘zdfw1lb01dns01’,

Step 4: Observe DMaaP event: “Fault_MultiCloud_VMFailure”

Poll the subscribed DMaaP topic “unauthenticated.SEC_FAULT_OUTPUT” with curl command, you should be able to observe the following VES fault event generated from DMaaP:

[

    "{\"event\":{\"commonEventHeader\":{\"startEpochMicrosec\":1537233558255872,\"sourceId\":\"8e606aa7-39c8-4df7-b2f4-1f6785b9f682\",\"eventId\":\"a236f561-f0fa-48a3-96cd-3a61ccfdf421\",\"reportingEntityId\":\"CloudOwner_pod01\",\"internalHeaderFields\":{\"collectorTimeStamp\":\"Tue, 09 18 2018 01:19:19 GMT\"},\"eventType\":\"\",\"priority\":\"High\",\"version\":3,\"reportingEntityName\":\"CloudOwner_pod01\",\"sequence\":0,\"domain\":\"fault\",\"lastEpochMicrosec\":1537233558255872,\"eventName\":\"Fault_MultiCloud_VMFailure\",\"sourceName\":\"zdfw1lb01dns01\"},\"faultFields\":{\"eventSeverity\":\"CRITICAL\",\"alarmCondition\":\"Guest_Os_Failure\",\"faultFieldsVersion\":2,\"specificProblem\":\"Fault_MultiCloud_VMFailure\",\"alarmInterfaceA\":\"aaaa\",\"alarmAdditionalInformation\":[{\"name\":\"objectType\",\"value\":\"VIM\"},{\"name\":\"eventTime\",\"value\":\"2018-09-18 01:19:18.255937\"}],\"eventSourceType\":\"virtualMachine\",\"vfStatus\":\"Active\"}}}",

]
Step 5: Simulate the Recovery

Manually restart the stopped VM ‘zdfw1lb01dns01’

Step 6: Observe DMaaP event: “Fault_MultiCloud_VMFailureCleared”
[
    "{\"event\":{\"commonEventHeader\":{\"startEpochMicrosec\":1537233558255872,\"sourceId\":\"8e606aa7-39c8-4df7-b2f4-1f6785b9f682\",\"eventId\":\"a236f561-f0fa-48a3-96cd-3a61ccfdf421\",\"reportingEntityId\":\"CloudOwner_pod01\",\"internalHeaderFields\":{\"collectorTimeStamp\":\"Tue, 09 18 2018 01:19:31 GMT\"},\"eventType\":\"\",\"priority\":\"Normal\",\"version\":3,\"reportingEntityName\":\"CloudOwner_pod01\",\"sequence\":1,\"domain\":\"fault\",\"lastEpochMicrosec\":1537233570150714,\"eventName\":\"Fault_MultiCloud_VMFailureCleared\",\"sourceName\":\"zdfw1lb01dns01\"},\"faultFields\":{\"eventSeverity\":\"NORMAL\",\"alarmCondition\":\"Vm_Restart\",\"faultFieldsVersion\":2,\"specificProblem\":\"Fault_MultiCloud_VMFailure\",\"alarmInterfaceA\":\"aaaa\",\"alarmAdditionalInformation\":[{\"name\":\"objectType\",\"value\":\"VIM\"},{\"name\":\"eventTime\",\"value\":\"2018-09-18 01:19:30.150736\"}],\"eventSourceType\":\"virtualMachine\",\"vfStatus\":\"Active\"}}}"

]

MultiCloud Plugin for VMware Integrated OpenStack

Supported features

Northbound APIs for SO

MultiCloud VIO Plugin supports OpenStack services proxy APIs since the beginning, and later in Casablanca release, VIO plugin supports infra_workload API for SO. Use cases like vFW/vDNS will leverage these APIs to instantiate VNFs.

Northbound APIs for VF-C

MultiCloud VIP Plugin supports VF-C by legacy Open-O APIs, and these APIs evolved according to the requirements of VF-C and use cases. VoLTE use case leverage these APIs to instantiate VNFs.

Support Placement Policies for OOF

Since Beijing release, to help OOF to make better placement decision, MultiCloud expose a capacity check API.

Support OpenStack Resources Discovery

When onboarding new VMware OpenStack through ESR UI, VIO plugin could discover current OpenStack Resources like flavors/images/networks/hypervisors, and update them in A&AI.

Support HPA Discovery

The HPA information will be automatically discovered and registered during VIM onboarding process.

Support Cloud Agnostic Placement Policies

The cloud agnostic information like Guarantee/Burstable QoS will be automatically discovered and registered during VIM onboarding process.

Support Auto-Healing Close Loop

Leveraging VESAgent for meter collectrion and healthy report, VIO plugin supports the auto-healing/auto-scaling scenarios in ONAP.

Support Events Federation

Federate the events of VIM layer with ONAP message bus, it provide direct help to HA fencing and improve the efficiency of VM recover with performance verification.

Supported Use Cases

vFW/vDNS

vCPE

VoLTE

Cloud Agnostic Placement Policy Enablement

Currently two types of cloud agnostic intent policies are supported by VIO plugin, Guaranteed QoS and Burstable QoS. VIO plugin will register them when VIM onboard and OOF could make better placement decision based on these policies.

Enable on it on flavors

Discovering these kind of features are through flavor’s extra-specs, when you set quota:cpu_reservation_percent=100 and quota:memory_reservation_percent=100 in flavor, it will be recognized as Guaranteed QoS supported platform. When you choose other percentage for CPU and memory reservation, it will be recognized as Burstable QoS supported platform. Related information will be registered to A&AI.

MultiCloud VMware OpenStack Simulated API User Case

When there’s no real VIO environment at hands, we could still use fake_cloud APIs in VIO plugin to test ONAP functions. These set of APIs simulate the real VIO functions to interact with ONAP components.

Make sure you environment have msb,aai service and multicloud-vmware config file has the right msb_ip and msb_port value,The config file path is vio/vio/pub/config/congfig.py

Register Fake Cloud to AAI

Register vio information into AAI service with region name “vmware” and region id “fake”

$ curl -X PUT  -H "X-TransactionId":"get_aai_subr" -H "X-FromAppId":"AAI" -H "Accept":"application/json" \
  -H "Content-Type:"application/json"  -H "Authorization:Basic QUFJOkFBSQ==" \
  https://aai_ip:aai_port/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/vmware/fake \
    -d "{
          "cloud-owner": "vmware",
          "cloud-region-id": "fake",
          "cloud-type": "vmware",
          "cloud-region-version": "4.0",
          "identity-url": "http://MSB_IP:MSB_PORT/api/multicloud/v0/vmware_fake/identity/v3",
          "cloud-zone": "cloud zone",
          "complex-name": "complex name",
          "esr-system-info-list": {
              "esr-system-info": [
                  {
                      "system-name": "vmware-fake-cloud",
                      "type": "vim",
                      "service-url": "http://127.0.0.1:5000/v3",
                      "user-name": "admin",
                      "password": "vmware",
                      "system-type": "VIM",
                      "ssl-insecure": true,
                      "cloud-domain": "default",
                      "default-tenant": "admin",
                  }
              ]
          }
    }"

the identity url reprent the fake cloud identity url.

Test Examples

the ${fake_identiy_url}= “http://MSB_IP:MSB_PORT/api/multicloud/v0/vmware_fake/identity/v3” the ${msb_address} = “MSB_IP:MSB_PORT”

Get auth token

# send request to multicloud-framework(broker) service to get token of keystone V3

$ curl -X  POST   -d @test.json  -H 'Content-Type:application/json'   http://MSB_IP:MSB_PORT/api/multicloud/v0/vmware_fake/identity/v3/auth/tokens

test.json content example:

{
"auth": {
    "scope": {"project": {"id": “<project-id>”}},
    "identity":
    {
    "password": {"user": {"domain": {"name": “<doman-name>”}, "password": “<user-password>”, "name": “<user-name>”}}, "methods": ["password"]
    }
}
}

Response: There are a large amounts of data including service endpoint, user information, etc. For our testing We take nova and identity service endpoint address and auth token which is in response header named “X-Subject-Token”.

# you can find the endpoint url namespace is “api/multicloiud-vio/v0/vmware_fake”, it represent the multicloud-vio service, So requests sending to mulitcloud-vio will be forwarded to fake cloud.the ip and port reprenst ${msb_address}

Identity endpoint:

http://$msb_address/api/multicloud-vio/v0/vmware_fake/identity

Nova endpoint:

http://$msb_address/api/multicloud-vio/v0/vmware_fake/compute/<user-tenantid>

List projects

Use identity’s endpoint: http://$msb_address/api/multicloud-vio/v0/vmware_fake/identity/

$ curl -X GET   -H 'X-Auth-Token:<token>'  http://$msb_address/api/multicloud-vio/v0/vmware_fake/identity/projects

Get os Hypervisor

Use nova’s endpoint: http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<user-tenantid>

$ curl -X GET -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/os-hypervisors/detail

List instance of user’s project

$ curl -X GET -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers

Show instance detail

you need to input <server-id> in url path.

$ curl -X GET -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/vimid/nova/tenantid/servers/<server-id>

Shutdown instance

you need to input <server-id> in url path

$ curl -X POST -d '{"os-stop":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers/<server-id>/action

Start instance

you need to input <server-id> in url path

$ curl -X POST -d '{"os-start":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers/<server-id>/action

Suspend instance

you need to input <server-id> in url path

$ curl -X POST -d '{"suspend":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers/<server-id>/action

Resume instance

you need to input <server-id> in url path

$ curl -X POST -d '{"resume":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json'  http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers/<server-id>/action

Pause instance

you need to input <server-id> in url path

$ curl -X POST -d '{"pause":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers/<server-id>/action

Unpasue instance

you need to input <server-id> in url path

$ curl -X POST -d '{"unpause":null}' -H 'X-Auth-Token:<token> -H 'Content-Type:application/json'  http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers/<server-id>/action

Reboot instance

you need to input <server-id> in url path

$ curl -X POST -d '{"reboot":{"type":"HARD"}}' -H 'X-Auth-Token:<token> -H 'Content-Type:application/json'  http://$msb_address/api/multicloud-vio/v0/vmware_fake/nova/<tenantid>/servers/<server-id>/action

list heat stacks

$ curl -X GET -H 'X-Auth-Token:<token>'  http://$msb_address/api/multicloud-vio/v0/vmware_fake/heat/<tenantid>/stacks

create preview stack

$ curl -X POST -H 'X-Auth-Token:<token>'  http://$msb_address/api/multicloud-vio/v0/vmware_fake/heat/<tenantid>/stacks/preview \
      -d "{
            "files": {},
            "disable_rollback": true,
            "parameters": {
                "flavor": "m1.heat"
            },
            "stack_name": "teststack",
            "template": {
                "heat_template_version": "2013-05-23",
                "description": "Simple template to test heat commands",
                "parameters": {
                    "flavor": {
                        "default": "m1.tiny",
                        "type": "string"
                    }
                },
                "resources": {
                    "hello_world": {
                        "type": "OS::Nova::Server",
                        "properties": {
                            "key_name": "heat_key",
                            "flavor": {
                                "get_param": "flavor"
                            },
                            "image": "40be8d1a-3eb9-40de-8abd-43237517384f",
                            "user_data": "#!/bin/bash -xv\necho \"hello world\" &gt; /root/hello-world.txt\n"
                        }
                    }
                }
            },
            "timeout_mins": 60
         }"

create stack

$ curl -X POST -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/vmware_fake/heat/<tenantid>/stacks \
        -d  "{
                "files": {},
                "disable_rollback": true,
                "parameters": {
                    "flavor": "m1.heat"
                },
                "stack_name": "teststack",
                "template": {
                    "heat_template_version": "2013-05-23",
                    "description": "Simple template to test heat commands",
                    "parameters": {
                        "flavor": {
                            "default": "m1.tiny",
                            "type": "string"
                        }
                    },
                    "resources": {
                        "hello_world": {
                            "type": "OS::Nova::Server",
                            "properties": {
                                "key_name": "heat_key",
                                "flavor": {
                                    "get_param": "flavor"
                                },
                                "image": "40be8d1a-3eb9-40de-8abd-43237517384f",
                                "user_data": "#!/bin/bash -xv\necho \"hello world\" &gt; /root/hello-world.txt\n"
                            }
                        }
                    }
                },
                "timeout_mins": 60
            }"

delete stack

$ curl -X DELETE -H 'X-Auth-Token:<token>'  http://$msb_address/api/multicloud-vio/v0/vmware_fake/heat/<tenantid>/stacks/<stack_name>/<stack_id>

ONAP MultiCloud Test Guide

Test Examples

The env HOST_IP is msb-iag service cluster-ip value is “10.43.188.78”(see it above). The vimid is “vmware_vio” the registered name in aai.

Get V2 auth token

# VIO openstack support keystone V2 version, vio proxy-plugin will check the request body format, if request body format # is keystone V2 format will access keystone V2 service, if not it will access keystone V3 service. # this example show how to access keystone V2 service.

$ curl -X POST -d @testV2.json  -H 'Content-Type:application/json'  http://$msb_address/api/multicloud/v0/<vimid>/identity/v2.0/tokens

testV2.json content:

{
      "auth": {
          "tenantName": "admin",
          "passwordCredentials": {
              "username": "admin",
              "password": "vmware"
          }
      }
}

Response: There are a large amounts of data including service endpoint, user information, etc. For our testing We take nova and identity service endpoint address and auth token which is in response header named “X-Subject-Token”.

# you can find the endpoint url namespace is “api/multicloiud-vio/v0”, it represent the multicloud-vio service, So requests sending to mulitcloud-vio will be forwarded to backend VIO openstack.

Identity endpoint:

http://$msb_address/api/multicloud-vio/v0/<vimid>/identity

Nova endpoint:

http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<user-tenantid>

Get V3 auth token

# send request to multicloud-framework(broker) service to get token

$ curl -X  POST   -d @test.json  -H 'Content-Type:application/json'   http://$msb_address/api/multicloud/v0/<vimid>/identity/v3/auth/tokens

test.json content example:

{
  "auth": sudo pip install virtualenv{
    "scope": {"project": {"id": “<project-id>”}},
    "identity":
  {
  "password": {"user": {"domain": {"name": “<doman-name>”}, "password": “<user-password>”, "name": “<user-name>”}}, "methods": ["password"]
  }
  }
}

Response: There are a large amounts of data including service endpoint, user information, etc. For our testing We take nova and identity service endpoint address and auth token which is in response header named “X-Subject-Token”.

# you can find the endpoint url namespace is “api/multicloiud-vio/v0”, it represent the multicloud-vio service, So requests sending to mulitcloud-vio will be forwarded to backend VIO openstack.

Identity endpoint:

http://$msb_address/api/multicloud-vio/v0/<vimid>/identity

Nova endpoint:

http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<user-tenantid>

List projects

Use identity’s endpoint: http://$msb_address/api/multicloud-vio/v0/<vimid>/identity/

$ curl -X GET   -H 'X-Auth-Token:<token>'  http://$msb_address/api/multicloud-vio/v0/<vimid>/identity/projects

Get os Hypervisor

Use nova’s endpoint: http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<user-tenantid>

$ curl -X GET -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/os-hypervisors/detail

List instance of user’s project

$ curl -X GET -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers

Show instance detail

you need to input <server-id> in url path.

$ curl -X GET -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/vimid/nova/tenantid/servers/<server-id>

Shutdown instance

you need to input <server-id> in url path

$ curl -X POST -d '{"os-stop":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers/<server-id>/action

Start instance

you need to input <server-id> in url path

$ curl -X POST -d '{"os-start":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers/<server-id>/action

Suspend instance

you need to input <server-id> in url path

$ curl -X POST -d '{"suspend":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers/<server-id>/action

Resume instance

you need to input <server-id> in url path

$ curl -X POST -d '{"resume":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json'  http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers/<server-id>/action

Pause instance

you need to input <server-id> in url path

$ curl -X POST -d '{"pause":null}' -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers/<server-id>/action

Unpasue instance

you need to input <server-id> in url path

$ curl -X POST -d '{"unpause":null}' -H 'X-Auth-Token:<token> -H 'Content-Type:application/json'  http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers/<server-id>/action

Reboot instance

you need to input <server-id> in url path

$ curl -X POST -d '{"reboot":{"type":"HARD"}}' -H 'X-Auth-Token:<token> -H 'Content-Type:application/json'  http://$msb_address/api/multicloud-vio/v0/<vimid>/nova/<tenantid>/servers/<server-id>/action

Upload Image Task

create uploading image task by image url:

$ curl -X POST -d '{"input": {"image_properties":
  {"container_format": "bare", "name": "<image_name>"},
  "import_from_format": "<disk_format>",
  "import_from": "<image_url>"},
  "type": "import"}'
  -H 'X-Auth-Token:<token>' -H 'Content-Type:application/json' http://$msb_address/api/multicloud-vio/v0/<vimid>/glance/v2/tasks

get the taskid from response body,then query the task status by taskid.

$ curl -X GET -H 'X-Auth-Token:<token>'  http://$msb_address/api/multicloud-vio/v0/<vimid>/glance/v2/tasks/<taskid>

You can see the description and properties of task in response body,if ‘status’ is success, it will show image_id in result block.

query the image status by image_id

$ curl -X GET -H 'X-Auth-Token:<token>' http://$msb_address/api/multicloud-vio/v0/<vimid>/glance/v2/images/<image_id>

MultiCloud Specifications

Elastic API exposure for Multi Cloud

This spec is to provide a framework for Multi-Cloud to expose API.

Problem Description

Multi-Cloud provides VIM API for other projects in ONAP. API will vary for different projects. However, Multi-Cloud exposes its API by static code. Current way of API exposing produces code duplications.

#. When a client creates a resource through Multi-Cloud, Multi-Cloud needs to convert the API request to back-end OpenStack API request and send to OpenStack. When a client requests a resource through Multi-Cloud, Multi-Cloud needs to retrieve OpenStack resource, converts to its API and reply to client. Even though the two conversion are the same thing with different directions, there are 2 sets of code for it.

#. Most of Multi-Cloud API shares same logic. But the code of this same logic are duplicated for every API.

Given the fact mentioned above, current code amount of Multi-Cloud are larger than it should be. It makes code maintaining be time-consuming and error-prone.

Besides, the swagger files that describe API of Multi-Cloud are maintained manually. It is thousands lines of code and hard for developers to maintain.

Proposed Change

This spec proposes using YAML files to describe Multi-Cloud API. A framework will also be provided. When Multi-Cloud services start up, the framework will read YAML files, parse them and generate API accordingly. Multi-Cloud can dynamically expose API in this way without changing its Python code. And developers only need to maintain YAML files that describe Multi-Cloud API. The YAML files are expected to be less amount than current way of API exposing, because it only contains metadata of Multi-Cloud API.

Using the proposal in this spec, metadata of API are defined in YAML files and logic of API handling are concentrated in the framework mentioned above. So that the code duplication can be eliminated.

To narrow down the scope of this spec, none of current Multi-Cloud API will be changed. This spec will ONLY focus on migrating Multi-Cloud API from current way to the proposed framework in this spec. However, migrating all API to the proposed framework is out of the scope of this spec. A set of API for one specific use case, for example VoLTE, will be migrated to proposed framework. Migrating all API can be implemented in other workitem(s) in future.

To narrow down the scope of this spec, a full, normative definition of API and resources will not be considered. Only partial API will be considered. But it can be implemented in other workitem(s) in future.

To narrow down the scope of this spec, only the functionality that Multi-Cloud has now will be considered and extension support will not be considered in this spec. But it can be implemented in other workitem(s) in future.

It should be noted that, though this spec focuses on how to convert northbound and southboud API, it doesn’t prevent tieing northbound API of MultCloud with other functionalities. In setion Definition of API, an example of API definition has been given, developer can add specific code/module path as a attribute(like handler) under path, instead of defining vim_path. By doing that, developer can tie the northbound API with specific code/module, and expose northbound API with any functionality. This spec just shows the capability of doing this by using the elastic API exposure framework, the implementation for now will still focus on the northbound and southboud API conversion.

It should be noted that there is a prior art in OpenStack “Gluon” [1] project which provides a model-driven framework to generate APIs based on model definitions in YAML. A full, normative definition and extension mechanism of “API Specification” [2] is available in Gluon. Although our current work has limited scope, for those who are interested in full normative definition and extension mechanism in our future work, please refer to those references in “Gluon” [1] project and its “API Specifications” [2].

Since the API are defined by YAML files, swagger files can also be generated from YAML files and exist without manually maintaining. The framework will cover the conversion from YAML file to swagger files.

To keep backward compatibility, the proposal in this spec will be bound to [MULTICLOUD-150]. This means that the proposal is only usable when evenlet with pecan is enabled. So that uses don’t care about this feature will not be affected.

Definition of API

Take the API of host as example. The API will be defined as follow. URLs of the API are defined under paths. There are several attributes for the API. The number of kinds of attributes is not constrained to following example, other attributes can be added if needed.

paths:
  /{vimid}/{tenantid}/hosts/{hostid}:
    parameters:
      - type: string
        format: uuid
        name: vimid
      - type: string
        format: uuid
        name: tenantid
      - type: string
        format: uuid
        name: hostid
    get:
      responses:
        success_code: 200
        description: content of host
        schema: host
    vim_path: {nova_endpoint}/os-hypervisors
parameters

parameters are the variables in the URL. It can be extracted from URL and then used in data retrieving and manipulating.

parameters are discriminated by name, and validated by type and format.

post, put, get, delete

These attributes represents the supported HTTP method. In above example, only get method is defined. When client sends other HTTP method to the URL, a 404 response will be returned.

responses defines the response of the request. success_code is the HTTP code in the response. description is an optional parameter. It describes the response. schema points to the RESTful resource that will be in the response body. In above example, the RESTful resource is host. It should be found in the RESTful resource definition section.

vim_path

vim_path defines the relative URL path of the southbound VIM. Multi-Cloud will use this path to retrieve data from VIM.

Definition of RESTful resource

Take the resource host as example. The resource will be defined as follow. Resources are defined under definitions. The are several attributes for the resource. The number of kinds of attributes is not constrained to following example, other attributes can be added if needed.

definitions:
  host:
    vim_resource: hypervisor
    properties:
      name:
        type: string
        required: true
        source: hypervisor.name
      cpu:
        type: integer
        minimal: 1
        source: hypervisor.vcpus
        action: copy
        required: true
      disk_gb:
        type: integer
        minimal: 0
        source: hypervisor.local_disk_size
        required: true
      memory_mb:
        type: integer
        minimal: 0
        source: hypervisor.memory_size
        required: true
vim_resource

vim_resource points to the resource that comes from southbound VIM. Multi-Cloud will use the resource to build its own resource.

properties

properties defines the properties of the resource. Each property has a name and several attributes. The number of kinds of attributes is not constrained to the example, other attributes can be added if needed.

type of property means the type of current property. It can be some simple data, like string or integer. It can also be some composite data like, object or array.

required of property means if this property is required for the resource. If it is required, missing this property will cause request failure. Default value of required is false.

source of property means that current property will be built from it. It is usually a property from vim_resource. By default, it will be the same property in vim_resource.

action of property means that current property will be build by using this action. By default, it will be copy, which means the data from property of VIM resource is copied to property of Multi-Cloud resource. Other actions can be defined for different scenarios.

minimal is one of the constraint of the property. It means the minimal possible value of the property. If value of the property is less than minimal value. The request will fail.

Swagger File generation

Multi-Cloud is using Swagger file to describe its API. It is maintained manually. Since this spec proposes to use YAML file to generate Multi-Cloud’s API, Swagger file can also be generated from YAML file. The API generating framework will also generate Swagger file.

Implementation

Work Items

  1. Add YAML parser for API and resource.

  2. Add REST client to call southbound VIM API.

  3. Add validator for resource.

  4. Add action for resouce.

  5. Add Swagger file generator.

  6. Migrate /{vimid}/{tenantid}/hosts/{hostid} as an example.

Multi-Vim logging

The purpose of logging is to generate machine-readable, indexable output logs and support to trace requests through sub-component, it need to ship logs to logging enhancement project a centralized logging analysis system capturing diagnostic information.

Problem Description

So far the logging of multi-vim is not able to support customer configuration, handler context specific logging like MDC[MDC_Document]_, also it dose’t propagate transaction-ID in REST headers which is critical to tracing request. There are 4 python containers in oom project need to configure filebeat container for shipping logs.

In addition the current logging is very difficult to understand behavior and performance.

Proposed Change

The proposed change will include three parts.

Filebeat container

Logging architecture[Log_Architecture]_ use Filebeat collects logs from multi-vim containers and ships them to the centralized logging stack. To enable this feature it need to add Filebeat container in multi-vim pod that was deployed by OOM, as well Yaml file will be used to configure Filebeat.

Tracing ID

ONAP logging uses a global unique “RequestID”[RequestID_Document] in logging to track the processing of each request across all the components, multi-vim will receive this id from http header by vary “X-TransactionID”, then record it in logs. Meanwhile single component should generate a InvocationID that records the relationship between RequestID and InvocationID for proper tracing. So Mulit-vim will set unique InvocationID for each single request,also output it in logs.

python AOP logging library

Currently logging enhancement project just has java AOP logging library, For multi-vim which based on python need a python version. The basic feature of AOP logging library could provide customer configuration include retention policy、output location、text output format、message level and so on, support MDC context specific logging, able to change configuration at runtime, and make logging quite fast.

Supporting Python3 version

Right now, this library only has be used in Python2 version. Python2 will not been maintained after 2020, besides part of ONAP project have used python3 version. It’s be better to support Python2 and Python3 version

Markers

Markers can be used to characterize log entries. They allow message that has a specific meaning to be cheaply and easily identified in logger output, without inherently unreliable schemes like scanning for magic strings in the text of each log message. Onap logging requires the emission of markers reporting entry, exit and invocation as the execution if requests pass between ONAP components. This information is used to generate a call graph. Useful and commonplace, See https://stackoverflow.com/questions/4165558/best-practices-for-using-markers-in-slf4j-logback

colored terminal output

As we known, in log4j coloring is supported. It would be better to render logging messages in colors. Bash colors refer: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

The standard colors(nosupport windows) list as below: +———————+————————-+————————+ | Text color | Hightlight color | Text Attribute | +=====================+==================================================+ | Black | Black | Normal | +———————+————————————————–+ | Red | Red | Bold | +———————+————————————————–+ | Green | Green | Underline | +———————+————————————————–+ | Yellow | Yellow | Blink | +————————————————————————+ | Blue | Blue | Invert | +————————————————————————+ | Purple | Purple | Hide | +————————————————————————+ | Cyan | Cyan | | +————————————————————————+ | White | White | | +————————————————————————+

Test

  1. Unit tests with tox

  2. CSIT tests, verify marker label in logging message

Event/Alert/Metrics Federation

As a cloud mediation layer, Multicloud could be invoked by many projects, through this feature, Multicloud will provide VM status/events check and also can customize the type of event which user would like to receive. There are some kinds of VM status can be chosen: DELETE, PAUSE, POWER_OFF, REBUILD SHUT_DOWN, SOFT_DELETE, etc.. In VMware VIO Plugin, once any change of VM status is detected of a given type, Multicloud will catch the event and throw it to DMaaP. Other projects can try this way of getting VM status messages in the future. Also, for other Multicloud plugin providers, due to some issues, there will be rest apis for them to grab the VM status messages.

The APP-C won’t be impacted since APP-C can still call the existing API which implemented in Amsterdam Release and the API is an existing API

Use Cases

In VIO, one typical use case is to allow VIO users to fetch messages from DMaaP, this will provide a easier way for fetching status of VMs, it may drastically reduce the time of close loop, for other Multicloud plugin providers, Multicloud will provide a set of rest apis to get them

Proposed change

In VIO plugin:

The proposed change will include two parts: * listener: to listen the events of the status change of VM, for others it will have rest apis to get the messages * publisher: to throw the event to DMaaP.The message we try to send is something like this:

{
    "state_description": "powering-off",
    "availability_zone": "nova",
    "terminated_at": "",
    "ephemeral_gb": 0,
    "instance_type_id": 5,
    "deleted_at": "",
    "reservation_id": "r-pvx3l6s2",
    "memory_mb": 2048,
    "display_name": "VM1",
    "hostname": "vm1",
    "state": "active",
    "progress": "",
    "launched_at": "2018-03-07T05:59:46.000000",
    "metadata": {},
    "node": "domain-c202.22bfc05c-da55-4ba6-ba93-08d9a067138e",
    "ramdisk_id": "",
    "access_ip_v6": null,
    "disk_gb": 20,
    "access_ip_v4": null,
    "kernel_id": "",
    "host": "compute01",
    "user_id": "aa90efa5c84c4084b39094da952e0bd1",
    "image_ref_url": "http://10.154.9.172:9292/images/207b9b7c-9450-4a95-852b-0d6d41f35d24",
    "cell_name": "",
    "root_gb": 20,
    "tenant_id": "943ecb804cdf4103976b8a02cea12fdb",
    "created_at": "2018-03-07 05:58:01+00:00",
    "instance_id": "4f398943-7d39-4119-8058-74768d6dfa52",
    "instance_type": "m1.small",
    "vcpus": 1,
    "image_meta": {
        "is_copying": "1",
        "container_format": "bare",
        "min_ram": "0",
        "vmware_disktype": "streamOptimized",
        "disk_format": "vmdk",
        "source_type": "url",
        "image_url": "https://cloud-images.ubuntu.com/releases/14.04/release/ubuntu-14.04-server-cloudimg-amd64-disk1.img",
        "vmware_adaptertype": "lsiLogic",
        "min_disk": "20",
        "base_image_ref": "207b9b7c-9450-4a95-852b-0d6d41f35d24"
    },
    "architecture": null,
    "os_type": null,
    "instance_flavor_id": "2"
}

The eventual work flow looks like as follows:

    +------------------+
    |                  |
    |   Multicloud     |
    |     Broker       |
    |                  |
    +---------+--------+
              |
              |
              V
  +-----------------------+            +------------------+
  | Multicloud VIO Plugin |----------->| Dmaap            |
  |                       |   Event    |                  |
  +--------|-----^--------+            +------------------+
  Oslo     |     |
Listener   |     |
           V     |
  +----------------------+
  | VIO                  |
  +----------------------+

In Other Plugins:

Since the security rules of VIMs and network connectivity issues, other multicloud plugins won’t be suitable for the oslo notification listener, so we will provide rest apis for them, the specific implementation will be dicided by them

Input of <vim_id>/check_vim_status will be

{
  "states": array  // the set of VIM status which user wants to get
}

Output of check_vim_status will be

{
  "state_description": string  // VIM's state
  "launched_at": string // time of state change
}

The work flow looks like as follows:

      +------------------+
      |                  |
      |     Multicloud   |
      |       Broker     |
      |                  |
      +---------+--------+
                |
                |
                V
    +-----------------------+
    | Multicloud Plugins    |
    |                       |
    +--------|-----^--------+
    polling  |     |
or other way |     |
             V     |
    +----------------------+
    | Openstack            |
    +----------------------+

Image Service

Because Multicloud provides a cloud mediation layer supporting multiple clouds. It’s necessary to introduces some function enhancements in it. Image Service could let user upload/download images in a convinient way just by using Multicloud.

Problem Description

The original functions which Multicloud possesses are to use urls to upload images, while in this spec we intend to upload images as raw file which means it has to store a copy in Multicloud then upload the images to the backend openstack. So this spec is to extend multicloud to support download/upload images as raw file rather than a through a url

Use Cases

One typical use case is to allow users to upload/download images by Multicloud

Proposed change

The proposed change mainly means introducing glance python APIs to enable multicloud support openstack image service. This feature needs two changes: Upload API to import an image to backend OpenStack and the image that just imported can be queried from MultiCloud. Download API to download an image from backend Openstack and the image can be downloaded from MultiCloud.

The eventual work flow looks like as follows::

 user request to upload image
            |
            V
  +------------------+
  |                  |
  |  image file(iso, |
  |   vmdk... )      |
  |                  |
  +---------+--------+
            |
            |
            |
+-----------|----------+
| multicloud|          |
|           V          |
| +------------------+ |
| | image service API| |
| +---------+--------+ |
+-----------|----------+
            | glance
            |
            V
+----------------------+
| openstack            |
+----------------------+

The APIs look like this:

upload:

Input of /{vimid}/{tenantid}/images/file will be

required: image file
{
  "imageType": string,  // image type: ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso
  "containerFormat": string,  // image container format: ami, ari, aki, bare, ovf, ova, docker
  "visibility": string,  // public, private, shared, or community
  "properties": arrary // list of properties
}

Output of upload_image will be

"responses": {
  "201": {
      "description": "upload successfully",
  },
  "404": {
      "description": "the vim id or tenant UUID is wrong"
  },
  "500": {
      "description": "the vim image is not accessable"
  }

download:

Input of /{vimid}/{tenantid}/images/file/{imageid} will be

{
  "imagepath": string,  // the path of the downloaded image
  "properties": arrary // list of properties
}

Output of download_image will be

"responses": {
  "200": {
      "description": "download successfully",
  },
  "404": {
      "description": "the vim id or tenant UUID is wrong"
  },
  "500": {
      "description": "the vim image is not accessable"
  }

MultiCloud Resources Capacity Check API

To better expose VIM capabilities and available resources capacity to external consumer, some extensions need to be done by MultiCloud.

Problem Description

Current MultiCloud didn’t expose any standard API/methods to check/publish the resources capacity for each VIM, which makes external project can not realize the capacity information of VIM. When a VIM with shortage resources was chosen to deploy a bunch of VNFs, it will fail eventually. Exposing these information will could let external project to make a better decision on choosing which VIM to deploy the VNFs.

Propose Change

Cloud Locations

Cloud latitude and longitude information is needed by OOF to determine the distance between vGMuxInfra and vG. The latitude and longitude information are part of A&AI complex schema[A&AI Complex Schema]_, which related to cloud-region schema.

There is no change needed to MultiCloud, but cloud administrator need to input these information when register a new VIM. Currently ESR Portal don’t expose these input forms to cloud administrator, need ESR team to add related workflow to create complex data in A&AI and create a relationship between location information and cloud-region record.

… [A&AI Complex Schema] https://gerrit.onap.org/r/gitweb?p=aai/aai-common.git;a=blob;f=aai-schema/src/main/resources/oxm/aai_oxm_v12.xml;h=e146c06ac675a1127ee11205c0ff2544e4d9a81d;hb=HEAD#l772

Multi-Tenant Support

Request Headers:

To support multi-tenants over the same cloud region, all APIs defined below should support to accept the following optional headers which are used to specify a tenant other than the default one associated with the cloud region.

"Project"   : Tenant/Project ID or Name specified by API consumer, Optional

Example 1:

"Project: tenant1"

Example 2:

"Project: fcca3cc49d5e42caae15459e27103efc"

Available Resource Check

A new API will be used by OOF to check the available cloud resources, which will help OOF to make a better placement decision. OOF will give a resrouces requirement of a specific deployment and a list of VIMs which need to be check whether have enough resources for this deployment. The ouput of Multicloud will be a list of VIMs which have enough resources.

There will be two part of APIs for this requirement, an check_vim_capacity API will be added to MultiCloud borker to return a list of VIMs, another API <vim_id>/capacity_check will be added to each MultiCloud plugins, and return true or false based on whether the VIM have enought resources. When MultiCloud broker receive a POST request on check_vim_capacity, it will request to each <vim_id>/capacity_check API, and return a list of VIMs with a true in response data.

Format of “vim_id” complying to the functional requirement of “Consistent ID of a Cloud Region”

::

{cloud-owner}/{cloud-region-id}

Format of “VIM ID” complying to the functional requirement of “Consistent ID of a Cloud Region”

{
  "cloud-owner": string, //cloud owner name/ID
  "cloud-region-id": string, //cloud region ID
}

Example: array of "VIM ID" looks like:

[
 {"cloud-owner": "owner1", "cloud-region-id": "regionid1"},
 {"cloud-owner": "owner2", "cloud-region-id": "regionid2"}
]

Format of “AZinfo”

{
  "availability-zone-name": string, //name of available zone
  "vCPUTotal": int,  //number of total cores, optional field
  "MemoryTotal": float,  //GB,total memory, optional field
  "StorageTotal": int, //GB total storage, optional field
  "vCPUAvail": int,  //number of available cores
  "MemoryAvail": float,  //GB, availablesize of memory
  "StorageAvail": int, //GB, available storage
}
}

Format of “VIMinfo” which extend the “VIM ID” as below

{
  "cloud-owner": string, //cloud owner name/ID
  "cloud-region-id": string, //cloud region ID
  "AZs": array,  // list of AZinfo
}

Input of check_vim_capacity will be

{
  "vCPU": int,  // number of cores
  "Memory": float,  // size of memory, GB
  "Storage": int, //GB
  "VIMs": array, //list of "VIM ID" with which OOF wish to check
}

Output of check_vim_capacity will be

{
  "VIMs": array, //list of VIMinfo
}

Input of <vim_id>/capacity_check will be

{
  "vCPU": int,
  "Memory": float,
  "Storage": int,
}

Output of <vim_id>/capacity_check will be

{
  "result": bool,
  "AZs": array, //list of AZinfo, optional field
}

Work Items

  1. Work with ESR team for location inport form.

  2. Add check_vim_capacity API to MultiCloud Broker.

  3. Add check_vim_capacity API to each MultiCloud Plugins.

Tests

  1. Unit Tests with tox

  2. CSIT Tests, the input/ouput of broker and each plugin see API design above.

Container based network service/function deployment

https://wiki.onap.org/pages/viewpage.action?pageId=16007890

This proposal is to implement PoC in Beijing release(R-2) in order to get experience/feedback for future progress.

Problem Description

The current ONAP supports only VM based cloud infrastructure for VNF. On the other hand, in the industry container technology is getting more momentum. Increasing VNF density on each node and latency requirements are driving container based VNFs. This project enhances ONAP to support VNFs as containers in addition to VNFs as VMs.

It is beneficial to support for multiple container orchestration technologies as cloud infrastructure:

  • Allow VNFs to run within container technology and also allow closed feedback loop same to VM based VIM. e.g. openstack.

  • Support for co-existence of VNF VMs and VNF containers

  • Add container orchestration technology in addition to the traditional VM-based VIM or environment managed by ONAP.

  • Support for uniform network connectivity among VMs and containers.

NOTE: This is different from OOM project OOM. their scope is to deploy ONAP itself on k8s. Our scope is to deploy/manage VNFs on container/container orchestration engine(coe). The first target is k8s. Other CoE will also be addressed if someone steps up to support it.

Proposed Change

Scope for Beijing release(R-2)

Basic principle

  • First baby step is to support containers in a Kubernetes cluster via a Multicloud SBI /K8S Plugin (other COE’s(Container Orchestration Engine) are out of Beijing scope. They are future scope.)

  • Minimal implementation with zero impact on MVP of Multicloud Beijing work

Use Cases

  • Sample VNFs(vFW and vDNS) (vCPE use case is post Beijing release) Both vFW and vDNS are targeted. Since custom TOSCA node definitions are used (please refer to tosca section below), new TOSCA templates are needed for them. (In future, post-Beijing, this will be revised to share common TOSCA template.)

Post Beijing Release

In Beijing release, several design aspects are compromised to re-use the existing component/work flow with zero impact primarily because the long term solution is not ready to use. It’s acceptable this effort in Beijing release is PoC or experimental to demonstrate functionality and to get experience for post-Beijing design/architecture. For example, the use of CSAR/new tosca node definitions are to re-use the existing code(i.e. Amsteldam release). After Beijing release, those will be revised for long term solution along with related topics. e.g. model driven API, modeling based on Beijing experience. Once we figured out what multicloud COE API should look like and what adapters in other projects(SO, APP-C) are needed(or not needed) in long term, the inter-project discussion (mainly with SO, APP-C) will start in Casablanca cycle.

integration scenario

  • Register/unregister k8s cluster instances which are already deployed. dynamic deployment of k8s is out of scope. It is assumed that admin knows all the necessary parameters.

  • onboard VNFD/NSD to use container

  • Instantiate / de-instantiate containerized VNFs through K8S Plugin over K8S cluster

  • Vnf configuration with sample VNFs(vFW, vDNS) with the existing configuration interface. (no change to the existing configuration interface)

Northbound API Design

REST API Impact and Base URL

Similar to other plugins(e.g. openstack plugin), k8s plugin has its own API endpoint and base URL so that it doesn’t affect other multicloud northbound API.

Base URL for kubernets plugin:

https://msb.onap.org:80/api/multicloud/v0/

NOTE: Each multicloud plugin has its own API endpoint(ip address). So the plugin is distinguished by endpoint IP address with MSB. “multicloud-kubernetes” name space for MSB is used. NOTE: each COE support has its own API end point and name space. their name spaces will be “multicloud-<coe name>”. With model driven API, we will have API agnostic to COE. in that case the name space “multicloud-coe” will be used.

cloud-id

In ONAP, cloud-id is the format of <cloudOwner>_<cloudRegion> Since k8s doesn’t have notion of region, cloud admin will assign unique string it as cloudRegion and it will be used as a part of cloud-id.

APIs for VNF Lifecycle Management

  • PATH: /<cloud-id>/proxy/<resources>

  • METHOD: All methods

Northbound components, e.g. APP-C, use these APIs for lifecycle management of VNF resources within the Kubernetes cluster, e.g. pods. In essence, these APIs provide simple proxy (or passthrough) functions with authorization adjustment to Kubernetes API Server so that the relevant lifecycle management operations are actually achieved by Kubernetes cluster itself. In another word, these API requests are proxied to “{kubernetes api prefix}/<resources>” within Kubernetes cluster without any changes to http/https request body. the API end point is stored in AA&I and the API consumer will get it from AA&I.

For details of Kubernetes API, please refer to https://kubernetes.io/docs/reference/api-overview/

NOTE: kubernetes doesn’t have concept of region and tenant at this moment. So region and tenant_id isn’t in path. NOTE: VF-C is ETSI NFV orchestrater.(NFV-O) In Beijing release, this isn’t addressed because container is out of scope of ETSI NFV at the time of writing. Post-Beijing, this will be given consideration. First target is APP-C as it’s easier.

API for VNF Deployment

  • PATH: /<cloud-id>/package

  • METHOD: POST media type of Content-Type and/or filename of Contest-Disposition are used to specify package type.

    As private media type, application/onap-multicloud-<coe name>-<type> is used. More concretely for Beijing release the following media types are used. * Content-Type: application/onap-multicloud-kubernetes-csar * Content-Type: application/onap-multicloud-kubernetes-helm As supplement, filename is also used to guess media type. As http header type Contest-Disposition is used to pass filename. * Content-Disposition: attachment; filename=”fname.tgz” first media type is tried and then filename is tried. If both are present media type is used.

This API provides northbound components, e.g. SO, with the function of deploying containerized VNF package into Kubernetes cluster. The VNF package is delivered as payload of HTTP request body in the API call. The VNF package could be a CSAR or Helm Charts.

CSAR deployment package will include a yaml deployment file and other artifacts. This approach would work for simple VNFs consisting of single PODs.

For VNFs comprising of multiple PODs which are dependent on each other, Helm based approach would be used. The VNF package would be described as a Helm package consisting of a set of Helm charts and k8s yamls for each constituent service that is part of the VNF.

There would be no change required in the Northboud API from MultiCloud for either CSAR package or Helm package or any other package in the future. SO calls this MultiVIM Northbound API and sends the k8s package (e.g. csar, or tgz) as payload. k8s Plugin will distinguish package types based on its suffix and interact with k8s cluster appropriately:

  • For CSAR: k8s yaml file will be extracted from CSAR. k8s REST API server will be called to create k8s resources (e.g. pods), which is equivalent to “kubectl create -f <file.yaml>”. The TOSCA file in CSAR is expected to include onap.multicloud.container.kubernetes.proxy.nodes.resources_yaml node which is explained below. In another word, Kubernetes yaml is stored as artifact in CSAR. it is extracted and then it is fed to k8s API.

  • For TGZ: call Tiller API (gRPC-based) and pass through the Helm package

The Kubernetes API Server (RESTful) or Helm Tiller Server (gRPC) URLs are configured for k8s Plugin when the Kubernetes cluster is created and Helm is installed.

With this single API for package, when we need to add new package support in the future, no extra code in SO is needed.

swagger.json

  • PATH: swagger.json swagger.json for kubernetes API definitions

  • METHOD: GET

returns swagger.json definitions of k8s API similar to other multicloud plugins

Internal APIs for Implementations

Some internal APIs may be needed by the implementation details of above northbound APIs. For example, when implementing VNF Deployment API above, we may need internal APIs to assist calling Helm Tiller Server or Kubernetes API Server, e.g. similar to “kubectl create -f xxx.yaml”.

The internal API, if needed, will be handled in implementation, which is out of scope of this section of the document.

Test plan

In this section test play is discussed. In Beijing cycle, test is minimal or stretched goal because the effort in Beijing is PoC/experimental to get experience. the following class of test would be planned as stretched goal.

  • Unit Test

    • API input/output

  • functional test

    • communication to backend(K8S API server, helm tiller server)

  • CSIT as end-to-end test

Register/Unregister Kubernetes Cluster Instance

This is done via A&AI ESR ESR to follow the way of the existing multicloud. some attributes, e.g. region id, don’t make sense for k8s. In that case predefined value, e.g. ‘default’, are used. The info for basic authentication, i.e. the pair of (username, password), against kuberenetes API is registered and stored in A&AI.

NOTE: ESR will call registry API when register a new VIM(k8s). we need to make sure that we have this API in this plugin and give them response.

NOTE: HPA(kubernetes cluster features/capabilities) is out of scope for Beijing Assumption K8s cluster instance is already pre-build/deployed Dynamic instantiation is out of scope(for Beijing)

attributes for A&AI ESR

This subsection describes how attributes for VIM registration are specified. For actual definitions, please refer to ESR Some attributes doesn’t apply to kubernetes so that such attributes will be left unspecified if it’s optional or define pre-defined constants if it’s mandatory.

URI /api/aai-esr-server/v1/vims Operation Type POST

Request Body:

------------------ ---------- ------- ----------------------------------------
Attribute          Qualifier  Content Description
================== ========== ======= ========================================
cloudOwner         M          String  any string as cloud owner
------------------ ---------- ------- ----------------------------------------
cloudRegionId      M          String  e.g. "kubernetes-<N>" as it doesn't apply
                                      to k8s. Cloud admin assigns unique id.
------------------ ---------- ------- ----------------------------------------
cloudType          M          String  "kubernetes". new type
------------------ ---------- ------- ----------------------------------------
cloudRegionVersion M          String  kubernetes version. "v1.9", "v1.8" ...
------------------ ---------- ------- ----------------------------------------
ownerDefinedType   O          String  None. (not specified)
------------------ ---------- ------- ----------------------------------------
cloudZone          O          String  None. (not speicfied)
                                      as kubernetes doesn't have notion of
                                      zone.
------------------ ---------- ------- ----------------------------------------
complexName        O          String  None. (not specified)
                                      as kubernetes doesn't have notion of
                                      complex.
------------------ ---------- ------- ----------------------------------------
cloudExtraInfo     O          String  json string(dictionary) for necessary
                                      info. For now "{}" empty dictionary.
                                      For helm support, URL for tiller server
                                      is stored.
------------------ ---------- ------- ----------------------------------------
vimAuthInfos       M          [Obj]   Auth information of Cloud
                                      list of authInfoItem which is described
                                      below.
================== ========== ======= ========================================

There are several constraints/assumptions on cloudOwner and cloudRegionId. cloud-region . For k8s, cloudRegionId is (ab)used to specify k8s cluster instance. ONAP admin has to assign unique id for cloudRegionId as id for k8s cluster instance.

NOTE: complexName: this will be revised post-Beijing. “complex” is used to specify (latitude, longitude) of a data center location for the purpose of homing optimization. If those values can be obtained somehow, this should be populated.

authInfoItem

Basic authentication is used for k8s api server.

-------------- --------- ------- -------------------------------------------
Attribute      Qualifier Content Description
============== ========= ======= ===========================================
cloudDomain    M         String  "kubernetes" as this doesn't apply.
-------------- --------- ------- -------------------------------------------
userName       M         String  User name
-------------- --------- ------- -------------------------------------------
password       M         String  Password
-------------- --------- ------- -------------------------------------------
authUrl        M         String  URL for kubernetes API server
-------------- --------- ------- -------------------------------------------
sslCacert      O         String  ca file content if enabled ssl on
                                kubernetes API server
-------------- --------- ------- -------------------------------------------
sslInsecure    O         Boolean Whether to verify VIM's certificate
============== ========= ======= ===========================================

NOTE: For some issues issue23, ESR should provide authenticating by bearer token for Kubernetes cluster if possible beside basic authentication. Those extra value will be stored in cloudExtraInfo. This is stretched goal.

On boarding/packaging/instantiation

We shouldn’t change the current existing work flow. In short term: Use additional node type/capability types etc. In longer term way: Follow ONAP community directoin. At the moment, work with TOSCA community to add additional node type to express k8s.

NOTE: this packaging is temporally work around until ONAP modelling and multicloud model driven API are available. Post Beijing release packaging will be revised to follow ONAP modeling and multicloud model driven API.

Packaging and on-boarding

Reuse CASR so that the existing work flow doesn’t need change. For Beijing CSAR is used with its own TOSCA node definition. In longer term, once multicloud project has model driven API, it will be followed to align with modeling and SO.

TOSCA node definitions

Introduce new nodes to wrap k8s ingredients(k8s yaml, helm etc.) These TOSCA node definitions are short term work around to re-use the existing component/workflow until model driven API is defined/implemented. For Beijing, human will write this TOSCA by hands for PoC. Post Beijing, packaging needs to be revised to align with modeling and SO. Also SDC, VNF-SDK need to be addressed for creation.

  • onap.multicloud.nodes.kubernetes.proxy

    • node definitions

      data_types:
        onap.multicloud.container.kubernetes.proxy.nodes.resources_yaml:
        properties:
          name:
            type: string
            description: >
              Name of application
          path:
            type: string
            description: >
              Paths to kubernetes yaml file
      

For VNFs that are packages as Helm package there would be only one TOSCA node in the TOSCA template which would have reference to the Helm package.

  • onap.multicloud.nodes.kubernetes.helm

    • node definitions

      data_types:
        onap.multicloud.container.kubernetes.helm.nodes.helm_package:
        properties:
          name:
            type: string
            description: >
              Name of application
          path:
            type: string
            description: >
              Paths to Helm package file
      

This TOSCA node definitions wrap kubernetes yaml file or helm chart. cloudify.nodes.Kubernetes isn’t reused in order to avoid definition conflict.

Instantiation

SO ARIA adaptor can be used. (with twist to have SO to talk to multicloud k8s plugin instead of ARIA) Instantiation so that SO can talk to multicloud k8s plugin. NOTE: This is temporally work around for Beijing release. Post Beijing, this needs to be revised.

work flow

With Amsteldam Release, SO has ARIA adaptor which talks to ARIA orchestrator. https://wiki.onap.org/download/attachments/16002054/Model%20Driven%20Service%20Orchestration%20-%20SO%20State%20of%20the%20Union.pptx

The work flow looks like follows:

 user request to instantiate VNF
               |
+--------------|-------+
| SO           |       |
|              V       |
| +------------------+ |
| | SO: ARIA adaptor | |
| +------------+-----+ |
+--------------|-------+
               | CASR is sent
               |
+--------------|---------+
| ARIA         |         |
|              V         |
| +--------------------+ |
| | multicloud  plugin | |   template as TOSCA artifact is
| +------------+-------+ |   extracted and build requests to
+--------------|---------+   multicloud
               |
               |
+--------------|-------+
| multicloud   |       |
|              V       |
| +------------------+ |
| | openstack plugin | |
| +------------+-----+ |
+--------------|-------+
               | openstack request
               |
               V
+----------------------+
| openstack            |
+----------------------+

This will be twisted by configuration so that SO can talks to multicloud k8s plugin:

 user request to instantiate VNF
               |
+--------------|-------+
| SO           |       |
|              V       |
| +------------------+ |
| | SO: ARIA adaptor | |  configuration is twisted to call
| +------------+-----+ |  multicloud k8s API
+--------------|-------+
               | CSAR or TGZ
               |
+--------------|-------+
| multicloud   |       |
|              V       |
| +------------------+ |  handle CSAR or TGZ (Helm Charts) file
| | k8s plugin       | |  e.g. extract k8s yaml from CSAR, and
| +------------+-----+ |  pass through requests to k8s/Helm API
+--------------|-------+
               | k8s/Helm request
               |
               V
+----------------------+
| k8s/Helm API server  |
+----------------------+

NOTE: In this work flow. only the northbound deployment API endpoint is needed for VNF deployment. LCM APIs are only needed for lifecycle management. Other internal APIs, e.g. k8s YAML API may be needed only for internal implementation.

SO ARIA multicloud plugin needs to be twisted to call k8s plugin.

The strategy is to keep the existing design of ONAP or to follow agreed design. The key point of The interaction between SO and multicloud is

  • SO decomposes VNFD/NSD into single atomic resource (e.g. VNF-C corresponding to single VM or single container/pod) and send requests to create each resources via deployment API.

  • multicloud accepts each request for single atomic resource and create single resource(e.g. VM or container/pod)

  • multicloud doesn’t do resource decomposition. The decomposition is task of SO.

API work flow example and k8s API

  • register k8s cluster to A&AI ESR <cloud-id> is obtained

  • ONAP north bound components generates a TOSCA template targeted for k8s.

  • SO calls Multicloud deployment API and passes the entire BluePrint(as CSAR or TGZ) to k8s plugin, e.g.: POST https://msb.onap.org:80/api/multicloud/v0/<cloud-id>/package

  • k8s plugin handles the CSAR or TGZ accordingly and talks to k8s API Server or Helm Tiller Server to deploy containerized VNF POST <k8s api server>://api/v1/namespaces/{namespace}/pods to create pods. then <pod id> is obtained

  • DELETE https://msb.onap.org:80/api/multicloud/v0/<cloud-id>/proxy/api/v1/namespaces/{namespace}/pods/<pod id> to destroy pod

  • to execute script inside pod, the following URL can be used. POST /api/v1/namespaces/{namespace}/pods/{name}/exec

Affected Projects and impact

A&AI and ESR

new type to represent k8s/container for cloud infrastructure will be introduced as work around. Post Beijing official value will be discussed for inclusion.

OOF

Policy matching is done by OOF. For Beijing. Enhancement to policy is stretched goal. Decomposing service design(NSD, VNFD) from VNF package is done by SO with OOF(homing)

SO

ARIA adaptor is re-used with config tweak to avoid modification

multicloud

new k8s plugin will be introduced. The details are discussed in this documentation you’re reading right now.

Kubernetes cluster authentication

For details of k8s authentication, please refer to https://kubernetes.io/docs/admin/authentication

Because Kubernetes cluster installation is not mentioned, we should treat all users as normal users when authenticate to Kubernetes VIM. There are several ways to authenticate Kubernetes cluster. For Beijing release, basic authentication will be supported. username and password are stored in ESR.

References

Past presentations/proposals

ONAP components

kubernetes

misc

Contributors

APPENDIX

This section is informative. This is out of Beijing scope and will be revised after Beijing. The purpose of this appendix is to help readers to understand this proposal by giving future direction and considerations. At some point, this appendix will be separated out into its own document for long-term right design.

Model driven API and kubernetes model

Currently the discussion on model driver API is on going. Once it’s usable, it will be followed and the above experimental API/code will be revised.

The eventual work flow looks like as follows:

 user request to instantiate VNF/NS
               |
               V
+----------------------+         +-----+
| SO                   |-------->| OOF | <--- policy to use
|                      |<--------|     |      CoE instead of VM
|                      |         +-----+      from A&AI
| +------------------+ |
| | SO: adaptor for  | | SO decomposes VNFD/NSD into atomic
| | multicloud model | | resources(VDUs for VNF-C) with asking OOF
| | driven API       | | for placement. then SO builds up
| +------------+-----+ | requests to multicoud for instantiation.
+--------------|-------+
               |
               |
+--------------|-------+
| multicloud   |       | So multicloud accepts request for single
|              V       | resource of VDU which corresponds to
| +------------------+ | VNF-C. which is mapped to single
| | model driven API | | container/pod. multicloud doesn't
| +------------+-----+ | decompose VDU into multiple containers.
|              |       | CoE doesn't change such work flow.
|              V       |
| +------------------+ |
| | k8s plugin       | | convert request(VDU of VNF-C) into
| +------------+-----+ | kubernetes
+--------------|-------+
               | k8s request
               |
               V
+----------------------+
| kubernetes           |
+----------------------+

Modeling/TOSCA to kubernetes conversion

In this section, conversion from TOSCA to kubernetes is discussed so that reader can get idea for future direction.

Once ONAP information/data model is usable, similar conversion is possible. The followings are only examples. More node definitions would be considered as necessary:

TOSCA node definition        k8s resource
============================ ================================
tosca.nodes.Compute          (bare)single pod
                             vcpu, memory -> k8s resource
---------------------------- --------------------------------
tosca.nodes.nfv.VDU.Compute  (bare)single pod

Hello world example

This is just to show idea. This example is very early phase and there are hard-coded values.

  • TOSCA hello world

    topology_template:
      node_templates:
        my_server:
          type: tosca.nodes.Compute
          capabilities:
            # Host container properties
            host:
             properties:
               num_cpus: 2
               disk_size: 10 GB
               mem_size: 512 MB
            # Guest Operating System properties
            os:
              properties:
                # host Operating System image properties
                architecture: x86_64
                type: Linux
                distribution: RHEL
                version: 6.5
    
  • converted k8s yaml

    $ PYTHONPATH=. python -m tosca_translator.shell -d --debug --template-file tosca_translator/tests/data/tosca_helloworld.yaml
    api_version: apps/v1beta1
    kind: Deployment
    metadata:
      labels: {name: my_server}
    spec:
      replicas: 1
      template:
        metadata:
          labels: {name: my_server}
        spec:
          containers:
          - image: ubuntu
            name: my_server
            resources:
              limits: {cpu: 2, ephemeral-storage: 10 GB, memory: 512 MB}
            requests: {cpu: 2, ephemeral-storage: 10 GB, memory: 512 MB}
    

MultiCloud HPA information discovery and registration

To support Beijing Release Use Case: “Hardware Platform Enablement In ONAP” (https://wiki.onap.org/display/DW/Hardware+Platform+Enablement+In+ONAP), MultiCloud services play a very key role to discover all available Hardware Platform capabilities and capacities (referred as HPA: Hardware Platform Awareness) from underylying VIMs/Clouds and represent them into AAI, so that ONAP OOF service could match the requirement of HPA from VNF vendors as well as ONAP policy to the HPA information of underylying VIMs/Clouds to decide which VIM/Cloud is the best candidate to place VNFs.

Overall process

The trigger to invoke such discovery and representation process will usually be ESR (External System Registration service). Whenever the ONAP user is onboarding a VIM instance or a cloud, he/she will fill in VIM/Cloud access information including but not limited to : authentication url, user/password, tenant name, cloud owner and region id, and cloud extra information pertaining to this VIM/Cloud.

Given these access information for a VIM instance, ESR will request MultiCloud to perform VIM/Cloud registration process.

The VIM/Cloud registration process during which MultiCloud discovers and represents HPA information will be implemented in each MultiCloud Plugin service respectively which knows best of the corresponding underylying VIM/Cloud.

Proposed alternative solutions to discover HPA information

While it is up to each MultiCloud Plugin service to determine how to discover HPA information, there are several alternative solutions to accomplish such discovery process.

Solution 1: Hard-coded discovery

The MultiCloud services are designed in the way that there will be specific plugin service to adapting ONAP into specific type or flavor of VIM/Cloud, so the specific MultiCloud plugin service is tightly coupled with the corresponding VIM/Cloud type or flavor. If some kinds of HPA information are statically pertaining to a VIM/Cloud type or flavor and invariant between different instance, it will be possible to hard coding this HPA information into the corresponding MultiCloud Plugin Service. One example is that Titanium Cloud comes along with builtin HPA feature of vswitch with DPDK support, so this HPA information will be hard-coded into MultiCloud plugin service for Wind River Titanium Cloud.

Solution 2: Manually discovery

There are some kinds of HPA information which vary between instances of the same VIM/Cloud type, but will be invariant during the whole life-cycle of that instance. These information can be manually injected into ONAP during the VIM/Cloud instance onboarding process. There is a field named “cloud extra info” from the ESR VIM registration portal, ONAP users could input the extra information into ONAP which will be stored into AAI (refer to property of “cloud-extra-info” of /cloud-infrastructure/cloud-regions /cloud-region/{cloud-owner}/{cloud-region-id}). So when MultiCloud Plugin Service are invoked to discover HPA information, the cloud extra information will be decoded to check if there are HPA information can be extracted and represented into AAI.

Solution 3: Automatically discovery

There are some other kinds of HPA information which changes dynamically during the life-cycle of a VIM/Cloud instance, so we have to discover them leveraging some automation approach. While different VIM/Cloud type of flavor exposes different approach to support the automatical discovery with respect to HPA resources, the approach is quite straight-forward for OpenStack. For those HPA information will be consumed by specifying the extra specs of a flavor, VIM/Cloud administrators could provision these flavor’s extra specs with HPA information before onboarding the VIM/Cloud instance into ONAP. After VIM/Cloud onboarding to ONAP, MultiCloud Plugin Service for OpenStack will extract these HPA information from the extra specs of the flavors and represent them into AAI.

Representation of HPA information

With regarding to how to represent HPA information into AAI, it is up to how AAI schema are defined and we willcontribute and feedback.

Stectch goal

There is another consideration to discover new HPA information periodically, this can be a stretch goal for Beijng Release.

Parallelism improvement of Multi Cloud Services

Problem Description

Multi-Cloud runs Django by using Django’s built-in webserver currently. According to Django Document[Django_Document]_, this mode should not be used in production. This mode has not gone through security audits or performance tests, and should only be used in development. From test on local computer, this mode can only handle ONE API request at one time. This can not meet the performance requirement.

Although security and scalability might be improved as the side effect of resolving the performance issue, this spec will only focus on how to improve the parallelism(performance) of current MultiCloud API framework.

Possible Solutions

Solution 1

Django is a mature framework. And it has its own way to improve parallelism. Instead of running Django’s build-in webserver, Django APP can be deployed in some dedicated web server. Django’s primary deployment platform is WSGI[django_deploy]_, the Python standard for web servers and applications.

But on the other side, Danjgo is very huge. And Django is a black box if one doesn’t have good knowledge of it. Adding feature based on Django may be time-consuming. For example, the unit test[unit_test]_ of Multi-Cloud can’t use regular python test library because of Django. The unit test has to base on Django’s test framework. When we want to improve the parallelism of Multi-Cloud services, we need to find out how Django can implement it, instead of using some common method.

Besides, Django’s code pattern is too much like web code. And, most famous use cases of Django are web UI. Current code of Multi-Cloud puts many logic in files named views.py, but actually there is no view to expose. It is confusing.

The benefit of this solution is that most current code needs no change.

Solution 2

Given the fact that Django has shortcomings to move on, this solution propose to use a alternative framework. Eventlet[Eventlet]_ with Pecan[Pecan]_ will be the idea web framework in this case, because it is lightweight, lean and widely used.

For example, most OpenStack projects use such framework. This framework is so thin that it can provide flexibility for future architecture design.

However, it needs to change existing code of API exposing.

Performance Test Comparison

Test Environment

Apache Benchmark is used as test tool. It is shipped with Ubuntu, if you don’t find it, just run “sudo apt install -y apache2-utils”

2 Virtual Machine with Ubuntu1604. Virtual Machines are hosted in a multi-core hardware server. One VM is for Apache Benchmark. This VM is 1 CPU core, 8G mem. The other VM is for Multicloud. The VM is 4 CPU core, 6G mem.

Test Command

ab -n <num of total requests> -c <concurrency level> http://<IP:port>/api/multicloud/v0/vim_types

Test result

It should be noted that data may vary in different test run, but overall result is similar as below.

100 requests, concurrency level 1

Command: ab -n 100 -c 1 http://<IP:port>/api/multicloud/v0/vim_types Result:

Django runserver: total takes 0.512 seconds, all requests success
Django+uwsgi: totally takes 0.671 seconds, all requests success.
Pecan+eventlet:  totally takes 0.149 seconds, all requests success.
10000 requests, concurrency level 100

Command: ab -n 10000 -c 100 http://<IP:port>/api/multicloud/v0/vim_types Result:

Django runserver: total takes 85.326 seconds, all requests success
Django+uwsgi: totally takes 3.808 seconds, all requests success.
Pecan+eventlet:  totally takes 3.181 seconds, all requests success.
100000 requests, concurrency level 1000

Command: ab -n 100000 -c 1000 http://<IP:port>/api/multicloud/v0/vim_types Result:

Django runserver: Apache Benchmark quit because it reports timeout after
running a random portion of all requests.
Django+uwsgi: totally takes 37.316 seconds, about 32% requests fail. I see
some error says that tcp socket open too many.
Pecan+eventlet:  totally takes 35.315 seconds, all requests success.

Proposed Change

Given the test result above, this spec proposes to use solution 2. Based on the consideration of Elastic API exposure[jira_workitem]_, Multi-Cloud will provide a new way to expose its API. That is to say, existing code of API exposing needs rewrite in [jira_workitem]. So the disadvantage of solution 2 doesn’t exist.

To define a clear scope of this spec, VoLTE is the use case that will be used to perform test to this spec. All functionality that VoLTE needed should be implemented in this spec and [jira_workitem].

Backward compatibility

This spec will NOT change current API. This spec will NOT replace the current API framework in R2, nor will switch to new API framework in R2. Instead, this spec will provide a configuration option, named web_framework, to make sure use case and functionalities not be broken. Default value of the configuration will BE django, which will still run current Django API framework. An alternative value is pecan, which will run the API framework proposed in this spec. So users don’t care about the change won’t be affected.

WSGI Server

No matter what API framework will be used, a WSGI Server needs to be provided. This spec will use Eventlet WSGI server. API framework will be run as an application in WSGI server.

Multi processes framework

This spec proposes to run Multi-Cloud API server in multiple processes mode. Multi-process can provide parallel API handlers. So, when multiple API requests come to Multi-Cloud, they can be handled simultaneously. On the other hand, different processes can effectively isolate different API request. So that, one API request will not affect another.

Managing multiple processes could be overwhelming difficult and sometimes dangerous. Some mature library could be used to reduce related work here, for example oslo.service[oslo_service]_. Since oslo is used by all OpenStack projects for many releases, and oslo project is actively updated, it can be seen as a stable library.

Number of processes

To best utilize multi-core CPU, the number of processes will be set to the number of CPU cores by default.

Shared socket file

To make multiple processes work together and provide a unified port number, multiple processes need to share a socket file. To achieve this, a bootstrap process will be started and will initialize the socket file. Other processes can be forked from this bootstrap process.

Work Items

  1. Add WSGI server.

  2. Run Pecan application in WSGI server.

  3. Add multiple processes support.

  4. Update deploy script to support new API framework.

MultiCloud infra_workload API

We have two purposes for this API:

  1. Integrate SO and Multicloud.

  2. Generic API for SO to talk to different Multicloud plugins.

Problem Description

Currently HPA flavors are returned by OOF to SO and SO copies these flavors in the Heat template before sending the Heat template to Multicloud. In Casablanca instead of SO making changes in the Heat template the flavor information will be provided to Multicloud and Multicloud will pass this as parameters to HEAT command line. In Dublin, instead of SO transferring the content of HEAT and HEAT_ENV to Multicloud, Mutlicloud will download these information/artifacts. For further detailed design, please refer to https://wiki.onap.org/display/DW/SO+Casablanca+HPA+Design

Propose Change

Multi-Tenant Support

Request Headers:

To support multi-tenants over the same cloud region, all APIs defined below should support to accept the following optional headers which are used to specify a tenant other than the default one associated with the cloud region.

"Project"   : Tenant/Project ID or Name specified by API consumer, Optional

Example 1:

"Project: tenant1"

Example 2:

"Project: fcca3cc49d5e42caae15459e27103efc"

Add infrastructure workload

API URL: POST http://{msb IP}:{msb port}/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload

Request Body:
 {
    "generic-vnf-id":"<generic-vnf-id>",
    "vf-module-id":"<vf-module-id>",
    "vf-module-model-invariant-id":"<uuid>",
    "vf-module-model-version-id":"<uuid>",
    "vf-module-model-customization-id":"<uuid>",
    "oof_directives":{},
    "sdnc_directives":{},
    "user_directives":{},
    "template_type":"<heat/tosca/etc.>",
    "template_data":{}
 }

The 'vf-module-model-"*"-id’s will be used by the Multicloud plugin to retrieve the associated cloud artifacts.
The 'oof_directives' is to convey oof’s input to multicloud.
The 'sdnc_directives' for SDNC input to MultiCloud.
The 'user_directives' is the parameter to convey input from VID portal to mutlicloud.
They are all about how to populate data to template parameters.
The precedence of the three directives are user_directives and oof_directives the sdnc_directives.
oof_directives:
"directives":[
   {
     "id":"<ID of VNFC>",
     "type": "vnfc",
     "directives":[
       {
         "type":"<flavor_directive>",
         "attributes":[
           {
             "attribute_name":"<name of attribute, such as flavor label>",
             "attribute_value":"<value such as cloud specific flavor>"
           }
         ]
       }
     ]
   },
   {
     "id":"<ID of VNF>",
     "type": "vnf",
     "directives":[
       {
         "type":"<Name of directive>",
         "attributes":[
           {
             "attribute_name":"<name of attribute>",
             "attribute_value":"<value>"
           }
         ]
       }
     ]
   }
]
Heat examples
"template_type":"heat",
"template_data":{
   "files":{  },
   "disable_rollback":true,
   "parameters":{
      "flavor":"m1.heat"
   },
   "stack_name":"teststack",
   "template": "\nheat_template_version: 2013-05-23\ndescription: Simple template to test heat commands\nparameters:\n  flavor: {default: m1.tiny, type: string}\nresources:\n  hello_world:\n    type: OS::Nova::Server\n    properties:\n      key_name: heat_key\n      flavor: {get_param: flavor}\n      image: 40be8d1a-3eb9-40de-8abd-43237517384f\n      user_data: |\n        #!/bin/bash -xv\n        echo \"hello world\" &gt; /root/hello-world.txt",
   "timeout_mins":60
}
Response:
Response Codes
Success

Code

Reason

201 - Created

Resource was created and is ready to use.

Error

Code

Reason

400 - Bad Request

Some content in the request was invalid.

401 - Unauthorized

User must authenticate before making a request.

409 - Conflict

This operation conflicted with another operation on this resource.

Response Body
{
    "template_type":"heat",
    "workload_id": "<The ID of infrastructure workload resource>"
    "template_response":
    {
        "stack": {
        "id": "<The UUID of stack>",
        "links": [
            {
                 "href": "<A list of URLs for the stack>",
                 "rel": "self"
            }
        ]
    }
}

Update infrastructure workload information in AAI (i.e. Heatbridge)

API URL: POST http://{msb IP}:{msb port}/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload/{workload-id}

Request Body:
{
   "generic-vnf-id":"<generic-vnf-id>",
   "vf-module-id":"<vf-module-id>"
}
Response:
Response Codes
Success

Code

Reason

202 - Accepted

The request was accepted.

Error

Code

Reason

400 - Bad Request

Some content in the request was invalid.

401 - Unauthorized

User must authenticate before making a request.

409 - Conflict

This operation conflicted with another operation on this resource.

Response Body

Delete infrastructure workload

API DELETE URL: http://{msb IP}:{msb port}/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload/{workload-id}

Response:
Response Codes
Success

Code

Reason

204 - No Content

The server has fulfilled the request by deleting the resource.

Error

Code

Reason

400 - Bad Request

Some content in the request was invalid.

401 - Unauthorized

User must authenticate before making a request.

404 - Not Found

The requested resource could not be found.

500 - Internal

Server Error

Something went wrong inside the service. This should not happen usually. If it does happen, it means the server has experienced some serious problems.

Response Body

This request does not return anything in the response body.

Get infrastructure workload

API GET URL: http://{msb IP}:{msb port}/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload/{workload-id}

Response:
Response Codes
Success

Code

Reason

200 - OK

Request was successful.

Error

Code

Reason

400 - Bad Request

Some content in the request was invalid.

401 - Unauthorized

User must authenticate before making a request.

404 - Not Found

The requested resource could not be found.

500 - Internal

Server Error

Something went wrong inside the service. This should not happen usually. If it does happen, it means the server has experienced some serious problems.

Response Body
{
    "template_type":"<heat/tosca/etc.>",
    "workload_id": "<The ID of infrastructure workload resource>",
    "workload_status":"CREATE_IN_PROCESS/CREATE_COMPLETE/DELETE_IN_PROCESS/AAI_IN_PROGRESS/AAI_COMPLETE/etc"
}

Work Items

  1. Work with SO.

  2. Work with OOF team for oof_directive form.

  3. Work with SDNC team for sdc_directive form.

  4. Expose API by broker and each plugin.

Tests

  1. Unit Tests with tox.

  2. Pairwise test with SO project.

  3. Integration test with vCPE HPA test.

  4. CSIT Tests, the input/ouput of broker and each plugin see API design above.

MultiCloud alignment to Consistent ID of Cloud Region

To support ONAP Functional Requirement: “Centralized Representation and Consistent Identification of Cloud Regions In ONAP”, MultiCloud services have to upgrade their APIs to align to the consistent ID of a cloud region. .. https://wiki.onap.org/display/DW/Centralized+Representation+and+Consistent+Identification+of+Cloud+Regions+In+ONAP

Problems Statement

With ONAP Amsterdam and Beijing Releases, there are 2 problems with respect to the ID of a cloud region.

Problem 1: {vim_id}={cloud-owner}_{cloud-region-id} imposed unnecessary constraint on how {cloud-owner} can be populated: character underscore ‘_’ cannot be used to populate {cloud-owner}

Problem 2: multicloud plugins for OpenStack leverages {cloud-region-id} as the OpenStack Region ID to interact with represented OpenStack Instance. This implies that {cloud-region-id} can only be populated by the represented OpenStack Region ID. This constraint implies that two OpenStack instances with the same Region ID can only be represented with different {cloud-owner}, even though they belong to the same owner. This is a violation to the sematics of {cloud-owner} . on the other hand, the sematics of {cloud-region-id} refers to the geographic region, which is not necessarily the same as OpenStack Region ID. What’s more, the fact that VID and SDNC have been using the {cloud-region-id} alone to identify a cloud region makes the problem being unacceptable.

Proposed Solutions

I would like to present 2 proposals to workaround each of problems above respectively:

Proposal 1: depreciate the {vim_id} for all multicloud services, use composed keys {cloud-owner}, {cloud-region-id}

This will result in upgrading the multicloud APIs and code refactoring.

We’d better to have common terminologies to facilitate the description below. Take the identity token API as example:

http(s)://{service IP}:{service port}/api/multicloud/v0/{cloud-owner}_{cloud-region-id}/identity/v3/auth/tokens
e.g. http://1.2.3.4:9001/api/multicloud/v0/OnaplabOwner_RegionOne/identity/v3/auth/tokens

This API consists of several parts referred as below terminologies:

  • Terminology | Description | Example

  • service endpoint | http(s)://{service IP}:{service port} | http://1.2.3.4:9001

  • service namespace | api/{service-name} | api/multicloud

  • service API version | v0, v1, etc. | v0

  • ID of a cloud region | the ID to specify a cloud region | OnaplabOwner_RegionOne

  • proxied API catalog | identity,compute, network, image,volume,etc. | identity

  • proxied API endpoint | consists of all above | http://1.2.3.4:9001/api/multicloud/v0/OnaplabOwner_RegionOne/identity

  • proxied API resource | URI for an OpenStack resource | v3/auth/tokens

Given the terminology above, the general rules to upgrade MultiCloud North Bound API are:
  • Upgrade “service API version” from “v0” to “v1”

  • Change “ID of cloud region” from “{cloud-owner}_{cloud-region-id}” to “{cloud-owner}/{cloud-region-id}”

The upgraded API for identity token API looks like:

http(s)://{service IP}:{service port}/api/multicloud/v1/{cloud-owner}/{cloud-region-id}/identity/v3/auth/tokens
e.g. http(s)://1.2.3.4:9001/api/multicloud/v1/OnaplabOwner/RegionOne/identity/v3/auth/tokens

Proposal 2: decouple the cloud region's {cloud-region-id} from OpenStack's Region ID

Instead of populating the AAI’s cloud-region-id with OpenStack Region ID, decoupling of them by put OpenStack Region ID into other property of a cloud region object would enable the flexibility of populating arbitrary string to AAI’s cloud-region-id. There are several options to implement that, with the intention of maintaining backward compatibility and minimized impact on AAI’s schema, the proposed design options are described as below.

Option 1: ONAP User inputs the OpenStack Region ID with ESR Portal

There is a property of cloud region object named “cloud-extra-info” .. https://wiki.onap.org/display/DW/AAI+REST+API+Documentation+-+Beijing

cloud-extra-info: string
  ESR inputs extra information about the VIM or Cloud which will be decoded by MultiVIM.

the intention of this property is to enable the extending of cloud region object without impact AAI’s schema. How and when to use this property is up to each multicloud plugin respectively. This property can be populated by ONAP users through ESR VIM registration GUI Portal (the input field label: “Cloud Extra Info”). The best practice to utilize this “cloud-extra-info” property is that ONAP users to input format json string, with which extra configuration data can be serialized as {“key”:”value”} into this json string. And the corresponding MultiCloud plugin decode and utilize the input key-value pairs. .. https://wiki.onap.org/pages/viewpage.action?pageId=25431491

This proposal changes and workflow With Option 1:

  1. Define a key “openstack-region-id” with value populated by OpenStack Region ID,

    e.g. “RegionOne”, “RegionTwo”, etc. which must align to the represented OpenStack instance.

  2. ONAP user should put this key-value pair into “cloud-extra-info” property via ESR GUI Portal, the input string

    looks like: “{"openstack-region-id":"RegionOne"}”

  3. the corresponding MultiCloud plugin should decode this string to extract this key-value pair “openstack-region-id” during cloud region on-boarding phase.

  4. Update AAI schema to add one more property “openstack-region-id” to AAI “esr-system-info” object which is the child of AAI “cloud-region” object.

  5. MultiCloud plugin for OpenStack should populate this property with the information acquired in step 3.

  6. MultiCloud should use this property to determine what OpenStack Region ID is when interacting with represented OpenStack Instance

  7. Given the workflow above, the AAI’s “cloud-region-id” can be populated by arbitrary string.

  8. In cases that either ONAP user doesn’t input the key-value pair of “openstack-region-id” into “cloud-extra-info” or MultiCloud Plugin does not support the decoding/using key-value pair “openstack-region-id”, the legacy constraint should be applied, that is: ONAP user should make sure AAI’s “cloud-region-id” is populated by OpenStack Region ID.

Option 2: MultiCloud plugin discover the OpenStack Region ID with Rest API

The Identity API: “/v3/regions” can be used to list all regions. In case of no multi-region configuration for underlying OpenStack instance, this API should return the only one OpenStack Region information. In case of multi-region configuration for underlying OpenStack instances, The list of OpenStack Regions will be returned. In this case, I assume you either go with Option 1, or go with another proposal “MultiCloud Multi-Region support” to on-board all cloud regions at one time. .. https://developer.openstack.org/api-ref/identity/v3/index.html#regions

This proposal changes and workflow With Option 2:

1, MultiCloud plugin for OpenStack discover the OpenStack region ID with Rest API during cloud region on-boarding phase. 2, Update AAI schema to add one more property “openstack-region-id” to AAI “esr-system-info” object which is the child of AAI “cloud-region” object. 3, MultiCloud plugin for OpenStack should populate this property with informatin acquired during step 1. 4, MultiCloud should use this property to determine what OpenStack Region ID is when interacting with represented OpenStack Instance 5. Given the workflow above, the AAI’s “cloud-region-id” can be populated by arbitrary string.

MultiCloud HEAT and AAI Bridge

This proposal describes how MultiCloud plugin automates the updating of HEAT stack resources into AAI after HEAT based VNF instantiation

Problems Statement

With heat template based VNF instantiation, SO interacts with target OpenStack instance directly (or indirectly via MultiCloud) to launch HEAT stacks. Once these HEAT stacks are created successfully, the ONAP users have to update the AAI with this HEAT stack resources manually by executing the ROBOT heatbridge script which not only imposes extra burden on ONAP users but also breaks the automating process of VNF orchestration.

Considering that SO will integrate with MultiCloud in Casablanca Release, and the updating of AAI with HEAT stack resources demands no further interaction between SO and MultiCloud, neither any changes introduced to existing AAI schema. It is nature and elegant to automate this AAI updating process by MultiCloud plugin.

https://wiki.onap.org/display/DW/Vetted+vFirewall+Demo+-+Full+draft+how-to+for+F2F+and+ReadTheDocs?src=contextnavpagetreemode

Proposed Design and Workflow

This automation assumes:
  • SO integrates with multicloud so that the heat based VNF will be instantiated to an OpenStack Instance indirectly via MultiCloud.

  • SO will pass on the generic VNF ID and/or VF Module ID to MultiCloud.

  • ONAP user will not execute the ROBOT heatbridge script any more.

The proposed changes to MultiCloud Broker and Plugins
  • Add a new northbound API, e.g. POST /api/multicloud/v1/{cloud-owner}/{cloud-region-id}/infra_workload , the request body is a json object consists of generic vnf id, vf module id, heat template, heat env file, and other parameters, e.g. oof selected flavors

  • MultiCloud Broker distribute this API request to corresponding MultiCloud Plugin

  • MultiCloud Plugin will validate the request with input data, call OpenStack HEAT API to launch HEAT stacks, and updating AAI with the launched HEAT stack resource, and associate these resource to generic VNF/VF-Module Objects.

Updated AAI objects
  • /cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/tenants/tenant/{tenant-id}/vservers/vserver/{vserver-id}

  • /network/generic-vnfs/generic-vnf/{vnf-id}/vf-modules/vf-module/{vf-module-id}

Appendix:

https://wiki.onap.org/display/DW/AAI+REST+API+Documentation+-+Beijing

MultiCloud Multi-Region support

This proposal describes how MultiCloud plugin automates the on-boarding of tens or hundreds of cloud regions by leveraging multi-region feature

Problems Statement

The ONAP functional requirement for Edge Automation aims to automate the VNF orchestration across edge stacks. .. https://wiki.onap.org/display/DW/Edge+Automation+through+ONAP

Before VNF can be orchestrated over these edge stacks, these edge stacks must be on-boarded into ONAP. This can be a very big challenge in case of tens of or hundred of edge stacks. Fortunately, With OpenStack multi-region feature, the OpenStack primary region will expose all secondary regions’ endpoints. Hence MultiCloud plugins could automate the discovery and registry of all OpenStack secondary regions.

Proposed Design and Workflow

This automation assumes:
  • ONAP could use the same set of credentials (project, user/password) to access all OpenStack regions for orchestration.

  • ONAP user will explicitly enable the automation of discovery OpenStack secondary regions during manually on-boarding the OpenStack primary region.

  • ONAP users could manually manage the cloud regions representing those secondary regions just like a normal cloud region

With OpenStack primary region, the ONAP user will: .. https://wiki.onap.org/pages/viewpage.action?pageId=25431491

  • Manually on-board this primary region with ESR VIM registration portal.

  • Input the {cloud-owner} and {cloud-region-id} as the ID of cloud region which is unique.

  • Specify the location id

  • Specify the intention of automation of OpenStack secondary regions managed by this primary region. This intention is specified with key-value pair {“multi-region-discovery”:”true”} populated to cloud region’s property “cloud-extra-info”

With OpenStack primary region, the corresponding MultiCloud plugin will:
  • Discover all OpenStack secondary regions in case being explicitly indicated with key-value pair {“multi-region-discovery”:”true”}

  • Register each of discovered OpenStack regions as a new cloud region into AAI.

  • Duplicate the credentials and location relationship from primary region.

  • Duplicate all or part of the cloud region’s property “cloud-extra-info”,

  • Add one more key-value pair to cloud region’s property “cloud-extra-info”: {“primary-region”:[“{cloud-owner}”,”{cloud-region-id}”]}

  • Add relationship to the cloud region of primary region: to be checked.

  • Generate the ID of cloud region representing the OpenStack secondary region with following rules: - {cloud-owner} should be {cloud-owner of primary region}. - {cloud-region-id} will be the concatenated string with format: {cloud-region-id of primary region}.{OpenStack Region ID}.

  • The composite keys {cloud-owner},{cloud-region-id of primary region}.{OpenStack Region ID} will be unique since the composite key of primary region: {cloud-owner},{cloud-region-id} is unique.

With generated cloud region representing the OpenStack secondary region, the ONAP user could:
  • update the credentials so that the ONAP could use updated credentials to orchestrate VNF to this cloud region

  • update the location of the cloud region by associating it to different complex object other than the one same to primary region.

  • Update cloud region’s property “cloud-extra-info”.

  • Decommission or delete the cloud region

Appendix:

There is a property of cloud region object named “cloud-extra-info” .. https://wiki.onap.org/display/DW/AAI+REST+API+Documentation+-+Beijing

cloud-extra-info: string
  ESR inputs extra information about the VIM or Cloud which will be decoded by MultiVIM.

the intention of this property is to enable the extending of cloud region object without impact AAI’s schema. How and when to use this property is up to each multicloud plugin respectively. This property can be populated by ONAP users through ESR VIM registration GUI Portal (the input field label: “Cloud Extra Info”). The best practice to utilize this “cloud-extra-info” property is that ONAP users to input format json string, with which extra configuration data can be serialized as {“key”:”value”} into this json string. And the corresponding MultiCloud plugin decode and utilize the input key-value pairs.

MultiCloud SDC Client Design for k8s and windRiver/Openstack

To support multicloud plugin access the concerned artifacts, do prepration if necessnary, need registering the artifact management as a sdc client and use shared folder method so that enable user to freely access the artifacts. by configuring such client, user could decide what artifact needs download, what’s the actions to do for the downloaded artifact etc.

after OOM deploy such artifact management, the plugins could access all the downloaded artifacts by shared folder method if necessary.

Problems Statement

the SDC artifacts is part of CSAR, which is downloaded by SDC client. Currently in Casablanca release, some components: SO, Policy, AAI register as a SDC client, could download the concerned artifacts based on the Notification from SDC

There are two things need support in Dublin release in MultiCloud side: 1. support k8s. download k8s related artifacts from SDC, and do specified postprocessing during design-time, artifacts could be used/got during instantiation time

2. support WindRiver/OpenStack plugin to download HEAT/HEAT_ENV related artifacts from SDC and change the currently API interface between SO and MutliCloud to transfer the indication of these artifacts instead of the whole content of HEAT/HEAT_ENV. then MutliCloud use the indications from SO, to find the downloaded artifacts during instantiation time

Proposed framework

SDC Reception Handler<—-> Reception Handler<–>Artifact Management<—->Plugin Handler<—->multicloudPost refer to SDC Service Architecture

Proposed alternative Solutions

There would be a artifact management comopnent, which will do below steps once get the notification from SDC during design time.

1.mandatory step to download concerned artifacts from SDC directly store it locally by specified rule of layout as under “vf-module-model-customization-id” directory the related heat and heat_env file will be put with the name of own uuid, an addtional metadata.json file will be there which includes details description about vf module.

2.check if subplugin is configurated in the configuration file

a. configurated: it will invoke the pre-configurated Post API once the concerned artifact has been downloaded. current k8s plugin need leverage such function

b. not configurated: then its plugin’s duty to access the artifacts by shared folder method and parse the metadata information.

leverage the Policy distribution framework by doing below change:

1.modify the SDC Reception Handler to add its support to download resource level artifacts like HEAT/HEAT_ENV and K8S_CLOUD.

2.change the SDC client configuration interface by storing the artifact into Database

3.add a k8s into plugin Handler of the framework which will do the post API on the downloaded artifact which will be put into the locally

With respect to k8s artifact:

the required input data format for k8s API, suppose resource level too, like VnfId, UUID

With respect to openStack/windRiver artifact:

the requried input data format for openStack/windRiver API for resource level, it will use “vf-module-model-customization-id” as the key to directive plugins

Layout example

vfmodule-meta.json content

[
 {
   "vfModuleModelName": "VcpevsVgw0116a..base_vcpe_vgw..module-0",
   "vfModuleModelInvariantUUID": "718c9883-8fd6-463a-b00d-0c696e0ab475",
   "vfModuleModelVersion": "1",
   "vfModuleModelUUID": "585fce63-101f-49f2-95d6-c53423baa48a",
   "vfModuleModelCustomizationUUID": "4668b783-2dba-444f-b3d8-a508f0d0c0f2",
   "isBase": true,
   "artifacts": [
     "0a38b7ef-93b9-4d48-856d-efb56d53aab8",
     "4d4a37ef-6a1f-4cb2-b3c9-b380a5940431"
   ],
   "properties": {
     "min_vf_module_instances": "1",
     "vf_module_label": "base_vcpe_vgw",
     "max_vf_module_instances": "1",
     "vfc_list": "",
     "vf_module_description": "",
     "vf_module_type": "Base",
     "availability_zone_count": "",
     "volume_group": "false",
     "initial_count": "1"
   }
 }
]

service-meta.json content

{
 "artifacts":
  [
   {
    "artifactName": "base_template.env",
    "artifactType": "HEAT_ENV",
    "artifactURL":
    "/sdc/v1/catalog/services/ead658ee-f224-4e49-9f3f-8b4c49ed18dc/resourceInstances/vfwnextgen0/artifacts/0a38b7ef-93b9-4d48-856d-efb56d53aab8",
    "artifactDescription": "Auto-generated HEAT Environment deployment artifact",
    "artifactChecksum": "YzdmZDQxMjdiYjBmZDU1YWQ5YTMxZGExNWM4MjRlYzQ=",
    "artifactUUID": "0a38b7ef-93b9-4d48-856d-efb56d53aab8",
    "artifactVersion": "2",
    "generatedFromUUID": "20b803f5-b137-45aa-9196-6b79f9b9f527.heat4",
    "artifactLabel": "heat4env",
    "artifactGroupType": "DEPLOYMENT"
    },
    {
    "artifactName": "base_template.yaml",
    "artifactType": "HEAT",
    "artifactURL":
    "/sdc/v1/catalog/services/ead658ee-f224-4e49-9f3f-8b4c49ed18dc/resourceInstances/vfwnextgen0/artifacts/4d4a37ef-6a1f-4cb2-b3c9-b380a5940431",
    "artifactDescription": "created from csar",
    "artifactTimeout": 60,
    "artifactChecksum": "MGMwNzkwNmZkODExZmFkMTgwMTljMGIwNWMxOWZlODY=",
    "artifactUUID": "4d4a37ef-6a1f-4cb2-b3c9-b380a5940431",
    "artifactVersion": "2",
    "artifactLabel": "heat4",
    "artifactGroupType": "DEPLOYMENT"
    }
  ]
 }

the directory layout

under 4668b783-2dba-444f-b3d8-a508f0d0c0f2 dir, there would be 4 files:

base_template.yaml it's a HEAT artifact
base_template.env  it's a HEAT_ENV artifact
vfmodule-meta.json
service-meta.json includes all artifacts details info of the artifact_list

Dependency

  1. SDC support: SDC-2041 SDC supports K8S plugin to expose APIs to add/delete cloud specific artifacts SDC-2045 create User and Password for MultiCloud component to access secure API A CSAR example including k8s artifact

  2. SO support: modify the current interface between SO and Mutlicloud

  3. MutliCloud support: implement the invoke logic for the downloaded artifact conconered by k8s, clarify all the necessary information needed.

  4. OOM support: need a configuration for necessary pods during deployment need to define how to the common setting instead of hard-code

Test Use Cases

1. For k8s. the artifacts are Helm chart. need a k8s lab env for validation. need to clarify if there is some connection between the VNFs, like using VirtualLink or just a service which is a simple wrap of one VNF

  1. For OpenStack/WindRiver, use vFW test case with HEAT/HEAT_ENV artifacts.