VNFRQTS - Dynamic Release Notes 42/70842/1
authorLovett, Trevor <trevor.lovett@att.com>
Wed, 17 Oct 2018 19:59:49 +0000 (14:59 -0500)
committerLovett, Trevor <trevor.lovett@att.com>
Fri, 19 Oct 2018 19:04:29 +0000 (14:04 -0500)
Also fixed couple formatting issues that were causing errors in the
Sphinx job.

Change-Id: Iae938e41d1d3746aa8faa1edbc652d68d9c7aa6e
Issue-ID: VNFRQTS-447
Signed-off-by: Lovett, Trevor <trevor.lovett@att.com>
docs/Chapter4/Resiliency.rst
docs/Chapter4/Security.rst
docs/Chapter5/Heat/ONAP Heat Orchestration Templates Overview.rst [moved from docs/Chapter5/Heat/ONAP Heat Orchestration Templates: Overview.rst with 99% similarity]
docs/Chapter5/Heat/ONAP Heat Resource ID and Parameter Naming Convention/Nova Metadata Parameters.rst
docs/Chapter5/Heat/index.rst
docs/Chapter5/Tosca.rst
docs/changes-by-section-casablanca.rst [new file with mode: 0644]
docs/data/needs.json
docs/release-notes.rst
gen_requirement_changes.py [new file with mode: 0644]
release-requirement-changes.rst.jinja2 [new file with mode: 0644]

index ea93f33..ab188d6 100644 (file)
@@ -710,7 +710,7 @@ of a VNF or VM and store it (Openstack).
     :keyword: MUST
     :introduced: casablanca
 
-    The VNF **MUST** support ONAP Controllers Evacuate command.
+    The VNF **MUST** support ONAP Controller's Evacuate command.
 
 .. req::
     :id: R-48761
@@ -718,4 +718,4 @@ of a VNF or VM and store it (Openstack).
     :keyword: MUST
     :introduced: casablanca
 
-    The VNF **MUST** support ONAP Controllers Snapshot command.
\ No newline at end of file
+    The VNF **MUST** support ONAP Controller's Snapshot command.
\ No newline at end of file
index 9b4f5f7..9bba923 100644 (file)
@@ -886,7 +886,7 @@ Data Protection Requirements
     The VNF **MUST** provide the capability to encrypt data on
     non-volatile memory.Non-volative memory is storage that is
     capable of retaining data without electrical power, e.g.
-    Complementary metal–oxide–semiconductor (CMOS) or hard drives.
+    Complementary metal-oxide-semiconductor (CMOS) or hard drives.
 
 .. req::
     :id: R-13151
@@ -559,5 +559,3 @@ Orchestration Template at orchestration time.
     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.
-
-
index 5a4463e..7ce453c 100644 (file)
@@ -4,7 +4,7 @@
 
 .. _Nova Server - Metadata Parameters:
 
-Resource: OS::Nova::Server Metadata Parameters
+Resource: OS::Nova::Server Metadata Parameters
 --------------------------------------------------------------------------------
 
 The ``OS::Nova::Server`` resource property ``metadata`` is an optional
index 361764b..8c18992 100644 (file)
@@ -11,7 +11,7 @@ Heat
 
     General Guidelines for Heat
     ONAP Heat Orchestration Template Format
-    ONAP Heat Orchestration Templates: Overview
+    ONAP Heat Orchestration Templates Overview
     ONAP Heat Networking
     ONAP Heat Resource ID and Parameter Naming Convention/index
     ONAP Heat VNF Modularity
index 59ff0d0..9970dbc 100644 (file)
@@ -141,8 +141,8 @@ VNF Package Contents
     :introduced: casablanca
 
     The VNF package Manifest file **MUST** contain: VNF package meta-data, a
-    list of all artifacts (both internal and external) entrys including
-    their respected URIs, an algorithm to calculate a digest and a digest
+    list of all artifacts (both internal and external) entry's including
+    their respected URI's, an algorithm to calculate a digest and a digest
     result calculated on the content of each artifacts, as specified in
     ETSI GS NFV-SOL004. The VNF Package MUST include VNF Identification
     Data to uniquely identify the resource for a given VNF provider. The
@@ -429,7 +429,7 @@ Relationship Types
       **tosca.relationships.nfv.VirtualLinksTo**
 
         This relationship type represents an association relationship between
-        the VduCpds and VirtualLinkDesc node types.
+        the VduCpd's and VirtualLinkDesc node types.
 
 
 Interface Types
diff --git a/docs/changes-by-section-casablanca.rst b/docs/changes-by-section-casablanca.rst
new file mode 100644 (file)
index 0000000..6cc56c5
--- /dev/null
@@ -0,0 +1,4293 @@
+.. Modifications Copyright © 2017-2018 AT&T Intellectual Property.
+
+.. Licensed under the Creative Commons License, Attribution 4.0 Intl.
+   (the "License"); you may not use this documentation except in compliance
+   with the License. You may obtain a copy of the License at
+
+.. https://creativecommons.org/licenses/by/4.0/
+
+.. Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+Requirement Changes Introduced in Casablanca
+========================================================
+
+This document summarizes the requirement changes by section that were
+introduced between the Beijing release and
+Casablanca release. Click on the requirement number to
+navigate to the
+
+.. contents::
+    :depth: 2
+
+Summary of Changes
+------------------
+
+* **Requirements Added:** 70
+* **Requirements Changed:** 187
+* **Requirements Removed:** 61
+
+
+Contrail Resource Parameters > Contrail Network Parameters > External Networks
+------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-02164`
+
+    When a VNF's Heat Orchestration Template's Contrail resource
+    has a property that
+    references an external network that requires the network's
+    Fully Qualified Domain Name (FQDN), the property parameter
+
+    * **MUST** follow the format ``{network-role}_net_fqdn``
+    * **MUST** be declared as type ``string``
+    * **MUST NOT** be enumerated in the VNF's Heat Orchestration Template's
+      Environment File
+    
+
+Heat > Cinder Volumes
+---------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    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).
+    
+
+Heat > Heat Orchestration Template Format > Heat Orchestration Template Structure > resources > metadata
+--------------------------------------------------------------------------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-97199
+
+    A VNF's Heat Orchestration Template's OS::Nova::Server
+    resource **MUST** contain the attribute "metadata".
+    
+
+Heat > Heat Template Constructs > Heat Files Support (get_file)
+---------------------------------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-62177
+
+    When using the intrinsic function get_file, the included files
+    **MUST** have unique file names within the scope of the VNF.
+    
+
+Heat > Heat Template Constructs > Nested Heat Template Requirements
+-------------------------------------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-89868
+
+    The VNF Heat Orchestration Template **MUST** have unique
+    file names within the scope of the VNF for a nested heat yaml file.
+    
+
+Heat > Networking > External Networks
+-------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-29865
+
+    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.
+    
+
+Heat > Networking > Internal Networks
+-------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    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.
+    
+
+Heat > ONAP Resource ID and Parameter Naming Convention > Contrail Resource Parameters > Contrail Network Parameters > External Networks
+----------------------------------------------------------------------------------------------------------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-73228
+
+    A VNF's Heat Orchestration Template's parameter
+    '{network-role}_net_fqdn'
+    **MUST** be declared as type 'string'.
+    
+
+Heat > ONAP Resource ID and Parameter Naming Convention > Resource: OS::Nova::Server \96 Metadata Parameters > vm_role
+--------------------------------------------------------------------------------------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    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.
+    
+
+Heat > ONAP Support of Environment Files
+----------------------------------------
+
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-22656
+
+    The VNF Heat Orchestration Template **MUST** have a
+    corresponding environment file for a Cinder Volume Module.
+    
+
+.. container:: note
+
+    R-35727
+
+    The VNF Heat Orchestration Template **MUST** have a
+    corresponding environment file for an Incremental module.
+    
+
+.. container:: note
+
+    R-67205
+
+    The VNF Heat Orchestration Template **MUST** have a corresponding
+    environment file for a Base Module.
+    
+
+Monitoring & Management > Data Structure Specification of the Event Record
+--------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-120182`
+
+    The xNF provider **MUST** indicate specific conditions that may arise, and
+    recommend actions that may be taken at specific thresholds, or if specific
+    conditions repeat within a specified time interval, using the semantics and
+    syntax described by the :doc:`VES Event Registration specification<../../../../vnfsdk/module.git/files/VESEventRegistration_3_0>`.
+    
+
+.. container:: note
+
+    :need:`R-123044`
+
+    The xNF Provider **MAY** require that specific events, identified by their
+    ``eventName``, require that certain fields, which are optional in the common
+    event format, must be present when they are published.
+    
+
+.. container:: note
+
+    :need:`R-520802`
+
+    The xNF provider **MUST** provide a YAML file formatted in adherence with
+    the :doc:`VES Event Registration specification<../../../../vnfsdk/module.git/files/VESEventRegistration_3_0>`
+    that defines the following information for each event produced by the VNF:
+
+    * ``eventName``
+    * Required fields
+    * Optional fields
+    * Any special handling to be performed for that event
+    
+
+.. container:: note
+
+    :need:`R-570134`
+
+    The events produced by the xNF **MUST** must be compliant with the common
+    event format defined in the
+    :doc:`VES Event Listener<../../../../vnfsdk/model.git/docs/files/VESEventListener_7_0_1>`
+    specification.
+    
+
+Monitoring & Management > Event Records - Data Structure Description > Common Event Header
+------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-528866`
+
+    The VNF **MUST** produce VES events that include the following mandatory
+    fields in the common event header.
+
+     * ``domain`` - the event domain enumeration
+     * ``eventId`` - the event key unique to the event source
+     * ``eventName`` - the unique event name
+     * ``lastEpochMicrosec`` - the latest unix time (aka epoch time) associated
+       with the event
+     * ``priority`` - the processing priority enumeration
+     * ``reportingEntityName`` - name of the entity reporting the event or
+       detecting a problem in another xNF
+     * ``sequence`` - the ordering of events communicated by an event source
+     * ``sourceName`` - name of the entity experiencing the event issue, which
+       may be detected and reported by a separate reporting entity
+     * ``startEpochMicrosec`` - the earliest unix time (aka epoch time)
+       associated with the event
+     * ``version`` - the version of the event header
+     * ``vesEventListenerVersion`` - Version of the VES event listener API spec
+       that this event is compliant with
+    
+
+Monitoring & Management > Event Records - Data Structure Description > Miscellaneous
+------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-283988`
+
+    The VNF, when publishing events, **MUST NOT** send information through
+    extensible structures if the event specification has explicitly defined
+    fields for that information.
+    
+
+.. container:: note
+
+    :need:`R-408813`
+
+    The VNF, when publishing events, **MUST** pass all information it is
+    able to collect even if the information field is identified as optional.
+    However, if the data cannot be collected, then optional fields can be
+    omitted.
+    
+
+.. container:: note
+
+    :need:`R-470963`
+
+    The VNF, when publishing events, **MUST** leverage camel case to separate
+    words and acronyms used as keys that will be sent through extensible fields.
+    When an acronym is used as the key, then only the first letter shall be
+    capitalized.
+    
+
+Monitoring & Management > Monitoring & Management Requirements > Asynchronous and Synchronous Data Delivery
+-----------------------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-332680`
+
+    The xNF **SHOULD** deliver all syslog messages to the VES Collector per the
+    specifications in Monitoring and Management chapter.
+    
+
+Monitoring & Management > Monitoring & Management Requirements > Bulk Performance Measurement
+---------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-440220`
+
+    The xNF **SHOULD** support File transferring protocol, such as FTPES or SFTP,
+    when supporting the event-driven bulk transfer of monitoring data.
+    
+
+.. container:: note
+
+    :need:`R-75943`
+
+    The xNF **SHOULD** support the data schema defined in 3GPP TS 32.435, when
+    supporting the event-driven bulk transfer of monitoring data.
+    
+
+.. container:: note
+
+    :need:`R-841740`
+
+    The xNF **SHOULD** support FileReady VES event for event-driven bulk transfer
+    of monitoring data.
+    
+
+Monitoring & Management > Monitoring & Management Requirements > Google Protocol Buffers (GPB)
+----------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-257367`
+
+    The xNF, when leveraging Google Protocol Buffers for events, **MUST**
+    serialize the events using native Google Protocol Buffers (GPB) according
+    to the following guidelines:
+
+       * The keys are represented as integers pointing to the system resources
+         for the xNF being monitored
+       * The values correspond to integers or strings that identify the
+         operational state of the VNF resource, such a statistics counters and
+         the state of an xNF resource.
+       * The required Google Protocol Buffers (GPB) metadata is provided in the
+         form of .proto files.
+    
+
+.. container:: note
+
+    :need:`R-978752`
+
+    The xNF providers **MUST** provide the Service Provider the following
+    artifacts to support the delivery of high-volume xNF telemetry to
+    DCAE via GPB over TLS/TCP:
+
+       * A valid VES Event .proto definition file, to be used validate and
+         decode an event
+       * A valid high volume measurement .proto definition file, to be used for
+         processing high volume events
+       * A supporting PM content metadata file to be used by analytics
+         applications to process high volume measurement events
+    
+
+Monitoring & Management > Monitoring & Management Requirements > JSON
+---------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-19624`
+
+    The xNF, when leveraging JSON for events, **MUST** encode and serialize
+    content delivered to ONAP using JSON (RFC 7159) plain text format.
+    High-volume data is to be encoded and serialized using
+    `Avro <http://avro.apache.org/>`_, where the Avro [#7.4.1]_ data
+    format are described using JSON.
+    
+
+Monitoring & Management > Monitoring & Management Requirements > Reporting Frequency
+------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-146931`
+
+    The xNF **MUST** report exactly one Measurement event per period
+    per source name.
+    
+
+Monitoring & Management > Monitoring & Management Requirements > VNF telemetry via standardized interface
+---------------------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-821473`
+
+    The xNF MUST produce heartbeat indicators consisting of events containing
+    the common event header only per the VES Listener Specification.
+    
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-51910
+
+    The xNF **MUST** provide all telemetry (e.g., fault event
+    records, syslog records, performance records etc.) to ONAP using the
+    model, format and mechanisms described in this section.
+    
+
+Monitoring & Management > Transports and Protocols Supporting Resource Interfaces
+---------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-798933`
+
+    The xNF **SHOULD** deliver event records that fall into the event domains
+    supported by VES.
+    
+
+.. container:: note
+
+    :need:`R-821839`
+
+    The xNF **MUST** deliver event records to ONAP using the common transport
+    mechanisms and protocols defined in this document.
+    
+
+.. container:: note
+
+    :need:`R-932071`
+
+    The xNF provider **MUST** reach agreement with the Service Provider on
+    the selected methods for encoding, serialization and data delivery
+    prior to the on-boarding of the xNF into ONAP SDC Design Studio.
+    
+
+Monitoring & Management > Transports and Protocols Supporting Resource Interfaces > Bulk Telemetry Transmission
+---------------------------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-908291`
+
+    The XNF **MAY** leverage bulk xNF telemetry transmission mechanism, as
+    depicted in Figure 4, in instances where other transmission methods are not
+    practical or advisable.
+    
+
+Monitoring & Management > Transports and Protocols Supporting Resource Interfaces > xNF Telemetry using Google Protocol Buffers
+-------------------------------------------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-697654`
+
+    The xNF **MAY** leverage the Google Protocol Buffers (GPB) delivery model
+    depicted in Figure 3 to support real-time performance management (PM) data.
+    In this model the VES events are streamed as binary-encoded GBPs over via
+    TCP sockets.
+    
+
+Monitoring & Management > Transports and Protocols Supporting Resource Interfaces > xNF Telemetry using VES/JSON Model
+----------------------------------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-659655`
+
+    The xNF **SHOULD** leverage the JSON-driven model, as depicted in Figure 2,
+    for data delivery unless there are specific performance or operational
+    concerns agreed upon by the Service Provider that would warrant using an
+    alternate model.
+    
+
+ONAP Heat Cinder Volumes
+------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-270358`
+
+    A VNF's Heat Orchestration Template's Cinder Volume Template **MUST**
+    contain either
+
+    * An ``OS::Cinder::Volume`` resource
+    * An ``OS::Heat::ResourceGroup`` resource that references a Nested YAML
+      file that contains an ``OS::Cinder::Volume`` resource
+    * A resource that defines the property ``type`` as a Nested YAML file
+      (i.e., static nesting) and the Nested YAML contains
+      an ``OS::Cinder::Volume`` resource
+    
+
+ONAP Heat Heat Template Constructs > Heat Files Support (get_file)
+------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-76718`
+
+    If a VNF's Heat Orchestration Template uses the intrinsic function
+    ``get_file``, the ``get_file`` target **MUST** be referenced in
+    the Heat Orchestration Template by file name.
+    
+
+.. container:: note
+
+    :need:`R-41888`
+
+    A VNF's Heat Orchestration Template intrinsic function
+    ``get_file`` **MUST NOT** utilize URL-based file retrieval.
+    
+
+.. container:: note
+
+    :need:`R-87848`
+
+    When using the intrinsic function get_file, ONAP does not support
+    a directory hierarchy for included files. All files must be in a
+    single, flat directory per VNF. A VNF's Heat Orchestration
+    Template's ``get_file`` target files **MUST** be in the same
+    directory hierarchy as the VNF's Heat Orchestration Templates.
+    
+
+.. container:: note
+
+    :need:`R-05050`
+
+    A VNF's Heat Orchestration Templates intrinsic function
+    ``get_file`` <content key> **MAY** be used:
+
+        * more than once in a VNF's Heat Orchestration Template
+        * in two or more of a VNF's Heat Orchestration Templates
+        * in a VNF's Heat Orchestration Templates nested YAML file
+    
+
+ONAP Heat Heat Template Constructs > Nested Heat Templates > Nested Heat Template Requirements
+----------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-70112`
+
+    A VNF's Heat Orchestration Template **MUST** reference a Nested YAML
+    file by name. The use of ``resource_registry`` in the VNF's Heat
+    Orchestration Templates Environment File **MUST NOT** be used.
+    
+
+ONAP Heat Networking > External Networks
+----------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-00606`
+
+    A VNF **MAY** be connected to zero, one or more than one external
+    network.
+    
+
+ONAP Heat Networking > Internal Networks
+----------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-52425`
+
+    A VNF's port connected to an internal network **MUST**
+    use the port for the purpose of reaching VMs in the same VNF.
+    
+
+.. container:: note
+
+    :need:`R-87096`
+
+    A VNF **MAY** contain zero, one or more than one internal network.
+    
+
+.. container:: note
+
+    :need:`R-46461`
+
+    A VNF's port connected to an internal network **MUST NOT** use the port
+    for the purpose of reaching VMs in another VNF and/or an
+    external gateway and/or
+    external router.
+    
+
+ONAP Heat Orchestration Template Format
+---------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-92635`
+
+    A VNF's Heat Orchestration Template **MUST** be compliant with the
+    OpenStack Template Guide.
+    
+
+ONAP Heat Orchestration Template Format > Environment File Format
+-----------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-86285`
+
+    A VNF's Heat Orchestration template **MUST** have a
+    corresponding environment file.
+    
+
+.. container:: note
+
+    :need:`R-03324`
+
+    A VNF's Heat Orchestration template's Environment File **MUST**
+    contain the ``parameters:`` section.
+    
+
+.. container:: note
+
+    :need:`R-68198`
+
+    A VNF's Heat Orchestration template's Environment File's
+    ``parameters:`` section **MAY** (or **MAY NOT**) enumerate parameters.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > parameters
+--------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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``.
+    
+
+.. container:: note
+
+    :need:`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::Server``.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > parameters > constraints
+----------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-79817`
+
+    A VNF's Heat Orchestration Template's parameter defined
+    in a non-nested YAML file as
+    type ``comma_delimited_list`` **MAY** have a parameter constraint defined.
+    
+
+.. container:: note
+
+    :need:`R-00011`
+
+    A VNF's Heat Orchestration Template's parameter defined
+    in a nested YAML file
+    **MUST NOT** have a parameter constraint defined.
+    
+
+.. container:: note
+
+    :need:`R-96227`
+
+    A VNF's Heat Orchestration Template's parameter defined
+    in a non-nested YAML file as type
+    ``json`` **MAY** have a parameter constraint defined.
+    
+
+.. container:: note
+
+    :need:`R-88863`
+
+    A VNF's Heat Orchestration Template's parameter defined
+    in a non-nested YAML file as type
+    ``number`` **MUST** have a parameter constraint of ``range`` or
+    ``allowed_values`` defined.
+    
+
+.. container:: note
+
+    :need:`R-40518`
+
+    A VNF's Heat Orchestration Template's parameter defined
+    in a non-nested YAML file as type
+    ``string`` **MAY** have a parameter constraint defined.
+    
+
+.. container:: note
+
+    :need:`R-06613`
+
+    A VNF's Heat Orchestration Template's parameter defined
+    in a non-nested YAML file as type
+    ``boolean`` **MAY** have a parameter constraint defined.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > parameters > default
+------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-26124`
+
+    If a VNF Heat Orchestration Template parameter has a default value,
+    it **MUST** be enumerated in the environment file.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > parameters > type
+---------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-11441`
+
+    A VNF's Heat Orchestration Template's parameter type **MUST** be one of
+    the following values:
+
+    * ``string``
+    * ``number``
+    * ``json``
+    * ``comma_delimited_list``
+    * ``boolean``
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > resources
+-------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-40551`
+
+    A VNF's Heat Orchestration Template's Nested YAML files **MAY**
+    (or **MAY NOT**) contain the section ``resources:``.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > resources > deletion_policy
+-------------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-43740`
+
+    VNF's Heat Orchestration Template's Resource **MAY** declare the
+    attribute ``deletion_policy:``.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > resources > external_id
+---------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-78569`
+
+    VNF's Heat Orchestration Template's Resource **MAY** declare the
+    attribute ``external_id:``.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > resources > metadata
+------------------------------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-67386`
+
+    A VNF's Heat Orchestration Template's Resource **MAY** declare the
+    attribute ``metadata``.
+    
+
+ONAP Heat Orchestration Template Format > Heat Orchestration Template Structure > resources > properties
+--------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-10834`
+
+    If a VNF's Heat Orchestration Template resource attribute
+    ``property:`` uses a nested ``get_param``, the nested
+    ``get_param`` **MUST** reference an index.
+    
+
+ONAP Heat Orchestration Templates Overview > ONAP Heat Orchestration Template Filenames > Base Modules
+------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-81339`
+
+    A VNF Heat Orchestration Template's Base Module file name **MUST** include
+    case insensitive '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``
+
+     4.) ``<text>_base_<text>``.y[a]ml
+
+    where ``<text>`` **MUST** contain only alphanumeric characters and
+    underscores '_' and **MUST NOT** contain the case insensitive word ``base``.
+    
+
+ONAP Heat Orchestration Templates Overview > ONAP Heat Orchestration Template Filenames > Cinder Volume Modules
+---------------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`R-31141`
+
+    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``.
+    
+
+ONAP Heat Orchestration Templates Overview > ONAP Heat Orchestration Template Filenames > Incremental Modules
+-------------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-87247`
+
+    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``.
+    
+
+ONAP Heat Orchestration Templates Overview > ONAP Heat Orchestration Template Filenames > Nested Heat file
+----------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-76057`
+
+    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``.
+    
+
+ONAP Heat Orchestration Templates Overview > ONAP VNF Modularity Overview
+-------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-11200`
+
+    A VNF's Cinder Volume Module, when it exists, **MUST** be 1:1
+    with a Base module or Incremental module.
+    
+
+.. container:: note
+
+    :need:`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).
+    
+
+.. container:: note
+
+    :need:`R-37028`
+
+    A VNF **MUST** be composed of one Base Module
+    
+
+.. container:: note
+
+    :need:`R-20974`
+
+    At orchestration time, the VNF's Base Module **MUST**
+    be deployed first, prior to any incremental modules.
+    
+
+.. container:: note
+
+    :need:`R-81725`
+
+    A VNF's Incremental Module **MUST** have a corresponding Environment File
+    
+
+.. container:: note
+
+    :need:`R-53433`
+
+    A VNF's Cinder Volume Module **MUST** have a corresponding environment file
+    
+
+.. container:: note
+
+    :need:`R-38474`
+
+    A VNF's Base Module **MUST** have a corresponding Environment File.
+    
+
+ONAP Heat Orchestration Templates Overview > Output Parameters > ONAP Volume Module Output Parameters
+-----------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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``.
+    
+
+.. container:: note
+
+    :need:`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 others **MAY** be included.
+    
+
+ONAP Heat VNF Modularity
+------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-61001`
+
+    A shared Heat Orchestration Template resource is a resource that **MUST**
+    be defined in the base module and will be referenced by one or
+    more resources in one or more incremental modules.
+
+    The UUID of the shared resource (created in the base module) **MUST** be
+    exposed by declaring a parameter in the
+    ``outputs`` section of the base module.
+
+    For ECOMP to provided the UUID value of the shared resource to the
+    incremental module, the parameter name defined in the ``outputs``
+    section of the base module **MUST** be defined as a parameter
+    in the ``parameters`` section of the incremental module.
+
+    ECOMP will capture the output parameter name and value in the base module
+    and provide the value to the corresponding parameter(s) in the
+    incremental module(s).
+    
+
+ONAP Output Parameter Names > Predefined Output Parameters > OAM Management IP Addresses
+----------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-48987`
+
+    If the VNF's OAM Management IP Address is cloud assigned and
+    and the OAM IP Address is required to be inventoried in ONAP A&AI,
+    then the parameter **MUST** be obtained by the
+    resource ``OS::Neutron::Port``
+    attribute ``ip_address``.
+    
+
+.. container:: note
+
+    :need:`R-56287`
+
+    If the VNF's OAM Management IP Address is assigned by ONAP SDN-C and
+    assigned in the VNF's Heat Orchestration Template's via a heat resource
+    ``OS::Neutron::Port`` property ``fixed_ips`` map property
+    ``ip_adress`` parameter (e.g., ``{vm-type}_{network-role}_ip_{index}``,
+    ``{vm-type}_{network-role}_v6_ip_{index}``)
+    and the OAM IP Address is required to be inventoried in ONAP A&AI,
+    then the parameter **MUST** be echoed in an output statement.
+
+    .. code-block:: yaml
+
+      outputs:
+          oam_management_v4_address:
+            value: {get_param: {vm-type}_{network-role}_ip_{index} }
+          oam_management_v6_address:
+            value: {get_param: {vm-type}_{network-role}_v6_ip_{index} }
+    
+
+.. container:: note
+
+    :need:`R-94669`
+
+    If a VNF has one IPv6 OAM Management IP Address and the
+    IP Address needs to be inventoried in ONAP's A&AI
+    database, an output parameter **MUST** be declared in only one of the
+    VNF's Heat Orchestration Templates and the parameter **MUST** be named
+    ``oam_management_v6_address``.
+    
+
+ONAP TOSCA VNFD Requirements > TOSCA VNF Descriptor > Capability Types
+----------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-67895`
+
+    The VNFD provided by VNF vendor may use the below described TOSCA
+    capabilities. An on-boarding entity (ONAP SDC) **MUST** support them.
+
+      **tosca.capabilities.nfv.VirtualBindable**
+
+        A node type that includes the VirtualBindable capability indicates
+        that it can be pointed by **tosca.relationships.nfv.VirtualBindsTo**
+        relationship type.
+
+      **tosca.capabilities.nfv.VirtualLinkable**
+
+        A node type that includes the VirtualLinkable capability indicates
+        that it can be pointed by **tosca.relationships.nfv.VirtualLinksTo**
+        relationship.
+
+      **tosca.capabilities.nfv.ExtVirtualLinkable**
+
+        A node type that includes the ExtVirtualLinkable capability
+        indicates that it can be pointed by
+        **tosca.relationships.nfv.VirtualLinksTo** relationship.
+
+      **Note**: This capability type is used in Casablanca how it does
+      not exist in the last SOL001 draft
+
+      **tosca.capabilities.nfv.VirtualCompute** and
+      **tosca.capabilities.nfv.VirtualStorage** includes flavours of VDU
+    
+
+ONAP TOSCA VNFD Requirements > TOSCA VNF Descriptor > Data Types
+----------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-54356`
+
+    The below table includes the data types used by NFV node and is based
+    on TOSCA/YAML constructs specified in draft GS NFV-SOL 001. The node
+    data definitions/attributes used in VNFD **MUST** comply with the below
+    table.
+    
+
+.. container:: note
+
+    :need:`R-54876`
+
+    The below table describes the data types used for LCM configuration
+    and is based on TOSCA constructs specified in draft GS NFV-SOL 001.
+    The LCM configuration data elements used in VNFD **MUST** comply
+    with the below table.
+    
+
+ONAP TOSCA VNFD Requirements > TOSCA VNF Descriptor > General
+-------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-15837`
+
+    The following table defines the major TOSCA  Types specified in
+    ETSI NFV-SOL001 standard draft. The VNFD provided by a VNF vendor
+    **MUST** comply with the below definitions:
+    
+
+.. container:: note
+
+    :need:`R-17852`
+
+    The VNFD **MAY** include TOSCA/YAML definitions that are not part of
+    NFV Profile. If provided, these definitions MUST comply with TOSCA
+    Simple Profile in YAML v.1.2.
+    
+
+.. container:: note
+
+    :need:`R-35854`
+
+    The VNF Descriptor (VNFD) provided by VNF vendor **MUST** comply with
+    TOSCA/YAML based Service template for VNF descriptor specified in
+    ETSI NFV-SOL001.
+
+    **Note**: As the ETSI NFV-SOL001 is work in progress the below tables
+    summarizes the TOSCA definitions agreed to be part of current version
+    of NFV profile and that VNFD MUST comply with in ONAP Release 2+
+    Requirements.
+    
+
+.. container:: note
+
+    :need:`R-46527`
+
+    A VNFD is a deployment template which describes a VNF in terms of
+    deployment and operational behavior requirements. It contains
+    virtualized resources (nodes) requirements as well as connectivity
+    and interfaces requirements and **MUST** comply with info elements
+    specified in ETSI GS NFV-IFA 011. 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
+        (VnfVld) and VNF External Connection Point Descriptors
+        (VnfExternalCpd);
+
+      - VNF deployment aspects: they are described in one or more
+        deployment flavours, including configurable parameters, instantiation
+        levels, placement constraints (affinity / antiaffinity), minimum and
+        maximum VDU instance numbers. Horizontal scaling is modeled with
+        scaling aspects and the respective scaling levels in the deployment
+        flavours;
+
+    **Note**: The deployment aspects (deployment flavour etc.) are postponed
+    for future ONAP releases.
+
+      - VNF lifecycle management (LCM) operations: describes the LCM operations
+        supported per deployment flavour, and their input parameters;
+        Note, thatthe actual LCM implementation resides in a different layer,
+        namely referring to additional template artifacts.
+    
+
+.. container:: note
+
+    :need:`R-65486`
+
+    The VNFD **MUST** comply with ETSI GS NFV-SOL001 document endorsing
+    the above mentioned NFV Profile and maintaining the gaps with the
+    requirements specified in ETSI GS NFV-IFA011 standard.
+    
+
+ONAP TOSCA VNFD Requirements > TOSCA VNF Descriptor > Interface Types
+---------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-32155`
+
+    The VNFD provided by VNF vendor may use the below described TOSCA
+    interface types. An on-boarding entity (ONAP SDC) **MUST** support them.
+
+      **tosca.interfaces.nfv.vnf.lifecycle.Nfv** supports LCM operations
+    
+
+ONAP TOSCA VNFD Requirements > TOSCA VNF Descriptor > Relationship Types
+------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-95321`
+
+    The VNFD provided by VNF vendor may use the below described TOSCA
+    relationships. An on-boarding entity (ONAP SDC) **MUST** support them.
+
+      **tosca.relationships.nfv.VirtualBindsTo**
+
+        This relationship type represents an association relationship between
+        VDU and CP node types.
+
+      **tosca.relationships.nfv.VirtualLinksTo**
+
+        This relationship type represents an association relationship between
+        the VduCpd's and VirtualLinkDesc node types.
+    
+
+ONAP TOSCA VNFD Requirements > VNF CSAR Package > VNF Package Contents
+----------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-01123`
+
+    The VNF package Manifest file **MUST** contain: VNF package meta-data, a
+    list of all artifacts (both internal and external) entry's including
+    their respected URI's, an algorithm to calculate a digest and a digest
+    result calculated on the content of each artifacts, as specified in
+    ETSI GS NFV-SOL004. The VNF Package MUST include VNF Identification
+    Data to uniquely identify the resource for a given VNF provider. The
+    identification data must include: an identifier for the VNF, the name
+    of the VNF as was given by the VNF provider, VNF description, VNF
+    provider, and version.
+    
+
+.. container:: note
+
+    :need:`R-10087`
+
+    The VNF package **MUST** contain all standard artifacts as specified in
+    ETSI GS NFV-SOL004 including Manifest file, VNFD (or Main TOSCA/YAML
+    based Service Template) and other optional artifacts. CSAR Manifest
+    file as per SOL004 - for example ROOT\\ **MainServiceTemplate.mf**
+    
+
+.. container:: note
+
+    :need:`R-21322`
+
+    The VNF provider **MUST** provide their testing scripts to support
+    testing as specified in ETSI NFV-SOL004 - Testing directory in CSAR
+    
+
+.. container:: note
+
+    :need:`R-26885`
+
+    The VNF provider **MUST** provide the binaries and images needed to
+    instantiate the VNF (VNF and VNFC images) either as:
+
+      - Local artifact in CSAR: ROOT\\Artifacts\\ **VNF_Image.bin**
+
+      - externally referred (by URI) artifact in Manifest file (also may be
+        referred by VNF Descriptor)
+
+    Note: Currently, ONAP doesn't have the capability of Image management,
+    we upload the image into VIM/VNFM manually.
+    
+
+.. container:: note
+
+    :need:`R-40820`
+
+    The VNF provider MUST enumerate all of the open source licenses
+    their VNF(s) incorporate. CSAR License directory as per ETSI SOL004.
+
+    for example ROOT\\Licenses\\ **License_term.txt**
+    
+
+ONAP TOSCA VNFD Requirements > VNF CSAR Package > VNF Package Structure and Format
+----------------------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-51347`
+
+    The VNF package **MUST** be arranged as a CSAR archive as specified in
+    TOSCA Simple Profile in YAML 1.2.
+    
+
+.. container:: note
+
+    :need:`R-87234`
+
+    The VNF package provided by a VNF vendor **MAY** be either with
+    TOSCA-Metadata directory (CSAR Option 1) or without TOSCA-Metadata
+    directory (CSAR Option 2) as specified in ETSI GS NFV-SOL004. On-boarding
+    entity (ONAP SDC) must support both options.
+
+    **Note:** SDC supports only the CSAR Option 1 in Casablanca. The Option 2
+    will be considered in future ONAP releases,
+    
+
+PNF Plug and Play > PNF Plug and Play
+-------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-01427`
+
+    The PNF **MUST** support the provisioning of security and authentication
+    parameters (HTTP username and password) in order to be able to authenticate
+    with DCAE (in ONAP).
+
+    Note: In R3, a username and password are used with the DCAE VES Event
+    Listener which are used for HTTP Basic Authentication.
+
+    Note: The configuration management and provisioning software are specific
+    to a vendor architecture.
+    
+
+.. container:: note
+
+    :need:`R-106240`
+
+    The following VES Events **MUST** be supported by the PNF: pnfRegistration
+    VES Event, HVol VES Event, and Fault VES Event. These are onboarded via
+    he SDC Design Studio.
+
+    Note: these VES Events are emitted from the PNF to support PNF Plug and
+    Play, High Volume Measurements, and Fault events respectively.
+    
+
+.. container:: note
+
+    :need:`R-17624`
+
+    The PNF **MAY** support the optional parameters for Service
+    Configuration Parameters.
+
+    Note: These are detailed in the Stage 5 PnP
+
+    Note: These parameters are optional, and not all PNFs will support any
+    or all of these parameters, it is up to the vendor and service provider
+    to ascertain which ones are supported up to an including all of the ones
+    that have been defined. Note: It is expected that there will be a growing
+    list of supported configuration parameters in future releases of ONAP.
+    
+
+.. container:: note
+
+    :need:`R-256347`
+
+    The PNF **MUST** support the Ansible protocol for a Service Configuration
+    message exchange between the PNF and PNF Controller (in ONAP).
+
+    Note: this exchange may be either Ansible, Chef, or NetConf depending on
+    the PNF. Note: The PNF Controller may be VF-C, APP-C or SDN-C based on the
+    PNF and PNF domain. Note: for R3 (Casablanca) only Ansible is supported.
+    
+
+.. container:: note
+
+    :need:`R-258352`
+
+    The PNF **MUST** support & accept the provisioning of an ONAP contact IP
+    address (in IPv4 or IPv6 format).
+
+    Note: For example, it a possibility is that an external EMS would configure
+    & provision the ONAP contact IP address to the PNF (in either IPv4 or
+    IPv6 format). For the PNF Plug and Play Use Case, this IP address is the
+    service provider's "point of entry" to the DCAE VES Listener.
+
+    Note: different service provider's network architecture may also require
+    special setup to allow an external PNF to contact the ONAP installation.
+    For example, in the AT&T network, a maintenance tunnel is used to access
+    ONAP.
+    
+
+.. container:: note
+
+    :need:`R-284934`
+
+    If the PNF encounters an error authenticating, reaching the ONAP DCAE VES
+    Event listener or recieves an error response from sending the pnfRegistration
+    VES Event, it **MAY** log the error, and notify the operator.
+
+    Note: the design of how errors are logged, retrieved and reported
+    will be a vendor-specific architecture. Reporting faults and errors
+    is also a vendor specific design. It is expected that the PNF shall
+    have a means to log an error and notify a user when a fault condition
+    occurs in trying to contact ONAP, authenticate or send a pnfRegistration
+    event.
+    
+
+.. container:: note
+
+    :need:`R-378131`
+
+    (Error Case) - If an error is encountered by the PNF during a
+    Service Configuration exchange with ONAP, the PNF **MAY** log the
+    error and notify an operator.
+    
+
+.. container:: note
+
+    :need:`R-56718`
+
+    The PNF Vendor **MAY** provide software version(s) to be supported by PNF
+    for SDC Design Studio PNF Model. This is set in the PNF Model property
+    software_versions.
+    
+
+.. container:: note
+
+    :need:`R-579051`
+
+    The PNF **MAY** support a HTTP connection to the DCAE VES Event Listener.
+
+    Note: HTTP is allowed but not recommended.
+    
+
+.. container:: note
+
+    :need:`R-638216`
+
+    (Error Case) - The PNF **MUST** support a configurable timer to stop the
+    periodicity sending of the pnfRegistration VES event. If this timer expires
+    during a Service Configuration exchange between the PNF and ONAP, it
+    MAY log a time-out error and notify an operator.
+
+    Note: It is expected that each vendor will enforce and define a PNF
+    service configuration timeout period. This is because the PNF cannot
+    wait indefinitely as there may also be a technician on-site trying to
+    complete installation & commissioning. The management of the VES event
+    exchange is also a requirement on the PNF to be developed by the PNF
+    vendor.
+    
+
+.. container:: note
+
+    :need:`R-686466`
+
+    The PNF **MUST** support sending a pnfRegistration VES event.
+    
+
+.. container:: note
+
+    :need:`R-707977`
+
+    When the PNF receives a Service configuration from ONAP, the PNF **MUST**
+    cease sending the pnfRegistration VES Event.
+    
+
+.. container:: note
+
+    :need:`R-763774`
+
+    The PNF **MUST** support a HTTPS connection to the DCAE VES Event
+    Listener.
+    
+
+.. container:: note
+
+    :need:`R-793716`
+
+    The PNF **MUST** have "ONAP Aware" software which is capable of performing
+    PNF PnP registration with ONAP. The "ONAP Aware" software is capable of
+    performing the PNF PnP Registration with ONAP MUST either be loaded
+    separately or integrated into the PNF software upon physical delivery
+    and installation of the PNF.
+
+    Note: It is up to the specific vendor to design the software management
+    functions.
+    
+
+.. container:: note
+
+    :need:`R-809261`
+
+    The PNF **MUST** use a IP address to contact ONAP.
+
+    Note: it is expected that an ONAP operator can ascertain the ONAP IP
+    address or the security gateway to reach ONAP on the VID or ONAP portal
+    GUI.
+
+    Note: The ONAP contact IP address has been previously configured and
+    provisioned prior to this step.
+
+    Note: The ONAP IP address could be provisioned or resolved through
+    FQDN & DNS.
+    
+
+.. container:: note
+
+    :need:`R-894004`
+
+    When the PNF sets up a HTTP or HTTPS connection, it **MUST** provide a
+    username and password to the DCAE VES Collector for HTTP Basic
+    Authentication.
+
+    Note: HTTP Basic Authentication has 4 steps: Request, Authenticate,
+    Authorization with Username/Password Credentials, and Authentication Status
+    as per RFC7617 and RFC 2617.
+    
+
+.. container:: note
+
+    :need:`R-952314`
+
+    If the PNF set up a TLS connection and mutual (two-way) authentication is
+    being used, then the PNF **MUST** provide its own X.509v3 Certificate to
+    the DCAE VES Collector for authentication.
+
+    Note: This allows TLS authentication by DCAE VES Collector.
+
+    Note: The PNF got its X.509 certificate through Enrollment with an
+    operator certificate authority or a X.509 vendor certificate from the
+    vendor factory CA.
+
+    Note: In R3 three authentication options are supported:
+
+    (1) HTTP with Username & Password and no TLS.
+
+    (2) HTTP with Username & Password & TLS with two-way certificate
+        authentication.
+
+    (3) HTTP with Username & Password & TLS with server-side
+        certificate authentication.
+    
+
+.. container:: note
+
+    :need:`R-980039`
+
+    The PNF **MUST** send the pnfRegistration VES event periodically.
+    
+
+.. container:: note
+
+    :need:`R-981585`
+
+    The pnfRegistration VES event periodicity **MUST** be configurable.
+
+    Note: The PNF uses the service configuration request as a semaphore to
+    stop sending the pnfRegistration sent. See the requirement PNP-5360
+    requirement.
+    
+
+Resource IDs
+------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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.  (e.g., ``{vm-type}_{index}_{network-role}``).
+    
+
+.. container:: note
+
+    :need:`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.
+      (e.g., ``{vm-type}_{index}_int_{network-role}``).
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`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}``.
+    
+
+Resource IDs > Contrail Heat Resources Resource ID Naming Convention > OS::ContrailV2::VirtualNetwork
+-----------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-99110`
+
+    A VNF's Heat Orchestration Template's Resource
+    ``OS::ContrailV2::VirtualNetwork`` Resource ID **MUST** use the naming convention
+
+    1) ``int_{network-role}_network``
+
+    or
+
+    2) ``int_{network-role}_RVN`` where RVN represents Resource Virtual
+       Network
+
+    VNF Heat Orchestration Templates can only create internal networks.
+    There is no ``{index}`` after ``{network-role}`` because ``{network-role}``
+    **MUST** be unique in the scope of the VNF's
+    Heat Orchestration Template.
+
+    Note that option 1 is preferred.
+    
+
+Resource IDs > OpenStack Heat Resources Resource ID Naming Convention > OS::Neutron::Net
+----------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-25720`
+
+    A VNF's Heat Orchestration Template's Resource ``OS::Neutron::Net``
+    Resource ID **MUST** use the naming convention
+
+    * ``int_{network-role}_network``
+
+    VNF Heat Orchestration Templates can only create internal networks.
+    There is no ``{index}`` after ``{network-role}`` because ``{network-role}``
+    **MUST** be unique in the scope of the VNF's
+    Heat Orchestration Template.
+    
+
+Resource: OS::Neutron::Port - Parameters > Introduction > Items to Note
+-----------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-48880`
+
+    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``
+      **MUST NOT** be used
+    
+
+.. container:: note
+
+    :need:`R-45602`
+
+    If a VNF's Port is attached to a network (internal or external)
+    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``
+      **MAY** be used
+    
+
+.. container:: note
+
+    :need:`R-70964`
+
+    If a VNF's Port is attached to an internal network and the port's
+    IP addresses are statically 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``
+      **MUST NOT** be used
+    
+
+Resource: OS::Neutron::Port - Parameters > Property: allowed_address_pairs, Map Property: ip_address > VIP Assignment, External Networks, Supported by Automation
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-41492`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an external network (per the
+    ONAP definition, see Requirement R-57424),
+    and an IPv4 Virtual IP (VIP)
+    address is assigned via ONAP automation
+    using the property ``allowed_address_pairs``
+    map property ``ip_address`` and
+    the parameter name **MUST** follow the
+    naming convention
+
+      * ``{vm-type}_{network-role}_floating_ip``
+
+    where
+
+      * ``{vm-type}`` is the {vm-type} associated with the
+        OS::Nova::Server
+      * ``{network-role}`` is the {network-role} of the external
+        network
+
+    And the parameter **MUST** be declared as type ``string``.
+    
+
+.. container:: note
+
+    :need:`R-35735`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an external network (per the
+    ONAP definition, see Requirement R-57424),
+    and an IPv6 Virtual IP (VIP)
+    address is assigned via ONAP automation
+    using the property ``allowed_address_pairs``
+    map property ``ip_address``,
+    the parameter name **MUST** follow the
+    naming convention
+
+      * ``{vm-type}_{network-role}_floating_v6_ip``
+
+    where
+
+      * ``{vm-type}`` is the {vm-type} associated with the
+        OS::Nova::Server
+      * ``{network-role}`` is the {network-role} of the external
+        network
+
+    And the parameter **MUST** be declared as type ``string``.
+    
+
+Resource: OS::Neutron::Port - Parameters > Property: fixed_ips, Map Property: ip_address
+----------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-40971`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an external network (per the
+    ONAP definition, see Requirement R-57424),
+    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
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`R-04697`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an external network (per the
+    ONAP definition, see Requirement R-57424),
+    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
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`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}_v6_ip_{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.
+    
+
+.. container:: note
+
+    :need:`R-85235`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an internal network (per the
+    ONAP definition, see Requirements R-52425 and R-46461),
+    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
+    
+
+.. container:: note
+
+    :need:`R-23503`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an external network (per the
+    ONAP definition, see Requirement R-57424),
+    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
+    
+
+.. container:: note
+
+    :need:`R-27818`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an internal network (per the
+    ONAP definition, see RRequirements R-52425 and R-46461),
+    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
+    
+
+.. container:: note
+
+    :need:`R-71577`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an external network (per the
+    ONAP definition, see Requirement R-57424),
+    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
+    
+
+.. container:: note
+
+    :need:`R-78380`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an internal network (per the
+    ONAP definition, see Requirements R-52425 and R-46461),
+    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
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`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}_v6_ip_{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.
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`R-29765`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an internal network (per the
+    ONAP definition, see Requirements R-52425 and R-46461),
+    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
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+Resource: OS::Neutron::Port - Parameters > Property: fixed_ips, Map Property: subnet
+------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-38236`
+
+    The VNF's Heat Orchestration Template's
+    resource ``OS::Neutron::Port`` property ``fixed_ips``
+    map property ``subnet`` parameter
+    **MUST** be declared type ``string``.
+    
+
+.. container:: note
+
+    :need:`R-76160`
+
+    When
+
+      * the VNF's Heat Orchestration Template's
+        resource ``OS::Neutron::Port`` in an Incremental Module is attaching
+        to an internal network (per the ONAP definition, see Requirements
+        R-52425 and R-46461)
+        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``,
+
+    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.
+    
+
+.. container:: note
+
+    :need:`R-22288`
+
+    The VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` property ``fixed_ips``
+    map property ``subnet`` parameter
+    ``int_{network-role}_v6_subnet_id``
+    **MUST NOT** be enumerated in the
+    VNF's Heat Orchestration Template's Environment File.
+    
+
+.. container:: note
+
+    :need:`R-83677`
+
+    The VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` property ``fixed_ips``
+    map property ``subnet`` parameter
+    ``{network-role}_subnet_id``
+    **MUST NOT** be enumerated in the
+    VNF's Heat Orchestration Template's Environment File.
+    
+
+.. container:: note
+
+    :need:`R-15287`
+
+    When the VNF's Heat Orchestration Template's
+    resource ``OS::Neutron::Port`` is attaching
+    to an external network (per the ONAP definition, see
+    Requirement R-57424),
+    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``, the parameter
+    **MUST** follow the naming convention
+
+      * ``{network-role}_v6_subnet_id``
+
+    where
+
+      * ``{network-role}`` is the network role of the network.
+    
+
+.. container:: note
+
+    :need:`R-84123`
+
+    When
+
+      * the VNF's Heat Orchestration Template's
+        resource ``OS::Neutron::Port`` in an Incremental Module is attaching
+        to an internal network (per the ONAP definition, see
+        Requirements R-52425 and R-46461)
+        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``,
+
+    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.
+    
+
+.. container:: note
+
+    :need:`R-80829`
+
+    The VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` property ``fixed_ips``
+    map property ``subnet`` parameter
+    ``{network-role}_v6_subnet_id``
+    **MUST NOT** be enumerated in the
+    VNF's Heat Orchestration Template's Environment File.
+    
+
+.. container:: note
+
+    :need:`R-69634`
+
+    The VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` property ``fixed_ips``
+    map property ``subnet`` parameter
+    ``int_{network-role}_subnet_id``
+    **MUST NOT** be enumerated in the
+    VNF's Heat Orchestration Template's Environment File.
+    
+
+.. container:: note
+
+    :need:`R-62802`
+
+    When the VNF's Heat Orchestration Template's
+    resource ``OS::Neutron::Port`` is attaching
+    to an external network (per the ONAP definition, see
+    Requirement R-57424),
+    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``, the parameter
+    **MUST** follow the naming convention
+
+      * ``{network-role}_subnet_id``
+
+    where
+
+      * ``{network-role}`` is the network role of the network.
+    
+
+Resource: OS::Neutron::Port - Parameters > Property: network
+------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-62983`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an external network (per the
+    ONAP definition, see Requirement R-57424), 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.
+    
+
+.. container:: note
+
+    :need:`R-93177`
+
+    When the VNF's Heat Orchestration Template's resource
+    ``OS::Neutron::Port`` is attaching to an internal network (per the
+    ONAP definition, see Requirements R-52425 and R-46461),
+    and the internal network is created in the
+    same Heat Orchestration Template as the ``OS::Neutron::Port``,
+    the ``network`` property value **MUST** obtain the UUID
+    of the internal network by using the intrinsic function
+    ``get_resource``
+    and referencing the Resource ID of the internal network.
+    
+
+.. container:: note
+
+    :need:`R-29872`
+
+    The VNF's Heat Orchestration Template's Resource ``OS::Neutron::Port``
+    property ``network``
+    parameter **MUST NOT** be enumerated in the Heat Orchestration
+    Template's Environment File.
+    
+
+.. container:: note
+
+    :need:`R-86182`
+
+    When the VNF's Heat Orchestration Template's Resource
+    ``OS::Neutron::Port`` is attaching to an internal network (per the
+    ONAP definition, see Requirements R-52425 and R-46461),
+    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.
+    
+
+Resource: OS::Nova::Server - Parameters
+---------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-304011`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource's
+
+    * Resource ID
+    * property ``image`` parameter name
+    * property ``flavor`` parameter name
+    * property ``name`` parameter name
+
+
+    **MUST** contain the identical ``{vm-type}``
+    and **MUST** follow the naming conventions defined
+    in R-58670, R-45188, R-54171, R-87817, and R-29751.
+    
+
+Resource: OS::Nova::Server - Parameters > Property: Name
+--------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-663631`
+
+    The VNF's Heat Orchestration Template's Resource ``OS::Nova::Server``
+    property ``name`` value **MUST** be be obtained via a ``get_param``.
+    
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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``.
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`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 delcared for
+    each ``OS::Nova::Server`` resource associated with the ``{vm-type}``.
+    
+
+Resource: OS::Nova::Server - Parameters > Property: Name > Contrail Issue with Values for OS::Nova::Server Property Name
+------------------------------------------------------------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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: --- \" ! $ ' (\ \ ) = ~ ^ | @ ` { } [ ] > , . _
+    
+
+Resource: OS::Nova::Server - Parameters > Property: availability_zone
+---------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-01359`
+
+    A VNF's Heat Orchestration 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.
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+Resource: OS::Nova::Server - Parameters > Property: flavor
+----------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-481670`
+
+    The VNF's Heat Orchestration Template's Resource ``OS::Nova::Server``
+    property ``flavor`` value **MUST** be be obtained via a ``get_param``.
+    
+
+Resource: OS::Nova::Server - Parameters > Property: image
+---------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-901331`
+
+    The VNF's Heat Orchestration Template's Resource ``OS::Nova::Server``
+    property ``image`` value **MUST** be be obtained via a ``get_param``.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > environment_context
+--------------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-56183`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata``key/value pair ``environment_context``
+    parameter ``environment_context`` **MUST NOT**
+    have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-20308`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``environment_context``
+    parameter **MUST** be declared as ``environment_context`` and the
+    parameter type **MUST** be defined as type: ``string``.
+    
+
+.. container:: note
+
+    :need:`R-13194`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``environment_context`` **MUST NOT**
+    be enumerated in the Heat Orchestration Template's environment file.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > vf_module_id
+-------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-98374`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource property
+    ``metadata`` key/value pair ``vf_module_id`` parameter ``vf_module_id``
+    **MUST NOT**
+    have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-71493`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` **MUST**
+    contain the key/value pair ``vf_module_id``
+    and the value MUST be obtained via a ``get_param``.
+    
+
+.. container:: note
+
+    :need:`R-72871`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource property
+    ``metadata`` key/value pair ``vf_module_id`` parameter ``vf_module_id``
+    **MUST NOT**
+    be enumerated in the Heat Orchestration Template's environment file.
+    
+
+.. container:: note
+
+    :need:`R-86237`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``vf_module_id`` is passed into a
+    Nested YAML
+    file, the key/value pair name ``vf_module_id`` **MUST NOT** change.
+    
+
+.. container:: note
+
+    :need:`R-82134`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource property
+    ``metadata`` key/value pair ``vf_module_id`` parameter **MUST**
+    be declared as ``vf_module_id`` and the parameter **MUST**
+    be defined as type: ``string``.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > vf_module_index
+----------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-37039`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``vf_module_index`` parameter
+    ``vf_module_index`` **MUST NOT**
+    be enumerated in the Heat Orchestration Template's environment file.
+    
+
+.. container:: note
+
+    :need:`R-50816`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server``
+    resource  property ``metadata`` **MAY**
+    contain the key/value pair ``vf_module_index``
+    and the value **MUST** be obtained via a ``get_param``.
+    
+
+.. container:: note
+
+    :need:`R-09811`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vf_module_index`` **MUST NOT**
+    have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-55306`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vf_module_index`` **MUST NOT**
+    be used in a ``OS::Cinder::Volume`` resource and **MUST NOT** be
+    used in VNF's Volume template;
+    it is not supported.
+    
+
+.. container:: note
+
+    :need:`R-54340`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``vf_module_index`` parameter **MUST**
+    be declared as ``vf_module_index`` and the parameter **MUST** be
+    defined as type: ``number``.
+    
+
+.. container:: note
+
+    :need:`R-22441`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vf_module_index`` is passed into a
+    Nested YAML file, the key/value pair
+    ``vf_module_index`` **MUST NOT** change.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > vf_module_name
+---------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-15480`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``vf_module_name`` parameter ``vf_module_name``
+    **MUST NOT** have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-80374`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vf_module_name``
+    parameter ``vf_module_name`` **MUST NOT**
+    be enumerated in the Heat Orchestration Template's environment file.
+    
+
+.. container:: note
+
+    :need:`R-39067`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``vf_module_name`` parameter **MUST** be
+    declared as ``vf_module_name`` and the parameter **MUST**
+    be defined as type: ``string``.
+    
+
+.. container:: note
+
+    :need:`R-68023`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` **SHOULD**
+    contain the key/value pair ``vf_module_name`` and the value **MUST**
+    be obtained via a ``get_param``.
+    
+
+.. container:: note
+
+    :need:`R-49177`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vf_module_name`` is passed into a
+    Nested YAML
+    file, the key/value pair name ``vf_module_name`` **MUST NOT** change.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > vm_role
+--------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-67597`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vm_role`` parameter ``vm_role``
+    **MUST NOT** have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-86476`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vm_role`` value **MUST**
+    only contain alphanumeric characters and underscores (i.e., '_').
+    
+
+.. container:: note
+
+    :need:`R-70757`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vm_role`` is passed into a Nested
+    YAML
+    file, the key/value pair name ``vm_role`` **MUST NOT** change.
+    
+
+.. container:: note
+
+    :need:`R-95430`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server``
+    resource property
+    ``metadata`` key/value pair ``vm_role`` value is obtained via
+    ``get_param``, the parameter **MUST** be declared as ``vm_role``
+    and the parameter **MUST** be defined as type: ``string``.
+    
+
+.. container:: note
+
+    :need:`R-85328`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource property
+    ``metadata`` **MAY**
+    contain the key/value pair ``vm_role`` and the value **MUST** be
+    obtained either via
+
+    - ``get_param``
+    - hard coded in the key/value pair ``vm_role``.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > vnf_id
+-------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-55218`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server``
+    resource property
+    ``metadata`` key/value pair ``vnf_id`` parameter ``vnf_id`` **MUST NOT**
+    have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-37437`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server``
+    resource property ``metadata`` **MUST**
+    contain the  key/value pair ``vnf_id``
+    and the value **MUST** be obtained via a ``get_param``.
+    
+
+.. container:: note
+
+    :need:`R-44491`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``vnf_id`` is passed into a Nested YAML
+    file, the key/value pair name ``vnf_id`` **MUST NOT** change.
+    
+
+.. container:: note
+
+    :need:`R-07507`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server``
+    resource property
+    ``metadata`` key/value pair ``vnf_id`` parameter
+    **MUST** be declared as ``vnf_id`` and the parameter **MUST**
+    be defined as type: ``string``.
+    
+
+.. container:: note
+
+    :need:`R-20856`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server``
+    resource property
+    ``metadata`` key/value pair ``vnf_id`` parameter ``vnf_id`` **MUST NOT**
+    be enumerated in the Heat Orchestration Template's environment file.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > vnf_name
+---------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-36542`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vnf_name`` parameter
+    ``vnf_name`` **MUST NOT**
+    be enumerated in the Heat Orchestration Template's environment file.
+    
+
+.. container:: note
+
+    :need:`R-16576`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property
+    ``metadata`` key/value pair ``vnf_name`` is passed into a Nested YAML
+    file, the key/value pair name ``vnf_name`` **MUST NOT** change.
+    
+
+.. container:: note
+
+    :need:`R-44318`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vnf_name``
+    parameter ``vnf_name`` **MUST NOT**
+    have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-72483`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource property
+    ``metadata`` **MUST** contain the key/value pair ``vnf_name`` and the
+    value **MUST** be obtained via a ``get_param``.
+    
+
+.. container:: note
+
+    :need:`R-62428`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``vnf_name`` parameter **MUST**
+    be declared as ``vnf_name`` and the parameter **MUST** be defined as
+    type: ``string``.
+    
+
+Resource: OS::Nova::Server Metadata Parameters > workload_context
+-----------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-34055`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``workload_context``
+    parameter ``workload_context`` **MUST NOT**
+    have parameter constraints defined.
+    
+
+.. container:: note
+
+    :need:`R-75202`
+
+    If a VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``workload_context``
+    is passed into a Nested YAML
+    file, the key/value pair name ``workload_context`` **MUST NOT** change.
+    
+
+.. container:: note
+
+    :need:`R-74978`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``workload_context``
+    parameter **MUST**
+    be declared as ``workload_context`` and the parameter **MUST**
+    be defined as type: ``string``.
+    
+
+.. container:: note
+
+    :need:`R-02691`
+
+    A VNF's Heat Orchestration Template's ``OS::Nova::Server`` resource
+    property ``metadata`` key/value pair ``workload_context``
+    parameter ``workload_context`` **MUST NOT**
+    be enumerated in the Heat Orchestration Template's environment file.
+    
+
+VNF On-boarding and package management > Resource Description
+-------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-22346`
+
+    The VNF package MUST provide `VES Event Registration <https://onap.readthedocs.io/en/latest/submodules/vnfsdk/model.git/docs/files/VESEventRegistration.html>`_ for all VES events provided by that xNF.
+    
+
+VNF On-boarding and package management > Testing
+------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-43958`
+
+    The xNF Package **MUST** include documentation describing
+    the tests that were conducted by the xNF provider and the test results.
+    
+
+VNF Resiliency > Virtual Function - Container Recovery Requirements
+-------------------------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-46851`
+
+    The VNF **MUST** support ONAP Controller's Evacuate command.
+    
+
+.. container:: note
+
+    :need:`R-48761`
+
+    The VNF **MUST** support ONAP Controller's Snapshot command.
+    
+
+VNF Security > VNF API Security Requirements
+--------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-21210`
+
+    The VNF **MUST** implement the following input validation control
+    on APIs: Validate that any input file has a correct and valid
+    Multipurpose Internet Mail Extensions (MIME) type. Input files
+    should be tested for spoofed MIME types.
+    
+
+.. container:: note
+
+    :need:`R-54930`
+
+    The VNF **MUST** implement the following input validation controls:
+    Do not permit input that contains content or characters inappropriate
+    to the input expected by the design. Inappropriate input, such as
+    SQL expressions, may cause the system to execute undesirable and
+    unauthorized transactions against the database or allow other
+    inappropriate access to the internal network (injection attacks).
+    
+
+.. container:: note
+
+    :need:`R-43884`
+
+    The VNF **SHOULD** integrate with the Operator's authentication and
+    authorization services (e.g., IDAM).
+    
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-02137
+
+    The VNF **MUST** implement all monitoring and logging as
+    described in the Security Analytics section.
+    
+
+.. container:: note
+
+    R-15659
+
+    The VNF **MUST** restrict changing the criticality level of
+    a system security alarm to administrator(s).
+    
+
+.. container:: note
+
+    R-19367
+
+    The VNF **MUST** monitor API invocation patterns to detect
+    anomalous access patterns that may represent fraudulent access or
+    other types of attacks, or integrate with tools that implement anomaly
+    and abuse detection.
+    
+
+.. container:: note
+
+    R-19804
+
+    The VNF **MUST** validate the CA signature on the certificate,
+    ensure that the date is within the validity period of the certificate,
+    check the Certificate Revocation List (CRL), and recognize the identity
+    represented by the certificate where PKI-based authentication is used.
+    
+
+.. container:: note
+
+    R-23772
+
+    The VNF **MUST** validate input at all layers implementing VNF APIs.
+    
+
+.. container:: note
+
+    R-25878
+
+    The VNF **MUST** use certificates issued from publicly
+    recognized Certificate Authorities (CA) for the authentication process
+    where PKI-based authentication is used.
+    
+
+.. container:: note
+
+    R-37608
+
+    The VNF **MUST** provide a mechanism to restrict access based
+    on the attributes of the VNF and the attributes of the subject.
+    
+
+.. container:: note
+
+    R-78066
+
+    The VNF **MUST** support requests for information from law
+    enforcement and government agencies.
+    
+
+.. container:: note
+
+    R-87135
+
+    The VNF **MUST** comply with NIST standards and industry
+    best practices for all implementations of cryptography.
+    
+
+VNF Security > VNF Cryptography Requirements
+--------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-49109`
+
+    The VNF **MUST** support HTTP/S using TLS v1.2 or higher
+    with strong cryptographic ciphers.
+    
+
+.. container:: note
+
+    :need:`R-48080`
+
+    The VNF **SHOULD** support an automated certificate management protocol
+    such as CMPv2, Simple Certificate Enrollment Protocol (SCEP) or
+    Automated Certificate Management Environment (ACME).
+    
+
+.. container:: note
+
+    :need:`R-93860`
+
+    The VNF **SHOULD** provide the capability to integrate with an
+    external encryption service.
+    
+
+VNF Security > VNF Data Protection Requirements
+-----------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-58964`
+
+    The VNF **MUST** provide the capability to restrict read
+    and write access to data handled by the VNF.
+    
+
+.. container:: note
+
+    :need:`R-95864`
+
+    The VNF **MUST** support digital certificates that comply with X.509
+    standards.
+    
+
+.. container:: note
+
+    :need:`R-69610`
+
+    The VNF **MUST** provide the capability of using X.509 certificates
+    issued by an external Certificate Authority.
+    
+
+.. container:: note
+
+    :need:`R-73067`
+
+    The VNF **MUST** use NIST and industry standard cryptographic
+    algorithms and standard modes of operations when implementing
+    cryptography.
+    
+
+.. container:: note
+
+    :need:`R-32641`
+
+    The VNF **MUST** provide the capability to encrypt data on
+    non-volatile memory.Non-volative memory is storage that is
+    capable of retaining data without electrical power, e.g.
+    Complementary metal-oxide-semiconductor (CMOS) or hard drives.
+    
+
+.. container:: note
+
+    :need:`R-70933`
+
+    The VNF **MUST** provide the ability to migrate to newer
+    versions of cryptographic algorithms and protocols with minimal impact.
+    
+
+.. container:: note
+
+    :need:`R-12467`
+
+    The VNF **MUST NOT** use compromised encryption algorithms.
+    For example, SHA, DSS, MD5, SHA-1 and Skipjack algorithms.
+    Acceptable algorithms can be found in the NIST FIPS publications
+    (https://csrc.nist.gov/publications/fips) and in the
+    NIST Special Publications (https://csrc.nist.gov/publications/sp).
+    
+
+.. container:: note
+
+    :need:`R-02170`
+
+    The VNF **MUST** use, whenever possible, standard implementations
+    of security applications, protocols, and formats, e.g., S/MIME, TLS, SSH,
+    IPSec, X.509 digital certificates for cryptographic implementations.
+    These implementations must be purchased from reputable vendors or obtained
+    from reputable open source communities and must not be developed in-house.
+    
+
+.. container:: note
+
+    :need:`R-47204`
+
+    The VNF **MUST** be capable of protecting the confidentiality and integrity
+    of data at rest and in transit from unauthorized access and modification.
+    
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-22645
+
+    The VNF **SHOULD** use commercial algorithms only when there
+    are no applicable governmental standards for specific cryptographic
+    functions, e.g., public key cryptography, message digests.
+    
+
+.. container:: note
+
+    R-99112
+
+    The VNF **MUST** provide the capability to restrict access
+    to data to specific users.
+    
+
+VNF Security > VNF General Security Requirements
+------------------------------------------------
+
+
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-638682`
+
+    The VNF **MUST** log any security event required by the VNF Requirements to
+    Syslog using LOG_AUTHPRIV for any event that would contain sensitive
+    information and LOG_AUTH for all other relevant events.
+    
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-21819`
+
+    The VNF **MUST** provide functionality that enables the Operator to comply
+    with requests for information from law enforcement and government agencies.
+    
+
+.. container:: note
+
+    :need:`R-23882`
+
+    The VNF **SHOULD** provide the capability for the Operator to run security
+    vulnerability scans of the operating system and all application layers.
+    
+
+.. container:: note
+
+    :need:`R-92207`
+
+    The VNF **SHOULD** provide a mechanism for performing automated
+    system configuration auditing at configurable time intervals.
+    
+
+.. container:: note
+
+    :need:`R-19082`
+
+    The VNF **MUST** allow the Operator to disable or remove any security
+    testing tools or programs included in the VNF, e.g., password cracker,
+    port scanner.
+    
+
+.. container:: note
+
+    :need:`R-40813`
+
+    The VNF **SHOULD** support the use of virtual trusted platform
+    module.
+    
+
+.. container:: note
+
+    :need:`R-61354`
+
+    The VNF **MUST** provide a mechanism (e.g., access control list) to
+    permit and/or restrict access to services on the VNF by source,
+    destination, protocol, and/or port.
+    
+
+.. container:: note
+
+    :need:`R-19768`
+
+    The VNF **SHOULD** support Layer 3 VPNs that enable segregation of
+    traffic by application (i.e., AVPN, IPSec VPN for Internet routes).
+    
+
+.. container:: note
+
+    :need:`R-69649`
+
+    The VNF Provider **MUST** have patches available for vulnerabilities
+    in the VNF as soon as possible. Patching shall be controlled via change
+    control process with vulnerabilities disclosed along with
+    mitigation recommendations.
+    
+
+.. container:: note
+
+    :need:`R-99771`
+
+    The VNF **MUST** have all code (e.g., QCOW2) and configuration files
+    (e.g., HEAT template, Ansible playbook, script) hardened, or with
+    documented recommended configurations for hardening and interfaces that
+    allow the Operator to harden the VNF. Actions taken to harden a system
+    include disabling all unnecessary services, and changing default values
+    such as default credentials and community strings.
+    
+
+.. container:: note
+
+    :need:`R-23740`
+
+    The VNF **MUST** implement and enforce the principle of least privilege
+    on all protected interfaces.
+    
+
+.. container:: note
+
+    :need:`R-62498`
+
+    The VNF **MUST** support encrypted access protocols, e.g., TLS,
+    SSH, SFTP.
+    
+
+.. container:: note
+
+    :need:`R-80335`
+
+    For all GUI and command-line interfaces, the VNF **MUST** provide the
+    ability to present a warning notice that is set by the Operator. A warning
+    notice is a formal statement of resource intent presented to everyone
+    who accesses the system.
+    
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-26586
+
+    The VNF **SHOULD** support the ability to work with aliases
+    (e.g., gateways, proxies) to protect and encapsulate resources.
+    
+
+.. container:: note
+
+    R-33981
+
+    The VNF **SHOULD** interoperate with various access control
+    mechanisms for the Network Cloud execution environment (e.g.,
+    Hypervisors, containers).
+    
+
+.. container:: note
+
+    R-39342
+
+    The VNF **MUST**, if not using the NCSP's IDAM API, comply
+    with "password changes (includes default passwords)" policy. Products
+    will support password aging, syntax and other credential management
+    practices on a configurable basis.
+    
+
+.. container:: note
+
+    R-40521
+
+    The VNF **MUST**, if not using the NCSP's IDAM API, support
+    use of common third party authentication and authorization tools such
+    as TACACS+, RADIUS.
+    
+
+.. container:: note
+
+    R-42681
+
+    The VNF **MUST** use the NCSP's IDAM API or comply with
+    the requirements if not using the NCSP's IDAM API, for identification,
+    authentication and access control of OA&M and other system level
+    functions.
+    
+
+.. container:: note
+
+    R-49956
+
+    The VNF **MUST** pass all access to applications (Bearer,
+    signaling and OA&M) through various security tools and platforms from
+    ACLs, stateful firewalls and application layer gateways depending on
+    manner of deployment. The application is expected to function (and in
+    some cases, interwork) with these security tools.
+    
+
+.. container:: note
+
+    R-52085
+
+    The VNF **MUST**, if not using the NCSP's IDAM API, provide
+    the ability to support Multi-Factor Authentication (e.g., 1st factor =
+    Software token on device (RSA SecureID); 2nd factor = User Name+Password,
+    etc.) for the users.
+    
+
+.. container:: note
+
+    R-55830
+
+    The VNF **MUST** distribute all production code from NCSP
+    internal sources only. No production code, libraries, OS images, etc.
+    shall be distributed from publically accessible depots.
+    
+
+.. container:: note
+
+    R-63217
+
+    The VNF **MUST**, if not using the NCSP's IDAM API, support
+    logging via ONAP for a historical view of "who did what and when."
+    
+
+.. container:: note
+
+    R-68589
+
+    The VNF **MUST**, if not using the NCSP's IDAM API, support
+    User-IDs and passwords to uniquely identify the user/application. VNF
+    needs to have appropriate connectors to the Identity, Authentication
+    and Authorization systems that enables access at OS, Database and
+    Application levels as appropriate.
+    
+
+.. container:: note
+
+    R-85633
+
+    The VNF **MUST** implement Data Storage Encryption
+    (database/disk encryption) for Sensitive Personal Information (SPI)
+    and other subscriber identifiable data.
+
+    Note: Subscribers SPI/data must be encrypted at rest, and other
+    subscriber identifiable data should be encrypted at rest. Other
+    data protection requirements exist and should be well understood
+    by the developer.
+    
+
+VNF Security > VNF Identity and Access Management Requirements
+--------------------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-59391`
+
+    The VNF **MUST NOT** not allow the assumption of the permissions of
+    another account to mask individual accountability.
+    
+
+.. container:: note
+
+    :need:`R-15671`
+
+    The VNF **MUST** provide access controls that allow the Operator
+    to restrict access to VNF functions and data to authorized entities.
+    
+
+.. container:: note
+
+    :need:`R-75041`
+
+    The VNF **MUST**, if not integrated the Operator's Identity and Access
+    Management system, support configurable password expiration.
+    
+
+.. container:: note
+
+    :need:`R-99174`
+
+    The VNF **MUST** allow the creation of multiple IDs so that
+    individual accountability can be supported.
+    
+
+.. container:: note
+
+    :need:`R-23135`
+
+    The VNF **MUST** authenticate all access to protected GUIs, CLIs,
+    and APIs.
+    
+
+.. container:: note
+
+    :need:`R-46908`
+
+    The VNF **MUST**, if not integrated with the Operator's Identity
+    and Access Management system, comply with "password complexity"
+    policy. When passwords are used, they shall be complex and shall at
+    least meet the following password construction requirements: (1) be a
+    minimum configurable number of characters in length, (2) include 3 of
+    the 4 following types of characters: upper-case alphabetic, lower-case
+    alphabetic, numeric, and special, (3) not be the same as the UserID
+    with which they are associated or other common strings as specified
+    by the environment, (4) not contain repeating or sequential characters
+    or numbers, (5) not to use special characters that may have command
+    functions, and (6) new passwords must not contain sequences of three
+    or more characters from the previous password.
+    
+
+.. container:: note
+
+    :need:`R-42874`
+
+    The VNF **MUST** allow the Operator to restrict access based on
+    the assigned permissions associated with an ID in order to support
+    Least Privilege (no more privilege than required to perform job
+    functions).
+    
+
+.. container:: note
+
+    :need:`R-98391`
+
+    The VNF **MUST**, if not integrated with the Operator's Identity and
+    Access Management system, support Role-Based Access Control to enforce
+    least privilege.
+    
+
+.. container:: note
+
+    :need:`R-71787`
+
+    Each layer of the VNF **MUST** support access restriction
+    independently of all other layers so that Segregation of Duties
+    can be implemented.
+    
+
+.. container:: note
+
+    :need:`R-79107`
+
+    The VNF **MUST**, if not integrated with the Operator's Identity
+    and Access Management system, support the ability to disable the
+    userID after a configurable number of consecutive unsuccessful
+    authentication attempts using the same userID.
+    
+
+.. container:: note
+
+    :need:`R-86835`
+
+    The VNF **MUST** set the default settings for user access
+    to deny authorization, except for a super user type of account.
+    When a VNF is added to the network, nothing should be able to use
+    it until the super user configures the VNF to allow other users
+    (human and application)  have access.
+    
+
+.. container:: note
+
+    :need:`R-85419`
+
+    The VNF **SHOULD** support OAuth 2.0 authorization using an external
+    Authorization Server.
+    
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-05470
+
+    The VNF **MUST** host connectors for access to the database layer.
+    
+
+.. container:: note
+
+    R-14025
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for Session Hijacking.
+    
+
+.. container:: note
+
+    R-19790
+
+    The VNF **MUST NOT** include authentication credentials
+    in security audit logs, even if encrypted.
+    
+
+.. container:: note
+
+    R-24825
+
+    The VNF **MUST** provide Context awareness data (device,
+    location, time, etc.) and be able to integrate with threat detection system.
+    
+
+.. container:: note
+
+    R-29301
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for Password Attacks.
+    
+
+.. container:: note
+
+    R-31412
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for XSS / CSRF.
+    
+
+.. container:: note
+
+    R-31751
+
+    The VNF **MUST** subject VNF provider access to privilege
+    reconciliation tools to prevent access creep and ensure correct
+    enforcement of access policies.
+    
+
+.. container:: note
+
+    R-44032
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for Man in the Middle (MITM).
+    
+
+.. container:: note
+
+    R-45496
+
+    The VNF **MUST** host connectors for access to the OS (Operating System) layer.
+    
+
+.. container:: note
+
+    R-49945
+
+    The VNF **MUST** authorize VNF provider access through a
+    client application API by the client application owner and the resource
+    owner of the VNF before provisioning authorization through Role Based
+    Access Control (RBAC), Attribute Based Access Control (ABAC), or other
+    policy based mechanism.
+    
+
+.. container:: note
+
+    R-51883
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for Replay.
+    
+
+.. container:: note
+
+    R-58977
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for Eavesdropping.
+    
+
+.. container:: note
+
+    R-58998
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for Malware (Key Logger).
+    
+
+.. container:: note
+
+    R-72243
+
+    The VNF **MUST** provide or support the Identity and Access
+    Management (IDAM) based threat detection data for Phishing / SMishing.
+    
+
+.. container:: note
+
+    R-73541
+
+    The VNF **MUST** use access controls for VNFs and their
+    supporting computing systems at all times to restrict access to
+    authorized personnel only, e.g., least privilege. These controls
+    could include the use of system configuration or access control
+    software.
+    
+
+.. container:: note
+
+    R-77157
+
+    The VNF **MUST** conform to approved request, workflow
+    authorization, and authorization provisioning requirements when
+    creating privileged users.
+    
+
+.. container:: note
+
+    R-85028
+
+    The VNF **MUST** authenticate system to system access and
+    do not conceal a VNF provider user's individual accountability for
+    transactions.
+    
+
+.. container:: note
+
+    R-89753
+
+    The VNF **MUST NOT** install or use systems, tools or
+    utilities capable of capturing or logging data that was not created
+    by them or sent specifically to them in production, without
+    authorization of the VNF system owner.
+    
+
+.. container:: note
+
+    R-95105
+
+    The VNF **MUST** host connectors for access to the application layer.
+    
+
+VNF Security > VNF Security Analytics Requirements
+--------------------------------------------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`R-74958`
+
+    The VNF **MUST** activate security alarms automatically when
+    it detects an unsuccessful attempt to gain permissions
+    or assume the identity of another user.
+    
+
+.. container:: note
+
+    :need:`R-29705`
+
+    The VNF **MUST** restrict changing the criticality level of a
+    system security alarm to users with administrative privileges.
+    
+
+.. container:: note
+
+    :need:`R-43332`
+
+    The VNF **MUST** activate security alarms automatically when
+    it detects the successful modification of a critical system or
+    application file.
+    
+
+.. container:: note
+
+    :need:`R-41825`
+
+    The VNF **MUST** activate security alarms automatically when
+    a configurable number of consecutive unsuccessful login attempts
+    is reached.
+    
+
+.. container:: note
+
+    :need:`R-94525`
+
+    The VNF **MUST** log connections to the network listeners of the
+    resource.
+    
+
+.. container:: note
+
+    :need:`R-04492`
+
+    The VNF **MUST** generate security audit logs that can be sent
+    to Security Analytics Tools for analysis.
+    
+
+.. container:: note
+
+    :need:`R-07617`
+
+    The VNF **MUST** log success and unsuccessful creation, removal, or
+    change to the inherent privilege level of users.
+    
+
+.. container:: note
+
+    :need:`R-34552`
+
+    The VNF **MUST** be implemented so that it is not vulnerable to OWASP
+    Top 10 web application security risks.
+    
+
+.. container:: note
+
+    :need:`R-58370`
+
+    The VNF **MUST** operate with anti-virus software which produces
+    alarms every time a virus is detected.
+    
+
+.. container:: note
+
+    :need:`R-63330`
+
+    The VNF **MUST** detect when its security audit log storage
+    medium is approaching capacity (configurable) and issue an alarm.
+    
+
+.. container:: note
+
+    :need:`R-54520`
+
+    The VNF **MUST** log successful and unsuccessful authentication
+    attempts, e.g., authentication associated with a transaction,
+    authentication to create a session, authentication to assume elevated
+    privilege.
+    
+
+.. container:: note
+
+    :need:`R-30932`
+
+    The VNF **MUST** log successful and unsuccessful access to VNF
+    resources, including data.
+    
+
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    R-08598
+
+    The VNF **MUST** log successful and unsuccessful changes to a privilege level.
+    
+
+.. container:: note
+
+    R-19219
+
+    The VNF **MUST** provide audit logs that include user ID, dates,
+    times for log-on and log-off, and terminal location at minimum.
+    
+
+.. container:: note
+
+    R-20912
+
+    The VNF **MUST** support alternative monitoring capabilities
+    when VNFs do not expose data or control traffic or use proprietary and
+    optimized protocols for inter VNF communication.
+    
+
+.. container:: note
+
+    R-25094
+
+    The VNF **MUST** perform data capture for security functions.
+    
+
+.. container:: note
+
+    R-31961
+
+    The VNF **MUST** support integrated DPI/monitoring functionality
+    as part of VNFs (e.g., PGW, MME).
+    
+
+.. container:: note
+
+    R-56786
+
+    The VNF **MUST** implement "Closed Loop" automatic implementation
+    (without human intervention) for Known Threats with detection rate in low
+    false positives.
+    
+
+.. container:: note
+
+    R-57271
+
+    The VNF **MUST** provide the capability of generating security
+    audit logs by interacting with the operating system (OS) as appropriate.
+    
+
+.. container:: note
+
+    R-61648
+
+    The VNF **MUST** support event logging, formats, and delivery
+    tools to provide the required degree of event data to ONAP.
+    
+
+{network-role}
+--------------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+.. container:: note
+
+    :need:`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_``.
+    
+
+.. container:: note
+
+    :need:`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.
+    
+
+{vm-type}
+---------
+
+
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    
+
+.. container:: note
+
+    :need:`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`` resource property ``flavor`` value
+
+      2.) ``OS::Nova::Server`` resource 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.
+    
+
+.. container:: note
+
+    :need:`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 (i.e., ``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.
+    
+
+.. container:: note
+
+    :need:`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_``.
+    
index a40c781..a1beb06 100644 (file)
@@ -1,5 +1,5 @@
 {
-    "created": "2018-10-15T22:34:19.210493",
+    "created": "2018-10-19T12:54:42.782400",
     "current_version": "casablanca",
     "project": "",
     "versions": {
             "needs_amount": 750
         },
         "casablanca": {
-            "created": "2018-10-15T22:34:19.210426",
+            "created": "2018-10-19T12:54:42.782400",
             "needs": {
                 "R-00011": {
                     "description": "A VNF's Heat Orchestration Template's parameter defined\nin a nested YAML file\n**MUST NOT** have a parameter constraint defined.",
                     "validation_mode": ""
                 },
                 "R-01123": {
-                    "description": "The VNF package Manifest file **MUST** contain: VNF package meta-data, a\nlist of all artifacts (both internal and external) entry\u2019s including\ntheir respected URI\u2019s, an algorithm to calculate a digest and a digest\nresult calculated on the content of each artifacts, as specified in\nETSI GS NFV-SOL004. The VNF Package MUST include VNF Identification\nData to uniquely identify the resource for a given VNF provider. The\nidentification data must include: an identifier for the VNF, the name\nof the VNF as was given by the VNF provider, VNF description, VNF\nprovider, and version.",
+                    "description": "The VNF package Manifest file **MUST** contain: VNF package meta-data, a\nlist of all artifacts (both internal and external) entry's including\ntheir respected URI's, an algorithm to calculate a digest and a digest\nresult calculated on the content of each artifacts, as specified in\nETSI GS NFV-SOL004. The VNF Package MUST include VNF Identification\nData to uniquely identify the resource for a given VNF provider. The\nidentification data must include: an identifier for the VNF, the name\nof the VNF as was given by the VNF provider, VNF description, VNF\nprovider, and version.",
                     "full_title": "",
                     "hide_links": "",
                     "id": "R-01123",
                     "section_name": "workload_context",
                     "sections": [
                         "workload_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_id",
                     "sections": [
                         "vnf_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_index",
                     "sections": [
                         "vf_module_index",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "environment_context",
                     "sections": [
                         "environment_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_name",
                     "sections": [
                         "vf_module_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_name",
                     "sections": [
                         "vnf_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "environment_context",
                     "sections": [
                         "environment_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_id",
                     "sections": [
                         "vnf_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_index",
                     "sections": [
                         "vf_module_index",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "validation_mode": ""
                 },
                 "R-32641": {
-                    "description": "The VNF **MUST** provide the capability to encrypt data on\nnon-volatile memory.Non-volative memory is storage that is\ncapable of retaining data without electrical power, e.g.\nComplementary metal\u2013oxide\u2013semiconductor (CMOS) or hard drives.",
+                    "description": "The VNF **MUST** provide the capability to encrypt data on\nnon-volatile memory.Non-volative memory is storage that is\ncapable of retaining data without electrical power, e.g.\nComplementary metal-oxide-semiconductor (CMOS) or hard drives.",
                     "full_title": "",
                     "hide_links": "",
                     "id": "R-32641",
                     "section_name": "workload_context",
                     "sections": [
                         "workload_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_name",
                     "sections": [
                         "vnf_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_index",
                     "sections": [
                         "vf_module_index",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_id",
                     "sections": [
                         "vnf_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_name",
                     "sections": [
                         "vf_module_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_name",
                     "sections": [
                         "vnf_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_id",
                     "sections": [
                         "vnf_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "validation_mode": "static"
                 },
                 "R-46851": {
-                    "description": "The VNF **MUST** support ONAP Controller\u2019s Evacuate command.",
+                    "description": "The VNF **MUST** support ONAP Controller's Evacuate command.",
                     "full_title": "",
                     "hide_links": "",
                     "id": "R-46851",
                     "section_name": "workload_context",
                     "sections": [
                         "workload_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "validation_mode": ""
                 },
                 "R-48761": {
-                    "description": "The VNF **MUST** support ONAP Controller\u2019s Snapshot command.",
+                    "description": "The VNF **MUST** support ONAP Controller's Snapshot command.",
                     "full_title": "",
                     "hide_links": "",
                     "id": "R-48761",
                     "section_name": "vf_module_name",
                     "sections": [
                         "vf_module_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_index",
                     "sections": [
                         "vf_module_index",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_index",
                     "sections": [
                         "vf_module_index",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_id",
                     "sections": [
                         "vnf_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_index",
                     "sections": [
                         "vf_module_index",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "environment_context",
                     "sections": [
                         "environment_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_name",
                     "sections": [
                         "vnf_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "environment_context",
                     "sections": [
                         "environment_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vm_role",
                     "sections": [
                         "vm_role",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_name",
                     "sections": [
                         "vf_module_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vm_role",
                     "sections": [
                         "vm_role",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_id",
                     "sections": [
                         "vf_module_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vnf_name",
                     "sections": [
                         "vnf_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_id",
                     "sections": [
                         "vf_module_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "workload_context",
                     "sections": [
                         "workload_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "workload_context",
                     "sections": [
                         "workload_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_name",
                     "sections": [
                         "vf_module_name",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_id",
                     "sections": [
                         "vf_module_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vm_role",
                     "sections": [
                         "vm_role",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_id",
                     "sections": [
                         "vf_module_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vm_role",
                     "sections": [
                         "vm_role",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "environment_context",
                     "sections": [
                         "environment_context",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "validation_mode": "static"
                 },
                 "R-95321": {
-                    "description": "The VNFD provided by VNF vendor may use the below described TOSCA\nrelationships. An on-boarding entity (ONAP SDC) **MUST** support them.\n\n  **tosca.relationships.nfv.VirtualBindsTo**\n\n    This relationship type represents an association relationship between\n    VDU and CP node types.\n\n  **tosca.relationships.nfv.VirtualLinksTo**\n\n    This relationship type represents an association relationship between\n    the VduCpd\u2019s and VirtualLinkDesc node types.",
+                    "description": "The VNFD provided by VNF vendor may use the below described TOSCA\nrelationships. An on-boarding entity (ONAP SDC) **MUST** support them.\n\n  **tosca.relationships.nfv.VirtualBindsTo**\n\n    This relationship type represents an association relationship between\n    VDU and CP node types.\n\n  **tosca.relationships.nfv.VirtualLinksTo**\n\n    This relationship type represents an association relationship between\n    the VduCpd's and VirtualLinkDesc node types.",
                     "full_title": "",
                     "hide_links": "",
                     "id": "R-95321",
                     "section_name": "vm_role",
                     "sections": [
                         "vm_role",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
                     "section_name": "vf_module_id",
                     "sections": [
                         "vf_module_id",
-                        "Resource: OS::Nova::Server Metadata Parameters"
+                        "Resource: OS::Nova::Server Metadata Parameters"
                     ],
                     "status": null,
                     "tags": [],
index b906b66..a36c68a 100644 (file)
@@ -21,6 +21,12 @@ Version: 3.0.0
 
 :Release Date: In Progress (Casablanca Release)
 
+A detailed summary of all requirement changes per section can be found
+:doc:`here <changes-by-section-casablanca>`.
+
+A higher level summary of changes as well as non-requirement impacting
+changes can be found below.
+
 **New Features**
     - Added R-17528 to Heat section regarding Nested YAML requirements
 
@@ -106,7 +112,9 @@ Version: 1.0.0
     - Initial release of VNF Provider Guidelines and Requirements for
       Open Network Automation Platform (ONAP)
 
-    - This intitial releases is based on seed documents that came from Open-O and Open ECOMP. For details, refer `Seed Document Mappings to VNFRQTS Deliverable Outlines <https://wiki.onap.org/display/DW/Seed+Document+Mappings+to+VNFRQTS+Deliverable+Outlines>`_.
+    - This initial releases is based on seed documents that came from Open-O
+      and Open ECOMP. For details, refer
+      `Seed Document Mappings to VNFRQTS Deliverable Outlines <https://wiki.onap.org/display/DW/Seed+Document+Mappings+to+VNFRQTS+Deliverable+Outlines>`_.
 
     - This release provides a consolidated list of requirements as prototype
       text for RFPs to acquire VNFs to run in an ONAP context. The
@@ -118,8 +126,8 @@ Version: 1.0.0
 **Known Issues**
     - `VNFRQTS-83 Chapter 5, Section B Requirements <https://jira.onap.org/browse/VNFRQTS-83>`_.
 
-    - Heat requirments have not been formatted into the standard
-      format used througout the document.
+    - Heat requirements have not been formatted into the standard
+      format used throughout the document.
 
     - Therefore they are not included in the summary of requirements
       listed in Appendix 8.d.
diff --git a/gen_requirement_changes.py b/gen_requirement_changes.py
new file mode 100644 (file)
index 0000000..2661c59
--- /dev/null
@@ -0,0 +1,312 @@
+# -*- coding: utf8 -*-
+# org.onap.vnfrqts/requirements
+# ============LICENSE_START====================================================
+# Copyright © 2018 AT&T Intellectual Property. All rights reserved.
+#
+# Unless otherwise specified, all software contained herein is licensed
+# under the Apache License, Version 2.0 (the "License");
+# you may not use this software except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#             http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Unless otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#             https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ============LICENSE_END============================================
+
+"""
+This script will generate an summary of the requirements changes between
+two version's of requirements by analyzing the needs.json file.  The template
+can be customized by updating release-requirement-changes.rst.jinja2.
+"""
+from itertools import groupby, chain
+import json
+import os
+import re
+import sys
+import argparse
+from operator import itemgetter
+
+import jinja2
+
+REQ_JSON_URL = "https://onap.readthedocs.io/en/latest/_downloads/needs.json"
+NEEDS_PATH = "docs/data/needs.json"
+JINJA_TEMPLATE = "release-requirement-changes.rst.jinja2"
+
+
+def check(predicate, msg):
+    """
+    Raises a ``RuntimeError`` if the given predicate is false.
+
+    :param predicate: Predicate to evaluate
+    :param msg: Error message to use if predicate is false
+    """
+    if not predicate:
+        raise RuntimeError(msg)
+
+
+class DifferenceFinder:
+    """
+    Class takes a needs.json data structure and finds the differences
+    between two different versions of the requirements
+    """
+
+    def __init__(self, needs, current_version, prior_version):
+        """
+        Determine the differences between the ``current_version`` and the
+        ``prior_version`` of the given requirements.
+
+        :param needs:           previously loaded needs.json file
+        :param current_version: most recent version to compare against
+        :param prior_version:   a prior version
+        :return:
+        """
+        self.needs = needs
+        self.current_version = current_version
+        self.prior_version = prior_version
+        self._validate()
+
+    def _validate(self):
+        """
+        Validates the inputs to the ``DifferenceFinder`` constructor.
+
+        :raises RuntimeError: if the file is not structured properly or the
+                              given versions can't be found.
+        """
+        check(self.needs is not None, "needs cannot be None")
+        check(isinstance(self.needs, dict), "needs must be be a dict")
+        check("versions" in self.needs, "needs file not properly formatted")
+        for version in (self.current_version, self.prior_version):
+            check(
+                version in self.needs["versions"],
+                "Version " + version + " was not found in the needs file",
+            )
+
+    @property
+    def current_requirements(self):
+        """Returns a dict of requirement ID to requirement metadata"""
+        return self.get_version(self.current_version)
+
+    @property
+    def prior_requirements(self):
+        """Returns a dict of requirement ID to requirement metadata"""
+        return self.get_version(self.prior_version)
+
+    def get_version(self, version):
+        """Returns a dict of requirement ID to requirement metadata"""
+        return self.needs["versions"][version]["needs"]
+
+    @property
+    def new_requirements(self):
+        """Requirements added since the prior version"""
+        new_ids = self.current_ids.difference(self.prior_ids)
+        return self.filter_needs(self.current_requirements, new_ids)
+
+    @property
+    def current_ids(self):
+        """Returns a set of the requirement IDs for the current version"""
+        return set(self.current_requirements.keys())
+
+    @property
+    def prior_ids(self):
+        """Returns a set of the requirement IDs for the prior version"""
+        return set(self.prior_requirements.keys())
+
+    @property
+    def removed_requirements(self):
+        """Requirements that were removed since the prior version"""
+        removed_ids = self.prior_ids.difference(self.current_ids)
+        return self.filter_needs(self.prior_requirements, removed_ids)
+
+    @property
+    def changed_requirements(self):
+        """"Requirements where the description changed since the last version"""
+        common_ids = self.prior_ids.intersection(self.current_ids)
+        result = {}
+        for r_id in common_ids:
+            current_text = self.current_requirements[r_id]["description"]
+            prior_text = self.prior_requirements[r_id]["description"]
+            if not self.is_equivalent(current_text, prior_text):
+                sections = self.current_requirements[r_id]["sections"]
+                result[r_id] = {
+                    "id": r_id,
+                    "description": current_text,
+                    "sections": sections,
+                }
+        return result
+
+    def is_equivalent(self, current_text, prior_text):
+        """Returns true if there are meaningful differences between the
+        text.  See normalize for more information"""
+        return self.normalize(current_text) == self.normalize(prior_text)
+
+    @staticmethod
+    def normalize(text):
+        """Strips out formatting, line breaks, and repeated spaces to normalize
+         the string for comparison.  This ensures minor formatting changes
+         are not tagged as meaningful changes"""
+        s = text.lower()
+        s = s.replace("\n", " ")
+        s = re.sub(r'[`*\'"]', "", s)
+        s = re.sub(r"\s+", " ", s)
+        return s
+
+    @staticmethod
+    def filter_needs(needs, ids):
+        """
+        Return the requirements with the given ids
+
+        :ids: sequence of requirement IDs
+        :returns: dict of requirement ID to requirement data for only the
+                 requirements in ``ids``
+        """
+        return {r_id: data for r_id, data in needs.items() if r_id in ids}
+
+
+def load_requirements(path):
+    """Load the requirements from the needs.json file"""
+    if not (os.path.exists(path)):
+        print("needs.json not found.  Run tox -e docs to generate it.")
+        sys.exit(1)
+    with open(path, "r") as req_file:
+        return json.load(req_file)
+
+
+def parse_args():
+    """Parse the command-line arguments and return the arguments:
+
+    args.current_version
+    args.prior_version
+    """
+    parser = argparse.ArgumentParser(
+        description="Generate RST summarizing requirement changes between "
+        "two given releases. The resulting RST file will be "
+        "written to the docs/ directory"
+    )
+    parser.add_argument(
+        "current_version", help="Current release in lowercase (ex: casablanca)"
+    )
+    parser.add_argument("prior_version",
+                        help="Prior release to compare against")
+    return parser.parse_args()
+
+
+def tag(dicts, key, value):
+    """Adds the key value to each dict in the sequence"""
+    for d in dicts:
+        d[key] = value
+    return dicts
+
+
+def gather_section_changes(diffs):
+    """
+    Return a list of dicts that represent the changes for a given section path.
+    [
+        {
+         "section_path": path,
+         "added: [req, ...],
+         "updated: [req, ...],
+         "removed: [req, ...],
+        },
+        ...
+    ]
+    :param diffs: instance of DifferenceFinder
+    :return: list of section changes
+    """
+    # Add "change" and "section_path" keys to all requirements
+    reqs = list(
+        chain(
+            tag(diffs.new_requirements.values(), "change", "added"),
+            tag(diffs.changed_requirements.values(), "change", "updated"),
+            tag(diffs.removed_requirements.values(), "change", "removed"),
+        )
+    )
+    for req in reqs:
+        req["section_path"] = " > ".join(reversed(req["sections"]))
+
+    # Build list of changes by section
+    reqs = sorted(reqs, key=itemgetter("section_path"))
+    all_changes = []
+    for section, section_reqs in groupby(reqs, key=itemgetter("section_path")):
+        change = itemgetter("change")
+        section_reqs = sorted(section_reqs, key=change)
+        section_changes = {"section_path": section}
+        for change, change_reqs in groupby(section_reqs, key=change):
+            section_changes[change] = list(change_reqs)
+        if any(k in section_changes for k in ("added", "updated", "removed")):
+            all_changes.append(section_changes)
+    return all_changes
+
+
+def render_to_file(template_path, output_path, **context):
+    """Read the template and render it ot the output_path using the given
+    context variables"""
+    with open(template_path, "r") as infile:
+        t = jinja2.Template(infile.read())
+    result = t.render(**context)
+    with open(output_path, "w") as outfile:
+        outfile.write(result)
+    print()
+    print("Writing requirement changes to " + output_path)
+    print(
+        "Please be sure to update the docs/release-notes.rst document "
+        "with a link to this document"
+    )
+
+
+def print_invalid_metadata_report(difference_finder, current_version):
+    """Write a report to the console for any instances where differences
+    are detected, but teh appropriate :introduced: or :updated: metadata
+    is not applied to the requirement."""
+    print("Validating Metadata...")
+    print()
+    print("Requirements Added, but Missing :introduced: Attribute")
+    print("----------------------------------------------------")
+    for req in difference_finder.new_requirements.values():
+        if "introduced" not in req or req["introduced"] != current_version:
+            print(req["id"])
+    print()
+    print("Requirements Changed, but Missing :updated: Attribute")
+    print("-----------------------------------------------------")
+    for req in difference_finder.changed_requirements.values():
+        if "updated" not in req or req["updated"] != current_version:
+            print(req["id"])
+
+
+if __name__ == "__main__":
+    args = parse_args()
+    requirements = load_requirements(NEEDS_PATH)
+    differ = DifferenceFinder(requirements,
+                              args.current_version,
+                              args.prior_version)
+
+    print_invalid_metadata_report(differ, args.current_version)
+
+    changes = gather_section_changes(differ)
+    render_to_file(
+        "release-requirement-changes.rst.jinja2",
+        "docs/changes-by-section-" + args.current_version + ".rst",
+        changes=changes,
+        current_version=args.current_version,
+        prior_version=args.prior_version,
+        num_added=len(differ.new_requirements),
+        num_removed=len(differ.removed_requirements),
+        num_changed=len(differ.changed_requirements),
+    )
diff --git a/release-requirement-changes.rst.jinja2 b/release-requirement-changes.rst.jinja2
new file mode 100644 (file)
index 0000000..60a4717
--- /dev/null
@@ -0,0 +1,77 @@
+.. Modifications Copyright © 2017-2018 AT&T Intellectual Property.
+
+.. Licensed under the Creative Commons License, Attribution 4.0 Intl.
+   (the "License"); you may not use this documentation except in compliance
+   with the License. You may obtain a copy of the License at
+
+.. https://creativecommons.org/licenses/by/4.0/
+
+.. Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+Requirement Changes Introduced in {{ current_version|title }}
+========================================================
+
+This document summarizes the requirement changes by section that were
+introduced between the {{ prior_version|title }} release and
+{{ current_version|title }} release. Click on the requirement number to
+navigate to the
+
+.. contents::
+    :depth: 2
+
+Summary of Changes
+------------------
+
+* **Requirements Added:** {{ num_added }}
+* **Requirements Changed:** {{ num_changed }}
+* **Requirements Removed:** {{ num_removed }}
+
+{% for section_change in changes %}
+{{ section_change.section_path }}
+{{ "-"*section_change.section_path|length }}
+
+{% if section_change.added %}
+Requirements Added
+~~~~~~~~~~~~~~~~~~
+    {% for req in section_change.added %}
+
+.. container:: note
+
+    :need:`{{ req.id }}`
+
+{{ req.description|indent(first=True)}}
+    {% endfor %}
+{% endif -%}
+
+{% if section_change.updated %}
+Requirements Changed
+~~~~~~~~~~~~~~~~~~~~
+    {% for req in section_change.updated %}
+
+.. container:: note
+
+    :need:`{{ req.id }}`
+
+{{ req.description|indent(first=True)}}
+    {% endfor %}
+{% endif -%}
+
+{% if section_change.removed %}
+Requirements Removed
+~~~~~~~~~~~~~~~~~~~~
+    {% for req in section_change.removed %}
+
+.. container:: note
+
+    {{ req.id }}
+
+{{ req.description|indent(first=True)}}
+    {% endfor %}
+{% endif -%}
+
+{% endfor %}