summaryrefslogtreecommitdiffstats
path: root/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst')
-rw-r--r--docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst311
1 files changed, 311 insertions, 0 deletions
diff --git a/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst b/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst
new file mode 100644
index 0000000..70ba197
--- /dev/null
+++ b/docs/Chapter5/Heat/ONAP Heat VNF Modularity.rst
@@ -0,0 +1,311 @@
+.. Licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright 2017 AT&T Intellectual Property. All rights reserved.
+
+.. _ONAP Heat VNF Modularity:
+
+ONAP Heat VNF Modularity
+---------------------------
+
+ONAP supports a modular Heat Orchestration Template design pattern,
+referred to as *VNF Modularity.* With this approach, a single VNF **MAY** be
+composed from one or more Heat Orchestration Templates, each of which
+represents a subset of the overall VNF. These component parts are
+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).
+
+As stated in :need:`R-20974`, at orchestration time, the VNF's Base Module **MUST**
+be deployed first, prior to any incremental modules.
+
+As stated in :need:`R-28980`, :need:`R-86926`, and :need:`R-91497`, a
+VNF's incremental module **MAY** be used for
+
+ * initial VNF deployment only
+ * scale out only
+ * both deployment and scale out
+
+As stated in :need:`R-68122`, a VNF's incremental module **MAY** be deployed
+more than once, either during initial VNF deployment and/or scale out
+
+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.
+
+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
+(i.e., OS::Nova::Server) is deleted, allowing the volume to be reused on
+another instance (e.g., during a fail over activity).
+
+The scope of a Cinder volume module, when it exists, must be 1:1 with a
+Base module or Incremental Module.
+
+A VNF module (base, incremental, cinder) **MAY** support nested templates.
+
+A shared Heat Resource is a resource that **MAY** be used by
+other Heat Resources either in the Base Module or an
+Incremental Module.
+
+.. req::
+ :id: R-61001
+ :target: VNF
+ :keyword: MUST
+
+ A shared Heat Orchestration Template resource must be defined
+ in the base module. A shared resource is a resource that that will
+ be referenced by another resource that is defined in the Base Module
+ and/or one or more incremental modules. 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.
+
+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.
+
+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
+has a property security_groups which provides the security groups
+associated with port. The value of parameter(s) associated with this
+property must be the UUIDs of the resource(s)
+OS::Neutron::SecurityGroup.
+
+*Note:* A Cinder volume is not considered a shared resource. A volume
+template must correspond 1:1 with a base template or add-on module
+template.
+
+Suggested Patterns for Modular VNFs
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+There are numerous variations of VNF modularity. Below are two suggested
+usage patterns.
+
+**Option 1: Incremental Modules per VNFC type**
+
+a. Base module contains only the shared resources.
+
+b. Group all VMs (e.g., VNFCs) of a given type (i.e. {vm-type}) into its
+ own incremental module. That is, the VNF has an incremental module
+ for each {vm-type}.
+
+c. For a given {vm-type} incremental module, the VNF may have
+
+ i. One incremental module used for both initial turn up and re-used
+ for scaling. This approach is used when the number of VMs
+ instantiated will be the same for initial deployment and scaling.
+
+ ii. Two incremental modules, where one is used for initial turn up
+ and one is used for scaling. This approach is used when the
+ number of VMs instantiated will be different for initial
+ deployment and scaling.
+
+**Option 2: Base VNF with Incremental Growth Modules**
+
+a. Base module contains a complete initial VNF instance
+
+b. Incremental modules for incremental scaling units
+
+ i. May contain VMs of multiple types in logical scaling combinations
+
+ ii. May be separated by VM type for multi-dimensional scaling
+
+With no growth units, Option 2 is equivalent to the "One Heat Template
+per VNF" model.
+
+Note that modularization of VNFs is not required. A single Heat
+Orchestration Template (a base module) may still define a complete VNF,
+which might be appropriate for smaller VNFs that do not have any scaling
+options.
+
+Modularity Rules
+^^^^^^^^^^^^^^^^^^^
+
+There are some rules to follow when building modular VNF templates:
+
+1. All VNFs must have one Base VNF Module (template) that must be the
+ first one deployed. The base template:
+
+ a. Must include all shared resources (e.g., private networks, server
+ groups, security groups)
+
+ b. Must expose all shared resources (by UUID) as "outputs" in its
+ associated Heat template (i.e., ONAP Base Module Output
+ Parameters)
+
+ c. May include initial set of VMs
+
+ d. May be operational as a stand-alone "minimum" configuration of the
+ VNF
+
+2. VNFs may have one or more incremental modules which:
+
+ a. Defines additional resources that can be added to an existing VNF
+
+ b. Must be complete Heat templates
+
+ i. i.e. not snippets to be incorporated into some larger template
+
+ c. Should define logical growth-units or sub-components of an overall
+ VNF
+
+ d. On creation, receives appropriate Base Module outputs as
+ parameters
+
+ i. Provides access to all shared resources (by UUID)
+
+ ii. *VNFs may have one or more incremental modules which must not be
+ dependent on other Add-On VNF Modules*
+
+ e. Multiple instances of an incremental Module may be added to the
+ same VNF (e.g., incrementally grow a VNF by a fixed "add-on"
+ growth units)
+
+3. Each VNF Module (base or incremental) may have (optional) an
+ associated Cinder Volume Module (see Cinder Volumes)
+
+ a. Volume modules must correspond 1:1 with a base module or
+ incremental module
+
+ b. A Cinder volume may be embedded within the base module or
+ incremental module if persistence is not required
+
+4. Shared resource UUIDs are passed between the base module and
+ incremental modules via Heat Outputs Parameters (i.e., Base Module
+ Output Parameters)
+
+ a. The output parameter name in the base must match the parameter
+ name in the add-on module
+
+VNF Modularity Examples
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+*Example: Base Module creates SecurityGroup*
+
+A VNF has a base module, named base.yaml, that defines a
+OS::Neutron::SecurityGroup. The security group will be referenced by an
+OS::Neutron::Port resource in an incremental module, named
+INCREMENTAL_MODULE.yaml. The base module defines a parameter in the
+outputs:section named dns_sec_grp_id. dns_sec_grp_id is defined as a
+parameter in the incremental module. ONAP captures the UUID value of
+dns_sec_grp_id from the base module output statement and provides the
+value to the incremental module.
+
+Note that the example below is not a complete Heat Orchestration
+Template. The {network-role} has been defined as oam to represent an oam
+network and the {vm-type} has been defined as dns.
+
+base_MODULE.yaml
+
+.. code-block:: yaml
+
+ parameters:
+ . . .
+ resources:
+ DNS_SECURITY_GROUP:
+ type: OS::Neutron::SecurityGroup
+ properties:
+ description: vDNS security group
+ name:
+ str_replace:
+ template: VNF_NAME_sec_grp_DNS
+ params:
+ VMF_NAME: {get_param: vnf_name}
+ rules: [. . . . .
+ ]
+ . . .
+ outputs:
+ dns_sec_grp_id:
+ description: UUID of DNS Resource SecurityGroup
+ value: { get_resource: DNS_SECURITY_GROUP }
+
+INCREMENTAL_MODULE.yaml
+
+.. code-block:: yaml
+
+ parameters:
+ dns_sec_grp_id:
+ type: string
+ description: security group UUID
+ . . .
+
+ resources:
+ dns_0_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_name }
+ fixed_ips: [{ "ip_address": { get_param: dns_oam_ip_0 }}]
+ security_groups: [{ get_param: dns_sec_grp_id }]
+
+*Examples: Base Module creates an internal network*
+
+A VNF has a base module, named base_module.yaml, that creates an
+internal network. An incremental module, named incremental_module.yaml,
+will create a VM that will connect to the internal network. The base
+module defines a parameter in the out section named int_oam_net_id.
+int_oam_net_id is defined as a parameter in the incremental module.
+ONAP captures the UUID value of int_oam_net_id from the base module
+output statement and provides the value to the incremental module.
+
+Note that the example below is not a complete Heat Orchestration
+Template. The {network-role} has been defined as oam to represent an oam
+network and the {vm-type} has been defined as lb for load balancer.
+
+base.yaml
+
+.. code-block:: yaml
+
+ heat_template_version: 2013-05-23
+
+ resources:
+ int_oam_network:
+ type: OS::Neutron::Network
+ properties:
+ name: {… }
+ . . .
+
+ outputs:
+ int_oam_net_id:
+ value: {get_resource: int_oam_network }
+
+incremental.yaml
+
+.. code-block:: yaml
+
+ heat_template_version: 2013-05-23
+
+ parameters:
+ int_oam_net_id:
+ type: string
+ description: ID of shared private network from Base template
+ lb_name_0:
+ type: string
+ description: name for the add-on VM instance
+
+ resources:
+ lb_server_0:
+ type: OS::Nova::Server
+ properties:
+ name: {get_param: lb_name_0}
+ networks:
+ - port: { get_resource: get_resource: lb_0_int_oam_port_0 }
+ . . .
+ lb_0_int_oam_port_0:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_param: int_oam_net_id }
+ ...
+