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 TOSCA [1]

  • VNF Deployment with LCM Operation User Data (optional) [2]

“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.

../_images/etsi-getting-started-sample-vnf.png

Note

VIM config, a VNF package, and instantiation parameters used in this tutorial are placed at the repository.

  • VNF Deployment with TOSCA [3]

  • VNF Deployment with LCM Operation User Data [4]

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

  1. Prepare VIM configuration file:

    You can use a setup script for generating VIM configuration or edit it from scratch as described in here. This script finds parameters for the configuration, such as user name or password, from your environment variables. Here is an example of generating OpenStack VIM configuration as vim_config.yaml. In this document, TACKER_ROOT is the root of tacker’s repository on your server.

    $ bash TACKER_ROOT/tools/gen_vim_config.sh
    Config for OpenStack VIM 'vim_config.yaml' generated.
    

    There are several options for configuring parameters from command line supported. Refer help with -h for details.

    You can also use a sample configuration file vim_config.yaml instead of using the script.

    $ 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'
    project_domain_name: 'Default'
    user_domain_name: 'Default'
    cert_verify: 'True'
    
  2. Register Default VIM:

    Once you setup VIM configuration file, you register default VIM via openstack command with --is-default option.

    $ 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"            |
    |                | }                                               |
    +----------------+-------------------------------------------------+
    
  3. Confirm that the status of registered VIM is REACHABLE as ready to use:

    $ 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 and Upload VNF Package

Prepare VNF Package

  1. 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
    
  2. Create a TOSCA.meta 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
    
  3. 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
    
  4. 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 same description_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 in sample_vnfd_types.yaml is always used.

  5. [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: {}
    
  6. [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
    
  7. 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 and UserData 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

  1. 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

  1. 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

  1. 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

  1. 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 |
    +---------+--------------------------------------+
    
  2. 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

  1. 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 as sample_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
    
  2. 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

  1. 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 |
    +--------------------------------------+-------------------+---------------------+--------------+----------------------+------------------+--------------------------------------+
    
  2. 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

  1. Delete VNF Instance:

    $ openstack vnflcm delete 725f625e-f6b7-4bcd-b1b7-7184039fde45
    
    Vnf instance '725f625e-f6b7-4bcd-b1b7-7184039fde45' deleted successfully
    

Delete VNF Package

  1. 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.
    
    1. 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
      
    2. 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
      
    3. Restart neutron services:

      $ sudo systemctl restart devstack@q-*
      
  • Error in networking-sfc

    1. 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
      
    2. Edit /etc/neutron/plugins/ml2/ml2_conf.ini:

      $ sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini
      
      - [agent]
      - extensions = sfc
      
    3. Restart neutron services:

      $ sudo systemctl restart devstack@q-*