如何使用 ETSI NFV-SOL VNF LCM 协调 API 在 coordinateVNF 脚本中

本文档描述了如何在 ChangeCurrentVNFPackage v2 API 中使用用于 ETSI NFV-SOL VNF LCM 协调 API 的示例 coordinateVNF 脚本。

概述

1. 用于 ETSI NFV-SOL VNF 协调 API 的示例 coordinateVNF 脚本

《ETSI NFV-SOL VNF LCM 协调 API》的示例 coordinateVNF 脚本专为希望作为客户端与外部管理系统(例如,运营支持系统 (OSS) / 元素管理器 (EM))通信的用户而设计。您可以在本用户指南中了解如何使用它。

警告

由于 Tacker 基于 ETSI-NFV SOL 002 v3.3.1,该版本不支持 VNF LCM 协调 API,因此该示例脚本仅实现了 ChangeCurrentVNFPackage API 中的客户端功能,并非正式支持 VNF LCM 协调 API 本身。该示例实现了基于 ETSI-NFV SOL 002 v3.6.1 的 VNF LCM 协调 API 版本:1.0.0。

2. 用例

在本示例中,用例侧重于在 ChangeCurrentVNFPackage API 中执行滚动更新时,与外部管理系统一起在 Coordinate VNF 脚本中 VNF LCM 协调 API 的客户端功能。VNFM 作为客户端,外部管理系统(如 EM)作为服务器在本用例中。该示例脚本提供了以下操作:

  • 请求协调操作 (POST /lcmcoord/v1/coordinations)

  • 读取协调操作的结果 (GET /lcmcoord/v1/coordinations/{coordinationId})

如果您想详细了解《ETSI NFV-SOL VNF 协调 API》,请参阅 ETSI NFV-SOL 002 v3.6.1

如果您想了解如何使用《Coordinate VNF 脚本》,请参阅以下 ChangeCurrentVNFPackage API 文档:

用法示例

VNF 更新流程

下图显示了使用 Coordinate VNF 脚本作为 VNF LCM 协调 API 客户端的滚动更新。

                                                           +---------+
                                                           |  VNFD   |
                                                           |         |
                                                           +----+----+
                                                                |
                                      (Script is included       v       +-------------------+
              +--------------------+  in the package)     +----------+  | Change current    |
+------------>| CoordinateVNF      +--------------------->|          |  | VNF Package       |
|             | script             |                      |   CSAR   |  | Request with      |
|   +---------+                    |                      |          |  | Additional Params |
|   |         +-------+------------+                      +-----+----+  +--+----------------+
|   |                 |    ^                                    |          | 1. Change current VNF Package
|   |                 |    |                              +-----v----------v------------------------------+
|   |  7. Coordination|    | Coordination                 |  +-----------------------+              VNFM  |
|   |     request     |    | Result                       |  |   Tacker-server       |                    |
|   |                 |    |                              |  +--+--------------------+                    |
|   |                 v    |                              |     |  2. Change current VNF Package request  |
|   |         +------------+-------+                      |     v                                         |
|   |         |    External        |                      |  +-----------------------------------------+  |
|   |         |    management      |                      |  |                                         |  |
|   |         |    system (EM)     |                      |  |   +-------------------+                 |  |
|   |         +--------------------+                      |  |   | VnfLcmDriver      |                 |  |
|   |                                                     |  |   |                   |                 |  |
|   |                                                     |  |   |                   |                 |  |
|   |                                                     |  |   |                   |                 |  |
|   |                                                     |  |   |                   |                 |  |
|   |                                                     |  |   |                   |                 |  |
|   |  6. Coordinate                                      |  |   +-+-----------------+                 |  |
|   |     resource                                        |  |     |                                   |  |
|   |         +--------------------+                      |  |     v                                   |  |
|   |         |                    | 3. Get stack resource|  |   +-------------------+                 |  |
|   |         |  +--------------+  |    to update         |  |   | InfraDriver       | 8. Repeat steps |  |
|   |         |  | Resource     |<-+----------------------+--+---+                   |    4 through 7  |  |
|   +---------+->|              |  | 4. Update VNFC       |  |   |                   |    for each VNFC|  |
|             |  |              |<-+----------------------+--+---+                   +--------+        |  |
|             |  +--------------+  |                      |  |   |                   |        |        |  |
|             | VNF                |                      |  |   |                   |<-------+        |  |
|             +--------------------+                      |  |   |                   |                 |  |
|                        5. Execute CoordinateVNF script  |  |   |                   |                 |  |
+---------------------------------------------------------+--+---+                   |                 |  |
                                                          |  |   +-------------------+                 |  |
                                                          |  |    Tacker-conductor                     |  |
              +--------------------+                      |  +-----------------------------------------+  |
              | Hardware Resources |                      |                                               |
              +--------------------+                      +-----------------------------------------------+
  1. 执行 Change current VNF Package 操作

    用户将 ChangeCurrentVNFPackage 请求发送到带有 Additional Params 的“Individual VNF 实例”资源。

    $ openstack vnflcm change-vnfpkg VNF_INSTANCE_ID \
      ./sample_param_file_for_coordination.json \
      --os-tacker-api-version 2
    

    Tacker-server 调用 Tacker-conductor,然后 Tacker-conductor 获取上载的 VNF 包并调用 VnfLcmDriver。

    您可以在 ChangeCurrentVnfPkgRequest 的 additionalParams 中设置以下参数,以指定外部协调服务器的信息。

    • additionalParams

      属性名称

      基数

      参数描述

      upgrade_type

      1

      文件更新操作方法的类型。指定 Blue-Green 或 Rolling update。

      lcm-operation-coordinate-old-vnf

      1

      模拟旧 VNF 的 CoordinateVNF 行为的脚本的文件路径。

      lcm-operation-coordinate-new-vnf

      1

      模拟新 VNF 的 CoordinateVNF 行为的脚本的文件路径。

      vdu_params

      0..N

      要更新的目标 VDU 的 VDU 信息。对于 OpenStack VIM,指定 vdu_params 是必需的,对于 Kubernetes VIM 则不是必需的。

      > vdu_id

      1

      要更新的目标 VDU 的 VDU 名称。

      > old_vnfc_param

      0..1

      旧 VNFC 连接信息。用于 CoordinateVNF 操作中为了应用配置到 VNFC 的 ssh 连接。

      >> cp_name

      1

      要更新的旧 VNFC 的连接点名称。

      >> username

      1

      要更新的旧 VNFC 的用户名。

      >> password

      1

      要更新的旧 VNFC 的密码。

      >> endpoint

      1

      协调服务器的端点 URL。

      >> authentication

      0..1

      用于配置连接到协调服务器时使用授权的身份验证参数。

      >>> authType

      1..N

      定义 API 消费者在接收通知时愿意接受的身份验证/授权类型。允许的值

      • BASIC:使用客户端凭据进行 HTTP Basic 身份验证。

      • OAUTH2_CLIENT_CREDENTIALS:使用客户端凭据授权类型获得的 OAuth 2.0 令牌,在通过客户端标识符和客户端密码进行身份验证后获得。

      • OAUTH2_CLIENT_CERT:使用客户端凭据授权类型获得的 OAuth 2.0 令牌,在通过客户端标识符和 X.509 证书进行相互身份验证后获得。

      >>> paramsBasic

      0..1

      使用 authType BASIC 进行身份验证/授权的参数。

      >>>> userName

      0..1

      要在 HTTP Basic 身份验证中使用的用户名。

      >>>> password

      0..1

      要在 HTTP Basic 身份验证中使用的密码。

      >>> paramsOauth2ClientCredentials

      0..1

      使用 authType OAUTH2_CLIENT_CREDENTIALS 进行身份验证/授权的参数。

      >>>> clientId

      0..1

      在 OAuth 2.0 客户端凭据授权类型的访问令牌请求中使用的客户端标识符。

      >>>> clientPassword

      0..1

      在 OAuth 2.0 客户端凭据授权类型的访问令牌请求中使用的客户端密码。

      >>>> tokenEndpoint

      0..1

      可以获取访问令牌的令牌端点。

      >>> paramsOauth2ClientCert

      0..1

      使用 authType OAUTH2_CLIENT_CERT 进行身份验证/授权的参数。

      >>>> clientId

      1

      在 OAuth 2.0 客户端凭据授权类型的访问令牌请求中使用的客户端标识符。

      >>>> certificateRef

      1

      客户端证书的指纹。哈希函数应使用 SHA256 或更高版本。

      >>>>> type

      1

      指纹的类型。允许的值

      • x5t#S256:根据 IETF RFC 7515 第 4.1.8 节定义的 X.509 证书的 SHA-256 指纹。

      >>>>> value

      1

      根据类型定义的指纹值。

      >>>> tokenEndpoint

      1

      可以获取访问令牌的令牌端点。

      >> coordination_server_param

      0..1

      访问协调服务器的信息。在使用调用协调 API 的 coordinateVNF 脚本时是必需的。

      >> timeout

      0..1

      重新发送请求到协调 API 的超时秒数。

      > new_vnfc_param

      0..1

      新的 VNFC 连接信息。用于 CoordinateVNF 操作中为了应用配置到 VNFC 的 ssh 连接。

      >> cp_name

      1

      要更新的新 VNFC 的连接点名称。

      >> username

      1

      要更新的新 VNFC 的用户名。

      >> password

      1

      要更新的新 VNFC 的密码。

      >> endpoint

      1

      协调服务器的端点 URL。

      >> authentication

      0..1

      用于配置连接到协调服务器时使用授权的身份验证参数。

      >>> authType

      1..N

      定义 API 消费者在接收通知时愿意接受的身份验证/授权类型。允许的值

      • BASIC:使用客户端凭据进行 HTTP Basic 身份验证。

      • OAUTH2_CLIENT_CREDENTIALS:使用客户端凭据授权类型获得的 OAuth 2.0 令牌,在通过客户端标识符和客户端密码进行身份验证后获得。

      • OAUTH2_CLIENT_CERT:使用客户端凭据授权类型获得的 OAuth 2.0 令牌,在通过客户端标识符和 X.509 证书进行相互身份验证后获得。

      >>> paramsBasic

      0..1

      使用 authType BASIC 进行身份验证/授权的参数。

      >>>> userName

      0..1

      要在 HTTP Basic 身份验证中使用的用户名。

      >>>> password

      0..1

      要在 HTTP Basic 身份验证中使用的密码。

      >>> paramsOauth2ClientCredentials

      0..1

      使用 authType OAUTH2_CLIENT_CREDENTIALS 进行身份验证/授权的参数。

      >>>> clientId

      0..1

      在 OAuth 2.0 客户端凭据授权类型的访问令牌请求中使用的客户端标识符。

      >>>> clientPassword

      0..1

      在 OAuth 2.0 客户端凭据授权类型的访问令牌请求中使用的客户端密码。

      >>>> tokenEndpoint

      0..1

      可以获取访问令牌的令牌端点。

      >>> paramsOauth2ClientCert

      0..1

      使用 authType OAUTH2_CLIENT_CERT 进行身份验证/授权的参数。

      >>>> clientId

      1

      在 OAuth 2.0 客户端凭据授权类型的访问令牌请求中使用的客户端标识符。

      >>>> certificateRef

      1

      客户端证书的指纹。哈希函数应使用 SHA256 或更高版本。

      >>>>> type

      1

      指纹的类型。允许的值

      • x5t#S256:根据 IETF RFC 7515 第 4.1.8 节定义的 X.509 证书的 SHA-256 指纹。

      >>>>> value

      1

      根据类型定义的指纹值。

      >>>> tokenEndpoint

      1

      可以获取访问令牌的令牌端点。

      >> coordination_server_param

      0..1

      访问协调服务器的信息。在使用调用协调 API 的 coordinateVNF 脚本时是必需的。

      >> timeout

      0..1

      重新发送请求到协调 API 的超时秒数。

      external_lb_param

      0..1

      需要配置更改的负载均衡器信息。仅适用于 OpenStack VIM 的 Blue-Green 部署过程。

      > ip_address

      1

      负载均衡器服务器的 IP 地址。

      > username

      1

      负载均衡器服务器的用户名。

      > password

      1

      负载均衡器服务器的密码。

    以下是 additionalParams 请求的示例。

    "additionalParams": {
      "upgrade_type": "RollingUpdate",
      "lcm-operation-coordinate-new-vnf": "./Scripts/coordinate_vnf.py",
      "lcm-operation-coordinate-old-vnf": "./Scripts/coordinate_vnf.py",
      "vdu_params": [{
        "vdu_id": "VDU1",
        "old_vnfc_param": {
          "cp_name": "VDU1_CP1",
          "username": "ubuntu",
          "password": "ubuntu",
          "endpoint": "http://127.0.0.1:6789",
          "authentication": {
            "authType": [
              "BASIC"
            ],
            "paramsBasic": {
              "userName": "tacker",
              "password": "tacker"
            }
          },
          "timeout": 30
        },
        "new_vnfc_param": {
          "cp_name": "VDU1_CP1",
          "username": "ubuntu",
          "password": "ubuntu",
          "endpoint": "http://127.0.0.1:6789",
          "authentication": {
            "authType": [
              "BASIC"
            ],
            "paramsBasic": {
              "userName": "tacker",
              "password": "tacker"
            }
          },
          "timeout": 30
        }
      },
      {
        "vdu_id": "VDU2",
        "old_vnfc_param": {
          "cp_name": "VDU2_CP1",
          "username": "ubuntu",
          "password": "ubuntu",
          "endpoint": "http://127.0.0.1:6789",
          "authentication": {
            "authType": [
              "BASIC"
            ],
            "paramsBasic": {
              "userName": "tacker",
              "password": "tacker"
            }
          },
          "timeout": 30
        },
        "new_vnfc_param": {
          "cp_name": "VDU2_CP1",
          "username": "ubuntu",
          "password": "ubuntu",
          "endpoint": "http://127.0.0.1:6789",
          "authentication": {
            "authType": [
              "BASIC"
            ],
            "paramsBasic": {
              "userName": "tacker",
              "password": "tacker"
            }
          },
          "timeout": 30
        }
      }]
    }
    
  2. 将 Change current VNF Package 流程发送到 InfraDriver

    VnfLcmDriver 向 InfraDriver 发送请求以更改 vnfpkg 流程。

  3. 获取要更新的堆栈资源

    InfraDriver 向 VIM 发送请求以获取要更新的堆栈资源。

  4. 更新 VNFC

    InfraDriver 向 VIM 发送请求以更新堆栈。

  5. 执行 CoordinateVNF 脚本

    InfraDriver 运行 CoordinateVNF 脚本。该脚本包含在 VNF 包中,您可以根据自己的环境对其进行修改。

    CoordinateVNF 脚本中 Coordination API 和主要方法示例类 coordinate_vnf.py 如下。

    class CoordScript(object):
        def __init__(self, vnfc_param):
            self.vnfc_param = vnfc_param
    
        def run(self):
            coord_req = self.vnfc_param['LcmCoordRequest']
            coord_req['coordinationActionName'] = (
                "prv.tacker_organization.coordination_test")
            endpoint = self.vnfc_param.get('endpoint')
            authentication = self.vnfc_param.get('authentication')
            timeout = self.vnfc_param.get('timeout')
    
            input_params = self.vnfc_param.get('inputParams')
            if input_params is not None:
                coord_req['inputParams'] = input_params
    
            if endpoint is None:
                raise Exception('endpoint must be specified.')
            if authentication is None:
                raise Exception('authentication must be specified.')
    
            # Reload "tacker.conf" when using OAUTH2_CLIENT_CERT
            # for authentication.
            args = ["--config-file", "/etc/tacker/tacker.conf"]
            config.init(args)
    
            coord = coord_client.create_coordination(
                endpoint, authentication, coord_req, timeout)
            if coord['coordinationResult'] != "CONTINUE":
                raise Exception(
                    f"coordinationResult is {coord['coordinationResult']}")
    
    def main():
        vnfc_param = pickle.load(sys.stdin.buffer)
        script = CoordScript(vnfc_param)
        script.run()
    

    注意

    根据 ETSI-NFV SOL 002 v3.6.1,协调操作 coordinationActionName 定义为在 VNFD 中声明。但是,CoordinateVNF 脚本不参考 VNFD,必须在脚本中描述它。(例如,“prv.tacker_organization.coordination_test”)

  6. 协调资源

    CoordinateVNF 脚本向 VNF 发送请求以协调 VNF。

  7. 向外部管理系统 (EM) 发送协调请求

    CoordinateVNF 脚本向外部管理系统 (EM) 发送协调请求。EM 的端点 URL 从 ChangeCurrentVNFPackage 请求中获得。从 Tacker 获得的目标 VNFC 被指定为 LcmCoordRequest 中的 inputParams。(例如,通过 vnfcInstanceId 指定)。

    Tacker 可以使用实用函数 tacker/sol_refactored/common/coord_client.py 中支持的 VNF LCM 协调 API 的 2 个操作。您可以通过 CoordinateVNF 脚本使用它们。

    • 请求协调操作 (POST /lcmcoord/v1/coordinations)

      VNFM 请求将协调操作发送到协调 API 服务器(例如,EM)。

      一个示例请求体如下。

      {
         "vnfInstanceId": "b18a8a15-8973-4202-a2f0-a67a109fc461",
         "vnfLcmOpOccId": "2cae986e-7fea-4aeb-9b22-f81b35800838",
         "coordinationActionName": "prv.tacker_organization.coordination_test",
         "lcmOperationType": "CHANGE_VNFPKG",
         "_links": {
           "vnfLcmOpOcc": {
             "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/2cae986e-7fea-4aeb-9b22-f81b35800838"
           },
           "vnfInstance": {
             "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/b18a8a15-8973-4202-a2f0-a67a109fc461"
           }
         }
       }
      
    • 读取协调操作的结果 (GET /lcmcoord/v1/coordinations/{coordinationId})

      VNFM 请求将协调操作的结果发送到协调 API 服务器(例如,EM)。

    收到协调响应后的流程取决于同步或异步模式。

    注意

    根据 ETSI-NFV SOL 002 v3.6.1,协调接口支持同步和异步模式。API 服务器决定模式,API 客户端可以通过 API 响应来了解它。因此,由于 VNFM 无法控制模式,Tacker 将支持这两种模式。在这两种模式下,重新发送请求的超时秒数可以在 additionalParams 中的“timeout”中指定。以下是 VNFM 的协调流程。

    同步模式:EM 返回一个“201 Created”响应给 Tacker,响应体中包含“LcmCoord”数据结构,然后 VNFM 根据结果继续流程。或者,EM 返回一个“503 Service Unavailable”响应,响应体中包含“ProblemDetails”数据结构和一个“Retry-After”HTTP 标头,该标头指示建议在延迟多长时间后重试协调。延迟间隔过去后,VNFM 再次发送协调请求。

    异步模式:EM 返回一个“202 Accepted”响应给 Tacker,响应体为空,并且包含一个“Location”HTTP 标头,该标头指示“Individual coordination action”资源的 URI。Tacker 等待一段时间(如前一个 202 响应的“Retry-After”标头中指示的,或者以其他方式确定),然后循环的下一次迭代。Tacker 通过向 EM 发送 GET 请求,使用“Location”标头中返回的 URI 来轮询协调状态。获得协调结果后,Tacker 根据结果继续流程。
  8. 对每个 VNFC 重复步骤 4 到 7

    每个 VNFC 的执行从 StandardUserData(或较新的 DefaultUserData)中 vnfcResourceInfo 索引的较高值开始。

  9. 完成 VNF LCM 协调 API 操作

    通过 CoordinateVNF 脚本完成 VNF LCM 协调 API 操作后,Change current VNF Package 操作将成功完成。