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

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:
OOM Deploys ONAP MultiCloud services
- 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
SDC distributes Service Model and VNF artifacts
ONAP users deploy services, instantiate VNF
- 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.
- 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.
MultiCloud also supports close loop remediation by relaying FCAPS events and stream to DCAE VES collector.
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
Common MultiCloud functionalities
API swagger: API swagger is used for Health Check as well
- Infrastructure Provider registration
The infrastructure provider registration API is to trigger the discovery and registration of infrastructure capabilities (e.g. HPA capabilities) and resource.
- Template level APIs
Template level APIs are the integrating point between SO and MultiCloud which offloads the LCM of infrastructure workload from SO
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.
- Placement Optimization APIs:
Aggregate Resource Checking APIs help OOF to optimize the placement of VNF over underlying VIM/Cloud
- 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
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
|
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 |
|
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 |
|
containerFormat |
M |
1 |
string |
ami,?ari,?aki,?bare,?ovf,?ova, ?docker |
visibility |
O |
1 |
string |
|
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 |
|
containerFormat |
M |
1 |
string |
ami,?ari,?aki,?bare,?ovf,?ova, ?docker |
visibility |
O |
1 |
string |
|
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 |
|
containerFormat |
M |
1 |
string |
ami,?ari,?aki,?bare,?ovf,?ova, ?docker |
visibility |
O |
1 |
string |
|
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 |
|
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 |
|
enableDhcp |
O |
1 |
boolean |
|
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 |
|
enableDhcp |
O |
1 |
boolean |
|
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 |
|
enableDhcp |
O |
1 |
boolean |
|
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 |
|
enableDhcp |
O |
1 |
boolean |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
oof_directives |
O |
1 |
Object |
|
sdnc_directives |
O |
1 |
Object |
|
template_type |
M |
1 |
string |
|
template_data |
M |
1 |
Object |
|
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 |
|
workload_id |
M |
1 |
string |
The ID of infrastructure workload resource |
template_response |
O |
1 |
Object |
|
workload_status |
M |
1 |
string |
|
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 |
|
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 |
|
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 |
|
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:
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 istanbul
release.
Summary
Version: 9.0.1
The istanbul
maintenance release addresses some vulnerabilities mainly
for the log4j dependencies.
Updated the direct dependency log4j libraries to 2.14.1
Please note log4j is still on older versions in a transitive dependencies for * onap/multicloud-framework-artifactbroker:1.7.2
Version: 9.0.0
This release introduces new features in k8splugin, including many bug-fixes bringing better compatibility with Helm 3.5 specification.
Release Data
Project |
MultiCloud |
Docker images |
onap/multicloud-framework:1.7.1 onap/multicloud-framework-artifactbroker:1.7.1 onap/multicloud-openstack-starlingx:1.5.6 onap/multicloud-openstack-windriver:1.5.6 onap/multicloud-openstack-fcaps:1.5.6 onap/multicloud-openstack-pike:1.5.6 onap/multicloud-k8s:0.9.3 |
Release designation |
istanbul |
New features
New features in k8s Plugin related with CNF support implemented by REQ-627:
Implement Query API on the main level to let reading the k8s resources for specified cluster and namespace but not related with particular Instance
Implement pre- and post-install/delete hooks
Modify Instance API POST Response to include hook information
Update Ready flag in Status API to indicate the real status of the Instance
Update Status API and Instance API GET to return hook information but only when additional query param is specified
Bug fixes
MULTICLOUD-1269 MultiCloud k8s: K8s Plugins keeps failed RB Instance
MULTICLOUD-1332 MultiCloud k8s: k8s resource from configuration are not being deleted with instance
MULTICLOUD-1334 MultiCloud framework: Update or Remove Java 8
MULTICLOUD-1338 MultiCloud k8s: Foreground delete policy prevents deletion of the pods
MULTICLOUD-1377 MultiCloud k8s: Wrong parameter used for creation of rb-definition-version
MULTICLOUD-1397 MultiCloud k8s: CRD installation problem
MULTICLOUD-1398 MultiCloud k8s: K8s Resource Delete order the same like for installation
MULTICLOUD-1409 MultiCloud k8s: Query API for Instance returns resources that do not belong to Instance
MULTICLOUD-1414 MultiCloud k8s: Config API takes values only from Config create request
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
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 istanbul
release, please see:
Quick Links
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.

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

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\" > /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\" > /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
Add YAML parser for API and resource.
Add REST client to call southbound VIM API.
Add validator for resource.
Add action for resouce.
Add Swagger file generator.
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.
- MDC_Document
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.
- Log_Architecture
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
Unit tests with tox
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
Work with ESR team for location inport form.
Add check_vim_capacity API to MultiCloud Broker.
Add check_vim_capacity API to each MultiCloud Plugins.
Tests
Unit Tests with tox
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
Isaku Yamahata <isaku.yamahata@intel.com> <isaku.yamahata@gmail.com>
Bin Hu <bh526r@att.com>
Munish Agarwal <munish.agarwal@ericsson.com>
Phuoc Hoang <phuoc.hc@dcn.ssu.ac.kr>
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.
- unit_test
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.
- oslo_service
Number of processes
To best utilize multi-core CPU, the number of processes will be set to the number of CPU cores by default.
Work Items
Add WSGI server.
Run Pecan application in WSGI server.
Add multiple processes support.
Update deploy script to support new API framework.
MultiCloud infra_workload API
We have two purposes for this API:
Integrate SO and Multicloud.
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\" > /root/hello-world.txt",
"timeout_mins":60
}
Response:
Response Codes
Code |
Reason |
---|---|
201 - Created |
Resource was created and is ready to use. |
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
Code |
Reason |
---|---|
202 - Accepted |
The request was accepted. |
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
Code |
Reason |
---|---|
204 - No Content |
The server has fulfilled the request by deleting the resource. |
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. |
|
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
Code |
Reason |
---|---|
200 - OK |
Request was successful. |
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. |
|
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
Work with SO.
Work with OOF team for oof_directive form.
Work with SDNC team for sdc_directive form.
Expose API by broker and each plugin.
Tests
Unit Tests with tox.
Pairwise test with SO project.
Integration test with vCPE HPA test.
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:
- 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.
- 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"}”
the corresponding MultiCloud plugin should decode this string to extract this key-value pair “openstack-region-id” during cloud region on-boarding phase.
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.
MultiCloud plugin for OpenStack should populate this property with the information acquired in step 3.
MultiCloud should use this property to determine what OpenStack Region ID is when interacting with represented OpenStack Instance
Given the workflow above, the AAI’s “cloud-region-id” can be populated by arbitrary string.
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.
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
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
SO support: modify the current interface between SO and Mutlicloud
MutliCloud support: implement the invoke logic for the downloaded artifact conconered by k8s, clarify all the necessary information needed.
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
For OpenStack/WindRiver, use vFW test case with HEAT/HEAT_ENV artifacts.