Getting Started with v1 Tacker¶
摘要¶
本讲座将使您能够
在 OpenStack 上使用 Tacker v1 API 创建和删除示例 VNF
注意
本文档是关于 Tacker v1 API 的。有关 Tacker v2 API,请参阅 Getting Started with v2 Tacker。
本讲座介绍了 Tacker 支持的两种 VNF 部署类型。
“使用 LCM 操作用户数据的 VNF 部署”是可选的。该部分将用以下标注进行说明 [这是特定于 UserData 的部分]。
下图显示了本讲座中使用的示例 VNF。
注意
VIM 配置、VNF 包和实例化参数用于本教程,并放置在仓库中。
注意
您可以使用以下命令查看 Tacker 的日志
$ sudo journalctl -u devstack@tacker.service
$ sudo journalctl -u devstack@tacker-conductor.service
先决条件¶
应安装以下软件包
tacker
python-tackerclient
配置¶
加载客户端操作的凭据¶
在运行任何 Tacker 命令之前,需要先获取您的凭据。
注意
有关详细信息,请参阅 创建 OpenStack 客户端环境脚本。 在本文档中,设置如下
OS_REGION_NAME=RegionOne
OS_PROJECT_DOMAIN_ID=default
OS_CACERT=
OS_AUTH_URL=http://192.168.56.10/identity
OS_TENANT_NAME=admin
OS_USER_DOMAIN_ID=default
OS_USERNAME=admin
OS_VOLUME_API_VERSION=3
OS_AUTH_TYPE=password
OS_PROJECT_NAME=admin
OS_PASSWORD=devstack
OS_IDENTITY_API_VERSION=3
您可以通过检查以下命令是否无错误地运行来确认 Tacker 可用
$ openstack vim list
注意
请参阅 命令行界面参考 以查找所有可用命令。
注册 VIM¶
准备 VIM 配置文件
您可以使用设置脚本生成 VIM 配置文件,也可以按照 注册 VIM 的配置文件 中所述从头开始编辑它。 该脚本从您的环境变量中查找配置参数,例如用户名或密码。 以下是生成 OpenStack VIM 配置文件的示例,名为
vim_config.yaml。 在本文档中,TACKER_ROOT是您服务器上 tacker 仓库的根目录。$ bash TACKER_ROOT/tools/gen_vim_config.sh Config for OpenStack VIM 'vim_config.yaml' generated.
支持从命令行配置参数的几种选项。 有关详细信息,请参阅帮助信息
-h。您也可以使用示例配置文件 vim_config.yaml 代替使用该脚本。
$ cp TACKER_ROOT/samples/etsi_getting_started/tosca/vim/vim_config.yaml ./ $ vi vim_config.yaml
auth_url: 'http://127.0.0.1/identity' username: 'admin' password: 'devstack' project_name: 'admin' domain_name: "default" project_domain_name: 'default' user_domain_name: 'default' cert_verify: 'True'
注册默认 VIM
设置好 VIM 配置文件后,您可以通过
openstack命令使用--is-default选项注册默认 VIM。$ openstack vim register --config-file ./vim_config.yaml \ --is-default --fit-width openstack-admin-vim +----------------+-----------------------------------------------------+ | Field | Value | +----------------+-----------------------------------------------------+ | auth_cred | { | | | "username": "admin", | | | "user_domain_name": "default", | | | "cert_verify": "True", | | | "project_id": null, | | | "project_name": "admin", | | | "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-12-21 07:39:09.617234 | | description | | | extra | | | id | 662e5f4f-3b16-4ca6-b560-28b62dd0e13b | | is_default | True | | name | openstack-admin-vim | | placement_attr | { | | | "regions": [ | | | "RegionOne" | | | ] | | | } | | project_id | 1994d69783d64c00aadab564038c2fd7 | | status | ACTIVE | | type | openstack | | updated_at | None | | vim_project | { | | | "name": "admin", | | | "project_domain_name": "default" | | | } | +----------------+-----------------------------------------------------+
确认已注册 VIM 的状态为
ACTIVE,表示已准备好使用$ openstack vim list +--------------------------------------+---------------------+----------------------------------+-----------+------------+--------+ | ID | Name | Tenant_id | Type | Is Default | Status | +--------------------------------------+---------------------+----------------------------------+-----------+------------+--------+ | 662e5f4f-3b16-4ca6-b560-28b62dd0e13b | openstack-admin-vim | 1994d69783d64c00aadab564038c2fd7 | openstack | True | ACTIVE | +--------------------------------------+---------------------+----------------------------------+-----------+------------+--------+
创建并上传 VNF 包¶
准备 VNF 包¶
创建 VNF 包 CSAR 目录
$ mkdir -p ./sample_vnf_package_csar/TOSCA-Metadata \ ./sample_vnf_package_csar/Definitions \ ./sample_vnf_package_csar/Files/images
[这是特定于 UserData 的部分] 使用 UserData 时,除了创建以下目录。
$ mkdir -p ./sample_vnf_package_csar/BaseHOT/simple \ ./sample_vnf_package_csar/UserData
创建一个
TOSCA.meta文件$ vi ./sample_vnf_package_csar/TOSCA-Metadata/TOSCA.meta
TOSCA-Meta-File-Version: 1.0 Created-by: Dummy User CSAR-Version: 1.1 Entry-Definitions: Definitions/sample_vnfd_top.yaml
下载镜像文件
$ cd ./sample_vnf_package_csar/Files/images $ wget https://download.cirros-cloud.net/0.5.2/cirros-0.5.2-x86_64-disk.img
下载 ETSI 定义文件
您应该将
${TOSCA_VERSION}设置为适当的 TOSCA 服务模板版本之一 (SOL001),例如export TOSCA_VERSION=v2.6.1。重要提示
您还应该检查 tacker 是否支持 TOSCA 服务模板的版本。 请参阅 基于 ETSI NFV-SOL001 的 VNF 描述符 (VNFD) 以获取支持的版本。
$ cd - $ cd ./sample_vnf_package_csar/Definitions $ wget https://forge.etsi.org/rep/nfv/SOL001/raw/${TOSCA_VERSION}/etsi_nfv_sol001_common_types.yaml $ wget https://forge.etsi.org/rep/nfv/SOL001/raw/${TOSCA_VERSION}/etsi_nfv_sol001_vnfd_types.yaml
创建 VNFD 文件
创建
sample_vnfd_top.yaml$ vi ./sample_vnfd_top.yaml
tosca_definitions_version: tosca_simple_yaml_1_2 description: Sample VNF imports: - etsi_nfv_sol001_common_types.yaml - etsi_nfv_sol001_vnfd_types.yaml - sample_vnfd_types.yaml - sample_vnfd_df_simple.yaml topology_template: inputs: selected_flavour: type: string description: VNF deployment flavour selected by the consumer. It is provided in the API node_templates: VNF: type: company.provider.VNF properties: flavour_id: { get_input: selected_flavour } descriptor_id: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 provider: Company product_name: Sample VNF software_version: '1.0' descriptor_version: '1.0' vnfm_info: - Tacker requirements: #- virtual_link_external # mapped in lower-level templates #- virtual_link_internal # mapped in lower-level templates
创建
sample_vnfd_types.yaml$ vi ./sample_vnfd_types.yaml
tosca_definitions_version: tosca_simple_yaml_1_2 description: VNF type definition imports: - etsi_nfv_sol001_common_types.yaml - etsi_nfv_sol001_vnfd_types.yaml node_types: company.provider.VNF: derived_from: tosca.nodes.nfv.VNF properties: id: type: string description: ID of this VNF default: vnf_id vendor: type: string description: name of the vendor who generate this VNF default: vendor version: type: version description: version of the software for this VNF default: 1.0 descriptor_id: type: string constraints: [ valid_values: [ b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 ] ] default: b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 descriptor_version: type: string constraints: [ valid_values: [ '1.0' ] ] default: '1.0' provider: type: string constraints: [ valid_values: [ 'Company' ] ] default: 'Company' product_name: type: string constraints: [ valid_values: [ 'Sample VNF' ] ] default: 'Sample VNF' software_version: type: string constraints: [ valid_values: [ '1.0' ] ] default: '1.0' vnfm_info: type: list entry_schema: type: string constraints: [ valid_values: [ Tacker ] ] default: [ Tacker ] flavour_id: type: string constraints: [ valid_values: [ simple ] ] default: simple flavour_description: type: string default: This is the default flavour description requirements: - virtual_link_internal: capability: tosca.capabilities.nfv.VirtualLinkable interfaces: Vnflcm: type: tosca.interfaces.nfv.Vnflcm
注意
description_id必须全局唯一,即您不能使用相同的description_id创建多个 VNFD。创建
sample_vnfd_df_simple.yaml$ vi ./sample_vnfd_df_simple.yaml
tosca_definitions_version: tosca_simple_yaml_1_2 description: Simple deployment flavour for Sample VNF imports: - etsi_nfv_sol001_common_types.yaml - etsi_nfv_sol001_vnfd_types.yaml - sample_vnfd_types.yaml topology_template: inputs: id: type: string vendor: type: string version: type: version descriptor_id: type: string descriptor_version: type: string provider: type: string product_name: type: string software_version: type: string vnfm_info: type: list entry_schema: type: string flavour_id: type: string flavour_description: type: string substitution_mappings: node_type: company.provider.VNF properties: flavour_id: simple requirements: virtual_link_external: [] node_templates: VNF: type: company.provider.VNF properties: flavour_description: A simple flavour interfaces: Vnflcm: instantiate: [] instantiate_start: [] instantiate_end: [] terminate: [] terminate_start: [] terminate_end: [] modify_information: [] modify_information_start: [] modify_information_end: [] VDU1: type: tosca.nodes.nfv.Vdu.Compute properties: name: VDU1 description: VDU1 compute node vdu_profile: min_number_of_instances: 1 max_number_of_instances: 1 sw_image_data: name: Software of VDU1 version: '0.5.2' checksum: algorithm: sha-512 hash: 6b813aa46bb90b4da216a4d19376593fa3f4fc7e617f03a92b7fe11e9a3981cbe8f0959dbebe36225e5f53dc4492341a4863cac4ed1ee0909f3fc78ef9c3e869 container_format: bare disk_format: qcow2 min_disk: 1 GB size: 1 GB artifacts: sw_image: type: tosca.artifacts.nfv.SwImage file: ../Files/images/cirros-0.5.2-x86_64-disk.img capabilities: virtual_compute: properties: virtual_memory: virtual_mem_size: 512 MB virtual_cpu: num_virtual_cpu: 1 virtual_local_storage: - size_of_storage: 1 GB CP1: type: tosca.nodes.nfv.VduCp properties: layer_protocols: [ ipv4 ] requirements: - virtual_binding: VDU1 - virtual_link: internalVL1 internalVL1: type: tosca.nodes.nfv.VnfVirtualLink properties: connectivity_type: layer_protocols: [ ipv4 ] description: Internal Virtual link in the VNF vl_profile: max_bitrate_requirements: root: 1048576 leaf: 1048576 min_bitrate_requirements: root: 1048576 leaf: 1048576 virtual_link_protocol_data: - associated_layer_protocol: ipv4 l3_protocol_data: ip_version: ipv4 cidr: 10.0.0.0/24
注意
“VNF”中的
flavour_description应该更新,但 Tacker 无法处理它。实例化后,sample_vnfd_types.yaml中的默认值始终被使用。
[这是特定于 UserData 的部分] 创建 BaseHOT 文件
$ cd - $ vi ./sample_vnf_package_csar/BaseHOT/simple/sample_lcm_with_user_data_hot.yaml
heat_template_version: 2013-05-23 description: 'Template for test _generate_hot_from_tosca().' parameters: nfv: type: json resources: VDU1: type: OS::Nova::Server properties: flavor: get_resource: VDU1_flavor name: VDU1 image: { get_param: [ nfv, VDU, VDU1, image ] } networks: - port: get_resource: CP1 CP1: type: OS::Neutron::Port properties: network: { get_param: [ nfv, CP, CP1, network ] } VDU1_flavor: type: OS::Nova::Flavor properties: ram: { get_param: [ nfv, VDU, VDU1, flavor, ram ] } vcpus: { get_param: [ nfv, VDU, VDU1, flavor, vcpus ] } disk: { get_param: [ nfv, VDU, VDU1, flavor, disk ] } outputs: {}
[这是特定于 UserData 的部分] 创建 UserData 文件
$ cd ./sample_vnf_package_csar/UserData/ $ touch ./__init__.py $ vi ./lcm_user_data.py
# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # https://apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import tacker.vnfm.lcm_user_data.utils as UserDataUtil from tacker.vnfm.lcm_user_data.abstract_user_data import AbstractUserData class SampleUserData(AbstractUserData): @staticmethod def instantiate(base_hot_dict=None, vnfd_dict=None, inst_req_info=None, grant_info=None): # Create HOT input parameter using util functions. initial_param_dict = UserDataUtil.create_initial_param_dict( base_hot_dict) vdu_flavor_dict = UserDataUtil.create_vdu_flavor_dict(vnfd_dict) vdu_image_dict = UserDataUtil.create_sw_image_dict(vnfd_dict) cpd_vl_dict = UserDataUtil.create_network_dict( inst_req_info, initial_param_dict) final_param_dict = UserDataUtil.create_final_param_dict( initial_param_dict, vdu_flavor_dict, vdu_image_dict, cpd_vl_dict) return final_param_dict
将 VNF 包 CSAR 压缩为 zip 文件
$ cd - $ cd ./sample_vnf_package_csar $ zip sample_vnf_package_csar.zip -r Definitions/ Files/ TOSCA-Metadata/
zip 文件中的内容应如下所示。
$ unzip -Z -1 sample_vnf_package_csar.zip Definitions/ Definitions/etsi_nfv_sol001_vnfd_types.yaml Definitions/sample_vnfd_top.yaml Definitions/etsi_nfv_sol001_common_types.yaml Definitions/sample_vnfd_types.yaml Definitions/sample_vnfd_df_simple.yaml Files/ Files/images/ Files/images/cirros-0.5.2-x86_64-disk.img TOSCA-Metadata/ TOSCA-Metadata/TOSCA.meta
[这是特定于 UserData 的部分] 使用 UserData 时,添加
BaseHOT和UserData目录。$ zip sample_vnf_package_csar.zip -r BaseHOT/ UserData/
zip 文件中的内容应如下所示。
$ unzip -Z -1 sample_vnf_package_csar.zip BaseHOT/ BaseHOT/simple/ BaseHOT/simple/sample_lcm_with_user_data_hot.yaml Definitions/ Definitions/etsi_nfv_sol001_vnfd_types.yaml Definitions/sample_vnfd_top.yaml Definitions/etsi_nfv_sol001_common_types.yaml Definitions/sample_vnfd_types.yaml Definitions/sample_vnfd_df_simple.yaml Files/ Files/images/ Files/images/cirros-0.5.2-x86_64-disk.img TOSCA-Metadata/ TOSCA-Metadata/TOSCA.meta UserData/ UserData/lcm_user_data.py UserData/__init__.py
在这里,您可以找到示例 VNF 包 CSAR 作为 zip 文件的结构。
创建 VNF 包¶
执行 vnfpkgm create
记下“VNF 包 ID”,因为它将在下一步中使用。
$ cd -
$ openstack vnf package create +-------------------+-------------------------------------------------------------------------------------------------+ | Field | Value | +-------------------+-------------------------------------------------------------------------------------------------+ | ID | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d | | Links | { | | | "self": { | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d" | | | }, | | | "packageContent": { | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d/package_content" | | | } | | | } | | Onboarding State | CREATED | | Operational State | DISABLED | | Usage State | NOT_IN_USE | | User Defined Data | {} | +-------------------+-------------------------------------------------------------------------------------------------+
上传 VNF 包¶
执行 vnfpkgm upload
“VNF 包 ID”
156f1c4f-bfe2-492b-a079-a1bad32c0c3d需要替换为从 创建 VNF 包 中获得的适当 ID。$ openstack vnf package upload \ --path ./sample_vnf_package_csar/sample_vnf_package_csar.zip \ 156f1c4f-bfe2-492b-a079-a1bad32c0c3d Upload request for VNF package 156f1c4f-bfe2-492b-a079-a1bad32c0c3d has been accepted.
检查创建的 VNF 包¶
确认“入职状态”为
ONBOARDED(可能需要 30 秒以上)$ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | Links | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d | | PROCESSING | NOT_IN_USE | DISABLED | { | | | | | | | "self": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d" | | | | | | | }, | | | | | | | "packageContent": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d/package_content" | | | | | | | } | | | | | | | } | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ $ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | Links | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d | Sample VNF | ONBOARDED | NOT_IN_USE | ENABLED | { | | | | | | | "self": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d" | | | | | | | }, | | | | | | | "packageContent": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d/package_content" | | | | | | | } | | | | | | | } | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+
创建和实例化 VNF¶
创建 VNF¶
查找“VNFD ID”以创建 VNF
“VNFD-ID”可以在示例中找到为
b1bb0ce7-ebca-4fa7-95ed-4840d70a1177。$ openstack vnf package show \ 156f1c4f-bfe2-492b-a079-a1bad32c0c3d -c 'VNFD ID' +---------+--------------------------------------+ | Field | Value | +---------+--------------------------------------+ | VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | +---------+--------------------------------------+
创建 VNF
“VNFD ID”
b1bb0ce7-ebca-4fa7-95ed-4840d70a1177需要替换为适当的 ID。$ openstack vnflcm create b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 +-----------------------------+------------------------------------------------------------------------------------------------------------------+ | Field | Value | +-----------------------------+------------------------------------------------------------------------------------------------------------------+ | ID | 810d8c9b-e467-4b06-9265-ac9dce015fce | | Instantiation State | NOT_INSTANTIATED | | Links | { | | | "self": { | | | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce" | | | }, | | | "instantiate": { | | | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce/instantiate" | | | } | | | } | | VNF Configurable Properties | | | VNF Instance Description | | | VNF Instance Name | vnf-810d8c9b-e467-4b06-9265-ac9dce015fce | | VNF Package ID | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d | | VNF Product Name | Sample VNF | | VNF Provider | Company | | VNF Software Version | 1.0 | | VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | | VNFD Version | 1.0 | +-----------------------------+------------------------------------------------------------------------------------------------------------------+
实例化 VNF¶
创建
<param-file>必需参数
flavourId
可选参数
instantiationLevelId
extVirtualLinks
extManagedVirtualLinks
vimConnectionInfo
additionalParams
注意
只有在您拥有默认 VIM 时,才能跳过
vimConnectionInfo。一个名为
sample_param_file.json的示例<param-file>,其中包含最少的参数$ vi ./sample_param_file.json
使用 TOSCA 时,使用以下参数。
{ "flavourId": "simple", "vimConnectionInfo": [ { "id": "e24f9796-a8e9-4cb0-85ce-5920dcddafa1", "vimId": "${vim_uuid}", "vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_2" } ] }
[这是特定于 UserData 的部分] 使用 UserData 时,请使用以下参数。
{ "flavourId": "simple", "extVirtualLinks": [ { "id": "net0", "resourceId": "${network_uuid}", "extCps": [ { "cpdId": "CP1", "cpConfig": [ { "cpProtocolData": [ { "layerProtocol": "IP_OVER_ETHERNET", "ipOverEthernet": { "ipAddresses": [ { "type": "IPV4", "numDynamicAddresses": 1, "subnetId": "${subnet_uuid}" } ] } } ] } ] } ] } ], "vimConnectionInfo": [ { "id": "e24f9796-a8e9-4cb0-85ce-5920dcddafa1", "vimId": "${vim_uuid}", "vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_2" } ], "additionalParams": { "lcm-operation-user-data": "./UserData/lcm_user_data.py", "lcm-operation-user-data-class": "SampleUserData" } }
${network_uuid}、${subnet_uuid}和${vim_uuid}应该替换为要使用的网络的 uuid、要使用的子网的 uuid 以及要使用的 VIM 的 uuid,分别。实例化 VNF
“VNF 实例的 ID”和“指向 <param-file> 的路径”是实例化 vnf 所必需的。
$ openstack vnflcm instantiate \ 810d8c9b-e467-4b06-9265-ac9dce015fce ./sample_param_file.json Instantiate request for VNF Instance 810d8c9b-e467-4b06-9265-ac9dce015fce has been accepted.
检查实例化 vnf 的详细信息。
$ openstack vnflcm list +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | ID | VNF Instance Name | Instantiation State | VNF Provider | VNF Software Version | VNF Product Name | VNFD ID | +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | 810d8c9b-e467-4b06-9265-ac9dce015fce | vnf-810d8c9b-e467-4b06-9265-ac9dce015fce | INSTANTIATED | Company | 1.0 | Sample VNF | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ $ openstack vnflcm show 810d8c9b-e467-4b06-9265-ac9dce015fce +-----------------------------+----------------------------------------------------------------------------------------------------------------------+ | Field | Value | +-----------------------------+----------------------------------------------------------------------------------------------------------------------+ | ID | 810d8c9b-e467-4b06-9265-ac9dce015fce | | Instantiated Vnf Info | { | | | "flavourId": "simple", | | | "vnfState": "STARTED", | | | "extCpInfo": [], | | | "vnfcResourceInfo": [ | | | { | | | "id": "6894448f-4a88-45ec-801f-4ef455e8a613", | | | "vduId": "VDU1", | | | "computeResource": { | | | "vimConnectionId": "662e5f4f-3b16-4ca6-b560-28b62dd0e13b", | | | "resourceId": "cfb5d6de-90a1-433a-9af4-1159ca279e27", | | | "vimLevelResourceType": "OS::Nova::Server" | | | }, | | | "storageResourceIds": [], | | | "vnfcCpInfo": [ | | | { | | | "id": "b6dffe31-2e4b-44e6-8ddd-b94608a9210b", | | | "cpdId": "CP1", | | | "vnfExtCpId": null, | | | "vnfLinkPortId": "5040ae0d-ef8b-4d12-b96b-d9d05a0ba7fe" | | | } | | | ] | | | } | | | ], | | | "vnfVirtualLinkResourceInfo": [ | | | { | | | "id": "4b67e6f9-8133-4f7d-b384-abd64f9bcbac", | | | "vnfVirtualLinkDescId": "internalVL1", | | | "networkResource": { | | | "vimConnectionId": "662e5f4f-3b16-4ca6-b560-28b62dd0e13b", | | | "resourceId": "d04beb5f-b29a-4f7e-b32b-7ea669afa3eb", | | | "vimLevelResourceType": "OS::Neutron::Net" | | | }, | | | "vnfLinkPorts": [ | | | { | | | "id": "5040ae0d-ef8b-4d12-b96b-d9d05a0ba7fe", | | | "resourceHandle": { | | | "vimConnectionId": "662e5f4f-3b16-4ca6-b560-28b62dd0e13b", | | | "resourceId": "84edd7c7-a02f-4f25-be2a-a0ee5b1c8dc7", | | | "vimLevelResourceType": "OS::Neutron::Port" | | | }, | | | "cpInstanceId": "b6dffe31-2e4b-44e6-8ddd-b94608a9210b" | | | } | | | ] | | | } | | | ], | | | "vnfcInfo": [ | | | { | | | "id": "6c0ba2a3-3f26-4ba0-9b4f-db609b2e843c", | | | "vduId": "VDU1", | | | "vnfcState": "STARTED" | | | } | | | ], | | | "additionalParams": {} | | | } | | Instantiation State | INSTANTIATED | | Links | { | | | "self": { | | | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce" | | | }, | | | "terminate": { | | | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce/terminate" | | | }, | | | "scale": { | | | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce/scale" | | | }, | | | "heal": { | | | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce/heal" | | | }, | | | "changeExtConn": { | | | "href": "https://:9890/vnflcm/v1/vnf_instances/810d8c9b-e467-4b06-9265-ac9dce015fce/change_ext_conn" | | | } | | | } | | VIM Connection Info | [ | | | { | | | "id": "e24f9796-a8e9-4cb0-85ce-5920dcddafa1", | | | "vimId": "662e5f4f-3b16-4ca6-b560-28b62dd0e13b", | | | "vimType": "ETSINFV.OPENSTACK_KEYSTONE.V_2", | | | "interfaceInfo": {}, | | | "accessInfo": {}, | | | "extra": {} | | | }, | | | { | | | "id": "67820f17-a82a-4e3a-b200-8ef119646749", | | | "vimId": "662e5f4f-3b16-4ca6-b560-28b62dd0e13b", | | | "vimType": "openstack", | | | "interfaceInfo": {}, | | | "accessInfo": {}, | | | "extra": {} | | | } | | | ] | | VNF Configurable Properties | | | VNF Instance Description | | | VNF Instance Name | vnf-810d8c9b-e467-4b06-9265-ac9dce015fce | | VNF Package ID | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d | | VNF Product Name | Sample VNF | | VNF Provider | Company | | VNF Software Version | 1.0 | | VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | | VNFD Version | 1.0 | | metadata | tenant=admin | +-----------------------------+----------------------------------------------------------------------------------------------------------------------+
终止和删除 VNF¶
终止 VNF¶
检查要终止的 VNF 实例 ID
$ openstack vnflcm list +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | ID | VNF Instance Name | Instantiation State | VNF Provider | VNF Software Version | VNF Product Name | VNFD ID | +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | 810d8c9b-e467-4b06-9265-ac9dce015fce | vnf-810d8c9b-e467-4b06-9265-ac9dce015fce | INSTANTIATED | Company | 1.0 | Sample VNF | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+
终止 VNF 实例
执行终止命令
$ openstack vnflcm terminate 810d8c9b-e467-4b06-9265-ac9dce015fce Terminate request for VNF Instance '810d8c9b-e467-4b06-9265-ac9dce015fce' has been accepted.
检查 VNF 实例的状态
$ openstack vnflcm list +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | ID | VNF Instance Name | Instantiation State | VNF Provider | VNF Software Version | VNF Product Name | VNFD ID | +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | 810d8c9b-e467-4b06-9265-ac9dce015fce | vnf-810d8c9b-e467-4b06-9265-ac9dce015fce | NOT_INSTANTIATED | Company | 1.0 | Sample VNF | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | +--------------------------------------+------------------------------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+
删除 VNF¶
删除 VNF 实例
$ openstack vnflcm delete 810d8c9b-e467-4b06-9265-ac9dce015fce Vnf instance '810d8c9b-e467-4b06-9265-ac9dce015fce' is deleted successfully
删除 VNF 包¶
删除 VNF 包
检查要删除的 VNF 包 ID
$ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | Links | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d | Sample VNF | ONBOARDED | NOT_IN_USE | ENABLED | { | | | | | | | "self": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d" | | | | | | | }, | | | | | | | "packageContent": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d/package_content" | | | | | | | } | | | | | | | } | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+
将运行状态更新为
DISABLED$ openstack vnf package update --operational-state 'DISABLED' \ 156f1c4f-bfe2-492b-a079-a1bad32c0c3d +-------------------+----------+ | Field | Value | +-------------------+----------+ | Operational State | DISABLED | +-------------------+----------+
检查是否已更改运行状态
$ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | Links | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+ | 156f1c4f-bfe2-492b-a079-a1bad32c0c3d | Sample VNF | ONBOARDED | NOT_IN_USE | DISABLED | { | | | | | | | "self": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d" | | | | | | | }, | | | | | | | "packageContent": { | | | | | | | "href": "/vnfpkgm/v1/vnf_packages/156f1c4f-bfe2-492b-a079-a1bad32c0c3d/package_content" | | | | | | | } | | | | | | | } | +--------------------------------------+------------------+------------------+-------------+-------------------+-------------------------------------------------------------------------------------------------+
删除 VNF 包
$ openstack vnf package delete 156f1c4f-bfe2-492b-a079-a1bad32c0c3d All specified vnf-package(s) deleted successfully
故障排除¶
Neutron QoSPlugin 错误
Vnf instantiation failed for vnf 810d8c9b-e467-4b06-9265-ac9dce015fce, error: ERROR: HEAT-E99001 Service neutron is not available for resource type OS::Neutron::QoSPolicy, reason: Required extension qos in neutron service is not available.编辑
/etc/neutron/neutron.conf$ sudo vi /etc/neutron/neutron.conf
- service_plugins = ovn-router,networking_sfc.services.flowclassifier.plugin.FlowClassifierPlugin,networking_sfc.services.sfc.plugin.SfcPlugin + service_plugins = ovn-router,networking_sfc.services.flowclassifier.plugin.FlowClassifierPlugin,networking_sfc.services.sfc.plugin.SfcPlugin,neutron.services.qos.qos_plugin.QoSPlugin,qos
编辑
/etc/neutron/plugins/ml2/ml2_conf.ini$ sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini
- extension_drivers = port_security + extension_drivers = port_security,qos
重新启动 neutron 服务
$ sudo systemctl restart devstack@q-*
networking-sfc 中的错误
通过编辑
/etc/neutron/neutron.conf禁用 networking-sfc$ sudo vi /etc/neutron/neutron.conf
- service_plugins = ovn-router,networking_sfc.services.flowclassifier.plugin.FlowClassifierPlugin,networking_sfc.services.sfc.plugin.SfcPlugin,neutron.services.qos.qos_plugin.QoSPlugin,qos + service_plugins = ovn-router,neutron.services.qos.qos_plugin.QoSPlugin - [sfc] - drivers = ovs - [flowclassifier] - drivers = ovs
编辑
/etc/neutron/plugins/ml2/ml2_conf.ini$ sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini
- [agent] - extensions = sfc
重新启动 neutron 服务
$ sudo systemctl restart devstack@q-*