ETSI NFV-SOL VNF 错误处理¶
本文档描述了在 Tacker v2 API 中 VNF 的错误处理方式。
先决条件¶
应安装以下软件包
tacker
python-tackerclient
执行“实例化 VNF”过程中的步骤,直到ETSI NFV-SOL VNF 部署为带有 LCM 操作用户数据的虚拟机。换句话说,在“终止 VNF”之后的过程不会执行。
VNF 错误处理流程¶
如前提条件中所述,在执行错误处理之前必须先创建 VNF。
CLI 命令的详细信息请参见 使用 v2 Tacker 进行 VNF 生命周期管理。
有一些操作可以用于 VNF 的错误处理。
回滚 VNF 生命周期管理操作
使 VNF 生命周期管理操作失败
重试 VNF 生命周期管理操作
为了执行错误处理,有必要指定 VNF_LCM_OP_OCC_ID,这是目标 LCM 操作的 ID。首先,将描述指定 ID 的方法。
识别 VNF_LCM_OP_OCC_ID¶
可以通过 CLI 获取 VNF_LCM_OP_OCC_ID。
CLI 命令的详细信息请参见 使用 v2 Tacker 进行 VNF 生命周期管理。
在检查“VNF_LCM_OP_OCC_ID”之前,您应该先获取 VNF_INSTANCE_ID。
$ openstack vnflcm op list --os-tacker-api-version 2
结果
+--------------------------------------+-----------------+--------------------------------------+-------------+
| ID | Operation State | VNF Instance ID | Operation |
+--------------------------------------+-----------------+--------------------------------------+-------------+
| a7f80542-faeb-4324-ba82-c6214307e864 | FAILED_TEMP | 385fc2ff-1ef5-42f4-8196-3d913160074d | INSTANTIATE |
+--------------------------------------+-----------------+--------------------------------------+-------------+
只有当 operationState 为 FAILED_TMP 时,才能执行错误处理。
如果已注册 Subscription,则导致 FAILED_TEMP 的上述操作将向 Subscription 的 callbackUri 发送“Notification”。
此“Notification”中包含的 vnfLcmOpOccId 对应于 VNF_LCM_OP_OCC_ID。
有关此处使用的 API 的详细信息,请参阅 VNF LCM v2 API。
回滚 VNF LCM 操作¶
LCM 操作 |
回滚的描述 |
先决条件 |
后置条件 |
|---|---|---|---|
实例化 |
VNFM 移除所有 VM 和资源。
例如,Tacker 执行 Heat stack-delete 以删除目标 VM。
|
FAILED_TEMP |
ROLLED_BACK 或 FAILED_TEMP |
扩展 |
VNFM 撤销扩展操作中 VM 和资源的更改。
结果是,最新的 VNFc(VM)将被删除。
例如,Tacker 撤销 desired_capacity 并执行 Heat stack-update。
|
FAILED_TEMP |
ROLLED_BACK 或 FAILED_TEMP |
修改 |
VNFM 撤销 VNF 实例信息的更新。 |
FAILED_TEMP |
ROLLED_BACK 或 FAILED_TEMP |
更改外部连接 |
VNFM 撤销 VNF 实例的外部连接的更改。
例如,Tacker 撤销 stack 参数并执行 Heat stack-update。
|
FAILED_TEMP |
ROLLED_BACK 或 FAILED_TEMP |
更换当前 VNF 包 |
VNFM 撤销 VNF 实例的当前 VNF 包的更改。
例如,Tacker 撤销 stack 参数并执行 Heat stack-update。
|
FAILED_TEMP |
ROLLED_BACK 或 FAILED_TEMP |
注意
在某些情况下,更改外部连接的回滚无法恢复虚拟资源的 IP 地址和端口 ID。如果操作在执行 VIM 处理之前失败:更新 stack,则 IP 地址和端口 ID 将由其回滚操作恢复。否则,动态 IP 地址和端口 ID 将不会被回滚操作恢复。
本手册将以下操作作为回滚操作的用例进行描述。
“实例化 VNF”失败
回滚 VNF 生命周期管理操作
删除 VNF
如下所示,如果“实例化 VNF”失败,在执行“回滚 VNF 生命周期管理操作”之前,无法执行“删除 VNF”。
$ openstack vnflcm delete VNF_INSTANCE_ID --os-tacker-api-version 2
结果
Failed to delete vnf instance with ID '385fc2ff-1ef5-42f4-8196-3d913160074d': Other LCM operation of vnfInstance 385fc2ff-1ef5-42f4-8196-3d913160074d is in progress.
Failed to delete 1 of 1 vnf instances.
因此,使用以下 CLI 命令执行“回滚 VNF 生命周期管理操作”。
$ openstack vnflcm op rollback VNF_LCM_OP_OCC_ID --os-tacker-api-version 2
结果
Rollback request for LCM operation a7f80542-faeb-4324-ba82-c6214307e864 has been accepted
如果“回滚 VNF 生命周期管理操作”成功,则“删除 VNF”也将成功。
$ openstack vnflcm delete VNF_INSTANCE_ID --os-tacker-api-version 2
结果
Vnf instance '385fc2ff-1ef5-42f4-8196-3d913160074d' is deleted successfully
使 VNF LCM 操作失败¶
LCM 操作 |
失败的描述 |
先决条件 |
后置条件 |
|---|---|---|---|
实例化 |
Tacker 只是在 Tacker-DB 上将 LCM 操作状态更改为“FAILED”。 |
FAILED_TEMP |
FAILED |
终止 |
Tacker 只是在 Tacker-DB 上将 LCM 操作状态更改为“FAILED”。 |
FAILED_TEMP |
FAILED |
修复 |
Tacker 只是在 Tacker-DB 上将 LCM 操作状态更改为“FAILED”。 |
FAILED_TEMP |
FAILED |
规模 |
Tacker 只是在 Tacker-DB 上将 LCM 操作状态更改为“FAILED”。 |
FAILED_TEMP |
FAILED |
修改 |
Tacker 只是在 Tacker-DB 上将 LCM 操作状态更改为“FAILED”。 |
FAILED_TEMP |
FAILED |
更改外部连接 |
Tacker 只是在 Tacker-DB 上将 LCM 操作状态更改为“FAILED”。 |
FAILED_TEMP |
FAILED |
更换当前 VNF 包 |
Tacker 只是在 Tacker-DB 上将 LCM 操作状态更改为“FAILED”。 |
FAILED_TEMP |
FAILED |
本手册将以下操作作为失败操作的用例进行描述。
“实例化 VNF”失败
使 VNF 生命周期管理操作失败
删除 VNF
如下所示,如果“实例化 VNF”失败,在执行“使 VNF 生命周期管理操作失败”之后,无法执行“删除 VNF”。
$ openstack vnflcm delete VNF_INSTANCE_ID --os-tacker-api-version 2
结果
Failed to delete vnf instance with ID '385fc2ff-1ef5-42f4-8196-3d913160074d': Other LCM operation of vnfInstance 385fc2ff-1ef5-42f4-8196-3d913160074d is in progress.
Failed to delete 1 of 1 vnf instances.
因此,使用以下 CLI 命令执行“使 VNF 生命周期管理操作失败”。
$ openstack vnflcm op fail VNF_LCM_OP_OCC_ID \
--fit-width --os-tacker-api-version 2
结果
+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Error | { |
| | "title": "Stack create failed", |
| | "status": 422, |
| | "detail": "Resource CREATE failed: resources.wifiut5qtngn: resources.VDU1_scale_group.Property error: resources.VDU1_CP1.properties.network: Error validating value 'errornetwork': Unable to find network with name or id |
| | 'errornetwork'" |
| | } |
| ID | a7f80542-faeb-4324-ba82-c6214307e864 |
| Is Automatic Invocation | False |
| Is Cancel Pending | False |
| Links | { |
| | "self": { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a7f80542-faeb-4324-ba82-c6214307e864" |
| | }, |
| | "vnfInstance": { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/385fc2ff-1ef5-42f4-8196-3d913160074d" |
| | }, |
| | "retry": { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a7f80542-faeb-4324-ba82-c6214307e864/retry" |
| | }, |
| | "rollback": { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a7f80542-faeb-4324-ba82-c6214307e864/rollback" |
| | }, |
| | "fail": { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_lcm_op_occs/a7f80542-faeb-4324-ba82-c6214307e864/fail" |
| | } |
| | } |
| Operation | INSTANTIATE |
| Operation State | FAILED |
| Start Time | 2023-11-14T04:32:57Z |
| State Entered Time | 2023-11-14T04:32:57Z |
| VNF Instance ID | 385fc2ff-1ef5-42f4-8196-3d913160074d |
| grantId | 008eccda-5466-4820-ae76-bdce6e128d8c |
| operationParams | { |
| | "flavourId": "simple" |
| | } |
+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
如果“使 VNF 生命周期管理操作失败”成功,则“删除 VNF”也将成功。
$ openstack vnflcm delete VNF_INSTANCE_ID --os-tacker-api-version 2
结果
Vnf instance '385fc2ff-1ef5-42f4-8196-3d913160074d' is deleted successfully
重试 VNF LCM 操作¶
LCM 操作 |
失败的描述 |
先决条件 |
后置条件 |
|---|---|---|---|
实例化 |
VNFM 重试实例化操作。 |
FAILED_TEMP |
COMPLETED 或 FAILED_TEMP |
终止 |
VNFM 重试终止操作。 |
FAILED_TEMP |
COMPLETED 或 FAILED_TEMP |
修复 |
VNFM 重试 Heal 操作。 |
FAILED_TEMP |
COMPLETED 或 FAILED_TEMP |
规模 |
VNFM 重试 Scale 操作。 |
FAILED_TEMP |
COMPLETED 或 FAILED_TEMP |
修改 |
VNFM 重试 Modify 操作。 |
FAILED_TEMP |
COMPLETED 或 FAILED_TEMP |
更改外部连接 |
VNFM 重试更改外部连接操作。 |
FAILED_TEMP |
COMPLETED 或 FAILED_TEMP |
更换当前 VNF 包 |
VNFM 重试更改当前 VNF 包操作。 |
FAILED_TEMP |
COMPLETED 或 FAILED_TEMP |
本手册将以下操作作为重试操作的用例进行描述。
“实例化 VNF”失败
重试 VNF 生命周期管理操作
如下所示,如果“实例化 VNF”失败,如果您想重新执行之前的(失败的)操作,则执行“重试”操作。
因此,使用以下 CLI 命令执行“重试 VNF 生命周期管理操作”。
$ openstack vnflcm op retry VNF_LCM_OP_OCC_ID --os-tacker-api-version 2
结果
Retry request for LCM operation a7f80542-faeb-4324-ba82-c6214307e864 has been accepted
如果“重试 VNF 生命周期管理操作”成功,则另一个 LCM 可以正常运行。
MgmtDriver 的错误处理¶
错误处理包括重试、回滚和失败操作。
对于失败操作,它在执行时不会执行 LCM,因此不需要使用 MgmtDriver。
对于重试操作,它在执行时将再次执行 LCM,因此只要 LCM 配置了 MgmtDriver,MgmtDriver 也会在重试操作期间被调用,无需额外配置。
对于回滚操作,由于 NFV-SOL001 v2.6.1 的
6.7 接口 类型中没有定义rollback_start和rollback_end,因此在执行回滚操作时,MgmtDriver 将不会被调用。
在回滚操作中调用 MgmtDriver 之前,必须修改 VNF 包中的 VNFD。
注意
在 MgmtDriver 中,用户将 LCM 失败时需要保留的数据保存在 user_script_err_handling_data 变量中。它保存在相应的 VNF_LCM_OP_OCC 中,可以通过 显示 VNF LCM OP OCC 查看。
在错误处理(重试或回滚)期间,使用 user_script_err_handling_data 变量中的数据执行相应的处理。
VNF 包的修改¶
用户在创建 VNF 包 时需要进行以下修改。
回滚操作目前支持多个 回滚 VNF LCM 操作。以下以实例化和扩展的回滚操作为例,演示如何修改 VNFD。
注意
以下提供了需要修改的示例文件 v2_sample2_df_simple.yaml 和 v2_sample2_types.yaml,它们存储在 VNF 包的 Definitions 目录中。
v2_sample2_df_simple.yaml对应于 基于 ETSI NFV-SOL001 的 VNF 描述符 (VNFD) 中的4. 拓扑 模板 文件 与 部署 风味。v2_sample2_types.yaml对应于 基于 ETSI NFV-SOL001 的 VNF 描述符 (VNFD) 中的2. 用户 定义 类型 定义 文件。
在
v2_sample2_df_simple.yaml中,需要在topology_template.node_templates.VNF.interfaces.Vnflcm下添加xxx_rollback_start和xxx_rollback_end。以下是
v2_sample2_df_simple.yaml的内容,未修改的部分被替换为“...”topology_template: ... node_templates: VNF: type: company.provider.VNF properties: flavour_description: A simple flavour interfaces: Vnflcm: instantiate_start: implementation: mgmt-driver-script instantiate_end: implementation: mgmt-driver-script heal_start: implementation: mgmt-driver-script heal_end: implementation: mgmt-driver-script scale_start: implementation: mgmt-driver-script scale_end: implementation: mgmt-driver-script terminate_start: implementation: mgmt-driver-script terminate_end: implementation: mgmt-driver-script change_external_connectivity_start: implementation: mgmt-driver-script change_external_connectivity_end: implementation: mgmt-driver-script modify_information_start: implementation: mgmt-driver-script modify_information_end: implementation: mgmt-driver-script instantiate_rollback_start: implementation: mgmt-driver-script instantiate_rollback_end: implementation: mgmt-driver-script scale_rollback_start: implementation: mgmt-driver-script scale_rollback_end: implementation: mgmt-driver-script artifacts: mgmt-driver-script: description: Sample MgmtDriver Script type: tosca.artifacts.Implementation.Python file: ../Scripts/mgmt_driver_script.py
注意
如果在 VNFD 中添加了
xxx_start和xxx_end的一些定义,则还必须在 MgmtDriver 中添加相应的xxx_start和xxx_end函数。在
v2_sample2_types.yaml中,需要在node_types.company.provider.VNF.interfaces.Vnflcm下添加interface_types的定义,并修改type的定义。以下是
v2_sample2_types.yaml的内容,未修改的部分被替换为“...”interface_types: sample.test.Vnflcm: derived_from: tosca.interfaces.nfv.Vnflcm instantiate_start: description: Invoked before instantiate instantiate_end: description: Invoked after instantiate heal_start: description: Invoked before heal heal_end: description: Invoked after heal scale_start: description: Invoked before scale scale_end: description: Invoked after scale terminate_start: description: Invoked before terminate terminate_end: description: Invoked after terminate change_external_connectivity_start: description: Invoked before change_external_connectivity change_external_connectivity_end: description: Invoked after change_external_connectivity modify_information_start: description: Invoked before modify_information modify_information_end: description: Invoked after modify_information instantiate_rollback_start: description: Invoked before instantiate_rollback instantiate_rollback_end: description: Invoked after instantiate_rollback scale_rollback_start: description: Invoked before scale_rollback scale_rollback_end: description: Invoked after scale_rollback node_types: company.provider.VNF: ... interfaces: Vnflcm: type: sample.test.Vnflcm
完成上述修改后,可以在错误处理中调用 MgmtDriver。
注意
在错误处理过程中,MgmtDriver 的具体操作需要由用户或提供商自定义。