增强基于 NFV SOL014 的 Heat 输入

https://blueprints.launchpad.net/tacker/+spec/support-hot-according-to-nfv-sol014

本规范增强了 Tacker 支持的参数,这些参数映射到 OpenStack 的 Heat 编排模板 (HOT) [1]。本规范添加了支持的参数,并重点关注如何将它们映射到 HOT 以实例化 VNF。

问题描述

ETSI NFV SOL014 [2] 规定了一组用于虚拟化资源管理中信息交换的数据模型。它还重点关注了使用 HOT 实现定义的各种接口的数据模型示例。

虽然 Tacker 已经使用 HOT 实现了 LCM 操作 [3],但其支持的参数有限。

进一步支持 HOT 中的 SOL014 参数,使 Tacker 作为通用 VNFM 更加灵活和强大。

提议的变更

本规范使 Tacker 能够支持 Heat 输入数据中的更多参数。为了实例化 VNF,Tacker 将根据 VNF 描述符 (VNFD)、InstantiateVnfRequest 操作中的信息以及 SOL001 [4] 和 SOL003 [5] 中定义的 Grant 操作生成 Heat 的输入数据。

以下参数将被支持。

类别

参数

VNFD

API - InstantiateVnfRequest

API - Grant

Heat

支持于 (W)

计算

name

tosca.nodes.nfv.Vdu.Compute

N/A

N/A

OS::Nova::Server > properties > name

NO

计算

风味

tosca.nodes.nfv.Vdu.Compute

N/A

vimAssets

OS::Nova::Server > properties > flavor

YES

计算

镜像

tosca.artifacts.nfv.SwImage

N/A

vimAssets

OS::Nova::Server > properties > image

YES

计算

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

计算

max_size

tosca.nodes.nfv.Vdu.Compute

N/A

N/A

OS::Heat::AutoScalingGroup > properties > max_size

NO

计算

min_size

tosca.nodes.nfv.Vdu.Compute

N/A

N/A

OS::Heat::AutoScalingGroup > properties > min_size

NO

计算

scaling_adjustment

N/A

addtionalParams

addtionalParams

OS::Heat::ScalingPolicy > properties > scaling_adjustment

NO

网络

ext_network

N/A

extVirtualLinks

extVirtualLinks

OS::Neutron::Port > properties > network

YES

网络

ext_subnet

N/A

extVirtualLinks

extVirtualLinks

OS::Neutron::Subnet > properties > name

YES

网络

ext_ip_address

N/A

extVirtualLinks

extVirtualLinks

OS::Neutron::Port > properties > fixed_ips > ip_address

YES

网络

ext_managed_network

tosca.nodes.nfv.VnfVirtualLink

extManagedVirtualLinks

extManagedVirtualLinks

OS::Neutron::Port > properties > network

NO

网络

ext_managed_subnet

N/A

addtionalParams

addtionalParams

OS::Neutron::Subnet > properties > name

NO

网络

ip_address

tosca.nodes.nfv.VnfVirtualLink

N/A

N/A

OS::Neutron::Port > properties > fixed_ips > ip_address

NO

网络

gateway_ip

tosca.nodes.nfv.VnfVirtualLink

N/A

N/A

OS::Neutron::Subnet > properties > gateway_ip

NO

网络

enable_dhcp

tosca.nodes.nfv.VnfVirtualLink

N/A

N/A

OS::Neutron::Subnet > properties > enable_dhcp

NO

网络

mac_address

N/A

extVirtualLinks

extVirtualLinks

OS::Neutron::Port > properties > mac_address

NO

网络

port_id

tosca.nodes.nfv.VduCp

extVirtualLinks, extManagedVirtualLinks

extVirtualLinks, extManagedVirtualLinks

OS::Neutron::FloatingIP > properties > port_id

NO

网络

network_type

tosca.nodes.nfv.VnfVirtualLink

N/A

N/A

OS::Neutron::ProviderNet > propterties > network_type, OS::Neutron::Segment > propterties > network_type

NO

网络

binding:vnic_type

tosca.nodes.nfv.VduCp

N/A

N/A

OS::Neutron::Port > properties > binding:vnic_type

NO

网络

max_kbps

tosca.nodes.nfv.VnfVirtualLink

N/A

N/A

OS::Neutron::QoSBandwidthLimitRule > properties > max_kbps

NO

网络

min_kbps

tosca.nodes.nfv.VnfVirtualLink

N/A

N/A

OS::Neutron::QoSMinimumBandwidthRule > properties > min_kbps

NO

存储

volume_type

N/A

addtionalParams

addtionalParams

OS::Cinder::Volume > properties > volume_type

NO

存储

volume_size

tosca.nodes.nfv.Vdu.VirtualBlockStorage

N/A

N/A

OS::Nova::Server > properties > block_device_mapping > volume_size

NO

放置

server_availability_zone

N/A

N/A

zones

OS::Nova::Server > properties > availability_zone

YES

放置

volume_availability_zone

N/A

addtionalParams

addtionalParams

OS::Cinder::Volume > properties > availability_zone

NO

放置

ServerGroup

tosca.policies.nfv.AffinityRule, tosca.policies.nfv.AntiAffinityRule

N/A

N/A

OS::Nova::ServerGroup > properties > policies

NO

其他参数

N/A

addtionalParams

N/A

其他参数

NO

为了支持标准 VNF 实例化操作中未指定的任意数据类型,Tacker 将使用 InstantiateVnfRequest 中的 additionalParams 提供几个操作。

以下描述了包含 additionalParams 的输入数据的示例。

注意

Tacker 已经支持 InstantiateVnfRequest 中的 additionalParams。但是,additinalParamas 仅用作关于 LCM 操作用户数据的标志。本规范将通过允许设置由消费者定义的所有数据来扩展 additionalParams 的使用。

{
  "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 调用 Heat 中的 create-stack API 时,将生成映射到 HOT 的输入数据。为了满足各种消费者的需求,Tacker 将提供三种选项来描述 HOT 并设置相应的 additionalParams。以下数据模型显示了每种选项的示例 HOT 和 additionalParams。

  • 在 nfv 数据结构内设置从 additionalParams 获取的参数。

    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": {
        "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"
        }
      }
    }
    
  • 在 nfv 数据结构外部设置从 additionalParams 获取的参数。

    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": {
        "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"
      }
    }
    
  • 在 nfv 数据结构外部设置所有参数。

    注意

    在此选项中,nfv 数据结构对于 HOT 和输入数据不是必需的。

    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": {
        "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"
      }
    }
    

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

野口宏文 <hirofumi.noguchi.rs@hco.ntt.co.jp>

工作项

  • 添加新的单元和功能测试。

  • 添加描述基于 SOL014 的 VNF 包的新文档。

  • 增强实现以支持 LCM 操作用户数据中的基于 SOL014 的参数和 additionalParams。

依赖项

测试

将为 VNF 生命周期管理添加单元和功能测试用例。

文档影响

将向 Tacker 用户指南添加描述基于 SOL014 的 VNF 包的新文档。

参考资料