Getting Started with ETSI NFV-SOL Tacker¶
Summary¶
This lecture enables you to:
create & delete a sample VNF on the OpenStack with Tacker
Following two types of VNF deployment supported by Tacker are introduced in this lecture.
“VNF Deployment with LCM Operation User Data” is optional. The part will be clarified with the notation [This is UserData specific part].
The following figure shows a sample VNF used in this lecture.
Note
VIM config, a VNF package, and instantiation parameters used in this tutorial are placed at the repository.
Note
You can see logs of Tacker with this command:
$ sudo journalctl -u devstack@tacker.service
$ sudo journalctl -u devstack@tacker-conductor.service
Prerequisites¶
The following packages should be installed 5:
tacker
python-tackerclient
Configuration¶
Load credentials for client operations¶
Before any Tacker commands can be run, your credentials need to be sourced 6.
You can confirm that Tacker is available by checking this command works without error:
$ openstack vim list
Note
See CLI reference 7 to find all the available commands.
Register VIM¶
Create the
vim_config.yaml
:These parameters need to be changed as your environment. This is an example named as
vim_config.yaml
for devstack installed OpenStack VIM.$ vi ./vim_config.yaml
auth_url: 'http://127.0.0.1/identity' username: 'admin' password: 'devstack' project_name: 'admin' project_domain_name: 'Default' user_domain_name: 'Default' cert_verify: 'True'
Register the VIM as default VIM:
The parameter
--is-default
should be added to register the VIM as default. It helps you in the step of VNF instantiation.$ 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://127.0.0.1/identity/v3", | | | "key_type": "barbican_key", | | | "secret_uuid": "***", | | | "password": "***" | | | } | | auth_url | http://127.0.0.1/identity/v3 | | created_at | 2020-05-24 07:00:25.923831 | | description | | | id | 4bb57004-9e33-4c52-b5f9-629f876b4168 | | is_default | True | | name | openstack-admin-vim | | placement_attr | { | | | "regions": [ | | | "RegionOne" | | | ] | | | } | | project_id | d413421abf074c9b8f54a1403857038c | | status | PENDING | | type | openstack | | updated_at | None | | vim_project | { | | | "name": "admin", | | | "project_domain_name": "Default" | | | } | +----------------+-------------------------------------------------+
Check the status of registered VIM:
$ openstack vim list +------------+------------+------------+-----------+------------+-----------+ | ID | Name | Tenant_id | Type | Is Default | Status | +------------+------------+------------+-----------+------------+-----------+ | 4bb57004-9 | openstack- | d413421abf | openstack | True | REACHABLE | | e33-4c52-b | admin-vim | 074c9b8f54 | | | | | 5f9-629f87 | | a140385703 | | | | | 6b4168 | | 8c | | | | +------------+------------+------------+-----------+------------+-----------+
Create & Upload VNF Package¶
Prepare VNF Package¶
Create VNF Package CSAR directories:
$ mkdir -p ./sample_vnf_package_csar/TOSCA-Metadata \ ./sample_vnf_package_csar/Definitions \ ./sample_vnf_package_csar/Files
[This is UserData specific part] When using UserData, create the following directories in addition.
$ mkdir -p ./sample_vnf_package_csar/BaseHOT/simple \ ./sample_vnf_package_csar/UserData
Create
TOSCA.meata
file:$ 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
Download ETSI definition files:
You should set
${TOSCA_VERSION}
to one of the appropriate TOSCA service template versions 8, e.g.,export TOSCA_VERSION=v2.6.1
.Important
You should also check if the version of TOSCA service template is supported by tacker 9.
$ 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
Create VNFD files:
Create
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
Create
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
Note
description_id
shall be globally unique, i.e., you cannot create multiple VNFDs with the samedescription_id
.Create
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: # supporting only 'instantiate', 'terminate', 'modify', # and 'heal' # not supporting LCM script, supporting only default LCM instantiate: [] # instantiate_start: [] # instantiate_end: [] terminate: [] # terminate_start: [] # terminate_end: [] modify_information: [] # modify_information_start: [] # modify_information_end: [] # change_flavour: [] # change_flavour_start: [] # change_flavour_end: [] # change_external_connectivity: [] # change_external_connectivity_start: [] # change_external_connectivity_end: [] # operate: [] # operate_start: [] # operate_end: [] heal: [] # heal_start: [] # heal_end: [] # scale: [] # scale_start: [] # scale_end: [] # scale_to_level: [] # scale_to_level_start: [] # scale_to_level_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: cirros-0.5.2-x86_64-disk version: '0.5.2' checksum: algorithm: sha-256 hash: 932fcae93574e242dc3d772d5235061747dfe537668443a1f0567d893614b464 container_format: bare disk_format: qcow2 min_disk: 1 GB size: 1 GB 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
Note
The
flavour_description
should be updated by the property in “VNF” but Tacker cannot handle it. After the instantiation, the default value insample_vnfd_types.yaml
is always used.
[This is UserData specific part] Create BaseHOT files:
$ 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: {}
[This is UserData specific part] Create UserData files:
$ 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 # # http://www.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
Compress the VNF Package CSAR to zip:
$ cd - $ cd ./sample_vnf_package_csar $ zip sample_vnf_package_csar.zip -r Definitions/ Files/ TOSCA-Metadata/
The contents of the zip file should look something like this.
$ 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
[This is UserData specific part] When using UserData, add
BaseHOT
andUserData
directories.$ zip sample_vnf_package_csar.zip -r BaseHOT/ UserData/
The contents of the zip file should look something like this.
$ 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
Here, you can find the structure of the sample VNF Package CSAR as a zip file.
Create VNF Package¶
Execute vnfpkgm create:
Take a note of “VNF Package ID” as it will be used in the next step.
$ cd -
$ openstack vnf package create --fit-width +-------------------+----------------------------------------------------------------------------------------------------------------+ | Field | Value | +-------------------+----------------------------------------------------------------------------------------------------------------+ | ID | e712a702-741f-4093-a971-b3ad69411ac1 | | Links | packageContent=href=/vnfpkgm/v1/vnf_packages/e712a702-741f-4093-a971-b3ad69411ac1/package_content, | | | self=href=/vnfpkgm/v1/vnf_packages/e712a702-741f-4093-a971-b3ad69411ac1 | | Onboarding State | CREATED | | Operational State | DISABLED | | Usage State | NOT_IN_USE | | User Defined Data | | +-------------------+----------------------------------------------------------------------------------------------------------------+
Upload VNF Package¶
Execute vnfpkgm upload:
The “VNF Package ID”
e712a702-741f-4093-a971-b3ad69411ac1
needs to be replaced with the appropriate one that was obtained from Create VNF Package.$ openstack vnf package upload \ --path ./sample_vnf_package_csar/sample_vnf_package_csar.zip \ e712a702-741f-4093-a971-b3ad69411ac1 Upload request for VNF package e712a702-741f-4093-a971-b3ad69411ac1 has been accepted.
Check the created VNF Package¶
Confirm the “Onboarding State” to be
ONBOARDED
(it may take more than 30 seconds):$ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | +--------------------------------------+------------------+------------------+-------------+-------------------+ | e712a702-741f-4093-a971-b3ad69411ac1 | | PROCESSING | NOT_IN_USE | DISABLED | +--------------------------------------+------------------+------------------+-------------+-------------------+ $ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | +--------------------------------------+------------------+------------------+-------------+-------------------+ | e712a702-741f-4093-a971-b3ad69411ac1 | Sample VNF | ONBOARDED | NOT_IN_USE | ENABLED | +--------------------------------------+------------------+------------------+-------------+-------------------+
Create & Instantiate VNF¶
Create VNF¶
Find “VNFD ID” to create VNF:
The “VNFD-ID” can be found to be
b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
in the example.$ openstack vnf package show \ e712a702-741f-4093-a971-b3ad69411ac1 -c 'VNFD ID' +---------+--------------------------------------+ | Field | Value | +---------+--------------------------------------+ | VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | +---------+--------------------------------------+
Create VNF:
The “VNFD ID”
b1bb0ce7-ebca-4fa7-95ed-4840d70a1177
needs to be replaced with the appropriate one.$ openstack vnflcm create \ b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 --fit-width +--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Field | Value | +--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ID | 725f625e-f6b7-4bcd-b1b7-7184039fde45 | | Instantiation State | NOT_INSTANTIATED | | Links | instantiate=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45/instantiate, | | | self=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45 | | VNF Instance Description | None | | VNF Instance Name | None | | VNF Product Name | Sample VNF | | VNF Provider | Company | | VNF Software Version | 1.0 | | VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | | VNFD Version | 1.0 | +--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
Instantiate VNF¶
Create
<param-file>
:Required parameter:
flavourID
Optional parametes:
instantiationLevelId
extVirtualLinks
extManagedVirtualLinks
vimConnectionInfo
Note
You can skip
vimConnectionInfo
only when you have the default VIM.A sample
<param-file>
named assample_param_file.json
with minimal parametes:$ vi ./sample_param_file.json
When using TOSCA, use the following parameters.
{ "flavourId": "simple" }
[This is UserData specific part] When using UserData, use the following parameters instead.
{ "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}
and${vim_uuid}
should be replaced with the uuid of the network to use, the uuid of the subnet to use and the uuid of the VIM to use, respectively.Hint
You can find uuids of the network and the corresponding subnet with this command 10:
$ openstack network list
Instantiate VNF:
The “ID of vnf instance” and “path to <param-file>” are needed to instantiate vnf.
$ openstack vnflcm instantiate \ 725f625e-f6b7-4bcd-b1b7-7184039fde45 ./sample_param_file.json instantiate request for vnf instance 725f625e-f6b7-4bcd-b1b7-7184039fde45 has been accepted.
Check the details of the instantiated vnf.
$ openstack vnflcm list +--------------------------------------+-------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | ID | VNF Instance Name | Instantiation State | VNF Provider | VNF Software Version | VNF Product Name | VNFD ID | +--------------------------------------+-------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | 725f625e-f6b7-4bcd-b1b7-7184039fde45 | None | INSTANTIATED | Company | 1.0 | Sample VNF | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | +--------------------------------------+-------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ $ openstack vnflcm show \ 725f625e-f6b7-4bcd-b1b7-7184039fde45 --fit-width +--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Field | Value | +--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ID | 725f625e-f6b7-4bcd-b1b7-7184039fde45 | | Instantiated Vnf Info | , extCpInfo='[]', flavourId='simple', vnfState='STARTED', vnfVirtualLinkResourceInfo='[{'id': '0163cea3-af88-4ef8-ae43-ef3e5e7e827d', | | | 'vnfVirtualLinkDescId': 'internalVL1', 'networkResource': {'resourceId': '073c74b9-670d-4764-a933-6fe4f2f991c1', 'vimLevelResourceType': | | | 'OS::Neutron::Net'}, 'vnfLinkPorts': [{'id': '3b667826-336c-4919-889e-e6c63d959ee6', 'resourceHandle': {'resourceId': | | | '5d3255b5-e9fb-449f-9c5f-5242049ce2fa', 'vimLevelResourceType': 'OS::Neutron::Port'}, 'cpInstanceId': '3091f046-de63-44c8-ad23-f86128409b27'}]}]', | | | vnfcResourceInfo='[{'id': '2a66f545-c90d-49e7-8f17-fb4e57b19c92', 'vduId': 'VDU1', 'computeResource': {'resourceId': | | | '6afc547d-0e19-46fc-b171-a3d9a0a80513', 'vimLevelResourceType': 'OS::Nova::Server'}, 'storageResourceIds': [], 'vnfcCpInfo': [{'id': | | | '3091f046-de63-44c8-ad23-f86128409b27', 'cpdId': 'CP1', 'vnfExtCpId': None, 'vnfLinkPortId': '3b667826-336c-4919-889e-e6c63d959ee6'}]}]' | | Instantiation State | INSTANTIATED | | Links | heal=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45/heal, self=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45, | | | terminate=href=/vnflcm/v1/vnf_instances/725f625e-f6b7-4bcd-b1b7-7184039fde45/terminate | | VIM Connection Info | [] | | VNF Instance Description | None | | VNF Instance Name | None | | VNF Product Name | Sample VNF | | VNF Provider | Company | | VNF Software Version | 1.0 | | VNFD ID | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | | VNFD Version | 1.0 | +--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
Terminate & Delete VNF¶
Terminate VNF¶
Check the VNF Instance ID to terminate:
$ openstack vnflcm list +--------------------------------------+-------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | ID | VNF Instance Name | Instantiation State | VNF Provider | VNF Software Version | VNF Product Name | VNFD ID | +--------------------------------------+-------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+ | 725f625e-f6b7-4bcd-b1b7-7184039fde45 | None | INSTANTIATED | Company | 1.0 | Sample VNF | b1bb0ce7-ebca-4fa7-95ed-4840d70a1177 | +--------------------------------------+-------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+
Terminate VNF Instance:
Execute terminate command:
$ openstack vnflcm terminate 725f625e-f6b7-4bcd-b1b7-7184039fde45 Terminate request for VNF Instance '725f625e-f6b7-4bcd-b1b7-7184039fde45' has been accepted.
Check the status of VNF Instance:
$ openstack vnflcm list --fit-width +----------------------+-------------------+---------------------+--------------+----------------------+------------------+-----------------------+ | ID | VNF Instance Name | Instantiation State | VNF Provider | VNF Software Version | VNF Product Name | VNFD ID | +----------------------+-------------------+---------------------+--------------+----------------------+------------------+-----------------------+ | 725f625e-f6b7-4bcd-b | None | NOT_INSTANTIATED | Company | 1.0 | Sample VNF | b1bb0ce7-ebca-4fa7-95 | | 1b7-7184039fde45 | | | | | | ed-4840d70a1177 | +----------------------+-------------------+---------------------+--------------+----------------------+------------------+-----------------------+
Delete VNF¶
Delete VNF Instance:
$ openstack vnflcm delete 725f625e-f6b7-4bcd-b1b7-7184039fde45 Vnf instance '725f625e-f6b7-4bcd-b1b7-7184039fde45' deleted successfully
Delete VNF Package¶
Delete VNF Package:
Check the VNF Package ID to delete:
$ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | +--------------------------------------+------------------+------------------+-------------+-------------------+ | e712a702-741f-4093-a971-b3ad69411ac1 | Sample VNF | ONBOARDED | NOT_IN_USE | ENABLED | +--------------------------------------+------------------+------------------+-------------+-------------------+
Update the Operational State to
DISABLED
:$ openstack vnf package update \ --operational-state 'DISABLED' \ e712a702-741f-4093-a971-b3ad69411ac1 +-------------------+----------+ | Field | Value | +-------------------+----------+ | Operational State | DISABLED | +-------------------+----------+
Check the Operational State to be changed:
$ openstack vnf package list +--------------------------------------+------------------+------------------+-------------+-------------------+ | Id | Vnf Product Name | Onboarding State | Usage State | Operational State | +--------------------------------------+------------------+------------------+-------------+-------------------+ | e712a702-741f-4093-a971-b3ad69411ac1 | Sample VNF | ONBOARDED | NOT_IN_USE | DISABLED | +--------------------------------------+------------------+------------------+-------------+-------------------+
Delete the VNF Package:
$ openstack vnf package delete e712a702-741f-4093-a971-b3ad69411ac1 All specified vnf-package(s) deleted successfully
Trouble Shooting¶
Neutron QoSPlugin error
devstack tacker-conductor[8132]: 2020-05-25 09:17:12.976 TRACE oslo_messaging.rpc.server tacker.common.exceptions.VnfInstantiationFailed: Vnf instantiation failed for vnf ca2fe9cb-afba-40a5-aec6-b7ef643b0208, 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.
Edit
/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
Edit
/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
Restart neutron services:
$ sudo systemctl restart devstack@q-*
Error in networking-sfc
Disable networking-sfc by editting
/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,neutron.services.qos.qos_plugin.QoSPlugin,qos + service_plugins = ovn-router,neutron.services.qos.qos_plugin.QoSPlugin - [sfc] - drivers = ovs - [flowclassifier] - drivers = ovs
Edit
/etc/neutron/plugins/ml2/ml2_conf.ini
:$ sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini
- [agent] - extensions = sfc
Restart neutron services:
$ sudo systemctl restart devstack@q-*
- 1
https://docs.openstack.org/tacker/latest/user/etsi_vnf_deployment_as_vm_with_tosca.html
- 2
https://docs.openstack.org/tacker/latest/user/etsi_vnf_deployment_as_vm_with_user_data.html
- 3
https://opendev.org/openstack/tacker/src/branch/master/samples/etsi_getting_started/tosca
- 4
https://opendev.org/openstack/tacker/src/branch/master/samples/etsi_getting_started/userdata
- 5
- 6
https://docs.openstack.org/liberty/install-guide-ubuntu/keystone-openrc.html
- 7
- 8
- 9
https://docs.openstack.org/tacker/latest/user/vnfd-sol001.html
- 10
https://docs.openstack.org/python-openstackclient/pike/cli/command-objects/network.html