如何使用 ETSI NFV-SOL VNF LCM 协调 API 在 coordinateVNF 脚本中¶
本文档描述了如何在 ChangeCurrentVNFPackage v2 API 中使用用于 ETSI NFV-SOL VNF LCM 协调 API 的示例 coordinateVNF 脚本。
注意
本文档的内容参考了以下脚本和 2023.2 Bobcat 的请求。
概述¶
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 | | |
+--------------------+ +-----------------------------------------------+
执行 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 } }] }
将 Change current VNF Package 流程发送到 InfraDriver
VnfLcmDriver 向 InfraDriver 发送请求以更改 vnfpkg 流程。
获取要更新的堆栈资源
InfraDriver 向 VIM 发送请求以获取要更新的堆栈资源。
更新 VNFC
InfraDriver 向 VIM 发送请求以更新堆栈。
执行 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”)
协调资源
CoordinateVNF 脚本向 VNF 发送请求以协调 VNF。
向外部管理系统 (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 根据结果继续流程。对每个 VNFC 重复步骤 4 到 7
每个 VNFC 的执行从 StandardUserData(或较新的 DefaultUserData)中 vnfcResourceInfo 索引的较高值开始。
完成 VNF LCM 协调 API 操作
通过 CoordinateVNF 脚本完成 VNF LCM 协调 API 操作后,Change current VNF Package 操作将成功完成。