From efb8f384941889d8d7fa469fecebe9b0e8169065 Mon Sep 17 00:00:00 2001 From: "Bozawglanian, Hagop (hb755d)" Date: Wed, 12 Sep 2018 22:48:10 +0000 Subject: [PATCH] VNFRQTS - update HEAT Batch 2 Including changes for sections 5.6 - 5.9 Issue-ID: VNFRQTS-438 Change-Id: I9bfcaf52cd41a523ff6f6b4dd1cd32bc731d47d2 Signed-off-by: Bozawglanian, Hagop (hb755d) --- docs/Chapter5/Heat/ONAP Heat Cinder Volumes.rst | 122 ++-- .../ONAP Heat Support of Environment Files.rst | 30 +- .../Heat/ONAP Heat Template Constructs.rst | 629 +++++++++++---------- docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst | 20 +- docs/data/needs.json | 214 +++---- docs/heat_picture3.png | Bin 0 -> 103529 bytes 6 files changed, 480 insertions(+), 535 deletions(-) create mode 100755 docs/heat_picture3.png diff --git a/docs/Chapter5/Heat/ONAP Heat Cinder Volumes.rst b/docs/Chapter5/Heat/ONAP Heat Cinder Volumes.rst index 90fb33b..8c10e4b 100644 --- a/docs/Chapter5/Heat/ONAP Heat Cinder Volumes.rst +++ b/docs/Chapter5/Heat/ONAP Heat Cinder Volumes.rst @@ -45,8 +45,8 @@ while others **MAY** be included. As stated in :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'. +the Output Parameter is of the type ``comma_delimited_list``, +then the corresponding input parameter **MUST** be declared as type ``json``. A single volume module must create only the volumes required by a single Incremental module or Base module. @@ -79,94 +79,90 @@ Optional Property availability_zone :id: R-25190 :target: VNF :keyword: SHOULD NOT + :updated: casablanca - A VNF's Heat Orchestration Template's Resource 'OS::Cinder::Volume' - **SHOULD NOT** declare the property 'availability_zone'. + A VNF's Heat Orchestration Template's Resource ``OS::Cinder::Volume`` + **SHOULD NOT** declare the property ``availability_zone``. If the property is used, the value **MUST** -be enumerated in the environment file and must be set to nova', which +be enumerated in the environment file and must be set to ``nova``, which is the default. There are no requirements on the parameter naming convention with the exception that the naming convention **MUST NOT** be the -same as the 'OS::Nova::Server' property 'availability_zone' (i.e., -'availability_zone_{index}'). +same as the ``OS::Nova::Server`` property ``availability_zone`` (i.e., +``availability_zone_{index}``). Optional Property volume_type ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -OpenStack supports multiple volume types. If the OS::Cinder::Volume optional -property volume_type is not specified, the OpenStack default volume type is -used. If a specific volume type is required, the property is used and -the value **MUST** be enumerated in the environment file. There are no -requirements on the parameter naming convention +OpenStack supports multiple volume types. If the ``OS::Cinder::Volume`` +optional property ``volume_type`` is not specified, the OpenStack default +``volume type`` is used. If a specific volume type is required, the property +is used and the value **MUST** be enumerated in the environment file. There +are no requirements on the parameter naming convention. Cinder Volume Examples ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *Examples: Volume Template* -A VNF has a Cinder volume module, named incremental\_volume.yaml, that -creates an independent Cinder volume for a VM in the module -incremental.yaml. The incremental\_volume.yaml defines a parameter in -the output section, lb\_volume\_id\_0 which is the UUID of the cinder -volume. lb\_volume\_id\_0 is defined as a parameter in incremental.yaml. -ONAP captures the UUID value of lb\_volume\_id\_0 from the volume module +A VNF has a Cinder volume module, named incremental_volume.yaml, +that creates an independent Cinder volume for a VM in the module +incremental.yaml. The incremental_volume.yaml defines a parameter in +the output section, dns_volume_id_0 which is the UUID of the cinder volume. +dns_volume_id_0 is defined as a parameter in incremental.yaml. +ONAP captures the UUID value of dns_volume_id_0 from the volume module output statement and provides the value to the incremental module. Note that the example below is not a complete Heat Orchestration -Template. The {vm-type} has been defined as "lb" for load balancer +Template. The {vm-type} has been defined as "dns". -incremental\_volume.yaml +incremental_volume.yaml .. code-block:: yaml - parameters: + parameters: vnf_name: - type: string - lb_volume_size_0: - type: number - ... + type: string + dns_volume_size_0: + type: number + ... - resources: + resources: dns_volume_0: - type: OS::Cinder::Volume - properties: - name: - str_replace: - template: VNF_NAME_volume_0 - params: - VNF_NAME: { get_param: vnf_name } - size: {get_param: dns_volume_size_0} - ... - - outputs: - lb_volume_id_0: - value: {get_resource: dns_volume_0} - ... - + type: OS::Cinder::Volume + properties: + name: + str_replace: + template: VNF_NAME_volume_0 + params: + VNF_NAME: { get_param: vnf_name } + size: {get_param: dns_volume_size_0} + ... + outputs: + dns_volume_id_0: + value: {get_resource: dns_volume_0} + ... incremental.yaml .. code-block:: yaml - parameters: - lb_name_0: - type: string - lb_volume_id_0: - type: string - ... - - resources: - lb_0: - type: OS::Nova::Server - properties: - name: {get_param: dns_name_0} - networks: - ... - - lb_0_volume_attach: - type: OS::Cinder::VolumeAttachment - properties: - instance_uuid: { get_resource: lb_0 } - volume_id: { get_param: lb_volume_id_0 } - - + parameters: + dns_server_0: + type: string + dns_volume_id_0: + type: string + ... + + resources: + dns_server_0: + type: OS::Nova::Server + properties: + name: {get_param: dns_name_0} + networks: + ... + dns_volume_attach_0: + type: OS::Cinder::VolumeAttachment + properties: + instance_uuid: { get_resource: dns_server_0 } + volume_id: { get_param: dns_volume_id_0 } diff --git a/docs/Chapter5/Heat/ONAP Heat Support of Environment Files.rst b/docs/Chapter5/Heat/ONAP Heat Support of Environment Files.rst index ba8cd68..aed56e5 100644 --- a/docs/Chapter5/Heat/ONAP Heat Support of Environment Files.rst +++ b/docs/Chapter5/Heat/ONAP Heat Support of Environment Files.rst @@ -12,32 +12,14 @@ mandatory. A Heat Orchestration Template uploaded to ONAP must have a corresponding environment file, even if no parameters are required to be enumerated. -(Note that ONAP does not programmatically enforce the use of -an environment file.) +*(Note that ONAP does not programmatically enforce the use of +an environment file.)* -.. req:: - :id: R-67205 - :target: VNF - :keyword: MUST +As stated in :need:`R-38474`, :need:`R-81725`, and :need:`R-53433`: - The VNF Heat Orchestration Template **MUST** have a corresponding - environment file for a Base Module. - -.. req:: - :id: R-35727 - :target: VNF - :keyword: MUST - - The VNF Heat Orchestration Template **MUST** have a - corresponding environment file for an Incremental module. - -.. req:: - :id: R-22656 - :target: VNF - :keyword: MUST - - The VNF Heat Orchestration Template **MUST** have a - corresponding environment file for a Cinder Volume Module. + * A VNF's Base Module **MUST** have a corresponding Environment File. + * A VNF's Incremental Module **MUST** have a corresponding Environment File. + * A VNF's Cinder Volume Module **MUST** have a corresponding environment File. A nested heat template must not have an environment file; OpenStack does not support it. diff --git a/docs/Chapter5/Heat/ONAP Heat Template Constructs.rst b/docs/Chapter5/Heat/ONAP Heat Template Constructs.rst index f24d2f4..76ec0c1 100644 --- a/docs/Chapter5/Heat/ONAP Heat Template Constructs.rst +++ b/docs/Chapter5/Heat/ONAP Heat Template Constructs.rst @@ -21,11 +21,13 @@ either statically by repeated definition or dynamically by using the resource OS::Heat::ResourceGroup. Nested Heat Template Requirements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -ONAP supports nested Heat Orchestration Templates. A Base Module, -Incremental Module, and Cinder Volume Module may use nested heat. +ONAP supports nested Heat Orchestration Templates. +As stated in Requirements :need:`R-36582`, :need:`R-56721`, and +:need:`R-30395`, a Base Module, Incremental Module, and Cinder Volume +Module may use nested heat. .. req:: :id: R-00228 @@ -39,42 +41,50 @@ Incremental Module, and Cinder Volume Module may use nested heat. :id: R-01101 :target: VNF :keyword: MAY + :updated: casablanca A VNF's Heat Orchestration Template **MAY** reference the nested heat dynamically using the resource - 'OS::Heat::ResourceGroup'. + ``OS::Heat::ResourceGroup``. .. req:: :id: R-60011 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca A VNF's Heat Orchestration Template **MUST** have no more than two levels of nesting. -As stated in :need:`R-67231` a VNF's Heat Orchestration template's -Environment File's **MUST NOT** contain the "resource_registry:" section. +.. req:: + :id: R-70112 + :target: VNF + :keyword: MUST + :validation_mode: static + :introduced: casablanca + + 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. Two levels of nesting is defined as follows: A base module, incremental module, or cinder volume module references a nested heat file either -statically or by using the resource 'OS::Heat::ResourceGroup'. -This file is the first level of nesting. -If first level file then references a nested file, that file is -the second level of nesting. - +statically or by using the resource ``OS::Heat::ResourceGroup``. +The referenced YAML heat file is the first level of nested heat. +If first level nested YAML file references a nested heat file, that file is +the second level of nested heat. -.. req:: - :id: R-89868 - :target: VNF - :keyword: MUST - - The VNF Heat Orchestration Template **MUST** have unique - file names within the scope of the VNF for a nested heat yaml file. +As stated in requirement :need:`R-99646`, a VNF's YAML files +(i.e, Heat Orchestration Template files and Nested files) **MUST** +have a unique name in the scope of the VNF. .. req:: :id: R-52530 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca A VNF's Heat Orchestration Template's Nested YAML file **MUST** be in the same directory hierarchy as the VNF's Heat @@ -97,10 +107,16 @@ the second level of nesting. a VNF's Heat Orchestration Templates (when the VNF is composed of two or more Heat Orchestration Templates). +Note that as stated in requirement :need:`R-00011`, a VNF's Heat Orchestration +Template's Nested YAML file's parameter's **MUST NOT** have a parameter +constraint defined. + .. req:: :id: R-11041 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca All parameters defined in a VNFs Nested YAML file **MUST** be passed in as properties of the resource calling @@ -108,66 +124,64 @@ the second level of nesting. Note that: -- As stated in requirement :need:`R-00011`, a VNF's Heat Orchestration - Template's Nested YAML file's parameter's **MUST NOT** have - a parameter constraint defined. - -- As stated in Requirement :need:`R-44491`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'vnf\_id' is passed into a Nested YAML - file, the parameter name 'vnf\_id' **MUST NOT** change. - -- As stated in Requirement :need:`R-86237`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'vf\_module\_id' is passed into a Nested YAML - file, the parameter name 'vf\_module\_id' **MUST NOT** change. - -- As stated in Requirement :need:`R-16576`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'vnf\_name' is passed into a Nested YAML - file, the parameter name 'vnf\_name' **MUST NOT** change. - -- As stated in Requirement :need:`R-49177`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'vf\_module\_name' is passed into a Nested YAML - file, the parameter name 'vf\_module\_name' **MUST NOT** change. - -- As stated in Requirement :need:`R-70757`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'vm\_role' is passed into a Nested YAML - file, the parameter name 'vm\_role' **MUST NOT** change. - -- As stated in Requirement :need:`R-22441`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'vf\_module\_index' is passed into a Nested YAML - file, the parameter name 'vf\_module\_index' **MUST NOT** change. - -- As stated in Requirement :need:`R-75202`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'workload\_context' is passed into a Nested YAML - file, the parameter name 'workload\_context' **MUST NOT** change. - -- As stated in Requirement :need:`R-62954`, if a VNF's Heat Orchestration - Template's OS::Nova::Server Resource metadata map value parameter - 'environment\_context' is passed into a Nested YAML - file, the parameter name 'environment\_context' **MUST NOT** change. - -- With nested templates, outputs are required to expose any resource - properties of the child templates to the parent template. Those would - not explicitly be declared as parameters but simply referenced as - get\_attribute targets against the "parent" resource. - -- A parameter declared in the outputs: section of a nested template can - be accessed from the parent template as an attribute (i.e., via - get\_attr) of the "pseudo resource" whose type is in the nested - template. In the case of a OS::Heat::ResourceGroup, an output will be - an attribute of the OS::Heat::ResourceGroup itself, and will be an - array from the perspective of the parent template. +As stated in Requirement :need:`R-44491`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``vnf_id`` is passed into a Nested YAML file, the parameter name +``vnf_id`` **MUST NOT** change. + +As stated in Requirement :need:`R-86237`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``vf_module_id`` is passed into a Nested YAML file, the parameter name +``vf_module_id`` **MUST NOT** change. + +As stated in Requirement :need:`R-16576`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``vnf_name`` is passed into a Nested YAML file, the parameter name +``vnf_name`` **MUST NOT** change. + +As stated in Requirement :need:`R-49177`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``vf_module_name`` is passed into a Nested YAML file, the parameter name +``vf_module_name`` **MUST NOT** change. + +As stated in Requirement :need:`R-70757`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``vm_role`` is passed into a Nested YAML file, the parameter name +``vm_role`` **MUST NOT** change. + +As stated in Requirement :need:`R-22441`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``vf_module_index`` is passed into a Nested YAML file, the parameter +name ``vf_module_index`` **MUST NOT** change. + +As stated in Requirement :need:`R-75202`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``workload_context`` is passed into a Nested YAML file, the parameter +name ``workload_context`` **MUST NOT** change. + +As stated in Requirement :need:`R-62954`, if a VNF's Heat Orchestration +Template's ``OS::Nova::Server`` Resource ``metadata`` map value parameter +``environment_context`` is passed into a Nested YAML file, the parameter +name ``environment_context`` **MUST NOT** change. + +With nested templates, outputs are required to expose any resource +properties of the child templates to the parent template. Those would +not explicitly be declared as parameters but simply referenced as +``get_attribute`` targets against the "parent" resource. + +A parameter declared in the outputs: section of a nested template can +be accessed from the parent template as an attribute (i.e., via +``get_attr``) of the "pseudo resource" whose type is in the nested +template. In the case of a ``OS::Heat::ResourceGroup``, an output will be +an attribute of the ``OS::Heat::ResourceGroup`` itself, and will be an +array from the perspective of the parent template. .. req:: :id: R-17528 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca A VNF's Heat Orchestration Template's first level Nested YAML file **MUST NOT** contain more than one ``OS::Nova::Server`` resource. @@ -181,71 +195,71 @@ incremental.yaml .. code-block:: yaml - Resources: - dns_server_0: - type: nested.yaml - properties: - dns_image_name: { get_param: dns_image_name } - dns_flavor_name: { get_param: dns_flavor_name } - availability_zone: { get_param: availability_zone_0 } - security_group: { get_param: DNS_shared_sec_grp_id } - oam_net_id: { get_param: oam_protected_net_id } - dns_oam_ip: { get_param: dns_oam_ip_0 } - dns_name: { get_param: dns_name_0 } - vnf_name: { get_param: vnf_name } - vnf_id: { get_param: vnf_id } - vf_module_id: {get_param: vf_module_id} - - dns_server_1: - type: nested.yaml - properties: - dns_image_name: { get_param: dns_image_name } - dns_flavor_name: { get_param: dns_flavor_name } - availability_zone: { get_param: availability_zone_1 } - security_group: { get_param: DNS_shared_sec_grp_id } - oam_net_id: { get_param: oam_protected_net_id } - dns_oam_ip: { get_param: dns_oam_ip_1 } - dns_name: { get_param: dns_name_1 } - vnf_name: { get_param: vnf_name } - vnf_id: { get_param: vnf_id } - vf_module_id: {get_param: vf_module_id} + resources: + dns_server_0: + type: nested.yaml + properties: + dns_image_name: { get_param: dns_image_name } + dns_flavor_name: { get_param: dns_flavor_name } + availability_zone: { get_param: availability_zone_0 } + security_group: { get_param: DNS_shared_sec_grp_id } + oam_net_id: { get_param: oam_protected_net_id } + dns_oam_ip: { get_param: dns_oam_ip_0 } + dns_name: { get_param: dns_name_0 } + vnf_name: { get_param: vnf_name } + vnf_id: { get_param: vnf_id } + vf_module_id: {get_param: vf_module_id} + + dns_server_1: + type: nested.yaml + properties: + dns_image_name: { get_param: dns_image_name } + dns_flavor_name: { get_param: dns_flavor_name } + availability_zone: { get_param: availability_zone_1 } + security_group: { get_param: DNS_shared_sec_grp_id } + oam_net_id: { get_param: oam_protected_net_id } + dns_oam_ip: { get_param: dns_oam_ip_1 } + dns_name: { get_param: dns_name_1 } + vnf_name: { get_param: vnf_name } + vnf_id: { get_param: vnf_id } + vf_module_id: {get_param: vf_module_id} nested.yaml .. code-block:: yaml - dns_oam_0_port: - type: OS::Neutron::Port - properties: - name: - str_replace: - template: VNF_NAME_dns_oam_port - params: - VNF_NAME: {get_param: vnf_name} - network: { get_param: oam_net_id } - fixed_ips: [{ "ip_address": { get_param: dns_oam_ip }}] - security_groups: [{ get_param: security_group }] - - dns_servers: - type: OS::Nova::Server - properties: - name: { get_param: dns_names } - image: { get_param: dns_image_name } - flavor: { get_param: dns_flavor_name } - availability_zone: { get_param: availability_zone } - networks: - - port: { get_resource: dns_oam_0_port } - metadata: - vnf_id: { get_param: vnf_id } - vf_module_id: { get_param: vf_module_id } - vnf_name {get_param: vnf_name } + dns_oam_0_port: + type: OS::Neutron::Port + properties: + name: + str_replace: + template: VNF_NAME_dns_oam_port + params: + VNF_NAME: {get_param: vnf_name} + network: { get_param: oam_net_id } + fixed_ips: [{ "ip_address": { get_param: dns_oam_ip }}] + security_groups: [{ get_param: security_group }] + + dns_servers: + type: OS::Nova::Server + properties: + name: { get_param: dns_names } + image: { get_param: dns_image_name } + flavor: { get_param: dns_flavor_name } + availability_zone: { get_param: availability_zone } + networks: + - port: { get_resource: dns_oam_0_port } + metadata: + vnf_id: { get_param: vnf_id } + vf_module_id: { get_param: vf_module_id } + vnf_name {get_param: vnf_name } Use of Heat ResourceGroup ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The OS::Heat::ResourceGroup is a useful Heat element for creating multiple instances of a given resource or collection of resources. -Typically, it is used with a nested Heat template, to create, for +Typically, it is used with a nested Heat template to create, for example, a set of identical OS::Nova::Server resources plus their related OS::Neutron::Port resources via a single resource in a master template. @@ -267,11 +281,13 @@ OS::Heat::ResourceGroup: .. code-block:: yaml - type: OS::Heat::ResourceGroup - resource_def: - type: my_nested_vm_template.yaml - properties: - name: {get_param: [vm_name_list, "%index%"]} + type: OS::Heat::ResourceGroup + properties: + . . . + resource_def: + type: my_nested_vm_template.yaml + properties: + name: {get_param: [vm_name_list, "%index%"]} Although this appears to use the nth entry of the vm_name_list list for the nth element of the OS::Heat::ResourceGroup, it will in fact result @@ -285,16 +301,18 @@ ResourceGroup: .. code-block:: yaml - type: OS::Heat::ResourceGroup - resource_def: - type: my_nested_vm_template.yaml - properties: - names: {get_param: vm_name_list} - index: "%index%" + type: OS::Heat::ResourceGroup + properties: + . . . + resource_def: + type: my_nested_vm_template.yaml + properties: + names: {get_param: vm_name_list} + index: "%index%" You can then reference within the nested template as: -{ get\_param: [names, {get\_param: index} ] } +{ get_param: [names, {get_param: index} ] } OS::Heat::ResourceGroup Property count ++++++++++++++++++++++++++++++++++++++++ @@ -304,9 +322,11 @@ OS::Heat::ResourceGroup Property count :id: R-50011 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca - A VNF's Heat Orchestration Template's 'OS::Heat::ResourceGroup' - property 'count' **MUST** be enumerated in the VNF's + A VNF's Heat Orchestration Template's ``OS::Heat::ResourceGroup`` + property ``count`` **MUST** be enumerated in the VNF's Heat Orchestration Template's Environment File and **MUST** be assigned a value. @@ -314,63 +334,63 @@ This is required for ONAP to build the TOSCA model for the VNF. .. code-block:: yaml - type: OS::Heat::ResourceGroup - properties: - count: { get_param: count } - index_var: index - resource_def: - type: my_nested_vm_template.yaml - properties: - names: {get_param: vm_name_list} - index: index + type: OS::Heat::ResourceGroup + properties: + count: { get_param: count } + index_var: index + resource_def: + type: my_nested_vm_template.yaml + properties: + names: {get_param: vm_name_list} + index: index Availability Zone and ResourceGroups ++++++++++++++++++++++++++++++++++++++++ -The resource OS::Heat::ResourceGroup and the property availability\_zone +The resource OS::Heat::ResourceGroup and the property availability_zone has been an "issue" with a few VNFs since ONAP only supports -availability\_zone as a string parameter and not a -comma\_delimited\_list. This makes it difficult to use a -OS::Heat::ResourceGroup to create Virtual Machines in more -than one availability zone. +availability_zone as a string parameter and not as a +comma_delimited_list. This makes it difficult to use a +OS::Heat::ResourceGroup to create Virtual Machines in more than one +availability zone. There are numerous solutions to this issue. Below are two suggested usage patterns. **Option 1:** create a CDL in the OS::Heat::ResourceGroup. In the -resource type: OS::Heat::ResourceGroup, create a comma\_delimited\_list -availability\_zones by using the intrinsic function list\_join. +resource type: OS::Heat::ResourceGroup, create a comma_delimited_list +availability_zones by using the intrinsic function list_join. .. code-block:: yaml - : - type: OS::Heat::ResourceGroup - properties: - count: { get_param: node_count } - index_var: index - resource_def: - type: nested.yaml - properties: - index: index - avaialability_zones: { list_join: [',', [ { get_param: availability_zone_0 }, { get_param: availability_zone_1 } ] ] } + : + type: OS::Heat::ResourceGroup + properties: + count: { get_param: node_count } + index_var: index + resource_def: + type: nested.yaml + properties: + index: index + availability_zones: { list_join: [',', [ { get_param: availability_zone_0 }, { get_param: availability_zone_1 } ] ] } In the nested heat .. code-block:: yaml - parameters: - avaialability_zones: - type: comma_delimited_list - description: + parameters: + availability_zones: + type: comma_delimited_list + description: - resources: - servers: - type: OS::Nova::Server - properties: - name: { get_param: [ dns_names, get_param: index ] } - image: { get_param: dns_image_name } - flavor: { get_param: dns_flavor_name } - availability_zone: { get_param: [ avaialability_zones, get_param: index ] } + resources: + servers: + type: OS::Nova::Server + properties: + name: { get_param: [ dns_names, get_param: index ] } + image: { get_param: dns_image_name } + flavor: { get_param: dns_flavor_name } + availability_zone: { get_param: [ availability_zones, get_param: index ] } **Option 2:** Create a CDL by passing the availability zone parameter into a nested heat template. An example is provided below. @@ -426,21 +446,21 @@ az_list_generate.yaml Nested Heat Template Example: OS::Heat::ResourceGroup ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -In this example, ocgapp\_volume.yml creates volumes using a +In this example, ocgapp_volume.yml creates volumes using a OS::Heat::ResourceGroup that uses nested heat by calling -ocgapp_nested_volume.yml. ocgapp\_volume.yml has an outputs: parameter -ocgapp\_volume\_ids which is declared a input parameter of type: json in -ocgapp\_volume.yml. +ocgapp_nested_volume.yml. ocgapp_volume.yml has an outputs: parameter +ocgapp_volume_ids which is declared a input parameter of type: json in +ocgapp_volume.yml. This is an example of requirement :need:`R-07443`, where 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'. +Parameter is of the type ``comma_delimited_list``, then the corresponding +input parameter **MUST** be declared as type ``json``. -ocgapp\_volume.yml +ocgapp_volume.yml .. code-block:: yaml @@ -532,6 +552,14 @@ ocgapp_nested_volume.yml description: the ocgapp volume uuid value: {get_resource: ocgapp_volume_0} +Below is a screen shot of parameter ocgapp_volume_ids from the OpenStack +Horizon GUI showing the output. + +.. image:: ../../heat_picture3.png + :height: 334px + :width: 1186px + :scale: 50 % + The heat template below is a partial heat template, ocgapp.yml @@ -571,19 +599,19 @@ ocgapp.yml External References ^^^^^^^^^^^^^^^^^^^^^^ -Heat templates *should not* reference any HTTP-based resource +Heat templates *must not* reference any HTTP-based resource definitions, any HTTP-based nested configurations, or any HTTP-based environment files. -- During orchestration, ONAP *should not* retrieve any such resources +- During orchestration, ONAP *must not* retrieve any such resources from external/untrusted/unknown sources. -- VNF images should not contain such references in user-data or other +- VNF images must not contain external references in user-data or other configuration/operational scripts that are specified via Heat or encoded into the VNF image itself. -*Note:* HTTP-based references are acceptable if the HTTP-based reference -is accessing information with the VM private/internal network. +*Note: HTTP-based references are acceptable if the HTTP-based reference +is accessing information utilizing the VM private/internal network.* Note that Namespaces in XML (defined at http://www.w3.org/TR/2009/REC-xml-names-20091208/) are allowed if the @@ -597,11 +625,11 @@ Name (URN). The namespace URI is not used by XML the parser to look up information. The purpose of using an URI is to give the namespace a unique name. -Heat Files Support (get\_file) +Heat Files Support (get_file) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Heat Templates may contain the inclusion of text files into Heat -templates via the Heat get\_file directive. This may be used, for +templates via the Heat get_file directive. This may be used, for example, to define a common "user-data" script, or to inject files into a VM on startup via the "personality" property. @@ -612,12 +640,14 @@ Support for Heat Files is subject to the following limitations: :id: R-76718 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca If a VNF's Heat Orchestration Template uses the intrinsic function - 'get\_file', the 'get\_file' target **MUST** be referenced in + ``get_file``, the ``get_file`` target **MUST** be referenced in the Heat Orchestration Template by file name. -The 'get\_file' target files are on-boarded to SDC in the same package +The ``get_file`` target files are on-boarded to SDC in the same package that contains the VNF's complete Heat Orchestration Template. @@ -625,14 +655,18 @@ that contains the VNF's complete Heat Orchestration Template. :id: R-41888 :target: VNF :keyword: MUST NOT + :validation_mode: static + :updated: casablanca A VNF's Heat Orchestration Template intrinsic function - 'get\_file' **MUST NOT** utilize URL-based file retrieval. + ``get_file`` **MUST NOT** utilize URL-based file retrieval. .. req:: :id: R-62177 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca When using the intrinsic function get_file, the included files **MUST** have unique file names within the scope of the VNF. @@ -641,22 +675,26 @@ that contains the VNF's complete Heat Orchestration Template. :id: R-87848 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca - 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. + 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. ONAP does not support a hierarchical structure. A VNF's YAML files must be in a single, flat directory. - .. req:: :id: R-05050 :target: VNF :keyword: MAY + :updated: casablanca A VNF's Heat Orchestration Templates intrinsic function - 'get\_file' **MAY** be used: + ``get_file`` **MAY** be used: * more than once in a VNF's Heat Orchestration Template * in two or more of a VNF's Heat Orchestration Templates @@ -687,10 +725,10 @@ Due to this behavior, the recommended usage of keypairs is in a more generic manner which does not require the pre-requisite creation of a keypair. The Heat should be structured in such a way as to: -- Pass a public key as a parameter value instead of a keypair name + - Pass a public key as a parameter value instead of a keypair name -- Create a new keypair within The VNF Heat Orchestration Template (in the - base module) based on an existing public key for use within that VNF + - Create a new keypair within the VNF Heat templates (in the base module) + based on an existing public key for use within that VNF By following this approach, the end result is the same as pre-creating the keypair using the public key – i.e., that public key will be @@ -709,23 +747,23 @@ of lb (for load balancer)):* .. code-block:: yaml - parameters: + parameters: vnf_name: - type: string + type: string lb_ssh_public_key: - type: string + type: string - resources: - my_keypair: - type: OS::Nova::Keypair - properties: - name: - str_replace: - template: VNF_NAME_key_pair - params: - VNF_NAME: { get_param: vnf_name } - public_key: {get_param: lb_ssh_public_key} - save_private_key: false + resources: + lb_keypair_0: + type: OS::Nova::Keypair + properties: + name: + str_replace: + template: VNF_NAME_key_pair + params: + VNF_NAME: { get_param: vnf_name } + public_key: {get_param: lb_ssh_public_key} + save_private_key: false Security Groups ^^^^^^^^^^^^^^^^^ @@ -759,49 +797,45 @@ balancer and db for database. .. code-block:: yaml - resources: - db_server_group: - type: OS::Nova::ServerGroup - properties: - name: + resources: + db_server_group: + type: OS::Nova::ServerGroup + properties: + name: str_replace: - params: - $vnf_name: {get_param: vnf_name} - template: $vnf_name-server_group1 - policies: - - anti-affinity - - lb_server_group: - type: OS::Nova::ServerGroup - properties: - name: + params: + $vnf_name: {get_param: vnf_name} + template: $vnf_name-server_group1 + policies: + - anti-affinity + lb_server_group: + type: OS::Nova::ServerGroup + properties: + name: str_replace: - params: - $vnf_name: {get_param: vnf_name} - template: $vnf_name-server_group2 - policies: - - affinity - - db_0: - type: OS::Nova::Server - properties: - ... - scheduler_hints: - group: {get_resource: db_server_group} - - db_1: - type: OS::Nova::Server - properties: - ... - scheduler_hints: - group: {get_resource: db_server_group} - - lb_0: - type: OS::Nova::Server - properties: - ... - scheduler_hints: - group: {get_resource: lb_server_group}  + params: + $vnf_name: {get_param: vnf_name} + template: $vnf_name-server_group2 + policies: + - affinity + db_server_0: + type: OS::Nova::Server + properties: + ... + scheduler_hints: + group: {get_resource: db_server_group} + db_server_1: + type: OS::Nova::Server + properties: + ... + scheduler_hints: + group: {get_resource: db_server_group} + lb_server_0: + type: OS::Nova::Server + properties: + ... + scheduler_hints: + group: {get_resource: lb_server_group} Resource Data Synchronization ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -809,7 +843,7 @@ Resource Data Synchronization For cases where synchronization is required in the orchestration of Heat resources, two approaches are recommended: -- Standard Heat depends\_on property for resources +- Standard Heat depends_on property for resources - Assures that one resource completes before the dependent resource is orchestrated. @@ -823,12 +857,12 @@ resources, two approaches are recommended: - Create OS::Heat::WaitCondition and OS::Heat::WaitConditionHandle resources. - - Pre-requisite resources issue *wc\_notify* commands in user\_data. + - Pre-requisite resources issue *wc_notify* commands in user_data. - - Dependent resource define depends\_on in the + - Dependent resource define depends_on in the OS::Heat::WaitCondition resource. -*Example: "depends\_on" case* +*Example: "depends_on" case* In this example, the {network-role} has been defined as oam to represent an oam network and the {vm-type} has been defined as oam to represent an @@ -836,41 +870,38 @@ oam server. .. code-block:: yaml - resources: - oam_server_01: - type: OS::Nova::Server - properties: - name: {get_param: [oam_ names, 0]} - image: {get_param: oam_image_name} - flavor: {get_param: oam_flavor_name} - availability_zone: {get_param: availability_zone_0} - networks: - - port: {get_resource: oam01_port_0} - - port: {get_resource: oam01_port_1} - user_data: - scheduler_hints: {group: {get_resource: oam_servergroup}} - user_data_format: RAW - - oam_01_port_0: - type: OS::Neutron::Port - properties: - network: {get_resource: oam_net_name} - fixed_ips: [{"ip_address": {get_param: [oam_oam_net_ips, 1]}}] - security_groups: [{get_resource: oam_security_group}] - - oam_01_port_1: - type: OS::Neutron::Port - properties: - network: {get_param: oam_net_name} - fixed_ips: [{"ip_address": {get_param: [oam_oam_net_ips, 2]}}] - security_groups: [{get_resource: oam_security_group}] - - oam_01_vol_attachment: - type: OS::Cinder::VolumeAttachment - depends_on: oam_server_01 - properties: - volume_id: {get_param: oam_vol_1} - mountpoint: /dev/vdb - instance_uuid: {get_resource: oam_server_01} + resources: + oam_server_01: + type: OS::Nova::Server + properties: + name: {get_param: [oam_names, 0]} + image: {get_param: oam_image_name} + flavor: {get_param: oam_flavor_name} + availability_zone: {get_param: availability_zone_0} + networks: + - port: {get_resource: oam01_port_0} + - port: {get_resource: oam01_port_1} + user_data: + scheduler_hints: {group: {get_resource: oam_servergroup}} + user_data_format: RAW + oam_01_port_0: + type: OS::Neutron::Port + properties: + network: {get_resource: oam_net_name} + fixed_ips: [{"ip_address": {get_param: [oam_oam_net_ips, 1]}}] + security_groups: [{get_resource: oam_security_group}] + oam_01_port_1: + type: OS::Neutron::Port + properties: + network: {get_param: oam_net_name} + fixed_ips: [{"ip_address": {get_param: [oam_oam_net_ips, 2]}}] + security_groups: [{get_resource: oam_security_group}] + oam_volume_attachment_0: + type: OS::Cinder::VolumeAttachment + depends_on: oam_server_01 + properties: + volume_id: {get_param: oam_vol_1} + mountpoint: /dev/vdb + instance_uuid: {get_resource: oam_server_01} diff --git a/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst b/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst index 70ba197..7e1ebe3 100644 --- a/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst +++ b/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst @@ -15,12 +15,12 @@ referred to as *VNF Modules*. During orchestration, these modules are deployed incrementally to create the complete VNF. As stated in :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). + 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). As stated in :need:`R-20974`, at orchestration time, the VNF's Base Module **MUST** be deployed first, prior to any incremental modules. @@ -39,6 +39,9 @@ As stated in :need:`R-37028` and :need:`R-13196`, a VNF **MUST** be composed of one Base Module and *MAY** be composed of zero to many Incremental Modules. +As stated in :need:`R-20974`, at orchestration time, the VNF's Base Module +**MUST** be deployed first, prior to any incremental modules. + ONAP also supports the concept of an optional, independently deployed Cinder volume via a separate Heat Orchestration Templates, referred to as a Cinder Volume Module. This allows the volume to persist after a VM @@ -58,6 +61,8 @@ Incremental Module. :id: R-61001 :target: VNF :keyword: MUST + :validation_mode: static + :updated: casablanca A shared Heat Orchestration Template resource must be defined in the base module. A shared resource is a resource that that will @@ -71,6 +76,9 @@ When the shared resource needs to be referenced by a resource in an incremental module, the UUID of the shared resource must be exposed by declaring an ONAP Base Module Output Parameter. +Note that a Cinder volume is not a shared resource. A volume template +must correspond 1:1 with a base module or incremental module. + An example of a shared resource is the resource OS::Neutron::SecurityGroup. Security groups are sets of IP filter rules that are applied to a VNF’s networking. The resource OS::Neutron::Port diff --git a/docs/data/needs.json b/docs/data/needs.json index 6ca56f3..e77e864 100644 --- a/docs/data/needs.json +++ b/docs/data/needs.json @@ -1,5 +1,5 @@ { - "created": "2018-09-12T17:22:55.929421", + "created": "2018-09-12T23:20:21.160620", "current_version": "casablanca", "project": "", "versions": { @@ -21858,7 +21858,7 @@ "needs_amount": 750 }, "casablanca": { - "created": "2018-09-12T17:22:55.929309", + "created": "2018-09-12T23:20:21.160546", "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.", @@ -21987,6 +21987,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -22087,7 +22088,7 @@ "validation_mode": "" }, "R-01101": { - "description": "A VNF's Heat Orchestration Template **MAY**\nreference the nested heat dynamically using the resource\n'OS::Heat::ResourceGroup'.", + "description": "A VNF's Heat Orchestration Template **MAY**\nreference the nested heat dynamically using the resource\n``OS::Heat::ResourceGroup``.", "full_title": "", "hide_links": "", "id": "R-01101", @@ -22099,6 +22100,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -22110,7 +22112,7 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", "validation_mode": "" }, @@ -22842,6 +22844,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -22971,7 +22974,7 @@ "validation_mode": "" }, "R-05050": { - "description": "A VNF's Heat Orchestration Templates intrinsic function\n'get\\_file' **MAY** be used:\n\n * more than once in a VNF's Heat Orchestration Template\n * in two or more of a VNF's Heat Orchestration Templates\n * in a VNF's Heat Orchestration Templates nested YAML file", + "description": "A VNF's Heat Orchestration Templates intrinsic function\n``get_file`` **MAY** be used:\n\n * more than once in a VNF's Heat Orchestration Template\n * in two or more of a VNF's Heat Orchestration Templates\n * in a VNF's Heat Orchestration Templates nested YAML file", "full_title": "", "hide_links": "", "id": "R-05050", @@ -22994,7 +22997,7 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", "validation_mode": "" }, @@ -23819,6 +23822,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -23830,9 +23834,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-11168": { "description": "A VNF's Heat Orchestration Template's Resource ID that is\nassociated with an external network **MUST** include the\n'{network-role}' as part of the resource ID.", @@ -25156,6 +25160,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -25167,9 +25172,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-18001": { "description": "If the VNF's ports connected to a unique internal network\nand the port's IP addresses are statically assigned IP Addresses,\nthe IPv4 Addresses **MAY** be from different subnets and the\nIPv6 Addresses **MAY** be from different subnets.", @@ -26307,33 +26312,6 @@ "validated_by": "", "validation_mode": "static" }, - "R-22656": { - "description": "The VNF Heat Orchestration Template **MUST** have a\ncorresponding environment file for a Cinder Volume Module.", - "full_title": "", - "hide_links": "", - "id": "R-22656", - "impacts": "", - "introduced": "", - "keyword": "MUST", - "links": [], - "notes": "", - "section_name": "ONAP Heat Support of Environment Files", - "sections": [ - "ONAP Heat Support of Environment Files" - ], - "status": null, - "tags": [], - "target": "VNF", - "test": "", - "test_case": "", - "test_file": "", - "title": "", - "title_from_content": "", - "type_name": "Requirement", - "updated": "", - "validated_by": "", - "validation_mode": "" - }, "R-22680": { "description": "The xNF Package **MUST** include documentation that describes\nany requirements for the monitoring component of tools for Network\nCloud automation and management to provide these records to components\nof the xNF.", "full_title": "", @@ -26873,7 +26851,7 @@ "validation_mode": "" }, "R-25190": { - "description": "A VNF's Heat Orchestration Template's Resource 'OS::Cinder::Volume'\n**SHOULD NOT** declare the property 'availability_zone'.", + "description": "A VNF's Heat Orchestration Template's Resource ``OS::Cinder::Volume``\n**SHOULD NOT** declare the property ``availability_zone``.", "full_title": "", "hide_links": "", "id": "R-25190", @@ -26896,7 +26874,7 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", "validation_mode": "" }, @@ -29243,33 +29221,6 @@ "validated_by": "", "validation_mode": "" }, - "R-35727": { - "description": "The VNF Heat Orchestration Template **MUST** have a\ncorresponding environment file for an Incremental module.", - "full_title": "", - "hide_links": "", - "id": "R-35727", - "impacts": "", - "introduced": "", - "keyword": "MUST", - "links": [], - "notes": "", - "section_name": "ONAP Heat Support of Environment Files", - "sections": [ - "ONAP Heat Support of Environment Files" - ], - "status": null, - "tags": [], - "target": "VNF", - "test": "", - "test_case": "", - "test_file": "", - "title": "", - "title_from_content": "", - "type_name": "Requirement", - "updated": "", - "validated_by": "", - "validation_mode": "" - }, "R-35735": { "description": "When the VNF's Heat Orchestration Template's Resource\n'OS::Neutron::Port' is attaching to an external network,\nand an IPv6 Virtual IP (VIP) address is assigned via ONAP automation\nusing the property 'allowed_address_pairs' map property 'ip_address',\nthe parameter name **MUST** follow the naming convention\n\n * '{vm-type}_{network-role}_v6_floating_ip'\n\nwhere\n\n * '{vm-type}' is the {vm-type} associated with the OS::Nova::Server\n * '{network-role}' is the {network-role} of the external network\n\nAnd the parameter **MUST** be declared as type 'string'.", "full_title": "", @@ -30489,7 +30440,7 @@ "validation_mode": "" }, "R-41888": { - "description": "A VNF's Heat Orchestration Template intrinsic function\n'get\\_file' **MUST NOT** utilize URL-based file retrieval.", + "description": "A VNF's Heat Orchestration Template intrinsic function\n``get_file`` **MUST NOT** utilize URL-based file retrieval.", "full_title": "", "hide_links": "", "id": "R-41888", @@ -30512,9 +30463,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-41956": { "description": "If a VNF requires ONAP to assign a Virtual IP (VIP) Address to\nports connected an external network, the port\n**MUST NOT** have more than one IPv6 VIP address.", @@ -32460,7 +32411,7 @@ "validation_mode": "" }, "R-50011": { - "description": "A VNF's Heat Orchestration Template's 'OS::Heat::ResourceGroup'\nproperty 'count' **MUST** be enumerated in the VNF's\nHeat Orchestration Template's Environment File and **MUST** be\nassigned a value.", + "description": "A VNF's Heat Orchestration Template's ``OS::Heat::ResourceGroup``\nproperty ``count`` **MUST** be enumerated in the VNF's\nHeat Orchestration Template's Environment File and **MUST** be\nassigned a value.", "full_title": "", "hide_links": "", "id": "R-50011", @@ -32473,7 +32424,7 @@ "sections": [ "OS::Heat::ResourceGroup Property count", "Use of Heat ResourceGroup", - "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -32485,9 +32436,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-50252": { "description": "The xNF **MUST** write to a specific one text files that\nwill be retrieved and made available by the Ansible Server if, as part\nof a xNF action (e.g., audit), a playbook is required to return any\nxNF information. The text files must be written in the same directory as\nthe one from which the playbook is being executed. A text file must be\ncreated for the xNF playbook run targets/affects, with the name\n'_results.txt' into which any desired output from each\nrespective VM/xNF must be written.", @@ -32788,6 +32739,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -32799,9 +32751,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-52753": { "description": "VNF's Heat Orchestration Template's Base Module's output parameter's\nname and type **MUST** match the VNF's Heat Orchestration Template's\nincremental Module's name and type unless the output parameter is of\ntype ``comma_delimited_list``, then the corresponding input parameter\n**MUST** be declared as type ``json``.", @@ -34291,6 +34243,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -34302,9 +34255,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-60106": { "description": "The xNF **MUST** implement the protocol operation:\n**get(filter)** - Retrieve (a filtered subset of) the running\nconfiguration and device state information. This should include\nthe list of xNF supported schemas.", @@ -34389,9 +34342,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-61354": { "description": "The VNF **MUST** provide a mechanism (e.g., access control list) to\npermit and/or restrict access to services on the VNF by source,\ndestination, protocol, and/or port.", @@ -34503,9 +34456,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-62187": { "description": "A VNF's Heat Orchestration Template's Resource\n'OS::ContrailV2::InstanceIp' that is configuring an\nIPv4 Address on a port attached to an internal network\nResource ID **MUST** use the naming convention\n\n * {vm-type}_{vm-type_index}_int_{network-role}_vmi_{vmi_index}_IP_{index}\n\nwhere\n\n * {vm-type} is the vm-type\n * {vm-type_index} is the instance of the {vm-type}\n * {network-role} is the network-role of the network\n that the port is attached to\n * {vmi_index} is the instance of the the virtual machine interface\n (e.g., port) on the vm-type\n attached to the network of {network-role}\n * 'IP' signifies that an IPv4 address is being configured\n * {index} is the index of the IPv4 address", @@ -35392,33 +35345,6 @@ "validated_by": "", "validation_mode": "" }, - "R-67205": { - "description": "The VNF Heat Orchestration Template **MUST** have a corresponding\nenvironment file for a Base Module.", - "full_title": "", - "hide_links": "", - "id": "R-67205", - "impacts": "", - "introduced": "", - "keyword": "MUST", - "links": [], - "notes": "", - "section_name": "ONAP Heat Support of Environment Files", - "sections": [ - "ONAP Heat Support of Environment Files" - ], - "status": null, - "tags": [], - "target": "VNF", - "test": "", - "test_case": "", - "test_file": "", - "title": "", - "title_from_content": "", - "type_name": "Requirement", - "updated": "", - "validated_by": "", - "validation_mode": "" - }, "R-67231": { "description": "A VNF's Heat Orchestration template's Environment File's\n**MUST NOT** contain the ``resource_registry:`` section.", "full_title": "", @@ -36126,6 +36052,35 @@ "validated_by": "", "validation_mode": "" }, + "R-70112": { + "description": "A VNF's Heat Orchestration Template **MUST** reference a Nested YAML\nfile by name. The use of ``resource_registry`` in the VNF's Heat\nOrchestration Templates Environment File **MUST NOT** be used.", + "full_title": "", + "hide_links": "", + "id": "R-70112", + "impacts": "", + "introduced": "casablanca", + "keyword": "MUST", + "links": [], + "notes": "", + "section_name": "Nested Heat Template Requirements", + "sections": [ + "Nested Heat Template Requirements", + "Nested Heat Templates", + "ONAP Heat Heat Template Constructs" + ], + "status": null, + "tags": [], + "target": "VNF", + "test": "", + "test_case": "", + "test_file": "", + "title": "", + "title_from_content": "", + "type_name": "Requirement", + "updated": "", + "validated_by": "", + "validation_mode": "static" + }, "R-70266": { "description": "The xNF **MUST** respond to an ONAP request to deliver the\ncurrent data for any of the record types defined in\n`Event Records - Data Structure Description`_ by returning the requested\nrecord, populated with the current field values. (Currently the defined\nrecord types include fault fields, mobile flow fields, measurements for\nxNF scaling fields, and syslog fields. Other record types will be added\nin the future as they become standardized and are made available.)", "full_title": "", @@ -37322,7 +37277,7 @@ "validation_mode": "" }, "R-76718": { - "description": "If a VNF's Heat Orchestration Template uses the intrinsic function\n'get\\_file', the 'get\\_file' target **MUST** be referenced in\nthe Heat Orchestration Template by file name.", + "description": "If a VNF's Heat Orchestration Template uses the intrinsic function\n``get_file``, the ``get_file`` target **MUST** be referenced in\nthe Heat Orchestration Template by file name.", "full_title": "", "hide_links": "", "id": "R-76718", @@ -37345,9 +37300,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-76901": { "description": "The VNF **MUST** support a container rebuild mechanism based on existing\nimage (e.g. Glance image in Openstack environment) or a snapshot.", @@ -39730,7 +39685,7 @@ "validation_mode": "" }, "R-87848": { - "description": "A VNF's Heat Orchestration Template's 'get\\_file' target files\n**MUST** be in the same directory hierarchy as the VNF's Heat\nOrchestration Templates.", + "description": "When using the intrinsic function get_file, ONAP does not support\na directory hierarchy for included files. All files must be in a\nsingle, flat directory per VNF. A VNF's Heat Orchestration\nTemplate's ``get_file`` target files **MUST** be in the same\ndirectory hierarchy as the VNF's Heat Orchestration Templates.", "full_title": "", "hide_links": "", "id": "R-87848", @@ -39753,9 +39708,9 @@ "title": "", "title_from_content": "", "type_name": "Requirement", - "updated": "", + "updated": "casablanca", "validated_by": "", - "validation_mode": "" + "validation_mode": "static" }, "R-88026": { "description": "The xNF **MUST** include a NETCONF server enabling\nruntime configuration and lifecycle management capabilities.", @@ -40129,34 +40084,6 @@ "validated_by": "", "validation_mode": "" }, - "R-89868": { - "description": "The VNF Heat Orchestration Template **MUST** have unique\nfile names within the scope of the VNF for a nested heat yaml file.", - "full_title": "", - "hide_links": "", - "id": "R-89868", - "impacts": "", - "introduced": "", - "keyword": "MUST", - "links": [], - "notes": "", - "section_name": "Nested Heat Template Requirements", - "sections": [ - "Nested Heat Template Requirements", - "ONAP Heat Heat Template Constructs" - ], - "status": null, - "tags": [], - "target": "VNF", - "test": "", - "test_case": "", - "test_file": "", - "title": "", - "title_from_content": "", - "type_name": "Requirement", - "updated": "", - "validated_by": "", - "validation_mode": "" - }, "R-89913": { "description": "A VNF's Heat Orchestration Template's Cinder Volume Module Output\nParameter(s)\n**MUST** include the\nUUID(s) of the Cinder Volumes created in template,\nwhile others **MAY** be included.", "full_title": "", @@ -40229,6 +40156,7 @@ "section_name": "Nested Heat Template Requirements", "sections": [ "Nested Heat Template Requirements", + "Nested Heat Templates", "ONAP Heat Heat Template Constructs" ], "status": null, @@ -42205,7 +42133,7 @@ "validation_mode": "" } }, - "needs_amount": 715 + "needs_amount": 712 } } } \ No newline at end of file diff --git a/docs/heat_picture3.png b/docs/heat_picture3.png new file mode 100755 index 0000000000000000000000000000000000000000..f785bcbccb2e20fd7a5aae20a23bb7d065baadfa GIT binary patch literal 103529 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%0A8q~o&!hcczN-?K5mdOix+;4_xYd?a9^ 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 z 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