Add HEAT validation for generated artifacts 13/59113/2
authoreleonorali <eleonoral@amdocs.com>
Mon, 6 Aug 2018 08:25:37 +0000 (11:25 +0300)
committerAvi Gaffa <avi.gaffa@amdocs.com>
Mon, 6 Aug 2018 11:46:15 +0000 (11:46 +0000)
Add heat validation for generated artifacts,
like vendor-license-model.xml, vf-license-model.xml, HEAT.meta

Change-Id: Ie256b19679b5aebea1290f6b3f67692dfad5e980
Issue-ID: SDC-1600
Signed-off-by: eleonorali <eleonoral@amdocs.com>
12 files changed:
openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/main/java/org/openecomp/sdc/validation/impl/validators/HeatValidator.java
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/java/org/openecomp/sdc/validation/impl/validators/HeatValidatorTest.java
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/HEAT.meta [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/MANIFEST.json [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF.yml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF_volume.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF_volume.yml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/node_userdata_script.sh [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/vendor-license-model.xml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/vf-license-model.xml [new file with mode: 0644]

index 61fae7d..5525f71 100644 (file)
@@ -66,6 +66,8 @@ public enum Messages {
   CREATE_MANIFEST_FROM_ZIP("cannot create manifest from the attached zip file"),
   CANDIDATE_PROCESS_FAILED("Candidate zip file process failed"),
   FOUND_UNASSIGNED_FILES("cannot process zip since it has unassigned files"),
+  GENERATED_ARTIFACT_IN_USE("Artifact with file name %s is generated by SDC. "
+      + "Please remove this artifact from manifest and zip files"),
 
   /* Monitor uploads related errors*/
   ILLEGAL_MONITORING_ARTIFACT_TYPE("Illegal monitoring artifact type for component id %s, vsp id " +
index af3b503..ae289f9 100644 (file)
@@ -53,24 +53,37 @@ import org.openecomp.sdc.validation.impl.util.HeatValidationService;
 import org.openecomp.sdc.validation.util.ValidationUtil;
 
 public class HeatValidator implements Validator {
-  private static final Logger LOGGER = LoggerFactory.getLogger(HeatValidator.class);
-  private static final ErrorMessageCode ERROR_CODE_HOT_1 = new ErrorMessageCode("HOT1");
-  private static final ErrorMessageCode ERROR_CODE_HOT_2 = new ErrorMessageCode("HOT2");
-  private static final ErrorMessageCode ERROR_CODE_HOT_3 = new ErrorMessageCode("HOT3");
-  private static final ErrorMessageCode ERROR_CODE_HOT_4 = new ErrorMessageCode("HOT4");
-  private static final ErrorMessageCode ERROR_CODE_HOT_5 = new ErrorMessageCode("HOT5");
-  private static final ErrorMessageCode ERROR_CODE_HOT_6 = new ErrorMessageCode("HOT6");
-  private static final ErrorMessageCode ERROR_CODE_HOT_7 = new ErrorMessageCode("HOT7");
-  private static final ErrorMessageCode ERROR_CODE_HOT_8 = new ErrorMessageCode("HOT8");
-  private static final ErrorMessageCode ERROR_CODE_HOT_9 = new ErrorMessageCode("HOT9");
-  private static final ErrorMessageCode ERROR_CODE_HOT_10 = new ErrorMessageCode("HOT10");
-  private static final ErrorMessageCode ERROR_CODE_HOT_11 = new ErrorMessageCode("HOT11");
-  private static final ErrorMessageCode ERROR_CODE_HOT_12 = new ErrorMessageCode("HOT12");
-  private static final ErrorMessageCode ERROR_CODE_HOT_13 = new ErrorMessageCode("HOT13");
-  private static final ErrorMessageCode ERROR_CODE_HOT_14 = new ErrorMessageCode("HOT14");
-  private static final ErrorMessageCode ERROR_CODE_HOT_15 = new ErrorMessageCode("HOT15");
-  private static final ErrorMessageCode ERROR_CODE_HOT_16 = new ErrorMessageCode("HOT16");
-  private static final ErrorMessageCode ERROR_CODE_HOT_17 = new ErrorMessageCode("HOT17");
+    private static final Logger LOGGER = LoggerFactory.getLogger(HeatValidator.class);
+    private static final ErrorMessageCode ERROR_CODE_HOT_1 = new ErrorMessageCode("HOT1");
+    private static final ErrorMessageCode ERROR_CODE_HOT_2 = new ErrorMessageCode("HOT2");
+    private static final ErrorMessageCode ERROR_CODE_HOT_3 = new ErrorMessageCode("HOT3");
+    private static final ErrorMessageCode ERROR_CODE_HOT_4 = new ErrorMessageCode("HOT4");
+    private static final ErrorMessageCode ERROR_CODE_HOT_5 = new ErrorMessageCode("HOT5");
+    private static final ErrorMessageCode ERROR_CODE_HOT_6 = new ErrorMessageCode("HOT6");
+    private static final ErrorMessageCode ERROR_CODE_HOT_7 = new ErrorMessageCode("HOT7");
+    private static final ErrorMessageCode ERROR_CODE_HOT_8 = new ErrorMessageCode("HOT8");
+    private static final ErrorMessageCode ERROR_CODE_HOT_9 = new ErrorMessageCode("HOT9");
+    private static final ErrorMessageCode ERROR_CODE_HOT_10 = new ErrorMessageCode("HOT10");
+    private static final ErrorMessageCode ERROR_CODE_HOT_11 = new ErrorMessageCode("HOT11");
+    private static final ErrorMessageCode ERROR_CODE_HOT_12 = new ErrorMessageCode("HOT12");
+    private static final ErrorMessageCode ERROR_CODE_HOT_13 = new ErrorMessageCode("HOT13");
+    private static final ErrorMessageCode ERROR_CODE_HOT_14 = new ErrorMessageCode("HOT14");
+    private static final ErrorMessageCode ERROR_CODE_HOT_15 = new ErrorMessageCode("HOT15");
+    private static final ErrorMessageCode ERROR_CODE_HOT_16 = new ErrorMessageCode("HOT16");
+    private static final ErrorMessageCode ERROR_CODE_HOT_17 = new ErrorMessageCode("HOT17");
+
+    private static final ErrorMessageCode ERROR_CODE_HOT_18 = new ErrorMessageCode("HOT18");
+
+    // The Artifacts generated by SDC - not allowed to be in HEAT
+    static final String VF_LICENSE_MODEL_XML = "vf-license-model.xml";
+    static final String VENDOR_LICENSE_MODEL_XML = "vendor-license-model.xml";
+    static final String HEAT_META = "HEAT.meta";
+
+    private static final Set<String> GENERATED_ARTIFACTS;
+
+    static {
+        GENERATED_ARTIFACTS = getGeneratedArtifactNames();
+    }
 
   private static void validateAllRequiredArtifactsExist(String fileName,
                                                         HeatOrchestrationTemplate
@@ -494,16 +507,34 @@ public class HeatValidator implements Validator {
             fileName).getFile(), artifacts,
              globalContext));
 
-
     Set<String> manifestArtifacts = ManifestUtil.getArtifacts(manifestContent);
 
-    globalContext.getFiles().stream()
-        .filter(fileName -> isManifestArtifact(manifestArtifacts, fileName)
-        && isNotArtifact(artifacts, fileName))
-        .forEach(fileName -> globalContext.addMessage(fileName, ErrorLevel.WARNING,
-            ErrorMessagesFormatBuilder
+    globalContext.getFiles().stream().filter(fileName -> isManifestArtifact(manifestArtifacts, fileName)
+        && isNotArtifact(artifacts, fileName)).forEach(fileName -> {
+
+            globalContext.addMessage(fileName, ErrorLevel.WARNING, ErrorMessagesFormatBuilder
                 .getErrorWithParameters(ERROR_CODE_HOT_11,
-                    Messages.ARTIFACT_FILE_NOT_REFERENCED.getErrorMessage())));
+                    Messages.ARTIFACT_FILE_NOT_REFERENCED.getErrorMessage()));
+
+            validateGeneratedArtifact(fileName, globalContext);
+
+        });
+    }
+
+  private void validateGeneratedArtifact(String fileName, GlobalValidationContext globalContext) {
+        if (GENERATED_ARTIFACTS.contains(fileName)) {
+            globalContext.addMessage(fileName, ErrorLevel.ERROR, ErrorMessagesFormatBuilder
+                .getErrorWithParameters(ERROR_CODE_HOT_18,
+                    Messages.GENERATED_ARTIFACT_IN_USE.getErrorMessage(), fileName));
+        }
+  }
+
+  private static Set<String> getGeneratedArtifactNames() {
+    Set<String> predefinedArtifactNames = new HashSet<>();
+    predefinedArtifactNames.add(VF_LICENSE_MODEL_XML);
+    predefinedArtifactNames.add(VENDOR_LICENSE_MODEL_XML);
+    predefinedArtifactNames.add(HEAT_META);
+    return predefinedArtifactNames;
   }
 
   private boolean isManifestArtifact(Set<String> manifestArtifacts, String fileName) {
index 2ec119e..96b9ad6 100644 (file)
@@ -22,12 +22,15 @@ package org.openecomp.sdc.validation.impl.validators;
 
 
 import org.openecomp.core.validation.types.MessageContainer;
+import org.openecomp.sdc.common.errors.Messages;
+import org.openecomp.sdc.datatypes.error.ErrorMessage;
 import org.openecomp.sdc.validation.Validator;
 import org.openecomp.sdc.validation.util.ValidationTestUtil;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import java.io.IOException;
+import java.util.List;
 import java.util.Map;
 
 
@@ -159,7 +162,29 @@ public class HeatValidatorTest {
         "WARNING: [HOT10]: Invalid HEAT format problem - " +
             "[The heat file does not contain any resources]");
     Assert.assertEquals(messages.get("mount_iso_script.sh").getErrorMessageList().get(0).
-        getMessage(),"WARNING: [HOT11]: Artifact file is not referenced.");
+                                                                                                getMessage(),
+            "WARNING: [HOT11]: Artifact file is not referenced.");
+  }
+
+  @Test
+  public void testGeneratedArtifactExistInHeat() throws IOException {
+    Map<String, MessageContainer> messages = ValidationTestUtil.testValidator(new HeatValidator(),
+            RESOURCE_PATH + "/generated_artifact_exist/negative_test/input");
+    Assert.assertNotNull(messages);
+    Assert.assertEquals(messages.size(), 3);
+    checkGeneratedArtifactMessage(HeatValidator.VENDOR_LICENSE_MODEL_XML, messages);
+    checkGeneratedArtifactMessage(HeatValidator.VF_LICENSE_MODEL_XML, messages);
+    checkGeneratedArtifactMessage(HeatValidator.HEAT_META, messages);
+  }
+
+
+  private void checkGeneratedArtifactMessage(String fileName, Map<String, MessageContainer> messages) {
+      List<ErrorMessage> errorMessages = messages.get(fileName).getErrorMessageList();
+      Assert.assertEquals(errorMessages.size(), 2);
+      Assert.assertEquals(errorMessages.get(0).getMessage(),
+            "WARNING: [HOT11]: Artifact file is not referenced.");
+      String message = String.format(Messages.GENERATED_ARTIFACT_IN_USE.getErrorMessage(), fileName);
+      Assert.assertTrue(errorMessages.get(1).getMessage().contains(message));
   }
 
   @Test
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/HEAT.meta b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/HEAT.meta
new file mode 100644 (file)
index 0000000..dfdd868
--- /dev/null
@@ -0,0 +1,30 @@
+{
+  "importStructure": {
+    "heat": [
+      {
+        "fileName": "base_vIECCF.yml",
+        "type": "HEAT",
+        "isBase": true,
+        "env": {
+          "fileName": "base_vIECCF.env",
+          "type": "HEAT_ENV"
+        },
+        "volume": [
+          {
+            "fileName": "base_vIECCF_volume.yml",
+            "type": "HEAT_VOL",
+            "env": {
+              "fileName": "base_vIECCF_volume.env",
+              "type": "HEAT_ENV"
+            }
+          }
+        ],
+        "artifacts": [
+          {
+            "fileName": "node_userdata_script.sh"
+          }
+        ]
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/MANIFEST.json
new file mode 100644 (file)
index 0000000..d76e374
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "name": "vCCF_vUSP_1806DCAE_CtrlLp",
+  "description": "vCCF VSP for ControlLoop tenant",
+  "version": "0.0",
+  "data": [
+    {
+      "isBase": true,
+      "file": "base_vIECCF.yml",
+      "type": "HEAT",
+      "data": [
+        {
+          "file": "base_vIECCF.env",
+          "type": "HEAT_ENV"
+        },
+        {
+          "file": "base_vIECCF_volume.yml",
+          "type": "HEAT_VOL",
+          "data": [
+            {
+              "file": "base_vIECCF_volume.env",
+              "type": "HEAT_ENV"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "file": "HEAT.meta",
+      "type": "OTHER"
+    },
+    {
+      "file": "vf-license-model.xml",
+      "type": "OTHER"
+    },
+    {
+      "file": "node_userdata_script.sh",
+      "type": "OTHER"
+    },
+    {
+      "file": "vendor-license-model.xml",
+      "type": "OTHER"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF.env b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF.env
new file mode 100644 (file)
index 0000000..4bb5f54
--- /dev/null
@@ -0,0 +1,51 @@
+## Note: Nokia VM ENV file for vCCF
+## Copyright: Nokia 2016
+## Name: "base_vIECCF.env"
+## Date: 20 Dec 2016
+## Juno Version
+## Version History
+##  12/20/2016 
+##      - Initial version for IECCF R30.3.3
+##  01/06/2017
+##      - Updated vCCF package to address removal of shared volume for IO VMs
+##  01/19/2017
+##      - Updated vCCF package to address ICE feedback reviewed on 1/13/2017
+##      - Updated to remove Nokia related values and match AT&T environment
+##  02/17/2017
+##      - Updated vCCF package from Nokia
+##  06/23/2017
+##      - Updated vCCF package from Nokia to add output parameter for OAM IP address
+##  07/05/2017
+##      - Modified servicedata2 and app volume sizes to include space for eccfdata and incoming4cdrsch
+##  11/16/2017
+##      - Nokia update to replace ':' in VIP port names with '_'
+##  01/08/2018
+##      - Address AAP issue
+##  06/06/2018
+##      - Nokia update to the template package for CR418 (internal security group creation in the template)
+
+parameters:
+## PSEUDO CONSTANTS ----------------------------------------------------------------------
+    plt_flavor_name: nd.c2r4d50
+    iox_flavor_name: nd.c4r4d50
+    app_flavor_name: nd.c12r4d50
+
+    plt_image_name: USP_IECF-PILOT_30.3.3-mcas4.4.6.qcow2
+    iox_image_name: USP_IECF-IO_30.3.3-mcas4.4.6.qcow2
+    app_image_name: USP_IECF-APP_30.3.3-mcas4.4.6.qcow2
+
+    ieccf_debug: no
+
+    int_internal_subnet_cidr: 169.30.12.0/24
+
+    plt_pair_uuid: 573f433e25ba8
+    iox_pair_uuid: 573f433e284b4
+
+# These must be empty for AT&T
+    openstack_cacert: ""
+    config_server_cacert: ""
+
+#    growth_mini_siteinfo_url_01: ""
+
+#
+# Instance specific parameters 
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF.yml
new file mode 100644 (file)
index 0000000..4cb3107
--- /dev/null
@@ -0,0 +1,2225 @@
+heat_template_version: '2014-10-16'
+description: ''
+
+## Note: Nokia VM HOT file for vCCF
+## Copyright: Nokia 2016
+## Name: "base_vIECCF.yml"
+## Date: 20 Dec 2016
+## Juno Version
+## Version History
+##  12/20/2016 
+##      - Initial version for IECCF R30.3.3
+##  01/06/2017
+##      - Updated vCCF package to address removal of shared volume for IO VMs
+##  01/19/2017
+##      - Updated vCCF package to address ICE feedback reviewed on 1/13/2017
+##      - Updated to remove Nokia related values and match AT&T environment
+##      - Updated vm_role to match vm_type used in the resource naming convention
+##  02/17/2017
+##      - Updated vCCF package from Nokia
+##  06/23/2017
+##      - Updated vCCF package from Nokia to add output parameter for OAM IP address
+##  07/05/2017
+##      - Modified servicedata2 and app volume sizes to include space for eccfdata and incoming4cdrsch
+##  11/16/2017
+##      - Nokia update to replace ':' in VIP port names with '_'
+##  01/08/2018
+##      - Address AAP issue
+##  06/06/2018
+##      - Nokia update to the template package for CR418 (internal security group creation in the template)
+##      - Includes updates to comply with the 1Q2018 AT&T Heat guidelines
+
+parameters:
+    vnf_id:
+        type: string
+        description: Unique ID for this VF instance
+    vf_module_id:
+        type: string
+        description: Unique ID for this VF Module instance
+    vnf_name:
+        type: string
+        description: Unique name for this VF instance
+    vf_module_name:
+        type: string
+        description: Unique name for this VF Module instance
+
+    plt_names:
+        type: comma_delimited_list
+        description: VM names for plt VMs
+    iox_names:
+        type: comma_delimited_list
+        description: VM names for iox VMs
+    app_names:
+        type: comma_delimited_list
+        description: VM names for app VMs
+
+    openstack_cacert: # Is this needed, and why?
+        type: string
+        label: 'OpenStack CA Certificate'
+        description: 'CA Certificate to use for OpenStack client calls.'
+    config_server_cacert:
+        type: string
+        label: 'configure server CA Certificate'
+        description: 'CA Certificate for download from siteinfo url and config url.'
+        
+    ignore_siteinfo_audit:
+        type: string
+        label: 'Siteinfo Audit Ignore Flag'
+        description: 'Set to true if siteinfo audit failure should not prevent system installation'
+
+    availability_zone_0:
+        type: string
+        description: First availability zone ID or Name
+    availability_zone_1:
+        type: string
+        description: Second availability zone ID or Name
+
+    plt_image_name:
+        type: string
+        description: Pilot image
+        
+    plt_flavor_name:
+        type: string
+        description: Pilot flavor        
+        
+    iox_image_name:
+        type: string
+        description: IO image
+        
+    iox_flavor_name:
+        type: string
+        description: IO flavor
+        
+    app_image_name:
+        type: string
+        description: App image
+        
+    app_flavor_name:
+        type: string
+        description: App flavor
+        
+    oam_Sec_Grp:
+        type: comma_delimited_list
+        description: OAM security group
+        
+    data_Sec_Grp:
+        type: comma_delimited_list
+        description: DATA security group
+
+    oam_net_id:
+        type: string
+        description: 'OAM network'
+        
+    data_net_id:
+        type: string
+        description: 'DATA network'
+
+    siteinfo_url:
+        type: string
+        description: 'siteinfo url'
+    ieccf_config_url:
+        type: string
+        description: 'IECCF configuration package URL'
+    ieccf_debug:
+        type: string
+        description: 'IECCF debug flag'
+
+    name_server_1:
+        type: string
+        description: 'IP address of name server 1'
+    name_server_2:
+        type: string
+        description: 'IP address of name server 2'
+    domain:
+        type: string
+        description: What is this domain? 
+
+    plt_oam_ips:
+        type: comma_delimited_list
+        description: Fixed IPv4 assignments for plt VMs on the OAM network
+    iox_oam_ips:
+        type: comma_delimited_list
+        description: Fixed IPv4 assignments for iox VMs on the OAM network
+    app_oam_ips:
+        type: comma_delimited_list
+        description: Fixed IPv4 assignments for app VMs on the OAM network
+
+    plt_data_v6_ips:
+        type: comma_delimited_list
+        description: Fixed IPv6 assignments for plt VMs on the DATA network
+    iox_data_v6_ips:
+        type: comma_delimited_list
+        description: Fixed IPv6 assignments for iox VMs on the DATA network
+    app_data_v6_ips:
+        type: comma_delimited_list
+        description: Fixed IPv6 assignments for app VMs on the DATA network
+
+    plt_oam_floating_ip:
+        type: string
+        description: Floating IPv4 for plt VMs on the OAM network
+    iox_oam_floating_ip:
+        type: string
+        description: Floating IPv4 for iox VMs on the OAM network
+
+    plt_data_floating_v6_ip:
+        type: string
+        description: Floating IPv6 for plt VMs on the DATA network
+    iox_data_floating_v6_ip:
+        type: string
+        description: Floating IPv6 for iox VMs on the DATA network
+
+    int_internal_subnet_cidr:
+        type: string
+        description: IP subnet for internal network
+
+    plt_pair_uuid:
+        type: string
+        description: UUID for plt VM pair
+    iox_pair_uuid:
+        type: string
+        description: UUID for iox VM pair
+
+    plt_volume_shared_id_0:
+        type: string
+        description: ServiceData2 volume for plt VMs
+
+    plt_volume_id_0:
+        type: string
+        description: ServiceData1 volume for first plt VM
+
+    plt_volume_id_1:
+        type: string
+        description: ServiceData1 volume for second plt VM
+
+    app_volume_id_0:
+        type: string
+        description: ServiceData1 volume for first app VM
+
+    app_volume_id_1:
+        type: string
+        description: ServiceData1 volume for second app VM
+
+    app_volume_id_2:
+        type: string
+        description: ServiceData1 volume for third app VM
+
+    app_volume_id_3:
+        type: string
+        description: ServiceData1 volume for fourth app VM
+
+    app_volume_id_4:
+        type: string
+        description: ServiceData1 volume for fifth app VM
+
+    app_volume_id_5:
+        type: string
+        description: ServiceData1 volume for sixth app VM
+
+    app_volume_id_6:
+        type: string
+        description: ServiceData1 volume for seventh app VM
+
+                     
+resources:
+       
+    int_internal_network:
+        type: OS::Neutron::Net
+        properties:
+            name:
+                str_replace:
+                    template: $prefix-int_internal_network
+                    params:
+                        $prefix: { get_param: vnf_name }
+            
+    int_internal_subnet_0:
+        type: OS::Neutron::Subnet
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-int_internal_subnet_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            cidr: {get_param: int_internal_subnet_cidr}
+            network: {get_resource: int_internal_network }
+            enable_dhcp: 'True'
+            gateway_ip: ''
+
+    plt_int_internal_Sec_Grp:
+        type: OS::Neutron::SecurityGroup
+        properties:
+            description: Open ports needed by plt instance, enable ping
+            name:
+                str_replace:
+                  template: $vnf_name-plt_int_internal_Sec_Grp
+                  params:
+                    $vnf_name: { get_param: vnf_name }
+            rules: [
+                {direction: ingress, ethertype: IPv4, remote_ip_prefix: { get_attr: [ int_internal_subnet_0, cidr ] } },
+                {direction: egress, ethertype: IPv4, remote_ip_prefix: { get_attr: [ int_internal_subnet_0, cidr ] } }
+            ] 
+
+    iox_int_internal_Sec_Grp:
+        type: OS::Neutron::SecurityGroup
+        properties:
+            description: Open ports needed by iox instance, enable ping
+            name:
+                str_replace:
+                  template: $vnf_name-iox_int_internal_Sec_Grp
+                  params:
+                    $vnf_name: { get_param: vnf_name }
+            rules: [
+                {direction: ingress, ethertype: IPv4, remote_ip_prefix: { get_attr: [ int_internal_subnet_0, cidr ] } },
+                {direction: egress, ethertype: IPv4, remote_ip_prefix: { get_attr: [ int_internal_subnet_0, cidr ] } }
+            ] 
+    
+    app_int_internal_Sec_Grp:
+        type: OS::Neutron::SecurityGroup
+        properties:
+            description: Open ports needed by app instance, enable ping
+            name:
+                str_replace:
+                  template: $vnf_name-app_int_internal_Sec_Grp
+                  params:
+                    $vnf_name: { get_param: vnf_name }
+            rules: [
+                {direction: ingress, ethertype: IPv4, remote_ip_prefix: { get_attr: [ int_internal_subnet_0, cidr ] } },
+                {direction: egress, ethertype: IPv4, remote_ip_prefix: { get_attr: [ int_internal_subnet_0, cidr ] } }
+            ]
+            
+    app_Server_Grp:
+        type: OS::Nova::ServerGroup
+        properties:
+            name:
+                str_replace:
+                  params:
+                      $vnf_name: {get_param: vnf_name}
+                  template: $vnf_name-app_Server_Grp
+            policies:
+                - anti-affinity
+
+#    plt_server_0:
+    'node:m001:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [plt_names, 0]}
+            availability_zone:
+                get_param: availability_zone_0
+            image:
+                get_param: plt_image_name
+            flavor:
+                get_param: plt_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: plt_volume_id_0
+            networks:
+                -
+                    port:
+                        get_resource: plt_0_int_internal_port_0
+                -
+                    port:
+                        get_resource: plt_0_oam_port_0
+                -
+                    port:
+                        get_resource: plt_0_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: A
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__:
+                            get_param: openstack_cacert
+#                            get_file: openstack_cacert.crt
+                        __cs_cacert__:
+                            get_param: config_server_cacert
+#                            get_file: config_server_cacert.crt
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: { get_param: domain }
+                        __shared_volid1__:
+#                            get_resource: 'node:m001:m002:shared_vol1'
+                            get_param: plt_volume_shared_id_0
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: plt
+        metadata:
+            mcas_id: m001
+            networks:
+                -
+                    get_attr:
+                        - plt_0_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - plt_0_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - plt_0_data_port_0
+                        - network_id
+            mcas_mate_id: m002
+            pair_uuid: {get_param: plt_pair_uuid}
+            shared_vol1: {get_param: plt_volume_shared_id_0}
+            
+    plt_0_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-plt_0_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+                            - 'network:system:vip:m001:m002'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            security_groups:
+                -
+                    get_resource: plt_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+            
+    plt_0_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-plt_0_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_plt_oam_floating_ip_0
+                            - 'network:oam:vip:m001:m002'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [plt_oam_ips, 0]}
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam
+            
+    plt_0_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-plt_0_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_plt_data_floating_ip_0
+                            - 'network:data:vip:m001:m002'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [plt_data_v6_ips, 0]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+#    plt_server_1:
+    'node:m002:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [plt_names, 1]}
+            availability_zone:
+                get_param: availability_zone_1
+            image:
+                get_param: plt_image_name
+            flavor:
+                get_param: plt_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: plt_volume_id_1
+            networks:
+                -
+                    port:
+                        get_resource: plt_1_int_internal_port_0
+                -
+                    port:
+                        get_resource: plt_1_oam_port_0
+                -
+                    port:
+                        get_resource: plt_1_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: B
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__:
+                            get_param: openstack_cacert
+#                            get_file: openstack_cacert.crt
+                        __cs_cacert__:
+                            get_param: config_server_cacert
+#                            get_file: config_server_cacert.crt
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+                        __shared_volid1__:
+#                            get_resource: 'node:m001:m002:shared_vol1'
+                            get_param: plt_volume_shared_id_0
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: plt
+        metadata:
+            mcas_id: m002
+            networks:
+                -
+                    get_attr:
+                        - plt_1_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - plt_1_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - plt_1_data_port_0
+                        - network_id
+            mcas_mate_id: m001
+            pair_uuid: {get_param: plt_pair_uuid}
+            shared_vol1: {get_param: plt_volume_shared_id_0}
+            
+    plt_1_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-plt_1_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+                            - 'network:system:vip:m001:m002'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            security_groups:
+                -
+                    get_resource: plt_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    plt_1_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-plt_1_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_plt_oam_floating_ip_0
+                            - 'network:oam:vip:m001:m002'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [plt_oam_ips, 1]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam
+            
+    plt_1_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-plt_1_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_plt_data_floating_ip_0
+                            - 'network:data:vip:m001:m002'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [plt_data_v6_ips, 1]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+            
+#    Reserve_Port_plt_int_internal_floating_ip_0:
+    'network:system:vip:m001:m002':
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: '$vnf_name-network_system_vip_m001_m002'
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: plt_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+            pair_uuid: {get_param: plt_pair_uuid}
+            
+#    Reserve_Port_plt_oam_floating_ip_0:
+    'network:oam:vip:m001:m002':
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: '$vnf_name-network_oam_vip_m001_m002'
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: plt_oam_floating_ip}
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam
+            pair_uuid: {get_param: plt_pair_uuid}
+            
+#    Reserve_Port_plt_data_floating_ip_0:
+    'network:data:vip:m001:m002':
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: '$vnf_name-network_data_vip_m001_m002'
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: plt_data_floating_v6_ip}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+            pair_uuid: {get_param: plt_pair_uuid}
+
+#    iox_server_0:
+    'node:m003:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [iox_names, 0]}
+            availability_zone:
+                get_param: availability_zone_0
+            image:
+                get_param: iox_image_name
+            flavor:
+                get_param: iox_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            networks:
+                -
+                    port:
+                        get_resource: iox_0_int_internal_port_0
+                -
+                    port:
+                        get_resource: iox_0_oam_port_0
+                -
+                    port:
+                        get_resource: iox_0_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+#                        __shared_volid1__:
+#                            get_resource: 'node:m003:m004:shared_vol1'
+#                            get_param: iox_volume_shared_0
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: iox
+        metadata:
+            mcas_id: m003
+            networks:
+                -
+                    get_attr:
+                        - iox_0_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - iox_0_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - iox_0_data_port_0
+                        - network_id
+            mcas_mate_id: m004
+            pair_uuid: {get_param: iox_pair_uuid}
+
+    iox_0_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-iox_0_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: iox_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    iox_0_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-iox_0_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_iox_oam_floating_ip_0
+                            - 'network:io:vip:m004:m003'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [iox_oam_ips, 0]}
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: io
+            
+    iox_0_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-iox_0_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_iox_data_floating_ip_0
+                            - 'network:data:vip:m004:m003'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [iox_data_v6_ips, 0]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+#    iox_server_1:
+    'node:m004:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [iox_names, 1]}
+            availability_zone:
+                get_param: availability_zone_1
+            image:
+                get_param: iox_image_name
+            flavor:
+                get_param: iox_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            networks:
+                -
+                    port:
+                        get_resource: iox_1_int_internal_port_0
+                -
+                    port:
+                        get_resource: iox_1_oam_port_0
+                -
+                    port:
+                        get_resource: iox_1_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+#                        __shared_volid1__:
+#                            get_resource: 'node:m003:m004:shared_vol1'
+#                            get_param: iox_volume_shared_0
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: iox
+        metadata:
+            mcas_id: m004
+            networks:
+                -
+                    get_attr:
+                        - iox_1_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - iox_1_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - iox_1_data_port_0
+                        - network_id
+            mcas_mate_id: m003
+            pair_uuid: {get_param: iox_pair_uuid}
+            
+    iox_1_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-iox_1_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: iox_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+    iox_1_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-iox_1_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_iox_oam_floating_ip_0
+                            - 'network:io:vip:m004:m003'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [iox_oam_ips, 1]}
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: io
+            
+    iox_1_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-iox_1_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            allowed_address_pairs:
+                -
+                    ip_address:
+                        get_attr:
+#                            - Reserve_Port_iox_data_floating_ip_0
+                            - 'network:data:vip:m004:m003'
+                            - fixed_ips
+                            - 0
+                            - ip_address
+            fixed_ips:
+                -
+                    ip_address: {get_param: [iox_data_v6_ips, 1]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+            
+#    Reserve_Port_iox_oam_floating_ip_0:
+    'network:io:vip:m004:m003':
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: '$vnf_name-network_io_vip_m004_m003'
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: iox_oam_floating_ip}
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: io
+            pair_uuid: {get_param: iox_pair_uuid}
+            
+#    Reserve_Port_iox_data_floating_ip_0:
+    'network:data:vip:m004:m003':
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: '$vnf_name-network_data_vip_m004_m003'
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: iox_data_floating_v6_ip}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+            pair_uuid: {get_param: iox_pair_uuid}
+
+#    app_server_0:
+    'node:m005:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [app_names, 0]}
+            availability_zone:
+                get_param: availability_zone_0
+            image:
+                get_param: app_image_name
+            flavor:
+                get_param: app_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: app_volume_id_0
+            networks:
+                -
+                    port:
+                        get_resource: app_0_int_internal_port_0
+                -
+                    port:
+                        get_resource: app_0_oam_port_0
+                -
+                    port:
+                        get_resource: app_0_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+            scheduler_hints: 
+                group: {get_resource: app_Server_Grp}
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: app
+        metadata:
+            mcas_id: m005
+            networks:
+                -
+                    get_attr:
+                        - app_0_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_0_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_0_data_port_0
+                        - network_id
+                        
+    app_0_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_0_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: app_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    app_0_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_0_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_oam_ips, 0]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam    
+    
+    app_0_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_0_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_data_v6_ips, 0]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+#    app_server_1:
+    'node:m006:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [app_names, 1]}
+            availability_zone:
+                get_param: availability_zone_1
+            image:
+                get_param: app_image_name
+            flavor:
+                get_param: app_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: app_volume_id_1
+            networks:
+                -
+                    port:
+                        get_resource: app_1_int_internal_port_0
+                -
+                    port:
+                        get_resource: app_1_oam_port_0
+                -
+                    port:
+                        get_resource: app_1_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+            scheduler_hints: 
+                group: {get_resource: app_Server_Grp}
+
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: app
+        metadata:
+            mcas_id: m006
+            networks:
+                -
+                    get_attr:
+                        - app_1_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_1_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_1_data_port_0
+                        - network_id
+                        
+    app_1_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_1_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: app_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    app_1_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_1_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_oam_ips, 1]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam    
+
+    app_1_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_1_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_data_v6_ips, 1]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+#    app_server_2:
+    'node:m007:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [app_names, 2]}
+            availability_zone:
+                get_param: availability_zone_0
+            image:
+                get_param: app_image_name
+            flavor:
+                get_param: app_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: app_volume_id_2
+            networks:
+                -
+                    port:
+                        get_resource: app_2_int_internal_port_0
+                -
+                    port:
+                        get_resource: app_2_oam_port_0
+                -
+                    port:
+                        get_resource: app_2_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+            scheduler_hints: 
+                group: {get_resource: app_Server_Grp}
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: app
+        metadata:
+            mcas_id: m007
+            networks:
+                -
+                    get_attr:
+                        - app_2_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_2_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_2_data_port_0
+                        - network_id
+                        
+    app_2_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_2_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: app_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    app_2_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_2_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_oam_ips, 2]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam    
+
+    app_2_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_2_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_data_v6_ips, 2]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+#    app_server_3:
+    'node:m008:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [app_names, 3]}
+            availability_zone:
+                get_param: availability_zone_1
+            image:
+                get_param: app_image_name
+            flavor:
+                get_param: app_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: app_volume_id_3
+            networks:
+                -
+                    port:
+                        get_resource: app_3_int_internal_port_0
+                -
+                    port:
+                        get_resource: app_3_oam_port_0
+                -
+                    port:
+                        get_resource: app_3_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+            scheduler_hints: 
+                group: {get_resource: app_Server_Grp}
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: app
+        metadata:
+            mcas_id: m008
+            networks:
+                -
+                    get_attr:
+                        - app_3_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_3_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_3_data_port_0
+                        - network_id
+                        
+    app_3_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_3_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: app_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    app_3_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_3_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_oam_ips, 3]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam    
+
+    app_3_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_3_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_data_v6_ips, 3]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+#    app_server_4:
+    'node:m009:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [app_names, 4]}
+            availability_zone:
+                get_param: availability_zone_0
+            image:
+                get_param: app_image_name
+            flavor:
+                get_param: app_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: app_volume_id_4
+            networks:
+                -
+                    port:
+                        get_resource: app_4_int_internal_port_0
+                -
+                    port:
+                        get_resource: app_4_oam_port_0
+                -
+                    port:
+                        get_resource: app_4_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+            scheduler_hints: 
+                group: {get_resource: app_Server_Grp}
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: app
+        metadata:
+            mcas_id: m009
+            networks:
+                -
+                    get_attr:
+                        - app_4_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_4_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_4_data_port_0
+                        - network_id
+                        
+    app_4_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_4_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: app_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    app_4_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_4_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_oam_ips, 4]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam    
+
+    app_4_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_4_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_data_v6_ips, 4]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+#    app_server_5:
+    'node:m010:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [app_names, 5]}
+            availability_zone:
+                get_param: availability_zone_1
+            image:
+                get_param: app_image_name
+            flavor:
+                get_param: app_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: app_volume_id_5
+            networks:
+                -
+                    port:
+                        get_resource: app_5_int_internal_port_0
+                -
+                    port:
+                        get_resource: app_5_oam_port_0
+                -
+                    port:
+                        get_resource: app_5_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+            scheduler_hints: 
+                group: {get_resource: app_Server_Grp}
+
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: app
+        metadata:
+            mcas_id: m010
+            networks:
+                -
+                    get_attr:
+                        - app_5_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_5_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_5_data_port_0
+                        - network_id
+                        
+    app_5_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_5_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: app_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    app_5_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_5_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_oam_ips, 5]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam    
+
+    app_5_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_5_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_data_v6_ips, 5]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+#    app_server_6:
+    'node:m011:server':
+        type: OS::Nova::Server
+        properties:
+            name: { get_param: [app_names, 6]}
+            availability_zone:
+                get_param: availability_zone_0
+            image:
+                get_param: app_image_name
+            flavor:
+                get_param: app_flavor_name
+            image_update_policy: REBUILD
+            config_drive: 'True'
+            block_device_mapping:
+                -
+                    delete_on_termination: 'false'
+                    device_name: vdb
+                    volume_id:
+                        get_param: app_volume_id_6
+            networks:
+                -
+                    port:
+                        get_resource: app_6_int_internal_port_0
+                -
+                    port:
+                        get_resource: app_6_oam_port_0
+                -
+                    port:
+                        get_resource: app_6_data_port_0
+            user_data_format: RAW
+            user_data:
+                str_replace:
+                    template:
+                        get_file: node_userdata_script.sh
+#                        get_param: _node_userdata_script_
+                    params:
+                        __heat_stack_name__:
+                            get_param: 'OS::stack_name'
+                        __node_siteinfo_url__: { get_param: siteinfo_url }
+                        __ieccf_config_url__: { get_param: ieccf_config_url }
+                        __ieccf_debug__: { get_param: ieccf_debug }
+                        __activepilot_ip__:
+                            get_attr:
+#                                - Reserve_Port_plt_int_internal_floating_ip_0
+                                - 'network:system:vip:m001:m002'
+                                - fixed_ips
+                                - 0
+                                - ip_address
+                        __host_key__:
+                            get_attr:
+                                - 'sysinfo:host_key'
+                                - value
+                        __pilot__: ''
+                        __script_url__: ''
+                        __script_args__: ''
+                        __os_cacert__: ''
+                        __cs_cacert__: ''
+                        __post_exec__: ''
+                        __ignore_siteinfo_audit__:
+                            get_param: ignore_siteinfo_audit
+                        __nameserver1__: {get_param: name_server_1}
+                        __nameserver2__: {get_param: name_server_2}
+                        __domain__: {get_param: domain}
+            scheduler_hints: 
+                group: {get_resource: app_Server_Grp}
+
+            metadata:
+                vnf_id: {get_param: vnf_id}
+                vnf_name: {get_param: vnf_name}
+                vf_module_id: {get_param: vf_module_id}
+                vf_module_name: {get_param: vf_module_name}
+                vm_role: app
+        metadata:
+            mcas_id: m011
+            networks:
+                -
+                    get_attr:
+                        - app_6_int_internal_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_6_oam_port_0
+                        - network_id
+                -
+                    get_attr:
+                        - app_6_data_port_0
+                        - network_id
+                        
+    app_6_int_internal_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_6_int_internal_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: {get_resource: int_internal_network }
+            replacement_policy: AUTO
+            security_groups:
+                -
+                    get_resource: app_int_internal_Sec_Grp
+        metadata:
+            os_net: {get_resource: int_internal_network }
+
+    app_6_oam_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_6_oam_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: oam_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_oam_ips, 6]}
+                    
+            security_groups:
+                get_param: oam_Sec_Grp
+        metadata:
+            os_net: { get_param: oam_net_id }
+            ext_net: oam    
+
+    app_6_data_port_0:
+        type: OS::Neutron::Port
+        properties:
+            name:
+                str_replace:
+                    template: $vnf_name-app_6_data_port_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+            network: { get_param: data_net_id }
+            replacement_policy: AUTO
+            fixed_ips:
+                -
+                    ip_address: {get_param: [app_data_v6_ips, 6]}
+            security_groups:
+                get_param: data_Sec_Grp
+        metadata:
+            os_net: { get_param: data_net_id }
+            ext_net: data
+
+    'sysinfo:input_store':  # What is the purpose of this?
+        type: 'OS::Heat::RandomString'
+        metadata:
+            parameters:
+                vnf_name:
+                    get_param: vnf_name
+                __os_cacert__:
+                    get_param: openstack_cacert
+#                    get_file: openstack_cacert.crt
+                __cs_cacert__:
+                    get_param: config_server_cacert
+#                    get_file: config_server_cacert.crt
+                ignore_siteinfo_audit:
+                    get_param: ignore_siteinfo_audit
+                m001_avail_zone:
+                    get_param: availability_zone_0
+                m001_image:
+                    get_param: plt_image_name
+                m001_flavor:
+                    get_param: plt_flavor_name
+                m001_security_groups:
+                    get_resource: plt_int_internal_Sec_Grp
+                m002_avail_zone:
+                    get_param: availability_zone_1
+                m002_image:
+                    get_param: plt_image_name
+                m002_flavor:
+                    get_param: plt_flavor_name
+                m002_security_groups:
+                    get_resource: plt_int_internal_Sec_Grp
+                m003_avail_zone:
+                    get_param: availability_zone_0
+                m003_image:
+                    get_param: iox_image_name
+                m003_flavor:
+                    get_param: iox_flavor_name
+                m003_security_groups:
+                    get_resource: iox_int_internal_Sec_Grp
+                m004_avail_zone:
+                    get_param: availability_zone_1
+                m004_image:
+                    get_param: iox_image_name
+                m004_flavor:
+                    get_param: iox_flavor_name
+                m004_security_groups:
+                    get_resource: iox_int_internal_Sec_Grp
+                m005_avail_zone:
+                    get_param: availability_zone_0
+                m005_image:
+                    get_param: app_image_name
+                m005_flavor:
+                    get_param: app_flavor_name
+                m005_security_groups:
+                    get_resource: app_int_internal_Sec_Grp
+                m006_avail_zone:
+                    get_param: availability_zone_1
+                m006_image:
+                    get_param: app_image_name
+                m006_flavor:
+                    get_param: app_flavor_name
+                m006_security_groups:
+                    get_resource: app_int_internal_Sec_Grp
+                m007_avail_zone:
+                    get_param: availability_zone_0
+                m007_image:
+                    get_param: app_image_name
+                m007_flavor:
+                    get_param: app_flavor_name
+                m007_security_groups:
+                    get_resource: app_int_internal_Sec_Grp
+                m008_avail_zone:
+                    get_param: availability_zone_1
+                m008_image:
+                    get_param: app_image_name
+                m008_flavor:
+                    get_param: app_flavor_name
+                m008_security_groups:
+                    get_resource: app_int_internal_Sec_Grp
+                m009_avail_zone:
+                    get_param: availability_zone_0
+                m009_image:
+                    get_param: app_image_name
+                m009_flavor:
+                    get_param: app_flavor_name
+                m009_security_groups:
+                    get_resource: app_int_internal_Sec_Grp
+                m010_avail_zone:
+                    get_param: availability_zone_1
+                m010_image:
+                    get_param: app_image_name
+                m010_flavor:
+                    get_param: app_flavor_name
+                m010_security_groups:
+                    get_resource: app_int_internal_Sec_Grp
+                m011_avail_zone:
+                    get_param: availability_zone_0
+                m011_image:
+                    get_param: app_image_name
+                m011_flavor:
+                    get_param: app_flavor_name
+                m011_security_groups:
+                    get_resource: app_int_internal_Sec_Grp
+    'sysinfo:host_key':
+        type: 'OS::Heat::RandomString'
+        properties:
+            length: 255
+
+outputs:
+    oam_management_v4_address:
+        description: pilot OAM IP
+#        value: { get_attr: [Reserve_Port_plt_oam_floating_ip_0,fixed_ips, 0, ip_address ]}
+        value: { get_attr: ['network:oam:vip:m001:m002',fixed_ips, 0, ip_address ]}
+
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF_volume.env b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF_volume.env
new file mode 100644 (file)
index 0000000..d933e1b
--- /dev/null
@@ -0,0 +1,36 @@
+## Note: Nokia Volume ENV file for vCCF
+## Copyright: Nokia 2016
+## Name: "base_vIECCF_volume.env"
+## Date: 20 Dec 2016
+## Juno Version
+## Version History
+##  12/20/2016 
+##      - Initial version for IECCF R30.3.3
+##  01/06/2017
+##      - Updated vCCF package to address removal of shared volume for IO VMs
+##  01/19/2017
+##      - Updated vCCF package to address ICE feedback reviewed on 1/13/2017
+##      - Updated to remove Nokia related values and match AT&T environment
+##  02/17/2017
+##      - Updated vCCF package from Nokia
+##  06/23/2017
+##      - Updated vCCF package from Nokia to add output parameter for OAM IP address
+##  07/05/2017
+##      - Modified servicedata2 and app volume sizes to include space for eccfdata and incoming4cdrsch
+##  11/16/2017
+##      - Nokia update to replace ':' in VIP port names with '_'
+##  01/08/2018
+##      - Address AAP issue
+##  06/06/2018
+##      - Nokia update to the template package for CR418 (internal security group creation in the template)
+
+parameters:
+## PSEUDO CONSTANTS ----------------------------------------------------------
+    plt_servicedata1_volume_size_0: 70
+    plt_servicedata2_volume_size_0: 150
+
+    app_volume_size_0: 130
+
+#
+# Instance specific parameters 
+#
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF_volume.yml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/base_vIECCF_volume.yml
new file mode 100644 (file)
index 0000000..b21379b
--- /dev/null
@@ -0,0 +1,210 @@
+heat_template_version: 2014-10-16
+
+description: Volume creation template for vCCF
+
+## Note: Nokia Volume HOT file for vCCF
+## Copyright: Nokia 2016
+## Name: "base_vIECCF_volume.yml"
+## Date: 20 Dec 2016
+## Juno Version
+## Version History
+##  12/20/2016 
+##      - Initial version for IECCF R30.3.3
+##  01/06/2017
+##      - Updated vCCF package to address removal of shared volume for IO VMs
+##  01/19/2017
+##      - Updated vCCF package to address ICE feedback reviewed on 1/13/2017
+##      - Updated to remove Nokia related values and match AT&T environment
+##  02/17/2017
+##      - Updated vCCF package from Nokia
+##  06/23/2017
+##      - Updated vCCF package from Nokia to add output parameter for OAM IP address
+##  07/05/2017
+##      - Modified servicedata2 and app volume sizes to include space for eccfdata and incoming4cdrsch
+##  11/16/2017
+##      - Nokia update to replace ':' in VIP port names with '_'
+##  01/08/2018
+##      - Address AAP issue
+##  06/06/2018
+##      - Nokia update to the template package for CR418 (internal security group creation in the template)
+##      - Includes updates to comply with the 1Q2018 AT&T Heat guidelines
+
+
+parameters:
+    vnf_name:
+        type: string
+        description: Unique name for this VF instance
+        
+    plt_servicedata1_volume_size_0:
+        type: number
+        description: Size of Service Data 1 Volume for plt VMs
+        constraints:
+          - range: { min: 1, max: 9999 }
+            description: "Must be between 1 and 9999 GB"
+            
+    plt_servicedata2_volume_size_0:
+        type: number
+        description: Size of Service Data 2 Volume for plt VMs
+        constraints:
+          - range: { min: 1, max: 9999 }
+            description: "Must be between 1 and 9999 GB"
+            
+    app_volume_size_0: 
+        type: number
+        description: Size of Service Data 1 Volume for app VMs
+        constraints:
+          - range: { min: 1, max: 9999 }
+            description: "Must be between 1 and 9999 GB"
+
+resources:
+    plt_volume_2:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: plt_servicedata2_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-plt_volume_2
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    plt_volume_0:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: plt_servicedata1_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-plt_volume_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    plt_volume_1:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: plt_servicedata1_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-plt_volume_1
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    app_volume_0:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: app_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-app_volume_0
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    app_volume_1:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: app_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-app_volume_1
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    app_volume_2:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: app_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-app_volume_2
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    app_volume_3:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: app_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-app_volume_3
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    app_volume_4:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: app_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-app_volume_4
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    app_volume_5:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: app_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-app_volume_5
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+    app_volume_6:
+        type: OS::Cinder::Volume
+        properties:
+            size: { get_param: app_volume_size_0 }
+            name: 
+                str_replace:
+                    template: $vnf_name-app_volume_6
+                    params:
+                        $vnf_name:
+                            get_param: vnf_name
+
+outputs:
+    plt_volume_shared_id_0:
+        description: ServiceData2 volume for plt VMs
+        value: {get_resource: plt_volume_2}
+
+    plt_volume_id_0:
+        description: ServiceData1 volume for first plt VM
+        value: {get_resource: plt_volume_0}
+
+    plt_volume_id_1:
+        description: ServiceData1 volume for second plt VM
+        value: {get_resource: plt_volume_1}
+
+    app_volume_id_0:
+        description: ServiceData1 volume for first app VM
+        value: {get_resource: app_volume_0}
+
+    app_volume_id_1:
+        description: ServiceData1 volume for second app VM
+        value: {get_resource: app_volume_1}
+
+    app_volume_id_2:
+        description: ServiceData1 volume for third app VM
+        value: {get_resource: app_volume_2}
+
+    app_volume_id_3:
+        description: ServiceData1 volume for fourth app VM
+        value: {get_resource: app_volume_3}
+
+    app_volume_id_4:
+        description: ServiceData1 volume for fifth app VM
+        value: {get_resource: app_volume_4}
+
+    app_volume_id_5:
+        description: ServiceData1 volume for sixth app VM
+        value: {get_resource: app_volume_5}
+
+    app_volume_id_6:
+        description: ServiceData1 volume for seventh app VM
+        value: {get_resource: app_volume_6}
+
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/node_userdata_script.sh b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/node_userdata_script.sh
new file mode 100644 (file)
index 0000000..637c7ac
--- /dev/null
@@ -0,0 +1,152 @@
+#!/bin/sh
+
+# Save cs_cacert file
+cs_cacert="__cs_cacert__"
+[[ -n $cs_cacert ]] && {
+    echo "$cs_cacert" > /etc/ieccf/conf/cs_cacert
+    chmod 400 /etc/ieccf/conf/cs_cacert
+}
+      
+typeset -l ENABLE_DEBUG="__ieccf_debug__"
+[[ "$ENABLE_DEBUG" == "t" || "$ENABLE_DEBUG" == "y" ]] && export DEBUG=YES
+
+# Store ieccf config url in /etc/ieccf/conf/ieccf_config_url
+ic_url="__ieccf_config_url__"
+[[ -n $ic_url ]] && echo "$ic_url" > /etc/ieccf/conf/ieccf_config_url
+
+mkdir -p /etc/psp
+
+#
+# Common code for all nodes
+#
+
+# store VMID in /etc/psp/vmid
+cat /var/lib/cloud/data/instance-id > /etc/psp/vmid 2>/dev/null
+
+# Store siteinfo url in /etc/psp/siteinfo_url
+stack_name="__heat_stack_name__"
+[[ -n $stack_name ]] && echo "$stack_name" > /etc/psp/heat_stack_name
+
+# Store siteinfo url in /etc/psp/siteinfo_url
+si_url="__node_siteinfo_url__"
+[[ -n $si_url ]] && echo "$si_url" > /etc/psp/siteinfo_url
+
+# Store ActivePilot IP in /etc/psp/ActivePilot
+activepilot_ip=__activepilot_ip__
+[[ -n $activepilot_ip ]] && echo $activepilot_ip > /etc/psp/ActivePilot
+
+# Inject an ActivePilot route
+echo "$(</etc/psp/ActivePilot) dev eth0" > /etc/sysconfig/network-scripts/route-cloud0
+/etc/sysconfig/network-scripts/ifup-routes cloud0
+
+# Store host security key in /etc/psp/host_key
+host_key="__host_key__"
+[[ -n $host_key ]] && {
+echo "$host_key" > /etc/psp/host_key
+chmod 400 /etc/psp/host_key
+}
+
+# Store shared volume ID in /etc/psp/shared_volid1
+shared_volid1="__shared_volid1__"
+[[ $shared_volid1 != __*__  ]] && {
+echo "$shared_volid1" > /etc/psp/shared_volid1
+chmod 400 /etc/psp/shared_volid1
+}
+
+#
+# Pilot code
+#
+
+typeset -u pilot="__pilot__"
+[[ -n $pilot ]] || exit 0
+
+# Set I_am file
+rm -f /root/.I_am_[AB]
+touch /root/.I_am_$pilot
+
+# Allow SSH via Password
+sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
+sed -i 's/^PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
+service sshd restart
+
+# Pass ignore_audit through template
+typeset -u ignore_audit="__ignore_siteinfo_audit__"
+case $ignore_audit in
+    1|T|TRUE|ON|Y|YES) touch /root/ignore_audit;;
+esac
+    
+# Save os_cacert file
+os_cacert="__os_cacert__"
+[[ -n $os_cacert ]] && {
+    echo "$os_cacert" > /etc/psp/os_cacert
+    chmod 400 /etc/psp/os_cacert
+}
+
+# Update resolv.conf based on passed nameserver and domain
+nameserver1="__nameserver1__"
+nameserver2="__nameserver2__"
+domain="__domain__"
+[[ -n $nameserver1 ]] && {
+  # Need to modify the ifup-dhcp script so that ifup LSN doesn't append
+  # unwanted entries to resolv.conf
+  # This is necessary to support releases where udhcpc client is still used for internal
+  sed -i '/RESOLV_CONF=/a RESOLV_CONF="/tmp/resolv.overridden"' /etc/sysconfig/network-scripts/ifup-dhcp
+  
+  # Kill off any running DHCP clients as they may re-write resolv.conf
+  pkill -f /sbin/dhclient
+  
+  > /etc/resolv.conf
+  echo "; set by MCAS userdata script DHCP override" >> /etc/resolv.conf
+  [[ -n $domain ]] && echo search $domain >> /etc/resolv.conf
+  echo nameserver $nameserver1 >> /etc/resolv.conf
+  [[ -n $nameserver2 ]] && echo nameserver $nameserver2 >> /etc/resolv.conf
+  
+  # Need to set PEERDNS in network for RHEL6 dhclient support as
+  # dhclient-script doesn't read ifcfg files correctly
+  grep -qs PEERDNS=no /etc/sysconfig/network || echo PEERDNS=no >> /etc/sysconfig/network
+  
+  
+  # Update ifcfg files to prevent DHCP client resolv.conf changes
+  for f in /etc/sysconfig/network-scripts/ifcfg-cloud*; do
+    ifup ${f##ifcfg-} &
+  done
+}
+      
+# Localize exists, kick that off and exit
+if [[ -f /opt/config/bin/Localize ]]; then
+    rm -f /install/fresh.install
+    typeset -A args=([A]=install)
+    /opt/config/bin/Localize ${args[$pilot]} &
+else
+    # No Localize, Staging install, just setup and autoinstall
+    # will kick off newinstall1
+    mkdir -p /install
+    touch /install/fresh.install
+fi
+
+script_url="__script_url__"
+script_args="__script_args__"
+
+if [[ -n $script_url ]]; then
+tmp_script=/tmp/pilot${pilot}_startup
+# Delete any pre-existing script, we don't want to execute an old, leftover script
+rm -f $tmp_script
+while true; do
+    curl --connect-timeout 5 -o $tmp_script -gf $script_url 2>> ${tmp_script}.curl.out
+    [[ -f $tmp_script ]] && break
+    # Break for a detected SU/CPR in progress
+    [[ -f /root/.SU_inprog ]] && echo "SU detected" && exit 0
+    [[ -f /root/.CPR_inprog ]] && echo "CPR detected" && exit 0
+    echo "Download of $script_url failed, and no SU/CPR detected.  Waiting to try again."
+    sleep 3
+done
+
+chmod +x $tmp_script
+$tmp_script $script_args > ${tmp_script}.out; rc=$?
+(( rc == 0 )) || exit $rc
+fi
+
+post_exec="__post_exec__"
+eval $post_exec &
+
+exit 0
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/vendor-license-model.xml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/vendor-license-model.xml
new file mode 100644 (file)
index 0000000..dac89bb
--- /dev/null
@@ -0,0 +1,31 @@
+<vendor-license-model xmlns="http://xmlns.openecomp.org/asdc/license-model/1.0"><vendor-name>Nokia vUSP</vendor-name><entitlement-pool-list><entitlement-pool><entitlement-pool-invariant-uuid>3005DBA0094A461C9118579E97DCF4C0</entitlement-pool-invariant-uuid><entitlement-pool-uuid>2567ebeb-5411-4102-bdc8-d02ca135ba07</entitlement-pool-uuid><version>1.0</version><name>Nokia vUSP vCCF DB EP</name><description>This entitlement pool represents the right to use the vCCF DB software provided by Nokia.   It represents the Platform SW for Application VM for IeCCF including dB.  
+
+The rights are based on the number of HSS provisioned subscribers.  TP&amp;E will collect the entitlements usage (provisioned subscribers) to calculate entitlement usage report for entire vUSP service. There will be quarterly review meetings with Nokia to review purchased vs used entitlements.  This capacity calculation is for entire vUSP service, not VF specific. 
+
+The entitlement will be used with both vCCF and vDB VFs.
+
+No thresholds are applicable.</description><increments/><manufacturer-reference-number/><threshold-value><unit>Absolute</unit><value>0</value></threshold-value><sp-limits/><vendor-limits/><operational-scope><value>Network_Wide</value></operational-scope><start-date/><expiry-date/></entitlement-pool><entitlement-pool><entitlement-pool-invariant-uuid>98abb0fae9db4908be5c9ce69c0a4f49</entitlement-pool-invariant-uuid><entitlement-pool-uuid>542A8348731B479AB26C0AD21C43E515</entitlement-pool-uuid><version>4.0</version><name>NOKIA vUSP vSCC-AS EP</name><description>This is the entitlement pool represents the right to use the vSCC-AS and vSCC-AS StateDB software provided by Nokia.</description><increments/><manufacturer-reference-number>TBD</manufacturer-reference-number><threshold-value><unit>Absolute</unit><value/></threshold-value><sp-limits/><vendor-limits/><operational-scope><value>Network_Wide</value></operational-scope><start-date/><expiry-date/></entitlement-pool><entitlement-pool><entitlement-pool-invariant-uuid>785731627bc6438898facf045fbb2b0e</entitlement-pool-invariant-uuid><entitlement-pool-uuid>122E359A84CD4F21B67C46C3550A5C2C</entitlement-pool-uuid><version>3.0</version><name>vHSS-IMS EP</name><description>This entitlement pool represents the right to use the vHSS-IMS software provided by Nokia.   It represents the Platform SW for Application VM for HSS-FE, P-FE, UDR-Proxy, UDR-BE, CM-REPO, &amp; SDM vExpert.  
+
+The rights are based on the number of HSS-IMS provisioned subscribers.  TP&amp;E will collect the entitlements usage (provisioned subscribers) to calculate entitlement usage report for entire vUSP service. There will be quarterly review meetings with Nokia to review purchased vs used entitlements.  This capacity calculation is for entire vUSP service, not VF specific. 
+
+The entitlement will be used with both vCCF and vDB VFs.
+
+No thresholds are applicable.</description><increments/><manufacturer-reference-number>TBD</manufacturer-reference-number><threshold-value><unit>Absolute</unit><value>12500000</value></threshold-value><sp-limits/><vendor-limits/><operational-scope><value>Network_Wide</value></operational-scope><start-date/><expiry-date/></entitlement-pool><entitlement-pool><entitlement-pool-invariant-uuid>3005DBA0094A461C9118579E97DCF4C0</entitlement-pool-invariant-uuid><entitlement-pool-uuid>1ce8e2e8-116b-4b2a-bf35-f38b32f6a3c7</entitlement-pool-uuid><version>4.0</version><name>Nokia vUSP vCCF DB EP</name><description>This entitlement pool represents the right to use the vCCF DB software provided by Nokia.   It represents the Platform SW for Application VM for IeCCF including dB.  
+
+The rights are based on the number of HSS provisioned subscribers.  TP&amp;E will collect the entitlements usage (provisioned subscribers) to calculate entitlement usage report for entire vUSP service. There will be quarterly review meetings with Nokia to review purchased vs used entitlements.  This capacity calculation is for entire vUSP service, not VF specific. 
+
+The entitlement will be used with both vCCF and vDB VFs.
+
+No thresholds are applicable.</description><increments/><manufacturer-reference-number/><threshold-value><unit>Absolute</unit><value>0</value></threshold-value><sp-limits/><vendor-limits/><operational-scope><value>Network_Wide</value></operational-scope><start-date/><expiry-date/></entitlement-pool><entitlement-pool><entitlement-pool-invariant-uuid>3005DBA0094A461C9118579E97DCF4C0</entitlement-pool-invariant-uuid><entitlement-pool-uuid>4f000e53-9668-47d2-be2a-787aee6baae7</entitlement-pool-uuid><version>3.0</version><name>Nokia vUSP vCCF DB EP</name><description>This entitlement pool represents the right to use the vCCF DB software provided by Nokia.   It represents the Platform SW for Application VM for IeCCF including dB.  
+
+The rights are based on the number of HSS provisioned subscribers.  TP&amp;E will collect the entitlements usage (provisioned subscribers) to calculate entitlement usage report for entire vUSP service. There will be quarterly review meetings with Nokia to review purchased vs used entitlements.  This capacity calculation is for entire vUSP service, not VF specific. 
+
+The entitlement will be used with both vCCF and vDB VFs.
+
+No thresholds are applicable.</description><increments/><manufacturer-reference-number/><threshold-value><unit>Absolute</unit><value>0</value></threshold-value><sp-limits/><vendor-limits/><operational-scope><value>Network_Wide</value></operational-scope><start-date/><expiry-date/></entitlement-pool><entitlement-pool><entitlement-pool-invariant-uuid>3005DBA0094A461C9118579E97DCF4C0</entitlement-pool-invariant-uuid><entitlement-pool-uuid>d9d80f84-01f2-463e-8d75-096822224e5b</entitlement-pool-uuid><version>2.0</version><name>Nokia vUSP vCCF DB EP</name><description>This entitlement pool represents the right to use the vCCF DB software provided by Nokia.   It represents the Platform SW for Application VM for IeCCF including dB.  
+
+The rights are based on the number of HSS provisioned subscribers.  TP&amp;E will collect the entitlements usage (provisioned subscribers) to calculate entitlement usage report for entire vUSP service. There will be quarterly review meetings with Nokia to review purchased vs used entitlements.  This capacity calculation is for entire vUSP service, not VF specific. 
+
+The entitlement will be used with both vCCF and vDB VFs.
+
+No thresholds are applicable.</description><increments/><manufacturer-reference-number/><threshold-value><unit>Absolute</unit><value>0</value></threshold-value><sp-limits/><vendor-limits/><operational-scope><value>Network_Wide</value></operational-scope><start-date/><expiry-date/></entitlement-pool></entitlement-pool-list><license-key-group-list/></vendor-license-model>
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/vf-license-model.xml b/openecomp-be/lib/openecomp-sdc-validation-lib/openecomp-sdc-validation-impl/src/test/resources/org/openecomp/validation/validators/heat_validator/generated_artifact_exist/negative_test/input/vf-license-model.xml
new file mode 100644 (file)
index 0000000..8f458b0
--- /dev/null
@@ -0,0 +1,7 @@
+<vf-license-model xmlns="http://xmlns.openecomp.org/asdc/license-model/1.0"><vendor-name>Nokia vUSP</vendor-name><vf-id>B35CF8859EF344B8AE66196ACBC07778</vf-id><feature-group-list><feature-group><entitlement-pool-list><entitlement-pool><name>Nokia vUSP vCCF DB EP</name><description>This entitlement pool represents the right to use the vCCF DB software provided by Nokia.   It represents the Platform SW for Application VM for IeCCF including dB.  
+
+The rights are based on the number of HSS provisioned subscribers.  TP&amp;E will collect the entitlements usage (provisioned subscribers) to calculate entitlement usage report for entire vUSP service. There will be quarterly review meetings with Nokia to review purchased vs used entitlements.  This capacity calculation is for entire vUSP service, not VF specific. 
+
+The entitlement will be used with both vCCF and vDB VFs.
+
+No thresholds are applicable.</description><increments/><entitlement-pool-invariant-uuid>3005DBA0094A461C9118579E97DCF4C0</entitlement-pool-invariant-uuid><entitlement-pool-uuid>d9d80f84-01f2-463e-8d75-096822224e5b</entitlement-pool-uuid><manufacturer-reference-number/><threshold-value><unit>Absolute</unit><value>0</value></threshold-value><version>2.0</version><sp-limits/><vendor-limits/><operational-scope><value>Network_Wide</value></operational-scope><start-date/><expiry-date/></entitlement-pool></entitlement-pool-list><license-key-group-list/><description>This feature group represents the core capabilities of the Nokia vCCF and vDB.  The feature group may be used with both vCCF and vDB VFs.</description><part-number>not applicable</part-number><name>Nokia vUSP vCCF DB Feature Group</name><feature-group-uuid>90F8722ADEEB41808BAF7A6A3BAD0D1C</feature-group-uuid></feature-group></feature-group-list></vf-license-model>
\ No newline at end of file