ETSI NFV-SOL VNF 部署为虚拟机,并进行 LCM 操作用户数据¶
本文档描述了如何使用 CLI 命令在 Tacker v2 API 中使用 LCM 操作用户数据部署 VNF 作为虚拟机。请查看 LCM-user-data 规范 和 NFV-SOL014 v2.8.1 以获取有关 LCM 操作用户数据的更多信息。
概述¶
下图显示了 VNF 部署的概述。
请求创建 VNF
用户通过上传 VNF 包并请求
create VNF,向 tacker-server 请求创建 VNF。VNF 包应包含BaseHOT和UserData,除了VNFD之外。这些内容的详细说明可以在 VNF 包 中找到。请求实例化 VNF
用户通过请求
instantiate VNF并提供实例化参数,向 tacker-server 请求实例化创建的 VNF。调用 OpenStack Heat API
收到请求后,tacker-server 会将其重定向到 tacker-conductor。在 tacker-conductor 中,请求会根据实例化参数的内容再次重定向到适当的 infra-driver(在本例中为 OpenStack infra-driver)。然后,OpenStack infra-driver 调用 OpenStack Heat APIs 以创建 VM 作为 VNF。
创建 VM
OpenStack Heat 根据 API 调用创建 VM。
先决条件¶
应安装以下软件包
tacker
python-tackerclient
应根据 VIM 管理 注册默认 VIM。
例如,您可以按如下方式注册默认 VIM。
$ cat vim_config.yaml
auth_url: 'http://192.168.56.10/identity'
username: 'nfv_user'
password: 'devstack'
project_name: 'nfv'
project_domain_name: 'Default'
user_domain_name: 'Default'
cert_verify: 'False'
$ openstack vim register --config-file vim_config.yaml \
--is-default openstack-admin-vim
+----------------+-----------------------------------------------------+
| Field | Value |
+----------------+-----------------------------------------------------+
| auth_cred | { |
| | "username": "nfv_user", |
| | "user_domain_name": "Default", |
| | "cert_verify": "False", |
| | "project_id": null, |
| | "project_name": "nfv", |
| | "project_domain_name": "Default", |
| | "auth_url": "http://192.168.56.10/identity/v3", |
| | "key_type": "barbican_key", |
| | "secret_uuid": "***", |
| | "password": "***" |
| | } |
| auth_url | http://192.168.56.10/identity/v3 |
| created_at | 2023-11-08 02:50:43.373078 |
| description | |
| extra | |
| id | 60f78f56-e297-4a7a-aae7-65418e3961e3 |
| is_default | True |
| name | openstack-admin-vim |
| placement_attr | { |
| | "regions": [ |
| | "RegionOne" |
| | ] |
| | } |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| status | ACTIVE |
| type | openstack |
| updated_at | None |
| vim_project | { |
| | "name": "nfv", |
| | "project_domain_name": "Default" |
| | } |
+----------------+-----------------------------------------------------+
下面使用的 VNF 包(sample_csar.zip)是参考 VNF 包 准备的。
注意
为了使用 LCM 操作用户数据部署 VNF,有必要在 VNF 包中包含 BaseHOT 和 UserData,这些在 VNF 包 中是可选的。
例如,您可以按如下方式创建 VNF 包。 在本文档中,TACKER_ROOT 是服务器上 tacker 仓库的根目录。
$ cd TACKER_ROOT/samples/tests/functional/sol_v2_common/basic_lcms_max_individual_vnfc
$ python3 pre.py
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2023-11-08T04:57:50Z |
| description | |
| dns_domain | None |
| id | 8d628e15-375c-4882-be3e-7d8f2824bff2 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| is_default | False |
| is_vlan_transparent | None |
| mtu | 1442 |
| name | ft-net0 |
| port_security_enabled | True |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| provider:network_type | geneve |
| provider:physical_network | None |
| provider:segmentation_id | 34180 |
| qos_policy_id | None |
| revision_number | 1 |
| router:external | Internal |
| segments | None |
| shared | False |
| status | ACTIVE |
| subnets | |
| tags | |
| tenant_id | ebbc6cf1a03d49918c8e408535d87268 |
| updated_at | 2023-11-08T04:57:50Z |
+---------------------------+--------------------------------------+
+----------------------+--------------------------------------+
| Field | Value |
+----------------------+--------------------------------------+
| allocation_pools | 100.100.100.2-100.100.100.254 |
| cidr | 100.100.100.0/24 |
| created_at | 2023-11-08T04:57:52Z |
| description | |
| dns_nameservers | |
| dns_publish_fixed_ip | None |
| enable_dhcp | True |
| gateway_ip | 100.100.100.1 |
| host_routes | |
| id | a1d042f3-88aa-4150-b42b-8620c9be746c |
| ip_version | 4 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| name | ft-ipv4-subnet0 |
| network_id | 8d628e15-375c-4882-be3e-7d8f2824bff2 |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| revision_number | 0 |
| segment_id | None |
| service_types | |
| subnetpool_id | None |
| tags | |
| updated_at | 2023-11-08T04:57:52Z |
+----------------------+--------------------------------------+
+----------------------+--------------------------------------------------------+
| Field | Value |
+----------------------+--------------------------------------------------------+
| allocation_pools | 1111:2222:3333::1-1111:2222:3333:0:ffff:ffff:ffff:ffff |
| cidr | 1111:2222:3333::/64 |
| created_at | 2023-11-08T04:57:54Z |
| description | |
| dns_nameservers | |
| dns_publish_fixed_ip | None |
| enable_dhcp | True |
| gateway_ip | 1111:2222:3333:: |
| host_routes | |
| id | a12a1603-a30d-4724-80fb-9a7019a3c79f |
| ip_version | 6 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| name | ft-ipv6-subnet0 |
| network_id | 8d628e15-375c-4882-be3e-7d8f2824bff2 |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| revision_number | 0 |
| segment_id | None |
| service_types | |
| subnetpool_id | None |
| tags | |
| updated_at | 2023-11-08T04:57:54Z |
+----------------------+--------------------------------------------------------+
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2023-11-08T04:57:56Z |
| description | |
| dns_domain | None |
| id | dcdd8e59-d303-4659-bdff-d32f2cb2b806 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| is_default | False |
| is_vlan_transparent | None |
| mtu | 1442 |
| name | ft-net1 |
| port_security_enabled | True |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| provider:network_type | geneve |
| provider:physical_network | None |
| provider:segmentation_id | 19341 |
| qos_policy_id | None |
| revision_number | 1 |
| router:external | Internal |
| segments | None |
| shared | False |
| status | ACTIVE |
| subnets | |
| tags | |
| tenant_id | ebbc6cf1a03d49918c8e408535d87268 |
| updated_at | 2023-11-08T04:57:56Z |
+---------------------------+--------------------------------------+
+----------------------+--------------------------------------+
| Field | Value |
+----------------------+--------------------------------------+
| allocation_pools | 22.22.22.2-22.22.22.254 |
| cidr | 22.22.22.0/24 |
| created_at | 2023-11-08T04:57:58Z |
| description | |
| dns_nameservers | |
| dns_publish_fixed_ip | None |
| enable_dhcp | True |
| gateway_ip | 22.22.22.1 |
| host_routes | |
| id | ab38a204-8c01-4205-95c6-b4e74198700f |
| ip_version | 4 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| name | ft-ipv4-subnet1 |
| network_id | dcdd8e59-d303-4659-bdff-d32f2cb2b806 |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| revision_number | 0 |
| segment_id | None |
| service_types | |
| subnetpool_id | None |
| tags | |
| updated_at | 2023-11-08T04:57:58Z |
+----------------------+--------------------------------------+
+----------------------+--------------------------------------------------------+
| Field | Value |
+----------------------+--------------------------------------------------------+
| allocation_pools | 1111:2222:4444::1-1111:2222:4444:0:ffff:ffff:ffff:ffff |
| cidr | 1111:2222:4444::/64 |
| created_at | 2023-11-08T04:58:00Z |
| description | |
| dns_nameservers | |
| dns_publish_fixed_ip | None |
| enable_dhcp | True |
| gateway_ip | 1111:2222:4444:: |
| host_routes | |
| id | 3f023732-8364-43e0-80de-00799d5b78af |
| ip_version | 6 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| name | ft-ipv6-subnet1 |
| network_id | dcdd8e59-d303-4659-bdff-d32f2cb2b806 |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| revision_number | 0 |
| segment_id | None |
| service_types | |
| subnetpool_id | None |
| tags | |
| updated_at | 2023-11-08T04:58:00Z |
+----------------------+--------------------------------------------------------+
+-------------------------+---------------------------------------------------------------------------+
| Field | Value |
+-------------------------+---------------------------------------------------------------------------+
| admin_state_up | UP |
| allowed_address_pairs | |
| binding_host_id | |
| binding_profile | |
| binding_vif_details | |
| binding_vif_type | unbound |
| binding_vnic_type | normal |
| created_at | 2023-11-08T04:58:02Z |
| data_plane_status | None |
| description | |
| device_id | |
| device_owner | |
| device_profile | None |
| dns_assignment | None |
| dns_domain | None |
| dns_name | None |
| extra_dhcp_opts | |
| fixed_ips | ip_address='10.10.0.34', subnet_id='649c956c-1516-4d92-a6bc-ce936d8a880d' |
| hardware_offload_type | None |
| id | 389ade82-7618-4b42-bc90-5ebbac0863cf |
| ip_allocation | None |
| mac_address | fa:16:3e:be:f3:50 |
| name | VDU2_CP1-1 |
| network_id | 6a3aeb3a-fb8b-4d27-a5f1-4f148aeb303f |
| numa_affinity_policy | None |
| port_security_enabled | True |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| propagate_uplink_status | None |
| qos_network_policy_id | None |
| qos_policy_id | None |
| resource_request | None |
| revision_number | 1 |
| security_group_ids | fcca932a-c14b-4e67-825c-848a62b54acc |
| status | DOWN |
| tags | |
| trunk_details | None |
| updated_at | 2023-11-08T04:58:02Z |
+-------------------------+---------------------------------------------------------------------------+
+-------------------------+----------------------------------------------------------------------------+
| Field | Value |
+-------------------------+----------------------------------------------------------------------------+
| admin_state_up | UP |
| allowed_address_pairs | |
| binding_host_id | |
| binding_profile | |
| binding_vif_details | |
| binding_vif_type | unbound |
| binding_vnic_type | normal |
| created_at | 2023-11-08T04:58:04Z |
| data_plane_status | None |
| description | |
| device_id | |
| device_owner | |
| device_profile | None |
| dns_assignment | None |
| dns_domain | None |
| dns_name | None |
| extra_dhcp_opts | |
| fixed_ips | ip_address='10.10.0.171', subnet_id='649c956c-1516-4d92-a6bc-ce936d8a880d' |
| hardware_offload_type | None |
| id | 33f4e82d-fa74-4961-b0cd-4ae39a51b4a0 |
| ip_allocation | None |
| mac_address | fa:16:3e:f0:25:ee |
| name | VDU2_CP1-2 |
| network_id | 6a3aeb3a-fb8b-4d27-a5f1-4f148aeb303f |
| numa_affinity_policy | None |
| port_security_enabled | True |
| project_id | ebbc6cf1a03d49918c8e408535d87268 |
| propagate_uplink_status | None |
| qos_network_policy_id | None |
| qos_policy_id | None |
| resource_request | None |
| revision_number | 1 |
| security_group_ids | fcca932a-c14b-4e67-825c-848a62b54acc |
| status | DOWN |
| tags | |
| trunk_details | None |
| updated_at | 2023-11-08T04:58:04Z |
+-------------------------+----------------------------------------------------------------------------+
$ python3 pkggen.py
#####################################################################
# Run pre.py if an error occurs #
# - If an error occurs, run the pre.py script in advance #
# to create the openstack resource required to run this script. #
# Run post.py when you finish tests #
# - When you no longer need these openstack resources #
# after testing, run post.py and delete them. #
# vnfc ids should be changed in heal req files by show vnf manually.#
#####################################################################
$ ll
...
drwxr-xr-x 6 stack stack 4096 Nov 5 23:46 contents/
-rw-r--r-- 1 stack stack 6656 Nov 5 23:46 pkggen.py
-rw-rw-r-- 1 stack stack 15772614 Nov 8 06:35 basic_lcms_max_individual_vnfc.zip
...
注意
此工具需要一些 Tacker 模块,因此需要在安装了 Tacker 的环境中运行它,例如使用 devstack 的 python 虚拟环境。如果已在 python 虚拟环境中安装了 Tacker,请在使用该工具之前激活它,如下所示。
$ source /opt/stack/data/venv/bin/activate
(venv) $ python3 pkggen.py
完成上述操作后,您将获得示例 VNF 包 basic_lcms_max_individual_vnfc.zip。
注意
如果存在与正在生成的 zip 文件同名的文件,该工具将失败。 再次运行该工具以生成 zip 文件时,请删除或重命名旧的 zip 文件。
VNF 部署过程(作为虚拟机)¶
为了将 VNF 部署为 VM,有必要执行以下步骤。 CLI 命令的详细信息在 VNF 包管理 和 使用 v2 Tacker 进行 VNF 生命周期管理 中描述。
1. 创建 VNF 包信息¶
执行以下 CLI 命令以创建 VNF 包。
$ openstack vnf package create
结果
+-------------------+-------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------------+-------------------------------------------------------------------------------------------------+
| ID | aeb0f04a-06a5-40d5-b5dd-73720a886da4 |
| Links | { |
| | "self": { |
| | "href": "/vnfpkgm/v1/vnf_packages/aeb0f04a-06a5-40d5-b5dd-73720a886da4" |
| | }, |
| | "packageContent": { |
| | "href": "/vnfpkgm/v1/vnf_packages/aeb0f04a-06a5-40d5-b5dd-73720a886da4/package_content" |
| | } |
| | } |
| Onboarding State | CREATED |
| Operational State | DISABLED |
| Usage State | NOT_IN_USE |
| User Defined Data | {} |
+-------------------+-------------------------------------------------------------------------------------------------+
之后,执行以下 CLI 命令并确认 VNF 包创建成功。
确认“Onboarding State”为“CREATED”。
确认“Operational State”为“DISABLED”。
确认“Usage State”为“NOT_IN_USE”。
$ openstack vnf package show VNF_PACKAGE_ID \
-c 'Onboarding State' -c 'Operational State' -c 'Usage State'
结果
+-------------------+------------+
| Field | Value |
+-------------------+------------+
| Onboarding State | CREATED |
| Operational State | DISABLED |
| Usage State | NOT_IN_USE |
+-------------------+------------+
2. 上传 VNF 包¶
执行以下 CLI 命令以上传 VNF 包。
$ openstack vnf package upload --path sample_csar.zip VNF_PACKAGE_ID
结果
Upload request for VNF package aeb0f04a-06a5-40d5-b5dd-73720a886da4 has been accepted.
之后,执行以下 CLI 命令并确认 VNF 包上传成功。
确认“Onboarding State”为“ONBOARDED”。
确认“Operational State”为“ENABLED”。
确认“Usage State”为“NOT_IN_USE”。
记下“VNFD ID”,因为您将在下一个“Create VNF Identifier”中使用它。
注意
“Onboarding State”的状态按“UPLOADING”、“PROCESSING”、“ONBOARDED”的顺序变化。
$ openstack vnf package show VNF_PACKAGE_ID \
-c 'Onboarding State' -c 'Operational State' -c 'Usage State' -c 'VNFD ID'
结果
+-------------------+--------------------------------------+
| Field | Value |
+-------------------+--------------------------------------+
| Onboarding State | ONBOARDED |
| Operational State | ENABLED |
| Usage State | NOT_IN_USE |
| VNFD ID | 005b0c0a-45a7-45b7-85b7-f7457227f241 |
+-------------------+--------------------------------------+
3. 创建 VNF 标识符¶
执行以下 CLI 命令以创建 VNF 实例。
$ openstack vnflcm create VNFD_ID --os-tacker-api-version 2
结果
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| ID | 394575b8-50ae-43a2-9aa6-a7691ea10794 |
| Instantiation State | NOT_INSTANTIATED |
| Links | { |
| | "self": { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/394575b8-50ae-43a2-9aa6-a7691ea10794" |
| | }, |
| | "instantiate": { |
| | "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/394575b8-50ae-43a2-9aa6-a7691ea10794/instantiate" |
| | } |
| | } |
| VNF Configurable Properties | |
| VNF Instance Description | |
| VNF Instance Name | |
| VNF Product Name | Sample VNF |
| VNF Provider | Company |
| VNF Software Version | 1.0 |
| VNFD ID | 005b0c0a-45a7-45b7-85b7-f7457227f241 |
| VNFD Version | 1.0 |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
之后,执行以下 CLI 命令并确认 VNF 实例创建成功。
确认 VNF 包的“Usage State”为“IN_USE”。
确认 VNF 实例的“Instantiation State”为“NOT_INSTANTIATED”。
$ openstack vnf package show VNF_PACKAGE_ID -c 'Usage State'
结果
+-------------+--------+
| Field | Value |
+-------------+--------+
| Usage State | IN_USE |
+-------------+--------+
$ openstack vnflcm show VNF_INSTANCE_ID \
-c 'Instantiation State' --os-tacker-api-version 2
结果
+---------------------+------------------+
| Field | Value |
+---------------------+------------------+
| Instantiation State | NOT_INSTANTIATED |
+---------------------+------------------+
4. 实例化 VNF¶
使用以下格式创建 sample_param_file.json 文件。 这是定义实例化请求参数的文件。 这些参数将在实例化请求的主体中设置。
必需参数
flavourId
additionalParams
注意
flavorId 的详细信息在 基于 ETSI NFV-SOL001 的 VNF 描述符 (VNFD) 中描述。
注意
additionalParams 是一个可以通过 KeyValuePairs 描述的参数。 通过在此参数中设置以下两个参数,可以使用 LCM 操作用户数据进行实例化。 对于 file_name.py 和 class_name,请设置 Prerequisites 中描述的文件名和类名。
lcm-operation-user-data: ./UserData/file_name.py
lcm-operation-user-data-class: class_name
可选参数
instantiationLevelId
extVirtualLinks
extManagedVirtualLinks
vimConnectionInfo
localizationLanguage
extensions
vnfConfigurableProperties
注意
只有在您拥有 VIM 管理 中描述的默认 VIM 时,才能跳过 vimConnectionInfo。
注意
此操作可以指定 VNF 实例的 vimConnectionInfo。即使此操作指定与一个 VNF 实例关联的多个 vimConnectionInfo,也只会使用其中一个用于生命周期管理操作。
仅包含必需参数的参数文件
{
"flavourId":"simple",
"additionalParams": {
"lcm-operation-user-data": "./UserData/userdata_standard.py",
"lcm-operation-user-data-class": "StandardUserData"
}
}
包含可选参数的参数文件
{
"flavourId": "simple",
"instantiationLevelId": "instantiation_level_1",
"extVirtualLinks": [
{
"id": "279b0e12-2cc7-48d3-89dc-c58369841763",
"vimConnectionId": "vim1",
"resourceProviderId": "Company",
"resourceId": "6a3aeb3a-fb8b-4d27-a5f1-4f148aeb303f",
"extCps": [
{
"cpdId": "VDU1_CP1",
"cpConfig": {
"VDU1_CP1": {
"parentCpConfigId": "a9d72e2b-9b2f-48b8-9ca0-217ab3ba6f33",
"cpProtocolData": [
{
"layerProtocol": "IP_OVER_ETHERNET",
"ipOverEthernet": {
"ipAddresses": [
{
"type": "IPV4",
"numDynamicAddresses": 1,
"subnetId": "649c956c-1516-4d92-a6bc-ce936d8a880d"
}
]
}
}
]
}
}
}
],
"extLinkPorts": [
{
"id": "2871f033-5e38-4f5f-af26-09c6390648a8",
"resourceHandle": {
"resourceId": "389ade82-7618-4b42-bc90-5ebbac0863cf"
}
}
]
}
],
"extManagedVirtualLinks": [
{
"id": "c381e923-6208-43ac-acc9-f3afec76535a",
"vnfVirtualLinkDescId": "internalVL1",
"vimConnectionId": "vim1",
"resourceProviderId": "Company",
"resourceId": "9a94da3c-239f-469d-8cf9-5313a4e3961a",
"extManagedMultisiteVirtualLinkId": "f850522e-c124-4ed9-8027-f15abc22e21d"
}
],
"vimConnectionInfo": {
"vim1": {
"vimId": "4db40866-054f-472d-b559-811e5aa7195c",
"vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_3",
"interfaceInfo": {
"endpoint": "https:///identity/v3"
},
"accessInfo": {
"username": "nfv_user",
"region": "RegionOne",
"password": "devstack",
"project": "nfv",
"projectDomain": "Default",
"userDomain": "Default"
},
"extra": {
"dummy-key": "dummy-val"
}
}
},
"localizationLanguage": "ja",
"additionalParams": {
"lcm-operation-user-data": "./UserData/userdata_standard.py",
"lcm-operation-user-data-class": "StandardUserData"
},
"extensions": {
"key": "value"
},
"vnfConfigurableProperties": {
"key": "value"
}
}
执行以下 CLI 命令以实例化 VNF 实例。
$ openstack vnflcm --os-tacker-api-version 2 instantiate VNF_INSTANCE_ID \
./sample_param_file.json
结果
Instantiate request for VNF Instance 394575b8-50ae-43a2-9aa6-a7691ea10794 has been accepted.
之后,执行以下 CLI 命令并确认 VNF 实例实例化成功。
确认“Instantiation State”为“INSTANTIATED”。
$ openstack vnflcm show VNF_INSTANCE_ID \
-c 'Instantiation State' --os-tacker-api-version 2
结果
+---------------------+--------------+
| Field | Value |
+---------------------+--------------+
| Instantiation State | INSTANTIATED |
+---------------------+--------------+
5. 终止 VNF¶
执行以下 CLI 命令以终止 VNF 实例。
$ openstack vnflcm terminate VNF_INSTANCE_ID --os-tacker-api-version 2
结果
Terminate request for VNF Instance '394575b8-50ae-43a2-9aa6-a7691ea10794' has been accepted.
之后,执行以下 CLI 命令并确认 VNF 实例终止成功。
确认“Instantiation State”为“NOT_INSTANTIATED”。
$ openstack vnflcm show VNF_INSTANCE_ID \
-c 'Instantiation State' --os-tacker-api-version 2
结果
+---------------------+------------------+
| Field | Value |
+---------------------+------------------+
| Instantiation State | NOT_INSTANTIATED |
+---------------------+------------------+
6. 删除 VNF 标识符¶
执行以下 CLI 命令以删除 VNF 实例。
$ openstack vnflcm delete VNF_INSTANCE_ID --os-tacker-api-version 2
结果
Vnf instance '394575b8-50ae-43a2-9aa6-a7691ea10794' is deleted successfully
之后,执行以下 CLI 命令并确认 VNF 实例删除成功。
确认 VNF 包的“Usage State”为“NOT_IN_USE”。
确认未找到 VNF 实例。
$ openstack vnf package show VNF_PACKAGE_ID -c 'Usage State'
结果
+-------------+------------+
| Field | Value |
+-------------+------------+
| Usage State | NOT_IN_USE |
+-------------+------------+
$ openstack vnflcm show VNF_INSTANCE_ID --os-tacker-api-version 2
结果
VnfInstance 394575b8-50ae-43a2-9aa6-a7691ea10794 not found.