diff options
Diffstat (limited to 'docs/all_vnfrqts_seed_docs/open_ecomp/inital_seed_ecomp/VNF_Heat_Templates_for_OpenEcomp/VNF_Heat_Template_Requirements_for_OpenECOMP_2_15_NO_track_changes.rst')
-rw-r--r-- | docs/all_vnfrqts_seed_docs/open_ecomp/inital_seed_ecomp/VNF_Heat_Templates_for_OpenEcomp/VNF_Heat_Template_Requirements_for_OpenECOMP_2_15_NO_track_changes.rst | 2233 |
1 files changed, 0 insertions, 2233 deletions
diff --git a/docs/all_vnfrqts_seed_docs/open_ecomp/inital_seed_ecomp/VNF_Heat_Templates_for_OpenEcomp/VNF_Heat_Template_Requirements_for_OpenECOMP_2_15_NO_track_changes.rst b/docs/all_vnfrqts_seed_docs/open_ecomp/inital_seed_ecomp/VNF_Heat_Templates_for_OpenEcomp/VNF_Heat_Template_Requirements_for_OpenECOMP_2_15_NO_track_changes.rst deleted file mode 100644 index 072a475..0000000 --- a/docs/all_vnfrqts_seed_docs/open_ecomp/inital_seed_ecomp/VNF_Heat_Templates_for_OpenEcomp/VNF_Heat_Template_Requirements_for_OpenECOMP_2_15_NO_track_changes.rst +++ /dev/null @@ -1,2233 +0,0 @@ -.. contents:: - :depth: 3 -.. - -| VNF -| Heat Template Requirements for -| OpenECOMP - -Revision 1.0 - -Revision Date 2/1/2017 - -**Document Revision History** - -+------------+------------+-----------------------------------------------------------------------+ -| Date | Revision | Description | -+============+============+=======================================================================+ -| 2/1/2017 | 1.0 | Initial publication of VNF Heat Template Requirements for OpenECOMP | -+------------+------------+-----------------------------------------------------------------------+ - -**Table of Contents** - -**Definitions** - -Throughout the document, these terms have the following meaning: - -**MUST** This word, or the terms "REQUIRED" or "SHALL", mean that the -definition is an absolute requirement of the specification. - -**MUST** **NOT** This phrase, or the phrase "SHALL NOT", mean that the -definition is an absolute prohibition of the specification. - -**SHOULD** This word, or the adjective "RECOMMENDED", mean that there -may exist valid reasons in particular circumstances to ignore a -particular item, but the full implications must be understood and -carefully weighed before choosing a different course. - -**SHOULD** **NOT** This phrase, or the phrase "NOT RECOMMENDED" mean -that there may exist valid reasons in particular circumstances when the -particular behavior is acceptable or even useful, but the full -implications should be understood and the case carefully weighed before -implementing any behavior described with this label. - -**MAY** This word, or the adjective "OPTIONAL", mean that an item is -truly optional. One vendor may choose to include the item because a -particular marketplace requires it or because the vendor feels that it -enhances the product while another vendor may omit the same item. An -implementation which does not include a particular option must be -prepared to interoperate with another implementation which does include -the option, though perhaps with reduced functionality. In the same vein -an implementation which does include a particular option must be -prepared to interoperate with another implementation which does not -include the option (except, of course, for the feature the option -provides.) - -Introduction -============ - -This reference document is the **VNF Heat Template Requirements for OpenECOMP** -and supports the first release of OpenECOMP. - -Program and Document Structure ------------------------------- - -This document is part of a hierarchy of documents that describes the -overall Requirements and Guidelines for OpenECOMP. The diagram below -identifies where this document fits in the hierarchy. - -+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| OpenECOMP Requirements and Guidelines | -+===============================================================================================================================================================================================================+ -| VNF Guidelines for Network Cloud and OpenECOMP | Future OpenECOMP Subject Documents | -+------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| VNF Cloud Readiness Requirements for OpenECOMP | VNF Management Requirements for OpenECOMP | VNF Heat Template Requirements for OpenECOMP | Future,VNF Requirements Documents | Future Requirements Documents | -+------------------------------------------------+-------------------------------------------+----------------------------------------------+-----------------------------------+-------------------------------+ - -Document Summary - -**VNF Guidelines for Network Cloud and OpenECOMP** - -- Describes VNF environment and overview of requirements - -*VNF Cloud Readiness Requirements for OpenECOMP* - -- Cloud readiness requirements for VNFs (Design, Resiliency, Security, - and DevOps) - -*VNF Management Requirements for OpenECOMP* - -- Requirements for how VNFs interact and utilize OpenECOMP - -**VNF Heat Template Requirements for OpenECOMP** - -- Provides recommendations and standards for building Heat templates - compatible with OpenECOMP– initial implementations of Network Cloud - are assumed to be OpenStack based. - -Intended Audience ------------------ - -This document is intended for persons developing Heat templates that -will be orchestrated by OpenECOMP. - -Scope ------ - -The first implementations of Network Cloud are assumed to be OpenStack -based and thus OpenECOMP will be supporting Heat Orchestration -Templates, also referred to as Heat templates or Heat in this document. - -OpenECOMP requires the Heat Templates to follow a specific format. This -document provides the mandatory, recommended, and optional requirements -associated with this format. - -In addition, the OpenStack version deployed in the Network Cloud may -impose additional constraints on the Heat. These constraints are not -covered in this document. - -VNF Modularity Overview ------------------------ - -OpenECOMP supports a modular Heat design pattern, referred to as *VNF -Modularity.* With this approach, a single VNF may be composed from one -or more Heat templates, each of which represents some subset of the -overall VNF. These component parts are referred to as “\ *VNF -Modules*\ ”. During orchestration, these modules may be deployed -incrementally to build up the complete VNF. - -A Heat template can be either one of the following types of modules: - -1. Base Module - -2. Incremental Modules - -3. Independent Cinder Volume Modules - -The OpenECOMP Heat template naming convention must be followed (Section -2.1). The naming convention identifies the module type. - -A VNF must be composed of one “base” VNF module (also called a base -module) and zero to many “incremental” or “add on” VNF modules. The base -module must be deployed first, prior to the add-on modules. - -A module can be thought of as equivalent to a Heat template, where a -Heat template is composed of a YAML file and an environment file (also -referred to as an ENV file). A given YAML file must have a corresponding -environment file; OpenECOMP requires it. - -A Heat template is used to create or deploy a Heat stack. Therefore, a -module is also equivalent to a Heat Stack. - -OpenECOMP supports the concept of an optional, independent deployment of -a Cinder volume via separate Heat templates. This allows the volume to -persist after VNF deletion so that the volume can be reused on another -instance (e.g. during a failover activity). - -The scope of a volume module, when it exists, must be 1:1 with the VNF -Module (base or add-on). A single volume module must create only the -volumes needed by a single VNF module (base or add-on). - -These concepts will be described in more detail throughout the document. -This overview is provided to set the stage and help clarify the concepts -that will be introduced. - -General Guidelines -================== - -The Heat templates supported by OpenECOMP must follow the requirements -enumerated in this section. - -Filenames ---------- - -In order to enable OpenECOMP to understand the relationship between Heat -files, the following Heat file naming convention must be followed. - -- The file name for the base module Heat template must include “base” - in the filename. - - - Examples: *base\_xyz.yml* or *base\_xyz.yaml*; *xyz\_base.yml* or - *xyz\_base.yaml* - -- There is no explicit naming convention for the add-on modules. - - - Examples: *module1.yml* or *module1.yaml* - -- All Cinder volume templates must be named the same as the - corresponding Heat template with “\_volume” appended to the file - name. - - - Examples: *base\_xyz\_volume.yml* or *base\_xyz\_volume.yaml*; - *xyz\_base\_volume.yml* or *xyz\_base\_volume.yaml*; - *module1\_volume.yml* or *module1\_volume.yaml* (referencing the - above base module Heat template name) - -- The file name of the environment files must fully match the - corresponding Heat template filename and have *.env* or *.ENV* - extension. - - - Examples: *base\_xyz.env* or *base\_xyz.ENV*; *xyz\_base.env* or - *xyz\_base.ENV*; *base\_xyz\_volume.env* or - *base\_xyz\_volume.ENV*; *module1.env* or *module1.ENV; - module1\_volume.env* or *module1\_volume.ENV* (referencing the - above base module Heat template name) - -- A YAML file must have a corresponding ENV file, even if the ENV file - enumerates no parameters. It is an OpenECOMP requirement. - -Valid YAML Format ------------------ - -A Heat template (a YAML file and its corresponding environment file) -must be formatted in valid YAML. For a description of YAML, refer to the -following OpenStack wiki: -https://wiki.openstack.org/wiki/Heat/YAMLTemplates - -A Heat template must follow a specific format. The OpenStack Heat -Orchestration Template (HOT) specification explains in detail all -elements of the HOT template format. -http://docs.openstack.org/developer/heat/template_guide/hot_spec.html - -Parameter Categories & Specification ------------------------------------- - -Parameter Categories -~~~~~~~~~~~~~~~~~~~~ - -OpenECOMP requires the Heat template parameters to follow certain -requirements in order for it to be orchestrated or deployed. OpenECOMP -classifies parameters into eight broad categories. - -- **OpenECOMP Metadata**: OpenECOMP mandatory and optional metadata - parameters in the resource *OS::Nova::Server*. - - - OpenECOMP dictates the naming convention of these Metadata - parameters and must be adhered to (See Section 4.4). - - - Metadata parameters must not be enumerated in the environment - file. - - - The OpenECOMP Metadata are generated and/or assigned by OpenECOMP - and supplied to the Heat by OpenECOMP at orchestration time. - -- **OpenECOMP Orchestration Parameters**: The data associated with - these parameters are VNF instance specific. - - - OpenECOMP enforces the naming convention of these parameters and - must be adhered to (See Section 4). - - - These parameters must not be enumerated in the environment file. - - - The OpenECOMP Orchestration Parameters are generated and/or - assigned by OpenECOMP and supplied to the Heat by OpenECOMP at - orchestration time. - -- **VNF Orchestration Parameters**: The data associated with these - parameters are VNF instance specific. - - - While OpenECOMP does not enforce a naming convention, the - parameter names should include {vm-type} and {network-role} when - appropriate. (See Section 4) - - - These parameters must not be enumerated in the environment file. - - - The VNF Orchestration Parameters Heat are generated and/or - assigned by OpenECOMP and supplied to the Heat by OpenECOMP at - orchestration time. - -- **OpenECOMP Orchestration Constants**: The data associated with these - parameters must be constant across all VNF instances. - - - OpenECOMP enforces the naming convention of these parameters and - must be adhered to (See Section 4). - - - These parameters must be enumerated in the environment file. - -- **VNF Orchestration Constants**: The data associated with these - parameters must be constant across all VNF instances. - - - While OpenECOMP does not enforce a naming convention, the - parameter names should include {vm-type} and {network-role} when - appropriate. (See Section 4) - - - These parameters must be enumerated in the environment file. - -- **OpenECOMP Base Template Output Parameters** (also referred to as - Base Template Output Parameters): The output section of the base - template allows for specifying output parameters available to add-on - modules once the base template has been instantiated. The parameter - defined in the output section of the base must be identical to the - parameter defined in the add-on module(s) where the parameter is - used. - -- **OpenECOMP Volume Template Output Parameters** (also referred to as - Volume Template Output Parameters): The output section of the volume - template allows for specifying output parameters available to the - corresponding Heat template (base or add-on) once the volume template - has been instantiated. The parameter defined in the output section of - the volume must be identical to the parameter defined in the base or - add-on module. - -- **OpenECOMP Predefined Output Parameters** (also referred to as - Predefined Output Parameters): OpenECOMP will look for a small set of - pre-defined Heat output parameters to capture resource attributes for - inventory in OpenECOMP. These parameters are specified in Section - 4.6. - -The table below summarizes the Parameter Types. If the user is -orchestrating a manual spin up of Heat (e.g. OpenStack command line), -the parameter values that OpenECOMP supplies must be enumerated in the -environment file. However, when the Heat is to be loaded into OpenECOMP -for orchestration, the parameters that OpenECOMP supplies must be -deleted or marked with a comment (i.e., a “#” placed at the beginning of -a line). - -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| Parameter Type | Naming Convention | Parameter Value Source | -+===============================================+=====================+=================================================================================+ -| OpenECOMP Metadata | Explicit | OpenECOMP | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| OpenECOMP Orchestration Parameters | Explicit | OpenECOMP | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| VNF Orchestration Parameters | Recommended | OpenECOMP | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| OpenECOMP Orchestration Constants | Explicit | Environment File | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| VNF Orchestration Constants | Recommended | Environment File | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| OpenECOMP Base Template Output Parameters | Recommended | Heat Output Statement for base, OpenECOMP supplied to add-on modules | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| OpenECOMP Volume Template Output Parameters | Recommended | Heat Output Statement for volume, OpeneECOMP supplies to corresponding module | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ -| OpenECOMP Predefined Output Parameters | Explicit | Heat Output Statement | -+-----------------------------------------------+---------------------+---------------------------------------------------------------------------------+ - -Table 1 Parameter Types - -Parameter Specifications -~~~~~~~~~~~~~~~~~~~~~~~~ - -OpenECOMP METADATA Parameters -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -OpenECOMP defines four “metadata” parameters: vnf\_id, vf\_module\_id, -vnf\_name, vf\_module\_name. These parameters must not define any -constraints in the Heat template, including length restrictions, ranges, -default value and/or allowed patterns. - -OpenECOMP Base Template & Volume Template Output Parameters -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The base template and volume template output parameters are defined as -input parameters in subsequent modules. When defined as input -parameters, these parameters must not define any constraints in the Heat -template, including length restrictions, ranges, default value and/or -allowed patterns. The parameter name defined in the output statement of -the Heat must be identical to the parameter name defined in the Heat -that is to receive the value. - -OpenECOMP Predefined Output Parameters -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These parameters must not define any constraints in the Heat template, -including length restrictions, ranges, default value and/or allowed -patterns. - -OpenECOMP Orchestration Parameters, VNF Orchestration Parameters, OpenECOMP Orchestration Constants, VNF Orchestration Constants -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -OpenECOMP Orchestration Parameters, VNF Orchestration Parameters, -OpenECOMP Orchestration Constants, VNF Orchestration Constants must -adhere to the following: - -- All parameters should be clearly documented in the template, - including expected values. - -- All parameters should be clearly specified, including constraints and - description. - -- Numeric parameter constraints should include range and/or allowed - values. - -- When the parameter type is a string and the parameter name contains - an index, the index must be zero based. That is, the index starts at - zero. - -- When the parameter type is a Comma Delimited List (CDL), the - reference index must start at zero. - -- Default values must only be supplied in a Heat environment file to - keep the template itself as clean as possible. - -- Special characters must not be used in parameter names, as currently - only alphanumeric characters and “\_” underscores are allowed. - -Use of Heat Environments ------------------------- - -A YAML file must have a corresponding environment file (also referred to -as ENV file), even if the environment file defines no parameters. It is -an OpenECOMP requirement. - -The environment file must contain parameter values for the OpenECOMP -Orchestration Constants and VNF Orchestration Constants. These -parameters are identical across all instances of a VNF type, and -expected to change infrequently. The OpenECOMP Orchestration Constants -are associated with OS::Nova::Server image and flavor properties (See -Section 4.3). Examples of VNF Orchestration Constants are the networking -parameters associated with an internal network (e.g. private IP ranges) -and Cinder volume sizes. - -The environment file must not contain parameter values for parameters -that are instance specific (OpenECOMP Orchestration Parameters, VNF -Orchestration Parameters). These parameters are supplied to the Heat by -OpenECOMP at orchestration time. The parameters are generated and/or -assigned by OpenECOMP at orchestration time - -Independent Volume Templates ----------------------------- - -OpenECOMP supports independent deployment of a Cinder volume via -separate Heat templates. This allows the volume to persist after VNF -deletion so that they can be reused on another instance (e.g. during a -failover activity). - -A VNF Incremental Module or Base Module may have an independent volume -module. Use of separate volume modules is optional. A Cinder volume may -be embedded within the Incremental or Base Module if persistence is not -required. - -If a VNF Incremental Module or Base Module has an independent volume -module, the scope of volume templates must be 1:1 with Incremental -module or Base module. A single volume module must create only the -volumes required by a single Incremental module or Base module. - -The following rules apply to independent volume Heat templates: - -- Cinder volumes must be created in a separate Heat template from the - Incremental and Base Modules. - - - A single volume module must include all Cinder volumes needed by - the Incremental/Base module. - - - The volume template must define “outputs” for each Cinder volume - resource universally unique identifier (UUID) (i.e. OpenECOMP - Volume Template Output Parameters). - -- The VNF Incremental Module or Base Module must define input - parameters that match each Volume output parameter (i.e., OpenECOMP - Volume Template Output Parameters). - - - OpenECOMP will supply the volume template outputs automatically to - the bases/incremental template input parameters. - -- Volume modules may utilize nested Heat templates. - -**Example (volume template):** - - In this example, the {vm-type} has been left as a variable. - {vm-type} is described in section 4.1. If the VM was a load - balancer, the {vm-type} could be defined as “lb” - -.. code-block:: yaml - - parameters: - vm-typevnf\_name: - type: string - {vm-type}\_volume\_size\_0: - type: number - ... - - resources: - {vm-type}\_volume\_0: - type: OS::Cinder::Volume - properties: - name: - str\_replace: - template: VNF\_NAME\_volume\_0 - params: - VNF\_NAME: { get\_param: vnf\_name } - size: {get\_param: {vm-type}\_volume\_size\_0} - ... - -*(+ additional volume definitions)* - -.. code-block:: yaml - - outputs: - {vm-type}\_volume\_id\_0: - value: {get\_resource: {vm-type}\_volume\_0} - ... - -*(+ additional volume outputs)* - -*Example (VNF module template):* - -.. code-block:: yaml - - parameters: - {vm-type}\_name\_0: - type: string - {vm-type}\_volume\_id\_0: - type: string - ... - - resources: - {vm-type}\_0: - type: OS::Nova::Server - properties: - name: {get\_param: {vm-type}\_name\_0} - networks: - ... - - {vm-type}\_0\_volume\_attach: - type: OS::Cinder::VolumeAttachment - properties: - instance\_uuid: { get\_resource: {vm-type}\_0 } - volume\_id: { get\_param: {vm-type}\_volume\_id\_0 } - -Nested Heat Templates ---------------------- - -OpenECOMP supports nested Heat templates per the OpenStack -specifications. Nested templates may be suitable for larger VNFs that -contain many repeated instances of the same VM type(s). A common usage -pattern is to create a nested template for each VM type along with its -supporting resources. The master VNF template (or VNF Module template) -may then reference these component templates either statically (by -repeated definition) or dynamically (via *OS::Heat::ResourceGroup*). - -Nested template support in OpenECOMP is subject to the following -limitations: - -- Heat templates for OpenECOMP must only have one level of nesting. - OpenECOMP only supports one level of nesting. - -- Nested templates must be referenced by file name in the master - template - - - i.e. use of *resource\_registry* in the .env file is *not* - currently supported - -- Nested templates must have unique file names within the scope of the - VNF - -- OpenECOMP does not support a directory hierarchy for nested - templates. All templates must be in a single, flat directory (per - VNF) - -- A nested template may be shared by all Modules (i.e., Heat templates) - within a given VNF - -Networking -=========== - -External Networks ------------------ - -VNF templates must not include any resources for external networks -connected to the VNF. In this context, “external” is in relation to the -VNF itself (not with regard to the Network Cloud site). External -networks may also be referred to as “inter-VNF” networks. - -- External networks must be orchestrated separately, so they can be - shared by multiple VNFs and managed independently. When the external - network is created, it must be assigned a unique {network-role} (See - section 4.2). - -- External networks must be passed into the VNF template as parameters, - including the network-id (i.e. the neutron network UUID) and optional - subnet ID. - -- VNF templates must pass the appropriate external network IDs into - nested VM templates when nested Heat is used. - -- VNFs may use DHCP assigned IP addresses or assign fixed IPs when - attaching VMs to an external network. - -- OpenECOMP enforces a naming convention for parameters associated with - external networks. - -- Parameter values associated with an external network will be - generated and/or assigned by OpenECOMP at orchestration time. - -- Parameter values associated with an external network must not be - enumerated in the environment file. - -Internal Networks ------------------ - -Orchestration activities related to internal networks must be included -in VNF templates. In this context, “internal” is in relation to the VNF -itself (not in relation to the Network Cloud site). Internal networks -may also be referred to as “intra-VNF” networks or “private” networks. - -- Internal networks must not attach to any external gateways and/or - routers. Internal networks are for intra-VM communication only. - -- In the modular approach, internal networks must be created in the - Base Module template, with their resource IDs exposed as outputs - (i.e., OpenECOMP Base Template Output Parameters) for use by all - add-on module templates. When the external network is created, it - must be assigned a unique {network-role} (See section 4.2). - -- VNFs may use DHCP assigned IP addresses or assign fixed IPs when - attaching VMs to an internal network. - -- OpenECOMP does not enforce a naming convention for parameters for - internal network, however, a naming convention is provided that - should be followed. - -- Parameter values associated with an internal network must either be - passed as output parameter from the base template (i.e., OpenECOMP - Base Template Output Parameters) into the add-on modules or be - enumerated in the environment file. - -IP Address Assignment ---------------------- - -- VMs connect to external networks using either fixed (e.g. statically - assigned) IP addresses or DHCP assigned IP addresses. - -- VMs connect to internal networks using either fixed (e.g. statically - assigned) IP addresses or DHCP assigned IP addresses. - -- Neutron Floating IPs must not be used. OpenECOMP does not support - Neutron Floating IPs. - -- OpenECOMP supports the OS::Neutron::Port property - “allowed\_address\_pairs.” See Section 4.4.3. - -Parameter Naming Convention -=========================== - -{vm-type} ---------- - -A common *{vm-type}* identifier must be used throughout the Heat -template in naming parameters, for each VM type in the VNF with the -following exceptions: - -- The four OpenECOMP Metadata parameters must not be prefixed with a - common {vm-type} identifier. They are *vnf\_name*, *vnf\_id*, - *vf\_module\_id*, *vf\_module\_name*. - -- Parameters only referring to a network or subnetwork must not be - prefixed with a common {vm-type} identifier. - -- The parameter referring to the OS::Nova::Server property - availability\_zone must not be prefixed with a common {vm-type} - identifier. - -- {vm-type} must be unique to the VNF. It does not have to be globally - unique across all VNFs that OpenECOMP supports. - -{network-role} --------------- - -VNF templates must not include any resources for external networks -connected to the VNF. In this context, “external” is in relation to the -VNF itself (not with regard to the Network Cloud site). External -networks may also be referred to as “inter-VNF” networks. - -External networks must be orchestrated separately, so they can be shared -by multiple VNFs and managed independently. When the external network is -created, it must be assigned a unique {network-role}. - -“External” networks must be passed into the VNF template as parameters. -Examples include the network-id (i.e. the neutron network UUID) and -optional subnet ID. See section 4.4.3. - -Any parameter that is associated with an external network must include -the {network-role} as part of the parameter name. - -Internal network parameters must also define a {network-role}. Any -parameter that is associated with an internal network must include -int\_{network-role} as part of the parameter name. - -Resource: OS::Nova::Server - Parameters ---------------------------------------- - -The following OS::Nova::Server Resource Property Parameter Names must -follow the OpenECOMP parameter Naming Convention. All the parameters -associated with OS::Nova::Server are classified as OpenECOMP -Orchestration Parameters. - -+----------------------+-----------------------------------------+------------------+ -| OS::Nova::Server | -+======================+=========================================+==================+ -| Property | OpenECOMP Parameter Naming Convention | Parameter Type | -+----------------------+-----------------------------------------+------------------+ -| image | {*vm-type*}\_image\_name | string | -+----------------------+-----------------------------------------+------------------+ -| flavor | {*vm-type*}\_flavor\_name | string | -+----------------------+-----------------------------------------+------------------+ -| name | {*vm-type*}\_name\_{*index*} | string | -+----------------------+-----------------------------------------+------------------+ -| | {vm-type}\_names | CDL | -+----------------------+-----------------------------------------+------------------+ -| availability\_zone | availability\_zone\_{index} | string | -+----------------------+-----------------------------------------+------------------+ - -Table 2 Resource Property Parameter Names - -Property: image -~~~~~~~~~~~~~~~ - -Image is an OpenECOMP Orchestration Constant parameter. The image must -be referenced by the Network Cloud Service Provider (NCSP) image name, -with the parameter enumerated in the Heat environment file. - -The parameters must be named *“{vm-type}\_image\_name”* in the VNF. - -Each VM type (e.g., {vm-type}) should have a separate parameter for -images, even if several share the same image. This provides maximum -clarity and flexibility. - -Property: flavor -~~~~~~~~~~~~~~~~ - -Flavor is an OpenECOMP Orchestration Constant parameter. The flavors -must be referenced by the Network Cloud Service Provider (NCSP) flavor -name, with the parameter enumerated in the Heat environment file. - -The parameters must be named *“{vm-type}\_flavor\_name”* for each -*{vm-type}* in the VNF. - -Each VM type should have separate parameters for flavors, even if more -than one VM shares the same flavor. This provides maximum clarity and -flexibility. - -Property: Name -~~~~~~~~~~~~~~ - -Name is an OpenEOMP Orchestration parameter; the value is provided to -the Heat template by OpenECOMP. - -VM names (hostnames) for assignment to VM instances must be passed to -Heat templates either as - -- an array (comma delimited list) for each VM type - -- a set of fixed-index parameters for each VM type instance. - -Each element in the VM Name list should be assigned to successive -instances of that VM type. - -The parameter names must reflect the VM Type (i.e., include the -{vm-type} in the parameter name.) The parameter name format must be one -of the following: - -- If the parameter type is a comma delimited list: {**vm-type**}\_names - -- If the parameter type is a string with a fixed index: - {**vm-type**}\_name\_{**index**} - -If a VNF contains more than three instances of a given {vm-type}, the -CDL form of the parameter name (i.e., *{vm-type}*\ \_names} should be -used to minimize the number of unique parameters defined in the Heat. - -*Examples:* - -.. code-block:: yaml - - parameters: - {vm-type}\_names: - type: comma\_delimited\_list - description: VM Names for {vm-type} VMs - {vm-type}\_name\_{index}: - type: string - description: VM Name for {vm-type} VM {index} - -*Example (CDL):* - -In this example, the {vm-type} has been defined as “lb” for load -balancer. - -.. code-block:: yaml - - parameters: - lb\_names: - type: comma\_delimited\_list - description: VM Names for lb VMs - resources: - lb\_0: - type: OS::Nova::Server - properties: - name: { get\_param: [lb\_names, 0] } - ... - - lb\_1: - type: OS::Nova::Server - properties: - name: { get\_param: [lb\_names, 1] } - ... - -**Example (fixed-index):** - -In this example, the {vm-type} has been defined as “lb” for load -balancer. - -.. code-block:: yaml - - parameters: - lb\_name\_0: - type: string - description: VM Name for lb VM 0 - lb\_name\_1: - type: string - description: VM Name for lb VM 1 - - resources: - lb\_0: - type: OS::Nova::Server - properties: - name: { get\_param: lb\_name\_0 } - ... - - lb\_1: - type: OS::Nova::Server - properties: - name: { get\_param: lb\_name\_1 } - ... - -Property: availability\_zone -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Availability\_zone is an OpenECOMP Orchestration parameter; the value is -provided to the Heat template by OpenECOMP. - -Availability zones must be passed as individual numbered parameters (not -as arrays) so that VNFs with multi-availability zone requirements can -clearly specify that in its parameter definitions. - -The availability zone parameter must be defined as -“availability\_zone\_{index}”, with the {index} starting at zero. - -*Example:* - -In this example, the {vm-type} has been defined as “lb” for load -balancer. - -.. code-block:: yaml - - parameters: - lb\_names: - type: comma\_delimited\_list - description: VM Names for lb VMs - availability\_zone\_0: - type: string - description: First availability zone ID or Name - - resources: - lb\_0: - type: OS::Nova::Server - properties: - name: { get\_param: [lb\_names, 0] } - availability\_zone: { get\_param: availability\_zone\_0 } - ... - -Resource: OS::Nova::Server - Metadata -------------------------------------- - -This section describes the OpenECOMP Metadata parameters. - -OpenECOMP Heat templates must include the following three parameters -that are used as metadata under the resource OS::Nova:Server: vnf\_id, -vf\_module\_id, vnf\_name - -OpenECOMP Heat templates may include the following parameter that is -used as metadata under the resource OS::Nova:Server: vf\_module\_name. - -These parameters are all classified as OpenECOMP Metadata. - -+---------------------------+------------------+----------------------+ -| Metadata Parameter Name | Parameter Type | Mandatory/Optional | -+===========================+==================+======================+ -| vnf\_id | string | mandatory | -+---------------------------+------------------+----------------------+ -| vf\_module\_id | string | mandatory | -+---------------------------+------------------+----------------------+ -| vnf\_name | string | mandatory | -+---------------------------+------------------+----------------------+ -| vf\_module\_name | string | optional | -+---------------------------+------------------+----------------------+ - - Table 3 OpenECOMP Metadata - -Required Metadata Elements -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The vnf\_id, vf\_module\_id, and vnf\_name metadata elements are -required (must) for *OS::Nova::Server* resources. The metadata -parameters will be used by OpenECOMP to associate the servers with the -VNF instance. - -- vnf\_id - - - *“vnf\_id”* parameter value will be supplied by OpenECOMP. - OpenECOMP generates the UUID that is the vnf\_id and supplies it - to the Heat at orchestration time. - -- vf\_module\_id - - - “\ *vf\_module\_id”* parameter value will be supplied by - OpenECOMP. OpenECOMP generates the UUID that is the vf\_module\_id - and supplies it to the Heat at orchestration time. - -- vnf\_name - - - “\ *vnf\_name”* parameter value will be generated and/or assigned - by OpenECOMP and supplied to the Heat by OpenECOMP at - orchestration time. - -Optional Metadata Elements -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The following metadata element is optional for *OS::Nova::Server* -resources: - -- *vf\_module\_name* - - - The vf\_module\_name is the name of the name of the Heat stack - (e.g., <STACK\_NAME>) in the command “Heat stack-create” (e.g. - Heat stack-create [-f <FILE>] [-e <FILE>] <STACK\_NAME>). The - <STACK\_NAME> needs to be specified as part of the orchestration - process. - - - *“vf\_module\_name”* parameter value, when used, will be supplied - by OpenECOMP to the Heat at orchestration time. The parameter will - be generated and/or assigned by OpenECOMP and supplied to the Heat - by OpenECOMP at orchestration time. - -*Example* - -In this example, the {vm-type} has been defined as “lb” for load -balancer. - -.. code-block:: yaml - - parameters: - vnf\_name: - type: string - description: Unique name for this VNF instance - vnf\_id: - type: string - description: Unique ID for this VNF instance - vf\_module\_name: - type: string - description: Unique name for this VNF Module instance - vf\_module\_id: - type: string - description: Unique ID for this VNF Module instance - - resources: - lb\_server\_group: - type: OS::Nova::ServerGroup - properties: - name: - str\_replace: - template: VNF\_NAME\_lb\_ServerGroup - params: - VNF\_NAME: { get\_param: VNF\_name } - policies: [ ‘anti-affinity’ ] - - lb\_vm\_0: - type: OS::Nova::Server - properties: - name: { get\_param: lb\_name\_0 } - scheduler\_hints: - group: { get\_resource: lb\_server\_group } - metadata: - vnf\_name: { get\_param: vnf\_name } - vnf\_id: { get\_param: vnf\_id } - vf\_module\_name: { get\_param: vf\_module\_name } - vf\_module\_id: { get\_param: vf\_module\_id } - ... - -Resource: OS::Neutron::Port - Parameters ----------------------------------------- - -The following four OS::Neutron::Port Resource Property Parameters must -adhere to the OpenECOMP parameter naming convention. - -- network - -- subnet - -- fixed\_ips - -- allowed\_address\_pairs - -These four parameters reference a network, which maybe an external -network or an internal network. Thus the parameter will include -{network-role} in its name. - -When the parameter references an external network, the parameter is an -OpenECOMP Orchestration Parameter. The parameter value must be supplied -by OpenECOMP. The parameters must adhere to the OpenECOMP parameter -naming convention. - -+---------------------------+-----------------------------------------------+------------------+ -| OS::Neutron::Port | -+===========================+===============================================+==================+ -| Property | Parameter Name for External Networks | Parameter Type | -+---------------------------+-----------------------------------------------+------------------+ -| Network | {network-role}\_net\_id | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {network-role}\_net\_name | string | -+---------------------------+-----------------------------------------------+------------------+ -| Subnet | {network-role}\_subnet\_id | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {network-role}\_v6\_subnet\_id | string | -+---------------------------+-----------------------------------------------+------------------+ -| fixed\_ips | {vm-type}\_{network-role}\_ip\_{index} | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_ips | CDL | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_v6\_ip\_{index} | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_v6\_ips | CDL | -+---------------------------+-----------------------------------------------+------------------+ -| allowed\_address\_pairs | {vm-type}\_{network-role}\_floating\_ip | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_floating\_v6\_ip | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_ip\_{index} | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_ips | CDL | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_v6\_ip\_{index} | string | -+---------------------------+-----------------------------------------------+------------------+ -| | {vm-type}\_{network-role}\_v6\_ips | CDL | -+---------------------------+-----------------------------------------------+------------------+ - -Table 4 Port Resource Property Parameters (External Networks) - -When the parameter references an internal network, the parameter is a -VNF Orchestration Parameters. The parameter value(s) must be supplied -either via an output statement(s) in the base module (i.e., OpenECOMP -Base Template Output Parameters) or be enumerated in the environment -file. The parameters must adhere to the following parameter naming -convention. - -+---------------------------+----------------------------------------------------+------------------+ -| OS::Neutron::Port | -+===========================+====================================================+==================+ -| Property | Parameter Name for Internal Networks | Parameter Type | -+---------------------------+----------------------------------------------------+------------------+ -| Network | int\_{network-role}\_net\_id | string | -+---------------------------+----------------------------------------------------+------------------+ -| | int\_{network-role}\_net\_name | string | -+---------------------------+----------------------------------------------------+------------------+ -| Subnet | int\_{network-role}\_subnet\_id | string | -+---------------------------+----------------------------------------------------+------------------+ -| | Int\_{network-role}\_v6\_subnet\_id | string | -+---------------------------+----------------------------------------------------+------------------+ -| fixed\_ips | {vm-type}\_int\_{network-role}\_ip\_{index} | string | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_ips | CDL | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_v6\_ip\_{index} | string | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_v6\_ips | CDL | -+---------------------------+----------------------------------------------------+------------------+ -| allowed\_address\_pairs | {vm-type}\_int\_{network-role}\_floating\_ip | string | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_floating\_v6\_ip | string | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_ip\_{index} | string | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_ips | CDL | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_v6\_ip\_{index} | string | -+---------------------------+----------------------------------------------------+------------------+ -| | {vm-type}\_int\_{network-role}\_v6\_ips | CDL | -+---------------------------+----------------------------------------------------+------------------+ - -Table 5 Port Resource Property Parameters (Internal Networks) - -Property: network & subnet -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The property “networks” in the resource OS::Neutron::Port must be -referenced by Neutron Network ID, a UUID value, or by the network name -defined in OpenStack. - -When the parameter is referencing an “external” network, the parameter -must adhere to the following naming convention - -- *“{*\ network-role}\_net\_id”, for the Neutron network ID - -- “{network-role}\_net\_name”, for the network name in OpenStack - -When the parameter is referencing an “internal” network, the parameter -must adhere to the following naming convention. - -- “\ *int\_{network-role}\_net\_id*\ ”, for the Neutron network ID - -- “\ *int\_{network-role}\_net\_name*\ ”, for the network name in - OpenStack - -The property “subnet\_id” must be used if a DHCP IP address assignment -is being requested and the DHCP IP address assignment is targeted at a -specific subnet. - -The property “subnet\_id” should not be used if all IP assignments are -fixed, or if the DHCP assignment does not target a specific subnet - -When the parameter is referencing an “external” network subnet, the -“subnet\_id” parameter must adhere to the following naming convention. - -- “\ *{network-role}\_subnet\_id*\ ” if the subnet is an IPv4 subnet - -- “\ *{network-role}\_v6\_subnet\_id”* if the subnet is an IPv6 subnet - -When the parameter is referencing an “internal” network subnet, the -“subnet\_id” parameter must adhere to the following naming convention. - -- “\ *int\_{network-role}\_subnet\_id*\ ” if the subnet is an IPv4 - subnet - -- “\ *int\_{network-role}\_v6\_subnet\_id*\ ” if the subnet is an IPv6 - subnet - -*Example:* - -.. code-block:: yaml - - parameters: - {network-role}\_net\_id: - type: string - description: Neutron UUID for the {network-role} network - {network-role}\_net\_name: - type: string - description: Neutron name for the {network-role} network - {network-role}\_subnet\_id: - type: string - description: Neutron subnet UUID for the {network-role} network - {network-role}\_v6\_subnet\_id: - type: string - description: Neutron subnet UUID for the {network-role} network - -*Example:* - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} has been defined as “lb” for -load balancer. - -.. code-block:: yaml - - parameters: - oam\_net\_id: - type: string - description: Neutron UUID for the oam network - - resources: - lb\_port\_1: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - -Property: fixed\_ips -~~~~~~~~~~~~~~~~~~~~ - -The property “fixed\_ips” in the resource OS::Neutron::Port must be used -when statically assigning IP addresses. - -An IP address is assigned to a port on a type of VM (i.e., {vm-type}) -that is connected to a type of network (i.e., {network-role}). These two -tags are components of the parameter name. - -When the “fixed\_ips” parameter is referencing an “external” network, -the parameter must adhere to the naming convention below. The parameter -may be a comma delimited list or a string. - -There must be a different parameter name for IPv4 IP addresses and IPv6 -addresses - -- **Comma-delimited list:** Each element in the IP list should be - assigned to successive instances of that VM type on that network. - - - *Format for IPv4 addresses:* {vm-type}\_{network-role}\_ips - - - *Format for IPv6 addresses:* {vm-type}\_{network-role}\_v6\_ips - -- **A set of fixed-index parameters:** In this case, the parameter - should have “\ *type: string*\ ” and must be repeated for every IP - expected for each {vm-type} + {network-role} pair. - - - *Format for IPv4 addresses:* - {vm-type}\_{network-role}\_ip\_{index} - - - *Format for IPv6 addresses:* - {vm-type}\_{network-role}\_v6\_ip\_{index} - -When the “fixed\_ips” parameter is referencing an “internal” network, -the parameter must adhere to the naming convention below. The parameter -may be a comma delimited list or a string. - -There must be a different parameter name for IPv4 IP addresses and IPv6 -addresses - -- **Comma-delimited list:** Each element in the IP list should be - assigned to successive instances of that VM type on that network. - - - *Format for IPv4 addresses:* {vm-type}\_int\_{network-role}\_ips - - - *Format for IPv6 addresses:* - {vm-type}\_int\_{network-role}\_v6\_ips - -- **A set of fixed-index parameters:** In this case, the parameter - should have “\ *type: string*\ ” and must be repeated for every IP - expected for each {vm-type} and {network-role}pair. - - - *Format for IPv4 addresses:* - {vm-type}\_int\_{network-role}\_ip\_{index} - - - *Format for IPv6 addresses:* - {vm-type}\_int\_{network-role}\_v6\_ip\_{index} - -If a VNF contains more than three IP addresses for a given {vm-type} and -{network-role} combination, the CDL form of the parameter name should be -used to minimize the number of unique parameters defined in the Heat. - -*Example (external network)* - -.. code-block:: yaml - - parameters: - {vm-type}\_{network-role}\_ips: - type: comma\_delimited\_list - description: Fixed IPv4 assignments for {vm-type} VMs on the - {network-role} network - {vm-type}\_{network-role}\_v6\_ips: - type: comma\_delimited\_list - description: Fixed IPv6 assignments for {vm-type} VMs on the - {network-role} network - {vm-type}\_{network-role}\_ip\_{index}: - type: string - description: Fixed IPv4 assignment for {vm-type} VM {index} on the - {network-role} network - {vm-type}\_{network-role}\_v6\_ip\_{index}: - type: string - description: Fixed IPv6 assignment for {vm-type} VM {index} on the - {network-role} network - -*Example (CDL parameter for IPv4 Address Assignments to an external -network):* - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} has been defined as “db” for -database. - -.. code-block:: yaml - - parameters: - oam\_net\_id: - type: string - description: Neutron UUID for a oam network - db\_oam\_ips: - type: comma\_delimited\_list - description: Fixed IP assignments for db VMs on the oam network - - resources: - db\_0\_port\_1: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [ db\_oam\_ips, 0] - }}] - db\_1\_port\_1: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [ db\_oam\_ips, 1] - }}] - -*Example (string parameters for IPv4 Address Assignments to an external -network):* - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} has been defined as “db” for -database. - -.. code-block:: yaml - - parameters: - oam\_net\_id: - type: string - description: Neutron UUID for an OAM network - db\_oam\_ip\_0: - type: string - description: First fixed IP assignment for db VMs on the OAM network - db\_oam\_ip\_1: - type: string - description: Second fixed IP assignment for db VMs on the OAM network - - resources: - db\_0\_port\_1: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: db\_oam\_ip\_0}}] - db\_1\_port\_1: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: db\_oam\_ip\_1}}] - -Property: allowed\_address\_pairs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The property “allowed\_address\_pairs” in the resource OS::Neutron::Port -allows the user to specify mac\_address/ip\_address (CIDR) pairs that -pass through a port regardless of subnet. This enables the use of -protocols such as VRRP, which floats an IP address between two instances -to enable fast data plane failover. An “allowed\_address\_pairs” is -unique to a {vm-type} and {network-role} combination. The management of -these IP addresses (i.e. transferring ownership between active and -standby VMs) is the responsibility of the application itself. - -Note that these parameters are *not* intended to represent Neutron -“Floating IP” resources, for which OpenStack manages a pool of public IP -addresses that are mapped to specific VM ports. In that case, the -individual VMs are not even aware of the public IPs, and all assignment -of public IPs to VMs is via OpenStack commands. OpenECOMP does not -support Neutron-style Floating IPs. - -Both IPv4 and IPv6 “allowed\_address\_pairs” addresses are supported. - -If property “allowed\_address\_pairs” is used with an external network, -the parameter name must adhere to the following convention: - -- *Format for IPv4 addresses: {vm-type}\_{network-role}\_floating\_ip* - -- *Format for IPv6 addresses: - {vm-type}\_{network-role}\_floating\_v6\_ip* - -*Example:* - -.. code-block:: yaml - - parameters: - {vm-type}\_{network-role}\_floating\_ip: - type: string - description: VIP for {vm-type} VMs on the {network-role} network - {vm-type}\_{network-role}\_floating\_v6\_ip: - type: string - description: VIP for {vm-type} VMs on the {network-role} network - -*Example:* - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} has been defined as “db” for -database. - -.. code-block:: yaml - - parameters: - db\_oam\_ips: - type: comma\_delimited\_list - description: Fixed IPs for db VMs on the oam network - db\_oam\_floating\_ip: - type: string - description: Floating IP for db VMs on the oam network - resources: - db\_0\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [db\_oam\_ips,0] }}] - allowed\_address\_pairs: [ - { “ip\_address”: {get\_param: db\_oam\_floating\_ip}}] - db\_1\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [db\_oam\_ips,1] }}] - allowed\_address\_pairs: [ - { “ip\_address”: {get\_param: db\_oam\_floating\_ip}}] - -If property “allowed\_address\_pairs” is used with an internal network, -the parameter name should adhere to the following convention: - -- *Format for IPv4 addresses: - {vm-type}\_int\_{network-role}\_floating\_ip* - -- *Format for IPv6 addresses: - {vm-type}\_int\_{network-role}\_floating\_v6\_ip* - -Using the parameter *{vm-type}\_{network-role}\_floating\_ip* or -*{vm-type}\_{network-role}\_floating\_v6\_ip* provides only one floating -IP per Vm-type{vm-type} and {network-role} pair. If there is a need for -multiple floating IPs (e.g., Virtual IPs (VIPs)) for a given {vm-type} -and {network-role} combination within a VNF, then the parameter names -defined for the “fixed\_ips” should be used with the -“allowed\_address\_pairs” property. The examples below illustrate this. - -Below example reflects two load balancer pairs in a single VNF. Each -pair has one VIP. - -*Example: A VNF has four load balancers. Each pair has a unique VIP.* - -*Pair 1:* lb\_0 and lb\_1 share a unique VIP - -*Pair 2:* lb\_2 and lb\_3 share a unique VIP - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} has been defined as “lb” for -load balancer. - -.. code-block:: yaml - - resources: - lb\_0\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [lb\_oam\_ips,0] }}] - allowed\_address\_pairs: [{ “ip\_address”: {get\_param: [lb\_oam\_ips,2] }}] - - lb\_1\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [lb\_oam\_ips,1] }}] - allowed\_address\_pairs: [{ “ip\_address”: {get\_param: [lb\_oam\_ips,2] }}] - - lb\_2\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [lb\_oam\_ips,3] }}] - allowed\_address\_pairs: [{ “ip\_address”: {get\_param: [lb\_oam\_ips,5] }}] - - lb\_3\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [lb\_oam\_ips,4] }}] - allowed\_address\_pairs: [{ “ip\_address”: {get\_param: [lb\_oam\_ips,5] }}] - -Below example reflects a single app VM pair within a VNF with two VIPs: - -*Example: A VNF has two load balancers. The pair of load balancers share -two VIPs.* - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} has been defined as “lb” for -load balancer. - -.. code-block:: yaml - - resources: - lb\_0\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [lb\_oam\_ips,0] }}] - allowed\_address\_pairs: [{ "ip\_address": {get\_param: [lb\_oam\_ips,2] }, {get\_param: [lb\_oam\_ips,3] }}] - - lb\_1\_port\_0: - type: OS::Neutron::Port - network: { get\_param: oam\_net\_id } - fixed\_ips: [ { “ip\_address”: {get\_param: [lb\_oam\_ips,1] }}] - allowed\_address\_pairs: [{ "ip\_address": {get\_param: [lb\_oam\_ips,2] }, {get\_param: [lb\_oam\_ips,3] }}] - -As a general rule, provide the fixed IPs for the VMs indexed first in -the CDL and then the VIPs as shown in the examples above. - -Resource Property: name ------------------------ - -The parameter naming standard for the resource OS::Nova::Server has been -defined in Section 4.3.3. This section describes how the name property -of all other resources must be defined. - -Heat templates must use the Heat “str\_replace” function in conjunction -with the OpenECOMP supplied metadata parameter *vnf\_name* or -*vnf\_module\_id* to generate a unique name for each VNF instance. This -prevents the use of unique parameters values for resource “name” -properties to be enumerated in a per instance environment file. - -Note that - -- In most cases, only the use of the vnf\_name is necessary to create a - unique name - -- the Heat pseudo parameter 'OS::stack\_name’ can also be used in the - ‘str\_replace’ construct to generate a unique name when the vnf\_name - does not provide uniqueness - -.. code-block:: yaml - - type: OS::Cinder::Volume - properities: - name: - str\_replace: - template: VF\_NAME\_STACK\_NAME\_oam\_volume - params: - VF\_NAME: { get\_param: vnf\_name } - STACK\_NAME: { get\_param: 'OS::stack\_name' } - - type: OS::Neutron::SecurityGroup - properties: - description: Security Group of Firewall - name: - str\_replace: - template: VNF\_NAME\_Firewall\_SecurityGroup - params: - VNF\_NAME: { get\_param: vnf\_name } - -Output Parameters ------------------ - -OpenECOMP defines three type of Output Parameters. - -Base Template Output Parameters: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The base template output parameters are available for use as input -parameters in all add-on modules. The add-on modules may (or may not) -use these parameters. - -Volume Template Output Parameters: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The volume template output parameters are only available only for the -module (base or add on) that the volume is associated with. - -Predefined Output Parameters -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -OpenECOMP currently defines one predefined output parameter. - -OAM Management IP Addresses -^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Many VNFs will have a management interface for application controllers -to interact with and configure the VNF. Typically, this will be via a -specific VM that performs a VNF administration function. The IP address -of this interface must be captured and inventoried by OpenECOMP. This -might be a VIP if the VNF contains an HA pair of management VMs, or may -be a single IP address assigned to one VM. - -The Heat template may define either (or both) of the following Output -parameters to identify the management IP address. - -- *oam\_management\_v4\_address* - -- *oam\_management\_v6\_address* - -*Notes*: - -- The Management IP Address should be defined only once per VNF, so it - would only appear in one Module template - -- If a fixed IP for the admin VM is passed as an input parameter, it - may be echoed in the output parameters - -- If the IP for the admin VM is obtained via DHCP, it may be obtained - from the resource attributes - -*Example:* - -.. code-block:: yaml - - resources: - admin\_server: - type: OS::Nova::Server - properties: - networks: - - network: {get\_param: oam\_net\_id } - ... - - Outputs: - oam\_management\_v4\_address: - value: {get\_attr: [admin\_server, networks, {get\_param: oam\_net\_id}, 0] } - -Heat Template Constructs -======================== - -External References -------------------- - -Heat templates *should not* reference any HTTP-based resource -definitions, any HTTP-based nested configurations, or any HTTP-based -environment files. - -- During orchestration, OpenECOMP *should not* retrieve any such - resources from external/untrusted/unknown sources. - -- VNF images should not contain such references in user-data or other - configuration/operational scripts that are specified via Heat or - encoded into the VNF image itself. - -*Note:* HTTP-based references are acceptable if the HTTP-based reference -is accessing information with the VM private/internal network. - -Heat Files Support (get\_file) ------------------------------- - -Heat Templates may contain the inclusion of text files into Heat -templates via the Heat “get\_file” directive. This may be used, for -example, to define a common “user-data” script, or to inject files into -a VM on startup via the “personality” property. - -Support for Heat Files is subject to the following limitations: - -- The ‘get\_files’ targets must be referenced in Heat templates by file - name, and the corresponding files should be delivered to OpenECOMP - along with the Heat templates. - - - URL-based file retrieval must not be used; it is not supported. - -- The included files must have unique file names within the scope of - the VNF. - -- OpenECOMP does not support a directory hierarchy for included files. - - - All files must be in a single, flat directory per VNF. - -- Included files may be used by all Modules within a given VNF. - -- get\_file directives may be used in both non-nested and nested - templates - -Use of Heat ResourceGroup -------------------------- - -The *OS::Heat::ResourceGroup* is a useful Heat element for creating -multiple instances of a given resource or collection of resources. -Typically it is used with a nested Heat template, to create, for -example, a set of identical *OS::Nova::Server* resources plus their -related *OS::Neutron::Port* resources via a single resource in a master -template. - -*ResourceGroup* may be used in OpenECOMP to simplify the structure of a -Heat template that creates multiple instances of the same VM type. -However, there are important caveats to be aware of. - -*ResourceGroup* does not deal with structured parameters -(comma-delimited-list and json) as one might typically expect. In -particular, when using a list-based parameter, where each list element -corresponds to one instance of the *ResourceGroup*, it is not possible -to use the intrinsic “loop variable” %index% in the *ResourceGroup* -definition. - -For instance, the following is **not** valid Heat for a *ResourceGroup*: - -.. code-block:: yaml - - type: OS::Heat::ResourceGroup - resource: - type: my\_nested\_vm\_template.yaml - properties: - name: {get\_param: [vm\_name\_list, %index%]} - -Although this appears to use the nth entry of the *vm\_name\_list* list -for the nth element of the *ResourceGroup*, it will in fact result in a -Heat exception. When parameters are provided as a list (one for each -element of a *ResourceGroup*), you must pass the complete parameter to -the nested template along with the current index as separate parameters. - -Below is an example of an **acceptable** Heat Syntax for a -*ResourceGroup*: - -.. code-block:: yaml - - type: OS::Heat::ResourceGroup - resource: - type: my\_nested\_vm\_template.yaml - properties: - names: {get\_param: vm\_name\_list} - index: %index% - -You can then reference within the nested template as: - -{ get\_param: [names, {get\_param: index} ] } - -Note that this is workaround has very important limitations. Since the -entire list parameter is passed to the nested template, any change to -that list (e.g., adding an additional element) will cause Heat to treat -the entire parameter as updated within the context of the nested -template (i.e., for each *ResourceGroup* element). As a result, if -*ResourceGroup* is ever used for scaling (e.g., increment the count and -include an additional element to each list parameter), Heat will often -rebuild every existing element in addition to adding the “deltas”. For -this reason, use of *ResourceGroup* for scaling in this manner is not -supported. - -Key Pairs ---------- - -When Nova Servers are created via Heat templates, they may be passed a -“keypair” which provides an ssh key to the ‘root’ login on the newly -created VM. This is often done so that an initial root key/password does -not need to be hard-coded into the image. - -Key pairs are unusual in OpenStack, because they are the one resource -that is owned by an OpenStack User as opposed to being owned by an -OpenStack Tenant. As a result, they are usable only by the User that -created the keypair. This causes a problem when a Heat template attempts -to reference a keypair by name, because it assumes that the keypair was -previously created by a specific OpenECOMP user ID. - -When a keypair is assigned to a server, the SSH public-key is -provisioned on the VMs at instantiation time. They keypair itself is not -referenced further by the VM (i.e. if the keypair is updated with a new -public key, it would only apply to subsequent VMs created with that -keypair). - -Due to this behavior, the recommended usage of keypairs is in a more -generic manner which does not require the pre-requisite creation of a -keypair. The Heat should be structured in such a way as to: - -- Pass a public key as a parameter value instead of a keypair name - -- Create a new keypair within the VNF Heat templates (in the base - module) for use within that VNF - -By following this approach, the end result is the same as pre-creating -the keypair using the public key – i.e., that public key will be -provisioned in the new VM. However, this recommended approach also makes -sure that a known public key is supplied (instead of having OpenStack -generate a public/private pair to be saved and tracked outside of -OpenECOMP). It also removes any access/ownership issues over the created -keypair. - -The public keys may be enumerated as a VNF Orchestration Constant in the -environment file (since it is public, it is not a secret key), or passed -at run-time as an instance-specific parameters. OpenECOMP will never -automatically assign a public/private key pair. - -*Example (create keypair with an existing ssh public-key for {vm-type} -of lb (for load balancer)):* - -.. code-block:: yaml - - parameters: - vnf\_name: - type: string - ssh\_public\_key: - type: string - resources: - my\_keypair: - type: OS::Nova::Keypair - properties: - name: - str\_replace: - template: VNF\_NAME\_key\_pair - params: - VNF\_NAME: { get\_param: vnf\_name } - public\_key: {get\_param: lb\_ssh\_public\_key} - save\_private\_key: false - -Security Groups ---------------- - -OpenStack allows a tenant to create Security groups and define rules -within the security groups. - -Security groups, with their rules, may either be created in the Heat -template or they can be pre-created in OpenStack and referenced within -the Heat template via parameter(s). There can be a different approach -for security groups assigned to ports on internal (intra-VNF) networks -or external networks (inter-VNF). Furthermore, there can be a common -security group across all VMs for a specific network or it can vary by -VM (i.e., {vm-type}) and network type (i.e., {network-role}). - -Anti-Affinity and Affinity Rules --------------------------------- - -Anti-affinity or affinity rules are supported using normal OpenStack -*“OS::Nova::ServerGroup”* resources. Separate ServerGroups are typically -created for each VM type to prevent them from residing on the same host, -but they can be applied to multiple VM types to extend the -affinity/anti-affinity across related VM types as well. - -*Example:* - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} have been defined as “lb” for -load balancer and “db” for database. - -.. code-block:: yaml - - resources: - db\_server\_group: - type: OS::Nova::ServerGroup - properties: - name: - str\_replace: - params: - $vnf\_name: {get\_param: vnf\_name} - template: $vnf\_name-server\_group1 - policies: - - *anti-affinity* - - lb\_server\_group: - type: OS::Nova::ServerGroup - properties: - name: - str\_replace: - params: - $vnf\_name: {get\_param: vnf\_name} - template: $vnf\_name-server\_group2 - policies: - - *affinity* - - *db\_0:* - *type: OS::Nova::Server* - *properties:* - *...* - scheduler\_hints: - group: {get\_param: db\_server\_group} - - db\_1: - type: OS::Nova::Server - properties: - ... - scheduler\_hints: - group: {get\_param: db\_server\_group} - - lb\_0: - type: OS::Nova::Server - properties: - ... - scheduler\_hints: - group: {get\_param: lb\_server\_group} - -Design Pattern: VNF Modularity -============================== - -OpenECOMP supports the concept of *VNF Modularity*. With this approach, -a single VNF may be composed from one or more Heat templates, each of -which represents some subset of the overall VNF. These component parts -are referred to as “\ *VNF Modules*\ ”. During orchestration, these -modules may be deployed incrementally to build up the complete VNF. - -A Heat template can be either one for the following types of modules - -1. Base Module - -2. Incremental Modules - -3. Independent Cinder Volume Modules - -The OpenECOMP Heat template naming convention must be followed (Section -2.1). The naming convention identifies the module type. - -A VNF must be composed of one “base” VNF module (also called a base -module) and zero to many “incremental” or “add on” VNF modules. The base -module must be deployed first prior to the add-on modules. - -A module can be thought of as equivalent to a Heat template, where a -Heat template is composed of a YAML file and an environment file. A -given YAML file must have a corresponding environment file; OpenECOMP -requires it. A Heat template is used to create or deploy a Heat stack. -Therefore, a module is also equivalent to a Heat Stack. - -However, there are cases where a module maybe composed of more than one -Heat stack and/or more than one YAML file. - -As discussed in Section 2.5, Independent Volume Templates, each VNF -Module may have an associated Volume template. - -- When a volume template is utilized, it must correspond 1:1 with - add-on module template or base template it is associated with - -- A Cinder volume may be embedded within the add-on module template - and/or base template if persistence is not required, thus not - requiring the optional Volume template. - -A VNF module may support nested templates. In this case, there will be -one or more additional YAML files. - -Any shared resource defined in the base module template and used across -the entire VNF (e.g., private networks, server groups), must be exposed -to the incremental or add-on modules by declaring their resource UUIDs -as Heat outputs (i.e., OpenECOMP Base Template Output Parameter in the -output section of the Heat template). Those outputs will be provided by -OpenECOMP as input parameter values to all add-on module Heat templates -in the VNF that have declared the parameter in the template. - -*Note:* A Cinder volume is *not* considered a shared resource. A volume -template must correspond 1:1 with a base template or add-on module -template. - -There are two suggested usage patterns for modular VNFs, though any -variation is supported. - -A. **Modules per VNFC type** - - a. Group all VMs (VNFCs) of a given type into its own module - - b. Build up the VNF one VNFC type at a time - - c. Base module contains only the shared resources (and possibly - initial Admin VMs) - - d. Suggest one or two modules per VNFC type - - i. one for initial count - - ii. one for scaling increment (if different from initial count) - -B. **Base VNF + Growth Units** - - a. Base module (template) contains a complete initial VNF instance - - b. Growth modules for incremental scaling units - - i. May contain VMs of multiple types in logical scaling - combinations - - ii. May be separated by VM type for multi-dimensional scaling - - c. With no growth units, this is equivalent to the “\ *One Heat - Template per VNF*\ ” model - -Note that modularization of VNFs is not required. A single Heat template -(a base template) may still define a complete VNF, which might be -appropriate for smaller VNFs without a lot of scaling options. - -There are some rules to follow when building modular VNF templates: - -1. All VNFs must have one Base VNF Module (template) that must be the - first one deployed. The base template: - - a. Must include all shared resources (e.g., private networks, server - groups, security groups) - - b. Must expose all shared resources (by UUID) as “outputs” in its - associated Heat template (i.e., OpenECOMP Base Template Output - Parameters) - - c. May include initial set of VMs - - d. May be operational as a stand-alone “minimum” configuration of the - VNF - -2. VNFs may have one or more Add-On VNF Modules (templates) which: - - a. Defines additional resources that can be added to an existing VNF - - b. Must be complete Heat templates - - i. i.e. not snippets to be incorporated into some larger template - - c. Should define logical growth-units or sub-components of an overall - VNF - - d. On creation, receives all Base VNF Module outputs as parameters - - i. Provides access to all shared resources (by UUID) - - ii. must not be dependent on other Add-On VNF Modules - - e. Multiple instances of an Add-On VNF Module type may be added to - the same VNF (e.g. incrementally grow a VNF by a fixed “add-on” - growth units) - -3. Each VNF Module (base or add-on) may have (optional) an associated - Volume template (*see Section 2.5*) - - a. Volume templates should correspond 1:1 with Module (base or - add-on) templates - - b. A Cinder volume may be embedded within the Module template (base - or add-on) if persistence is not required - -4. Shared resource UUIDs are passed between the base template and add-on - template via Heat Outputs Parameters (i.e., Base Template Output - Parameters) - - a. The output parameter name in the base must match the parameter - name in the add-on module - -*Examples:* - -In this example, the {vm-type} have been defined as “lb” for load -balancer and “admin” for admin server. - -1. **Base VNF Module Heat Template (partial)** - -Heat\_template\_version: 2013-05-23 - -.. code-block:: yaml - - parameters: - admin\_name\_0: - type: string - - resources: - int\_oam\_network: - type: OS::Neutron::Network - properties: - name: {… } - - admin\_server: - type: OS::Nova::Server - properties: - name: {get\_param: admin\_name\_0} - image: ... - - outputs: - int\_oam\_net\_id: - value: {get\_resource: int\_oam\_network } - - -2. **Add-on VNF Module Heat Template (partial)** - -Heat\_template\_version: 2013-05-23 - -.. code-block:: yaml - - Parameters: - int\_oam\_net\_id: - type: string - description: ID of shared private network from Base template - lb\_name\_0: - type: string - description: name for the add-on VM instance - - Resources: - lb\_server: - type: OS::Nova::Server - properties: - name: {get\_param: lb\_name\_0} - networks: - - port: { get\_resource: lb\_port } - ... - - lb\_port: - type: OS::Neutron::Port - properties: - network\_id: { get\_param: int\_oam\_net\_id } - ... - -Scaling Considerations -====================== - -Scaling of a VNF may be manually driven to add new capacity (**static -scaling**) or it may be driven in near real-time by the OpenECOMP -controllers based on a real-time need **(dynamic scaling).** - -With VNF Modularity, the recommended approach for scaling is to provide -additional “growth unit” templates that can be used to create additional -resources in logical scaling increments. This approach is very -straightforward, and has minimal impact on the currently running VNFCs -and must comply with the following: - -- Combine resources into reasonable-sized scaling increments; do not - just scale by one VM at a time in potentially large VNFs. - -- Combine related resources into the same growth template where - appropriate, e.g. if VMs of different types are always deployed in - pairs, include them in a single growth template. - -- Growth templates can use the private networks and other shared - resources exposed by the Base Module template. - -VNF Modules may also be updated “in-place” using the OpenStack Heat -Update capability, by deploying an updated Heat template with different -VM counts to an existing stack. This method requires another VNF module -template that includes the new resources *in addition to all resources -contained in the original module template*. Note that this also requires -re-specification of all existing parameters as well as new ones. - -*For this approach:* - -- Use a fixed number of pre-defined VNF module configurations - -- Successively larger templates must be identical to the next smaller - one, plus add the additional VMs of the scalable type(s) - -- VNF is scalable by sending a stack-update with a different template - -*Please do note that:* - -- If properties do not change for existing VMs, those VMs should remain - unchanged - -- If the update is performed with a smaller template, the Heat engine - recognizes and deletes no-longer-needed VMs (and associated - resources) - -- Nested templates for the various server types will simplify reuse - across multiple configurations - -- Per the section on Use of Heat ResourceGroup, if *ResourceGroup* is - ever used for scaling (e.g. increment the count and include an - additional element to each list parameter), Heat will often rebuild - every existing element in addition to adding the “deltas”. For this - reason, use of *ResourceGroup* for scaling in this manner is not - supported. - -High Availability -================== - -VNF/VM parameters may include availability zone IDs for VNFs that -require high availability. - -The Heat must comply with the following requirements to specific -availability zone IDs: - -- The Heat template should spread Nova and Cinder resources across the - availability zones as desired - -Resource Data Synchronization -============================== - -For cases where synchronization is required in the orchestration of Heat -resources, two approaches are recommended: - -- Standard Heat *“depends\_on”* property for resources - - - Assures that one resource completes before the dependent resource - is orchestrated. - - - Definition of completeness to OpenStack may not be sufficient - (e.g., a VM is considered complete by OpenStack when it is ready - to be booted, not when the application is up and running). - -- Use of Heat Notifications - - - Create *OS::Heat::WaitCondition* and - *OS::Heat::WaitConditionHandle* resources. - - - Pre-requisite resources issue *wc\_notify* commands in user\_data. - - - Dependent resource define *“depends\_on”* in the - *OS::Heat::WaitCondition* resource. - -*Example: “depends\_on” case* - -In this example, the {network-role} has been defined as “oam” to -represent an oam network and the {vm-type} has been defined as “oam” to -represent an oam server. - -.. code-block:: yaml - - oam\_server\_01: - type: OS::Nova::Server - properties: - name: {get\_param: [oam\_ names, 0]} - image: {get\_param: oam\_image\_name} - flavor: {get\_param: oam\_flavor\_name} - availability\_zone: {get\_param: availability\_zone\_0} - networks: - - port: {get\_resource: oam01\_port\_0} - - port: {get\_resource: oam01\_port\_1} - user\_data: - scheduler\_hints: {group: {get\_resource: oam\_servergroup}} - user\_data\_format: RAW - - oam\_01\_port\_0: - type: OS::Neutron::Port - properties: - network: {get\_resource: oam\_net\_name} - fixed\_ips: [{"ip\_address": {get\_param: [oam\_oam\_net\_ips, 1]}}] - security\_groups: [{get\_resource: oam\_security\_group}] - - oam\_01\_port\_1: - type: OS::Neutron::Port - properties: - network: {get\_param: oam\_net\_name} - fixed\_ips: [{"ip\_address": {get\_param: [oam\_oam\_net\_ips, 2]}}] - security\_groups: [{get\_resource: oam\_security\_group}] - - - - oam\_01\_vol\_attachment: - type: OS::Cinder::VolumeAttachment - depends\_on: oam\_server\_01 - properties: - volume\_id: {get\_param: oam\_vol\_1} - mountpoint: /dev/vdb - instance\_uuid: {get\_resource: oam\_server\_01} - -Appendix A - Glossary -====================== - -**VM** Virtual Machine (VM) is a virtualized computation environment -that behaves very much like a physical computer/server. A VM has all its -ingredients (processor, memory/storage, interfaces/ports) of a physical -computer/server and is generated by a hypervisor, which partitions the -underlying physical resources and allocates them to VMs. Virtual -Machines are capable of hosting a virtual network function component -(VNFC). - -**VNF** Virtual Network Function (VNF) is the software implementation of -a function that can be deployed on a Network Cloud. It includes network -functions that provide transport and forwarding. It also includes other -functions when used to support network services, such as -network-supporting web servers and database. - -**VNFC** Virtual Network Function Component (VNFC) are the -sub-components of a VNF providing a VNF Provider a defined sub-set of -that VNF's functionality, with the main characteristic that a single -instance of this component maps 1:1 against a single Virtualization -Container. See **Figure 1** for the relationship between VNFC and -VNFs. - -|image0| - -Figure 1. Virtual Function Entity Relationship - - -**Copyright © 2017 AT&T Intellectual Property. All rights reserved.** - -Unless otherwise specified, all software contained herein is licensed -under the Apache License, Version 2.0 (the “License”); -you may not use this software 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. - -Unless otherwise specified, all documentation contained herein is licensed -under the Creative Commons License, Attribution 4.0 Intl. (the “License”); -you may not use this documentation except in compliance with the License. -You may obtain a copy of the License at - - https://creativecommons.org/licenses/by/4.0/ - -Unless required by applicable law or agreed to in writing, documentation -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. - -ECOMP is a trademark and service mark of AT&T Intellectual Property. - -.. |image0| image:: VNF_VNFC_Relation.jpg - :width: 4.26181in - :height: 3.42847in -
\ No newline at end of file |