Nested input params appears in MainServiceTemplate 31/56231/4
authoreleonorali <eleonoral@amdocs.com>
Wed, 11 Jul 2018 17:15:47 +0000 (20:15 +0300)
committerAvi Gaffa <avi.gaffa@amdocs.com>
Sun, 15 Jul 2018 14:02:15 +0000 (14:02 +0000)
When Nested heat belongs to Volume HEAT and Volume Heat was associated to main HEAT (parent)
input parameters came from such nested were appear in MainServiceTemplate.yaml (TOSCA)
Also these parameters had annotation in nestedServiceTemplate.yaml

Change-Id: I46fff53de502c7ec48b6e4c26087121be89dd0a1
Issue-ID: SDC-1498
Signed-off-by: eleonorali <eleonoral@amdocs.com>
35 files changed:
openecomp-bdd/features/TOSCA/HeatToToscaTranslation.feature
openecomp-bdd/resources/uploads/nested-belongs-to-volume.zip [new file with mode: 0644]
openecomp-be/lib/openecomp-heat-lib/src/main/java/org/openecomp/sdc/heat/datatypes/manifest/FileData.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/java/org/openecomp/sdc/translator/impl/heattotosca/nested/undervolume/TranslateHeatNestedBelongsToVolumeTest.java [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/expectedoutputfiles/MainServiceTemplate.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/expectedoutputfiles/ocgmgr_nested_volumeServiceTemplate.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/MANIFEST.json [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/base_ocg.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/base_ocg.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01_volume.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01_volume.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02_volume.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02_volume.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03_volume.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03_volume.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04_volume.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04_volume.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_nested_0.txt [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_0.txt [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_1.txt [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_volume.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_volume.env [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_volume.yaml [new file with mode: 0644]

index ff2ed5a..ae08036 100644 (file)
@@ -154,4 +154,41 @@ Feature: Tosca Validation Flow
     Then I want to check property "topology_template.inputs.vm_image_name.annotations" does not exist
     Then I want to check property "topology_template.inputs.compute_compute_name.annotations" does not exist
 
-    Then I want to create a VF for this Item
\ No newline at end of file
+    Then I want to create a VF for this Item
+
+  Scenario: Validate Input parameter for nested HEAT belongs to volume HEAT
+            when volume heat is associated to main HEAT
+    When I want to create a VSP with onboarding type "NetworkPackage"
+
+    Then I want to upload a NetworkPackage for this VSP from path "resources/uploads/nested-belongs-to-volume.zip"
+    And I want to process the NetworkPackage file for this VSP
+
+    Then I want to commit this Item
+    And I want to submit this VSP
+    And I want to package this VSP
+
+    Then I want to get the package for this Item to path "resources/downloads/VSPPackage.zip"
+
+    When I want to load the yaml content of the entry "Definitions/ocgmgr_nested_volumeServiceTemplate.yaml" in the zip "resources/downloads/VSPPackage.zip" to context
+    Then I want to check property "topology_template.inputs.volume_type.annotations" does not exist
+    Then I want to check property "topology_template.inputs.vnf_name.annotations" does not exist
+    Then I want to check property "topology_template.inputs.index.annotations" does not exist
+    Then I want to check property "topology_template.inputs.size.annotations" does not exist
+
+    When I want to load the yaml content of the entry "Definitions/MainServiceTemplate.yaml" in the zip "resources/downloads/VSPPackage.zip" to context
+
+    Then I want to check property "topology_template.inputs.index" does not exist
+    Then I want to check property "topology_template.inputs.size" does not exist
+    Then I want to check property "topology_template.inputs.volume_type" does not exist
+
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.type" for value "org.openecomp.annotations.Source"
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.source_type" for value "HEAT"
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.vf_module_label" to have length 6
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.vf_module_label[0]" for value "ocgapp_03"
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.vf_module_label[1]" for value "ocgapp_02"
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.vf_module_label[2]" for value "ocgmgr"
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.vf_module_label[3]" for value "ocgapp_01"
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.vf_module_label[4]" for value "ocgapp_04"
+    Then I want to check property "topology_template.inputs.vnf_name.annotations.source.properties.vf_module_label[5]" for value "base_ocg"
+
+    Then I want to create a VF for this Item
diff --git a/openecomp-bdd/resources/uploads/nested-belongs-to-volume.zip b/openecomp-bdd/resources/uploads/nested-belongs-to-volume.zip
new file mode 100644 (file)
index 0000000..690cb95
Binary files /dev/null and b/openecomp-bdd/resources/uploads/nested-belongs-to-volume.zip differ
index 81bf2fa..2bc549c 100644 (file)
@@ -22,75 +22,80 @@ package org.openecomp.sdc.heat.datatypes.manifest;
 
 import org.apache.commons.collections4.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Predicate;
 
 public class FileData {
 
-  protected static final Set<Type> heatFileTypes =
-      new HashSet<>(Arrays.asList(Type.HEAT, Type.HEAT_NET, Type.HEAT_VOL));
-  private Boolean isBase;
-  private String file;
-  private Type type;
-  private List<FileData> data;
+    protected static final Set<Type> heatFileTypes =
+        new HashSet<>(Arrays.asList(Type.HEAT, Type.HEAT_NET, Type.HEAT_VOL));
+    private Boolean isBase;
+    private String parentFile;
+    private String file;
+    private Type type;
+    private List<FileData> data;
 
-  public static Predicate<FileData> buildFileDataPredicateByType(Type... types) {
-    return fileData -> Arrays.asList(types).contains(fileData.getType());
-  }
+    public static Predicate<FileData> buildFileDataPredicateByType(Type... types) {
+        return fileData -> Arrays.asList(types).contains(fileData.getType());
+    }
 
-  public static boolean isHeatFile(Type type) {
+    public static boolean isHeatFile(Type type) {
     return heatFileTypes.contains(type);
   }
 
-  public Boolean getBase() {
-    return isBase;
-  }
+    public Boolean getBase() {
+        return isBase;
+    }
 
-  public void setBase(Boolean base) {
-    isBase = base;
-  }
+    public void setBase(Boolean base) {
+        isBase = base;
+    }
 
-  public String getFile() {
-    return file;
-  }
+    public String getFile() {
+        return file;
+    }
+
+    public void setFile(String file) {
+        this.file = file;
+    }
+
+    public String getParentFile() {
+        return parentFile;
+    }
 
-  public void setFile(String file) {
-    this.file = file;
+    public void setParentFile(String parentFile) {
+    this.parentFile = parentFile;
   }
 
-  public Type getType() {
+    public Type getType() {
     return type;
   }
 
-  public void setType(Type type) {
+    public void setType(Type type) {
     this.type = type;
   }
 
-  public List<FileData> getData() {
-    return data;
-  }
+    public List<FileData> getData() {
+        return data;
+    }
 
-  public void setData(List<FileData> data) {
-    this.data = data;
-  }
+    public void setData(List<FileData> data) {
+        this.data = data;
+    }
 
-  /**
-   * Add file data.
-   *
-   * @param data the data
-   */
-  public void addFileData(FileData data) {
-    if (CollectionUtils.isEmpty(this.data)) {
-      this.data = new ArrayList<>();
+    /**
+    * Add file data.
+    *
+    * @param data the data
+    */
+    public void addFileData(FileData data) {
+        if (CollectionUtils.isEmpty(this.data)) {
+            this.data = new ArrayList<>();
+        }
+        this.data.add(data);
     }
-    this.data.add(data);
-  }
 
-  public enum Type {
+    public enum Type {
 
     HEAT("HEAT"),
     HEAT_ENV("HEAT_ENV"),
@@ -108,20 +113,23 @@ public class FileData {
     VF_LICENSE("VF_LICENSE"),
     OTHER("OTHER");
 
-    private String displayName;
+        private String displayName;
 
-    Type(String displayName) {
-      this.displayName = displayName;
-    }
+        Type(String displayName) {
+            this.displayName = displayName;
+        }
 
-    public String getDisplayName() {
-      return displayName;
-    }
+        public String getDisplayName() {
+            return displayName;
+        }
 
-    public static boolean isArtifact(Type fileType)
-    {
-      return !Arrays.asList(HEAT,HEAT_ENV, HEAT_VOL).contains(fileType);
-    }
+        public static boolean isArtifact(Type fileType) {
+            return !Arrays.asList(HEAT,HEAT_ENV, HEAT_VOL).contains(fileType);
+        }
 
-  }
+        public static boolean canBeAssociated(Type fileType)
+        {
+            return HEAT_VOL == fileType;
+        }
+    }
 }
index f2773ae..bd8b558 100644 (file)
@@ -213,7 +213,7 @@ public class HeatToToscaUtil {
         List<FileData> fileDataList = context.getManifest().getContent().getData();
         for (FileData fileData : fileDataList) {
             if (TranslationService.getTypesToProcessByTranslator().contains(fileData.getType()) && fileData.getFile()
-                                                                                                           .equals(heatFileName)) {
+                    .equals(heatFileName)) {
                 return fileData;
             }
         }
@@ -225,7 +225,6 @@ public class HeatToToscaUtil {
         FileDataCollection fileDataCollection = new FileDataCollection();
         Map<String, FileData> filteredFiles = filterFileDataListByType(fileDataList, typeFilter);
         Set<String> referenced = new HashSet<>();
-
         for (FileData fileData : filteredFiles.values()) {
             String fileName = fileData.getFile();
 
@@ -236,8 +235,8 @@ public class HeatToToscaUtil {
                 HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil().yamlToObject(
                         translationContext.getFileContent(fileName), HeatOrchestrationTemplate.class);
                 if (MapUtils.isNotEmpty(heatOrchestrationTemplate.getResources())) {
-                    applyFilterOnFileCollection(heatOrchestrationTemplate, translationContext, fileDataCollection,
-                            filteredFiles, referenced);
+                    referenced.addAll(applyFilterOnFileCollection(heatOrchestrationTemplate, translationContext,
+                            fileDataCollection, filteredFiles));
                 }
 
             } else {
@@ -246,7 +245,9 @@ public class HeatToToscaUtil {
             }
         }
 
+        referenced.addAll(getAssociatedFiles(filteredFiles.values()));
         referenced.forEach(filteredFiles::remove);
+
         if (!CollectionUtils.isEmpty(fileDataCollection.getBaseFile())) {
             for (FileData fileData : fileDataCollection.getBaseFile()) {
                 filteredFiles.remove(fileData.getFile());
@@ -256,54 +257,80 @@ public class HeatToToscaUtil {
         return fileDataCollection;
     }
 
-    private static void applyFilterOnFileCollection(HeatOrchestrationTemplate heatOrchestrationTemplate,
+    private static Set<String> getAssociatedFiles(Collection<FileData> filteredFiles) {
+        Set<String> associatedFiles = new HashSet<>();
+        filteredFiles.stream().filter(file -> file.getParentFile() != null
+                            && FileData.Type.canBeAssociated(file.getType()))
+                                    .forEach(file -> associatedFiles.add(file.getFile()));
+        return associatedFiles;
+    }
+
+    private static Set<String> applyFilterOnFileCollection(HeatOrchestrationTemplate heatOrchestrationTemplate,
                                                            TranslationContext translationContext,
                                                            FileDataCollection fileDataCollection,
-                                                           Map<String, FileData> filteredFiles,
-                                                           Set<String> referenced) {
+                                                           Map<String, FileData> filteredFiles) {
+        Set<String> nestedFiles = new HashSet<>();
         List<String> filenames = extractFilenamesFromFileDataList(filteredFiles.values());
-
         for (Resource resource : heatOrchestrationTemplate.getResources().values()) {
-            if (filenames.contains(resource.getType())) {
-                handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced, resource.getType());
-            } else if (resource.getType().equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
-                handleResourceGrpNestedFile(resource, translationContext, fileDataCollection, filteredFiles, filenames,
-                        referenced);
+            String resourceType = resource.getType();
+            if (filenames.contains(resourceType)) {
+                handleNestedFile(translationContext, fileDataCollection, filteredFiles, resourceType);
+                nestedFiles.add(resourceType);
+            } else if (resourceType.equals(HeatResourcesTypes.RESOURCE_GROUP_RESOURCE_TYPE.getHeatResource())) {
+                Optional<String> nestedFile = handleResourceGrpNestedFile(resource, translationContext,
+                        fileDataCollection, filteredFiles, filenames);
+                nestedFile.ifPresent(nestedFiles::add);
             }
         }
+        return nestedFiles;
     }
 
-    private static void handleResourceGrpNestedFile(Resource resource, TranslationContext translationContext,
-                                                           FileDataCollection fileDataCollection,
-                                                           Map<String, FileData> filteredFiles, List<String> filenames,
-                                                           Set<String> referenced) {
+    private static Optional<String> handleResourceGrpNestedFile(Resource resource, TranslationContext
+            translationContext, FileDataCollection fileDataCollection,
+                    Map<String, FileData> filteredFiles, List<String> filenames) {
         Object resourceDef = resource.getProperties().get(HeatConstants.RESOURCE_DEF_PROPERTY_NAME);
         Object innerTypeDef = ((Map) resourceDef).get(HeatConstants.RESOURCE_DEF_TYPE_PROPERTY_NAME);
         if (innerTypeDef instanceof String) {
             String internalResourceType = (String) innerTypeDef;
             if (filenames.contains(internalResourceType)) {
-                handleNestedFile(translationContext, fileDataCollection, filteredFiles, referenced,
+                handleNestedFile(translationContext, fileDataCollection, filteredFiles,
                         internalResourceType);
+                return Optional.of(internalResourceType);
             }
         }
+        return Optional.empty();
     }
 
     private static void handleNestedFile(TranslationContext translationContext, FileDataCollection fileDataCollection,
-                                                Map<String, FileData> filteredFiles, Set<String> referenced,
+                                                Map<String, FileData> filteredFiles,
                                                 String nestedFileName) {
-        referenced.add(nestedFileName);
         fileDataCollection.addNestedFiles(filteredFiles.get(nestedFileName));
         translationContext.getNestedHeatsFiles().add(nestedFileName);
     }
 
-    private static Map<String, FileData> filterFileDataListByType(List<FileData> fileDataList,
-                                                                         Set<FileData.Type> typesToGet) {
+    private static Map<String, FileData>  filterFileDataListByType(List<FileData> fileDataList,
+            Set<FileData.Type> typesToGet) {
         Map<String, FileData> filtered = new HashMap<>();
-        fileDataList.stream().filter(file -> typesToGet.contains(file.getType()))
-                    .forEach(file -> filtered.put(file.getFile(), file));
+        filterFileDataListByType(fileDataList, filtered, typesToGet, null);
         return filtered;
     }
 
+    private static void filterFileDataListByType(List<FileData> fileDataList, Map<String, FileData> filtered,
+            Set<FileData.Type> typesToGet, String parentFileName) {
+        fileDataList.stream().filter(file -> typesToGet.contains(file.getType()))
+                    .forEach(file -> {
+                        filtered.put(file.getFile(), file);
+                        file.setParentFile(parentFileName);
+                    });
+
+        Set<FileData.Type> canBeAssociatedTypes = typesToGet.stream()
+                .filter(FileData.Type::canBeAssociated).collect(Collectors.toSet());
+
+        fileDataList.stream().filter(file -> Objects.nonNull(file.getData()))
+                .forEach(file -> filterFileDataListByType(file.getData(), filtered,
+                        canBeAssociatedTypes, file.getFile()));
+    }
+
     private static List<String> extractFilenamesFromFileDataList(Collection<FileData> fileDataList) {
         return fileDataList.stream().map(FileData::getFile).collect(Collectors.toList());
     }
index ee0cee6..2a845fb 100644 (file)
@@ -131,34 +131,21 @@ public class TranslationService {
      */
     public void translateHeatFile(ServiceTemplate serviceTemplate, FileData heatFileData,
                                   TranslationContext context) {
-        translateHeatFile(serviceTemplate, heatFileData,  null, context);
-    }
-
-    /**
-     * Translate heat file.
-     *
-     * @param serviceTemplate the service template
-     * @param heatFileData    the current heat file data
-     * @param parentHeatFileName the main heat to which associated current heat file (e.g. volume heat)
-     * @param context         the context
-     */
-    public void translateHeatFile(ServiceTemplate serviceTemplate, FileData heatFileData, String parentHeatFileName,
-                                  TranslationContext context) {
         String heatFileName = heatFileData.getFile();
         HeatOrchestrationTemplate heatOrchestrationTemplate = new YamlUtil()
                 .yamlToObject(context.getFileContent(heatFileName), HeatOrchestrationTemplate.class);
 
         translateInputParameters(serviceTemplate, heatOrchestrationTemplate, heatFileData, context,
-                heatFileName, parentHeatFileName);
+                heatFileName);
+
         translateResources(heatFileName, serviceTemplate, heatOrchestrationTemplate, context);
         translateOutputParameters(serviceTemplate, heatOrchestrationTemplate, heatFileData,
                 heatFileName, context);
         createHeatStackGroup(serviceTemplate, heatFileData, heatOrchestrationTemplate, context);
         handleHeatPseudoParam(heatFileName, serviceTemplate, context);
-
         if (Objects.nonNull(heatFileData.getData())) {
-            heatFileData.getData().stream().filter(data -> data.getType() == FileData.Type.HEAT_VOL)
-                    .forEach(data -> translateHeatFile(serviceTemplate, data, heatFileData.getFile(), context));
+            heatFileData.getData().stream().filter(data -> FileData.Type.canBeAssociated(data.getType()))
+                    .forEach(data -> translateHeatFile(serviceTemplate, data, context));
         }
     }
 
@@ -244,7 +231,7 @@ public class TranslationService {
     private void translateInputParameters(ServiceTemplate serviceTemplate,
                                           HeatOrchestrationTemplate heatOrchestrationTemplate,
                                           FileData heatFileData, TranslationContext context,
-                                          String heatFileName, String parentHeatFileName) {
+                                          String heatFileName) {
         if (heatOrchestrationTemplate.getParameters() == null) {
             return;
         }
@@ -252,7 +239,7 @@ public class TranslationService {
         Map<String, ParameterDefinition> parameterDefinitionMap =
                 TranslatorHeatToToscaParameterConverter
                         .parameterConverter(serviceTemplate, heatOrchestrationTemplate.getParameters(),
-                                heatOrchestrationTemplate, heatFileName, parentHeatFileName, context);
+                                heatOrchestrationTemplate, heatFileName, heatFileData.getParentFile(), context);
         Environment heatEnvFile = getHeatEnvFile(heatFileData, context);
         Map<String, Object> parameters = heatEnvFile.getParameters();
         Object parameterValue;
@@ -286,19 +273,19 @@ public class TranslationService {
 
     }
 
-    private void updateAnnotations(Map<String, ParameterDefinition> inputParameters, Map<String, ParameterDefinition> newParameters) {
-
+    private void updateAnnotations(Map<String, ParameterDefinition> inputParameters, Map<String,
+            ParameterDefinition> newParameters) {
             newParameters.entrySet().stream().filter(stringParameterDefinitionEntry ->
-                    inputParameters.containsKey(stringParameterDefinitionEntry.getKey()) &&
-                         isHasAnnotation(inputParameters, stringParameterDefinitionEntry)).
-                            forEach(stringParameterDefinitionEntry -> {
-                                List inputParamVFModuleList = getVFModulesList(inputParameters.get(stringParameterDefinitionEntry.getKey()));
+                    inputParameters.containsKey(stringParameterDefinitionEntry.getKey())
+                         && isHasAnnotation(inputParameters, stringParameterDefinitionEntry))
+                            .forEach(stringParameterDefinitionEntry -> {
+                                List inputParamVFModuleList = getVFModulesList(
+                                        inputParameters.get(stringParameterDefinitionEntry.getKey()));
                                 List newParamVFModuleList = getVFModulesList(stringParameterDefinitionEntry.getValue());
-                                if(inputParamVFModuleList.contains(newParamVFModuleList.get(0))){
+                                if (inputParamVFModuleList.contains(newParamVFModuleList.get(0))) {
                                     newParamVFModuleList.remove(0);
                                 }
                                 newParamVFModuleList.addAll(inputParamVFModuleList);
-
                             });
 
     }
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/java/org/openecomp/sdc/translator/impl/heattotosca/nested/undervolume/TranslateHeatNestedBelongsToVolumeTest.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/java/org/openecomp/sdc/translator/impl/heattotosca/nested/undervolume/TranslateHeatNestedBelongsToVolumeTest.java
new file mode 100644 (file)
index 0000000..9c5b422
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright Â© 2016-2018 European Support Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openecomp.sdc.translator.impl.heattotosca.nested.undervolume;
+
+import org.junit.Test;
+import org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation.BaseResourceTranslationTest;
+
+public class TranslateHeatNestedBelongsToVolumeTest extends BaseResourceTranslationTest {
+    {
+        inputFilesPath = "/mock/heat/nested/nestedundervolume/inputs";
+        outputFilesPath = "/mock/heat/nested/nestedundervolume/expectedoutputfiles";
+    }
+
+    @Test
+    public void testTranslate() throws Exception {
+        testTranslation();
+    }
+
+}
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/expectedoutputfiles/MainServiceTemplate.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/expectedoutputfiles/MainServiceTemplate.yaml
new file mode 100644 (file)
index 0000000..aadea7b
--- /dev/null
@@ -0,0 +1,2252 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+metadata:
+  template_name: Main
+imports:
+- openecomp_heat_index:
+    file: openecomp-heat/_index.yml
+- GlobalSubstitutionTypes:
+    file: GlobalSubstitutionTypesServiceTemplate.yaml
+node_types:
+  org.openecomp.resource.vfc.nodes.heat.ocgmgr:
+    derived_from: org.openecomp.resource.vfc.nodes.heat.nova.Server
+  org.openecomp.resource.vfc.nodes.heat.ocgapp:
+    derived_from: org.openecomp.resource.vfc.nodes.heat.nova.Server
+topology_template:
+  inputs:
+    keycloak_rpm_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: keycloak_rpm_name
+      type: string
+      description: keycloak rpm name
+      default: keycloak-pkg-x86_64.rpm
+    ocgapp_oam_protected_ip_3:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_oam_protected_ip_3
+      type: string
+      description: OCG OAM IP list
+    ocgapp_volume_type_2:
+      label: vm volume type
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_volume_type_2
+      type: string
+      description: the name of the target volume backend for ocgapp1
+      default: SF-Default-SSD
+    ocgapp_volume_type_1:
+      label: vm volume type
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_volume_type_1
+      type: string
+      description: the name of the target volume backend for ocgapp1
+      default: SF-Default-SSD
+    ocgapp_oam_protected_ip_2:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_oam_protected_ip_2
+      type: string
+      description: OCG OAM IP list
+    ocgapp_volume_type_3:
+      label: vm volume type
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_volume_type_3
+      type: string
+      description: the name of the target volume backend for ocgapp1
+      default: SF-Default-SSD
+    eth1_netmask:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: eth1_netmask
+      type: string
+      description: mask length
+      default: 21
+    domain_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: domain_name
+      type: string
+      description: address
+      default: eng.mobilephone.net
+    eth1_ip:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: eth1_ip
+      type: string
+      description: address
+      default: 107.112.168.129
+    eth2_ip_range:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: eth2_ip_range
+      type: string
+      description: range
+      default: 107.242.64.1
+    ocg_user:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocg_user
+      type: string
+      description: user to install ocg
+      default: fworks
+    ocgapp_oam_direct_ip_2:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_oam_direct_ip_2
+      type: string
+      description: OCG OAM IP list
+    ocgapp_oam_direct_ip_1:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_oam_direct_ip_1
+      type: string
+      description: OCG OAM IP list
+    ocgapp_oam_direct_ip_0:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_oam_direct_ip_0
+      type: string
+      description: OCG OAM IP list
+    ocgapp_oam_direct_ip_3:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_oam_direct_ip_3
+      type: string
+      description: OCG OAM IP list
+    ocgmgr_volume_ids:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_volume_ids
+      type: json
+      description: Unique IDs for volumes
+    ocg_install_jar:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocg_install_jar
+      type: string
+      description: location of ocg installer
+      default: /home/fworks/Installer/ocg10/installer.jar
+    wim_install_file:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: wim_install_file
+      type: string
+      description: WIM Install File location
+      default: /home/fworks/Installer/wim/ovlm-integration-module.sh
+    ovlm_install_dir:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ovlm_install_dir
+      type: string
+      description: Location of the ovlm-install dir
+      default: /home/fworks/Installer/weaver
+    ocg_install_properties:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocg_install_properties
+      type: string
+      description: location of ocg install properties
+      default: /tmp/ocg.install.properties
+    ocgmgr_names:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_names
+      type: list
+      description: OCG MGR VM names list (should be 2, since we have 2 MGR VMs)
+      entry_schema:
+        type: string
+    ocgapp_volume_size_3:
+      label: Cinder volume size
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_volume_size_3
+      type: float
+      description: the size of the Cinder volume
+      default: 400
+      constraints:
+      - in_range:
+        - 100
+        - 400
+    ocgapp_volume_type_0:
+      label: vm volume type
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_volume_type_0
+      type: string
+      description: the name of the target volume backend for ocgapp1
+      default: SF-Default-SSD
+    ocgapp_oam_protected_ip_1:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_oam_protected_ip_1
+      type: string
+      description: OCG OAM IP list
+    ocgapp_oam_protected_ip_0:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_oam_protected_ip_0
+      type: string
+      description: OCG OAM IP list
+    ocgapp_volume_size_2:
+      label: Cinder volume size
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_volume_size_2
+      type: float
+      description: the size of the Cinder volume
+      default: 400
+      constraints:
+      - in_range:
+        - 100
+        - 400
+    ocgapp_volume_size_1:
+      label: Cinder volume size
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_volume_size_1
+      type: float
+      description: the size of the Cinder volume
+      default: 400
+      constraints:
+      - in_range:
+        - 100
+        - 400
+    ocgapp_volume_size_0:
+      label: Cinder volume size
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_volume_size_0
+      type: float
+      description: the size of the Cinder volume
+      default: 400
+      constraints:
+      - in_range:
+        - 100
+        - 400
+    ocgmgr_image_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_image_name
+      type: string
+      description: operative system image
+      default: vOCG_MGR_SNAP_20180130
+    vf_module_id:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgmgr
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: vf_module_id
+      type: string
+      description: Unique ID for this VF module instance
+    ocgmgr_oam_protected_ips:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_oam_protected_ips
+      type: list
+      description: OCG OAM IP list
+      entry_schema:
+        type: string
+    vnf_name:
+      label: OCG VNF Name
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgmgr
+            - ocgapp_01
+            - ocgapp_04
+            - base_ocg
+            source_type: HEAT
+            param_name: vnf_name
+      type: string
+      description: OCG VNF Name
+      default: zrdm5avocg01
+    nameserver_ip:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: nameserver_ip
+      type: string
+      description: nameserver
+      default: 135.214.16.119
+    ocgapp_name_3:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_name_3
+      type: string
+      description: OCG VM server name list (there should be 2, since we have 2 app vms)
+    ovlm_install_properties:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ovlm_install_properties
+      type: string
+      description: ovlm install properties
+      default: /tmp/ovlm.install.properties
+    ocgapp_name_0:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_name_0
+      type: string
+      description: OCG VM server name list (there should be 2, since we have 2 app vms)
+    ocgapp_flavor_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_flavor_name
+      type: string
+      description: resources to be applied on instances
+      default: nv.c8r32d320
+    cor_direct_net_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: cor_direct_net_name
+      type: string
+      description: COR_DIRECT network where instances will connect
+    ocgapp_name_2:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_name_2
+      type: string
+      description: OCG VM server name list (there should be 2, since we have 2 app vms)
+    oam_direct_net_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: oam_direct_net_name
+      type: string
+      description: OAM network where instances will connect
+    ocgapp_name_1:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_name_1
+      type: string
+      description: OCG VM server name list (there should be 2, since we have 2 app vms)
+    vnf_id:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgmgr
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: vnf_id
+      type: string
+      description: Unique ID for this VF instance
+    ocgapp_cor_direct_v6_ip_0:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_v6_ip_0
+      type: string
+      description: fixed IP assignment for VM's on the COR_DIRECT network
+    availability_zone_0:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            - ocgmgr
+            - ocgapp_01
+            source_type: HEAT
+            param_name: availability_zone_0
+      type: string
+      description: availability zone 1 ID or name
+    availability_zone_1:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgmgr
+            - ocgapp_04
+            source_type: HEAT
+            param_name: availability_zone_1
+      type: string
+      description: availability zone 2 ID or name
+    OS::stack_name:
+      type: string
+      required: false
+    ocgapp_cor_direct_v6_ip_3:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_v6_ip_3
+      type: string
+      description: fixed IP assignment for VM's on the COR_DIRECT network
+    ocgapp_cor_direct_v6_ip_1:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_v6_ip_1
+      type: string
+      description: fixed IP assignment for VM's on the COR_DIRECT network
+    ocgmgr_flavor_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_flavor_name
+      type: string
+      description: resources to be applied on instances
+      default: nv.c8r32d320
+    ocgapp_cor_direct_v6_ip_2:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_v6_ip_2
+      type: string
+      description: fixed IP assignment for VM's on the COR_DIRECT network
+    ocgmgr_public_key:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_public_key
+      type: string
+      description: creator's ssh public key
+    ocgapp_volume_id_0:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_volume_id_0
+      type: string
+      description: Unique IDs for volumes
+    java_home:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: java_home
+      type: string
+      description: java home
+      default: /home/fworks/java/jdk1.8.0_112
+    ocgapp_volume_id_1:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_volume_id_1
+      type: string
+      description: Unique IDs for volumes
+    ocgapp_volume_id_2:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_volume_id_2
+      type: string
+      description: Unique IDs for volumes
+    ocgapp_volume_id_3:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_volume_id_3
+      type: string
+      description: Unique IDs for volumes
+    ocgapp_image_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_image_name
+      type: string
+      description: operative system image
+      default: NIMBUS_OCG-APPLICATION_20180328.qcow2
+    ocgapp_public_key:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_public_key
+      type: string
+      description: creator's ssh public key
+      default: ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAh5B/f9JmJL5HcIJT+XeGnE9Jlv22NYGweMx+M2eX53X0sxdB8onhqDiLFODgDgXUuQk11NM2tQeA+xH+nlZxdETK+5uKb2SLwsPjZnxHQPrGQP1KKAZi9aKoZFjYmWrYuqzQFT9QRz3gehG+pX82mzMkkE/Da2/XJ62zu8PKfapn63MhhmxG5w5onuN2XsM2zfI6GILFM56ppLtMCkgvzXVcWOpr7pD4kpnC9WavxwAkmQPrWIbTi0MKIEeuON0B+KRgC3b8GnCpuE2GFTffAm1MBgi0Urs8e3XGHsilVMqYdaCPZwq5ZKlzivX5wZQH9yT9m9Db6XLL66ZIaBHt2w== rsa-key-20170906
+    ocg_shared_server_grp_id:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocg_shared_server_grp_id
+      type: string
+      description: OCG anti-affinity server group
+    oam_protected_net_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgmgr
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: oam_protected_net_name
+      type: string
+      description: OAM network where instances will connect
+    ocgapp_shared_sec_grp_id:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_shared_sec_grp_id
+      type: string
+      description: security group
+    ocgmgr_volume_type_0:
+      label: mgr vm 1 volume type
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_volume_type_0
+      type: string
+      description: the name of the target volume backend for the first OCG MGR
+      default: SF-Default-SSD
+    ocgapp_cor_direct_ip_2:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_ip_2
+      type: string
+      description: OCG COR_DIRECT IP list
+    ocgapp_cor_direct_ip_3:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_04
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_ip_3
+      type: string
+      description: OCG COR_DIRECT IP list
+    volume_count:
+      label: volume count
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: volume_count
+      type: float
+      description: num of volumes needed
+      default: 2
+      constraints:
+      - valid_values:
+        - 0
+        - 1
+        - 2
+    ocgapp_cor_direct_ip_0:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_01
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_ip_0
+      type: string
+      description: OCG COR_DIRECT IP list
+    ocgapp_cor_direct_ip_1:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_02
+            source_type: HEAT
+            param_name: ocgapp_cor_direct_ip_1
+      type: string
+      description: OCG COR_DIRECT IP list
+    eth2_ip:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: eth2_ip
+      type: string
+      description: address
+      default: 107.242.64.49
+    ocgmgr_volume_size_0:
+      label: Cinder volume 1 size
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_volume_size_0
+      type: float
+      description: the size of the Cinder volume
+      default: 400
+      constraints:
+      - in_range:
+        - 50
+        - 400
+    ocgmgr_shared_sec_grp_id:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgmgr
+            source_type: HEAT
+            param_name: ocgmgr_shared_sec_grp_id
+      type: string
+      description: security group
+    eth1_ip_range:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - ocgapp_03
+            - ocgapp_02
+            - ocgapp_01
+            - ocgapp_04
+            source_type: HEAT
+            param_name: eth1_ip_range
+      type: string
+      description: range
+      default: 130.4.128.0
+  node_templates:
+    ocgmgr_volume_resource_group:
+      type: org.openecomp.resource.abstract.nodes.heat.ocgmgr_nested_volume
+      directives:
+      - substitutable
+      properties:
+        service_template_filter:
+          substitute_service_template: ocgmgr_nested_volumeServiceTemplate.yaml
+          count:
+            get_input: volume_count
+          mandatory: false
+        volume_type:
+          get_input: ocgmgr_volume_type_0
+        size:
+          get_input: ocgmgr_volume_size_0
+        vnf_name:
+          get_input: vnf_name
+        index:
+          get_property:
+          - SELF
+          - service_template_filter
+          - index_value
+    OCGMGR_SECURITY_GROUP:
+      type: org.openecomp.resource.vfc.rules.nodes.heat.network.neutron.SecurityRules
+      properties:
+        name:
+          str_replace:
+            template: VF_NAME_sec_grp_OCGMGR
+            params:
+              VF_NAME:
+                get_input: vnf_name
+        description: ocg mgr security group
+        rules:
+        - protocol: tcp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: egress
+          port_range_min: 1
+        - protocol: udp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: egress
+          port_range_min: 1
+        - protocol: icmp
+          ethertype: IPv4
+          remote_ip_prefix: 0.0.0.0/0
+          direction: egress
+        - protocol: tcp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: ingress
+          port_range_min: 1
+        - protocol: udp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: ingress
+          port_range_min: 1
+        - protocol: icmp
+          ethertype: IPv4
+          remote_ip_prefix: 0.0.0.0/0
+          direction: ingress
+      requirements:
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgmgr_oam_protected_0_port
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgmgr_oam_protected_1_port
+          relationship: org.openecomp.relationships.AttachesTo
+    ocgapp_cor_direct_port_3:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        - ip_version: 6
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_cor_direct_ip_3
+        - ip_address:
+            get_input: ocgapp_cor_direct_v6_ip_3
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_cor_port_3
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: cor_direct
+        network:
+          get_input: cor_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_3
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_cor_direct_port_2:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        - ip_version: 6
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_cor_direct_ip_2
+        - ip_address:
+            get_input: ocgapp_cor_direct_v6_ip_2
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_cor_port_2
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: cor_direct
+        network:
+          get_input: cor_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_2
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_server_2:
+      type: org.openecomp.resource.vfc.nodes.heat.ocgapp
+      properties:
+        flavor:
+          get_input: ocgapp_flavor_name
+        key_name: UNSUPPORTED_RESOURCE_ocgapp_admin_key
+        availability_zone:
+          get_input: availability_zone_1
+        image:
+          get_input: ocgapp_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+          vnf_name:
+            get_input: vnf_name
+        personality:
+          /etc/hostname:
+            str_replace:
+              template: |
+                ${NAME}.${DOMAIN_NAME}
+              params:
+                ${NAME}:
+                  get_input: ocgapp_name_2
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/resolv.conf:
+            str_replace:
+              template: |
+                nameserver ${NAME_SERVER}
+                domain ${DOMAIN_NAME}
+              params:
+                ${NAME_SERVER}:
+                  get_input: nameserver_ip
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/sysconfig/network-scripts/route-eth2:
+            str_replace:
+              template: |
+                ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+              params:
+                ${ETH2_IP_RANGE}:
+                  get_input: eth2_ip_range
+                ${ETH2_IP}:
+                  get_input: eth2_ip
+          /etc/sysconfig/network-scripts/route-eth1:
+            str_replace:
+              template: |
+                ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+              params:
+                ${ETH1_IP_RANGE}:
+                  get_input: eth1_ip_range
+                ${ETH1_IP}:
+                  get_input: eth1_ip
+                ${ETH1_NETMASK}:
+                  get_input: eth1_netmask
+        user_data_format: RAW
+        name:
+          get_input: ocgapp_name_2
+        scheduler_hints:
+          group:
+            get_input: ocg_shared_server_grp_id
+      requirements:
+      - local_storage:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_volume_2
+          relationship: ocgapp_volume_attachment_2
+    ocgapp_server_1:
+      type: org.openecomp.resource.vfc.nodes.heat.ocgapp
+      properties:
+        flavor:
+          get_input: ocgapp_flavor_name
+        key_name: UNSUPPORTED_RESOURCE_ocgapp_admin_key
+        availability_zone:
+          get_input: availability_zone_0
+        image:
+          get_input: ocgapp_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+          vnf_name:
+            get_input: vnf_name
+        personality:
+          /etc/hostname:
+            str_replace:
+              template: |
+                ${NAME}.${DOMAIN_NAME}
+              params:
+                ${NAME}:
+                  get_input: ocgapp_name_1
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/resolv.conf:
+            str_replace:
+              template: |
+                nameserver ${NAME_SERVER}
+                domain ${DOMAIN_NAME}
+              params:
+                ${NAME_SERVER}:
+                  get_input: nameserver_ip
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/sysconfig/network-scripts/route-eth2:
+            str_replace:
+              template: |
+                ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+              params:
+                ${ETH2_IP_RANGE}:
+                  get_input: eth2_ip_range
+                ${ETH2_IP}:
+                  get_input: eth2_ip
+          /etc/sysconfig/network-scripts/route-eth1:
+            str_replace:
+              template: |
+                ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+              params:
+                ${ETH1_IP_RANGE}:
+                  get_input: eth1_ip_range
+                ${ETH1_IP}:
+                  get_input: eth1_ip
+                ${ETH1_NETMASK}:
+                  get_input: eth1_netmask
+        user_data_format: RAW
+        name:
+          get_input: ocgapp_name_1
+        scheduler_hints:
+          group:
+            get_input: ocg_shared_server_grp_id
+      requirements:
+      - local_storage:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_volume_1
+          relationship: ocgapp_volume_attachment_1
+    ocgapp_server_0:
+      type: org.openecomp.resource.vfc.nodes.heat.ocgapp
+      properties:
+        flavor:
+          get_input: ocgapp_flavor_name
+        key_name: UNSUPPORTED_RESOURCE_ocgapp_admin_key
+        availability_zone:
+          get_input: availability_zone_0
+        image:
+          get_input: ocgapp_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+          vnf_name:
+            get_input: vnf_name
+        personality:
+          /etc/hostname:
+            str_replace:
+              template: |
+                ${NAME}.${DOMAIN_NAME}
+              params:
+                ${NAME}:
+                  get_input: ocgapp_name_0
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/resolv.conf:
+            str_replace:
+              template: |
+                nameserver ${NAME_SERVER}
+                domain ${DOMAIN_NAME}
+              params:
+                ${NAME_SERVER}:
+                  get_input: nameserver_ip
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/sysconfig/network-scripts/route-eth2:
+            str_replace:
+              template: |
+                ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+              params:
+                ${ETH2_IP_RANGE}:
+                  get_input: eth2_ip_range
+                ${ETH2_IP}:
+                  get_input: eth2_ip
+          /etc/sysconfig/network-scripts/route-eth1:
+            str_replace:
+              template: |
+                ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+              params:
+                ${ETH1_IP_RANGE}:
+                  get_input: eth1_ip_range
+                ${ETH1_IP}:
+                  get_input: eth1_ip
+                ${ETH1_NETMASK}:
+                  get_input: eth1_netmask
+        user_data_format: RAW
+        name:
+          get_input: ocgapp_name_0
+        scheduler_hints:
+          group:
+            get_input: ocg_shared_server_grp_id
+      requirements:
+      - local_storage:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_volume_0
+          relationship: ocgapp_volume_attachment_0
+    ocgmgr_oam_protected_0_port:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgmgr_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input:
+            - ocgmgr_oam_protected_ips
+            - 0
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgmgr_oam_port_0
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_protected
+        network:
+          get_input: oam_protected_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgmgr_server_0
+          relationship: tosca.relationships.network.BindsTo
+    ocgmgr_server_0:
+      type: org.openecomp.resource.vfc.nodes.heat.ocgmgr
+      properties:
+        flavor:
+          get_input: ocgmgr_flavor_name
+        key_name: UNSUPPORTED_RESOURCE_ocgmgr_admin_key
+        availability_zone:
+          get_input: availability_zone_0
+        image:
+          get_input: ocgmgr_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+          vnf_name:
+            get_input: vnf_name
+        user_data_format: SOFTWARE_CONFIG
+        name:
+          get_input:
+          - ocgmgr_names
+          - 0
+    ocgmgr_server_1:
+      type: org.openecomp.resource.vfc.nodes.heat.ocgmgr
+      properties:
+        flavor:
+          get_input: ocgmgr_flavor_name
+        key_name: UNSUPPORTED_RESOURCE_ocgmgr_admin_key
+        availability_zone:
+          get_input: availability_zone_1
+        image:
+          get_input: ocgmgr_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+          vnf_name:
+            get_input: vnf_name
+        user_data_format: RAW
+        name:
+          get_input:
+          - ocgmgr_names
+          - 1
+    ocgapp_server_3:
+      type: org.openecomp.resource.vfc.nodes.heat.ocgapp
+      properties:
+        flavor:
+          get_input: ocgapp_flavor_name
+        key_name: UNSUPPORTED_RESOURCE_ocgapp_admin_key
+        availability_zone:
+          get_input: availability_zone_1
+        image:
+          get_input: ocgapp_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+          vnf_name:
+            get_input: vnf_name
+        personality:
+          /etc/hostname:
+            str_replace:
+              template: |
+                ${NAME}.${DOMAIN_NAME}
+              params:
+                ${NAME}:
+                  get_input: ocgapp_name_3
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/resolv.conf:
+            str_replace:
+              template: |
+                nameserver ${NAME_SERVER}
+                domain ${DOMAIN_NAME}
+              params:
+                ${NAME_SERVER}:
+                  get_input: nameserver_ip
+                ${DOMAIN_NAME}:
+                  get_input: domain_name
+          /etc/sysconfig/network-scripts/route-eth2:
+            str_replace:
+              template: |
+                ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+              params:
+                ${ETH2_IP_RANGE}:
+                  get_input: eth2_ip_range
+                ${ETH2_IP}:
+                  get_input: eth2_ip
+          /etc/sysconfig/network-scripts/route-eth1:
+            str_replace:
+              template: |
+                ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+              params:
+                ${ETH1_IP_RANGE}:
+                  get_input: eth1_ip_range
+                ${ETH1_IP}:
+                  get_input: eth1_ip
+                ${ETH1_NETMASK}:
+                  get_input: eth1_netmask
+        user_data_format: RAW
+        name:
+          get_input:
+          - ocgapp_name_3
+        scheduler_hints:
+          group:
+            get_input: ocg_shared_server_grp_id
+      requirements:
+      - local_storage:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_volume_3
+          relationship: ocgapp_volume_attachment_3
+    ocgapp_oam_direct_port_1:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_direct_ip_1
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_direct_port_1
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_direct
+        network:
+          get_input: oam_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_1
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_oam_direct_port_2:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_direct_ip_2
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_direct_port_2
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_direct
+        network:
+          get_input: oam_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_2
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_oam_direct_port_3:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_direct_ip_3
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_direct_port_3
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_direct
+        network:
+          get_input: oam_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_3
+          relationship: tosca.relationships.network.BindsTo
+    OCGAPP_SECURITY_GROUP:
+      type: org.openecomp.resource.vfc.rules.nodes.heat.network.neutron.SecurityRules
+      properties:
+        name:
+          str_replace:
+            template: VF_NAME_sec_grp_OCGAPP
+            params:
+              VF_NAME:
+                get_input: vnf_name
+        description: ocg app security group
+        rules:
+        - protocol: tcp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: egress
+          port_range_min: 1
+        - protocol: udp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: egress
+          port_range_min: 1
+        - protocol: icmp
+          ethertype: IPv4
+          remote_ip_prefix: 0.0.0.0/0
+          direction: egress
+        - protocol: tcp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: ingress
+          port_range_min: 1
+        - protocol: udp
+          ethertype: IPv4
+          port_range_max: 65535
+          remote_ip_prefix: 0.0.0.0/0
+          direction: ingress
+          port_range_min: 1
+        - protocol: icmp
+          ethertype: IPv4
+          remote_ip_prefix: 0.0.0.0/0
+          direction: ingress
+        - protocol: tcp
+          ethertype: IPv6
+          port_range_max: 65535
+          remote_ip_prefix: ::/0
+          direction: egress
+          port_range_min: 1
+        - protocol: udp
+          ethertype: IPv6
+          port_range_max: 65535
+          remote_ip_prefix: ::/0
+          direction: egress
+          port_range_min: 1
+        - protocol: icmp
+          ethertype: IPv6
+          remote_ip_prefix: ::/0
+          direction: egress
+        - protocol: tcp
+          ethertype: IPv6
+          port_range_max: 65535
+          remote_ip_prefix: ::/0
+          direction: ingress
+          port_range_min: 1
+        - protocol: udp
+          ethertype: IPv6
+          port_range_max: 65535
+          remote_ip_prefix: ::/0
+          direction: ingress
+          port_range_min: 1
+        - protocol: icmp
+          ethertype: IPv6
+          remote_ip_prefix: ::/0
+          direction: ingress
+      requirements:
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_protected_port_3
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_direct_port_3
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_cor_direct_port_3
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_protected_port_0
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_direct_port_0
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_cor_direct_port_0
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_protected_port_1
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_direct_port_1
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_cor_direct_port_1
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_protected_port_2
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_oam_direct_port_2
+          relationship: org.openecomp.relationships.AttachesTo
+      - port:
+          capability: tosca.capabilities.Attachment
+          node: ocgapp_cor_direct_port_2
+          relationship: org.openecomp.relationships.AttachesTo
+    ocgapp_volume_1:
+      type: org.openecomp.resource.vfc.nodes.heat.cinder.Volume
+      properties:
+        volume_type:
+          get_input: ocgapp_volume_type_1
+        size: '(get_input : ocgapp_volume_size_1) * 1024'
+        name:
+          str_replace:
+            template: VF_NAME_STACK_NAME_volume_1
+            params:
+              VF_NAME:
+                get_input: vnf_name
+              STACK_NAME:
+                get_input: OS::stack_name
+    ocgapp_volume_0:
+      type: org.openecomp.resource.vfc.nodes.heat.cinder.Volume
+      properties:
+        volume_type:
+          get_input: ocgapp_volume_type_0
+        size: '(get_input : ocgapp_volume_size_0) * 1024'
+        name:
+          str_replace:
+            template: VF_NAME_STACK_NAME_volume_1
+            params:
+              VF_NAME:
+                get_input: vnf_name
+              STACK_NAME:
+                get_input: OS::stack_name
+    ocgapp_volume_3:
+      type: org.openecomp.resource.vfc.nodes.heat.cinder.Volume
+      properties:
+        volume_type:
+          get_input: ocgapp_volume_type_3
+        size: '(get_input : ocgapp_volume_size_3) * 1024'
+        name:
+          str_replace:
+            template: VF_NAME_STACK_NAME_volume_3
+            params:
+              VF_NAME:
+                get_input: vnf_name
+              STACK_NAME:
+                get_input: OS::stack_name
+    ocgapp_oam_direct_port_0:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_direct_ip_0
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_direct_port_0
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_direct
+        network:
+          get_input: oam_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_0
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_volume_2:
+      type: org.openecomp.resource.vfc.nodes.heat.cinder.Volume
+      properties:
+        volume_type:
+          get_input: ocgapp_volume_type_2
+        size: '(get_input : ocgapp_volume_size_2) * 1024'
+        name:
+          str_replace:
+            template: VF_NAME_STACK_NAME_volume_2
+            params:
+              VF_NAME:
+                get_input: vnf_name
+              STACK_NAME:
+                get_input: OS::stack_name
+    ocgapp_cor_direct_port_1:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        - ip_version: 6
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_cor_direct_ip_1
+        - ip_address:
+            get_input: ocgapp_cor_direct_v6_ip_1
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_cor_port_1
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: cor_direct
+        network:
+          get_input: cor_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_1
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_cor_direct_port_0:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        - ip_version: 6
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_cor_direct_ip_0
+        - ip_address:
+            get_input: ocgapp_cor_direct_v6_ip_0
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_cor_port_0
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: cor_direct
+        network:
+          get_input: cor_direct_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_0
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_oam_protected_port_1:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_protected_ip_1
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_protected_port_1
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_protected
+        network:
+          get_input: oam_protected_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_1
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_oam_protected_port_0:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_protected_ip_0
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_protected_port_0
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_protected
+        network:
+          get_input: oam_protected_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_0
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_oam_protected_port_3:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_protected_ip_3
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_protected_port_3
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_protected
+        network:
+          get_input: oam_protected_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_3
+          relationship: tosca.relationships.network.BindsTo
+    ocgmgr_oam_protected_1_port:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgmgr_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input:
+            - ocgmgr_oam_protected_ips
+            - 1
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgmgr_oam_port_1
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_protected
+        network:
+          get_input: oam_protected_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgmgr_server_1
+          relationship: tosca.relationships.network.BindsTo
+    ocgapp_oam_protected_port_2:
+      type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port
+      properties:
+        ip_requirements:
+        - ip_version: 4
+          ip_count_required:
+            is_required: true
+          floating_ip_count_required:
+            is_required: false
+        security_groups:
+        - get_input: ocgapp_shared_sec_grp_id
+        fixed_ips:
+        - ip_address:
+            get_input: ocgapp_oam_protected_ip_2
+        mac_requirements:
+          mac_count_required:
+            is_required: false
+        name:
+          str_replace:
+            template: VNF_NAME_ocgapp_oam_protected_port_2
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+        network_role_tag: oam_protected
+        network:
+          get_input: oam_protected_net_name
+      requirements:
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: ocgapp_server_2
+          relationship: tosca.relationships.network.BindsTo
+  relationship_templates:
+    ocgapp_volume_attachment_3:
+      type: org.openecomp.relationships.VolumeAttachesTo
+      properties:
+        volume_id: ocgapp_volume_3
+        instance_uuid: ocgapp_server_3
+    ocgapp_volume_attachment_2:
+      type: org.openecomp.relationships.VolumeAttachesTo
+      properties:
+        volume_id: ocgapp_volume_2
+        instance_uuid: ocgapp_server_2
+    ocgapp_volume_attachment_1:
+      type: org.openecomp.relationships.VolumeAttachesTo
+      properties:
+        volume_id: ocgapp_volume_1
+        instance_uuid: ocgapp_server_1
+    ocgapp_volume_attachment_0:
+      type: org.openecomp.relationships.VolumeAttachesTo
+      properties:
+        volume_id: ocgapp_volume_0
+        instance_uuid: ocgapp_server_0
+  groups:
+    base_ocg_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/base_ocg.yaml
+        description: |
+          Base HOT template to create The Security Group for the the OCG VNF
+      members:
+      - OCGMGR_SECURITY_GROUP
+      - OCGAPP_SECURITY_GROUP
+    ocgapp_04_volume_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_04_volume.yaml
+      members:
+      - ocgapp_volume_3
+    ocgmgr_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgmgr.yaml
+        description: OCG Managers template
+      members:
+      - ocgmgr_oam_protected_0_port
+      - ocgmgr_server_0
+      - ocgmgr_server_1
+      - ocgmgr_oam_protected_1_port
+    ocgapp_02_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_02.yaml
+        description: OCG Apps template
+      members:
+      - ocgapp_server_1
+      - ocgapp_cor_direct_port_1
+      - ocgapp_oam_direct_port_1
+      - ocgapp_oam_protected_port_1
+    ocgapp_03_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_03.yaml
+        description: OCG Apps template
+      members:
+      - ocgapp_server_2
+      - ocgapp_oam_direct_port_2
+      - ocgapp_cor_direct_port_2
+      - ocgapp_oam_protected_port_2
+    ocg_RSG_group:
+      type: tosca.groups.Root
+      members:
+      - ocgapp_server_3
+      - ocgapp_server_0
+      - ocgapp_server_1
+      - ocgapp_server_2
+    ocgapp_01_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_01.yaml
+        description: OCG Apps template
+      members:
+      - ocgapp_server_0
+      - ocgapp_cor_direct_port_0
+      - ocgapp_oam_protected_port_0
+      - ocgapp_oam_direct_port_0
+    ocgapp_04_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_04.yaml
+        description: OCG Apps template
+      members:
+      - ocgapp_cor_direct_port_3
+      - ocgapp_oam_direct_port_3
+      - ocgapp_oam_protected_port_3
+      - ocgapp_server_3
+    ocgapp_01_volume_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_01_volume.yaml
+      members:
+      - ocgapp_volume_0
+    ocgapp_02_volume_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_02_volume.yaml
+      members:
+      - ocgapp_volume_1
+    ocgapp_03_volume_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgapp_03_volume.yaml
+      members:
+      - ocgapp_volume_2
+    ocgmgr_volume_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgmgr_volume.yaml
+        description: OCG template for MGR volumes
+      members:
+      - ocgmgr_volume_resource_group
+  outputs:
+    ocgapp_volume_id_0:
+      description: the ocgapp volume id 0
+      value: ocgapp_volume_0
+    ocgapp_volume_id_1:
+      description: the ocgapp volume id 1
+      value: ocgapp_volume_1
+    ocgapp_volume_id_2:
+      description: the ocgapp volume id 2
+      value: ocgapp_volume_2
+    ocgapp_volume_id_3:
+      description: the ocgapp volume id 3
+      value: ocgapp_volume_3
+    ocgmgr_volume_ids:
+      description: ocgmgr volume ids
+      value:
+        get_attribute:
+        - ocgmgr_volume_resource_group
+        - ocgmgr_volume_id_0
+  policies:
+    ocg_RSG_policy:
+      type: org.openecomp.policies.placement.Antilocate
+      properties:
+        name:
+          str_replace:
+            template: VF_NAME_server_grp_OCG
+            params:
+              VF_NAME:
+                get_input: vnf_name
+        container_type: host
+      targets:
+      - ocg_RSG_group
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/expectedoutputfiles/ocgmgr_nested_volumeServiceTemplate.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/expectedoutputfiles/ocgmgr_nested_volumeServiceTemplate.yaml
new file mode 100644 (file)
index 0000000..0de9369
--- /dev/null
@@ -0,0 +1,88 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+metadata:
+  template_name: ocgmgr_nested_volume
+imports:
+- openecomp_heat_index:
+    file: openecomp-heat/_index.yml
+- GlobalSubstitutionTypes:
+    file: GlobalSubstitutionTypesServiceTemplate.yaml
+topology_template:
+  inputs:
+    volume_type:
+      label: Volume Type
+      hidden: false
+      immutable: false
+      type: string
+      description: type of cinder volumes
+    size:
+      label: Volume Size
+      hidden: false
+      immutable: false
+      type: float
+      description: size of the cinder volumes
+      constraints:
+      - in_range:
+        - 50
+        - 400
+    vnf_name:
+      label: VNF Name
+      hidden: false
+      immutable: false
+      type: string
+      description: vnf name
+    index:
+      label: Volume index
+      hidden: false
+      immutable: false
+      type: float
+      description: number of volumes to spin up
+      constraints:
+      - valid_values:
+        - 0
+        - 1
+        - 2
+    OS::stack_name:
+      type: string
+      required: false
+  node_templates:
+    ocgmgr_volume_0:
+      type: org.openecomp.resource.vfc.nodes.heat.cinder.Volume
+      properties:
+        volume_type:
+          get_input: volume_type
+        size: '(get_input : size) * 1024'
+        name:
+          str_replace:
+            template: VF_NAME_STACK_NAME_INDEX
+            params:
+              VF_NAME:
+                get_input: vnf_name
+              INDEX:
+                get_input: index
+              STACK_NAME:
+                get_input: OS::stack_name
+  groups:
+    ocgmgr_nested_volume_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/ocgmgr_nested_volume.yaml
+        description: Nested volume file for ocg mgrs
+      members:
+      - ocgmgr_volume_0
+  outputs:
+    ocgmgr_volume_id_0:
+      description: the ocgmgr volume uuids
+      value: ocgmgr_volume_0
+  substitution_mappings:
+    node_type: org.openecomp.resource.abstract.nodes.heat.ocgmgr_nested_volume
+    capabilities:
+      feature_ocgmgr_volume_0:
+      - ocgmgr_volume_0
+      - feature
+      attachment_ocgmgr_volume_0:
+      - ocgmgr_volume_0
+      - attachment
+    requirements:
+      dependency_ocgmgr_volume_0:
+      - ocgmgr_volume_0
+      - dependency
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/MANIFEST.json
new file mode 100644 (file)
index 0000000..dc47034
--- /dev/null
@@ -0,0 +1,139 @@
+{
+  "name": "23_defect_fix",
+  "description": "a",
+  "version": "0.0",
+  "data": [
+    {
+      "isBase": false,
+      "file": "ocgmgr.yaml",
+      "type": "HEAT",
+      "data": [
+        {
+          "file": "ocgmgr.env",
+          "type": "HEAT_ENV"
+        },
+        {
+          "file": "ocgmgr_volume.yaml",
+          "type": "HEAT_VOL",
+          "data": [
+            {
+              "file": "ocgmgr_volume.env",
+              "type": "HEAT_ENV"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "isBase": false,
+      "file": "ocgapp_04.yaml",
+      "type": "HEAT",
+      "data": [
+        {
+          "file": "ocgapp_04.env",
+          "type": "HEAT_ENV"
+        },
+        {
+          "file": "ocgapp_04_volume.yaml",
+          "type": "HEAT_VOL",
+          "data": [
+            {
+              "file": "ocgapp_04_volume.env",
+              "type": "HEAT_ENV"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "isBase": false,
+      "file": "ocgapp_03.yaml",
+      "type": "HEAT",
+      "data": [
+        {
+          "file": "ocgapp_03.env",
+          "type": "HEAT_ENV"
+        },
+        {
+          "file": "ocgapp_03_volume.yaml",
+          "type": "HEAT_VOL",
+          "data": [
+            {
+              "file": "ocgapp_03_volume.env",
+              "type": "HEAT_ENV"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "isBase": false,
+      "file": "ocgapp_02.yaml",
+      "type": "HEAT",
+      "data": [
+        {
+          "file": "ocgapp_02.env",
+          "type": "HEAT_ENV"
+        },
+        {
+          "file": "ocgapp_02_volume.yaml",
+          "type": "HEAT_VOL",
+          "data": [
+            {
+              "file": "ocgapp_02_volume.env",
+              "type": "HEAT_ENV"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "isBase": false,
+      "file": "ocgapp_01.yaml",
+      "type": "HEAT",
+      "data": [
+        {
+          "file": "ocgapp_01.env",
+          "type": "HEAT_ENV"
+        },
+        {
+          "file": "ocgapp_01_volume.yaml",
+          "type": "HEAT_VOL",
+          "data": [
+            {
+              "file": "ocgapp_01_volume.env",
+              "type": "HEAT_ENV"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "isBase": true,
+      "file": "base_ocg.yaml",
+      "type": "HEAT",
+      "data": [
+        {
+          "file": "base_ocg.env",
+          "type": "HEAT_ENV"
+        }
+      ]
+    },
+    {
+      "file": "ocgmgr_nested_volume.yaml",
+      "type": "HEAT"
+    },
+    {
+      "file": "ocgapp_nested_0.txt",
+      "type": "OTHER"
+    },
+    {
+      "file": "ocgmgr_nested_1.txt",
+      "type": "OTHER"
+    },
+    {
+      "file": "ocgmgr_nested_0.txt",
+      "type": "OTHER"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/base_ocg.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/base_ocg.env
new file mode 100644 (file)
index 0000000..e9bc8b2
--- /dev/null
@@ -0,0 +1,9 @@
+#OCG Base Template ENV File
+#Version 1.0
+#Authors:
+
+#####################
+parameters:
+#####################
+
+  vnf_name: 'zrdm6bvocg_redesign'
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/base_ocg.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/base_ocg.yaml
new file mode 100644 (file)
index 0000000..fc07aae
--- /dev/null
@@ -0,0 +1,89 @@
+heat_template_version: 2015-04-30
+#OCG Base Template
+#AUTHORS:
+description: >
+  Base HOT template to create The Security Group for the the OCG VNF
+
+#####################
+parameters:
+#####################
+
+## GLOBAL//Basic Parameters
+  vnf_name:
+    type: string
+    description: Unique name for this VF instance
+#   For manual spinups, value must be in the ENV file. Must be removed from ENV before uploading to ASDC
+
+#####################
+resources:
+#####################
+
+  OCGAPP_SECURITY_GROUP:
+    type: OS::Neutron::SecurityGroup
+    properties:
+      description: ocg app security group
+      name:
+        str_replace:
+            template: VF_NAME_sec_grp_OCGAPP
+            params:
+                VF_NAME:    {get_param: vnf_name}
+      rules: [{"direction": egress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": egress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": egress, "ethertype": IPv4, "protocol": icmp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": ingress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": ingress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": ingress, "ethertype": IPv4, "protocol": icmp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": egress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": "::/0"},
+              {"direction": egress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": "::/0"},
+              {"direction": egress, "ethertype": IPv6, "protocol": icmp, "remote_ip_prefix": "::/0"},
+              {"direction": ingress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": "::/0"},
+              {"direction": ingress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": "::/0"},
+              {"direction": ingress, "ethertype": IPv6, "protocol": icmp, "remote_ip_prefix": "::/0"}
+             ]
+
+  OCGMGR_SECURITY_GROUP:
+    type: OS::Neutron::SecurityGroup
+    properties:
+      description: ocg mgr security group
+      name:
+        str_replace:
+            template: VF_NAME_sec_grp_OCGMGR
+            params:
+                VF_NAME:    {get_param: vnf_name}
+      rules: [{"direction": egress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": egress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": egress, "ethertype": IPv4, "protocol": icmp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": ingress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": ingress, "ethertype": IPv4, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": 0.0.0.0/0},
+              {"direction": ingress, "ethertype": IPv4, "protocol": icmp, "remote_ip_prefix": 0.0.0.0/0},
+              #{"direction": egress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": "::/0"},
+              #{"direction": egress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": "::/0"},
+              #{"direction": egress, "ethertype": IPv6, "protocol": icmp, "remote_ip_prefix": "::/0"},
+              #{"direction": ingress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": tcp, "remote_ip_prefix": "::/0"},
+              #{"direction": ingress, "ethertype": IPv6, "port_range_min": 1, "port_range_max": 65535, "protocol": udp, "remote_ip_prefix": "::/0"},
+              #{"direction": ingress, "ethertype": IPv6, "protocol": icmp, "remote_ip_prefix": "::/0"}
+              ]
+
+  ocg_RSG:
+    type: OS::Nova::ServerGroup
+    properties:
+      name:
+        str_replace:
+          template: VF_NAME_server_grp_OCG
+          params:
+              VF_NAME: {get_param: vnf_name}
+      policies:
+        - anti-affinity
+        
+outputs:
+  ocgapp_shared_sec_grp_id:
+    description: UUID of OCG APP Resource SecurityGroup
+    value: { get_resource: OCGAPP_SECURITY_GROUP }
+
+  ocgmgr_shared_sec_grp_id:
+    description: UUID of OCG MGR Resource SecutiryGroup
+    value: {get_resource: OCGMGR_SECURITY_GROUP}
+    
+  ocg_shared_server_grp_id:
+    description: UUID of OCG anti-affinity server group
+    value: {get_resource: ocg_RSG}
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01.env
new file mode 100644 (file)
index 0000000..fbd4e77
--- /dev/null
@@ -0,0 +1,27 @@
+#file version 1.0
+parameters:
+  ocgapp_image_name: NIMBUS_OCG-APPLICATION_20180328.qcow2
+  ocgapp_flavor_name: nv.c8r32d320
+  ocgapp_public_key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAh5B/f9JmJL5HcIJT+XeGnE9Jlv22NYGweMx+M2eX53X0sxdB8onhqDiLFODgDgXUuQk11NM2tQeA+xH+nlZxdETK+5uKb2SLwsPjZnxHQPrGQP1KKAZi9aKoZFjYmWrYuqzQFT9QRz3gehG+pX82mzMkkE/Da2/XJ62zu8PKfapn63MhhmxG5w5onuN2XsM2zfI6GILFM56ppLtMCkgvzXVcWOpr7pD4kpnC9WavxwAkmQPrWIbTi0MKIEeuON0B+KRgC3b8GnCpuE2GFTffAm1MBgi0Urs8e3XGHsilVMqYdaCPZwq5ZKlzivX5wZQH9yT9m9Db6XLL66ZIaBHt2w== rsa-key-20170906'
+#  oam_protected_net_name: MNS-25180-T-RDM6B_oam_protected_net_1
+#  oam_direct_net_name: MNS-25180-T-RDM6B_oam_direct_net_1
+#  cor_direct_net_name: MNS-25180-T-RDM6B_cor_direct_net_1
+#  ocgapp_oam_protected_ip_0: 107.112.163.94 
+#  ocgapp_oam_direct_ip_0: 107.112.168.138 
+#  ocgapp_cor_direct_ip_0: 107.242.64.58 
+#  ocgapp_cor_direct_v6_ip_0: 2606:ae00:2e20:1404::10 
+#  ocgapp_name_0: zrdm6bvocg01app001_REDESIGN
+#  availability_zone_0: rdm6b-kvm-az01
+#  ocgapp_shared_sec_grp_id: acd420c8-37a0-4493-9296-bab085e76f45 
+#  ocg_shared_server_grp_id: e1ac6d1c-32aa-43dc-b1e1-0c33e69167f9 
+  nameserver_ip: 135.214.16.119
+  eth1_ip_range: 130.4.128.0
+  eth1_netmask: 21
+  eth1_ip: 107.112.168.129
+  eth2_ip_range: 107.242.64.1
+  eth2_ip: 107.242.64.49
+  domain_name: 'eng.mobilephone.net'
+#  ocgapp_volume_id_0: 3c87a5dc-0dee-4831-8942-8ca44fdaf01a 
+#  vnf_name: zrdm6bvocg01_REDEDSIGN 
+#  vnf_id: 'dummy'
+#  vf_module_id: 'dummy'
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01.yaml
new file mode 100644 (file)
index 0000000..a133872
--- /dev/null
@@ -0,0 +1,215 @@
+heat_template_version: 2015-04-30
+#file version 1.0
+description: OCG Apps template
+
+parameters:
+  ocgapp_image_name:
+    type: string
+    description: operative system image
+  ocgapp_flavor_name:
+    type: string
+    description: resources to be applied on instances
+  ocgapp_public_key:
+    type: string
+    description: creator's ssh public key
+  oam_protected_net_name:
+    type: string
+    description: OAM network where instances will connect
+  oam_direct_net_name:
+    type: string
+    description: OAM network where instances will connect
+  cor_direct_net_name:
+    type: string
+    description: COR_DIRECT network where instances will connect
+  ocgapp_oam_protected_ip_0:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_oam_direct_ip_0:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_cor_direct_ip_0:
+    type: string
+    description: OCG COR_DIRECT IP list
+  ocgapp_cor_direct_v6_ip_0:
+    type: string
+    description: fixed IP assignment for VM's on the COR_DIRECT network
+  ocgapp_name_0:
+    type: string
+    description: OCG VM server name list (there should be 2, since we have 2 app vms)
+  availability_zone_0:
+    type: string
+    description: availability zone 1 ID or name
+  ocg_shared_server_grp_id:
+    type: string
+    description: OCG anti-affinity server group
+  ocgapp_shared_sec_grp_id:
+    type: string
+    description: security group
+  ocgapp_volume_id_0:
+    type: string
+    description: Unique IDs for volumes
+  vnf_name:
+    type: string
+    description: Unique name for this VF instance
+  vnf_id:
+    type: string
+    description: Unique ID for this VF instance
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module instance
+  nameserver_ip:
+    type: string
+    description: nameserver
+  eth1_ip_range:
+    type: string 
+    description: range
+  eth1_netmask:
+    type: string
+    description: mask length 
+  eth1_ip:
+    type: string
+    description: address
+  eth2_ip_range: 
+    type: string
+    description: range
+  eth2_ip: 
+    type: string
+    description: address 
+  domain_name:
+    type: string
+    description: address
+
+resources:
+
+  vm_config_0:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: {get_file: ocgapp_nested_0.txt}
+          params:
+            $ocg_hostname: { get_param: ocgapp_name_0 }
+            $ocg_hostip: { get_param: ocgapp_oam_protected_ip_0 }
+            $volume_id: {get_param: ocgapp_volume_id_0 }
+
+  ocgapp_admin_key:
+    type: OS::Nova::KeyPair
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_STACK_NAME_key_pair
+          params:
+              VNF_NAME: {get_param: vnf_name}
+              STACK_NAME: {get_param: 'OS::stack_name'}
+      public_key: {get_param: ocgapp_public_key}
+      save_private_key: false
+
+  ocgapp_config_0:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+        - config: {get_resource: vm_config_0}
+        
+ # APP_SERVER_0
+  ocgapp_oam_protected_port_0:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_protected_port_0
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_protected_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_protected_ips, 0]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_protected_ip_0}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+      
+  ocgapp_oam_direct_port_0:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_direct_port_0
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_direct_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_direct_ips, 0]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_direct_ip_0}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+      
+  ocgapp_cor_direct_port_0:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_cor_port_0
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: cor_direct_net_name}
+      fixed_ips: [{"ip_address": {get_param: ocgapp_cor_direct_ip_0}}, {"ip_address": {get_param: ocgapp_cor_direct_v6_ip_0}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+
+  ocgapp_server_0:
+    type: OS::Nova::Server
+    properties:
+      key_name: {get_resource: ocgapp_admin_key}
+      name: {get_param: ocgapp_name_0}
+      image: {get_param: ocgapp_image_name}
+      flavor: {get_param: ocgapp_flavor_name}
+      availability_zone: {get_param: availability_zone_0}
+      scheduler_hints:
+          group: { get_param: ocg_shared_server_grp_id }
+      personality:
+      # Add resolv.conf file
+        "/etc/resolv.conf":
+          str_replace:
+            template: |
+              nameserver ${NAME_SERVER}
+              domain ${DOMAIN_NAME}
+            params:
+              ${NAME_SERVER}: {get_param: nameserver_ip}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add hostname file
+        "/etc/hostname":
+          str_replace:
+            template: |
+              ${NAME}.${DOMAIN_NAME}
+            params:
+              ${NAME}: {get_param: ocgapp_name_0}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add route-eth1 file
+        "/etc/sysconfig/network-scripts/route-eth1":
+          str_replace:
+            template: |
+              ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+            params:
+              ${ETH1_IP_RANGE}: {get_param: eth1_ip_range}
+              ${ETH1_NETMASK}: {get_param: eth1_netmask}
+              ${ETH1_IP}: {get_param: eth1_ip}
+      # Add route-eth2 file
+        "/etc/sysconfig/network-scripts/route-eth2":
+          str_replace:
+            template: |
+              ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+            params:
+              ${ETH2_IP_RANGE}: {get_param: eth2_ip_range}
+#              ${ETH2_NETMASK}: {get_param: eth2_netmask}
+              ${ETH2_IP}: {get_param: eth2_ip}
+      networks:
+        - port: {get_resource: ocgapp_oam_protected_port_0}
+        - port: {get_resource: ocgapp_oam_direct_port_0}
+        - port: {get_resource: ocgapp_cor_direct_port_0}
+      metadata:
+        vnf_id: {get_param: vnf_id}
+        vf_module_id: {get_param: vf_module_id}
+        vnf_name: {get_param: vnf_name}
+      user_data_format: RAW
+      user_data: {get_resource: ocgapp_config_0}
+#      user_data: {get_resource: server_interface_config}
+
+  ocgapp_volume_attachment_0:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: ocgapp_volume_id_0}
+      instance_uuid: {get_resource: ocgapp_server_0}
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01_volume.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01_volume.env
new file mode 100644 (file)
index 0000000..369444f
--- /dev/null
@@ -0,0 +1,5 @@
+#file version 1.0
+parameters:
+  vnf_name: 'zrdm5avocg01'
+  ocgapp_volume_size_0: 400
+  ocgapp_volume_type_0: SF-Default-SSD
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01_volume.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_01_volume.yaml
new file mode 100644 (file)
index 0000000..3e96789
--- /dev/null
@@ -0,0 +1,35 @@
+heat_template_version: 2015-04-30
+#file version 2.3
+parameters:
+  vnf_name:
+    type: string
+    label: OCG VNF Name
+    description: OCG VNF Name
+  ocgapp_volume_size_0:
+    type: number
+    label: Cinder volume size
+    description: the size of the Cinder volume
+    constraints:
+      - range: { min: 100, max: 400 }
+  ocgapp_volume_type_0:
+    type: string
+    label: vm volume type
+    description: the name of the target volume backend for ocgapp1
+resources:
+  ocgapp_volume_0:
+    type: OS::Cinder::Volume
+    properties:
+      size: {get_param: ocgapp_volume_size_0 }
+      volume_type: {get_param: ocgapp_volume_type_0}
+      name:
+        str_replace:
+          template: VF_NAME_STACK_NAME_volume_1
+          params:
+            VF_NAME: { get_param: vnf_name }
+            STACK_NAME: { get_param: 'OS::stack_name' }
+
+outputs:
+  ocgapp_volume_id_0:
+    description: the ocgapp volume id 0
+    value: { get_resource: ocgapp_volume_0 }
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02.env
new file mode 100644 (file)
index 0000000..aae3195
--- /dev/null
@@ -0,0 +1,27 @@
+#file version 1.0
+parameters:
+  ocgapp_image_name: NIMBUS_OCG-APPLICATION_20180328.qcow2
+  ocgapp_flavor_name: nv.c8r32d320
+  ocgapp_public_key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAh5B/f9JmJL5HcIJT+XeGnE9Jlv22NYGweMx+M2eX53X0sxdB8onhqDiLFODgDgXUuQk11NM2tQeA+xH+nlZxdETK+5uKb2SLwsPjZnxHQPrGQP1KKAZi9aKoZFjYmWrYuqzQFT9QRz3gehG+pX82mzMkkE/Da2/XJ62zu8PKfapn63MhhmxG5w5onuN2XsM2zfI6GILFM56ppLtMCkgvzXVcWOpr7pD4kpnC9WavxwAkmQPrWIbTi0MKIEeuON0B+KRgC3b8GnCpuE2GFTffAm1MBgi0Urs8e3XGHsilVMqYdaCPZwq5ZKlzivX5wZQH9yT9m9Db6XLL66ZIaBHt2w== rsa-key-20170906'
+#  oam_protected_net_name: MNS-25180-T-RDM6B_oam_protected_net_1
+#  oam_direct_net_name: MNS-25180-T-RDM6B_oam_direct_net_1
+#  cor_direct_net_name: MNS-25180-T-RDM6B_cor_direct_net_1
+#  ocgapp_oam_protected_ip_1: 107.112.163.95 
+#  ocgapp_oam_direct_ip_1: 107.112.168.139 
+#  ocgapp_cor_direct_ip_1: 107.242.64.59 
+#  ocgapp_cor_direct_v6_ip_1: 2606:ae00:2e20:1404::11 
+#  ocgapp_name_1: zrdm6bvocg01app002_REDESIGN
+#  availability_zone_0: rdm6b-kvm-az01
+#  ocgapp_shared_sec_grp_id: acd420c8-37a0-4493-9296-bab085e76f45 
+#  ocg_shared_server_grp_id: e1ac6d1c-32aa-43dc-b1e1-0c33e69167f9  
+  nameserver_ip: 135.214.16.119
+  eth1_ip_range: 130.4.128.0
+  eth1_netmask: 21
+  eth1_ip: 107.112.168.129
+  eth2_ip_range: 107.242.64.1
+  eth2_ip: 107.242.64.49
+  domain_name: eng.mobilephone.net
+#  ocgapp_volume_id_1: c13725c4-adb8-4512-b2ec-2b4be476fe7c 
+#  vnf_name: zrdm6bvocg01_REDESIGN
+#  vnf_id: 'dummy'
+#  vf_module_id: 'dummy'
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02.yaml
new file mode 100644 (file)
index 0000000..c435b12
--- /dev/null
@@ -0,0 +1,217 @@
+heat_template_version: 2015-04-30
+#file version 1.0
+description: OCG Apps template
+
+parameters:
+  ocgapp_image_name:
+    type: string
+    description: operative system image
+  ocgapp_flavor_name:
+    type: string
+    description: resources to be applied on instances
+  ocgapp_public_key:
+    type: string
+    description: creator's ssh public key
+  oam_protected_net_name:
+    type: string
+    description: OAM network where instances will connect
+  oam_direct_net_name:
+    type: string
+    description: OAM network where instances will connect
+  cor_direct_net_name:
+    type: string
+    description: COR_DIRECT network where instances will connect
+  ocgapp_oam_protected_ip_1:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_oam_direct_ip_1:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_cor_direct_ip_1:
+    type: string
+    description: OCG COR_DIRECT IP list
+  ocgapp_cor_direct_v6_ip_1:
+    type: string
+    description: fixed IP assignment for VM's on the COR_DIRECT network
+  ocgapp_name_1:
+    type: string
+    description: OCG VM server name list (there should be 2, since we have 2 app vms)
+  availability_zone_0:
+    type: string
+    description: availability zone 1 ID or name
+  ocg_shared_server_grp_id:
+    type: string
+    description: OCG anti-affinity server group
+  ocgapp_shared_sec_grp_id:
+    type: string
+    description: security group
+  ocgapp_volume_id_1:
+    type: string
+    description: Unique IDs for volumes
+  vnf_name:
+    type: string
+    description: Unique name for this VF instance
+  vnf_id:
+    type: string
+    description: Unique ID for this VF instance
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module instance
+  nameserver_ip:
+    type: string
+    description: nameserver
+  eth1_ip_range:
+    type: string 
+    description: range
+  eth1_netmask:
+    type: string
+    description: mask length 
+  eth1_ip:
+    type: string
+    description: address
+  eth2_ip_range: 
+    type: string
+    description: range
+  eth2_ip: 
+    type: string
+    description: address 
+  domain_name:
+    type: string
+    description: address
+
+resources:
+
+  vm_config_1:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: {get_file: ocgapp_nested_0.txt}
+          params:
+            $ocg_hostname: { get_param: ocgapp_name_1 }
+            $ocg_hostip: { get_param: ocgapp_oam_protected_ip_1 }
+            $volume_id: {get_param: ocgapp_volume_id_1 }
+
+  ocgapp_admin_key:
+    type: OS::Nova::KeyPair
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_STACK_NAME_key_pair
+          params:
+              VNF_NAME: {get_param: vnf_name}
+              STACK_NAME: {get_param: 'OS::stack_name'}
+      public_key: {get_param: ocgapp_public_key}
+      save_private_key: false
+
+  ocgapp_config_1:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+        - config: {get_resource: vm_config_1}
+
+# APP_SERVER_1      
+  ocgapp_oam_protected_port_1:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_protected_port_1
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_protected_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_protected_ips, 0]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_protected_ip_1}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+      
+  ocgapp_oam_direct_port_1:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_direct_port_1
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_direct_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_direct_ips, 0]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_direct_ip_1}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+      
+  ocgapp_cor_direct_port_1:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_cor_port_1
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: cor_direct_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_cor_direct_ips, 0]}}, {"ip_address": {get_param: [ocgapp_cor_direct_v6_ips, 0]}}]
+      fixed_ips: [{"ip_address": {get_param: ocgapp_cor_direct_ip_1}}, {"ip_address": {get_param: ocgapp_cor_direct_v6_ip_1}}] 
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+
+  ocgapp_server_1:
+    type: OS::Nova::Server
+    properties:
+      key_name: {get_resource: ocgapp_admin_key}
+      name: {get_param: ocgapp_name_1 }
+      image: {get_param: ocgapp_image_name}
+      flavor: {get_param: ocgapp_flavor_name}
+      availability_zone: {get_param: availability_zone_0}
+      scheduler_hints:
+          group: { get_param: ocg_shared_server_grp_id }
+      personality:
+      # Add resolv.conf file
+        "/etc/resolv.conf":
+          str_replace:
+            template: |
+              nameserver ${NAME_SERVER}
+              domain ${DOMAIN_NAME}
+            params:
+              ${NAME_SERVER}: {get_param: nameserver_ip}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add hostname file
+        "/etc/hostname":
+          str_replace:
+            template: |
+              ${NAME}.${DOMAIN_NAME}
+            params:
+              ${NAME}: {get_param: ocgapp_name_1}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add route-eth1 file
+        "/etc/sysconfig/network-scripts/route-eth1":
+          str_replace:
+            template: |
+              ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+            params:
+              ${ETH1_IP_RANGE}: {get_param: eth1_ip_range}
+              ${ETH1_NETMASK}: {get_param: eth1_netmask}
+              ${ETH1_IP}: {get_param: eth1_ip}
+      # Add route-eth2 file
+        "/etc/sysconfig/network-scripts/route-eth2":
+          str_replace:
+            template: |
+              ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+            params:
+              ${ETH2_IP_RANGE}: {get_param: eth2_ip_range}
+#              ${ETH2_NETMASK}: {get_param: eth2_netmask}
+              ${ETH2_IP}: {get_param: eth2_ip}
+      networks:
+        - port: {get_resource: ocgapp_oam_protected_port_1}
+        - port: {get_resource: ocgapp_oam_direct_port_1}
+        - port: {get_resource: ocgapp_cor_direct_port_1}
+      metadata:
+        vnf_id: {get_param: vnf_id}
+        vf_module_id: {get_param: vf_module_id}
+        vnf_name: {get_param: vnf_name}
+      user_data_format: RAW
+      user_data: {get_resource: ocgapp_config_1}
+#      user_data: {get_resource: server_interface_config}
+
+  ocgapp_volume_attachment_1:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: ocgapp_volume_id_1}
+      instance_uuid: {get_resource: ocgapp_server_1}
+
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02_volume.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02_volume.env
new file mode 100644 (file)
index 0000000..37b385f
--- /dev/null
@@ -0,0 +1,5 @@
+#file version 1.0
+parameters:
+  vnf_name: 'zrdm5avocg01'
+  ocgapp_volume_size_1: 400
+  ocgapp_volume_type_1: SF-Default-SSD
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02_volume.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_02_volume.yaml
new file mode 100644 (file)
index 0000000..3153e81
--- /dev/null
@@ -0,0 +1,35 @@
+heat_template_version: 2015-04-30
+#file version 2.3
+parameters:
+  vnf_name:
+    type: string
+    label: OCG VNF Name
+    description: OCG VNF Name
+  ocgapp_volume_size_1:
+    type: number
+    label: Cinder volume size
+    description: the size of the Cinder volume
+    constraints:
+      - range: { min: 100, max: 400 }
+  ocgapp_volume_type_1:
+    type: string
+    label: vm volume type
+    description: the name of the target volume backend for ocgapp1
+resources:
+  ocgapp_volume_1:
+    type: OS::Cinder::Volume
+    properties:
+      size: {get_param: ocgapp_volume_size_1 }
+      volume_type: {get_param: ocgapp_volume_type_1}
+      name:
+        str_replace:
+          template: VF_NAME_STACK_NAME_volume_1
+          params:
+            VF_NAME: { get_param: vnf_name }
+            STACK_NAME: { get_param: 'OS::stack_name' }
+
+outputs:
+  ocgapp_volume_id_1:
+    description: the ocgapp volume id 1
+    value: { get_resource: ocgapp_volume_1 }
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03.env
new file mode 100644 (file)
index 0000000..428442e
--- /dev/null
@@ -0,0 +1,27 @@
+#file version 1.0
+parameters:
+  ocgapp_image_name: NIMBUS_OCG-APPLICATION_20180328.qcow2
+  ocgapp_flavor_name: nv.c8r32d320
+  ocgapp_public_key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAh5B/f9JmJL5HcIJT+XeGnE9Jlv22NYGweMx+M2eX53X0sxdB8onhqDiLFODgDgXUuQk11NM2tQeA+xH+nlZxdETK+5uKb2SLwsPjZnxHQPrGQP1KKAZi9aKoZFjYmWrYuqzQFT9QRz3gehG+pX82mzMkkE/Da2/XJ62zu8PKfapn63MhhmxG5w5onuN2XsM2zfI6GILFM56ppLtMCkgvzXVcWOpr7pD4kpnC9WavxwAkmQPrWIbTi0MKIEeuON0B+KRgC3b8GnCpuE2GFTffAm1MBgi0Urs8e3XGHsilVMqYdaCPZwq5ZKlzivX5wZQH9yT9m9Db6XLL66ZIaBHt2w== rsa-key-20170906'
+#  oam_protected_net_name: MNS-25180-T-RDM6B_oam_protected_net_1
+#  oam_direct_net_name: MNS-25180-T-RDM6B_oam_direct_net_1
+#  cor_direct_net_name: MNS-25180-T-RDM6B_cor_direct_net_1
+#  ocgapp_oam_protected_ip_2: 107.112.163.96 
+#  ocgapp_oam_direct_ip_2: 107.112.168.140 
+#  ocgapp_cor_direct_ip_2: 107.242.64.60 
+#  ocgapp_cor_direct_v6_ip_2: 2606:ae00:2e20:1404::12 
+#  ocgapp_name_2: zrdm6bvocg01app003_REDESIGN
+#  availability_zone_1: rdm6b-kvm-az02
+#  ocgapp_shared_sec_grp_id: acd420c8-37a0-4493-9296-bab085e76f45 
+#  ocg_shared_server_grp_id: e1ac6d1c-32aa-43dc-b1e1-0c33e69167f9 
+  nameserver_ip: 135.214.16.119
+  eth1_ip_range: 130.4.128.0
+  eth1_netmask: 21
+  eth1_ip: 107.112.168.129
+  eth2_ip_range: 107.242.64.1
+  eth2_ip: 107.242.64.49
+  domain_name: eng.mobilephone.net
+#  ocgapp_volume_id_2: b6fc2fa2-a5a7-470d-b022-ad38f0b7de90 
+#  vnf_name: zrdm6bvocg01_REDESIGN
+#  vnf_id: 'dummy'
+#  vf_module_id: 'dummy'
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03.yaml
new file mode 100644 (file)
index 0000000..a4c88f8
--- /dev/null
@@ -0,0 +1,216 @@
+heat_template_version: 2015-04-30
+#file version 1.0
+description: OCG Apps template
+
+parameters:
+  ocgapp_image_name:
+    type: string
+    description: operative system image
+  ocgapp_flavor_name:
+    type: string
+    description: resources to be applied on instances
+  ocgapp_public_key:
+    type: string
+    description: creator's ssh public key
+  oam_protected_net_name:
+    type: string
+    description: OAM network where instances will connect
+  oam_direct_net_name:
+    type: string
+    description: OAM network where instances will connect
+  cor_direct_net_name:
+    type: string
+    description: COR_DIRECT network where instances will connect
+  ocgapp_oam_protected_ip_2:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_oam_direct_ip_2:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_cor_direct_ip_2:
+    type: string
+    description: OCG COR_DIRECT IP list
+  ocgapp_cor_direct_v6_ip_2:
+    type: string
+    description: fixed IP assignment for VM's on the COR_DIRECT network
+  ocgapp_name_2:
+    type: string
+    description: OCG VM server name list (there should be 2, since we have 2 app vms)
+  availability_zone_1:
+    type: string
+    description: availability zone 2 ID or name
+  ocg_shared_server_grp_id:
+    type: string
+    description: OCG anti-affinity server group
+  ocgapp_shared_sec_grp_id:
+    type: string
+    description: security group
+  ocgapp_volume_id_2:
+    type: string
+    description: Unique IDs for volumes
+  vnf_name:
+    type: string
+    description: Unique name for this VF instance
+  vnf_id:
+    type: string
+    description: Unique ID for this VF instance
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module instance
+  nameserver_ip:
+    type: string
+    description: nameserver
+  eth1_ip_range:
+    type: string 
+    description: range
+  eth1_netmask:
+    type: string
+    description: mask length 
+  eth1_ip:
+    type: string
+    description: address
+  eth2_ip_range: 
+    type: string
+    description: range
+  eth2_ip: 
+    type: string
+    description: address 
+  domain_name:
+    type: string
+    description: address
+
+resources:
+
+  vm_config_2:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: {get_file: ocgapp_nested_0.txt}
+          params:
+            $ocg_hostname: { get_param: ocgapp_name_2 }
+            $ocg_hostip: { get_param: ocgapp_oam_protected_ip_2 }
+            $volume_id: {get_param: ocgapp_volume_id_2 }
+            
+  ocgapp_admin_key:
+    type: OS::Nova::KeyPair
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_STACK_NAME_key_pair
+          params:
+              VNF_NAME: {get_param: vnf_name}
+              STACK_NAME: {get_param: 'OS::stack_name'}
+      public_key: {get_param: ocgapp_public_key}
+      save_private_key: false
+
+  ocgapp_config_2:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+        - config: {get_resource: vm_config_2}
+      
+# APP_SERVER_2
+  ocgapp_oam_protected_port_2:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_protected_port_2
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_protected_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_protected_ips, 0]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_protected_ip_2}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+      
+  ocgapp_oam_direct_port_2:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_direct_port_2
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_direct_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_direct_ips, 0]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_direct_ip_2}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+      
+  ocgapp_cor_direct_port_2:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_cor_port_2
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: cor_direct_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_cor_direct_ips, 0]}}, {"ip_address": {get_param: [ocgapp_cor_direct_v6_ips, 0]}}]
+      fixed_ips: [{"ip_address": {get_param: ocgapp_cor_direct_ip_2}}, {"ip_address": {get_param: ocgapp_cor_direct_v6_ip_2}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+
+  ocgapp_server_2:
+    type: OS::Nova::Server
+    properties:
+      key_name: {get_resource: ocgapp_admin_key}
+      name: {get_param: ocgapp_name_2}
+      image: {get_param: ocgapp_image_name}
+      flavor: {get_param: ocgapp_flavor_name}
+      availability_zone: {get_param: availability_zone_1}
+      scheduler_hints:
+          group: { get_param: ocg_shared_server_grp_id }
+      personality:
+      # Add resolv.conf file
+        "/etc/resolv.conf":
+          str_replace:
+            template: |
+              nameserver ${NAME_SERVER}
+              domain ${DOMAIN_NAME}
+            params:
+              ${NAME_SERVER}: {get_param: nameserver_ip}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add hostname file
+        "/etc/hostname":
+          str_replace:
+            template: |
+              ${NAME}.${DOMAIN_NAME}
+            params:
+              ${NAME}: {get_param: ocgapp_name_2}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add route-eth1 file
+        "/etc/sysconfig/network-scripts/route-eth1":
+          str_replace:
+            template: |
+              ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+            params:
+              ${ETH1_IP_RANGE}: {get_param: eth1_ip_range}
+              ${ETH1_NETMASK}: {get_param: eth1_netmask}
+              ${ETH1_IP}: {get_param: eth1_ip}
+      # Add route-eth2 file
+        "/etc/sysconfig/network-scripts/route-eth2":
+          str_replace:
+            template: |
+              ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+            params:
+              ${ETH2_IP_RANGE}: {get_param: eth2_ip_range}
+#              ${ETH2_NETMASK}: {get_param: eth2_netmask}
+              ${ETH2_IP}: {get_param: eth2_ip}
+      networks:
+        - port: {get_resource: ocgapp_oam_protected_port_2}
+        - port: {get_resource: ocgapp_oam_direct_port_2}
+        - port: {get_resource: ocgapp_cor_direct_port_2}
+      metadata:
+        vnf_id: {get_param: vnf_id}
+        vf_module_id: {get_param: vf_module_id}
+        vnf_name: {get_param: vnf_name}
+      user_data_format: RAW
+      user_data: {get_resource: ocgapp_config_2}      
+
+  ocgapp_volume_attachment_2:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: ocgapp_volume_id_2}
+      instance_uuid: {get_resource: ocgapp_server_2}
+
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03_volume.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03_volume.env
new file mode 100644 (file)
index 0000000..35f1428
--- /dev/null
@@ -0,0 +1,5 @@
+#file version 1.0
+parameters:
+  vnf_name: 'zrdm5avocg01'
+  ocgapp_volume_size_2: 400
+  ocgapp_volume_type_2: SF-Default-SSD
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03_volume.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_03_volume.yaml
new file mode 100644 (file)
index 0000000..f67551f
--- /dev/null
@@ -0,0 +1,35 @@
+heat_template_version: 2015-04-30
+#file version 2.3
+parameters:
+  vnf_name:
+    type: string
+    label: OCG VNF Name
+    description: OCG VNF Name
+  ocgapp_volume_size_2:
+    type: number
+    label: Cinder volume size
+    description: the size of the Cinder volume
+    constraints:
+      - range: { min: 100, max: 400 }
+  ocgapp_volume_type_2:
+    type: string
+    label: vm volume type
+    description: the name of the target volume backend for ocgapp1
+resources:
+  ocgapp_volume_2:
+    type: OS::Cinder::Volume
+    properties:
+      size: {get_param: ocgapp_volume_size_2 }
+      volume_type: {get_param: ocgapp_volume_type_2}
+      name:
+        str_replace:
+          template: VF_NAME_STACK_NAME_volume_2
+          params:
+            VF_NAME: { get_param: vnf_name }
+            STACK_NAME: { get_param: 'OS::stack_name' }
+
+outputs:
+  ocgapp_volume_id_2:
+    description: the ocgapp volume id 2
+    value: { get_resource: ocgapp_volume_2 }
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04.env
new file mode 100644 (file)
index 0000000..fe83f2d
--- /dev/null
@@ -0,0 +1,27 @@
+#file version 1.0
+parameters:
+  ocgapp_image_name: NIMBUS_OCG-APPLICATION_20180328.qcow2
+  ocgapp_flavor_name: nv.c8r32d320
+  ocgapp_public_key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAh5B/f9JmJL5HcIJT+XeGnE9Jlv22NYGweMx+M2eX53X0sxdB8onhqDiLFODgDgXUuQk11NM2tQeA+xH+nlZxdETK+5uKb2SLwsPjZnxHQPrGQP1KKAZi9aKoZFjYmWrYuqzQFT9QRz3gehG+pX82mzMkkE/Da2/XJ62zu8PKfapn63MhhmxG5w5onuN2XsM2zfI6GILFM56ppLtMCkgvzXVcWOpr7pD4kpnC9WavxwAkmQPrWIbTi0MKIEeuON0B+KRgC3b8GnCpuE2GFTffAm1MBgi0Urs8e3XGHsilVMqYdaCPZwq5ZKlzivX5wZQH9yT9m9Db6XLL66ZIaBHt2w== rsa-key-20170906'
+#  oam_protected_net_name: MNS-25180-T-RDM6B_oam_protected_net_1
+#  oam_direct_net_name: MNS-25180-T-RDM6B_oam_direct_net_1
+#  cor_direct_net_name: MNS-25180-T-RDM6B_cor_direct_net_1
+#  ocgapp_oam_protected_ip_3: 107.112.163.97 
+#  ocgapp_oam_direct_ip_3: 107.112.168.141 
+#  ocgapp_cor_direct_ip_3: 107.242.64.61 
+#  ocgapp_cor_direct_v6_ip_3: 2606:ae00:2e20:1404::13 
+#  ocgapp_name_3: zrdm6bvocg01app004_REDESIGN
+#  availability_zone_1: rdm6b-kvm-az02
+#  ocgapp_shared_sec_grp_id: acd420c8-37a0-4493-9296-bab085e76f45 
+#  ocg_shared_server_grp_id: e1ac6d1c-32aa-43dc-b1e1-0c33e69167f9 
+  nameserver_ip: 135.214.16.119
+  eth1_ip_range: 130.4.128.0
+  eth1_netmask: 21
+  eth1_ip: 107.112.168.129
+  eth2_ip_range: 107.242.64.1
+  eth2_ip: 107.242.64.49
+  domain_name: eng.mobilephone.net
+#  ocgapp_volume_id_3: 85eeae51-8115-49ac-837e-e0079860f330
+#  vnf_name: zrdm6bvocg01_REDESIGN
+#  vnf_id: 'dummy'
+#  vf_module_id: 'dummy'
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04.yaml
new file mode 100644 (file)
index 0000000..aeb9fe9
--- /dev/null
@@ -0,0 +1,215 @@
+heat_template_version: 2015-04-30
+#file version 1.0
+description: OCG Apps template
+
+parameters:
+  ocgapp_image_name:
+    type: string
+    description: operative system image
+  ocgapp_flavor_name:
+    type: string
+    description: resources to be applied on instances
+  ocgapp_public_key:
+    type: string
+    description: creator's ssh public key
+  oam_protected_net_name:
+    type: string
+    description: OAM network where instances will connect
+  oam_direct_net_name:
+    type: string
+    description: OAM network where instances will connect
+  cor_direct_net_name:
+    type: string
+    description: COR_DIRECT network where instances will connect
+  ocgapp_oam_protected_ip_3:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_oam_direct_ip_3:
+    type: string
+    description: OCG OAM IP list
+  ocgapp_cor_direct_ip_3:
+    type: string
+    description: OCG COR_DIRECT IP list
+  ocgapp_cor_direct_v6_ip_3:
+    type: string
+    description: fixed IP assignment for VM's on the COR_DIRECT network
+  ocgapp_name_3:
+    type: string
+    description: OCG VM server name list (there should be 2, since we have 2 app vms)
+  availability_zone_1:
+    type: string
+    description: availability zone 2 ID or name
+  ocg_shared_server_grp_id:
+    type: string
+    description: OCG anti-affinity server group
+  ocgapp_shared_sec_grp_id:
+    type: string
+    description: security group
+  ocgapp_volume_id_3:
+    type: string 
+    description: Unique IDs for volumes
+  vnf_name:
+    type: string
+    description: Unique name for this VF instance
+  vnf_id:
+    type: string
+    description: Unique ID for this VF instance
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module instance
+  nameserver_ip:
+    type: string
+    description: nameserver
+  eth1_ip_range:
+    type: string 
+    description: range
+  eth1_netmask:
+    type: string
+    description: mask length 
+  eth1_ip:
+    type: string
+    description: address
+  eth2_ip_range: 
+    type: string
+    description: range
+  eth2_ip: 
+    type: string
+    description: address 
+  domain_name:
+    type: string
+    description: address
+
+resources:
+            
+  vm_config_3:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: {get_file: ocgapp_nested_0.txt}
+          params:
+            $ocg_hostname: { get_param: ocgapp_name_3 }
+            $ocg_hostip: { get_param: ocgapp_oam_protected_ip_3 }
+            $volume_id: {get_param: ocgapp_volume_id_3 }
+            
+  ocgapp_admin_key:
+    type: OS::Nova::KeyPair
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_STACK_NAME_key_pair
+          params:
+              VNF_NAME: {get_param: vnf_name}
+              STACK_NAME: {get_param: 'OS::stack_name'}
+      public_key: {get_param: ocgapp_public_key}
+      save_private_key: false
+
+  ocgapp_config_3:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+        - config: {get_resource: vm_config_3}
+        
+# APP_SERVER_3
+  ocgapp_oam_protected_port_3:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_protected_port_3
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_protected_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_protected_ips, 3]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_protected_ip_3}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+
+  ocgapp_oam_direct_port_3:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_oam_direct_port_3
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_direct_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_oam_direct_ips, 3]}}]
+      fixed_ips: [{ "ip_address": {get_param: ocgapp_oam_direct_ip_3}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+      
+  ocgapp_cor_direct_port_3:
+    type: OS::Neutron::Port
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_ocgapp_cor_port_3
+          params:
+            VNF_NAME: {get_param: vnf_name}
+      network: {get_param: cor_direct_net_name}
+#      fixed_ips: [{"ip_address": {get_param: [ocgapp_cor_direct_ips, 3]}}, {"ip_address": {get_param: [ocgapp_cor_direct_v6_ips, 3]}}]
+      fixed_ips: [{"ip_address": {get_param: ocgapp_cor_direct_ip_3}}, {"ip_address": {get_param: ocgapp_cor_direct_v6_ip_3}}]
+      security_groups: [{get_param: ocgapp_shared_sec_grp_id}]
+
+  ocgapp_server_3:
+    type: OS::Nova::Server
+    properties:
+      key_name: {get_resource: ocgapp_admin_key}
+      name: {get_param: [ocgapp_name_3]}
+      image: {get_param: ocgapp_image_name}
+      flavor: {get_param: ocgapp_flavor_name}
+      availability_zone: {get_param: availability_zone_1}
+      scheduler_hints:
+          group: { get_param: ocg_shared_server_grp_id }
+      personality:
+      # Add resolv.conf file
+        "/etc/resolv.conf":
+          str_replace:
+            template: |
+              nameserver ${NAME_SERVER}
+              domain ${DOMAIN_NAME}
+            params:
+              ${NAME_SERVER}: {get_param: nameserver_ip}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add hostname file
+        "/etc/hostname":
+          str_replace:
+            template: |
+              ${NAME}.${DOMAIN_NAME}
+            params:
+              ${NAME}: {get_param: ocgapp_name_3}
+              ${DOMAIN_NAME}: {get_param: domain_name}
+      # Add route-eth1 file
+        "/etc/sysconfig/network-scripts/route-eth1":
+          str_replace:
+            template: |
+              ${ETH1_IP_RANGE}/${ETH1_NETMASK} via ${ETH1_IP} dev eth1
+            params:
+              ${ETH1_IP_RANGE}: {get_param: eth1_ip_range}
+              ${ETH1_NETMASK}: {get_param: eth1_netmask}
+              ${ETH1_IP}: {get_param: eth1_ip}
+      # Add route-eth2 file
+        "/etc/sysconfig/network-scripts/route-eth2":
+          str_replace:
+            template: |
+              ${ETH2_IP_RANGE} via ${ETH2_IP} dev eth2
+            params:
+              ${ETH2_IP_RANGE}: {get_param: eth2_ip_range}
+#              ${ETH2_NETMASK}: {get_param: eth2_netmask}
+              ${ETH2_IP}: {get_param: eth2_ip}
+      networks:
+        - port: {get_resource: ocgapp_oam_protected_port_3}
+        - port: {get_resource: ocgapp_oam_direct_port_3}
+        - port: {get_resource: ocgapp_cor_direct_port_3}
+      metadata:
+        vnf_id: {get_param: vnf_id}
+        vf_module_id: {get_param: vf_module_id}
+        vnf_name: {get_param: vnf_name}
+      user_data_format: RAW
+      user_data: {get_resource: ocgapp_config_3}
+
+  ocgapp_volume_attachment_3:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: ocgapp_volume_id_3}
+      instance_uuid: {get_resource: ocgapp_server_3}
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04_volume.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04_volume.env
new file mode 100644 (file)
index 0000000..983d5d2
--- /dev/null
@@ -0,0 +1,5 @@
+#file version 1.0
+parameters:
+  vnf_name: 'zrdm5avocg01'
+  ocgapp_volume_size_3: 400
+  ocgapp_volume_type_3: SF-Default-SSD
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04_volume.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_04_volume.yaml
new file mode 100644 (file)
index 0000000..2419c18
--- /dev/null
@@ -0,0 +1,35 @@
+heat_template_version: 2015-04-30
+#file version 2.3
+parameters:
+  vnf_name:
+    type: string
+    label: OCG VNF Name
+    description: OCG VNF Name
+  ocgapp_volume_size_3:
+    type: number
+    label: Cinder volume size
+    description: the size of the Cinder volume
+    constraints:
+      - range: { min: 100, max: 400 }
+  ocgapp_volume_type_3:
+    type: string
+    label: vm volume type
+    description: the name of the target volume backend for ocgapp1
+resources:
+  ocgapp_volume_3:
+    type: OS::Cinder::Volume
+    properties:
+      size: {get_param: ocgapp_volume_size_3 }
+      volume_type: {get_param: ocgapp_volume_type_3}
+      name:
+        str_replace:
+          template: VF_NAME_STACK_NAME_volume_3
+          params:
+            VF_NAME: { get_param: vnf_name }
+            STACK_NAME: { get_param: 'OS::stack_name' }
+
+outputs:
+  ocgapp_volume_id_3:
+    description: the ocgapp volume id 3
+    value: { get_resource: ocgapp_volume_3 }
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_nested_0.txt b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgapp_nested_0.txt
new file mode 100644 (file)
index 0000000..57ab985
--- /dev/null
@@ -0,0 +1,19 @@
+#cloud-config
+
+runcmd:
+   
+  # Allow for host resolution - With proper DNS in place, this is not needed
+  - echo "$ocg_hostip $ocg_hostname" >> /etc/hosts
+  
+  ##########################
+  # Cinder Volume Mounting
+  ##########################
+  - sudo su - root
+  - voldata_id="$volume_id"
+  - voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id} | cut -c -20)"
+  - mkfs.ext4 ${voldata_dev}
+  - sudo mkdir -pv /opt/ocg/data
+  - sudo chown -R fworks:fworks /opt/ocg/data
+  - echo "${voldata_dev} /opt/ocg/data ext4 defaults 1 2" >> /etc/fstab
+  - mount /opt/ocg/data
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr.env
new file mode 100644 (file)
index 0000000..501135a
--- /dev/null
@@ -0,0 +1,26 @@
+#file version 1.0
+parameters:
+  ocgmgr_image_name: 'vOCG_MGR_SNAP_20180130'
+  ocgmgr_flavor_name: nv.c8r32d320
+  java_home: /home/fworks/java/jdk1.8.0_112
+  ocg_user: fworks
+  ovlm_install_dir: /home/fworks/Installer/weaver
+  ocg_install_jar: /home/fworks/Installer/ocg10/installer.jar
+  ocg_install_properties: /tmp/ocg.install.properties
+  wim_install_file: /home/fworks/Installer/wim/ovlm-integration-module.sh
+  keycloak_rpm_name: keycloak-pkg-x86_64.rpm
+  ovlm_install_properties: /tmp/ovlm.install.properties
+#  ocgmgr_public_key: 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAh5B/f9JmJL5HcIJT+XeGnE9Jlv22NYGweMx+M2eX53X0sxdB8onhqDiLFODgDgXUuQk11NM2tQeA+xH+nlZxdETK+5uKb2SLwsPjZnxHQPrGQP1KKAZi9aKoZFjYmWrYuqzQFT9QRz3gehG+pX82mzMkkE/Da2/XJ62zu8PKfapn63MhhmxG5w5onuN2XsM2zfI6GILFM56ppLtMCkgvzXVcWOpr7pD4kpnC9WavxwAkmQPrWIbTi0MKIEeuON0B+KRgC3b8GnCpuE2GFTffAm1MBgi0Urs8e3XGHsilVMqYdaCPZwq5ZKlzivX5wZQH9yT9m9Db6XLL66ZIaBHt2w== rsa-key-20170906'
+#  oam_protected_net_name: MNS-25180-T-RDM6B_oam_protected_net_1
+#  ocgmgr_oam_protected_ips: 107.112.163.100,107.112.163.101
+#  ocgmgr_names: zrdm6bvocg01mgr001-ap,zrdm6bvocg01mgr002-ap
+#  availability_zone_0: rdm6b-kvm-az01 
+#  availability_zone_1: rdm6b-kvm-az02 
+#  ocgmgr_shared_sec_grp_id: ca86ec60-38b7-4d72-b1f6-423a4f0c4be9 
+#  ocgmgr_volume_ids: [
+#  "0848cea8-c9de-45e5-a047-472b778488fe", 
+#  "c089f811-5122-4273-80c1-e6f48034b0a5"
+#]
+#  vnf_name: zrdm6bvocg01_ap
+#  vnf_id: 'dummy'
+#  vf_module_id: 'dummy'
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr.yaml
new file mode 100644 (file)
index 0000000..7735817
--- /dev/null
@@ -0,0 +1,209 @@
+heat_template_version: 2015-04-30
+#file version 1.0
+description: OCG Managers template
+
+parameters:
+  ocgmgr_image_name:
+    type: string
+    description: operative system image
+  ocgmgr_flavor_name:
+    type: string
+    description: resources to be applied on instances
+  ocgmgr_public_key:
+    type: string
+    description: creator's ssh public key
+  oam_protected_net_name:
+    type: string
+    description: OAM network where instances will connect
+  ocgmgr_oam_protected_ips:
+    type: comma_delimited_list
+    description: OCG OAM IP list
+  ocgmgr_names:
+    type: comma_delimited_list
+    description: OCG MGR VM names list (should be 2, since we have 2 MGR VMs)
+  availability_zone_0:
+    type: string
+    description: availability zone 0 ID or name
+  availability_zone_1:
+    type: string
+    description: availability zone 1 ID or name
+  ocgmgr_shared_sec_grp_id:
+    type: string
+    description: security group
+  ocgmgr_volume_ids:
+    type: json
+    description: Unique IDs for volumes
+  vnf_name:
+    type: string
+    description: Unique name for this VF instance
+  vnf_id:
+    type: string
+    description: Unique ID for this VF instance
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF module instance
+  java_home:
+    type: string
+    description: java home    
+  ocg_user:
+    type: string
+    description: user to install ocg    
+  ocg_install_jar:
+    type: string
+    description: location of ocg installer    
+  ocg_install_properties:
+    type: string
+    description: location of ocg install properties    
+  wim_install_file:
+    type: string
+    description: WIM Install File location    
+  ovlm_install_dir:
+    type: string
+    description: Location of the ovlm-install dir    
+  keycloak_rpm_name:
+    type: string
+    description: keycloak rpm name    
+  ovlm_install_properties:
+    type: string
+    description: ovlm install properties    
+resources:
+  vm_config_0:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: {get_file: ocgmgr_nested_0.txt}
+#      resource_def:
+#        type: ocgmgr_nested.yaml
+          params:
+            $java_home: { get_param: java_home }
+            $ocg_user: { get_param: ocg_user }
+            $ocg_install_jar: { get_param: ocg_install_jar }
+            $ocg_install_properties: { get_param: ocg_install_properties }
+            $ocg_hostname: { get_param: [ocgmgr_names, 0]}
+            $ocg_hostip: { get_param: [ocgmgr_oam_protected_ips, 0]}
+            $wim_install_file: { get_param: wim_install_file }
+            $ovlm_install_properties: { get_param: ovlm_install_properties }
+            $ovlm_hostname:  {get_param: [ocgmgr_names, 0]}
+            $ovlm_mgr002_hostname:  {get_param: [ocgmgr_names, 1]}
+            $ovlm_install_dir: {get_param: ovlm_install_dir}
+            $keycloak_rpm_name: {get_param: keycloak_rpm_name}
+            $volume_id: {get_param: [ocgmgr_volume_ids, 0]}
+
+  vm_config_1:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: {get_file: ocgmgr_nested_1.txt}
+          params:
+            $ocg_hostname: { get_param: [ocgmgr_names, 1]}
+            $ocg_hostip: { get_param: [ocgmgr_oam_protected_ips, 1]}
+            $volume_id: {get_param: [ocgmgr_volume_ids, 1]}
+
+  ocgmgr_admin_key:
+    type: OS::Nova::KeyPair
+    properties:
+      name:
+        str_replace:
+          template: VNF_NAME_STACK_NAME_key_pair
+          params:
+              VNF_NAME: {get_param: vnf_name}
+              STACK_NAME: {get_param: 'OS::stack_name'}
+      public_key: {get_param: ocgmgr_public_key}
+      save_private_key: false
+
+  ocgmgr_oam_protected_0_port:
+    type: OS::Neutron::Port
+    properties:
+      name:
+          str_replace:
+            template: VNF_NAME_ocgmgr_oam_port_0
+            params:
+                VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_protected_net_name}
+      fixed_ips: [{"ip_address": {get_param: [ocgmgr_oam_protected_ips, 0]}}]
+      security_groups: [{get_param: ocgmgr_shared_sec_grp_id}]
+  
+  ocgmgr_config_0:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+        - config: {get_resource: vm_config_0}
+
+  ocgmgr_config_1:
+    type: OS::Heat::MultipartMime
+    properties:
+      parts:
+        - config: {get_resource: vm_config_1}
+
+  ocgmgr_server_0:
+    type: OS::Nova::Server
+    properties:
+      key_name: {get_resource: ocgmgr_admin_key}
+      name: {get_param: [ocgmgr_names, 0]}
+      image: {get_param: ocgmgr_image_name}
+      flavor: {get_param: ocgmgr_flavor_name}
+      availability_zone: {get_param: availability_zone_0}
+      networks:
+        - port: {get_resource: ocgmgr_oam_protected_0_port}
+      metadata:
+        vnf_id: {get_param: vnf_id}
+        vf_module_id: {get_param: vf_module_id}
+        vnf_name: {get_param: vnf_name}
+      user_data_format: SOFTWARE_CONFIG
+      user_data: {get_resource: ocgmgr_config_0}
+      #user_data: {get_resource: server_interface_config}
+
+  ocgmgr_oam_protected_1_port:
+    type: OS::Neutron::Port
+    properties:
+      name:
+          str_replace:
+            template: VNF_NAME_ocgmgr_oam_port_1
+            params:
+                VNF_NAME: {get_param: vnf_name}
+      network: {get_param: oam_protected_net_name}
+      fixed_ips: [{"ip_address": {get_param: [ocgmgr_oam_protected_ips, 1]}}]
+      security_groups: [{get_param: ocgmgr_shared_sec_grp_id}]
+
+  ocgmgr_server_1:
+    type: OS::Nova::Server
+    properties:
+      key_name: {get_resource: ocgmgr_admin_key}
+      name: {get_param: [ocgmgr_names, 1]}
+      image: {get_param: ocgmgr_image_name}
+      flavor: {get_param: ocgmgr_flavor_name}
+      availability_zone: {get_param: availability_zone_1}
+      networks:
+        - port: {get_resource: ocgmgr_oam_protected_1_port}
+      metadata:
+        vnf_id: {get_param: vnf_id}
+        vf_module_id: {get_param: vf_module_id}
+        vnf_name: {get_param: vnf_name}
+      user_data_format: RAW
+      user_data: {get_resource: ocgmgr_config_1}
+      #user_data: {get_resource: server_interface_config}
+
+  ocgmgr_volume_attachment_0:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: [ocgmgr_volume_ids, 0]}
+      instance_uuid: {get_resource: ocgmgr_server_0}
+
+  ocgmgr_volume_attachment_1:
+    type: OS::Cinder::VolumeAttachment
+    properties:
+      volume_id: {get_param: [ocgmgr_volume_ids, 1]}
+      instance_uuid: {get_resource: ocgmgr_server_1}
+
+  #server_interface_config:
+  #  type: OS::Heat::CloudConfig
+  #  properties:
+  #    cloud_config:
+  #      write_files:
+  #        - path: /etc/sysconfig/network-scripts/route-eth0
+  #          permissions: "0644"
+  #          content: { get_param: dns_route_eth0 }
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_0.txt b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_0.txt
new file mode 100644 (file)
index 0000000..7100bb7
--- /dev/null
@@ -0,0 +1,411 @@
+#cloud-config
+
+write_files:
+  - path: /tmp/ocg-bashrc   
+    content: |
+      export JAVA_HOME=$java_home
+      export FUSIONWORKS_HOME=/home/$ocg_user/ocg10/fwhome
+      export FUSIONWORKS_PROD=/home/$ocg_user/ocg10/fwprod
+      export PATH=$PATH:$JAVA_HOME/bin:$FUSIONWORKS_PROD/bin:$FUSIONWORKS_HOME:$FUSIONWORKS_PROD:$HOME:.
+      export OVLMCM_BASEURL=https://$ovlm_hostname:28010
+      export OVLMFE_BASEURL=https://$ovlm_hostname:28050
+      export OVLMDM_BASEURL=https://$ovlm_hostname:28130
+      export OVLMFA_BASEURL=https://$ovlm_hostname:28800
+      export baseurl=https://localhost:28050  
+      export OVLM_INTEGRATION_HOME=/home/$ocg_user/ovlm-integration-module
+      export OVLMFE_VERIFY_SERVER_CERTIFICATE=yes
+      export OVLMFE_CA_BUNDLE_PATH=~/weaver_install/ovlm-install/certs/ca_bundle
+      export OVLMCM_VERIFY_SERVER_CERTIFICATE=yes
+      export OVLMCM_CA_BUNDLE_PATH=~/weaver_install/ovlm-install/certs/ca_bundle
+      export OVLMDM_VERIFY_SERVER_CERTIFICATE=yes
+      export OVLMDM_CA_BUNDLE_PATH=~/weaver_install/ovlm-install/certs/ca_bundle
+      export OVLMFA_VERIFY_SERVER_CERTIFICATE=yes
+      export OVLMFA_CA_BUNDLE_PATH=~/weaver_install/ovlm-install/certs/ca_bundle
+
+  - path: /tmp/keycloak-bashrc
+    content: |
+      export JBOSS_HOME=/home/$ocg_user/keycloak
+      export JAVA_HOME=$java_home
+      export PATH=$PATH:$JAVA_HOME/bin
+  - path: /tmp/keycloak-setup.sh
+    permissions: '0755'
+    content: |
+      cp -f /tmp/keycloak.conf /home/$ocg_user/keycloak/etc/keycloak.conf
+      cp -f /tmp/keycloak.properties /home/$ocg_user/keycloak/etc/keycloak.properties
+      sed -i -e 's/<server name="default-server">/&      <https-listener name="https" socket-binding="https" security-realm="UndertowRealm"\/>/' /home/$ocg_user/keycloak/etc/standalone/standalone.xml
+      sed -i -e 's/127.0.0.1/$ovlm_hostname/' /home/$ocg_user/keycloak/etc/standalone/standalone.xml
+      sed -i -e 's/8080/8090/' /home/$ocg_user/keycloak/etc/standalone/standalone.xml
+      sed -i -e 's/8443/9443/' /home/$ocg_user/keycloak/etc/standalone/standalone.xml
+      sed -i -e "s/<security-realms>/&\
+        <security-realm name=\"UndertowRealm\">\
+            <server-identities>\
+                <ssl>\
+        <keystore path=\"keycloak.jks\" relative-to=\"jboss.server.config.dir\" keystore-password=\"password\" \/>\
+                <\/ssl>\
+            <\/server-identities>\
+        <\/security-realm>/"  /home/$ocg_user/keycloak/etc/standalone/standalone.xml
+  - path: /tmp/keycloak.conf
+    content: |
+      KEYCLOAK_MODE=standalone
+      KEYCLOAK_BIND=0.0.0.0
+      JAVA_HOME=$java_home
+      KEYCLOAK_JAVA_OPTS="\
+              -Djava.net.preferIPv4Stack=true \
+              -Djava.awt.headless=true \
+              -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m"
+      KEYCLOAK_SERVER_OPTS="--properties=/home/$ocg_user/keycloak/etc/keycloak.properties"
+      JBOSS_LOG_DIR=/home/$ocg_user/keycloak/log/standalone
+      JBOSS_CONFIG_DIR=/home/$ocg_user/keycloak/etc/standalone
+      JBOSS_HOME=/home/$ocg_user/keycloak
+  - path: /tmp/keycloak.properties
+    content: |
+      jboss.http.port=8090
+      jboss.https.port=9443
+      jboss.management.http.port=9990
+      jboss.management.https.port=9993
+      jboss.server.data.dir=/home/$ocg_user/keycloak/var/standalone
+  - path: $ocg_install_properties
+    content: |
+      InstallationId=OCG_MASTER
+      TimeZone=America/New_York
+        
+      # Directories where the binaries and configuration will be stored
+      # If the specified directories exist then their content will be deleted.
+      FusionWorksHomeDirectory=/home/$ocg_user/ocg10/fwhome
+      FusionWorksProductDirectory=/home/$ocg_user/ocg10/fwprod
+      ConfigPort=25000
+      ConfigHost=$ocg_hostname
+      EventPort=25010
+      EventHost=$ocg_hostname
+      SNMPAgentPort=25020
+      MediationServerDatabasePort=25030
+        
+      JBOSSHost=$ocg_hostname
+      JBOSSHttpPort=25041
+      JBOSSHttpsPort=25042
+      JBOSSRemotePort=25043
+      JBOSSPortBase=25050
+      JAVA_HOME=$java_home
+        
+      # addons FW install.properties.template install.properties.template.1 install.properties.template.2 install.properties.template.dup.props install.properties.template.sorted install.properties.template.sorted.uniq java share xml
+      # Do not change these values
+      DatabaseUserName=OCG
+      DatabasePassword=OCG
+        
+      # Enable SSL (https) access to the OAM and Policy Manager web applications.
+      # Choices are: OFF, ON
+      EnableWebSsl=
+      # Security option choices are: ON, OFF
+      SecurityOption=
+
+  - path: $ovlm_install_properties
+    content: |
+      protocol: https
+      https_configuration:
+        server:
+          keystore_path: key_store.jks
+          keystore_password: password
+          key_password: password
+        client:
+          verify_server_certificate: true
+          truststore_path: trust_store.jks
+      service_owner:
+        user: ovlm
+        user_group: ovlm
+        ssh_user: ovlmrsync
+      log_rotation:
+        interval: monthly
+        max_file_size: 5000000
+      installer:
+        ssh_bin: /usr/bin/ssh
+        rsync_bin: /usr/bin/rsync
+        ssh_options: ''
+      installation_directories:
+        path_bin: /opt/weaver_home/bin/
+        path_cfg: /opt/weaver_home/etc/
+        path_run: /opt/weaver_home/run/
+      snmp:
+        manager: $ovlm_hostname
+        community: public
+      deployment_manager:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 28130
+          spring:
+            datasource:
+              username: dm
+              password: dm
+          logging:
+            file: /opt/ocg/data/weaver_home/ovlm-dm.log
+      workflow_engine:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 8099
+          logging:
+            path: /opt/ocg/data/weaver_home/WF/
+      vnfm_gui:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 28200
+          logging:
+            file: /opt/ocg/data/weaver_home/ovlm-vnfm.log
+      frontend:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 28050
+          logging:
+            file: /opt/ocg/data/weaver_home/ovlm-fe.log
+      configuration_manager:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 28010
+          rsync_port: 28000
+          repository-root: /opt/ocg/data/weaver_home/repository-root
+          logging:
+            file: /opt/ocg/data/weaver_home/ovlm-cm.log
+      resource_manager:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 28020
+          logging:
+            file: /opt/ocg/data/weaver_home/ovlm-rm.log
+      resource_agent:
+        properties:
+          server:
+            port: 28030
+          sudo_privileges_required: true
+          sudo_privileges:
+          - /bin/postgresql-setup
+          - /bin/rpm
+          - /usr/bin/yum
+          - /bin/bash
+          - /bin/sudo *
+          - /usr/bin/sudo *
+          - /usr/bin/systemctl status *
+          - /usr/bin/systemctl start *
+          - /usr/bin/systemctl stop *
+          - /usr/bin/systemctl restart *
+          - /usr/bin/systemctl is-active *
+          - /usr/bin/systemctl daemon-reload
+          - /sbin/useradd
+          - /sbin/userdel
+          - /sbin/usermod
+          - /bin/mkdir
+          - /bin/rm
+          - /bin/rsync
+          - /usr/bin/rsync
+          - /bin/chown
+          - /bin/chmod
+          resource_agent:
+            metadata:
+              stage:
+                timeout: 100
+                parameters:
+                  rsync:
+                    timeout: 100
+                    bin: rsync
+          repository-root: /opt/ocg/data/weaver_home/repository-root
+          logging:
+            path: /opt/weaver_home/RA/
+      instance_inventory_manager:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 28120
+          logging:            
+            file: /opt/ocg/data/weaver_home/ovlm-iim.log
+      auth_server:
+        hosts:
+        - $ovlm_hostname
+        admin:
+            username: admin
+            password: Openet01
+        url: https://$ovlm_hostname:9443/auth
+        properties:
+          server:
+            port: 9443 
+      failover_agent:
+        hosts:
+        - $ovlm_hostname
+        properties:
+          server:
+            port: 28800
+          mode:
+            init_mode: active
+            remote_host: $ovlm_mgr002_hostname
+            remote_port: 28800
+            post_failover: 
+          rsync:
+            interval: 360
+            bin: /usr/bin/rsync
+            timeout: 100
+            location_list:
+            - destination: /tmp/ovlm_dm_failover_dbsync/
+              source:      /tmp/ovlm_dm_failover_dbsync/
+              pre:         /opt/weaver_home/bin/dm/failover/backup_dm_db.sh
+              complete:    /opt/weaver_home/bin/dm/failover/restore_dm_db.sh              
+            - destination: /opt/weaver_home/bin/dm/repository-root/
+              source:      /opt/weaver_home/bin/dm/repository-root/
+            - destination: /opt/weaver_home/repository-root/
+              source:      /opt/weaver_home/repository-root/
+            - destination: /opt/weaver_home/bin/iim/repository-root/
+              source:      /opt/weaver_home/bin/iim/repository-root/
+            - destination: /opt/weaver_home/etc/fe/meta/flow_mappings.yml
+              source:      /opt/weaver_home/etc/fe/meta/flow_mappings.yml
+            - destination: /tmp/ovlm_keycloak_backup.zip
+              source:  /tmp/ovlm_keycloak_backup.zip
+              pre:  sudo bash /home/fworks/keycloak/scripts/backup-db.sh /tmp/ovlm_keycloak_backup.zip
+              complete:  sudo bash /home/fworks/keycloak/scripts/restore-db.sh /tmp/ovlm_keycloak_backup.zip
+              post:
+            - destination: /home/fworks/ocg10/fwprod/
+              source: /home/fworks/ocg10/fwprod/
+              excludes: 
+              pre: sudo sudo -E /home/fworks/ocg10/fwprod/bin/siteReplication/ActiveSite_PreSync_hookpoint.sh $ocg_user /home/fworks/GeoReplication/datadir /home/fworks/GeoReplication/ActiveNode.env
+              post: sudo sudo -E /home/fworks/ocg10/fwprod/bin/siteReplication/ActiveSite_PostSync_hookpoint.sh $ocg_user /home/fworks/GeoReplication/datadir /home/fworks/GeoReplication/ActiveNode.env
+              complete: sudo sudo -E /home/fworks/ocg10/fwprod/bin/siteReplication/PassiveSite_CompleteSync_hookpoint.sh $ocg_user /home/fworks/GeoReplication/datadir /home/fworks/GeoReplication/ActiveNode.env 
+            - destination: /home/fworks/ocg10/fwhome/
+              source: /home/fworks/ocg10/fwhome/
+              excludes: 
+              pre: sudo sudo -E /home/fworks/ocg10/fwprod/bin/siteReplication/ActiveSite_PreSync_hookpoint.sh $ocg_user /home/fworks/GeoReplication/datadir /home/fworks/GeoReplication/ActiveNode.env
+              post: sudo sudo -E /home/fworks/ocg10/fwprod/bin/siteReplication/ActiveSite_PostSync_hookpoint.sh $ocg_user /home/fworks/GeoReplication/datadir /home/fworks/GeoReplication/ActiveNode.env
+              complete: sudo sudo -E /home/fworks/ocg10/fwprod/bin/siteReplication/PassiveSite_CompleteSync_hookpoint.sh $ocg_user /home/fworks/GeoReplication/datadir /home/fworks/GeoReplication/ActiveNode.env
+            - destination: /home/fworks/ovlm-integration-module/
+              source:      /home/fworks/ovlm-integration-module/
+          sudo_privileges_required: true
+          sudo_privileges:
+            - /bin/bash
+            - /bin/sudo *
+            - /usr/bin/sudo *
+            - /usr/bin/rsync
+            - /usr/bin/systemctl status *
+            - /usr/bin/systemctl start *
+            - /usr/bin/systemctl stop *
+            - /usr/bin/systemctl restart *
+            - /usr/bin/systemctl is-active *
+            - /usr/bin/systemctl daemon-reload
+          logging:
+            file: /opt/ocg/data/weaver_home/ovlm-fa.log
+runcmd:
+  - echo "alias l='ls -lrt'" >> /etc/bashrc
+  
+  # Allow for host resolution - With proper DNS in place, this is not needed
+  - echo "$ocg_hostip $ocg_hostname" >> /etc/hosts
+  
+  ##########################
+  # Cinder Volume Mounting
+  ##########################
+  - sudo su - root
+  - voldata_id="$volume_id"
+  - voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id} | cut -c -20)"
+  - mkfs.ext4 ${voldata_dev}
+  - sudo mkdir -pv /opt/ocg/data
+  - sudo chown -R fworks:fworks /opt/ocg/data
+  - echo "${voldata_dev} /opt/ocg/data ext4 defaults 1 2" >> /etc/fstab
+  - mount /opt/ocg/data
+
+  ##############
+  # OCG install
+  ##############
+  - echo "Installing ocg as user $ocg_user"
+  # Set up the ocg_user environment 
+  - su -s /bin/bash -l -c 'cat /tmp/ocg-bashrc >> ~/.bashrc' $ocg_user
+  - su -s /bin/bash -l -c 'cat /tmp/ocg-bashrc >> ~/.profile' $ocg_user
+  - su -s /bin/bash -l -c 'cd && java -jar $ocg_install_jar -install $ocg_install_properties' $ocg_user
+  - su -s /bin/bash -l -c 'cd && StartNameServ && StartMediationServer && StartJBossAppServer' $ocg_user
+  ##############
+  # WIM install
+  ##############
+  #- echo "Installing WIM as user $ocg_user"
+  - su -s /bin/bash -l -c 'cd && cp $wim_install_file .' $ocg_user
+  - su -s /bin/bash -l -c 'cd && ./ovlm-integration-module.sh' $ocg_user
+  ##############
+  # OVLM install
+  ##############
+  - echo "Installing ovlm as user $ocg_user"
+  # Need to set up password-less ssh for ocg_user so that ovlm-deploy will succeed
+  - su -s /bin/bash -l -c  'ssh-keygen -f ~/.ssh/id_rsa -t rsa -N "" ' $ocg_user
+  - su -s /bin/bash -l -c  'cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys' $ocg_user
+  # Allow sudo on non-tty login for ovlm-install user
+  - echo "Defaults:$ocg_user !requiretty" >> /etc/sudoers
+  # Create directory and Expand the install media
+  - su -s /bin/bash -l -c  'cd && mkdir weaver_install' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install && cp $ovlm_install_dir/ovlm-core-install-enterprise.tar .' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install && cp $ovlm_install_dir/ovlm-thirdparty-dependencies.tar .' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install && tar xvf $ovlm_install_dir/ovlm-core-install-enterprise.tar' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install && cp $ovlm_install_dir/ovlm-client.sh .' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install && tar xvf $ovlm_install_dir/ovlm-thirdparty-dependencies.tar' $ocg_user
+  # Create certs 
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install && mkdir -p certs' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install/certs && echo "subjectAltName=DNS:$ovlm_hostname,DNS:$ovlm_mgr002_hostname" > extFile' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install/certs && openssl genrsa -out server.key 2048' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install/certs && openssl req -new -out server.csr -key server.key -subj "/C=US/L=Atlanta/O=DigiCert/CN=*.novalocal"' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install/certs && openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt -extfile extFile' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install/certs && cp server.crt ca_bundle' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install/certs && openssl pkcs12 -export -name weaver -in server.crt -inkey server.key -out server.p12 -passout pass:password' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install/certs && $java_home/bin/keytool -importkeystore -destkeystore keycloak.jks -srckeystore server.p12 -srcstoretype pkcs12  -alias weaver -srcstorepass password -noprompt -deststorepass password -deststoretype JKS -destalias weaver' $ocg_user
+  # Configure and Install keycloak
+  #- cd ~/ovlm-install && rpm -ivh rpms/$keycloak_rpm_name
+  - su -s /bin/bash -l -c 'cat /tmp/keycloak-bashrc >> ~/.profile' $ocg_user
+  - su -s /bin/bash -l -c 'cat /tmp/keycloak-bashrc >> ~/.bashrc' $ocg_user
+  - export KEYCLOAK_USER=$ocg_user;export KEYCLOAK_USER_GROUP=$ocg_user; sudo -E rpm -ivh --relocate /opt/keycloak=/home/$ocg_user/keycloak --relocate /etc/keycloak=/home/$ocg_user/keycloak/etc --relocate /var/log/keycloak=/home/$ocg_user/keycloak/log --relocate /var/run/keycloak=/home/$ocg_user/keycloak/run --relocate /var/opt/keycloak=/home/$ocg_user/keycloak/var /home/$ocg_user/weaver_install/ovlm-install/rpms/keycloak-pkg-x86_64.rpm
+  # setup keycloak
+  - su -s /bin/bash -l -c '/tmp/keycloak-setup.sh' $ocg_user
+  # copy keystore file
+  - su -s /bin/bash -l -c 'cp /home/$ocg_user/weaver_install/ovlm-install/certs/keycloak.jks /home/$ocg_user/keycloak/etc/standalone/.' $ocg_user
+  # Config admin user
+  - su -s /bin/bash -l -c '/home/$ocg_user/keycloak/bin/add-user-keycloak.sh -u admin -p Openet01' $ocg_user
+  # Enable keycloak daemon
+  - systemctl enable keycloak
+  # Start keycloak service
+  - systemctl restart keycloak
+  # Set up the config file and do the weaver install
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install && cp $ovlm_install_properties ./ovlm-install.yml' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install && ./utilities/cipher/encrypt_scripts/encrypt-password.sh -f ./ovlm-install.yml' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install/ovlm-install && ./ovlm-deploy.sh -i ovlm-install.yml -u $ocg_user' $ocg_user
+  - su -s /bin/bash -l -c  'cd ~/weaver_install && sudo bash ovlm-client.sh' $ocg_user
+  
+  # Configure keycloak user for Weaver realm
+  - su -s /bin/bash -l -c '/home/$ocg_user/keycloak/bin/add-user-keycloak.sh -u weaver -p Openet01 -r weaver' $ocg_user
+  # Restart service
+  - systemctl restart keycloak
+
+  # Steps for weaver.profile
+  - su -s /bin/bash -l -c 'cd && cp ~/weaver_install/ovlm-install/weaver.profile .' $ocg_user
+  - su -s /bin/bash -l -c 'cd && source weaver.profile' $ocg_user
+  - su -s /bin/bash -l -c 'echo "source weaver.profile" >> ~/.profile' $ocg_user
+  - su -s /bin/bash -l -c 'echo "eval \$(on-auth-client -u weaver -p Openet01 --ca_bundle_path /home/fworks/weaver_install/ovlm-install/certs/ca_bundle)" >> ~/.profile' $ocg_user
+
+  # Step to prepare the upload the files
+  - su -s /bin/bash -l -c 'cd && . ~/.profile && cd ~/weaver_install/ovlm-install && ./ovlm-dm-util.sh prepare upload_files' $ocg_user
+  
+  # Step to upload the resource agent related binary file into deployment manager
+  - su -s /bin/bash -l -c 'cd && . ~/.profile && cd ~/weaver_install/ovlm-install && ovlm-dm artifact upload -f /home/fworks/weaver_install/ovlm-install/artifact/ovlm-install.tar.gz' $ocg_user
+
+  # Step to upload related configuration files into deployment manager
+  - su -s /bin/bash -l -c 'cd && . ~/.profile && cd ~/weaver_install/ovlm-install && ovlm-dm configuration create -i ovlm-install.yml -u $ocg_user -secure_stage_traffic false  -s /home/fworks/weaver_install/ovlm-install/artifact/ssh-keys.tar.gz -c /home/fworks/weaver_install/ovlm-install/artifact/certs.tar.gz -k ~/.ssh/id_rsa -e /home/fworks/weaver_install/ovlm-install/artifact/.installer.png' $ocg_user
+
+  # Step to check OCG-Mgr health status
+  - su -s /bin/bash -l -c 'cd && . ~/.profile && ovlm-fe health status' $ocg_user
+  
+  # Step for Replication Import
+  - su -s /bin/bash -l -c 'ReplicationImport -u Administrator -p Openet00 /home/fworks/Installer/OCG_BASE_CONFIG.xml' $ocg_user
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_1.txt b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_1.txt
new file mode 100644 (file)
index 0000000..57ab985
--- /dev/null
@@ -0,0 +1,19 @@
+#cloud-config
+
+runcmd:
+   
+  # Allow for host resolution - With proper DNS in place, this is not needed
+  - echo "$ocg_hostip $ocg_hostname" >> /etc/hosts
+  
+  ##########################
+  # Cinder Volume Mounting
+  ##########################
+  - sudo su - root
+  - voldata_id="$volume_id"
+  - voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id} | cut -c -20)"
+  - mkfs.ext4 ${voldata_dev}
+  - sudo mkdir -pv /opt/ocg/data
+  - sudo chown -R fworks:fworks /opt/ocg/data
+  - echo "${voldata_dev} /opt/ocg/data ext4 defaults 1 2" >> /etc/fstab
+  - mount /opt/ocg/data
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_volume.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_nested_volume.yaml
new file mode 100644 (file)
index 0000000..cf354d9
--- /dev/null
@@ -0,0 +1,45 @@
+heat_template_version: 2015-04-30
+description: Nested volume file for ocg mgrs
+parameters:
+
+  index:
+    type: number
+    label: Volume index
+    description: number of volumes to spin up
+    constraints:
+      - allowed_values: [0, 1, 2]
+  size:
+    type: number
+    label: Volume Size
+    description: size of the cinder volumes
+    constraints:
+      - range: { min: 50, max: 400 }
+  volume_type:
+    type: string
+    label: Volume Type
+    description: type of cinder volumes
+  vnf_name:
+    type: string
+    label: VNF Name
+    description: vnf name
+
+
+resources:
+  ocgmgr_volume_0:
+    type: OS::Cinder::Volume
+    properties:
+      size: {get_param: size}
+      volume_type: {get_param: volume_type}
+      name:
+        str_replace:
+          template: VF_NAME_STACK_NAME_INDEX
+          params:
+            VF_NAME: {get_param: vnf_name}
+            STACK_NAME: {get_param: 'OS::stack_name'}
+            INDEX: {get_param: index}
+
+
+outputs:
+  ocgmgr_volume_id_0:
+    description: the ocgmgr volume uuids
+    value: {get_resource: ocgmgr_volume_0}
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_volume.env b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_volume.env
new file mode 100644 (file)
index 0000000..dd36b3e
--- /dev/null
@@ -0,0 +1,8 @@
+#file version 1.0
+parameters:
+  vnf_name: 'zrdm6bvocg01'
+  ocgmgr_volume_size_0: 400
+  #ocgmgr_volume_size_1: 100
+  ocgmgr_volume_type_0: SF-Default-SSD
+  #ocgmgr_volume_type_1: SF-Default-SSD
+  volume_count: 2 
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_volume.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/heat/nested/nestedundervolume/inputs/ocgmgr_volume.yaml
new file mode 100644 (file)
index 0000000..6a458c8
--- /dev/null
@@ -0,0 +1,44 @@
+heat_template_version: 2015-04-30 
+
+description: OCG template for MGR volumes
+#file version 1.0
+parameters:
+  vnf_name:
+    type: string
+    label: OCG VNF Name
+    description: OCG VNF Name
+  ocgmgr_volume_size_0:
+    type: number
+    label: Cinder volume 1 size
+    description: the size of the Cinder volume
+    constraints:
+      - range: { min: 50, max: 400 }
+  ocgmgr_volume_type_0:
+    type: string
+    label: mgr vm 1 volume type
+    description: the name of the target volume backend for the first OCG MGR
+  volume_count:
+    type: number
+    label: volume count
+    description: num of volumes needed
+    constraints:
+      - allowed_values: [0, 1, 2]
+resources:
+
+  ocgmgr_volume_resource_group:
+    type: OS::Heat::ResourceGroup
+    properties:
+      count: {get_param: volume_count}
+      index_var: index
+      resource_def:
+        type: ocgmgr_nested_volume.yaml
+        properties:
+          index: index
+          size: {get_param: ocgmgr_volume_size_0}
+          volume_type: {get_param: ocgmgr_volume_type_0}
+          vnf_name: {get_param: vnf_name}
+
+outputs:
+  ocgmgr_volume_ids:
+    description: ocgmgr volume ids
+    value: {get_attr: [ocgmgr_volume_resource_group, ocgmgr_volume_id_0]}