Enhance Heat input on the basis of NFV SOL014¶
https://blueprints.launchpad.net/tacker/+spec/support-hot-according-to-nfv-sol014
This specification enhances the Tacker’s supported parameters mapped to the OpenStack’s Heat Orchestration Template (HOT) [1]. The specification adds supported parameters and focuses on how they can be mapped onto the HOT to instantiate the VNF.
Problem description¶
ETSI NFV SOL014 [2] specified a set of data models for information exchanged over the virtualised resource management. It also focused on implementation examples of the data models defined for the various interfaces using the HOT.
Though Tacker has already been implemented LCM operations using HOT [3] , its supported parameters were limited.
The further support of the parameters in HOT with SOL014 makes Tacker more flexible and powerful as Generic-VNFM.
Proposed change¶
This specification enables Tacker to support more parameters in the input data for Heat. To instantiate VNF, Tacker will generate the input data for Heat in accordance with VNF Descriptor (VNFD), information in InstantiateVnfRequest operation, and Grant operation defined in SOL001 [4] and SOL003 [5] .
Following parameters will be supported.
category |
parameter |
VNFD |
API - InstantiateVnfRequest |
API - Grant |
Heat |
Supported in (W) |
---|---|---|---|---|---|---|
Compute |
name |
tosca.nodes.nfv.Vdu.Compute |
N/A |
N/A |
OS::Nova::Server > properties > name |
NO |
Compute |
flavour |
tosca.nodes.nfv.Vdu.Compute |
N/A |
vimAssets |
OS::Nova::Server > properties > flavor |
YES |
Compute |
image |
tosca.artifacts.nfv.SwImage |
N/A |
vimAssets |
OS::Nova::Server > properties > image |
YES |
Compute |
desired_capacity |
tosca.policies.nfv.InstantiationLevels, tosca.policies.nfv.VduScalingAspectDeltas, tosca.policies.nfv.VduInitialDelta |
N/A |
N/A |
OS::Heat::AutoScalingGroup > properties > desired_capacity |
NO |
Compute |
max_size |
tosca.nodes.nfv.Vdu.Compute |
N/A |
N/A |
OS::Heat::AutoScalingGroup > properties > max_size |
NO |
Compute |
min_size |
tosca.nodes.nfv.Vdu.Compute |
N/A |
N/A |
OS::Heat::AutoScalingGroup > properties > min_size |
NO |
Compute |
scaling_adjustment |
N/A |
addtionalParams |
addtionalParams |
OS::Heat::ScalingPolicy > properties > scaling_adjustment |
NO |
Network |
ext_network |
N/A |
extVirtualLinks |
extVirtualLinks |
OS::Neutron::Port > properties > network |
YES |
Network |
ext_subnet |
N/A |
extVirtualLinks |
extVirtualLinks |
OS::Neutron::Subnet > properties > name |
YES |
Network |
ext_ip_address |
N/A |
extVirtualLinks |
extVirtualLinks |
OS::Neutron::Port > properties > fixed_ips > ip_address |
YES |
Network |
ext_managed_network |
tosca.nodes.nfv.VnfVirtualLink |
extManagedVirtualLinks |
extManagedVirtualLinks |
OS::Neutron::Port > properties > network |
NO |
Network |
ext_managed_subnet |
N/A |
addtionalParams |
addtionalParams |
OS::Neutron::Subnet > properties > name |
NO |
Network |
ip_address |
tosca.nodes.nfv.VnfVirtualLink |
N/A |
N/A |
OS::Neutron::Port > properties > fixed_ips > ip_address |
NO |
Network |
gateway_ip |
tosca.nodes.nfv.VnfVirtualLink |
N/A |
N/A |
OS::Neutron::Subnet > properties > gateway_ip |
NO |
Network |
enable_dhcp |
tosca.nodes.nfv.VnfVirtualLink |
N/A |
N/A |
OS::Neutron::Subnet > properties > enable_dhcp |
NO |
Network |
mac_address |
N/A |
extVirtualLinks |
extVirtualLinks |
OS::Neutron::Port > properties > mac_address |
NO |
Network |
port_id |
tosca.nodes.nfv.VduCp |
extVirtualLinks, extManagedVirtualLinks |
extVirtualLinks, extManagedVirtualLinks |
OS::Neutron::FloatingIP > properties > port_id |
NO |
Network |
network_type |
tosca.nodes.nfv.VnfVirtualLink |
N/A |
N/A |
OS::Neutron::ProviderNet > propterties > network_type, OS::Neutron::Segment > propterties > network_type |
NO |
Network |
binding:vnic_type |
tosca.nodes.nfv.VduCp |
N/A |
N/A |
OS::Neutron::Port > properties > binding:vnic_type |
NO |
Network |
max_kbps |
tosca.nodes.nfv.VnfVirtualLink |
N/A |
N/A |
OS::Neutron::QoSBandwidthLimitRule > properties > max_kbps |
NO |
Network |
min_kbps |
tosca.nodes.nfv.VnfVirtualLink |
N/A |
N/A |
OS::Neutron::QoSMinimumBandwidthRule > properties > min_kbps |
NO |
Storage |
volume_type |
N/A |
addtionalParams |
addtionalParams |
OS::Cinder::Volume > properties > volume_type |
NO |
Storage |
volume_size |
tosca.nodes.nfv.Vdu.VirtualBlockStorage |
N/A |
N/A |
OS::Nova::Server > properties > block_device_mapping > volume_size |
NO |
placement |
server_availability_zone |
N/A |
N/A |
zones |
OS::Nova::Server > properties > availability_zone |
YES |
placement |
volume_availability_zone |
N/A |
addtionalParams |
addtionalParams |
OS::Cinder::Volume > properties > availability_zone |
NO |
placement |
ServerGroup |
tosca.policies.nfv.AffinityRule, tosca.policies.nfv.AntiAffinityRule |
N/A |
N/A |
OS::Nova::ServerGroup > properties > policies |
NO |
other parameter |
N/A |
addtionalParams |
N/A |
other parameter |
NO |
To support arbitrary data type, which is not specified in standard VNF Instantiation operation, Tacker will provide several operations using the additionalParams in InstantiateVnfRequest.
The following describes the example of the input data including additionalParams.
Note
Tacker has already supported additionalParams in InstantiateVnfRequest. However, additinalParamas was only used as a flag regarding LCM operation user data. This specification will expand the use of additionalParams by allowing setting any data defined by consumers.
{
"flavourId": "flavour_id",
"instantiationLevelId": "instantiation_level_id",
"extVirtualLinks": [
{
"resourceId": "a77119b7-fcaa-47e5-955d-29f37d5603d4",
"id": "dc144409-bc93-48b9-be0a-7d737c01a88b",
"extCps": [
{
"cpdId": "CP_0",
"cpConfig": [
{
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"macAddress": "fa:16:3e:aa:bb:cc",
"fixedAddresses": [
"192.168.1.1"
]
}
]
}
}
]
}
]
}
]
}
],
"additionalParams": {
"lcm-operation-user-data": "./UserData/lcm_user_data.py",
"lcm-operation-user-data-class": "SampleUserData",
"Cp1Network": "452e9c2f-a0b4-401e-bdea-5007ce1dfd2b",
"Cp1IpAddress": "192.168.10.1",
"Cp1MacAddress": "fa:16:3e:aa:bb:dd"
}
}
Tacker will generate the input data mapped to HOT when it calls create-stack API in Heat. To address various consumers’ requirements, Tacker will provide three options to describe HOT and set corresponding additionalParams. The following data model shows sample HOT and additionalParams for each option.
Set parameters obtained from additionalParams within the nfv data structure.
HOT:
resources: VDU_0: type: OS::Nova::Server properties: name: VDU_0 flavor: { get_param: [ nfv, VDU, VDU_0, flavor ] } block_device_mapping_v2: [{ device_name: "vda", volume_id : { get_resource : VDU_0_Storage } }] availability_zone: nova networks: - port: { get_resource: CP_0 } - port: { get_resource: CP_1 } CP_0: type: OS::Neutron::Port properties: network: { get_param: [ nfv, CP, CP_0, network ] } fixed_ips: - ip_address: [ nfv, CP, CP_0, fixed_ips, ip_address, 0 ] mac_address: { get_param: [ nfv, CP, CP_0, mac_address ] } CP_1: type: OS::Neutron::Port properties: network: { get_param : [ nfv, Cp1Network ] } fixed_ips: - ip_address: { get_param: [ nfv, Cp1IPAddress ] } mac_address: { get_param: [ nfv, Cp1MacAddress ] } VDU_0_Storage: type: OS::Cinder::Volume deletion_policy: Delete properties: name: VDU_0_Storage image: { get_param: [ nfv, VDU, VDU_0_Storage, image ] } size: 30
parameters:
{ "parameters": { "nfv": { "VDU": { "VDU_0": {"flavor": "VDU_Flavor"}, "VDU_0_Storage": {"image": "VDU_image"} }, "CP": { "CP_0": { "network": "a77119b7-fcaa-47e5-955d-29f37d5603d4", "mac_address": "fa:16:3e:aa:bb:cc", "fixed_ips": [ { "ip_address": "192.168.1.1" } ] } }, "Cp1Network" : "452e9c2f-a0b4-401e-bdea-5007ce1dfd2b", "Cp1IPAddress": "192.168.10.1", "Cp1MacAddress": "fa:16:3e:aa:bb:dd" } } }
Set parameters obtained from additionalParams outside the nfv data structure.
HOT:
resources: VDU_0: type: OS::Nova::Server properties: name: VDU_0 flavor: { get_param: [ nfv, VDU, VDU_0, flavor ] } block_device_mapping_v2: [{ device_name: "vda", volume_id : { get_resource : VDU_0_Storage } }] availability_zone: nova networks: - port: { get_resource: CP_0 } - port: { get_resource: CP_1 } CP_0: type: OS::Neutron::Port properties: network: { get_param: [ nfv, CP, CP_0, network ] } fixed_ips: - ip_address: [ nfv, CP, CP_0, fixed_ips, ip_address, 0 ] mac_address: { get_param: [ nfv, CP, CP_0, mac_address ] } CP_1: type: OS::Neutron::Port properties: network: { get_param : Cp1Network } fixed_ips: - ip_address: { get_param: Cp1IPAddress } mac_address: { get_param: Cp1MacAddress } VDU_0_Storage: type: OS::Cinder::Volume deletion_policy: Delete properties: name: VDU_0_Storage image: { get_param: [ nfv, VDU, VDU_0_Storage, image ] } size: 30
parameters:
{ "parameters": { "nfv": { "VDU": { "VDU_0": {"flavor": "VDU_Flavor"}, "VDU_0_Storage": {"image": "VDU_image"} }, "CP": { "CP_0": { "network": "a77119b7-fcaa-47e5-955d-29f37d5603d4", "mac_address": "fa:16:3e:aa:bb:cc", "fixed_ips": [ { "ip_address": "192.168.1.1" } ] } } } "Cp1Network" : "452e9c2f-a0b4-401e-bdea-5007ce1dfd2b", "Cp1IPAddress": "192.168.10.1", "Cp1MacAddress": "fa:16:3e:aa:bb:dd" } }
Set all parameters outside the nfv data structure.
Note
In this option, the nfv data structure is not mandatory for HOT and the input data.
HOT:
resources: VDU_0: type: OS::Nova::Server properties: name: VDU_0 flavor: { get_param: nfv_VDU_VDU_0_flavor } block_device_mapping_v2: [{ device_name: "vda", volume_id : { get_resource : VDU_0_Storage } }] availability_zone: nova networks: - port: { get_resource: CP_0 } - port: { get_resource: CP_1 } CP_0: type: OS::Neutron::Port properties: network: { get_param : nfv_CP_CP_0_network } fixed_ips: - ip_address: { get_param : nfv_CP_CP_0_fixed_ips_ip_address_0 } mac_address: { get_param : nfv_CP_CP_0_fixed_ips_ip_mac_address } CP_1: type: OS::Neutron::Port properties: network: { get_param : Cp1Network } fixed_ips: - ip_address: { get_param: Cp1IPAddress } mac_address: { get_param: Cp1MacAddress } VDU_0_Storage: type: OS::Cinder::Volume deletion_policy: Delete properties: name: VDU_0_Storage image: { get_param: nfv_VDU_VOU_0_Storage_image } size: 30
parameters:
{ "parameters": { "nfv_VDU_VDU_0_flavor": "VDU_Flavor", "nfv_VDU_VOU_0_Storage_image": "VDU_image", "nfv_CP_CP_0_network" : "a77119b7-fcaa-47e5-955d-29f37d5603d4", "nfv_CP_CP_0_fixed_ips_ip_address_0": "192.168.1.1", "nfv_CP_CP_0_fixed_ips_ip_mac_address": "fa:16:3e:aa:bb:cc", "Cp1Network" : "452e9c2f-a0b4-401e-bdea-5007ce1dfd2b", "Cp1IPAddress": "192.168.10.1", "Cp1MacAddress": "fa:16:3e:aa:bb:dd" } }
Alternatives¶
None
Data model impact¶
None
REST API impact¶
None
Security impact¶
None
Notifications impact¶
None
Other end user impact¶
None
Performance Impact¶
None
Other deployer impact¶
None
Developer impact¶
None
Implementation¶
Assignee(s)¶
Hirofumi Noguchi <hirofumi.noguchi.rs@hco.ntt.co.jp>
Work Items¶
Add new unit and functional tests.
Add new documents describing SOL014 based VNF package.
Enhance implementation to support SOL014 based parameters and additionalParams in LCM operation user data.
Dependencies¶
None
Testing¶
Unit and functional test cases will be added for VNF Lifecycle Management.
Documentation Impact¶
New documents describing SOL014 based VNF package will be added to Tacker User Guide.