增强 ChangeCurrentVNFPackage API

蓝图: https://blueprints.launchpad.net/tacker/+spec/enhance-change-package

本规范增强了 ChangeCurrentVNFPackage API。

问题描述

ChangeCurrentVNFPackage API 定义在 ETSI NFV-SOL003 v3.3.1 [1] 中,根据 ETSI NFV-IFA007 v3.3.1 [2] 中的 VNF 软件修改流程。Tacker 在 Yoga 版本中支持 ChangeCurrentVNFPackage 操作,但仅支持软件镜像更新用例,并且缺少一些参数。以下用例将被支持。

  1. 更改 OpenStack flavor

  2. 更改外部/内部虚拟链路(VL)和连接点(CP)

  3. 添加其他 ChangeCurrentVNFPackage API 参数

注意

Yoga 版本仅支持 RollingUpdate 流程 [5]。本规范不针对更新流程的增强。

提议的变更

(1) 添加一个函数和 VNF 包示例来更改 OpenStack flavor

此函数可以更改 OpenStack flavor,并在 ChangeCurrentVNFPackage API 中提供垂直扩展资源,例如 vMemory 和 vCPU。此函数将通过在用户数据中使用不同的 HEAT 输入参数来实现 [3]。我们还旨在将这些示例添加到 tacker 文档中。请参阅下文。

注意

computeFlavourId 例如 HEAT 输入参数中的“m1.tiny”由 VNFD (requested_additional_capability_name) 或 Grant 响应设置。flavor 信息在 OpenStack Nova 中管理。

  • BaseHOT

    heat_template_version: 2013-05-23
    description: Test Base HOT
    
    parameters:
      nfv:
        type: json
    
    resources:
      VDU1:
        type: VDU1.yaml
        properties:
          flavor: { get_param: [ nfv, VDU, VDU1, computeFlavourId ] }
          image: { get_param: [ nfv, VDU, VDU1, vcImageId] }
          name: VDU1
          availability_zone: { get_param: [ nfv, VDU, VDU1, locationConstraints ] }
    
      VDU2:
        type: VDU2.yaml
        properties:
          flavor: { get_param: [ nfv, VDU, VDU2, computeFlavourId ] }
          image: { get_param: [ nfv, VDU, VDU2, vcImageId] }
          name: VDU2
          availability_zone: { get_param: [ nfv, VDU, VDU2, locationConstraints ] }
    
  • 之前: input_params.yaml

    VDU1 和 VDU2 的“computeFlavourId”参数均为“m1.tiny”。

    {
      "VDU": {
        {
          "VDU1": {
            "computeFlavourId": "m1.tiny",
            "locationConstraints": "nova"
          },
          "VDU1-VirtualStorage": {
            "vcImageId": "56c7b026-a23e-49e5-96c6-05ab90186965"
          },
          "VDU2": {
            "computeFlavourId": "m1.tiny",
            "locationConstraints": "nova"
          },
          "VDU2-VirtualStorage": {
            "vcImageId": "6b8a14f0-1b40-418a-b650-ae4a0378daa5"
          }
        }
      }
    }
    
  • 之后: scale_up_input_params.yaml

    VDU2 将更改新的 OpenStack flavor 以进行扩展 (“m1.tiny”->”m1.small”)。

    {
      "VDU": {
        {
          "VDU1": {
            "computeFlavourId": "m1.tiny",
            "locationConstraints": "nova"
          },
          "VDU1-VirtualStorage": {
            "vcImageId": "56c7b026-a23e-49e5-96c6-05ab90186965"
          },
          "VDU2": {
            "computeFlavourId": "m1.small",
            "locationConstraints": "nova"
          },
          "VDU2-VirtualStorage": {
            "vcImageId": "6b8a14f0-1b40-418a-b650-ae4a0378daa5"
          }
        }
      }
    }
    

(2) 添加一个函数来更改外部/内部网络

以下操作将通过使用额外的 ChangeCurrentVNFPackage API 参数 (extVirtualLinks, extManagedVirtualLinks)、修改后的 HOT 输入参数或 BaseHOT 模板来支持。

注意

在 NFV SOL 中,外部网络定义为在没有 VNF LCM 操作的情况下创建或删除。因此,ChangeCurrentVNFPackage API 将仅操作外部 CP 的修改/添加/删除。

  • 更改外部 CP

    • 修改外部 CP

    • 添加外部 CP

    • 删除外部 CP

注意

如果存在 extVirtualLinks -> extLinkPorts,则“添加和删除”意味着“连接和断开”外部 CP。因为在这种情况下,外部提供的链路端口用于连接/断开外部 CP 到外部 VL。

  • 更改内部 VL

    • 修改内部 VL

    • 添加内部 VL

    • 删除内部 VL

  • 更改内部 CP

    • 修改内部 CP

    • 添加内部 CP

    • 删除内部 CP

有几种方法可以更改网络。下面描述了修改外部 CP 的一个示例。

  • BaseHOT

    heat_template_version: 2013-05-23
    description: Test Base HOT
    
    parameters:
      nfv:
        type: json
    
    resources:
      VDU1:
        type: OS::Nova::Server
        properties:
          networks:
          - port: { get_param: [ nfv, CP, VDU1_CP1, port ]  }
    
  • 之前: VnfInstance

    VDU1_CP1 连接到外部 VL “67c837dc-c247-4a3e-ac0f-5603bfef1ba3”。

    "instantiatedVnfInfo": {
      "extVirtualLinkInfo": [
        {
          "currentVnfExtCpData": [
            {
              "cpConfig": {
                "VDU1_CP1": {
                  "cpProtocolData": [
                    {
                      "ipOverEthernet": {
                        "ipAddresses": [
                          {
                            "numDynamicAddresses": 1,
                            "subnetId": "0cc4d7e2-37c5-49f0-98d2-da945b5841e5",
                            "type": "IPV4"
                          }
                        ]
                      },
                    "layerProtocol": "IP_OVER_ETHERNET"
                    }
                  ],
                  "linkPortId": "1f330fd3-b037-4d42-993f-8df45b0efa99",
                  "parentCpConfigId": "a0eab66b-e82f-4a42-a2e5-57d0b02abab3"
                }
              },
              "cpdId": "VDU1_CP1"
            }
          ],
          "extLinkPorts": [
            {
              "cpInstanceId": "cp-req-1f330fd3-b037-4d42-993f-8df45b0efa99",
              "id": "1f330fd3-b037-4d42-993f-8df45b0efa99",
              "resourceHandle": {
                "resourceId": "04ab6361-7e6c-4255-a10c-2ab1a6daa4c2"
              }
            }
          ],
          "id": "3d0d9c9b-dbbc-41d6-84ef-1bf2529753d5",
          "resourceHandle": {
            "resourceId": "67c837dc-c247-4a3e-ac0f-5603bfef1ba3",
            "resourceProviderId": "Company",
            "vimConnectionId": "02ef2cca-d853-4e90-950a-a6d0ce86ec3a"
          }
        }
      ]
    }
    
  • 之后: “ChangeCurrentVnfPkgRequest”中的 extVirtualLinks

    VDU1_CP1 将断开并重新连接到外部 VL “d703f250-7d54-45b3-b29e-2ef8a5e5f6a1”。

    "extVirtualLinks": [
      {
        "id": "3d0d9c9b-dbbc-41d6-84ef-1bf2529753d5",
        "vimConnectionId": "02ef2cca-d853-4e90-950a-a6d0ce86ec3a",
        "resourceProviderId": "Company",
        "resourceId": "d703f250-7d54-45b3-b29e-2ef8a5e5f6a1",
        "extCps": [
          {
            "cpdId": "VDU1_CP1",
            "cpConfig": {
              "VDU1_CP1": {
                "parentCpConfigId": "2254b5d5-35f7-4d7e-b467-0ef17866ef1d",
                "linkPortId": "5353df3d-16de-4789-8a57-0623b5c83700",
                "cpProtocolData": [
                  {
                    "layerProtocol": "IP_OVER_ETHERNET",
                    "ipOverEthernet": {
                      "ipAddresses": [
                        {
                          "type": "IPV4",
                          "numDynamicAddresses": 1,
                          "subnetId": "5156e206-c513-41ff-a6e6-b45516046188"
                        }
                      ]
                    }
                  }
                ]
              }
            }
          }
        ],
        "extLinkPorts": [
          {
            "id": "5353df3d-16de-4789-8a57-0623b5c83700",
            "resourceHandle": {
              "resourceId": "0ec87b04-c441-4859-8a44-53e28f685ea2"
            }
          }
        ]
      }
    ]
    

注意

如果列表中的条目未更改,则可以省略 extVirtualLinks

(3) 添加 ChangeCurrentVNFPackage API 参数

Tacker 未实现 ChangeCurrentVNFPackage API 参数将被支持。

  • ChangeCurrentVnfPkgRequest

    属性名称

    数据类型

    基数

    描述

    extVirtualLinks

    ExtVirtualLinkData

    0..N

    有关连接到 VNF 的外部 VL 的信息。

    extManagedVirtualLinks

    ExtManagedVirtualLinkData

    0..N

    有关由 NFVO 管理的内部 VL 的信息。

    vimConnectionInfo

    map (VimConnectionInfo)

    0..N

    “VnfInstance”中的“vimConnectionInfo”属性数组。

    extensions

    KeyValuePairs

    0..1

    “VnfInstance”中的“extensions”属性。

    vnfConfigurableProperties

    KeyValuePairs

    0..1

    “VnfInstance”中的“vnfConfigurableProperties”属性。

注意

Tacker 将根据 JSON Merge Patch (IETF RFC 7396 [4]) 的规则将“ChangeCurrentVnfPkgRequest”数据结构中负载体中的 vimConnectionInfoextensionsvnfConfigurableProperties 属性应用于“VnfInstance”数据结构中现有的属性。Tacker还需要将“VnfInfoModificationRequest”实现的合并策略统一到上述策略。

数据模型影响

REST API 影响

以下 RESTful API 将被更新。此 RESTful API 将基于 ETSI NFV-SOL003 v3.3.1 [1]

  • 名称: 更改当前 VNF 包
    描述: 请求通过 vnfd ID 更改当前 VNF 包。
    方法类型: POST
    URL: /vnflcm/v2/vnf_instances/{vnfInstanceId}/change_vnfpkg
    请求:

    数据类型

    基数

    描述

    ChangeCurrentVnfPkgRequest

    1

    更改当前 VNF 包的参数。

    属性名称

    数据类型

    基数

    参数描述

    在 (Y) 中支持

    在 (Z) 中支持

    vnfdId

    标识符

    1

    定义目标 VNF 包以进行更改的 VNFD 的标识符。

    extVirtualLinks

    ExtVirtualLinkData

    0..N

    有关连接到 VNF 的外部 VL 的信息。

    extManagedVirtualLinks

    ExtManagedVirtualLinkData

    0..N

    有关由 NFVO 管理的内部 VL 的信息。

    vimConnectionInfo

    map (VimConnectionInfo)

    0..N

    “VnfInstance”中的“vimConnectionInfo”属性数组。

    additionalParams

    KeyValuePairs

    0..1

    NFVO 作为输入传递给流程的附加参数。

    extensions

    KeyValuePairs

    0..1

    “VnfInstance”中的“extensions”属性。

    vnfConfigurableProperties

    KeyValuePairs

    0..1

    “VnfInstance”中的“vnfConfigurableProperties”属性。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Yuta Kazato <yuta.kazato.nw@hco.ntt.co.jp>

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

其他贡献者

Hiroo Kitamura <hiroo.kitamura@ntt-at.co.jp>

工作项

  • 在 tacker-server 和 tacker-conductor 中实现额外的 ChangeCurrentVNFPackage API 参数。

  • 实现额外的 VNF 升级操作函数。

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

  • 添加和更新示例 VNF 包。

  • 更新 Tacker 用户指南: ChangeCurrentVNFPackage API。

依赖项

  • 更改当前 VNF 包 (/vnf_instances/{vnfInstanceId}/ change_vnfpkg POST) [1]

  • Tacker SPEC: 支持 VNF 软件修改的 ChangeCurrentVNFPackage [5]

测试

将为 ChangeCurrentVNFPackage API 添加和更新单元和功能测试用例。

文档影响

有关额外的 VNF 升级操作和 ChangeCurrentVNFPackage API 参数的描述将被添加到 Tacker 用户指南中。

参考资料