Add a Sample VNF Package for Ansible Driver

This patch contains a sample VNF Package that has ansible driver
artifacts. It will be a useful reference for users who choose to use
ansible to configure their target VNFs.

User document of ansible driver usage will be added.
It describes the conditions for running the script, how to create the
package, and an example of how it works.

Implements: blueprint add-ansible-mgmt-driver-sample
Spec: https://review.opendev.org/c/openstack/tacker-specs/+/814689
Change-Id: Ibbb9115a938de19e48f06c59af6bd7e7b222706d
This commit is contained in:
Aldinson Esto 2022-02-25 08:51:11 +00:00 committed by Aldinson C. Esto
parent b89ad00b58
commit 147f8c43ca
14 changed files with 2804 additions and 0 deletions

View File

@ -118,6 +118,14 @@ Kubernetes Cluster VNF
mgmt_driver_deploy_k8s_pv_usage_guide
mgmt_driver_deploy_k8s_kubespary_usage_guide
Ansible Driver
~~~~~~~~~~~~~~
.. toctree::
:maxdepth: 1
mgmt_driver_for_ansible_driver_usage_guide
Sample Usage
^^^^^^^^^^^^

View File

@ -0,0 +1,640 @@
=========================================
How to use Mgmt Driver for Ansible Driver
=========================================
Overview
--------
1. Ansible Mgmt Driver Introduction
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Mgmt Driver enables Users to configure their VNF before and/or after
its VNF Lifecycle Management operation. Users can customize the logic
of Mgmt Driver by implementing their own Mgmt Driver and these
customizations are specified by "interface" definition in
`NFV-SOL001 v2.6.1`_.
In the current community code, there is no Mgmt Driver that utilizes
Ansible for VNF Configuration. Ansible is a general purpose
configuration management tool when supported will benefit more users.
This user guide aims to provide users the information and procedures
necessary to be able to use Ansible in Mgmt Driver.
.. code-block:: console
+------------------------------------------+
| Tacker |
| +--------------------------------------+ |
| | Tacker-Server | |
| +--------------------------------------+ |
| |
| +--------------------------------------+ |
| | Tacker-Conductor | |
| | | |
| | +----------------------------------+ | |
| | | OpenStack Driver | | |
| | +----------------------------------+ | |
| | +----------------------------------+ | |
| | | Ansible Driver | | |
| | | | | |
| | | +------------------+ | | |
| | | | Config Parser | | | | 1. Get VDU Resources
| | | +--------|---------+ ------------------------------------
| | | | | | | |
| | | |2. VDU/Config/Command | | | |
| | | | Order Processing | | | |
| | | | | | | |
| | | +--------V---------+ | | | |
| | | | Executor | | | | +------------|-------------+
| | | +--------|---------+ | | | | Heat | |
| | +-----------|----------------------+ | | | +----------v-----------+ |
| +-------------|------------------------+ | | | OpenStack Heat | |
| | | | +----------------------+ |
+---------------|--------------------------+ +------------|-------------+
| |
|3. Execute Playbook |
| |
| |
+------------V-------------+ |
|VNF | |
| +--------------+ | |
| | VDU1 | | |
| +--------------+ | |
| <--------------------------------------------
| +--------------+ |
| | VDU2 | |
| +--------------+ |
+--------------------------+
2. Use Case
^^^^^^^^^^^
* dynamic mgmt address: The IP is generated via DHCP.
* static mgmt address: Static IP is specified.
1. VDU Configuration at dynamic mgmt address
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In ``helloworld3_df_default.yaml``, ``dhcp_enabled`` value should be ``true``.
.. code-block:: 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
- helloworld3_types.yaml
topology_template:
...
internalNW_1:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
...
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l2_protocol_data:
network_type: vlan
l3_protocol_data:
ip_version: ipv4
cidr: '192.168.0.0/24'
dhcp_enabled: true
2. VDU Configuration at static mgmt address
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In ``helloworld3_df_default.yaml``, ``dhcp_enabled`` should not be present.
.. code-block:: 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
- helloworld3_types.yaml
topology_template:
...
internalNW_1:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
...
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l3_protocol_data:
ip_version: ipv4
cidr: '192.168.0.0/24'
The BaseHOT file will get the IP from the request body. This is done by
defining the management IP parameter and getting its value under the
properties of the resource.
.. code-block:: yaml
parameters:
nfv:
type: json
mgmt_ip_vm0_0:
type: string
label: Management Network IPv4 Address
description: Management Network IPv4 Address
mgmt_ip_vm1_0:
type: string
label: Management Network IPv4 Address
description: Management Network IPv4 Address
resources:
VDU1:
type: OS::Heat::AutoScalingGroup
properties:
min_size: 1
max_size: 3
desired_capacity: 1
resource:
type: VDU1.yaml
properties:
flavor: { get_param: [ nfv, VDU, VDU1, flavor ] }
image: { get_param: [ nfv, VDU, VirtualStorage, image ] }
name: vdu1
testnet: { get_resource: internalNW_1 }
mgmt_ip_a: { get_param: mgmt_ip_vm0_0 }
mgmt_ip_b: { get_param: mgmt_ip_vm1_0 }
The sample above shows the BaseHOT file getting the static IP from
the request body using ``mgmt_ip_vm0_0`` and ``mgmt_ip_vm1_0`` parameters and
assigned to ``mgmt_ip_a`` and ``mgmt_ip_b`` respectively.
The nested BaseHot file will then use the values acquired in the BaseHOT file
to set the management IP of the resource.
.. code-block:: yaml
parameters:
flavor:
type: string
image:
type: string
name:
type: string
testnet:
type: string
mgmt_ip_a:
type: string
label: Management Network IPv4 Address
description: Management Network IPv4 Address
mgmt_ip_b:
type: string
label: Management Network IPv4 Address
description: Management Network IPv4 Address
resources:
VDU1:
type: OS::Nova::Server
properties:
...
CP1:
type: OS::Neutron::Port
properties:
network: { get_param: testnet }
fixed_ips:
- ip_address: { get_param: mgmt_ip_a }
CP2:
type: OS::Neutron::Port
properties:
network: { get_param: testnet }
fixed_ips:
- ip_address: { get_param: mgmt_ip_b }
...
The sample above shows the nested file of BaseHOT where the value of the IP
address acquired from the BaseHOT file is being assigned to the port.
Set the static IP in the json request parameter for ``Instantiation`` under
``additionalParams``.
.. code-block:: yaml
{
"flavourId": "default",
...
"additionalParams": {
"lcm-operation-user-data": "./UserData/lcm_user_data.py",
"lcm-operation-user-data-class": "SampleUserData",
"mgmt_ip_vm0_0": "10.1.1.20",
"mgmt_ip_vm1_0": "10.1.1.24"
}
}
Ordering Options
----------------
1. VDU Order
^^^^^^^^^^^^
The order of VDU is based on the ``order`` keyword after ``config`` in the
``config.yaml`` file.
Sample:
.. code-block::
vdus:
VDU1:
config:
order: 1
vm_app_config:
...
VDU2:
config:
order: 0
vm_app_config:
...
In the sample above, ``VDU2`` is processed before ``VDU1`` because
of the value of the ``order``.
.. note::
Should they have the same order, they will be executed randomly.
2. Command Order
^^^^^^^^^^^^^^^^
The command order is necessary if you have multiple commands to be executed
in a single configuration.
Sample:
.. code-block::
vdus:
VDU1:
config:
order: 1
vm_app_config:
type: ansible
instantiation:
- path: _VAR_vnf_package_path/Scripts/default/sample_start-1.yaml
params:
ansible_password: password
order: 1
- path: _VAR_vnf_package_path/Scripts/default/sample_start-2.yaml
params:
ansible_password: password
order: 2
- path: _VAR_vnf_package_path/Scripts/default/sample_start-3.yaml
params:
ansible_password: password
order: 0
In the above example, the order of the command execution is as follows:
- Scripts/default/sample_start-3.yaml
- Scripts/default/sample_start-1.yaml
- Scripts/default/sample_start-2.yaml
This is due to the order value of each commands.
Ansible Driver Usage
--------------------
In case Ansible is not yet installed, please refer to the `Ansible Installation
Guide`_.
1. Copy Ansible Folder
^^^^^^^^^^^^^^^^^^^^^^
First, copy the sample script that was stored in
``tacker/samples/mgmt_driver/ansible`` into the directory of
``tacker/tacker/vnfm/mgmt_drivers``.
.. code-block:: console
$ cp -pfr /opt/stack/tacker/samples/mgmt_driver/ansible /opt/stack/tacker/tacker/vnfm/mgmt_drivers/
Environment Configuration
-------------------------
1. Set the setup.cfg
^^^^^^^^^^^^^^^^^^^^
You have to register ``ansible_driver`` in the operation environment
of the tacker.
.. code-block:: console
$ vi /opt/stack/tacker/setup.cfg
...
tacker.tacker.mgmt.drivers =
noop = tacker.vnfm.mgmt_drivers.noop:VnfMgmtNoop
openwrt = tacker.vnfm.mgmt_drivers.openwrt.openwrt:VnfMgmtOpenWRT
vnflcm_noop = tacker.vnfm.mgmt_drivers.vnflcm_noop:VnflcmMgmtNoop
ansible_driver = tacker.vnfm.mgmt_drivers.ansible.ansible:DeviceMgmtAnsible
2. Set the tacker.conf
^^^^^^^^^^^^^^^^^^^^^^
Then find the ``vnflcm_mgmt_driver`` field in the ``tacker.conf``.
Add the ``ansible_driver`` defined in step 2 to it,
and separate by commas.
.. code-block:: console
$ vi /etc/tacker/tacker.conf
...
[tacker]
...
vnflcm_mgmt_driver = vnflcm_noop,ansible_driver
...
3. Update the tacker.egg-info
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
After the above two steps, the configuration has
not yet taken effect. You also need to execute the ``setup.py`` script
to regenerate the contents of the ``tacker.egg-info`` directory.
.. code-block:: console
$ cd /opt/stack/tacker/
$ python setup.py build
running build
running build_py
running egg_info
writing requirements to tacker.egg-info/requires.txt
writing tacker.egg-info/PKG-INFO
writing top-level names to tacker.egg-info/top_level.txt
writing dependency_links to tacker.egg-info/dependency_links.txt
writing entry points to tacker.egg-info/entry_points.txt
writing pbr to tacker.egg-info/pbr.json
[pbr] Processing SOURCES.txt
[pbr] In git context, generating filelist from git
warning: no files found matching 'AUTHORS'
warning: no files found matching 'ChangeLog'
warning: no previously-included files matching '*.pyc' found anywhere in distribution
writing manifest file 'tacker.egg-info/SOURCES.txt'
Then you can use Mgmt Driver to deploy Ansible Driver after
restarting the service of ``tacker`` and ``tacker-conductor``.
.. code-block:: console
$ sudo systemctl stop devstack@tacker
$ sudo systemctl restart devstack@tacker-conductor
$ sudo systemctl start devstack@tacker
VNF Package Creation
--------------------
1. VNF Package Structure
^^^^^^^^^^^^^^^^^^^^^^^^
The sample structure of VNF Package is shown below.
.. note::
You can also find them in the
``samples/mgmt_driver/ansible/ansible_vnf_package/`` directory
of the tacker.
The directory structure:
* **TOSCA-Metadata/TOSCA.meta**
* **Definitions/**
* **Files/images/**
* **ScriptANSIBLE/**
* **Scripts/**
* **BaseHOT/**
* **UserData/**
.. code-block:: console
!----TOSCA-Metadata
!---- TOSCA.meta
!----Definitions
!---- etsi_nfv_sol001_common_types.yaml
!---- etsi_nfv_sol001_vnfd_types.yaml
!---- helloworld3_top.vnfd.yaml
!---- helloworld3_types.yaml
!---- helloworld3_df_default.yaml
!----Files
!---- images
!---- cirros-0.5.2-x86_64-disk.img
!----ScriptANSIBLE
!---- config.yaml
!----Scripts
!---- default
!---- sample.yaml
!----BaseHOT
!---- default
!---- nested
!---- VDU1.yaml
!---- VNF-hot.yaml
!----UserData
!---- __init__.py
!---- lcm_user_data.py
2. ScriptANSIBLE
^^^^^^^^^^^^^^^^
This directory contains the settings for running Ansible Script. This includes
the path to the Ansible Playbook that each LCM runs, and the orders that
should be executed according to each VDU, etc. It is mandatory to have a
``config.yaml`` file in this directory (as shown in the directory structure).
This file is the one being parsed by the driver.
The ``configurable_properties`` in ``config.yaml`` file is a mandatory
parameter. It can be used to define key-value pairs that can be used during
VNF Configuration. The format of the ``key`` must start with ``_VAR_``.
So when the ``key`` is used in ``vm_app_config``, then it will be replaced
by the set value.
.. code-block:: console
configurable_properties:
_VAR_password: 'password'
vdus:
VDU1:
config:
order: 1
vm_app_config:
type: ansible
instantiation:
- path: _VAR_vnf_package_path/Scripts/default/sample_start-1.yaml
params:
ansible_password: _VAR_password
order: 0
The example above shows that we have a key ``_VAR_password`` with a value
``password``. It will replace the ``_VAR_password`` used in the
``vm_app_config``.
.. note::
The ``_VAR_vnf_package_path/`` variable is mandatory for the path of the
Ansible Playbook. This value is replaced by the actual vnf package path
during runtime.
3. Scripts
^^^^^^^^^^
This directory contains the user-defined Ansible Playbook to run on each LCM.
The Playbook is executed based on the config.yaml definition under
ScriptANSIBLE. The Sample Ansible Driver utilizes Ansible to run the Playbooks.
.. code-block::
# This playbook prints a simple debug message
- name: Echo
hosts: all
remote_user: root
tasks:
- name: Creates a file
remote_user: some_user
become: yes
become_method: sudo
file:
path: "/tmp/sample.txt"
state: touch
4. BaseHOT
^^^^^^^^^^
Base HOT file is a Native cloud orchestration template, HOT in this context,
which is commonly used for LCM operations in different VNFs. It is the
responsibility of the user to prepare this file, and it is necessary to make
it consistent with VNFD placed under the **Definitions/** directory.
Here are the following that is needed to check in these files:
- Under ``resources``, there should be no ``_group`` in the name
.. code-block::
heat_template_version: 2013-05-23
description: 'default deployment flavour for Sample VNF'
parameters:
nfv:
type: json
resources:
VDU1:
type: OS::Heat::AutoScalingGroup
All yaml files must have the ``outputs`` part. This is necessary in order
to generate the mgmt_ip address. The format of the ``outputs`` part is
as follows:
.. code-block::
mgmt_ip-<VDU_NAME>:
value:
get_attr:
- <VDU_CP>
- fixed_ips
- 0
- ip_address
Example Ansible Driver LCM
--------------------------
1. VNF Package create/upload
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Before you instantiate VNF, you must create a zip file of VNF Package
and upload it.
Please refer to the procedure in Section `Create and Upload VNF Package`_.
.. note::
Please do not forget the following folders to include
in creating the zip file:
* Files/
* ScriptANSIBLE/
* Scripts/
Please get the contents of the ``Files`` folder from the
``tacker/tests/etc/samples/etsi/nfv/common/Files/``.
2. VNF Create/Instantiate
^^^^^^^^^^^^^^^^^^^^^^^^^
Please refer to the procedure in Section `Create & Instantiate VNF`_.
.. note::
Please see the ``tacker-conductor.log`` for the Ansible Playbook Play
results.
3. VNF Heal
^^^^^^^^^^^
Please refer to the procedure in Section `VNF Healing`_.
.. note::
Please see the ``tacker-conductor.log`` for the Ansible Playbook Play
results.
4. VNF Scale
^^^^^^^^^^^^
Please refer to the procedure in Section `VNF Scaling`_.
.. note::
Please see the ``tacker-conductor.log`` for the Ansible Playbook Play
results.
5. VNF Terminate/Delete
^^^^^^^^^^^^^^^^^^^^^^^
Please refer to the procedure in Section `Termination and Delete`_.
.. note::
Please see the ``tacker-conductor.log`` for the Ansible Playbook Play
results.
.. _NFV-SOL001 v2.6.1 : https://www.etsi.org/deliver/etsi_gs/NFV-SOL/001_099/001/02.06.01_60/gs_NFV-SOL001v020601p.pdf
.. _Ansible Installation Guide : https://docs.ansible.com/ansible/2.9/installation_guide/index.html
.. _Create and Upload VNF Package : https://docs.openstack.org/tacker/latest/install/etsi_getting_started.html#create-and-upload-vnf-package
.. _Create & Instantiate VNF : https://docs.openstack.org/tacker/latest/install/etsi_getting_started.html#create-instantiate-vnf
.. _Termination and Delete : https://docs.openstack.org/tacker/latest/install/etsi_getting_started.html#terminate-delete-vnf
.. _VNF Healing : https://docs.openstack.org/tacker/latest/user/etsi_vnf_healing.html
.. _VNF Scaling : https://docs.openstack.org/tacker/latest/user/etsi_vnf_scaling.html

View File

@ -0,0 +1,50 @@
heat_template_version: 2013-05-23
description: 'default deployment flavour for Sample VNF'
parameters:
nfv:
type: json
resources:
VDU1:
type: OS::Heat::AutoScalingGroup
properties:
min_size: 1
max_size: 50
desired_capacity: 1
resource:
type: VDU1.yaml
properties:
flavor: { get_param: [ nfv, VDU, VDU1, flavor ] }
image: { get_param: [ nfv, VDU, VirtualStorage, image ] }
name: vdu1
net1: { get_resource: internalNW_1 }
VDU1_scale_out:
type: OS::Heat::ScalingPolicy
properties:
scaling_adjustment: 1
auto_scaling_group_id:
get_resource: VDU1
adjustment_type: change_in_capacity
VDU1_scale_in:
type: OS::Heat::ScalingPolicy
properties:
scaling_adjustment: -1
auto_scaling_group_id:
get_resource: VDU1
adjustment_type: change_in_capacity
internalNW_1:
type: OS::Neutron::Net
internalNW_1_subnet:
type: OS::Neutron::Subnet
properties:
ip_version: 4
network:
get_resource: internalNW_1
cidr: 192.168.0.0/24
outputs: {}

View File

@ -0,0 +1,45 @@
heat_template_version: 2013-05-23
description: 'Child HOT for mmp scale'
parameters:
flavor:
type: string
image:
type: string
name:
type: string
net1:
type: string
resources:
VDU1:
type: OS::Nova::Server
properties:
flavor: { get_param: flavor }
name: { get_param: name }
image: { get_param: image }
networks:
- port:
get_resource: CP1
- port:
get_resource: CP2
CP1:
type: OS::Neutron::Port
properties:
network: { get_param: net1 }
CP2:
type: OS::Neutron::Port
properties:
network: { get_param: net1 }
outputs:
mgmt_ip-VDU1:
value:
get_attr:
- CP1
- fixed_ips
- 0
- ip_address

View File

@ -0,0 +1,202 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: ETSI NFV SOL 001 common types definitions version 2.6.1
metadata:
template_name: etsi_nfv_sol001_common_types
template_author: ETSI_NFV
template_version: 2.6.1
data_types:
tosca.datatypes.nfv.L2AddressData:
derived_from: tosca.datatypes.Root
description: Describes the information on the MAC addresses to be assigned to a connection point.
properties:
mac_address_assignment:
type: boolean
description: Specifies if the address assignment is the responsibility of management and orchestration function or not. If it is set to True, it is the management and orchestration function responsibility
required: true
tosca.datatypes.nfv.L3AddressData:
derived_from: tosca.datatypes.Root
description: Provides information about Layer 3 level addressing scheme and parameters applicable to a CP
properties:
ip_address_assignment:
type: boolean
description: Specifies if the address assignment is the responsibility of management and orchestration function or not. If it is set to True, it is the management and orchestration function responsibility
required: true
floating_ip_activated:
type: boolean
description: Specifies if the floating IP scheme is activated on the Connection Point or not
required: true
ip_address_type:
type: string
description: Defines address type. The address type should be aligned with the address type supported by the layer_protocols properties of the parent VnfExtCp
required: false
constraints:
- valid_values: [ ipv4, ipv6 ]
number_of_ip_address:
type: integer
description: Minimum number of IP addresses to be assigned
required: false
constraints:
- greater_than: 0
tosca.datatypes.nfv.AddressData:
derived_from: tosca.datatypes.Root
description: Describes information about the addressing scheme and parameters applicable to a CP
properties:
address_type:
type: string
description: Describes the type of the address to be assigned to a connection point. The content type shall be aligned with the address type supported by the layerProtocol property of the connection point
required: true
constraints:
- valid_values: [ mac_address, ip_address ]
l2_address_data:
type: tosca.datatypes.nfv.L2AddressData
description: Provides the information on the MAC addresses to be assigned to a connection point.
required: false
l3_address_data:
type: tosca.datatypes.nfv.L3AddressData
description: Provides the information on the IP addresses to be assigned to a connection point
required: false
tosca.datatypes.nfv.ConnectivityType:
derived_from: tosca.datatypes.Root
description: describes additional connectivity information of a virtualLink
properties:
layer_protocols:
type: list
description: Identifies the protocol a virtualLink gives access to (ethernet, mpls, odu2, ipv4, ipv6, pseudo-wire).The top layer protocol of the virtualLink protocol stack shall always be provided. The lower layer protocols may be included when there are specific requirements on these layers.
required: true
entry_schema:
type: string
constraints:
- valid_values: [ ethernet, mpls, odu2, ipv4, ipv6, pseudo-wire ]
flow_pattern:
type: string
description: Identifies the flow pattern of the connectivity
required: false
constraints:
- valid_values: [ line, tree, mesh ]
tosca.datatypes.nfv.LinkBitrateRequirements:
derived_from: tosca.datatypes.Root
description: describes the requirements in terms of bitrate for a virtual link
properties:
root:
type: integer # in bits per second
description: Specifies the throughput requirement in bits per second of the link (e.g. bitrate of E-Line, root bitrate of E-Tree, aggregate capacity of E-LAN).
required: true
constraints:
- greater_or_equal: 0
leaf:
type: integer # in bits per second
description: Specifies the throughput requirement in bits per second of leaf connections to the link when applicable to the connectivity type (e.g. for E-Tree and E LAN branches).
required: false
constraints:
- greater_or_equal: 0
tosca.datatypes.nfv.CpProtocolData:
derived_from: tosca.datatypes.Root
description: Describes and associates the protocol layer that a CP uses together with other protocol and connection point information
properties:
associated_layer_protocol:
type: string
required: true
description: One of the values of the property layer_protocols of the CP
constraints:
- valid_values: [ ethernet, mpls, odu2, ipv4, ipv6, pseudo-wire ]
address_data:
type: list
description: Provides information on the addresses to be assigned to the CP
entry_schema:
type: tosca.datatypes.nfv.AddressData
required: false
tosca.datatypes.nfv.VnfProfile:
derived_from: tosca.datatypes.Root
description: describes a profile for instantiating VNFs of a particular NS DF according to a specific VNFD and VNF DF.
properties:
instantiation_level:
type: string
description: Identifier of the instantiation level of the VNF DF to be used for instantiation. If not present, the default instantiation level as declared in the VNFD shall be used.
required: false
min_number_of_instances:
type: integer
description: Minimum number of instances of the VNF based on this VNFD that is permitted to exist for this VnfProfile.
required: true
constraints:
- greater_or_equal: 0
max_number_of_instances:
type: integer
description: Maximum number of instances of the VNF based on this VNFD that is permitted to exist for this VnfProfile.
required: true
constraints:
- greater_or_equal: 0
tosca.datatypes.nfv.Qos:
derived_from: tosca.datatypes.Root
description: describes QoS data for a given VL used in a VNF deployment flavour
properties:
latency:
type: scalar-unit.time #Number
description: Specifies the maximum latency
required: true
constraints:
- greater_than: 0 s
packet_delay_variation:
type: scalar-unit.time #Number
description: Specifies the maximum jitter
required: true
constraints:
- greater_or_equal: 0 s
packet_loss_ratio:
type: float
description: Specifies the maximum packet loss ratio
required: false
constraints:
- in_range: [ 0.0, 1.0 ]
capability_types:
tosca.capabilities.nfv.VirtualLinkable:
derived_from: tosca.capabilities.Node
description: A node type that includes the VirtualLinkable capability indicates that it can be pointed by tosca.relationships.nfv.VirtualLinksTo relationship type
relationship_types:
tosca.relationships.nfv.VirtualLinksTo:
derived_from: tosca.relationships.DependsOn
description: Represents an association relationship between the VduCp and VnfVirtualLink node types
valid_target_types: [ tosca.capabilities.nfv.VirtualLinkable ]
node_types:
tosca.nodes.nfv.Cp:
derived_from: tosca.nodes.Root
description: Provides information regarding the purpose of the connection point
properties:
layer_protocols:
type: list
description: Identifies which protocol the connection point uses for connectivity purposes
required: true
entry_schema:
type: string
constraints:
- valid_values: [ ethernet, mpls, odu2, ipv4, ipv6, pseudo-wire ]
role: #Name in ETSI NFV IFA011 v0.7.3: cpRole
type: string
description: Identifies the role of the port in the context of the traffic flow patterns in the VNF or parent NS
required: false
constraints:
- valid_values: [ root, leaf ]
description:
type: string
description: Provides human-readable information on the purpose of the connection point
required: false
protocol:
type: list
description: Provides information on the addresses to be assigned to the connection point(s) instantiated from this Connection Point Descriptor
required: false
entry_schema:
type: tosca.datatypes.nfv.CpProtocolData
trunk_mode:
type: boolean
description: Provides information about whether the CP instantiated from this Cp is in Trunk mode (802.1Q or other), When operating in "trunk mode", the Cp is capable of carrying traffic for several VLANs. Absence of this property implies that trunkMode is not configured for the Cp i.e. It is equivalent to boolean value "false".
required: false

View File

@ -0,0 +1,225 @@
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
- helloworld3_types.yaml
topology_template:
inputs:
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: SAMPLE.VNF
properties:
flavour_id: default
requirements:
virtual_link_external: []
node_templates:
VNF:
type: SAMPLE.VNF
properties:
flavour_description: 'n-vnf'
vnfm_info:
- Tacker
interfaces:
Vnflcm:
instantiate: []
instantiate_start: []
instantiate_end:
implementation: ansible_driver
scale: []
scale_start:
implementation: ansible_driver
scale_end:
implementation: ansible_driver
heal: []
heal_start: []
heal_end:
implementation: ansible_driver
terminate: []
terminate_start:
implementation: ansible_driver
terminate_end: []
modify_information: []
modify_information_start: []
modify_information_end: []
artifacts:
ansible_driver:
description: Management driver plugin
type: tosca.artifacts.Implementation.Python
file: /opt/stack/tacker/tacker/vnfm/mgmt_drivers/ansible/ansible.py
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: 3
capabilities:
virtual_compute:
properties:
requested_additional_capabilities:
properties:
requested_additional_capability_name: m1.tiny
support_mandatory: true
target_performance_parameters:
entry_schema: test
virtual_memory:
virtual_mem_size: 512 MB
virtual_cpu:
num_virtual_cpu: 1
virtual_local_storage:
- size_of_storage: 3 GB
requirements:
- virtual_storage: VirtualStorage
VirtualStorage:
type: tosca.nodes.nfv.Vdu.VirtualBlockStorage
properties:
virtual_block_storage_data:
size_of_storage: 1 GB
rdma_enabled: true
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: 0 GB
min_ram: 256 MB
size: 12 GB
CP1:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
protocol:
- associated_layer_protocol: ipv4
address_data:
- address_type: ip_address
l3_address_data:
ip_address_assignment: true
floating_ip_activated: false
requirements:
- virtual_binding: VDU1
- virtual_link: internalNW_1
CP2:
type: tosca.nodes.nfv.VduCp
properties:
layer_protocols: [ ipv4 ]
protocol:
- associated_layer_protocol: ipv4
address_data:
- address_type: ip_address
l3_address_data:
ip_address_assignment: true
floating_ip_activated: false
requirements:
- virtual_binding: VDU1
- virtual_link: internalNW_1
internalNW_1:
type: tosca.nodes.nfv.VnfVirtualLink
properties:
connectivity_type:
layer_protocols: [ ipv4 ]
vl_profile:
max_bitrate_requirements:
root: 2000000
min_bitrate_requirements:
root: 1000000
virtual_link_protocol_data:
- associated_layer_protocol: ipv4
l2_protocol_data:
network_type: vlan
l3_protocol_data:
ip_version: ipv4
cidr: '192.168.0.0/24'
dhcp_enabled: true
policies:
- vnf:
type: tosca.policies.nfv.ScalingAspects
properties:
aspects:
VDU1:
name: vdu1
description: vdu1
max_scale_level: 49
step_deltas:
- delta_1
- vdu1_initial_delta:
type: tosca.policies.nfv.VduInitialDelta
properties:
initial_delta:
number_of_instances: 1
targets: [ VDU1 ]
- vdu1_scaling_aspect_deltas:
type: tosca.policies.nfv.VduScalingAspectDeltas
properties:
aspect: VDU1
deltas:
delta_1:
number_of_instances: 1
targets: [ VDU1 ]
- instantiation_levels:
type: tosca.policies.nfv.InstantiationLevels
properties:
levels:
n-vnf-min:
description: n-msc-min structure
scale_info:
VDU1:
scale_level: 0
n-vnf-two:
description: n-msc-max structure
scale_info:
VDU1:
scale_level: 1
n-vnf-max:
description: n-msc-max structure
scale_info:
VDU1:
scale_level: 2
default_level: n-vnf-min
- vdu1_instantiation_levels:
type: tosca.policies.nfv.VduInstantiationLevels
properties:
levels:
n-vnf-min:
number_of_instances: 1
n-vnf-two:
number_of_instances: 2
n-vnf-max:
number_of_instances: 3
targets: [ VDU1 ]

View File

@ -0,0 +1,28 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: VNF
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
- helloworld3_types.yaml
- helloworld3_df_default.yaml
topology_template:
inputs:
selected_flavour:
type: string
description: VNF deployment flavour selected by the consumer. Itis provided in the API.
node_templates:
VNF:
type: SAMPLE.VNF
properties:
flavour_id: { get_input: selected_flavour }
descriptor_id: 72700000-0000-0000-0000-202101690304
provider: SAMPLE
product_name: VNF
software_version: '1.0'
descriptor_version: 'VNF_1.0'
vnfm_info:
- Tacker

View File

@ -0,0 +1,47 @@
tosca_definitions_version: tosca_simple_yaml_1_2
description: Sample template definition
imports:
- etsi_nfv_sol001_common_types.yaml
- etsi_nfv_sol001_vnfd_types.yaml
node_types:
SAMPLE.VNF:
derived_from: tosca.nodes.nfv.VNF
properties:
descriptor_id:
type: string
default: 72700000-0000-0000-0000-202101690304
descriptor_version:
type: string
constraints: [ valid_values: [ 'VNF_1.0' ] ]
default: 'VNF_1.0'
provider:
type: string
constraints: [ valid_values: [ SAMPLE ] ]
default: SAMPLE
product_name:
type: string
constraints: [ valid_values: [ VNF ] ]
default: 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: [ default ] ]
default: default
flavour_description:
type: string
default: 'n-vnf'
interfaces:
Vnflcm:
type: tosca.interfaces.nfv.Vnflcm

View File

@ -0,0 +1,39 @@
configurable_properties:
_VAR_user: 'some_user'
_VAR_password: 'password'
_VAR_vdu_password: 'password'
vdus:
VDU1:
config:
order: 1
vm_app_config:
type: ansible
instantiation:
- path: _VAR_vnf_package_path/Scripts/Media/sample_start.yaml
params:
ansible_password: _VAR_password
order: 0
termination:
- path: _VAR_vnf_package_path/Scripts/Media/sample_start.yaml
params:
ansible_password: _VAR_password
order: 0
healing:
- path: _VAR_vnf_package_path/Scripts/Media/sample_start.yaml
params:
ansible_password: _VAR_password
order: 0
scale-in:
- path: _VAR_vnf_package_path/Scripts/Media/sample_start.yaml
params:
ansible_password: _VAR_password
order: 0
scale-out:
- path: _VAR_vnf_package_path/Scripts/Media/sample_start.yaml
params:
ansible_password: _VAR_password
order: 0
username: _VAR_user
password: _VAR_vdu_password

View File

@ -0,0 +1,13 @@
# This playbook prints a simple debug message
- name: Echo
hosts: 127.0.0.1
connection: local
tasks:
- name: Creates a file
remote_user: stack
become: yes
become_method: sudo
file:
path: "/tmp/sample.txt"
state: touch

View File

@ -0,0 +1,7 @@
TOSCA-Meta-File-Version: 1.0
CSAR-Version: 1.1
Created-by: Onboarding portal
Entry-Definitions: Definitions/helloworld3_top.vnfd.yaml
Name: Files/images/cirros-0.5.2-x86_64-disk.img
Content-type: application/x-iso9066-image

View File

@ -0,0 +1,35 @@
#
# 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):
api_param = UserDataUtil.get_diff_base_hot_param_from_api(
base_hot_dict, inst_req_info)
initial_param_dict = \
UserDataUtil.create_initial_param_server_port_dict(base_hot_dict)
vdu_flavor_dict = \
UserDataUtil.create_vdu_flavor_capability_name_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, **api_param}