VNFRQTS - Changes to fix doc warnings
[vnfrqts/requirements.git] / docs / Chapter5.rst
index 340f842..830dd5e 100644 (file)
-**5. VNF Modeling Requirements**
-=====================================
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2017 AT&T Intellectual Property.  All rights reserved.
 
-a. TOSCA YAML
-#. Heat
+
+VNF Modeling Requirements
+=========================
+
+TOSCA YAML
+----------
+
+
+Introduction
+^^^^^^^^^^^^^^
+
+This reference document is the VNF TOSCA Template Requirements for
+ONAP, which provides recommendations and standards for building VNF
+TOSCA templates compatible with ONAP initial implementations of
+Network Cloud. It has the following features:
+
+1. VNF TOSCA template designer supports GUI and CLI.
+
+2. VNF TOSCA template is aligned to the newest TOSCA protocol, “Working
+   Draft 04-Revision 06”.
+
+3. VNF TOSCA template supports HPA features, such as NUMA, Hyper
+   Threading, SRIOV, etc.
+
+Intended Audience
+^^^^^^^^^^^^^^^^^^
+
+This document is intended for persons developing VNF TOSCA templates
+that will be orchestrated by ONAP.
+
+Scope
+^^^^^^^^^^^^^^^^
+
+ONAP implementations of Network Cloud supports TOSCA Templates, also
+referred to as TOSCA in this document.
+
+ONAP requires the TOSCA Templates to follow a specific format. This
+document provides the mandatory, recommended, and optional requirements
+associated with this format.
+
+Overview
+^^^^^^^^^^^^^^^^
+
+The document includes three charters to help the VNF providers to use the
+VNF model design tools and understand the VNF package structure and VNF
+TOSCA templates.
+
+In the ONAP, VNF Package and VNFD template can be designed by manually
+or via model designer tools. VNF model designer tools can provide the
+GUI and CLI tools for the VNF provider to develop the VNF Package and VNFD
+template.
+
+The VNF package structure is align to the NFV TOSCA protocol, and
+supports CSAR
+
+The VNFD and VNF package are all align to the NFV TOSCA protocol, which
+supports multiple TOSCA template yaml files, and also supports
+self-defined node or other extensions.
+
+NFV TOSCA Template
+^^^^^^^^^^^^^^^^^^^^
+
+TOSCA templates supported by ONAP must follow the requirements
+enumerated in this section.
+
+TOSCA Introduction
+^^^^^^^^^^^^^^^^^^^
+
+TOSCA defines a Meta model for defining IT services. This Meta model
+defines both the structure of a service as well as how to manage it. A
+Topology Template (also referred to as the topology model of a service)
+defines the structure of a service. Plans define the process models that
+are used to create and terminate a service as well as to manage a
+service during its whole lifetime.
+
+A Topology Template consists of a set of Node Templates and Relationship
+Templates that together define the topology model of a service as a (not
+necessarily connected) directed graph. A node in this graph is
+represented by a *Node Template*. A Node Template specifies the
+occurrence of a Node Type as a component of a service. A *Node Type*
+defines the properties of such a component (via *Node Type Properties*)
+and the operations (via *Interfaces*) available to manipulate the
+component. Node Types are defined separately for reuse purposes and a
+Node Template references a Node Type and adds usage constraints, such as
+how many times the component can occur.
+
+|image1|
+
+Figure 1: Structural Elements of Service Template and their Relations
+
+TOSCA Modeling Principles & Data Model
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This section describing TOSCA modeling principles and data model for
+NFV, which shall be based on [TOSCA-1.0] and [TOSCA-Simple-Profile-YAML
+V1.0], or new type based on ETSI NFV requirements, etc.
+
+VNF Descriptor Template
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The VNF Descriptor (VNFD) describes the topology of the VNF by means of
+ETSI NFV IFA011 [IFA011] terms such as VDUs, Connection Points, Virtual
+Links, External Connection Points, Scaling Aspects, Instantiation Levels
+and Deployment Flavours.
+
+The VNFD (VNF Descriptor) is read by both the NFVO and the VNFM. It
+represents the contract & interface of a VNF and ensures the
+interoperability across the NFV functional blocks.
+
+The main parts of the VNFD are the following:
+
+-  VNF topology: it is modeled in a cloud agnostic way using virtualized
+   containers and their connectivity. Virtual Deployment Units (VDU)
+   describe the capabilities of the virtualized containers, such as
+   virtual CPU, RAM, disks; their connectivity is modeled with VDU
+   Connection Point Descriptors (VduCpd), Virtual Link Descriptors (Vld)
+   and VNF External Connection Point Descriptors (VnfExternalCpd);
+
+-  VNF deployment aspects: they are described in one or more deployment
+   flavours, including instantiation levels, supported LCM operations,
+   VNF LCM operation configuration parameters, placement constraints
+   (affinity / antiaffinity), minimum and maximum VDU instance numbers,
+   and scaling aspect for horizontal scaling.
+
+The following table defines the TOSCA Type “derived from” values that
+SHALL be used when using the TOSCA Simple Profile for NFV version 1.0
+specification [TOSCA-Simple-Profile-NFV-v1.0] for NFV VNFD with aggreed
+changes from ETSI SOL001 draft.
+
++---------------------+------------------------------------+-----------------+
+| **ETSI NFV Element**| **TOSCA VNFD**                     | **Derived from**|
+|                     |                                    |                 |
+| **[IFA011]**        | **[TOSCA-Simple-Profile-NFV-v1.0]**|                 |
++=====================+====================================+=================+
+| VNF                 | tosca.nodes.nfv.VNF                | tosca.nodes.Root|
++---------------------+------------------------------------+-----------------+
+| Cpd (Connection     | tosca.nodes.nfv.Cp                 | tosca.nodes.Root|
+| Point)              | tosca.nodes.nfv.Cp                 | tosca.nodes.Root|
++---------------------+------------------------------------+-----------------+
+| VduCpd (internal    | tosca.nodes.nfv.VduCp              | tosca.nodes.\   |
+| connection point)   |                                    | nfv.Cp          |
++---------------------+------------------------------------+-----------------+
+| VnfVirtualLinkDesc  | tosca.nodes.nfv.VnfVirtualLink     | tosca.nodes.Root|
+| (Virtual Link)      |                                    |                 |
++---------------------+------------------------------------+-----------------+
+| VDU Virtual Storage | tosca.nodes.nfv.VDU.VirtualStorage | tosca.nodes.Root|
++---------------------+------------------------------------+-----------------+
+| VDU Virtual Compute | tosca.nodes.nfv.VDU.Compute        | tosca.nodes.Root|
++---------------------+------------------------------------+-----------------+
+| Software Image      |                                    |                 |
++---------------------+------------------------------------+-----------------+
+| Deployment Flavour  |                                    |                 |
++---------------------+------------------------------------+-----------------+
+| Scaling Aspect      |                                    |                 |
++---------------------+------------------------------------+-----------------+
+| Element Group       |                                    |                 |
++---------------------+------------------------------------+-----------------+
+| Instantiation       |                                    |                 |
+| Level               |                                    |                 |
++---------------------+------------------------------------+-----------------+
+
+
++--------------------------------------------------------------------+
+| +--------------------------------------------------------------+   |
+| | tosca\_definitions\_version: tosca\_simple\_yaml\_1\_0       |   |
+| |                                                              |   |
+| | description: VNFD TOSCA file demo                            |   |
+| |                                                              |   |
+| | imports:                                                     |   |
+| |                                                              |   |
+| | - TOSCA\_definition\_nfv\_1\_0.yaml                          |   |
+| |                                                              |   |
+| | - TOSCA\_definition\_nfv\_ext\_1\_0.yaml                     |   |
+| |                                                              |   |
+| | | **node\_types:                                             |   |
+| |   tosca.nodes.nfv.VNF.vOpenNAT:                              |   |
+| |   derived\_from:** tosca.nodes.nfv.VNF                       |   |
+| | | **requirements:                                            |   |
+| |   **- **sriov\_plane:                                        |   |
+| |   capability:** tosca.capabilities.nfv.VirtualLinkable       |   |
+| | | **node:** tosca.nodes.nfv.VnfVirtualLinkDesc               |   |
+| | | **relationship:** tosca.relationships.nfv.VirtualLinksTo   |   |
+| +--------------------------------------------------------------+   |
++====================================================================+
++--------------------------------------------------------------------+
+
+HPA Requirements
+^^^^^^^^^^^^^^^^^^
+
+1. SR-IOV Passthrought
+
+Definitions of SRIOV\_Port are necessary if VDU supports SR-IOV. Here is
+an example.
+
++------------------------------------------------+
+| node\_templates:                               |
+|                                                |
+| vdu\_vNat:                                     |
+|                                                |
+| SRIOV\_Port:                                   |
+|                                                |
+| attributes:                                    |
+|                                                |
+| tosca\_name: SRIOV\_Port                       |
+|                                                |
+| properties:                                    |
+|                                                |
+| virtual\_network\_interface\_requirements:     |
+|                                                |
+| - name: sriov                                  |
+|                                                |
+| support\_mandatory: false                      |
+|                                                |
+| description: sriov                             |
+|                                                |
+| requirement:                                   |
+|                                                |
+| SRIOV: true                                    |
+|                                                |
+| role: root                                     |
+|                                                |
+| description: sriov port                        |
+|                                                |
+| layer\_protocol: ipv4                          |
+|                                                |
+| requirements:                                  |
+|                                                |
+| - virtual\_binding:                            |
+|                                                |
+| capability: virtual\_binding                   |
+|                                                |
+| node: vdu\_vNat                                |
+|                                                |
+| relationship:                                  |
+|                                                |
+| type: tosca.relationships.nfv.VirtualBindsTo   |
+|                                                |
+| - virtual\_link:                               |
+|                                                |
+| node: tosca.nodes.Root                         |
+|                                                |
+| type: tosca.nodes.nfv.VduCpd                   |
+|                                                |
+| substitution\_mappings:                        |
+|                                                |
+| requirements:                                  |
+|                                                |
+| sriov\_plane:                                  |
+|                                                |
+| - SRIOV\_Port                                  |
+|                                                |
+| - virtual\_link                                |
+|                                                |
+| node\_type: tosca.nodes.nfv.VNF.vOpenNAT       |
++------------------------------------------------+
+
+2. Hugepages
+
+Definitions of mem\_page\_size as one property shall be added to
+Properties and set the value to large if one VDU node supports
+huagepages. Here is an example.
+
++----------------------------------+
+| node\_templates:                 |
+|                                  |
+| vdu\_vNat:                       |
+|                                  |
+| Hugepages:                       |
+|                                  |
+| attributes:                      |
+|                                  |
+| tosca\_name: Huge\_pages\_demo   |
+|                                  |
+| properties:                      |
+|                                  |
+| mem\_page\_size:large            |
++==================================+
++----------------------------------+
+
+3. NUMA (CPU/Mem)
+
+Likewise, we shall add definitions of numa to
+requested\_additional\_capabilities if we wand VUD nodes to support
+NUMA. Here is an example.
+
++-------------------------------------------------+
+| topology\_template:                             |
+|                                                 |
+| node\_templates:                                |
+|                                                 |
+| vdu\_vNat:                                      |
+|                                                 |
+| capabilities:                                   |
+|                                                 |
+| virtual\_compute:                               |
+|                                                 |
+| properties:                                     |
+|                                                 |
+| virtual\_memory:                                |
+|                                                 |
+| numa\_enabled: true                             |
+|                                                 |
+| virtual\_mem\_size: 2 GB                        |
+|                                                 |
+| requested\_additional\_capabilities:            |
+|                                                 |
+| numa:                                           |
+|                                                 |
+| support\_mandatory: true                        |
+|                                                 |
+| requested\_additional\_capability\_name: numa   |
+|                                                 |
+| target\_performance\_parameters:                |
+|                                                 |
+| hw:numa\_nodes: "2"                             |
+|                                                 |
+| hw:numa\_cpus.0: "0,1"                          |
+|                                                 |
+| hw:numa\_mem.0: "1024"                          |
+|                                                 |
+| hw:numa\_cpus.1: "2,3,4,5"                      |
+|                                                 |
+| hw:numa\_mem.1: "1024"                          |
++-------------------------------------------------+
+
+4. Hyper-Theading
+
+Definitions of Hyper-Theading are necessary as one of
+requested\_additional\_capabilities of one VUD node if that node
+supports Hyper-Theading. Here is an example.
+
++-------------------------------------------------------------+
+| topology\_template:                                         |
+|                                                             |
+| node\_templates:                                            |
+|                                                             |
+| vdu\_vNat:                                                  |
+|                                                             |
+| capabilities:                                               |
+|                                                             |
+| virtual\_compute:                                           |
+|                                                             |
+| properties:                                                 |
+|                                                             |
+| virtual\_memory:                                            |
+|                                                             |
+| numa\_enabled: true                                         |
+|                                                             |
+| virtual\_mem\_size: 2 GB                                    |
+|                                                             |
+| requested\_additional\_capabilities:                        |
+|                                                             |
+| hyper\_threading:                                           |
+|                                                             |
+| support\_mandatory: true                                    |
+|                                                             |
+| requested\_additional\_capability\_name: hyper\_threading   |
+|                                                             |
+| target\_performance\_parameters:                            |
+|                                                             |
+| hw:cpu\_sockets : "2"                                       |
+|                                                             |
+| hw:cpu\_threads : "2"                                       |
+|                                                             |
+| hw:cpu\_cores : "2"                                         |
+|                                                             |
+| hw:cpu\_threads\_policy: "isolate"                          |
++-------------------------------------------------------------+
+
+5. OVS+DPDK
+
+Definitions of ovs\_dpdk are necessary as one of
+requested\_additional\_capabilities of one VUD node if that node
+supports dpdk. Here is an example.
+
++------------------------------------------------------+
+| topology\_template:                                  |
+|                                                      |
+| node\_templates:                                     |
+|                                                      |
+| vdu\_vNat:                                           |
+|                                                      |
+| capabilities:                                        |
+|                                                      |
+| virtual\_compute:                                    |
+|                                                      |
+| properties:                                          |
+|                                                      |
+| virtual\_memory:                                     |
+|                                                      |
+| numa\_enabled: true                                  |
+|                                                      |
+| virtual\_mem\_size: 2 GB                             |
+|                                                      |
+| requested\_additional\_capabilities:                 |
+|                                                      |
+| ovs\_dpdk:                                           |
+|                                                      |
+| support\_mandatory: true                             |
+|                                                      |
+| requested\_additional\_capability\_name: ovs\_dpdk   |
+|                                                      |
+| target\_performance\_parameters:                     |
+|                                                      |
+| sw:ovs\_dpdk: "true"                                 |
++------------------------------------------------------+
+
+NFV TOSCA Type Definition
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+tosca.capabilites.nfv.VirtualCompute
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This capability is used with the properties specified in ETSI SOL001 draft.
+
+tosca.nodes.nfv.VDU.Compute
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The NFV Virtualization Deployment Unit (VDU) compute node type
+represents a VDU entity which it describes the deployment and
+operational behavior of a VNF component (VNFC), as defined by **[ETSI
+NFV IFA011].**
+
++-----------------------+-------------------------------+
+| Shorthand Name        | VDU.Compute                   |
++=======================+===============================+
+| Type Qualified Name   | tosca:VDU.Compute             |
++-----------------------+-------------------------------+
+| Type URI              | tosca.nodes.nfv.VDU.Compute   |
++-----------------------+-------------------------------+
+| derived\_from         | tosca.nodes.Compute           |
++-----------------------+-------------------------------+
+
+
+
+Attributes
+++++++++++++
+
+None
+
+
+Capabilities
+++++++++++++++
+
++------------+--------------------+------------+------------------------------+
+| Name       | Type               | Constraints| Description                  |
++============+====================+============+==============================+
+| virtual\   | tosca.\            |            | Describes virtual compute    |
+| _compute   | capabilities.nfv.\ |            | resources capabilities.      |
+|            | VirtualCompute     |            |                              |
++------------+--------------------+------------+------------------------------+
+| monitoring\| tosca.\            | None       | Monitoring parameter, which  |
+| _parameter | capabilities.nfv.\ |            | can be tracked for a VNFC    |
+|            | Metric             |            | based on this VDU            |
+|            |                    |            |                              |
+|            |                    |            | Examples include:            |
+|            |                    |            | memory-consumption,          |
+|            |                    |            | CPU-utilisation,             |
+|            |                    |            | bandwidth-consumption, VNFC  |
+|            |                    |            | downtime, etc.               |
++------------+--------------------+------------+------------------------------+
+| Virtual\   | tosca.\            |            | Defines ability of           |
+| _binding   | capabilities.nfv.\ |            | VirtualBindable              |
+|            | VirtualBindable    |            |                              |
+|            |                    |            |                              |
+|            | editor note: need  |            |                              |
+|            | to create a        |            |                              |
+|            | capability type    |            |                              |
++------------+--------------------+------------+------------------------------+
+
+Definition
+++++++++++++
+
++-----------------------------------------------------------------------------+
+| tosca.nodes.nfv.VDU.Compute:                                                |
+|                                                                             |
+| derived\_from: tosca.nodes.Compute                                          |
+|                                                                             |
+| properties:                                                                 |
+|                                                                             |
+| name:                                                                       |
+|                                                                             |
+| type: string                                                                |
+|                                                                             |
+| required: true                                                              |
+|                                                                             |
+| description:                                                                |
+|                                                                             |
+| type: string                                                                |
+|                                                                             |
+| required: true                                                              |
+|                                                                             |
+| boot\_order:                                                                |
+|                                                                             |
+| type: list # explicit index (boot index) not necessary, contrary to IFA011  |
+|                                                                             |
+| entry\_schema:                                                              |
+|                                                                             |
+| type: string                                                                |
+|                                                                             |
+| required: false                                                             |
+|                                                                             |
+| nfvi\_constraints:                                                          |
+|                                                                             |
+| type: list                                                                  |
+|                                                                             |
+| entry\_schema:                                                              |
+|                                                                             |
+| type: string                                                                |
+|                                                                             |
+| required: false                                                             |
+|                                                                             |
+| configurable\_properties:                                                   |
+|                                                                             |
+| type: map                                                                   |
+|                                                                             |
+| entry\_schema:                                                              |
+|                                                                             |
+| type: tosca.datatypes.nfv.VnfcConfigurableProperties                        |
+|                                                                             |
+| required: true                                                              |
+|                                                                             |
+| attributes:                                                                 |
+|                                                                             |
+| private\_address:                                                           |
+|                                                                             |
+| status: deprecated                                                          |
+|                                                                             |
+| public\_address:                                                            |
+|                                                                             |
+| status: deprecated                                                          |
+|                                                                             |
+| networks:                                                                   |
+|                                                                             |
+| status: deprecated                                                          |
+|                                                                             |
+| ports:                                                                      |
+|                                                                             |
+| status: deprecated                                                          |
+|                                                                             |
+| capabilities:                                                               |
+|                                                                             |
+| virtual\_compute:                                                           |
+|                                                                             |
+| type: tosca.capabilities.nfv.VirtualCompute                                 |
+|                                                                             |
+| virtual\_binding:                                                           |
+|                                                                             |
+| type: tosca.capabilities.nfv.VirtualBindable                                |
+|                                                                             |
+| #monitoring\_parameter:                                                     |
+|                                                                             |
+| # modeled as ad hoc (named) capabilities in VDU node template               |
+|                                                                             |
+| # for example:                                                              |
+|                                                                             |
+| #capabilities:                                                              |
+|                                                                             |
+| # cpu\_load: tosca.capabilities.nfv.Metric                                  |
+|                                                                             |
+| # memory\_usage: tosca.capabilities.nfv.Metric                              |
+|                                                                             |
+| host: #Editor note: FFS. How this capabilities should be used in NFV Profile|
+|                                                                             |
+| type: `*tosca.capabilities.Container* <#DEFN_TYPE_CAPABILITIES_CONTAINER>`__|
+|                                                                             |
+| valid\_source\_types:                                                       |
+| [`*tosca.nodes.SoftwareComponent* <#DEFN_TYPE_NODES_SOFTWARE_COMPONENT>`__] |
+|                                                                             |
+| occurrences: [0,UNBOUNDED]                                                  |
+|                                                                             |
+| endpoint:                                                                   |
+|                                                                             |
+| occurrences: [0,0]                                                          |
+|                                                                             |
+| os:                                                                         |
+|                                                                             |
+| occurrences: [0,0]                                                          |
+|                                                                             |
+| scalable:                                                                   |
+| #Editor note: FFS. How this capabilities should be used in NFV Profile      |
+|                                                                             |
+| type: `*tosca.capabilities.Scalable* <#DEFN_TYPE_CAPABILITIES_SCALABLE>`__  |
+|                                                                             |
+| binding:                                                                    |
+|                                                                             |
+| occurrences: [0,UNBOUND]                                                    |
+|                                                                             |
+| requirements:                                                               |
+|                                                                             |
+| - virtual\_storage:                                                         |
+|                                                                             |
+| capability: tosca.capabilities.nfv.VirtualStorage                           |
+|                                                                             |
+| relationship: tosca.relationships.nfv.VDU.AttachedTo                        |
+|                                                                             |
+| node: tosca.nodes.nfv.VDU.VirtualStorage                                    |
+|                                                                             |
+| occurences: [ 0, UNBOUNDED ]                                                |
+|                                                                             |
+| - local\_storage: #For NFV Profile, this requirement is deprecated.         |
+|                                                                             |
+| occurrences: [0,0]                                                          |
+|                                                                             |
+| artifacts:                                                                  |
+|                                                                             |
+| - sw\_image:                                                                |
+|                                                                             |
+| file:                                                                       |
+|                                                                             |
+| type: tosca.artifacts.nfv.SwImage                                           |
++-----------------------------------------------------------------------------+
+
+Artifact
+++++++++++
+
+Note: currently not supported.
+
++--------+---------+----------------+------------+------------------------+
+| Name   | Required| Type           | Constraints| Description            |
++========+=========+================+============+========================+
+| SwImage| Yes     | tosca.\        |            | Describes the software |
+|        |         | artifacts.nfv.\|            | image which is directly|
+|        |         | SwImage        |            | realizing this virtual |
+|        |         |                |            | storage                |
++--------+---------+----------------+------------+------------------------+
+
+
+|image2|
+
+
+
+tosca.nodes.nfv.VDU.VirtualStorage
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The NFV VirtualStorage node type represents a virtual storage entity
+which it describes the deployment and operational behavior of a virtual
+storage resources, as defined by **[ETSI NFV IFA011].**
+
+**[editor note]** open issue: should NFV profile use the current storage
+model as described in YAML 1.1. Pending on Shitao proposal (see
+NFVIFA(17)000110 discussion paper)
+
+**[editor note]** new relationship type as suggested in Matt
+presentation. Slide 8. With specific rules of “valid\_target\_type”
+
++---------------------------+--------------------------------------+
+| **Shorthand Name**        | VirtualStorage                       |
++===========================+======================================+
+| **Type Qualified Name**   | tosca: VirtualStorage                |
++---------------------------+--------------------------------------+
+| **Type URI**              | tosca.nodes.nfv.VDU.VirtualStorage   |
++---------------------------+--------------------------------------+
+| **derived\_from**         | tosca.nodes.Root                     |
++---------------------------+--------------------------------------+
+
+tosca.artifacts.nfv.SwImage
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
++---------------------------+------------------------------------+
+| **Shorthand Name**        | SwImage                            |
++===========================+====================================+
+| **Type Qualified Name**   | tosca:SwImage                      |
++---------------------------+------------------------------------+
+| **Type URI**              | tosca.artifacts.nfv.SwImage        |
++---------------------------+------------------------------------+
+| **derived\_from**         | tosca.artifacts.Deployment.Image   |
++---------------------------+------------------------------------+
+
+Properties
+++++++++++++
+
++-----------------+---------+----------+------------+-------------------------+
+| Name            | Required| Type     | Constraints| Description             |
++=================+=========+==========+============+=========================+
+| name            | yes     | string   |            | Name of this software   |
+|                 |         |          |            | image                   |
++-----------------+---------+----------+------------+-------------------------+
+| version         | yes     | string   |            | Version of this software|
+|                 |         |          |            | image                   |
++-----------------+---------+----------+------------+-------------------------+
+| checksum        | yes     | string   |            | Checksum of the software|
+|                 |         |          |            | image file              |
++-----------------+---------+----------+------------+-------------------------+
+| container\      | yes     | string   |            | The container format    |
+| _format         |         |          |            | describes the container |
+|                 |         |          |            | file format in which    |
+|                 |         |          |            | software image is       |
+|                 |         |          |            | provided.               |
++-----------------+---------+----------+------------+-------------------------+
+| disk\_format    | yes     | string   |            | The disk format of a    |
+|                 |         |          |            | software image is the   |
+|                 |         |          |            | format of the underlying|
+|                 |         |          |            | disk image              |
++-----------------+---------+----------+------------+-------------------------+
+| min\_disk       | yes     | scalar-\ |            | The minimal disk size   |
+|                 |         | unit.size|            | requirement for this    |
+|                 |         |          |            | software image.         |
++-----------------+---------+----------+------------+-------------------------+
+| min\_ram        | no      | scalar-\ |            | The minimal RAM         |
+|                 |         | unit.size|            | requirement for this    |
+|                 |         |          |            | software image.         |
++-----------------+---------+----------+------------+-------------------------+
+| Size            | yes     | scalar-\ |            | The size of this        |
+|                 |         | unit.size|            | software image          |
++-----------------+---------+----------+------------+-------------------------+
+| sw\_image       | yes     | string   |            | A reference to the      |
+|                 |         |          |            | actual software image   |
+|                 |         |          |            | within VNF Package, or  |
+|                 |         |          |            | url.                    |
++-----------------+---------+----------+------------+-------------------------+
+| operating\      | no      | string   |            | Identifies the operating|
+| _system         |         |          |            | system used in the      |
+|                 |         |          |            | software image.         |
++-----------------+---------+----------+------------+-------------------------+
+| supported\      | no      | list     |            | Identifies the          |
+| _virtualization\|         |          |            | virtualization          |
+| _enviroment     |         |          |            | environments (e.g.      |
+|                 |         |          |            | hypervisor) compatible  |
+|                 |         |          |            | with this software image|
++-----------------+---------+----------+------------+-------------------------+
+
+Definition
++++++++++++
+
++-----------------------------------------------------+
+| tosca.artifacts.nfv.SwImage:                        |
+|                                                     |
+|   derived\_from: tosca.artifacts.Deployment.Image   |
+|                                                     |
+|   properties or metadata:                           |
+|                                                     |
+|     #id:                                            |
+|                                                     |
+|       # node name                                   |
+|                                                     |
+|     name:                                           |
+|                                                     |
+|       type: string                                  |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     version:                                        |
+|                                                     |
+|       type: string                                  |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     checksum:                                       |
+|                                                     |
+|       type: string                                  |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     container\_format:                              |
+|                                                     |
+|       type: string                                  |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     disk\_format:                                   |
+|                                                     |
+|       type: string                                  |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     min\_disk:                                      |
+|                                                     |
+|       type: scalar-unit.size # Number               |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     min\_ram:                                       |
+|                                                     |
+|       type: scalar-unit.size # Number               |
+|                                                     |
+| required: false                                     |
+|                                                     |
+|     size:                                           |
+|                                                     |
+|       type: scalar-unit.size # Number               |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     sw\_image:                                      |
+|                                                     |
+|       type: string                                  |
+|                                                     |
+| required: true                                      |
+|                                                     |
+|     operating\_system:                              |
+|                                                     |
+|       type: string                                  |
+|                                                     |
+| required: false                                     |
+|                                                     |
+|     supported\_virtualisation\_environments:        |
+|                                                     |
+|       type: list                                    |
+|                                                     |
+|       entry\_schema:                                |
+|                                                     |
+|         type: string                                |
+|                                                     |
+| required: false                                     |
++-----------------------------------------------------+
+
+.. |image1| image:: Image1.png
+   :width: 5.76806in
+   :height: 4.67161in
+.. |image2| image:: Image2.png
+   :width: 5.40486in
+   :height: 2.46042in
+
+
+Heat
+-------------
+
+General Guidelines
+^^^^^^^^^^^^^^^^^^
+This section contains general Heat Orchestration Template guidelines.
+
+YAML Format
+~~~~~~~~~~~
+
+R-95303 A VNF's Heat Orchestration Template **MUST** be defined
+using valid YAML.
+
+YAML (YAML Ain't
+Markup Language) is a human friendly data serialization standard for all
+programming languages. See http://www.yaml.org/.
+
+Heat Orchestration Template Format
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As stated above, Heat Orchestration templates must be defined in YAML.
+
+YAML rules include:
+
+ - Tabs are not allowed, use spaces ONLY
+
+ - You must indent your properties and lists with 1 or more spaces
+
+ - All Resource IDs and resource property parameters are
+   case-sensitive. (e.g., "ThIs", is not the same as "thiS")
+
+Heat Orchestration Template Structure
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Heat Orchestration template structure follows the following format,
+as defined by OpenStack at
+https://docs.openstack.org/developer/heat/template_guide/hot_spec.html
+
+.. code-block:: python
+
+  heat_template_version: <date>
+
+  description:
+    # a description of the template
+
+  parameter_groups:
+    # a declaration of input parameter groups and order
+
+  parameters:
+    # declaration of input parameters
+
+  resources:
+    # declaration of template resources
+
+  outputs:
+    # declaration of output parameters
+
+  conditions:
+    # declaration of conditions
+
+heat_template_version
++++++++++++++++++++++
+
+R-27078 A VNF's Heat Orchestration template **MUST** contain
+the section "heat_template_version:".
+
+The section "heat_template_version:" must be set to a date
+that is supported by the OpenStack environment.
+
+description
++++++++++++
+
+R-39402 A VNF's Heat Orchestration Template **MUST**
+contain the section "description:".
+
+parameter_groups
+++++++++++++++++
+
+A VNF Heat Orchestration template may
+contain the section "parameter_groups:".
+
+parameters
+++++++++++
+
+R-35414 A VNF Heat Orchestration's template **MUST**
+contain the section "parameters:".
+
+
+.. code-block:: python
+
+  parameters:
+
+    <param name>:
+
+      type: <string | number | json | comma_delimited_list | boolean>
+
+      label: <human-readable name of the parameter>
+
+      description: <description of the parameter>
+
+      default: <default value for parameter>
+
+      hidden: <true | false>
+
+      constraints:
+
+        <parameter constraints>
+
+      immutable: <true | false>
+
+This section allows for
+specifying input parameters that have to be provided when instantiating
+the template. Each parameter is specified in a separate nested block
+with the name of the parameters defined in the first line and additional
+attributes (e.g., type, label) defined as nested elements.
+
+R-90279 A VNF Heat Orchestration's template's parameter **MUST**
+be used in a resource with the exception of the parameters
+for the OS::Nova::Server resource property availability_zone.
+
+R-91273 A VNF Heat Orchestration’s template’s parameter for
+the OS::Nova::Server resource property availability_zone
+**MAY NOT** be used in any OS::Nova::Resource.
+
+<param name>
+____________
+
+The name of the parameter.
+
+R-25877 A VNF's Heat Orchestration Template's parameter
+name (i.e., <param name>) **MUST** contain only
+alphanumeric characters and underscores ('_').
+
+type
+____
+
+R-36772 A VNF’s Heat Orchestration Template’s parameter
+**MUST** include the attribute “type:”.
+
+R-11441 A VNF’s Heat Orchestration Template’s parameter
+type **MUST** be one of the following values: "string",
+"number", "json", "comma_delimited_list" or "boolean".
+
+label
+_____
+
+R-32094 A VNF's Heat Orchestration Template parameter
+declaration **MAY** contain the attribute "label:"
+
+description
+___________
+
+R-44001 A VNF's Heat Orchestration Template parameter
+declaration **MUST** contain the attribute "description".
+
+Note that the parameter attribute “description:” is an
+OpenStack optional attribute that provides a description
+of the parameter. ONAP implementation requires this attribute.
+
+default
+_______
+
+R-90526 A VNF Heat Orchestration Template parameter
+declaration **MUST** not contain the default attribute.
+
+R-26124 If a VNF Heat Orchestration Template parameter
+requires a default value, it **MUST** be enumerated in the environment file.
+
+Note that the parameter attribute “default:” is an OpenStack
+optional attribute that declares the default value of the
+parameter. ONAP implementation prohibits the use of this attribute.
+
+hidden
+______
+
+R-32557 A VNF's Heat Orchestration Template parameter
+declaration MAY contain the attribute "hidden:".
+
+The parameter attribute "hidden:" is an OpenStack optional
+attribute that defines whether the parameters should be
+hidden when a user requests information about a stack
+created from the template. This attribute can be used
+to hide passwords specified as parameters.
+
+constraints
+___________
+
+The parameter attribute "constraints:" is an OpenStack optional
+attribute that defines a list of constraints to apply to the parameter.
+
+R-88863 A VNF's Heat Orchestration Template's parameter defined as
+type "number" **MUST** have a parameter constraint of "range" or
+"allowed_values" defined.
+
+R-40518 A VNF's Heat Orchestration Template’s parameter defined as
+type "string" **MAY** have a parameter constraint defined.
+
+R-96227 A VNF's Heat Orchestration Template’s parameter defined as
+type "json" **MAY** have a parameter constraint defined.
+
+R-79817 A VNF's Heat Orchestration Template’s parameter defined as
+type "comma_delimited_list" **MAY** have a parameter constraint defined.
+
+R-06613 A VNF's Heat Orchestration Template’s parameter defined as
+type "boolean" **MAY** have a parameter constraint defined.
+
+R-00011 A VNF's Heat Orchestration Template's Nested YAML files
+parameter's **MUST NOT** have a parameter constraint defined.
+
+The constraints block of a parameter definition defines additional
+validation constraints that apply to the value of the parameter.
+The parameter values provided in the VNF Heat Orchestration Template
+are validated against the constraints at instantiation time.
+The stack creation fails if the parameter value doesn’t comply to
+the constraints.
+
+The constraints are defined as a list with the following syntax
+
+.. code-block:: python
+
+  constraints:
+
+    <constraint type>: <constraint definition>
+
+    description: <constraint description>
+
+..
+
+**<constraint type>** Provides the type of constraint to apply.
+The list of OpenStack supported constraints can be found at
+https://docs.openstack.org/heat/latest/template_guide/hot_spec.html .
+
+**<constraint definition>** provides the actual constraint.
+The syntax and constraint is dependent of the <constraint type> used.
+
+**description** is an optional attribute that provides a description of the
+constraint. The text is presented to the user when the value the user
+defines violates the constraint. If omitted, a default validation
+message is presented to the user.
+
+Below is a brief overview of the "range" and "allowed values" constraints.
+For complete details on constraints, see
+https://docs.openstack.org/heat/latest/template_guide/hot_spec.html#parameter-constraints
+
+**range**
+
+range: The range constraint applies to parameters of type: number.
+It defines a lower and upper limit for the numeric value of the
+parameter. The syntax of the range constraint is
+
+.. code-block:: python
+
+    range: { min: <lower limit>, max: <upper limit> }
+
+..
+
+It is possible to define a range constraint with only a lower
+limit or an upper limit.
+
+**allowed_values**
+
+allowed_values: The allowed_values constraint applies to parameters of
+type \"string\" or type \"number\". It specifies a set of possible
+values for a parameter. At deployment time, the user-provided value
+for the respective parameter must match one of the elements of the
+list. The syntax of the allowed_values constraint is
+
+.. code-block:: python
+
+    allowed_values: [ <value>, <value>, ... ]
+
+    Alternatively, the following YAML list notation can be used
+
+    allowed_values:
+
+    - <value>
+
+    - <value>
+
+    - ...
+
+. .
+
+immutable
+_________
+
+R-22589 A VNF’s Heat Orchestration Template parameter declaration
+**MAY** contain the attribute "immutable:".
+
+The parameter attribute \"immutable:\" is an OpenStack optional
+attribute that defines whether the parameter is updatable. A Heat
+Orchestration Template stack update fails if immutable is set to
+true and the parameter value is changed.  This attribute
+\"immutable:\" defaults to false.
+
+resources
++++++++++
+
+R-23664 A VNF's Heat Orchestration template **MUST** contain
+the section "resources:".
+
+R-90152 A VNF's Heat Orchestration Template's "resources:"
+section **MUST** contain the declaration of at least one resource.
+
+R-40551 A VNF's Heat Orchestration Template's Nested YAML files
+**MAY** contain the section "resources:".
+
+Each resource is defined as a
+separate block in the resources section with the following syntax.
+
+.. code-block:: python
+
+  resources:
+
+    <resource ID>:
+
+      type: <resource type>
+
+      properties:
+
+        <property name>: <property value>
+
+      metadata:
+
+        <resource specific metadata>
+
+      depends_on: <resource ID or list of ID>
+
+      update_policy: <update policy>
+
+      deletion_policy: <deletion policy>
+
+      external_id: <external resource ID>
+
+      condition: <condition name or expression or boolean>
+
+
+
+resource ID
+___________
+
+R-75141 A VNF's Heat Orchestration Template's resource name
+(i.e., <resource ID>) **MUST** only contain alphanumeric
+characters and underscores ('_').
+
+R-16447 A VNF's <resource ID> **MUST** be unique across all
+Heat Orchestration Templates and all HEAT Orchestration Template
+Nested YAML files that are used to create the VNF.
+
+Note that a VNF can be composed of one or more Heat Orchestration Templates.
+
+Note that OpenStack requires the <resource ID> to be unique to the
+Heat Orchestration Template and not unique across all Heat
+Orchestration Templates the compose the VNF.
+
+type
+____
+
+The resource attribute \"type:\" is an OpenStack required
+attribute that defines the resource type, such as
+OS::Nova::Server or OS::Neutron::Port.
+
+The resource attribute \"type:\" may specify a VNF HEAT
+Orchestration Template Nested YAML file.
+
+R-53952 A VNF’s Heat Orchestration Template’s Resource
+**MUST NOT** reference a HTTP-based resource definitions.
+
+R-71699 A VNF’s Heat Orchestration Template’s Resource
+**MUST NOT** reference a HTTP-based Nested YAML file.
+
+properties
+__________
+
+The resource attribute \"properties:\" is an OpenStack optional
+attribute that provides a list of resource-specific properties.
+The property value can be provided in place, or via a function
+(e.g., `Intrinsic functions <https://docs.openstack.org/developer/heat/template_guide/hot_spec.html#hot-spec-intrinsic-functions>`__).
+
+R-10834 If a VNF Heat Orchestration Template resource attribute
+"property:" uses a nested "get_param", one level of nesting is
+supported and the nested "get_param" **MUST** reference an index
+
+metadata
+________
+
+The resource attribute \"metadata:\" is an OpenStack optional attribute.
+
+R-97199 A VNF's Heat Orchestration Template's OS::Nova::Server
+resource **MUST** contain the attribute "metadata".
+
+Section 5.4 contains the OS::Nova::Server mandatory and optional metadata.
+
+
+depends_on
+__________
+
+The resource attribute \"depends_on:\" is an OpenStack optional
+attribute.
+See `OpenStack documentation <https://docs.openstack.org/developer/heat/template_guide/hot_spec.html#hot-spec-resources-dependencies>`__
+for additional details.
+
+R-46968 VNF’s Heat Orchestration Template’s Resource **MAY**
+declare the attribute “depends_on:”.
+
+update_policy
+_____________
+
+R-63137 VNF’s Heat Orchestration Template’s Resource **MAY**
+declare the attribute “update_policy:”.
+
+deletion_policy
+_______________
+
+R-43740 A VNF’s Heat Orchestration Template’s Resource
+**MAY** declare the attribute “deletion_policy:”.
+
+If specified, the \"deletion_policy:\" attribute for resources
+allows values 'Delete', 'Retain', and 'Snapshot'.
+Starting with heat_template_version 2016-10-14, lowercase
+equivalents are also allowed.
+
+The default policy is to delete the physical resource when
+deleting a resource from the stack.
+
+external_id
+___________
+
+R-78569 A VNF’s Heat Orchestration Template’s Resouce **MAY**
+declare the attribute “external_id:”.
+
+This attribute allows for specifying the resource_id for an
+existing external (to the stack) resource. External resources
+cannot depend on other resources, but we allow other resources to
+depend on external resource. This attribute is optional.
+Note: when this is specified, properties will not be used for
+building the resource and the resource is not managed by Heat.
+This is not possible to update that attribute. Also,
+resource won’t be deleted by heat when stack is deleted.
+
+
+condition
+_________
+
+The resource attribute \"condition:\" is an OpenStack optional attribute.
+
+Support for the resource condition attribute was added
+in the Newton release of OpenStack.
+
+outputs
++++++++
+
+R-36982 A VNF’s Heat Orchestration template **MAY**
+contain the “outputs:” section.
+
+This section allows for specifying output parameters
+available to users once the template has been instantiated. If the
+section is specified, it will need to adhere to specific requirements.
+See `ONAP Parameter Classifications Overview`_ and
+`ONAP Output Parameter Names`_ for additional details.
+
+Environment File Format
+~~~~~~~~~~~~~~~~~~~~~~~
+
+The environment file is a yaml text file.
+(https://docs.openstack.org/developer/heat/template_guide/environment.html)
+
+R-86285 The VNF Heat Orchestration Template **MUST** have a corresponding
+environment file, even if no parameters are required to be enumerated.
+
+The use of an environment file in OpenStack is optional.
+In ONAP, it is mandatory.
+
+R-03324 The VNF Heat Orchestration Template **MUST** contain the
+"parameters" section in the
+environment file
+
+R-68198 A VNF’s Heat Orchestration template’s Environment File’s
+“parameters:” section **MAY** enumerate parameters.
+
+ONAP implementation requires the parameters section in the
+environmental file to be declared. The parameters section
+contains a list of key/value pairs.
+
+R-59930 A VNF’s Heat Orchestration template’s Environment
+File’s **MAY** contain the “parameter_defaults:” section.
+
+The “parameter_defaults:” section contains default parameters
+that are passed to all template resources.
+
+R-46096 A VNF’s Heat Orchestration template’s Environment File’s
+**MAY** contain the “encrypted_parameters:” section.
+
+The “encrypted_parameters:” section contains a list of encrypted parameters.
+
+R-24893 A VNF’s Heat Orchestration template’s Environment File’s
+**MAY** contain the “event_sinks:” section.
+
+The “event_sinks:” section contains the list of endpoints that would
+receive stack events.
+
+R-42685 A VNF’s Heat Orchestration template’s Environment File’s
+**MAY** contain the “parameter_merge_strategies:” section.
+
+The “parameter_merge_strategies:” section provides the merge strategies
+for merging parameters and parameter defaults from the environment file.
+
+R-67231 A VNF’s Heat Orchestration template’s Environment File’s **MUST NOT**
+contain the “resource_registry:” section.
+
+ONAP implementation does not support the Environment File
+resource_registry section. The resource_registry section
+allows for the definition of custom resources.
+
+
+SDC Treatment of Environment Files
+++++++++++++++++++++++++++++++++++
+
+Parameter values enumerated in the environment file are used by SDC as
+the default value. However, the SDC user may use the SDC GUI to
+overwrite the default values in the environment file.
+
+SDC generates a new environment file for distribution to MSO based on
+the uploaded environment file and the user provided GUI updates. The
+user uploaded environment file is discarded when the new file is
+created.
+
+ONAP has requirements for what parameters must be enumerated in the
+environment file and what parameter must not be enumerated in the
+environment file. See `ONAP Parameter Classifications Overview`_ and
+`ONAP Resource ID and Parameter Naming Convention`_ for more details.
+
+ONAP Heat Orchestration Templates: Overview
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ONAP supports a modular Heat Orchestration Template design pattern,
+referred to as *VNF Modularity.*
+
+ONAP VNF Modularity Overview
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+R-69663 A VNF **MAY** be composed from one or more Heat Orchestration
+Templates, each of which represents a subset of the overall VNF.
+
+The Heat Orchestration Templates can be thought of a components or
+modules of the VNF and are referred to as “\ *VNF Modules*\ ”.
+During orchestration, these modules are
+deployed incrementally to create the complete VNF.
+
+R-33132 A VNF’s Heat Orchestration Template **MAY** be 1.) Base Module
+Heat Orchestration Template (also referred to as a Base Module), 2.)
+Incremental Module Heat Orchestration Template (referred to as an Incremental
+Module), or 3.) a Cinder Volume Module Heat Orchestration Template
+(referred to as Cinder Volume Module).
+
+R-37028 The VNF **MUST** be composed of one “base” module.
+
+R-13196 A VNF **MAY** be composed of zero to many Incremental Modules
+
+R-20974 The VNF **MUST** deploy the base module first, prior to
+the incremental modules.
+
+R-28980 A VNF’s incremental module **MAY** be used for initial VNF
+deployment only.
+
+R-86926 A VNF’s incremental module **MAY** be used for scale out only.
+
+A VNF’s Incremental Module that is used for scale out is deployed
+sometime after initial VNF deployment to add capacity.
+
+R-91497 A VNF’s incremental module **MAY** be used for both deployment
+and scale out.
+
+R-68122 A VNF’s incremental module **MAY** be deployed more than once,
+either during initial VNF deployment and/or scale out.
+
+R-46119 A VNF’s Heat Orchestration Template’s Resource OS::Heat::CinderVolume
+**MAY** be defined in a Base Module.
+
+R-90748 A VNF’s Heat Orchestration Template’s Resource OS::Cinder::Volume
+**MAY** be defined in an Incremental Module.
+
+R-03251 A VNF’s Heat Orchestration Template’s Resource OS::Cinder::Volume
+**MAY** be defined in a Cinder Volume Module.
+
+ONAP also supports the concept of an optional, independently deployed Cinder
+volume via a separate Heat Orchestration Templates, referred to as a Cinder
+Volume Module. This allows the volume to persist after a Virtual Machine
+(VM) (i.e., OS::Nova::Server) is deleted, allowing the volume to be reused
+on another instance (e.g., during a failover activity).
+
+R-11200 The VNF **MUST** keep the scope of a Cinder volume module, when it
+exists, to be 1:1 with the VNF Base Module or Incremental Module
+
+It is strongly recommended that Cinder Volumes be created in a Cinder Volume
+Module.
+
+R-38474 The VNF **MUST** have a corresponding environment file for a
+Base Module.
+
+R-81725 The VNF **MUST** have a corresponding environment file for an
+Incremental Module.
+
+R-53433 The VNF **MUST** have a corresponding environment file for a
+Cinder Volume Module.
+
+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.
+
+Nested Heat Orchestration Templates Overview
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ONAP supports nested Heat Orchestration Templates per OpenStack
+specifications.
+
+R-36582 A VNF’s Base Module **MAY** utilize nested heat.
+
+R-56721 A VNF’s Incremental Module **MAY** utilize nested heat.
+
+R-30395 A VNF’s Cinder Volume Module **MAY** utilize nested heat.
+
+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 Heat Orchestration Template may then reference these
+nested templates either statically (by repeated definition) or
+dynamically (via OS::Heat::ResourceGroup).
+
+See `Nested Heat Templates`_ for additional details.
+
+ONAP Heat Orchestration Template Filenames
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In order to enable ONAP to understand the relationship between Heat
+files, the following Heat file naming convention must be utilized.
+
+In the examples below, <text> represents any alphanumeric string that
+must not contain any special characters and must not contain the word
+“base”.
+
+R-87485 A VNF’s Heat Orchestration Template’s file extension **MUST**
+be in the lower case format ‘.yaml’ or ‘.yml’.
+
+R-56438 A VNF’s Heat Orchestration Template’s Nested YAML file extension
+**MUST** be in the lower case format ‘.yaml’ or ‘.yml’.
+
+R-74304 A VNF’s Heat Orchestration Template’s Environment file extension
+**MUST** be in the lower case format ‘.env’.
+
+Base Modules
+++++++++++++
+
+R-81339 A VNF Heat Orchestration Template’s Base Module file name **MUST**
+include ‘base’ in the filename and **MUST** match one of the following four
+formats: 1.) ‘base_<text>.y[a]ml’, 2.) ‘<text>_base.y[a]ml’, 3.)
+‘base.y[a]ml’, or 4.) ‘<text>_base_<text>’.y[a]ml; where ‘base’ is case
+insensitive and where ‘<text>’ **MUST** contain only alphanumeric characters
+and underscores ‘_’ and **MUST NOT** contain the case insensitive word ‘base’.
+
+R-91342  A VNF Heat Orchestration Template’s Base Module’s Environment File
+**MUST** be named identical to the VNF Heat Orchestration Template’s Base
+Module with ‘.y[a]ml’ replaced with ‘.env’.
+
+Incremental Modules
++++++++++++++++++++
+
+R-87247 A VNF Heat Orchestration Template’s Incremental Module file name
+**MUST** contain only alphanumeric characters and underscores ‘_’ and
+**MUST NOT** contain the case insensitive word ‘base’.
+
+R-94509 A VNF Heat Orchestration Template’s Incremental Module’s Environment
+File **MUST** be named identical to the VNF Heat Orchestration Template’s
+Incremental Module with ‘.y[a]ml’ replaced with ‘.env’.
+
+To clearly identify the incremental module, it is recommended to use the
+following naming options for modules:
+
+ -  module_<text>.y[a]ml
+
+ -  <text>_module.y[a]ml
+
+ -  module.y[a]ml
+
+ -  <text>_module_<text>.y[a]ml
+
+Cinder Volume Modules
++++++++++++++++++++++
+
+R-82732 A VNF Heat Orchestration Template’s Cinder Volume Module **MUST** be
+named identical to the base or incremental module it is supporting with
+‘_volume appended’
+
+R-31141 A VNF Heat Orchestration Template’s Cinder Volume Module’s Environment
+File **MUST** be named identical to the VNF Heat Orchestration Template’s
+Cinder Volume Module with .y[a]ml replaced with ‘.env’.
+
+Nested Heat file
+++++++++++++++++
+
+R-76057 A VNF Heat Orchestration Template’s Nested YAML file name **MUST**
+contain only alphanumeric characters and underscores ‘_’ and **MUST NOT**
+contain the case insensitive word ‘base’.
+
+Examples include
+
+ -  <text>.y[a]ml
+
+ -  nest_<text>.y[a]ml
+
+ -  <text>_nest.y[a]ml
+
+ -  nest.y[a]ml
+
+ -  <text>_nest_<text>.y[a]ml
+
+VNF Heat Orchestration Template's Nested YAML file does not have a
+corresponding environment files, per OpenStack specifications.
+
+R-18224 The VNF Heat Orchestration Template **MUST** pass in as properties
+all parameter values
+associated with the nested heat file in the resource definition defined
+in the parent heat template.
+
+Output Parameters
+~~~~~~~~~~~~~~~~~
+
+The output parameters are parameters defined in the output section of a
+Heat Orchestration Template. The ONAP output parameters are subdivided
+into three categories:
+
+1. ONAP Base Module Output Parameters
+
+2. ONAP Volume Module Output Parameters
+
+3. ONAP Predefined Output Parameters.
+
+ONAP Base Module Output Parameters
+++++++++++++++++++++++++++++++++++++
+
+ONAP Base Module Output Parameters are declared in the 'outputs:'' section of
+the VNF's Heat Orchestration Template's Base Module. A Base Module Output
+Parameter is available as an input parameter (i.e., declared in the
+'parameters:'' section) to all Incremental Modules in the VNF.
+
+A Base Module Output Parameter may be used as an input parameter in any
+incremental module in the VNF.  Note that the parameter is not
+available to other VNFs.
+
+R-52753 VNF’s Heat Orchestration Template’s Base Module’s output parameter’s
+name and type **MUST** match the VNF’s Heat Orchestration Template’s
+incremental Module’s name and type unless the output parameter is of type
+‘comma_delimited_list’, then the corresponding input parameter **MUST**
+be declared as type ‘json’.
+
+If the Output parameter has a comma_delimited_list value (e.g., a collection
+of UUIDs from a Resource Group), then the corresponding input parameter
+must be declared as type json and not a comma_delimited_list, which is
+actually a string value with embedded commas.
+
+R-22608 When a VNF’s Heat Orchestration Template’s Base Module’s output
+parameter is declared as an input parameter in an Incremental Module,
+the parameter attribute ‘constraints:’ **MUST NOT** be declared.
+
+Additional details on ONAP Base Module Output Parameters are provided in
+`ONAP Output Parameter Names`_ and ONAP VNF Modularity.
+
+ONAP Volume Module Output Parameters
+++++++++++++++++++++++++++++++++++++
+
+R-89913 A VNF’s Heat Orchestration Template’s Cinder Volume Module Output
+Parameter(s) **MUST** include the UUID(s) of the Cinder Volumes created in
+template, while other Output Parameters **MAY** be included.
+
+A VNF’s Heat Orchestration Template’s Cinder Volume Module Output Parameter(s)
+are only available for the module (base or incremental) that the volume
+template is associated with.
+
+R-07443 A VNF’s Heat Orchestration Templates’ Cinder Volume Module Output
+Parameter’s name and type **MUST** match the input parameter name and type
+in the corresponding Base Module or Incremental Module unless the Output
+Parameter is of the type ‘comma_delimited_list’, then the corresponding input
+parameter **MUST** be declared as type ‘json’.
+
+If the Output parameter has a comma_delimited_list value (e.g., a collection
+of UUIDs from a Resource Group), then the corresponding input parameter must
+be declared as type json and not a comma_delimited_list, which is actually a
+string value with embedded commas.
+
+R-20547 When an ONAP Volume Module Output Parameter is declared as an input
+parameter in a base or an incremental module Heat Orchestration Template,
+parameter constraints **MUST NOT** be declared.
+
+Additional details on ONAP Base Module Output Parameters are provided in
+`ONAP Output Parameter Names`_ and `Cinder Volume Templates`_.
+
+ONAP Predefined Output Parameters
++++++++++++++++++++++++++++++++++++
+
+ONAP will look for a small set of pre-defined Heat output parameters to
+capture resource attributes for inventory in ONAP. These output parameters
+are optional and currently only two parameters are supported. These output
+parameters are optional and are specified in `OAM Management IP Addresses`_.
+
+Support of heat stack update
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ONAP does not support the use of heat stack-update command for scaling
+(growth/de-growth).
+
+R-39349 A VNF Heat Orchestration Template **MUST NOT** be designed to
+utilize the OpenStack ‘heat stack-update’ command for scaling
+(growth/de-growth).
+
+R-43413 A VNF **MUST** utilize a modular Heat Orchestration Template
+design to support scaling (growth/de-growth).
+
+Scope of a Heat Orchestration Template
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+R-59482 A VNF’s Heat Orchestration Template **MUST NOT** be VNF instance
+specific or Cloud site specific
+
+R-56750 A VNF’s Heat Orchestration Template’s parameter values that are
+constant across all deployments **MUST** be declared in a Heat Orchestration
+Template Environment File.
+
+ONAP provides the instance specific parameter values to the Heat
+Orchestration Template at orchestration time.
+
+R-01896 A VNF’s Heat Orchestration Template’s parameter values that are
+constant across all deployments **MUST** be declared in a Heat Orchestration
+Template Environment File.
+
+Networking
+^^^^^^^^^^
+
+ONAP defines two types of networks: External Networks and Internal Networks.
+
+External Networks
+~~~~~~~~~~~~~~~~~
+
+ONAP defines an external network in relation to the VNF and not with regard
+to the Network Cloud site. External networks may also be referred to as
+“inter-VNF” networks.  An external network must connect VMs in a VNF to
+VMs in another VNF or an external gateway or external router.
+
+An External Network may be a Neutron Network or a Contrail Network.
+
+R-16968 A VNF’s Heat Orchestration Templates **MUST NOT** include heat
+resources to create external networks.
+
+External networks must be orchestrated separately, independent of the VNF.
+This allows the network to be shared by multiple VNFs and managed
+independently of VNFs.
+
+R-00606 A VNF **MAY** be connected to zero, one or more than one external
+networks.
+
+R-57424 A VNF’s port connected to an external network **MUST** connect the
+port to VMs in another VNF and/or an external gateway and/or external router.
+
+R-29865 A VNF’s port connected to an external network **MUST NOT** connect
+the port to VMs in the same VNF.
+
+R-69014 When a VNF connects to an external network, a network role, referred
+to as the ‘{network-role}’ **MUST** be assigned to the external network
+for use in the VNF’s Heat Orchestration Template.
+
+R-05201 When a VNF connects to two or more external networks, each external
+network **MUST** be assigned a unique ‘{network-role}’ in the context of
+the VNF for use in the VNF’s Heat Orchestration Template.
+
+R-83015 A VNF’s ‘{network-role}’ assigned to an external network **MUST**
+be different than the ‘{network-role}’ assigned to the VNF’s internal
+networks, if internal networks exist.
+
+ONAP enforces a naming convention for parameters associated with
+external networks. `ONAP Resource ID and Parameter Naming Convention`_
+provides additional details.
+
+Internal Networks
+~~~~~~~~~~~~~~~~~
+
+ONAP defines an internal network in relation to the VNF and not with
+regard to the Network Cloud site. Internal networks may also be referred
+to as “intra-VNF” networks or “private” networks. An internal network
+only connects VMs in a single VNF; it must not connect to other VNFs
+or an external gateway or router
+
+R-87096 A VNF **MAY** contain zero, one or more than one internal networks.
+
+R-35666 If a VNF has an internal network, the VNF Heat Orchestration
+Template **MUST** include the heat resources to create the internal network.
+
+R-86972 A VNF **SHOULD** create the internal network in the VNF’s Heat
+Orchestration Template Base Module.
+
+An Internal Network may be created using Neutron Heat Resources and/or
+Contrail Heat Resources.
+
+R-52425 A VNF’s port connected to an internal network **MUST** connect
+the port to VMs in the same VNF.
+
+R-46461 A VNF’s port connected to an internal network **MUST NOT** connect
+the port to VMs in another VNF and/or an external gateway and/or
+external router.
+
+R-68936 When a VNF creates an internal network, a network role, referred to
+as the ‘{network-role}’ **MUST** be assigned to the internal network for
+use in the VNF’s Heat Orchestration Template.
+
+R-32025 When a VNF creates two or more internal networks, each internal
+network **MUST** be assigned a unique ‘{network-role}’ in the context of
+the VNF for use in the VNF’s Heat Orchestration Template.
+
+R-69874 A VNF’s ‘{network-role}’ assigned to an internal network **MUST**
+be different than the ‘{network-role}’ assigned to the VNF’s external
+networks.
+
+R-34726 If a VNF’s port is connected to an internal network and the port
+is created in the same Heat Orchestration Template as the internal network,
+then the port resource **MUST** use a ‘get_resource’ to obtain
+the network UUID.
+
+R-22688  If a VNF’s port is connected to an internal network and the
+port is created in an Incremental Module and the internal network is created
+in the Base Module then the UUID of the internal network **MUST** be exposed
+as a parameter in the ‘outputs:’ section of the Base Module and the port
+resource **MUST** use a ‘get_param’ to obtain the network UUID.
+
+ONAP does not programmatically enforce a naming convention for
+parameters for internal network. However, a naming convention is
+provided that must be followed.
+`ONAP Resource ID and Parameter Naming Convention`_
+provides additional details.
+
+ONAP Resource ID and Parameter Naming Convention
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This section provides the ONAP naming requirements for
+
+1. Resource IDs
+
+2. Resource Property Parameters
+
+{vm-type}
+~~~~~~~~~
+
+R-01455 When a VNF's Heat Orchestration Template creates a
+Virtual Machine  (i.e., 'OS::Nova::Server'), each 'class' of VMs
+**MUST** be assigned a VNF unique '{vm-type}'; where 'class'
+defines VMs that **MUST** have the following identical characteristics:
+
+      1.) OS::Nova::Server property flavor value
+
+      2.) OS::Nova::Server property image value
+
+      3.) Cinder Volume attachments
+        - Each VM in the 'class' **MUST** have the identical Cinder Volume
+          configuration
+
+      4.) Network attachments and IP address requirements
+        - Each VM in the 'class' **MUST** have the the identical number
+          of ports connecting to the identical networks and requiring the
+          identical IP address configuration.
+
+R-82481 A VNF's Heat Orchestration Template's Resource property
+parameter that is
+associated with a unique Virtual Machine type **MUST**
+include '{vm-type}'  as part of the parameter name with two
+exceptions:
+
+     1.) The Resource OS::Nova::Server property availability_zone parameter
+     **MUST NOT** be prefixed with a common '{vm-type} identifier,
+
+     2.) The Resource OS::Nova::Server eight mandatory and optional metadata
+     parameters (vnf_name, vnf_id, vf_module_id, vf_module_name, vm_role,
+     vf_module_index, environment_context, workload_context) **MUST NOT**
+     be prefixed with a common '{vm-type}' identifier.
+
+
+R-66729 A VNF’s Heat Orchestration Template’s Resource that is
+associated with a unique Virtual Machine type **MUST** include
+‘{vm-type}’ as part of the resource ID.
+
+R-98407 A VNF's Heat Orchestration Template's '{vm-type}' **MUST** contain
+only alphanumeric characters and/or underscores '_' and
+**MUST NOT** contain any of the following strings: '_int' or 'int\_'
+or '\_int\_'.
+
+R-48067 A VNF's Heat Orchestration Template's {vm-type} **MUST NOT** be a
+substring of {network-role}.
+
+It may cause the Pre-Amsterdam VNF Validation Program (i.e.,
+ICE Project) process to produce erroneous error messages.
+
+R-32394 A VNF’s Heat Orchestration Template’s use of ‘{vm-type}’
+in all Resource property parameter names **MUST** be the same case.
+
+R-46839 A VNF’s Heat Orchestration Template’s use of
+‘{vm-type}’ in all Resource IDs **MUST** be the same case.
+
+R-36687 A VNF’s Heat Orchestration Template’s ‘{vm-type}’ case in
+Resource property parameter names **SHOULD** match the case of
+‘{vm-type}’ in Resource IDs and vice versa.
+
+{network-role}
+~~~~~~~~~~~~~~
+
+The assignment of a {network-role} is discussed in `Networking`_.
+
+R-21330 A VNF’s Heat Orchestration Template’s Resource property
+parameter that is associated with external network **MUST**
+include the ‘{network-role}’’ as part of the parameter name
+
+R-11168 A VNF's Heat Orchestration Template's Resource ID that is
+associated with an external network **MUST** include the
+'{network-role}' as part of the resource ID.
+
+R-84322 A VNF's Heat Orchestration Template's Resource property
+parameter that is associated with an internal network
+**MUST** include 'int\_{network-role}' as part of the parameter
+name, where 'int\_' is a hard coded string.
+
+R-96983 A VNF's Heat Orchestration Template's Resource ID that is
+associated with an internal network **MUST** include
+'int\_{network-role}' as part of the Resource ID, where
+'int\_' is a hard coded string.
+
+R-26506 A VNF's Heat Orchestration Template's '{network-role}'
+**MUST** contain only alphanumeric characters and/or
+underscores '_' and **MUST NOT** contain any of the following
+strings: '_int' or 'int\_' or '\_int\_'.
+
+R-00977 A VNF’s Heat Orchestration Template’s ‘{network-role}’
+**MUST NOT** be a substring of ‘{vm-type}’.
+
+For example, if a VNF has a ‘{vm-type}’ of ‘oam’ and a
+‘{network-role}’ of ‘oam_protected’ would be a violation of the requirement.
+
+R-58424 A VNF’s Heat Orchestration Template’s use of ‘{network-role}’
+in all Resource property parameter names **MUST** be the same case
+
+R-21511 A VNF’s Heat Orchestration Template’s use of ‘{network-role}’
+in all Resource IDs **MUST** be the same case.
+
+R-86588 A VNF’s Heat Orchestration Template’s ‘{network-role}’ case
+in Resource property parameter names **SHOULD** match the case
+of ‘{network-role}’ in Resource IDs and vice versa.
+
+Resource IDs
+~~~~~~~~~~~~
+
+Requirement R-75141 states a VNF’s Heat Orchestration Template’s
+resource name (i.e., <resource ID>) MUST only contain alphanumeric
+characters and underscores (‘_’).*
+
+Requirement R-16447 states a VNF’s <resource ID> MUST be unique
+across all Heat Orchestration Templates and all HEAT Orchestration
+Template Nested YAML files that are used to create the VNF.
+
+As stated previously, OpenStack requires the <resource ID> to be unique
+to the Heat Orchestration Template and not unique across all Heat
+Orchestration Templates the compose the VNF.
+
+Heat Orchestration Template resources are described in `resources`_
+
+R-54517 When a VNF’s Heat Orchestration Template’s resource is associated
+with a single ‘{vm-type}’, the Resource ID **MUST** contain the ‘{vm-type}’.
+
+R-96482 When a VNF’s Heat Orchestration Template’s resource is associated
+with a single external network, the Resource ID MUST contain the text
+‘{network-role}’.
+
+R-98138 When a VNF’s Heat Orchestration Template’s resource is associated
+with a single internal network, the Resource ID MUST contain the text
+‘int\_{network-role}’.
+
+R-82115 When a VNF's Heat Orchestration Template's resource is associated
+with a single '{vm-type}' and a single external network, the Resource
+ID text **MUST** contain both the '{vm-type}' and the '{network-role}'
+
+- the '{vm-type}' **MUST** appear before the '{network-role}' and **MUST**
+  be separated by an underscore '_'
+
+   - e.g., '{vm-type}_{network-role}', '{vm-type}_{index}_{network-role}'
+
+- note that an '{index}' value **MAY** separate the '{vm-type}' and the
+  '{network-role}' and when this occurs underscores **MUST** separate the
+  three values.
+
+R-82551 When a VNF's Heat Orchestration Template's resource is associated
+with a single '{vm-type}' and a single internal network, the Resource ID
+**MUST** contain both the '{vm-type}' and the 'int\_{network-role}' and
+
+- the '{vm-type}' **MUST** appear before the 'int\_{network-role}' and
+  **MUST** be separated by an underscore '_'
+
+   - (e.g., '{vm-type}\_int\_{network-role}',
+     '{vm-type}_{index}\_int\_{network-role}')
+
+- note that an '{index}' value **MAY** separate the '{vm-type}' and the
+  'int\_{network-role}' and when this occurs underscores **MUST** separate
+  the three values.
+
+R-67793 When a VNF’s Heat Orchestration Template’s resource is associated
+with more than one ‘{vm-type}’ and/or more than one internal and/or
+external network, the Resource ID **MUST NOT** contain the ‘{vm-type}’
+and/or ‘{network-role}’/’int\_{network-role}’. It also should contain the
+term ‘shared’ and/or contain text that identifies the VNF
+
+R-27970 When a VNF’s Heat Orchestration Template’s resource is associated
+with more than one ‘{vm-type}’ and/or more than one internal and/or
+external network, the Resource ID **MAY** contain the term ‘shared’
+and/or **MAY** contain text that identifies the VNF.
+
+R-11690 When a VNF’s Heat Orchestration Template’s Resource ID contains
+an {index} value (e.g. multiple VMs of same {vm-type}), the ‘{index}’
+**MUST** start at zero and increment by one.
+
+The table below provides example OpenStack Heat resource ID for
+resources only associated with one {vm-type} and/or one network.
+
+The Requirements column states if the Resource ID Format MUST be followed
+or SHOULD be followed. Resource ID formats that are marked MUST must be
+followed, no deviations are permitted. Resource ID formats that are marked
+SHOULD should be followed. However, deviations are permissible to meet
+the needs of the VNF’s Heat Orchestration Template.
+
++-----------------+-------------------------+-------------+------------------+
+|Resource Type    |Resource ID Format       | Requirements| Notes            |
+|                 |                         |             |                  |
++=================+=========================+=============+==================+
+| OS::Cinder::    | {vm-type}\_volume\      | **SHOULD**  |                  |
+| Volume          | _{index}                |             |                  |
++-----------------+-------------------------+-------------+------------------+
+| OS::Cinder::    | {vm-type}\              | **SHOULD**  |                  |
+| VolumeAttachment| _volumeattachment\      |             |                  |
+|                 | _{index}                |             |                  |
++-----------------+-------------------------+-------------+------------------+
+| OS::Heat::      | {vm-type}_RCC           | **SHOULD**  |                  |
+| CloudConfig     |                         |             |                  |
++-----------------+-------------------------+-------------+------------------+
+| OS::Heat::      | {vm-type}_RMM           | **SHOULD**  |                  |
+| MultipartMime   |                         |             |                  |
++-----------------+-------------------------+-------------+------------------+
+| OS::Heat::      | {vm-type}_RRG           | **SHOULD**  |                  |
+| ResourceGroup   |                         |             |                  |
++-----------------+-------------------------+-------------+------------------+
+|                 | {vm-type}\_{index}\     | **MUST** for| Resource ID for  |
+|                 | _subint\_{network-role}\| subinterface| the OS::Heat::   |
+|                 | _port\_{index}\         | creation    | ResourceGroup    |
+|                 | _subinterfaces          |             | that creates     |
+|                 |                         |             | subinterfaces    |
++-----------------+-------------------------+-------------+------------------+
+| OS::Heat::      | {vm-type}_RSC           | **SHOULD**  |                  |
+| SoftwareConfig  |                         |             |                  |
++-----------------+-------------------------+-------------+------------------+
+| OS::Neutron::   | {vm-type}\              | **MUST**    | Resource ID for  |
+| Port            | _{vm-type-index}\       |             | port connecting  |
+|                 | _{network-role}\_port\  |             | to an external   |
+|                 | _{port-index}           |             | network. The     |
+|                 |                         |             | {vm-type-index}  |
+|                 |                         |             | is the instance  |
+|                 |                         |             | of the {vm_type}.|
+|                 |                         |             | The {port-index} |
+|                 |                         |             | is the instance  |
+|                 |                         |             | of the “port” on |
+|                 |                         |             | the {vm-type}.   |
+|                 |                         |             | There is no index|
+|                 |                         |             | after            |
+|                 |                         |             | {network_role}   |
+|                 |                         |             | since            |
+|                 |                         |             | {network-role} is|
+|                 |                         |             | unique to the    |
+|                 |                         |             | VNF, there should|
+|                 |                         |             | only be one      |
+|                 |                         |             | instance.        |
++-----------------+-------------------------+-------------+------------------+
+|                 | {vm-type}\_{index}\_int\| **MUST**    | Resource ID for  |
+|                 | _{network-role}\_port\  |             | port connecting  |
+|                 | _{index}                |             | to an internal   |
+|                 |                         |             | network. The     |
+|                 |                         |             | {index} that     |
+|                 |                         |             | follows {vm-type}|
+|                 |                         |             | is the instance  |
+|                 |                         |             | of the {vm_type}.|
+|                 |                         |             | The {index} that |
+|                 |                         |             | follows “port” is|
+|                 |                         |             | the instance of  |
+|                 |                         |             | the “port” on the|
+|                 |                         |             | {vm-type}. There |
+|                 |                         |             | is no index after|
+|                 |                         |             | {network_role}   |
+|                 |                         |             | since            |
+|                 |                         |             | {network-role} is|
+|                 |                         |             | unque to the AIC |
+|                 |                         |             | LCP; there should|
+|                 |                         |             | only be one      |
+|                 |                         |             | instance.        |
++-----------------+-------------------------+-------------+------------------+
+|                 | Reserve_Port\_{vm-type}\|             | Resource ID for a|
+|                 | _{network-role}\        | **MUST**    | reserve port that|
+|                 | _floating_ip\_{index}   |             | is used for an   |
+|                 |                         |             | allowed_address  |
+|                 | Reserve_Port\_{vm-type}\|             | \_pair. See      |
+|                 | _{network-role}\        |             | Section 5.6.5.5  |
+|                 | _floating_v6_ip\        |             | for additional   |
+|                 | _{index}                |             | details.         |
+|                 |                         |             |                  |
+|                 |                         |             | There is no      |
+|                 |                         |             | {index} that     |
+|                 |                         |             | follows {vm-type}|
++-----------------+-------------------------+-------------+------------------+
+| OS::Neutron::   | {vm-type}\_Sec\_Grp     | **SHOULD**  | Security Group   |
+| SecurityGroup   |                         |             | applicable to one|
+|                 |                         |             | {vm-type} and    |
+|                 |                         |             | more than one    |
+|                 |                         |             | network (internal|
+|                 |                         |             | and/or external) |
++-----------------+-------------------------+-------------+------------------+
+|                 | {network-role}\_Sec\_Grp| **SHOULD**  | Security Group   |
+|                 |                         |             | applicable to    |
+|                 |                         |             | more than one    |
+|                 |                         |             | {vm-type} and one|
+|                 |                         |             | external network |
++-----------------+-------------------------+-------------+------------------+
+|                 | int\_{network-role}\    | **SHOULD**  | Security Group   |
+|                 | _Sec\_Grp               |             | applicable to    |
+|                 |                         |             | more than one    |
+|                 |                         |             | {vm-type} and one|
+|                 |                         |             | internal network |
++-----------------+-------------------------+-------------+------------------+
+|                 | {vm-type}\              | **SHOULD**  | Security Group   |
+|                 | _{network-role}\_Sec\   |             | applicable to one|
+|                 | _Grp                    |             | {vm-type} and one|
+|                 |                         |             | external network |
++-----------------+-------------------------+-------------+------------------+
+|                 | {vm-type}\_int\         | **SHOULD**  | Security Group   |
+|                 | _{network-role}\_Sec\   |             | applicable to one|
+|                 | _Grp                    |             | {vm-type} and one|
+|                 |                         |             | internal network |
++-----------------+-------------------------+-------------+------------------+
+|                 | Shared\_Sec\_Grp        | **SHOULD**  | Security Group   |
+|                 |                         |             | applicable to    |
+|                 |                         |             | more than one    |
+|                 |                         |             | {vm-type} and    |
+|                 |                         |             | more than one    |
+|                 |                         |             | network (internal|
+|                 |                         |             | and/or external) |
++-----------------+-------------------------+-------------+------------------+
+| OS::Neutron::   | int\_{network-role}\    | **MUST**    | VNF Heat         |
+| Subnet          | _subnet\_{index}        |             | Orchestration    |
+|                 |                         |             | Templates can    |
+|                 |                         |             | only create      |
+|                 |                         |             | internal         |
+|                 |                         |             | networks.        |
++-----------------+-------------------------+-------------+------------------+
+| OS::Neutron::Net| int\_{network-role}\    | **MUST**    | VNF Heat         |
+|                 | _network                |             | Orchestration    |
+|                 |                         |             | Templates can    |
+|                 |                         |             | only create      |
+|                 |                         |             | internal         |
+|                 |                         |             | networks. There  |
+|                 |                         |             | is no {index}    |
+|                 |                         |             | because          |
+|                 |                         |             | {nework-role}    |
+|                 |                         |             |should be unique. |
++-----------------+-------------------------+-------------+------------------+
+| OS::Nova::      | {vm-type}\_keypair\     | **SHOULD**  | Key Pair         |
+| Keypair         | _{index}                |             | applicable to one|
+|                 |                         |             | a{vm-type}       |
++-----------------+-------------------------+-------------+------------------+
+|                 | {vnf-type}_keypair      | **SHOULD**  | Key Pair         |
+|                 |                         |             | applicable to all|
+|                 |                         |             | {vm-type} in the |
+|                 |                         |             | VNF              |
++-----------------+-------------------------+-------------+------------------+
+| OS::Nova::Server| {vm-type}\_server\      | Mandatory   |                  |
+|                 | _{index}                |             |                  |
++-----------------+-------------------------+-------------+------------------+
+| OS::Nova::      | {vm-type}_RSG           | **SHOULD**  | Both formats are |
+| ServerGroup     |                         |             | valid.           |
++-----------------+-------------------------+-------------+------------------+
+|                 | {vm-type}_Server_Grp    | **SHOULD**  |                  |
++-----------------+-------------------------+-------------+------------------+
+|                 | {vm-type}_ServerGroup   | **SHOULD**  |                  |
++-----------------+-------------------------+-------------+------------------+
+| OS::Swift::     | {vm-type}\_RSwiftC      | **SHOULD**  |                  |
+| Container       |                         |             |                  |
++-----------------+-------------------------+-------------+------------------+
+
+
+    Table 2: Example OpenStack Heat Resource ID
+
+The table below provides Resource ID Formats for Contrail heat resources.
+ - The Resource ID formats that are marked mandatory must be followed.
+   No deviations are permitted.
+ - The Resource ID formats that are marked optional should be followed.
+   However, deviations in the Resource ID format that is shown is
+   permitted.
+
++-----------------+---------------------+-----------------+-----------------+
+|     Resource    | Resource ID         |   Mandatory /   |      Notes      |
+|       Type      | Format              |     Optional    |                 |
++=================+=====================+=================+=================+
+| OS::ContrailV2: | {vm-type}\_{index}\ | **MUST** –      | The {index}     |
+| :InstanceIp     | _{network-role}\    | IPv4 address on | that follows    |
+|                 | _vmi\_{index}\      | vmi external    | {vm-type} is    |
+|                 | _IP\_{index}        | network         | the instance of |
+|                 |                     |                 | the {vm_type}.  |
+|                 |                     |                 | The {index}     |
+|                 |                     |                 | that follows    |
+|                 |                     |                 | “vmi” is the    |
+|                 |                     |                 | instance of the |
+|                 |                     |                 | “vmi” on the    |
+|                 |                     |                 | {vm-type}.      |
+|                 |                     |                 | There is no     |
+|                 |                     |                 | index after     |
+|                 |                     |                 | {network_role}  |
+|                 |                     |                 | since since     |
+|                 |                     |                 | {network-role}  |
+|                 |                     |                 | is unque. The   |
+|                 |                     |                 | {index} that    |
+|                 |                     |                 | follows the     |
+|                 |                     |                 | “IP” is the     |
+|                 |                     |                 | instance of the |
+|                 |                     |                 | “IP” on the     |
+|                 |                     |                 | “vmi”           |
++-----------------+---------------------+-----------------+-----------------+
+|                 | {vm-type}\_{index}\ | **MUST** –      |                 |
+|                 | _{network-role}\    | IPv6 address on |                 |
+|                 | _vmi\_{index}\_v6\  | vmi external    |                 |
+|                 | _IP\_{index}        | network         |                 |
++-----------------+---------------------+-----------------+-----------------+
+|                 | {vm-type}\_{index}\ | **MUST** –      |                 |
+|                 | _int\               | IPv4 address on |                 |
+|                 | _{network-role}\    | vmi internal    |                 |
+|                 | _vmi\_{index}\_IP\  | network         |                 |
+|                 | _{index}            |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+|                 | {vm-type}\_{index}\ | **MUST** –      |                 |
+|                 | _int\               | IPv6 address on |                 |
+|                 | _{network-role}\    | vmi internal    |                 |
+|                 | _vmi\_{index}\_v6\  | network         |                 |
+|                 | _IP\_{index}        |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+|                 | {vm-type}\_{index}\ | **MUST** –      |                 |
+|                 | _subint\            | IPv4 address on |                 |
+|                 | _{network-role}\    | sub-interface   |                 |
+|                 | _vmi\_{index}\_IP\  | vmi external    |                 |
+|                 | _{index}            | network         |                 |
++-----------------+---------------------+-----------------+-----------------+
+|                 | {vm-type}\_{index}\ | **MUST** –      |                 |
+|                 | _subint\            | IPv6 address on |                 |
+|                 | _{network-role}\    | sub-interface   |                 |
+|                 | _vmi\_{index}\_v6\  | vmi external    |                 |
+|                 | _IP\_{index}        | network         |                 |
++-----------------+---------------------+-----------------+-----------------+
+| OS::ContrailV2: | {network-role}\_RIRT| **MAY**         |                 |
+| :InterfaceRoute |                     |                 |                 |
+| Table           |                     |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+| OS::ContrailV2: | {network-role}\_RNI | **MAY**         |                 |
+| :NetworkIpam    |                     |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+| OS::ContrailV2: | {vm-type}\_RPT      | **MAY**         |                 |
+| :PortTuple      |                     |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+| OS::ContrailV2: | {vm-type}\_RSHC\    | **MAY**         |                 |
+| :ServiceHealthC | _{LEFT/RIGHT}       |                 |                 |
+| heck            |                     |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+| OS::ContrailV2: | {vm-type}\_RST\     | **MAY**         |                 |
+| :ServiceTemplat | _{index}            |                 |                 |
+| e               |                     |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+| OS::ContrailV2: | {vm-type}\_{index}\ | **MUST** - vmi  | Resource ID for |
+| :VirtualMachine | _{network-role}\    | attached to an  | virtual machine |
+| Interface       | _vmi\_{index}       | external        | interface (vmi) |
+|                 |                     | network         | connecting to   |
+|                 |                     |                 | an external     |
+|                 |                     |                 | network. The    |
+|                 |                     |                 | {index} that    |
+|                 |                     |                 | follows         |
+|                 |                     |                 | {vm-type} is    |
+|                 |                     |                 | the instance of |
+|                 |                     |                 | the {vm_type}.  |
+|                 |                     |                 | The {index}     |
+|                 |                     |                 | that follows    |
+|                 |                     |                 | “vmi” is the    |
+|                 |                     |                 | instance of the |
+|                 |                     |                 | “vmi” on the    |
+|                 |                     |                 | {vm-type}.      |
+|                 |                     |                 | There is no     |
+|                 |                     |                 | index after     |
+|                 |                     |                 | {network_role}  |
+|                 |                     |                 | since since     |
+|                 |                     |                 | {network-role}  |
+|                 |                     |                 | is unque to the |
+|                 |                     |                 | AIC LCP; there  |
+|                 |                     |                 | should only be  |
+|                 |                     |                 | one instance.   |
++-----------------+---------------------+-----------------+-----------------+
+|                 | {vm-type}\_{index}\ | **MUST** - vmi  |                 |
+|                 | _int\               | attached to an  |                 |
+|                 | _{network-role}\    | internal        |                 |
+|                 | _vmi\_{index}       | network         |                 |
++-----------------+---------------------+-----------------+-----------------+
+|                 | {vm-type}\_{index}\ | **MUST** - vmi  |                 |
+|                 | _subint\            | attached to a   |                 |
+|                 | _{network-role}\    | sub-interface   |                 |
+|                 | _vmi\_{index}       | network         |                 |
++-----------------+---------------------+-----------------+-----------------+
+| OS::ContrailV2: | int\_{network-role}\| **MAY**         | VNF Heat        |
+| :VirtualNetwork | _RVN                |                 | Orchestration   |
+|                 |                     |                 | Templates can   |
+|                 |                     |                 | only create     |
+|                 |                     |                 | internal        |
+|                 |                     |                 | networks. There |
+|                 |                     |                 | is no {index}   |
+|                 |                     |                 | because         |
+|                 |                     |                 | {nework-role}   |
+|                 |                     |                 | should be       |
+|                 |                     |                 | unique. Both    |
+|                 |                     |                 | formats are     |
+|                 |                     |                 | valid.          |
++-----------------+---------------------+-----------------+-----------------+
+|                 | int\_{network-role}\| **MAY**         |                 |
+|                 | _network            |                 |                 |
++-----------------+---------------------+-----------------+-----------------+
+
+    Table 3: Example Contrail Heat resource ID
+
+There is a use case where the template filename is used as the type: as
+shown in the example below.  There is no suggested Resource ID naming
+convention for this use case.
+
+Example:  Template Filename used as the type:
+
+.. code-block:: python
+
+  heat_template_version: 2015-04-30
+
+  resources:
+    <Resource ID>:
+      type: file.yaml
+      properties:
+        ...
+
+Resource: OS::Nova::Server - Parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The resource OS::Nova::Server manages the running virtual machine (VM)
+instance within an OpenStack cloud. (See
+https://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Nova::Server.)
+
+Four properties of this resource must follow the ONAP parameter naming
+convention. The four properties are:
+
+1. image
+
+2. flavor
+
+3. name
+
+4. availability\_zone
+
+Requirement R-01455 defines how the ‘{vm-type]’ is defined.
+
+Requirement R-82481 defines how the ‘{vm-type} is used.’
+
+The table below provides a summary. The sections that follow provides
+the detailed requirements.
+
+.. csv-table:: **Table 4 OS::Nova::Server Resource Property Parameter Naming Convention**
+   :header: Property Name,Parameter Type,Parameter Name,Parameter Value Provided to Heat
+   :align: center
+   :widths: auto
+
+   image, string, {vm-type}\_image\_name, Environment File
+   flavor, string, {vm-type}\_flavor\_name, Environment File
+   name, string, {vm-type}\_name\_{index}, ONAP
+   name, CDL, {vm-type}_names, ONAP
+   availability_zone, string, availability\_zone\_{index}, ONAP
+
+Property: image
++++++++++++++++
+
+R-71152 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘image’ parameter **MUST** be declared as
+type: ‘string’.
+
+R-58670 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘image’ parameter name **MUST** follow the
+naming convention ‘{vm-type}_image_name’.
+
+R-91125 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘image’ parameter **MUST** be enumerated in
+the Heat Orchestration Template’s Environment File and a value **MUST** be
+assigned.
+
+R-57282 Each VNF’s Heat Orchestration Template’s ‘{vm-type}’
+**MUST** have a unique parameter name for the ‘OS::Nova::Server’
+property ‘image’ even if more than one {vm-type} shares the same image.
+
+*Example Parameter Definition*
+
+.. code-block:: yaml
+
+ parameters:
+     {vm-type}_image_name:
+         type: string
+         description: {vm-type} server image
+
+Property: flavor
+++++++++++++++++
+
+R-50436 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘flavor’ parameter **MUST** be declared as
+type: ‘string’.
+
+R-45188 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘flavor’ parameter name **MUST** follow the
+naming convention ‘{vm-type}_flavor_name’.
+
+R-69431 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘flavor’ parameter **MUST** be enumerated in the
+Heat Orchestration Template’s Environment File and a value **MUST** be
+assigned.
+
+R-40499 Each VNF’s Heat Orchestration Template’s ‘{vm-type}’ **MUST**
+have a unique parameter name for the ‘OS::Nova::Server’ property
+‘flavor’ even if more than one {vm-type} shares the same flavor.
+
+*Example Parameter Definition*
+
+.. code-block:: yaml
+
+ parameters:
+     {vm-type}_flavor_name:
+         type: string
+         description: {vm-type} flavor
+
+Property: Name
+++++++++++++++
+
+R-51430 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘name’ parameter **MUST** be declared as
+either type ‘string’ or type ‘comma_delimited_list”.
+
+R-54171 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘name’ parameter is defined as a ‘string’,
+the parameter name **MUST** follow the naming convention
+‘{vm-type}\_name\_{index}’, where {index} is a numeric value that starts
+at zero and increments by one.
+
+R-40899 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘name’ parameter is defined as a ‘string’,
+a parameter **MUST** be declared for each ‘OS::Nova::Server’ resource
+associated with the ‘{vm-type}’.
+
+R-87817 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘name’ parameter is defined as a
+‘comma_delimited_list’, the parameter name **MUST** follow the naming
+convention ‘{vm-type}_names’.
+
+R-85800 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘name’ parameter is defined as a
+‘comma_delimited_list’, a parameter **MUST** be delcared once for all
+‘OS::Nova::Server’ resources associated with the ‘{vm-type}’.
+
+R-22838 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘name’ parameter **MUST NOT** be enumerated
+in the Heat Orchestration Template’s Environment File.
+
+If a VNF’s Heat Orchestration Template’s contains more than three
+OS::Nova::Server resources of a given {vm-type}, the comma_delimited_list
+form of the parameter name (i.e., ‘{vm-type}_names’) should be used to
+minimize the number of unique parameters defined in the template.
+
+
+*Example: Parameter Definition*
+
+.. code-block:: python
+
+  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: comma_delimited_list*
+
+In this example, the {vm-type} has been defined as “lb” for load balancer.
+
+.. code-block:: python
+
+  parameters:
+
+    lb_names:
+      type: comma_delimited_list
+      description: VM Names for lb VMs
+
+  resources:
+    lb_server_0:
+      type: OS::Nova::Server
+      properties:
+        name: { get_param: [lb_names, 0] }
+        ...
+
+    lb_server_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:: python
+
+  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_server_0:
+      type: OS::Nova::Server
+      properties:
+        name: { get_param: lb_name_0 }
+        ...
+
+    lb_server_1:
+      type: OS::Nova::Server
+      properties:
+        name: { get_param: lb_name_1 }
+        ...
+
+Contrail Issue with Values for OS::Nova::Server Property Name
+_____________________________________________________________
+
+R-44271 The VNF's Heat Orchestration Template's Resource
+'OS::Nova::Server' property 'name' parameter value **SHOULD NOT**
+contain special characters since the Contrail GUI has a limitation
+displaying special characters.
+
+However, if special characters must be used, the only special characters
+supported are:
+
+--- \" ! $ ' (\ \ ) = ~ ^ | @ ` { } [ ] > , . _
+
+
+Property: availability\_zone
+++++++++++++++++++++++++++++
+
+R-98450 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘availability_zone’ parameter name
+**MUST** follow the naming convention ‘availability\_zone\_{index}’
+where the ‘{index}’ **MUST** start at zero and increment by one.
+
+R-23311 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘availability_zone’ parameter **MUST**
+be declared as type: ‘string’.
+
+The parameter must not be declared as type ‘comma_delimited_list’,
+ONAP does not support it.
+
+R-59568  The VNF’s Heat Orchestration Template’s Resource
+‘OS::Nova::Server’ property ‘availability_zone’ parameter **MUST NOT**
+be enumerated in the Heat Orchestration Template’s Environment File.
+
+Example Parameter Definition
+
+.. code-block:: python
+
+  parameters:
+    availability_zone_{index}:
+      type: string
+      description: availability zone {index} name
+
+Requirement R-90279 states that a VNF Heat Orchestration’s template’s
+parameter MUST be used in a resource with the exception of the parameters
+for the OS::Nova::Server resource property availability_zone.
+
+R-01359 A VNF’s Heat Orchstration Template that contains an
+‘OS::Nova:Server’ Resource **MAY** define a parameter for the property
+‘availability_zone’ that is not utilized in any ‘OS::Nova::Server’
+resources in the Heat Orchestration Template.
+
+Example
++++++++
+
+The example below depicts part of a Heat Orchestration Template that
+uses the four OS::Nova::Server properties discussed in this section.
+
+In the Heat Orchestration Template below, four Virtual
+Machines (OS::Nova::Server) are created: two dns servers with
+{vm-type} set to “dns” and two oam servers with {vm-type} set to “oam”.
+Note that the parameter associated with the property name is a
+comma_delimited_list for dns and a string for oam.
+
+.. code-block:: python
+
+  parameters:
+
+    dns_image_name:
+      type: string
+      description: dns server image
+
+    dns_flavor_name:
+      type: string
+      description: dns server flavor
+
+    dns_names:
+      type: comma_delimited_list
+      description: dns server names
+
+    oam_image_name:
+      type: string
+      description: oam server image
+
+    oam_flavor_name:
+      type: string
+      description: oam server flavor
+
+    oam_name_0:
+      type: string
+      description: oam server name 0
+
+    oam_name_1:
+      type: string
+      description: oam server name 1
+
+    availability_zone_0:
+      type: string
+      description: availability zone ID or Name
+
+    availability_zone_1:
+      type: string
+      description: availability zone ID or Name
+
+  resources:
+
+    dns_server_0:
+      type: OS::Nova::Server
+      properties:
+        name: { get_param: [ dns_names, 0 ] }
+        image: { get_param: dns_image_name }
+        flavor: { get_param: dns_flavor_name }
+        availability_zone: { get_param: availability_zone_0 }
+
+  . . .
+
+      dns_server_1:
+        type: OS::Nova::Server
+        properties:
+          name: { get_param: [ dns_names, 1 ] }
+          image: { get_param: dns_image_name }
+          flavor: { get_param: dns_flavor_name }
+          availability_zone: { get_param: availability_zone_1 }
+
+  . . .
+
+      oam_server_0:
+        type: OS::Nova::Server
+        properties:
+          name: { get_param: oam_name_0 }
+          image: { get_param: oam_image_name }
+          flavor: { get_param: oam_flavor_name }
+          availability_zone: { get_param: availability_zone_0 }
+
+  . . .
+
+      oam_server_1:
+        type: OS::Nova::Server
+        properties:
+          name: { get_param: oam_name_1 }
+          image: { get_param: oam_image_name }
+          flavor: { get_param: oam_flavor_name }
+          availability_zone: { get_param: availability_zone_1 }
+
+  . . .
+
+Boot Options
+++++++++++++
+
+R-99798 A VNF’s Heat Orchestration Template’s Virtual Machine
+(i.e., OS::Nova::Server Resource) **MAY** boot from an image or **MAY**
+boot from a Cinder Volume.
+
+R-83706 When a VNF’s Heat Orchestration Template’s Virtual Machine
+(i.e., ‘OS::Nova::Server’ Resource) boots from an image, the
+‘OS::Nova::Server’ resource property ‘image’ **MUST** be used.
+
+The requirements associated with
+the 'image' property are detailed in `Property: image`_
+
+R-69588 When a VNF’s Heat Orchestration Template’s Virtual Machine
+(i.e., ‘OS::Nova::Server’ Resource) boots from Cinder Volume, the
+‘OS::Nova::Server’ resource property ‘block_device_mapping’ or
+‘block_device_mapping_v2’ **MUST** be used.
+
+There are currently no heat guidelines
+associated with these two properties:
+'block_device_mapping' and 'block_device_mapping_v2'.
+
+Resource: OS::Nova::Server – Metadata Parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The OS::Nova::Server Resource property metadata is an optional
+OpenStack property.
+The table below summarizes the mandatory and optional metadata
+supported by ONAP.
+
+The sections that follow provides the requirements associated with each
+metadata parameter.
+
+.. csv-table:: **Table 5 OS::Nova::Server Mandatory and Optional Metadata**
+   :header: Metadata Parameter Name, Parameter Type, Required, Parameter Value Provided to Heat
+   :align: center
+   :widths: auto
+
+   vnf_id, string, **MUST**, ONAP
+   vf_module_id, string, **MUST**, ONAP
+   vnf_name, string, **MUST**, ONAP
+   vf_module_name, string, **SHOULD**, ONAP
+   vm_role, string, **MAY**, YAML or Environment File
+   vf_module_index, string, **MAY**, ONAP
+   workload_context, string, **SHOULD**, ONAP
+   environment_context, string, **SHOULD**, ONAP
+
+vnf\_id
++++++++
+
+The OS::Nova::Server Resource metadata map value parameter 'vnf_id'
+is an ONAP generated UUID that identifies the VNF.  The value
+is provided by ONAP to the VNF's Heat Orchestration
+Template at orchestration time.
+
+R-37437 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **MUST** contain the metadata map value parameter ‘vnf_id’.
+
+R-07507 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_id’ **MUST** be declared
+as type: ‘string’.
+
+R-55218 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_id’ **MUST NOT** have
+parameter contraints defined.
+
+R-20856 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_id’ **MUST NOT** be
+enumerated in the Heat Orchestration Template’s environment file.
+
+R-44491 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_id’ is passed into a
+Nested YAML file, the parameter name ‘vnf_id’ **MUST NOT** change.
+
+
+*Example 'vnf_id' Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    vnf_id:
+      type: string
+      description: Unique ID for this VNF instance
+
+vf\_module\_id
+++++++++++++++
+
+The OS::Nova::Server Resource metadata map value parameter 'vf\_module\_id'
+is an ONAP generated UUID that identifies the VF Module (e.g., Heat
+Orchestration Template).  The value
+is provided by ONAP to the VNF's Heat Orchestration
+Template at orchestration time.
+
+R-71493 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **MUST** contain the metadata map value parameter
+‘vf\_module\_id’.
+
+R-82134 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_id’ **MUST**
+be declared as type: ‘string’.
+
+R-98374 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_id’ **MUST NOT**
+have parameter contraints defined.
+
+R-72871 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_id’ **MUST NOT**
+be enumerated in the Heat Orchestration Template’s environment file.
+
+R-86237 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf_module_id’ is passed
+into a Nested YAML file, the parameter name ‘vf\_module\_id’
+**MUST NOT** change.
+
+*Example 'vf\_module\_id' Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    vnf_module_id:
+      type: string
+      description: Unique ID for this VNF module instance
+
+
+vnf\_name
++++++++++
+
+The OS::Nova::Server Resource metadata map value parameter 'vnf_name'
+is the ONAP generated alphanumeric name of the deployed VNF instance.
+The value
+is provided by ONAP to the VNF's Heat Orchestration
+Template at orchestration time.
+The parameter must be declared as type: string
+
+R-72483 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **MUST** contain the metadata map value parameter
+‘vnf_name’.
+
+R-62428 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_name’ **MUST** be
+declared as type: ‘string’.
+
+R-44318 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_name’ **MUST NOT** have
+parameter contraints defined.
+
+R-36542 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_name’ **MUST NOT** be
+enumerated in the Heat Orchestration Template’s environment file.
+
+R-16576 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_name’ is passed into a
+Nested YAML file, the parameter name ‘vnf_name’ **MUST NOT** change.
+
+*Example 'vnf_name' Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    vnf_name:
+      type: string
+      description: Unique name for this VNF instance
+
+vf\_module\_name
+++++++++++++++++
+
+The OS::Nova::Server Resource metadata map value parameter 'vf_module_name'
+is the deployment name of the heat stack created (e.g., <STACK_NAME>) from the
+VNF's Heat Orchestration template
+in the command 'Heat stack-create'
+(e.g., 'Heat stack-create [-f <FILE>] [-e <FILE>] <STACK_NAME>').
+The 'vf_module_name' (e.g., <STACK_NAME> is specified as
+part of the orchestration process.
+
+R-68023 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **SHOULD** contain the metadata map value parameter
+‘vf\_module\_name’.
+
+R-39067 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_name’ **MUST**
+be declared as type: ‘string’.
+
+R-15480 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_name’
+**MUST NOT** have parameter contraints defined.
+
+R-80374 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_name’
+**MUST NOT** be enumerated in the Heat Orchestration Template’s
+environment file.
+
+R-49177 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_name’ is passed
+into a Nested YAML file, the parameter name ‘vf\_module\_name’
+**MUST NOT** change.
+
+*Example 'vf_module_name' Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    vf_module_name:
+      type: string
+      description: Unique name for this VNF Module instance
+
+vm\_role
+++++++++
+
+The OS::Nova::Server Resource metadata map value parameter 'vm-role'
+is a metadata tag that describes the role of the Virtual Machine.
+The 'vm_role' is stored in ONAP's A&AI module and is
+available for use by other ONAP components and/or north bound systems.
+
+R-85328 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **MAY** contain the metadata map value parameter ‘vm_role’.
+
+R-95430 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vm_role’ **MUST** be
+declared as type: ‘string’.
+
+R-67597 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vm_role’ **MUST NOT** have
+parameter contraints defined.
+
+R-46823 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vnf_name’ **MUST** be
+either
+
+ - enumerated in the VNF’s Heat Orchestration
+   Template’s environment file.
+
+ - hard coded in the VNF’s Heat Orchestration
+   Template’s OS::Nova::Resource metadata property.
+
+Defining the 'vm_role' as the '{vm-type}' is a recommended convention
+
+R-86476 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vm_role’ value **MUST only**
+contain alphanumeric characters and underscores ‘_’.
+
+R-70757 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vm_role’ is passed into a
+Nested YAML file, the parameter name ‘vm_role’ **MUST NOT** change.
+
+
+*Example 'vm_role' Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    vm_role:
+      type: string
+      description: Unique role for this VM
+
+*Example: 'vm-role' Definition: Hard Coded in
+OS::Nova::Resource metadata property*
+
+.. code-block:: python
+
+  resources:
+
+    dns_server_0
+      type: OS::Nova::Server
+      properties:
+        . . . .
+        metadata:
+          vm_role: dns
+
+*Example 'vm-role' Definition: Defined in Environment file
+and retrieved via 'get_param'*
+
+.. code-block:: python
+
+  resources:
+
+    dns_server_0:
+      type: OS::Nova::Server
+      properties:
+        . . . .
+        metadata:
+          vm_role: { get_param: vm_role }
+
+Example vnf_id, vf_module_id, vnf_name, vf_module_name, vm_role
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+The example below depicts part of a Heat Orchestration Template
+that uses the five of the OS::Nova::Server metadata parameter
+discussed in this section. The {vm-type} has been defined as lb
+for load balancer.
+
+.. code-block:: python
+
+  parameters:
+    lb_name_0
+      type: string
+      description: VM Name for lb VM 0
+    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
+    vm_role:
+      type: string
+      description: Unique role for this VM
+  resources:
+    lb_server_0:
+      type: OS::Nova::Server
+      properties:
+        name: { get_param: lb_name_0 }
+        ...
+        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 }
+          vm_role: lb
+
+vf\_module\_index
++++++++++++++++++
+
+R-50816 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **MAY** contain the metadata map value parameter
+‘vf\_module\_index’.
+
+R-54340 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_index’ **MUST** be
+declared as type: ‘number’.
+
+R-09811 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_index’ **MUST NOT**
+have parameter contraints defined.
+
+R-37039 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_index’ **MUST NOT**
+be enumerated in the Heat Orchestration Template’s environment file.
+
+R-22441 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_index’ is passed
+into a Nested YAML file, the parameter name ‘vf\_module\_index’
+**MUST NOT** change.
+
+R-55306 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘vf\_module\_index’ **MUST NOT** be
+used in a VNF’s Volume Template; it is not supported.
+
+The vf_module_index parameter indicates which instance of the module is being
+deployed into the VNF.
+This parameter may be used in cases where multiple instances of the same
+incremental module may be instantiated for scaling purposes. The index
+can be used in the Heat Orchestration Template for indexing into a
+pseudo-constant array parameter when unique values are required for each
+module instance, e.g., for fixed private IP addresses on VM types.
+
+The vf_module_index will start at 0 for the first instance of a module
+type. Subsequent instances of the same module type will receive the
+lowest unused index. This means that indexes will be reused if a module
+is deleted and re-added. As an example, if three copies of a module are
+deployed with vf_module_index values of 0, 1, and 2 then subsequently
+the second one is deleted (index 1), and then re-added, index 1 will be
+reused.
+
+*Example*
+
+In this example, the {vm-type} has been defined as oam_vm to represent
+an OAM VM. An incremental heat module is used to deploy the OAM VM. The
+OAM VM attaches to an internal control network which has a
+{network-role} of ctrl. A maximum of four OAM VMs can be deployed. The
+environment file contains the four IP addresses that each successive OAM
+VM will be assigned. The vf_module_index is used as the index to
+determine the IP assignment.
+
+Environment File
+
+.. code-block:: python
+
+  parameters:
+    oam_vm_int_ctrl_ips: 10.10.10.1,10.10.10.2,10.10.10.3,10.10.10.4
+
+YAML File
+
+.. code-block:: python
+
+  parameters:
+    vf_module_index:
+      type: number
+      description: Unique index for this VNF Module instance
+    oam_vm_name_0:
+      type: string
+      description: VM Name for lb VM 0
+    int_ctrl_net_id:
+      type: string
+      description: Neutron UUID for the internal control network
+    oam_vm_int_ctrl_ips:
+      type: comma_delimited_list
+      description: Fixed IP assignments for oam VMs on the internal control
+      network
+  resources:
+    oam_vm_server_0:
+      type: OS::Nova::Server
+      properties:
+        name: { get_param: oam_vm_name_0 }
+        networks:
+          - port: { get_resource: oam_vm_0_int_ctrl_port_0 }
+        . . .
+        metadata:
+          vf_module_index: { get_param: vf_module_index }
+    oam_vm_0_int_ctrl_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: int_ctrl_net_id }
+        fixed_ips: [ { “ip_address”: {get_param: [ oam_vm_int_ctrl_ips, { get_param, vf_module_index]}}}]
+
+workload_context
+++++++++++++++++
+
+R-47061 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **SHOULD** contain the metadata map value parameter
+‘workload_context’.
+
+R-74978 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘workload_context’ **MUST** be
+declared as type: ‘string’.
+
+R-34055 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘workload_context’ **MUST NOT**
+have parameter contraints defined.
+
+R-02691 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘workload_context’ **MUST NOT**
+be enumerated in the Heat Orchestration Template’s environment file.
+
+R-75202 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘workload_context’ is passed
+into a Nested YAML file, the parameter name ‘workload_context’
+**MUST NOT** change.
+
+The 'workload_context' parameter value will be chosen by the Service Model
+Distribution context client in VID and will be supplied to the
+Heat Orchestration Template by ONAP at orchestration time.
+
+*Example Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+    workload_context:
+      type: string
+      description: Workload Context for this VNF instance
+
+
+*Example OS::Nova::Server with metadata*
+
+.. code-block:: python
+
+  resources:
+    . . .
+
+    {vm-type}_server_{index}:
+       type: OS::Nova::Server
+       properties:
+         name:
+         flavor:
+         image:
+        ...
+       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 }
+          workload_context: {get_param: workload_context}
+
+environment_context
++++++++++++++++++++
+
+R-88536 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource **SHOULD** contain the metadata map value parameter
+‘environment_context’.
+
+R-20308 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘environment_context’ **MUST**
+be declared as type: ‘string’.
+
+R-56183 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘environment_context’ **MUST NOT**
+have parameter contraints defined.
+
+R-13194 A VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘environment_context’ **MUST NOT**
+be enumerated in the Heat Orchestration Template’s environment file.
+
+R-62954 If a VNF’s Heat Orchestration Template’s OS::Nova::Server
+Resource metadata map value parameter ‘environment_context’ is
+passed into a Nested YAML file, the parameter name
+‘environment_context’ **MUST NOT** change.
+
+The 'environment_context' parameter value will be defined by the
+service designer as part of the service model during the SDC
+on-boarding process and will be supplied to the Heat Orchestration
+Template by ONAP at orchestration time.
+
+
+*Example Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+    environment_context:
+      type: string
+      description: Environment Context for this VNF instance
+
+
+*Example OS::Nova::Server with metadata*
+
+.. code-block:: python
+
+  resources:
+    . . .
+
+    {vm-type}_server_{index}:
+       type: OS::Nova::Server
+       properties:
+         name:
+         flavor:
+         image:
+        ...
+       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 }
+          workload_context: {get_param: workload_context}
+          environment_context: {get_param: environment_context }
+
+
+Resource: OS::Neutron::Port - Parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The resource OS::Neutron::Port is for managing Neutron ports (See
+https://docs.openstack.org/developer/heat/template_guide/openstack.html#OS::Neutron::Port.)
+
+Introduction
+++++++++++++
+
+Four properties of the resource OS::Neutron::Port that must follow the
+ONAP parameter naming convention. The four properties are:
+
+1. network
+2. fixed_ips, ip_address
+3. fixed_ips, subnet_id or fixed_ips, subnet
+
+ * Note that in many examples in this document fixed_ips, subnet_id is used.
+
+4. allowed_address_pairs, ip_address
+
+Below is a generic example. Note that for some parameters
+comma_delimited_list are supported in addition to String.
+
+.. code-block:: python
+
+  resources:
+
+  ...
+
+  <resource ID>:
+    type: OS::Neutron::Port
+    properties:
+      allowed_address_pairs: [{"ip_address": String, "mac_address": String},
+      {"ip_address": String, "mac_address": String}, ...]
+      fixed_ips: [{"ip_address": String, "subnet_id": String, "subnet":
+      String}, {"ip_address": String, "subnet_id": String, "subnet": String},
+      ...]
+      network: String
+
+The parameters associated with these properties may reference an
+external network or internal network. External networks and internal
+networks are defined in `Networking`_.
+
+When the OS::Neutron::Port is attaching to an external network, all
+property values are parameters that are retrieved via the intrinsic
+function 'get_param'.
+
+When the OS::Neutron::Port is attaching to an internal network, a
+property value maybe retrieved via the intrinsic
+function 'get_param', 'get_resource', or 'get_attr'.
+
+This will be described in the forth coming sections.
+
+Items to Note
+_____________
+
+A network (internal or external) may contain one or or more subnets.
+
+A VNF can have one or more ports connected to the same network.
+
+A port can have one or more IP addresses assigned.
+
+The IP address assignments can be IPv4 addresses and/or IPv6 addresses.
+
+The IP addresses assignments for a unique external network **MUST**
+be all Cloud Assigned addresses OR **MUST** be all ONAP
+SDN-C assigned IP addresses.
+
+If the IP addresses are Cloud Assigned, all the IPv4 Addresses **MUST**
+be from
+the same subnet and all the IPv6 Addresses **MUST** be from the
+same subnet.
+
+If the IP addresses are ONAP SDN-C assigned,
+the IPv4 Addresses **MAY**
+be from
+different subnets and the IPv6 Addresses **MAY** be from different
+subnets.
+
+If a VNF's Port is attached to an external network the IP addresses **MAY**
+either be assigned by
+
+ 1. ONAP's SDN-Controller (SDN-C)
+ 2. Cloud Assigned by OpenStack’s DHCP Service
+
+If a VNF's Port is attached to an external network and the port's IP addresses
+are assigned by ONAP's SDN-Controller, the 'OS::Neutron::Port' Resource's
+
+ * property 'fixed_ips' map property 'ip_address' **MUST** be used
+ * property 'fixed_ips' map property 'subnet'/'subnet_id' **MUST NOT** be used
+
+If a VNF's Port is attached to an external network and the port's IP addresses
+are Cloud Assigned by OpenStack’s DHCP Service,
+the 'OS::Neutron::Port' Resource's
+
+ * property 'fixed_ips' map property 'ip_address' **MUST NOT** be used
+ * property fixed_ips' map property 'subnet'/'subnet_id' **MAY** be used
+
+If a VNF's Port is attached to an internal network and the port's IP addresses
+are assigned by the VNF's Heat Orchestration Template
+(i.e., enumerated in the Heat Orchestration Template's environment file),
+the 'OS::Neutron::Port' Resource's
+
+ * property 'fixed_ips' map property 'ip_address' **MUST** be used
+ * property 'fixed_ips' map property 'subnet'/'subnet_id'
+   **MUST NOT** be used
+
+If a VNF's Port is attached to an internal network and the port's IP addresses
+are Cloud Assigned by OpenStack’s DHCP Service,
+the 'OS::Neutron::Port' Resource's
+
+ * property 'fixed_ips' map property 'ip_address' **MUST NOT** be used
+ * property 'fixed_ips' map property 'subnet'/'subnet_id' **MAY** be used
+
+If a VNF's Heat Orchestration Template 'OS::Neutron::Port' Resource property
+'fixed_ips' map property 'ip_address' is specified, then the
+'fixed_ips' map property 'subnet'/'subnet_id' **MUST NOT**
+be specified.
+
+If a VNF's Heat Orchestration Template 'OS::Neutron::Port' Resource property
+'fixed_ips' map property 'subnet'/'subnet_id' is specified, then the
+'fixed_ips' map property 'ip_address' **MUST NOT**
+be specified.
+
+.. csv-table:: **Table 4 OS::Nova::Server Resource Property Parameter Naming Convention**
+   :header: Resource,Property,Parameter Type,Parameter Name,Parameter Value Provided to Heat
+   :align: center
+   :widths: auto
+
+   OS::Nova::Server, image, string, {vm-type}_image_name, Environment File
+
+Property: network
++++++++++++++++++
+
+The Resource 'OS::Neutron::Port' property 'network' determines what network
+the port is attached to.
+
+
+R-18008 The VNF’s Heat Orchestration Template’s Resource ‘OS::Neutron::Port’
+property ‘network’ parameter **MUST** be declared as type: ‘string’.
+
+R-62983 When the VNF’s Heat Orchestration Template’s
+Resource ‘OS::Neutron::Port’ is attaching to an external network,
+the ‘network’ parameter name **MUST**
+
+- follow the naming convention ‘{network-role}_net_id’ if the Neutron
+  network UUID value is used to reference the network
+- follow the naming convention ‘{network-role}_net_name’ if the OpenStack
+  network name is used to reference the network.
+
+where ‘{network-role}’ is the network-role of the external network and
+a ‘get_param’ **MUST** be used as the intrinsic function.
+
+R-86182 When the VNF’s Heat Orchestration Template’s
+Resource ‘OS::Neutron::Port’ is attaching to an internal network,
+and the internal network is created in a different
+Heat Orchestration Template than the ‘OS::Neutron::Port’, the ‘network’
+parameter name **MUST**
+
+- follow the naming convention ‘int\_{network-role}_net_id’ if the Neutron
+  network UUID value is used to reference the network
+- follow the naming convention ‘int\_{network-role}_net_name’ if the
+  OpenStack network name in is used to reference the network.
+
+where ‘{network-role}’ is the network-role of the internal network
+and a ‘get_param’ **MUST** be used as the intrinsic function.
+
+In Requirement R-86182, the internal network is created in the VNF's
+Base Module (Heat Orchestration Template) and the parameter name is
+declared in the Base Module's outputs' section.
+The output parameter name will be declared as a parameter in the
+'parameters' section of the incremental module.
+
+R-93177 When the VNF’s Heat Orchestration Template’s
+Resource ‘OS::Neutron::Port’ is attaching to an internal
+network, and the internal network is created in the same Heat
+Orchestration Template than the ‘OS::Neutron::Port’, the ‘network’
+parameter name **MUST** obtain the UUID of the internal network
+by using the intrinsic function ‘get_resource’ or ‘get_attr’
+and referencing the Resource ID of the internal network.
+
+R-29872 The VNF’s Heat Orchestration Template’s Resource ‘OS::Nova::Server’
+property ‘network’ parameter **MUST NOT** be enumerated in the Heat
+Orchestration Template’s Environment File.
+
+The parameter values for external networks are provided by ONAP
+to the VNF's Heat Orchestration Template at orchestration time.
+
+The parameter values for internal networks created in the VNF's Base Module
+Heat Orchestration Template
+are provided to the VNF's Incremental Module Heat Orchestration Template
+at orchestration time.
+
+*Example Parameter Definition of External Networks*
+
+.. code-block:: python
+
+  parameters:
+
+    {network-role}_net_id:
+      type: string
+      description: Neutron UUID for the external {network-role} network
+
+    {network-role}_net_name:
+      type: string
+      description: Neutron name for the external {network-role} network
+
+
+*Example Parameter Definition of Internal Networks in an Incremental Module*
+
+.. code-block:: python
+
+  parameters:
+
+    int_{network-role}_net_id:
+      type: string
+      description: Neutron UUID for the internal int_{network-role} network
+
+    int_{network-role}_net_name:
+      type: string
+      description: Neutron name for the internal int_{network-role} network
+
+Property: fixed_ips, Map Property: ip_address
++++++++++++++++++++++++++++++++++++++++++++++
+
+The resource 'OS::Neutron::Port' property 'fixed_ips'
+map property 'ip_address'
+is used to assign one IPv4 or IPv6
+addresses to port.
+
+One 'OS::Neutron::Port' resource may assign one or more
+IPv4 and/or IPv6 addresses.
+
+R-34037 The VNF’s Heat Orchestration Template’s resource ‘OS::Neutron::Port’
+property ‘fixed_ips’ map property ‘ip_address’ parameter **MUST**
+be declared as either type ‘string’ or type ‘comma_delimited_list’.
+
+R-40971 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ is attaching to an external network, and an IPv4 address is
+assigned using the property
+‘fixed_ips’ map property ‘ip_address’ and the parameter type is defined
+as a string, the parameter name **MUST** follow the naming
+convention ‘{vm-type}_{network-role}\_ip\_{index}’, where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the external network
+- the value for {index} must start at zero (0) and increment by one
+
+R-39841 The VNF’s Heat Orchestration Template’s Resource ‘OS::Neutron::Port’
+property ‘fixed_ips’ map property ‘ip_address’ parameter
+‘{vm-type}_{network-role}\_ip\_{index}’ **MUST NOT** be enumerated in the
+VNF’s Heat Orchestration Template’s Environment File.
+
+ONAP's SDN-Controller assigns the IP Address and ONAP provides
+the value at orchestration to the Heat Orchestration Template.
+
+*Example External Network IPv4 Address string Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_{network-role}_ip_{index}:
+      type: string
+      description: Fixed IPv4 assignment for {vm-type} VM {index} on the{network-role} network
+
+R-04697 When the VNF’s Heat Orchestration Template’s
+Resource ‘OS::Neutron::Port’ is attaching to an external
+network, and an IPv4 address is assigned using the property
+‘fixed_ips’ map property ‘ip_address’ and the parameter type
+is defined as a comma_delimited_list, the parameter name **MUST**
+follow the naming convention ‘{vm-type}_{network-role}_ips’,
+where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the external network
+
+R-98905 The VNF’s Heat Orchestration Template’s Resource ‘OS::Neutron::Port’
+property ‘fixed_ips’ map property ‘ip_address’ parameter
+‘{vm-type}_{network-role}_ips’ **MUST NOT** be enumerated in the VNF’s
+Heat Orchestration Template’s Environment File.
+
+ONAP's SDN-Controller assigns the IP Address and ONAP provides
+the value at orchestration to the Heat Orchestration Template.
+
+*Example External Network IPv4 Address comma_delimited_list
+Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_{network-role}_ips:
+      type: comma_delimited_list
+      description: Fixed IPv4 assignments for {vm-type} VMs on the {network-role} network
+
+R-71577 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ is attaching to an external network, and an IPv6 address
+is assigned using the property ‘fixed_ips’ map property ‘ip_address’ and
+the parameter type is defined as a string, the parameter name **MUST** follow
+the naming convention ‘{vm-type}_{network-role}\_v6\_ip\_{index}’, where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the external network
+- the value for {index} must start at zero (0) and increment by one
+
+
+R-87123 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter ‘{vm-type}_{network-role}\_v6\_ip\_{index}’
+**MUST NOT** be enumerated in the VNF’s Heat Orchestration
+Template’s Environment File.
+
+ONAP's SDN-Controller assigns the IP Address and ONAP provides
+the value at orchestration to the Heat Orchestration Template.
+
+*Example External Network IPv6 Address string Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_{network-role}_v6_ip_{index}:
+      type: string
+      description: Fixed IPv6 assignment for {vm-type} VM {index} on the {network-role} network
+
+R-23503 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ is attaching to an external network, and an IPv6
+address is assigned using the property ‘fixed_ips’ map property ‘ip_address’
+and the parameter type is defined as a comma_delimited_list, the parameter
+name **MUST** follow the naming convention
+‘{vm-type}_{network-role}_v6_ips’, where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the external network
+
+R-93030 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter ‘{vm-type}_{network-role}_v6_ips’ **MUST NOT** be enumerated in the
+VNF’s Heat Orchestration Template’s Environment File.
+
+ONAP's SDN-Controller assigns the IP Address and ECOMP provides
+the value at orchestration to the Heat Orchestration Template.
+
+*Example External Network IPv6 Address comma_delimited_list Parameter
+Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_{network-role}_v6_ips:
+      type: comma_delimited_list
+      description: Fixed IPv6 assignments for {vm-type} VMs on the {network-role} network
+
+R-78380 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ is attaching to an internal network, and an IPv4 address
+is assigned using the property ‘fixed_ips’ map property ‘ip_address’ and
+the parameter type is defined as a string, the parameter name **MUST** follow
+the naming convention ‘{vm-type}\_int\_{network-role}\_ip\_{index}’, where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the internal network
+- the value for {index} must start at zero (0) and increment by one
+
+R-28795 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter ‘{vm-type}\_int\_{network-role}\_ip\_{index}’ **MUST** be enumerated
+in the VNF’s Heat Orchestration Template’s Environment File.
+
+The IP address is local to the VNF's internal network and is (re)used
+in every VNF spin up, thus the constant value is declared in the VNF's
+Heat Orchestration Template's Environment File.
+
+*Example Internal Network IPv4 Address string Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_int_{network-role}_ip_{index}:
+      type: string
+      description: Fixed IPv4 assignment for {vm-type} VM {index} on the int_{network-role} network
+
+R-85235 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ is attaching to an internal network, and an IPv4
+address is assigned using the property ‘fixed_ips’ map property ‘ip_address’
+and the parameter type is defined as a comma_delimited_list, the parameter
+name **MUST** follow the naming convention
+‘{vm-type}\_int\_{network-role}_ips’, where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the internal network
+
+R-90206 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter ‘{vm-type}\_int\_{network-role}_int_ips’ **MUST** be enumerated in
+the VNF’s Heat Orchestration Template’s Environment File.
+
+The IP address is local to the VNF's internal network and is (re)used
+in every VNF spin up, thus the constant value is declared in the VNF's
+Heat Orchestration Template's Environment File.
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_int_{network-role}_ips:
+      type: comma_delimited_list
+      description: Fixed IPv4 assignments for {vm-type} VMs on the int_{network-role} network
+
+R-27818 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ is attaching to an internal network, and an IPv6 address
+is assigned using the property ‘fixed_ips’ map property ‘ip_address’ and
+the parameter type is defined as a string, the parameter name **MUST** follow
+the naming convention ‘{vm-type}\_int\_{network-role}\_v6\_ip\_{index}’, where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the internal network
+- the value for {index} must start at zero (0) and increment by one
+
+R-97201 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter ‘{vm-type}\_int\_{network-role}\_v6\_ip\_{index}’
+**MUST** be enumerated in the VNF’s Heat Orchestration
+Template’s Environment File.
+
+The IP address is local to the VNF's internal network and is (re)used
+in every VNF spin up, thus the constant value is declared in the VNF's
+Heat Orchestration Template's Environment File.
+
+*Example Internal Network IPv6 Address string Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_int_{network-role}_v6_ip_{index}:
+      type: string
+      description: Fixed IPv6 assignment for {vm-type} VM {index} on the int_{network-role} network
+
+R-29765 When the VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ is attaching to an internal network, and an IPv6
+address is assigned using the property ‘fixed_ips’ map property ‘ip_address’
+and the parameter type is defined as a comma_delimited_list, the parameter
+name **MUST** follow the naming convention
+‘{vm-type}\_int\_{network-role}_v6_ips’, where
+
+- ‘{vm-type}’ is the {vm-type} associated with the OS::Nova::Server
+- ‘{network-role}’ is the {network-role} of the internal network
+
+*Example Internal Network IPv6 Address comma_delimited_list Parameter
+Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {vm-type}_int_{network-role}_v6_ips:
+      type: comma_delimited_list
+      description: Fixed IPv6 assignments for {vm-type} VMs on the int_{network-role} network
+
+R-98569 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter ‘{vm-type}\_int\_{network-role}_v6_ips’ **MUST** be enumerated in
+the VNF’s Heat Orchestration Template’s Environment File.
+
+The IP address is local to the VNF's internal network and is (re)used
+in every VNF spin up, thus the constant value is declared in the VNF's
+Heat Orchestration Template's Environment File.
+
+R-62590 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter associated with an external network, i.e.,
+
+- {vm-type}_{network-role}\_ip\_{index}
+- {vm-type}_{network-role}\_ip\_v6\_{index}
+- {vm-type}_{network-role}_ips
+- {vm-type}_{network-role}_v6_ips
+
+**MUST NOT** be enumerated in the Heat Orchestration Template’s
+Environment File. ONAP provides the IP address assignments at
+orchestration time.
+
+R-93496 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property ‘ip_address’
+parameter associated with an internal network, i.e.,
+
+- {vm-type}\_int\_{network-role}\_ip\_{index}
+- {vm-type}\_int\_{network-role}\_ip\_v6\_{index}
+- {vm-type}\_int\_{network-role}_ips
+- {vm-type}\_int\_{network-role}_v6_ips
+
+**MUST** be enumerated in the Heat Orchestration Template’s Environment
+File and IP addresses **MUST** be assigned.
+
+Summary Table
+_____________
+
+.. csv-table:: **Table # OS::Neutron::Port Property fixed_ips map property ip_address Parameter Naming Convention**
+   :header: Resource,Property,Map Property,Network Type,IP Address,Parameter Type,Parameter Name, Environment File
+   :align: center
+   :widths: auto
+
+   OS::Neutron::Port, fixed_ips, ip_address, external, IPv4, string, {vm-type}\_{network-role}\_ip\_{index}, NO
+   OS::Neutron::Port, fixed_ips, ip_address, external, IPv4, comma\_delimited\_list, {vm-type}\_{network-role}\_ips, NO
+   OS::Neutron::Port, fixed_ips, ip_address, external, IPv6, string, {vm-type}\_{network-role}\_v6\_ip\_{index}, NO
+   OS::Neutron::Port, fixed_ips, ip_address, external, IPv6, comma\_delimited\_list, {vm-type}\_{network-role}\_v6\_ips, NO
+   OS::Neutron::Port, fixed_ips, ip_address, internal, IPv4, string, {vm-type}\_int\_{network-role}\_ip\_{index}, YES
+   OS::Neutron::Port, fixed_ips, ip_address, internal, IPv4, comma\_delimited\_list, {vm-type}\_int\_{network-role}\_ips, YES
+   OS::Neutron::Port, fixed_ips, ip_address, internal, IPv6, string, {vm-type}\_int\_{network-role}\_v6\_ip\_{index}, YES
+   OS::Neutron::Port, fixed_ips, ip_address, internal, IPv6, comma\_delimited\_list, {vm-type}\_int\_{network-role}\_v6\_ips, YES
+
+
+Examples
+________
+
+*Example: comma_delimited_list parameters for IPv4 and IPv6 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:: python
+
+  parameters:
+    oam_net_id:
+      type: string
+      description: Neutron UUID for a oam network
+    db_oam_ips:
+      type: comma_delimited_list
+      description: Fixed IPv4 assignments for db VMs on the oam network
+    db_oam_v6_ips:
+      type: comma_delimited_list
+      description: Fixed IPv6 assignments for db VMs on the oam network
+  resources:
+    db_0_oam_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: oam_net_id }
+        fixed_ips: [ { “ip_address”: {get_param: [ db_oam_ips, 0 ]}}, {
+        “ip_address”: {get_param: [ db_oam_v6_ips, 0 ]}}]
+    db_1_oam_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: oam_net_id }
+        fixed_ips:
+          - “ip_address”: {get_param: [ db_oam_ips, 1 ]}
+          - “ip_address”: {get_param: [ db_oam_v6_ips, 1 ]}
+
+*Example: string parameters for IPv4 and IPv6 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:: python
+
+  parameters:
+    oam_net_id:
+      type: string
+      description: Neutron UUID for an OAM network
+    db_oam_ip_0:
+      type: string
+      description: Fixed IPv4 assignment for db VM 0 on the OAM network
+    db_oam_ip_1:
+      type: string
+      description: Fixed IPv4 assignment for db VM 1 on the OAM network
+    db_oam_v6_ip_0:
+      type: string
+      description: Fixed IPv6 assignment for db VM 0 on the OAM network
+    db_oam_v6_ip_1:
+      type: string
+      description: Fixed IPv6 assignment for db VM 1 on the OAM network
+  resources:
+    db_0_oam_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: oam_net_id }
+        fixed_ips: [ { “ip_address”: {get_param: db_oam_ip_0}}, { “ip_address”: {get_param: db_oam_v6_ip_0 ]}}]
+    db_1_oam_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: oam_net_id }
+        fixed_ips:
+          - “ip_address”: {get_param: db_oam_ip_1}}]
+          - “ip_address”: {get_param: db_oam_v6_ip_1}}]
+
+
+*Example: comma_delimited_list parameters for IPv4 and IPv6 Address
+Assignments to an internal network*
+
+In this example, the '{network-role}' has been defined as 'ctrl' to
+represent an ctrl network internal to the vnf.
+The '{vm-type}' has been defined as 'db' for
+database.
+
+.. code-block:: python
+
+  parameters:
+    int_ctrl_net_id:
+      type: string
+      description: Neutron UUID for the ctrl internal network
+    db_int_ctrl_ips:
+      type: comma_delimited_list
+      description: Fixed IPv4 assignments for db VMs on the ctrl internal
+      network
+    db_int_ctrl_v6_ips:
+      type: comma_delimited_list
+      description: Fixed IPv6 assignments for db VMs on the ctrl internal
+      network
+  resources:
+    db_0_int_ctrl_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: int_ctrl_net_id }
+        fixed_ips: [ { “ip_address”: {get_param: [ db_int_ctrl_ips, 0 ]}}, {
+        “ip_address”: {get_param: [ db_int_ctrl_v6_ips, 0 ]}}]
+    db_1_int_ctrl_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: int_ctrl_net_id }
+        fixed_ips:
+        - “ip_address”: {get_param: [ db_int_ctrl_ips, 1 ]}
+        - “ip_address”: {get_param: [ db_int_ctrl_v6_ips, 1 ]}
+
+
+*Example: string parameters for IPv4 and IPv6 Address Assignments to an
+internal network*
+
+In this example, the int\_{network-role} has been defined as
+int_ctrl to represent a control network internal to the vnf.
+The {vm-type} has been defined as db for database.
+
+.. code-block:: python
+
+  parameters:
+    int_ctrl_net_id:
+      type: string
+      description: Neutron UUID for an OAM internal network
+    db_int_ctrl_ip_0:
+      type: string
+      description: Fixed IPv4 assignment for db VM on the oam_int network
+    db_int_ctrl_ip_1:
+      type: string
+      description: Fixed IPv4 assignment for db VM 1 on the oam_int network
+    db_int_ctrl_v6_ip_0:
+      type: string
+      description: Fixed IPv6 assignment for db VM 0 on the oam_int network
+    db_int_ctrl_v6_ip_1:
+      type: string
+      description: Fixed IPv6 assignment for db VM 1 on the oam_int network
+  resources:
+    db_0_int_ctrl_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: int_oam_int_net_id }
+        fixed_ips: [ { “ip_address”: {get_param: db_oam_int_ip_0}}, {
+        “ip_address”: {get_param: db_oam_int_v6_ip_0 ]}}]
+    db_1_int_ctrl_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: int_oam_int_net_id }
+        fixed_ips:
+          - “ip_address”: {get_param: db_oam_int_ip_1}}]
+          - “ip_address”: {get_param: db_oam_int_v6_ip_1}}]
+
+
+Property: fixed\_ips, Map Property: subnet\_id
+++++++++++++++++++++++++++++++++++++++++++++++
+
+The resource 'OS::Neutron::Port' property 'fixed_ips' map
+property 'subnet'/'subnet_id' is used when a
+port is requesting an IP assignment via
+OpenStack’s DHCP Service (i.e., Cloud Assigned).
+
+The IP address assignment will be made from the specified subnet.
+
+Specifying the subnet is not required; it is optional.
+
+If the network (external or internal) that the port is attaching
+to only contains one subnet, specifying the subnet is
+superfluous.  The IP address will be assigned from the one existing
+subnet.
+
+If the network (external or internal) that the port is attaching
+to contains two or more subnets, specifying the subnet in the
+'fixed_ips' map property 'subnet'/'subnet_id' determines which
+subnet the IP address will be assigned from.
+
+If the network (external or internal) that the port is attaching
+to contains two or more subnets, and the subnet is not is not
+specified, OpenStack will randomly(?) determine which subnet
+the IP address will be assigned from.
+
+The property fixed_ips is used to assign IPs to a port. The Map Property
+subnet_id specifies the subnet the IP is assigned from.
+
+R-38236 The VNF’s Heat Orchestration Template’s resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property
+‘subnet’/’subnet_id’ parameter **MUST** be declared type ‘string’.
+
+R-62802 When the VNF’s Heat Orchestration Template’s resource
+‘OS::Neutron::Port’ is attaching to an external network, and an IPv4
+address is being Cloud Assigned by OpenStack’s DHCP Service and the
+external network IPv4 subnet is to be specified using the property
+‘fixed_ips’ map property ‘subnet’/’subnet_id’, the parameter **MUST**
+follow the naming convention ‘{network-role}_subnet_id’, where
+‘{network-role}’ is the network role of the network.
+
+R-83677 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property
+subnet’/’subnet_id’ parameter ‘{network-role}_subnet_id’
+**MUST NOT** be enumerated in the VNF’s Heat Orchestration Template’s
+Environment File.
+
+ONAP's SDN-Controller provides the network's subnet's UUID
+value at orchestration to the Heat Orchestration Template.
+
+*Example Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {network-role}_subnet_id:
+      type: string
+      description: Neutron IPv4 subnet UUID for the {network-role} network
+
+R-15287 When the VNF’s Heat Orchestration Template’s resource
+‘OS::Neutron::Port’ is attaching to an external network, and an IPv6
+address is being Cloud Assigned by OpenStack’s DHCP Service and the
+external network IPv6 subnet is to be specified using the property
+‘fixed_ips’ map property ‘subnet’/’subnet_id’, the parameter **MUST**
+follow the naming convention ‘{network-role}_subnet_v6_id’, where
+‘{network-role}’ is the network role of the network.
+
+R-80829 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property
+subnet’/’subnet_id’ parameter ‘{network-role}_subnet_v6_id’
+**MUST NOT** be enumerated in the VNF’s Heat Orchestration Template’s
+Environment File.
+
+ONAP's SDN-Controller provides the network's subnet's UUID
+value at orchestration to the Heat Orchestration Template.
+
+*Example Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    {network-role}_v6_subnet_id:
+      type: string
+      description: Neutron IPv6 subnet UUID for the {network-role} network
+
+
+*Example: One Cloud Assigned IPv4 Address (DHCP) assigned to a network
+that has two or more IPv4 subnets*
+
+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. The Cloud Assigned IP Address uses the OpenStack DHCP service
+to assign IP addresses.
+
+.. code-block:: python
+
+  parameters:
+    oam_net_id:
+      type: string
+      description: Neutron UUID for the oam network
+    oam_subnet_id:
+      type: string
+      description: Neutron IPv4 subnet UUID for the oam network
+  resources:
+    lb_0_oam_port_0:
+      type: OS::Neutron::Port
+        parameters:
+          network: { get_param: oam_net_id }
+          fixed_ips:
+            - subnet_id: { get_param: oam_subnet_id }
+
+*Example: One Cloud Assigned IPv4 address and one Cloud Assigned IPv6
+address assigned to a network that has at least one IPv4 subnet and one
+IPv6 subnet*
+
+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:: python
+
+  parameters:
+    oam_net_id:
+      type: string
+      description: Neutron UUID for the oam network
+    oam_subnet_id:
+      type: string
+      description: Neutron IPv4 subnet UUID for the oam network
+    oam_v6_subnet_id:
+      type: string
+      description: Neutron IPv6 subnet UUID for the oam network
+  resources:
+    lb_0_oam_port_0:
+      type: OS::Neutron::Port
+      properties:
+        network: { get_param: oam_net_id }
+        fixed_ips:
+          - subnet_id: { get_param: oam_subnet_id }
+          - subnet_id: { get_param: oam_v6_subnet_id }
+
+R-84123 When
+
+- the VNF’s Heat Orchestration Template’s resource ‘OS::Neutron::Port’
+  in an Incremental Module is attaching to an internal network
+  that is created in the Base Module, AND
+- an IPv4 address is being Cloud Assigned by OpenStack’s DHCP Service AND
+- the internal network IPv4 subnet is to be specified using the
+  property ‘fixed_ips’ map property ‘subnet’/’subnet_id’,
+
+the parameter **MUST** follow the naming convention
+‘int\_{network-role}_subnet_id’, where ‘{network-role}’ is the
+network role of the internal network
+
+- Note that the parameter **MUST** be defined as an ‘output’ parameter in
+  the base module.
+
+R-69634 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property
+subnet’/’subnet_id’ parameter ‘int\_{network-role}_subnet_id’
+**MUST NOT** be enumerated in the VNF’s Heat Orchestration Template’s
+Environment File.
+
+The assumption is that internal networks are created in the base module.
+The Neutron subnet network ID will be passed as an output parameter
+(e.g., ECOMP Base Module Output Parameter) to the incremental modules.
+In the incremental modules, the output parameter name will be defined as
+input parameter.
+
+*Example Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    int_{network-role}_subnet_id:
+      type: string
+      description: Neutron IPv4 subnet UUID for the int_{network-role} network
+
+R-76160 When
+
+- the VNF’s Heat Orchestration Template’s resource
+  ‘OS::Neutron::Port’ in an Incremental Module is attaching to an
+  internal network that is created in the Base Module, AND
+- an IPv6 address is being Cloud Assigned by OpenStack’s DHCP Service AND
+- the internal network IPv6 subnet is to be specified using the property
+  ‘fixed_ips’ map property ‘subnet’/’subnet_id’,
+
+the parameter **MUST** follow the naming convention
+‘int\_{network-role}_v6_subnet_id’, where ‘{network-role}’
+is the network role of the internal network
+
+- Note that the parameter **MUST** be defined as an ‘output’ parameter in
+  the base module.
+
+R-22288 The VNF’s Heat Orchestration Template’s Resource
+‘OS::Neutron::Port’ property ‘fixed_ips’ map property
+‘subnet’/’subnet_id’ parameter ‘int\_{network-role}_v6_subnet_id’
+**MUST NOT** be enumerated in the VNF’s Heat Orchestration Template’s
+Environment File.
+
+*Example Parameter Definition*
+
+.. code-block:: python
+
+  parameters:
+
+    int_{network-role}_v6_subnet_id:
+      type: string
+      description: Neutron subnet UUID for the int_{network-role} network
+
+
+Property: allowed\_address\_pairs, Map Property: ip\_address
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+The property allowed\_address\_pairs in the resource OS::Neutron::Port
+allows the user to specify a mac\_address and/or ip\_address that will
+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. The map property ip\_address
+specifies the IP address.
+
+The allowed\_address\_pairs is an optional property. It is not required.
+
+An ONAP Heat Orchestration Template allows the assignment of one IPv4
+address allowed\_address\_pairs and/or one IPv6 address to a {vm-type}
+and {network-role}/int\_{network-role} combination.
+
+An ONAP Heat Orchestration Template allows the assignment of one IPv6
+address allowed\_address\_pairs and/or one IPv6 address to a {vm-type}
+and {network-role}/int\_{network-role} combination.
+
+Note that 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. ONAP does not support
+Neutron-style Floating IPs.
+
+External Networks
+_________________
+
+R-61282 The VNF Heat Orchestration Template **MUST**
+adhere to the following naming convention for the property
+allowed\_address\_pairs and Map Property ip\_address parameter,
+when the parameter is referencing an “external” network:
+
+-  {vm-type}\_{network-role}\_floating\_ip for an IPv4 address
+
+-  {vm-type}\_{network-role}\_floating\_v6\_ip for an IPv6 address
+
+The parameter must be declared as type: string
+
+The parameter must not be enumerated in the Heat environment file.
+
+*Example Parameter Definition*
+
+.. 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:
+    oam_net_id:
+       type: string
+       description: Neutron UUID for the oam network
+
+    db_oam_ips:
+       type: comma_delimited_list
+       description: Fixed IPs for db VMs on the oam network
+
+    db_oam_floating_ip:
+       type: string
+       description: VIP IP for db VMs on the oam network
+
+ resources:
+    db_0_port_0:
+       type: OS::Neutron::Port
+       properties:
+          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
+       properties:
+          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}}]
+
+Internal Networks
+_________________
+
+R-16805 The VNF Heat Orchestration Template **MUST** adhere to the
+following naming convention for the property allowed\_address\_pairs
+and Map Property ip\_address parameter when the parameter is
+referencing an “internal” network.
+
+-  {vm-type}\_int\_{network-role}\_floating\_ip for an IPv4 address
+
+-  {vm-type}\_int\_{network-role}\_floating\_v6\_ip for an IPv6 address
+
+The parameter must be declared as type: string
+
+The parameter must be enumerated in the Heat environment file.
+
+*Example Parameter Definition*
+
+.. code-block:: yaml
+
+ parameters:
+
+    {vm-type}_int_{network-role}_floating_ip:
+       type: string
+       description: VIP for {vm-type} VMs on the int_{network-role} network
+
+    {vm-type}_int_{network-role}_floating_v6_ip:
+       type: string
+       description: VIP for {vm-type} VMs on the int_{network-role} network
+
+Multiple allowed\_address\_pairs for a {vm-type} / {network-role} combination
+______________________________________________________________________________
+
+The parameter {vm-type}\_{network-role}\_floating\_ip provides only one
+allowed address pair IPv4 address per {vm-type} and {network-role} pair.
+
+The parameter {vm-type}\_{network-role}\_floating\_v6\_ip provides only
+one allowed address pair IPv6 address per {vm-type} and {network-role}
+pair.
+
+If there is a need for multiple allowed address pair IPs for a given
+{vm-type} and {network-role} combination within a VNF, then the
+parameter names defined for the property fixed\_ips and Map Property
+ip\_address should be used with the allowed\_address\_pairs property.
+The examples below illustrate this.
+
+*Example: A VNF has four load balancers. Each pair has a unique VIP.*
+
+In this example, there are two administrative VM pairs. Each pair has
+one VIP. The {network-role} has been defined as oam to represent an oam
+network and the {vm-type} has been defined as admin for an
+administrative VM.
+
+Pair 1: Resources admin\_0\_port\_0 and admin\_1\_port\_0 share a unique
+VIP, [admin\_oam\_ips,2]
+
+Pair 2: Resources admin\_2\_port\_0 and admin\_3\_port\_0 share a unique
+VIP, [admin\_oam\_ips,5]
+
+.. code-block:: yaml
+
+ parameters:
+    oam_net_id:
+       type: string
+       description: Neutron UUID for the oam network
+    admin_oam_ips:
+       type: comma_delimited_list
+       description: Fixed IP assignments for admin VMs on the oam network
+
+ resources:
+
+    admin_0_port_0:
+       type: OS::Neutron::Port
+       properties:
+          network: { get_param: oam_net_id }
+          fixed_ips: [ { “ip_address”: {get_param: [admin_oam_ips,0] }}]
+          allowed_address_pairs: [{ “ip_address”: {get_param: [admin_oam_ips,2] }}]
+
+    admin_1_port_0:
+       type: OS::Neutron::Port
+       properties:
+          network: { get_param: oam_net_id }
+          fixed_ips: [ { “ip_address”: {get_param: [admin_oam_ips,1] }}]
+          allowed_address_pairs: [{ “ip_address”: {get_param:  [admin_oam_ips,2] }}]
+
+    admin_2_port_0:
+       type: OS::Neutron::Port
+       properties:
+          network: { get_param: oam_net_id }
+          fixed_ips: [ { “ip_address”: {get_param: [admin_oam_ips,3] }}]
+          allowed_address_pairs: [{ “ip_address”: {get_param: [admin_oam_ips,5] }}]
+
+    admin_3_port_0:
+       type: OS::Neutron::Port
+       properties:
+          network: { get_param: oam_net_id }
+          fixed_ips: [ { “ip_address”: {get_param: [admin_oam_ips,4] }}]
+          allowed_address_pairs: [{ “ip_address”: {get_param:  [admin_oam_ips,5] }}]
+
+*Example: A VNF has two load balancers. The pair of load balancers share
+two VIPs.*
+
+In this example, there is one load balancer pairs. The pair has two
+VIPs. The {network-role} has been defined as oam to represent an oam
+network and the {vm-type} has been defined as lb for a load balancer VM.
+
+.. code-block:: yaml
+
+ resources:
+    lb_0_port_0:
+       type: OS::Neutron::Port
+       properties:
+          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
+       properties:
+          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.
+
+ONAP SDN-C Assignment of allowed\_address\_pair IP Addresses
+__________________________________________________________________
+
+The following items must be taken into consideration when designing Heat
+Orchestration Templates that expect ONAP’s SDN-C to assign
+allowed\_address\_pair IP addresses via automation.
+
+The VMs must be of the same {vm-type}.
+
+The VMs must be created in the same module (base or incremental).
+
+Resource Property “name”
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+The parameter naming convention of the property name for the resource
+OS::Nova::Server has been defined in
+`Resource:  OS::Nova::Server – Metadata Parameters`_.
+
+This section provides the requirements how the property name for non
+OS::Nova::Server resources must be defined when the property is used.
+Not all resources require the property name (e.g., it is optional) and
+some resources do not support the property.
+
+R-85734 The VNF Heat Orchestration Template **MUST** use the
+intrinsic function str\_replace in conjunction with the ONAP
+supplied metadata parameter vnf\_name to generate a unique
+value, when the property name for a non OS::Nova::Server
+resources is defined in a Heat Orchestration Template.
+
+This prevents the enumeration of a
+unique value for the property name in a per instance environment file.
+
+Note that
+
+-  In most cases, only the use of the metadata value vnf\_name is
+   required to create a unique property name
+
+-  the Heat Orchestration Template pseudo parameter 'OS::stack\_name’
+   may also be used in the str\_replace construct to generate a unique
+   name when the vnf\_name does not provide uniqueness
+
+*Example: Property* name *for resource* OS::Neutron::SecurityGroup
+
+.. code-block:: yaml
+
+ resources:
+   DNS_SECURITY_GROUP:
+     type: OS::Neutron::SecurityGroup
+     properties:
+       description: vDNS security group
+       name:
+         str_replace:
+           template: VNF_NAME_sec_grp_DNS
+           params:
+             VNF_NAME: {get_param: vnf_name}
+       rules: [. . . . .
+              ]
+
+*Example: Property name for resource* OS::Cinder::Volume
+
+.. code-block:: yaml
+
+ resources:
+   DNS_Cinder_Volume:
+     type: OS::Cinder::Volume
+     properties:
+       description: Cinder Volume
+       name:
+         str_replace:
+           template: VNF_NAME_STACK_NAME_dns_volume
+           params:
+             VNF_NAME: {get_param: vnf_name}
+             STACK_NAME: { get_param: 'OS::stack_name' }
+       . . . .
+
+Contrail Issue with Values for the Property Name
+++++++++++++++++++++++++++++++++++++++++++++++++
+
+The Contrail GUI has a limitation displaying special characters. The
+issue is documented in
+https://bugs.launchpad.net/juniperopenstack/+bug/1590710. It is
+recommended that special characters be avoided. However, if special
+characters must be used, note that for the following resources:
+
+-  Virtual Machine
+
+-  Virtual Network
+
+-  Port
+
+-  Security Group
+
+-  Policies
+
+-  IPAM Creation
+
+the only special characters supported are:
+
+- “ ! $ ‘ ( ) = ~ ^ \| @ \` { } [ ] > , . \_
+
+ONAP Output Parameter Names
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ONAP defines three types of Output Parameters as detailed in
+`Output Parameters`_.
+
+ONAP Base Module Output Parameters:
++++++++++++++++++++++++++++++++++++
+
+ONAP Base Module Output Parameters do not have an explicit naming
+convention. The parameter name must contain {vm-type} and {network-role}
+when appropriate.
+
+ONAP Volume Template Output Parameters:
++++++++++++++++++++++++++++++++++++++++
+
+ONAP Base Module Output Parameters do not have an explicit naming
+convention. The parameter name must contain {vm-type} when appropriate.
+
+Predefined Output Parameters
+++++++++++++++++++++++++++++
+
+ONAP currently defines one predefined output parameter the OAM
+Management IP Addresses.
+
+OAM Management IP Addresses
+___________________________
+
+A VNF may 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 ONAP. The IP
+address 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 use of this output parameters are optional.
+
+-  The Management IP Address should be defined only once per VNF, so it
+   must 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. In this case, a IPv4 and/or
+   IPv6 parameter must be defined in the parameter section of the YAML
+   Heat template. The parameter maybe named oam\_management\_v4\_address
+   and/or oam\_management\_v6\_address or may be named differently.
+
+-  If the IP for the admin VM is obtained via DHCP, it may be obtained
+   from the resource attributes. In this case,
+   oam\_management\_v4\_address and/or oam\_management\_v6\_address must
+   not be defined in the parameter section of the YAML Heat template.
+
+*Example: SDN-C Assigned IP Address echoed as*
+oam\_management\_v4\_address
+
+.. code-block:: yaml
+
+ parameters:
+    admin_oam_ip_0:
+       type: string
+       description: Fixed IPv4 assignment for admin VM 0 on the OAM network
+    . . .
+
+ resources:
+    admin_oam_net_0_port:
+       type: OS::Neutron::Port
+       properties:
+          name:
+             str_replace:
+                template: VNF_NAME_admin_oam_net_0_port
+                params:
+                   VNF_NAME: {get_param: vnf_name}
+          network: { get_param: oam_net_id }
+          fixed_ips: [{ "ip_address": { get_param: admin_oam_ip_0 }}]
+          security_groups: [{ get_param: security_group }]
+
+    admin_server:
+       type: OS::Nova::Server
+       properties:
+          name: { get_param: admin_names }
+          image: { get_param: admin_image_name }
+          flavor: { get_param: admin_flavor_name }
+          availability_zone: { get_param: availability_zone_0 }
+          networks:
+             - port: { get_resource: admin_oam_net_0_port }
+          metadata:
+             vnf_id: { get_param: vnf_id }
+             vf_module_id: { get_param: vf_module_id }
+             vnf_name: {get_param: vnf_name }
+    Outputs:
+       oam_management_v4_address:
+       value: {get_param: admin_oam_ip_0 }
+
+*Example: Cloud Assigned IP Address output as*
+oam\_management\_v4\_address
+
+.. code-block:: yaml
+
+ parameters:
+    . . .
+ resources:
+   admin_oam_net_0_port:
+     type: OS::Neutron::Port
+     properties:
+       name:
+         str_replace:
+           template: VNF_NAME_admin_oam_net_0_port
+           params:
+             VNF_NAME: {get_param: vnf_name}
+       network: { get_param: oam_net_id }
+       security_groups: [{ get_param: security_group }]
+
+   admin_server:
+     type: OS::Nova::Server
+     properties:
+       name: { get_param: admin_names }
+       image: { get_param: admin_image_name }
+       flavor: { get_param: admin_flavor_name }
+       availability_zone: { get_param: availability_zone_0 }
+       networks:
+         - port: { get_resource: admin_oam_net_0_port }
+       metadata:
+         vnf_id: { get_param: vnf_id }
+         vf_module_id: { get_param: vf_module_id }
+         vnf_name: {get_param: vnf_name }
+
+ Outputs:
+   oam_management_v4_address:
+   value: {get_attr: [admin_server, networks, {get_param: oam_net_id}, 0] }
+
+Contrail Resource Parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ONAP requires the parameter names of certain Contrail Resources to
+follow specific naming conventions. This section provides these
+requirements.
+
+Contrail Network Parameters
++++++++++++++++++++++++++++
+
+Contrail based resources may require references to a Contrail network
+using the network FQDN.
+
+External Networks
+_________________
+
+When the parameter associated with the Contrail Network is referencing
+an “external” network, the parameter must adhere to the following naming
+convention in the Heat Orchestration Template
+
+-  {network-role}\_net\_fqdn
+
+The parameter must be declared as type: string
+
+The parameter must not be enumerated in the Heat environment file.
+
+*Example: Parameter declaration*
+
+.. code-block:: yaml
+
+ parameters:
+    {network-role}_net_fqdn:
+       type: string
+       description: Contrail FQDN for the {network-role} network
+
+*Example: Contrail Resource OS::ContrailV2::VirtualMachineInterface
+Reference to a Network FQDN.*
+
+In this example, the {network-role} has been defined as oam to represent
+an oam network and the {vm-type} has been defined as fw for firewall.
+The Contrail resource OS::ContrailV2::VirtualMachineInterface property
+virtual\_network\_refs references a contrail network FQDN.
+
+.. code-block:: yaml
+
+ FW_OAM_VMI:
+   type: OS::ContrailV2::VirtualMachineInterface
+   properties:
+     name:
+       str_replace:
+         template: VM_NAME_virtual_machine_interface_1
+         params:
+           VM_NAME: { get_param: fw_name_0 }
+     virtual_machine_interface_properties:
+       virtual_machine_interface_properties_service_interface_type: { get_param: oam_protected_interface_type }
+     virtual_network_refs:
+       - get_param: oam_net_fqdn
+     security_group_refs:
+       - get_param: fw_sec_grp_id
+
+Interface Route Table Prefixes for Contrail InterfaceRoute Table
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+The parameter associated with the resource
+OS::ContrailV2::InterfaceRouteTable property
+interface\_route\_table\_routes, map property
+interface\_route\_table\_routes\_route\_prefix is an ONAP Orchestration
+Parameter.
+
+The parameters must be named {vm-type}\_{network-role}\_route\_prefixes
+in the Heat Orchestration Template.
+
+The parameter must be declared as type: json
+
+The parameter supports IP addresses in the format:
+
+1. Host IP Address (e.g., 10.10.10.10)
+
+2. CIDR Notation format (e.g., 10.0.0.0/28)
+
+The parameter must not be enumerated in the Heat environment file.
+
+*Example Parameter Definition*
+
+.. code-block:: yaml
+
+ parameters:
+    {vm-type}_{network-role}_route_prefixes:
+       type: json
+       description: JSON list of Contrail Interface Route Table route prefixes
+
+*Example:*
+
+.. code-block:: yaml
+
+ parameters:
+   vnf_name:
+     type: string
+     description: Unique name for this VF instance
+   fw_int_fw_route_prefixes:
+     type: json
+     description: prefix for the ServiceInstance InterfaceRouteTable
+   int_fw_dns_trusted_interface_type:
+     type: string
+     description: service_interface_type for ServiceInstance
+
+ <resource name>:
+   type: OS::ContrailV2::InterfaceRouteTable
+   depends_on: [*resource name of* *OS::ContrailV2::ServiceInstance*]
+   properties:
+     name:
+       str_replace:
+         template: VNF_NAME_interface_route_table
+         params:
+           VNF_NAME: { get_param: vnf_name }
+     interface_route_table_routes:
+       interface_route_table_routes_route: { get_param: fw_int_fw_route_prefixes }
+     service_instance_refs:
+       - get_resource: < *resource name of* *OS::ContrailV2::ServiceInstance* >
+     service_instance_refs_data:
+       - service_instance_refs_data_interface_type: { get_param: int_fw_interface_type }
+
+Parameter Names in Contrail Resources
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Contrail Heat resource properties will use, when appropriate, the same
+naming convention as OpenStack Heat resources. For example, the resource
+OS::ContrailV2::InstanceIp has two properties that the parameter naming
+convention is identical to properties in OS::Neutron::Port.
+
+*Example: Contrail Resource OS::ContrailV2::InstanceIp, Property
+instance\_ip\_address*
+
+The property instance\_ip\_address uses the same parameter naming
+convention as the property fixed\_ips and Map Property ip\_address in
+OS::Neutron::Port. The resource is assigning an ONAP SDN-C Assigned IP
+Address. The {network-role} has been defined as oam\_protected to
+represent an oam protected network and the {vm-type} has been defined as
+fw for firewall.
+
+.. code-block:: yaml
+
+ CMD_FW_OAM_PROTECTED_RII:
+   type: OS::ContrailV2::InstanceIp
+   depends_on:
+     - FW_OAM_PROTECTED_RVMI
+   properties:
+     virtual_machine_interface_refs:
+       - get_resource: FW_OAM_PROTECTED_RVMI
+     virtual_network_refs:
+       - get_param: oam_protected_net_fqdn
+     instance_ip_address: { get_param: [fw_oam_protected_ips, get_param: index ] }
+
+*Example: Contrail Resource OS::ContrailV2::InstanceIp, Property
+subnet\_uuid*
+
+The property instance\_ip\_address uses the same parameter naming
+convention as the property fixed\_ips and Map Property subnet\_id in
+OS::Neutron::Port. The resource is assigning a Cloud Assigned IP
+Address. The {network-role} has been defined as “oam\_protected” to
+represent an oam protected network and the {vm-type} has been defined as
+“fw” for firewall.
+
+.. code-block:: yaml
+
+ CMD_FW_SGI_PROTECTED_RII:
+   type: OS::ContrailV2::InstanceIp
+   depends_on:
+     - FW_OAM_PROTECTED_RVMI
+   properties:
+     virtual_machine_interface_refs:
+       - get_resource: FW_OAM_PROTECTED_RVMI
+     virtual_network_refs:
+       - get_param: oam_protected_net_fqdn
+     subnet_uuid: { get_param: oam_protected_subnet_id }
+
+Cinder Volume Templates
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+ONAP supports the independent deployment of a Cinder volume via separate
+Heat Orchestration Templates, the Cinder Volume module. 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 Base Module or Incremental Module may have a corresponding volume
+module. Use of separate volume modules is optional. A Cinder volume may
+be embedded within the Base Module or Incremental Module if persistence
+is not required.
+
+R-47788 The VNF Heat Orchestration Template **MUST** have a 1:1
+scope of a cinder volume module, when it exists, with the
+Base Module or Incremental 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 Orchestration
+   Template from the Base Module or Incremental Module.
+
+-  A single Cinder volume module must include all Cinder volumes
+   needed by the Base/Incremental module.
+
+-  R-79531 The VNF Heat Orchestration Template **MUST** define
+   “outputs” in the volume template for each Cinder volume
+   resource universally unique identifier (UUID) (i.e. ONAP
+   Volume Template Output Parameters).
+
+-  The VNF Incremental Module or Base Module must define input
+   parameters that match each Volume output parameter (i.e., ONAP Volume
+   Template Output Parameters).
+
+   -  ONAP will supply the volume template outputs automatically to the
+      bases/incremental template input parameters.
+
+-  Volume modules may utilize nested Heat templates.
+
+*Examples: Volume Template*
+
+A VNF has a Cinder volume module, named incremental\_volume.yaml, that
+creates an independent Cinder volume for a VM in the module
+incremental.yaml. The incremental\_volume.yaml defines a parameter in
+the output section, lb\_volume\_id\_0 which is the UUID of the cinder
+volume. lb\_volume\_id\_0 is defined as a parameter in incremental.yaml.
+ONAP captures the UUID value of lb\_volume\_id\_0 from the volume module
+output statement and provides the value to the incremental module.
+
+Note that the example below is not a complete Heat Orchestration
+Template. The {vm-type} has been defined as “lb” for load balancer
+
+incremental\_volume.yaml
+
+.. code-block:: yaml
+
+ parameters:
+    vnf_name:
+       type: string
+    lb_volume_size_0:
+       type: number
+    ...
+
+ resources:
+    dns_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: dns_volume_size_0}
+    ...
+
+ outputs:
+    lb_volume_id_0:
+       value: {get_resource: dns_volume_0}
+    ...
+
+
+incremental.yaml
+
+.. code-block:: yaml
+
+ parameters:
+    lb_name_0:
+       type: string
+    lb_volume_id_0:
+       type: string
+    ...
+
+ resources:
+    lb_0:
+       type: OS::Nova::Server
+       properties:
+          name: {get_param: dns_name_0}
+          networks:
+          ...
+
+    lb_0_volume_attach:
+       type: OS::Cinder::VolumeAttachment
+       properties:
+          instance_uuid: { get_resource: lb_0 }
+          volume_id: { get_param: lb_volume_id_0 }
+
+ONAP Support of Environment Files
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The use of an environment file in OpenStack is optional. In ONAP, it is
+mandatory.
+
+R-86285 The VNF Heat Orchestration Template **MUST** have a
+corresponding environment file, even if no parameters are required to be
+enumerated.
+
+(Note that ONAP, the open source version of ONAP, does not
+programmatically enforce the use of an environment file.)
+
+R-67205 The VNF Heat Orchestration Template **MUST** have a corresponding
+environment file for a Base Module.
+
+R-35727 The VNF Heat Orchestration Template **MUST** have a
+corresponding environment file for an Incremental module.
+
+R-22656 The VNF Heat Orchestration Template **MUST** have a
+corresponding environment file for a Cinder Volume Module.
+
+A nested heat template must not have an environment file; OpenStack does
+not support it.
+
+The environment file must contain parameter values for the ONAP
+Orchestration Constants and VNF Orchestration Constants. These
+parameters are identical across all instances of a VNF type, and
+expected to change infrequently. The ONAP Orchestration Constants are
+associated with OS::Nova::Server image and flavor properties (See
+`Property: image`_ and `Property: flavor`_). 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 (ONAP Orchestration Parameters, VNF
+Orchestration Parameters). These parameters are supplied to the Heat by
+ONAP at orchestration time.
+
+SDC Treatment of Environment Files
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Parameter values enumerated in the environment file are used by SDC as
+the default value. However, the SDC user may use the SDC GUI to
+overwrite the default values in the environment file.
+
+SDC generates a new environment file for distribution to MSO based on
+the uploaded environment file and the user provided GUI updates. The
+user uploaded environment file is discarded when the new file is
+created. Note that if the user did not change any values via GUI
+updates, the SDC generated environment file will contain the same values
+as the uploaded file.
+
+Use of Environment Files when using OpenStack “heat stack-create” CLI
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When ONAP is instantiating the Heat Orchestration Template, certain
+parameter must not be enumerated in the environment file. This document
+provides the details of what parameters should not be enumerated.
+
+If the Heat Orchestration Template is to be instantiated from the
+OpenStack Command Line Interface (CLI) using the command “heat
+stack-create”, all parameters must be enumerated in the environment
+file.
+
+Heat Template Constructs
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Nested Heat Templates
+~~~~~~~~~~~~~~~~~~~~~
+
+ONAP 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 VNF module may then reference these component templates
+either statically by repeated definition or dynamically by using the
+resource OS::Heat::ResourceGroup.
+
+Nested Heat Template Requirements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ONAP supports nested Heat Orchestration Templates. A Base Module,
+Incremental Module, and Cinder Volume Module may use nested heat.
+
+A Heat Orchestration Template may reference the nested heat statically
+by repeated definition.
+
+A Heat Orchestration Template may reference the nested heat dynamically
+using the resource OS::Heat::ResourceGroup.
+
+A Heat Orchestration template must have no more than three levels of
+nesting. ONAP supports a maximum of three levels.
+
+Nested heat templates must be referenced by file name. The use of
+resource\_registry in the environment file is not supported and must not
+be used.
+
+R-89868 The VNF Heat Orchestration Template **MUST** have unique
+file names within the scope of the VNF for a nested heat yaml file.
+
+R-52530 The VNF Heat Orchestration Template **MUST NOT** use a
+directory hierarchy for nested templates. All templates must
+be in a single, flat directory (per VNF).
+
+A nested heat template may be used by any module within a given VNF.
+
+Note that:
+
+-  Constrains must not be defined for any parameter enumerated in a
+   nested heat template.
+
+-  R-11041 The VNF Heat Orchestration Template **MUST** have the
+   resource calling the nested yaml file pass in as properties
+   all parameters defined in nested yaml file.
+
+-  R-61183 The VNF Heat Orchestration Template **MUST NOT**
+   change the parameter names, when OS::Nova::Server metadata
+   parameters are past into a nested heat template.
+
+-  With nested templates, outputs are required to expose any resource
+   properties of the child templates to the parent template. Those would
+   not explicitly be declared as parameters but simply referenced as
+   get\_attribute targets against the “parent” resource.
+
+Nested Heat Template Example: Static
+++++++++++++++++++++++++++++++++++++++
+
+incremental.yaml
+
+.. code-block:: yaml
+
+ Resources:
+   dns_server_0:
+     type: nested.yaml
+     properties:
+       dns_image_name: { get_param: dns_image_name }
+       dns_flavor_name: { get_param: dns_flavor_name }
+       availability_zone: { get_param: availability_zone_0 }
+       security_group: { get_param: DNS_shared_sec_grp_id }
+       oam_net_id: { get_param: oam_protected_net_id }
+       dns_oam_ip: { get_param: dns_oam_ip_0 }
+       dns_name: { get_param: dns_name_0 }
+       vnf_name: { get_param: vnf_name }
+       vnf_id: { get_param: vnf_id }
+       vf_module_id: {get_param: vf_module_id}
+
+ dns_server_1:
+   type: nested.yaml
+   properties:
+     dns_image_name: { get_param: dns_image_name }
+     dns_flavor_name: { get_param: dns_flavor_name }
+     availability_zone: { get_param: availability_zone_1 }
+     security_group: { get_param: DNS_shared_sec_grp_id }
+     oam_net_id: { get_param: oam_protected_net_id }
+     dns_oam_ip: { get_param: dns_oam_ip_1 }
+     dns_name: { get_param: dns_name_1 }
+     vnf_name: { get_param: vnf_name }
+     vnf_id: { get_param: vnf_id }
+     vf_module_id: {get_param: vf_module_id}
+
+nested.yaml
+
+.. code-block:: yaml
+
+ dns_oam_0_port:
+   type: OS::Neutron::Port
+   properties:
+     name:
+       str_replace:
+         template: VNF_NAME_dns_oam_port
+         params:
+           VNF_NAME: {get_param: vnf_name}
+     network: { get_param: oam_net_id }
+     fixed_ips: [{ "ip_address": { get_param: dns_oam_ip }}]
+     security_groups: [{ get_param: security_group }]
+
+ dns_servers:
+   type: OS::Nova::Server
+   properties:
+     name: { get_param: dns_names }
+     image: { get_param: dns_image_name }
+     flavor: { get_param: dns_flavor_name }
+     availability_zone: { get_param: availability_zone }
+     networks:
+       - port: { get_resource: dns_oam_0_port }
+     metadata:
+       vnf_id: { get_param: vnf_id }
+       vf_module_id: { get_param: vf_module_id }
+       vnf_name {get_param: vnf_name }
+
+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 ONAP 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 ResourceGroup:
+
+.. code-block:: yaml
+
+ type: OS::Heat::ResourceGroup
+   resource_def:
+     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_def:
+     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} ] }
+
+ResourceGroup Property count
+____________________________
+
+ONAP requires that the OS::Heat::ResourceGroup property count be defined
+(even if the value is one) and that the value must be enumerated in the
+environment file. This is required for ONAP to build the TOSCA model for
+the VNF.
+
+.. code-block:: yaml
+
+ type: OS::Heat::ResourceGroup
+   properties:
+   count: { get_param: count }
+   index_var: index
+     resource_def:
+       type: my_nested_vm_template.yaml
+       properties:
+         names: {get_param: vm_name_list}
+     index: index
+
+Availability Zone and ResourceGroups
+____________________________________
+
+The resource OS::Heat::ResourceGroup and the property availability\_zone
+has been an “issue” with a few VNFs since ONAP only supports
+availability\_zone as a string parameter and not a
+comma\_delimited\_list. This makes it difficult to use a ResourceGroup
+to create Virtual Machines in more than one availability zone.
+
+There are numerous solutions to this issue. Below are two suggested
+usage patterns.
+
+**Option 1:** create a CDL in the OS::Heat::ResourceGroup. In the
+resource type: OS::Heat::ResourceGroup, create a comma\_delimited\_list
+availability\_zones by using the intrinsic function list\_join.
+
+.. code-block:: yaml
+
+ <resource name>:
+  type: OS::Heat::ResourceGroup
+     properties:
+       count: { get_param: node_count }
+       index_var: index
+       resource_def:
+         type: nested.yaml
+         properties:
+           index: index
+           avaialability_zones: { list_join: [',', [ { get_param: availability_zone_0 }, { get_param: availability_zone_1 } ] ] }
+
+In the nested heat
+
+.. code-block:: yaml
+
+ parameters:
+   avaialability_zones:
+     type: comma_delimited_list
+     description:
+
+ resources:
+   servers:
+     type: OS::Nova::Server
+     properties:
+       name: { get_param: [ dns_names, get_param: index ] }
+       image: { get_param: dns_image_name }
+       flavor: { get_param: dns_flavor_name }
+       availability_zone: { get_param: [ avaialability_zones, get_param: index ] }
+
+
+**Option 2:** Create a resource group per availability zone. A separate
+OS::Heat::ResourceGroup is created for each availability zone.
+
+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, ONAP *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:
+
+R-76718 The VNF Heat Orchestration Template **MUST** reference
+the get\_files targets in Heat templates by file name, and the
+corresponding files should be delivered to ONAP along with the
+Heat templates.
+
+R-41888 The VNE Heat **MUST NOT** use URL-based file retrieval.
+
+R-62177 The VNF Heat Orchestration Template **MUST** have unique
+file names for the included files within the scope of the VNF.
+
+R-87848 The VNF Heat Orchestration Template **MUST** have all
+included files in a single, flat directory per VNF. ONAP does
+not support a directory hierarchy.
+
+-  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
+
+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 ONAP 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 Orchestration Template (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 ONAP).
+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 instance-specific parameters. ONAP 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
+    lb_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
+Orchestration 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_resource: db_server_group}
+
+ db_1:
+    type: OS::Nova::Server
+    properties:
+    ...
+    scheduler_hints:
+       group: {get_resource: db_server_group}
+
+ lb_0:
+    type: OS::Nova::Server
+    properties:
+    ...
+    scheduler_hints:
+       group: {get_resource: lb_server_group} 
+
+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
+
+ resources:
+   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}
+
+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
+
+Post Orchestration & VNF Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Heat templates should contain a minimum amount of post-orchestration
+configuration data. For instance, *do not* embed complex user-data
+scripts in the template with large numbers of configuration parameters
+to the Heat template.
+
+-  VNFs may provide configuration APIs for use after VNF creation. Such
+   APIs will be invoked via application and/or SDN controllers.
+
+*Note:* It is important to follow this convention to the extent possible
+even in the short-term as of the long-term direction.
+
+VNFM Driver Development Steps
+-----------------------------------------------------------
+
+Refer to the ONAP documentation for VNF Provider instructions on integrating
+vendor-specific VNFM adaptors with VF-C.  The VNF driver development steps are
+highlighted below.
+
+1. Use the VNF SDK tools to design the VNF with TOSCA models to output
+the VNF TOSCA package.  Using the VNF SDK tools, the VNF package can be
+validated and tested.
+
+2. The VNF Provider supplies a vendor-specific VNFM driver in ONAP, which
+is a microservice providing a translation interface from VF-C to
+the vendor-specific VNFM. The interface definitions of vendor-specific
+VNFM adaptors are supplied by the VNF Providers themselves.
+
+Creating Vendor-Specific VNFM Adaptor Microservices
+------------------------------------------------------------------------------------------------
+
+VNFs can be managed by vendor-specific VNFMs. To add a vendor-specific
+VNFM to ONAP, a vendor-specific VNFM adaptor is added to ONAP implementing
+the interface of the vendor-specific VNFM.
+
+A vendor-specific VNFM adaptor is a microservice with a unique name and
+an appointed port. When started up, the vendor-specific VNFM adaptor
+microservice is automatically registered to the Microservices Bus (MSB).
+The following RESTful example describes the scenario of registering a
+vendor-specific VNFM adaptor to MSB:
+
+.. code-block:: java
+
+    POST /api/microservices/v1/services
+    {
+        "serviceName": "catalog",
+        "version": "v1",
+        "url": "/api/catalog/v1",
+        "protocol": "REST",
+        "visualRange": "1",
+        "nodes": [
+        {
+            "ip": "10.74.56.36",
+            "port": "8988",
+            "ttl": 0
+        }
+        ]
+    }