VLAN tagging - Pattern 4 VFC Instance Group 03/39003/2
authorojasdubey <ojas.dubey@amdocs.com>
Tue, 27 Mar 2018 09:31:07 +0000 (15:01 +0530)
committerAvi Gaffa <avi.gaffa@amdocs.com>
Tue, 27 Mar 2018 10:53:03 +0000 (10:53 +0000)
1. Create VFC instance group per sub-interface
network role for pattern 4 heats
2. Added tests and updated existing test data

Change-Id: Id4f84c5a7dac3adfddde1192947ecaa5502f21df
Issue-ID: SDC-1073
Signed-off-by: ojasdubey <ojas.dubey@amdocs.com>
17 files changed:
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/SubInterfaceTemplateConsolidationData.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionServiceTest.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/java/org/openecomp/sdc/translator/services/heattotosca/impl/fulltest/UnifiedCompositionSubInterfaceFullTest.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/pattern5/complexVFCMultiLevelNestedDiffComputeScenario/out/nested_pattern5ServiceTemplate.yaml
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/pattern5/complexVFCMultiLevelNestedScenario/out/nested_pattern5ServiceTemplate.yaml
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/MANIFEST.json [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/main.yml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/nested_pattern4.yml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/nested_vlan.yml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/GlobalSubstitutionTypesServiceTemplate.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/MainServiceTemplate.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/nested_pattern4ServiceTemplate.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/nested_vlanServiceTemplate.yaml [new file with mode: 0644]

index 9a6826d..9b80b91 100644 (file)
 
 package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation;
 
+import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
+import org.openecomp.sdc.tosca.services.ToscaUtil;
+import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
+
+import java.util.Optional;
+
 public class SubInterfaceTemplateConsolidationData extends EntityConsolidationData {
 
   //Value of the property count in the resource group representing the sub-interface
@@ -48,4 +54,27 @@ public class SubInterfaceTemplateConsolidationData extends EntityConsolidationDa
   public void setParentPortNodeTemplateId(String parentPortNodeTemplateId) {
     this.parentPortNodeTemplateId = parentPortNodeTemplateId;
   }
+
+  public Optional<PortTemplateConsolidationData> getParentPortTemplateConsolidationData(ServiceTemplate serviceTemplate,
+                                                                                        TranslationContext context) {
+    FilePortConsolidationData filePortConsolidationData = context.getConsolidationData().getPortConsolidationData()
+        .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
+    PortTemplateConsolidationData portTemplateConsolidationData = null;
+    if (filePortConsolidationData != null) {
+      portTemplateConsolidationData = filePortConsolidationData
+          .getPortTemplateConsolidationData(parentPortNodeTemplateId);
+    }
+    return Optional.ofNullable(portTemplateConsolidationData);
+  }
+
+  public Optional<String> getParentPortNetworkRole(ServiceTemplate serviceTemplate,
+                                                                TranslationContext context) {
+    Optional<PortTemplateConsolidationData> subInterfacePortTemplateConsolidationData =
+        getParentPortTemplateConsolidationData(serviceTemplate, context);
+    if (!subInterfacePortTemplateConsolidationData.isPresent()) {
+      return Optional.empty();
+    }
+    return Optional.ofNullable(subInterfacePortTemplateConsolidationData.get().getNetworkRole());
+  }
+
 }
index cb6a3bc..9fe2ea0 100644 (file)
@@ -834,7 +834,7 @@ public class ConsolidationService {
     if (substitutionConsolidationRuleResult) {
       List<UnifiedCompositionData> unifiedCompositionDataList =
           createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId,
-              serviceTemplate, consolidationData);
+              serviceTemplate, substitutionServiceTemplate, consolidationData);
       unifiedCompositionService
           .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate,
               unifiedCompositionDataList, UnifiedCompositionMode.NestedSingleCompute,
@@ -939,33 +939,22 @@ public class ConsolidationService {
 
     for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
         .getAllComputeTemplateConsolidationData()) {
-
       UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
       unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
-
-      Collection<List<String>> portCollection =
-          computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
-              : computeTemplateConsolidationData.getPorts().values();
-
       FilePortConsolidationData filePortConsolidationData =
           consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
               .getServiceTemplateFileName(serviceTemplate));
-      List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = new ArrayList<>();
-      portCollection.stream()
-          .flatMap(Collection::stream)
-          .forEach(portId -> setUnifiedCompositionDataWithPortTemplateData(filePortConsolidationData, portId,
-              unifiedCompositionData, subInterfaceTemplateConsolidationDataList));
-      unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList(
-          subInterfaceTemplateConsolidationDataList);
+      setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, filePortConsolidationData,
+          unifiedCompositionData);
       unifiedCompositionDataList.add(unifiedCompositionData);
     }
     return unifiedCompositionDataList;
   }
 
-  private void setUnifiedCompositionDataWithPortTemplateData(FilePortConsolidationData filePortConsolidationData,
-                                                             String portId,
-                                                             UnifiedCompositionData unifiedCompositionData,
-                                                             List<SubInterfaceTemplateConsolidationData>
+  private void setPortTemplateConsolidationData(FilePortConsolidationData filePortConsolidationData,
+                                                String portId,
+                                                UnifiedCompositionData unifiedCompositionData,
+                                                List<SubInterfaceTemplateConsolidationData>
                                                                  subInterfaceTemplateConsolidationDataList) {
     if (Objects.isNull(filePortConsolidationData)) {
       return;
@@ -981,6 +970,7 @@ public class ConsolidationService {
   private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
       String substituteNodeTemplateId,
       ServiceTemplate serviceTemplate,
+      ServiceTemplate substitutionServiceTemplate,
       ConsolidationData consolidationData) {
     List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
     FileNestedConsolidationData fileNestedConsolidationData =
@@ -993,12 +983,51 @@ public class ConsolidationService {
       UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
       unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData);
       unifiedCompositionDataList.add(unifiedCompositionData);
-      return unifiedCompositionDataList;
+      addSubInterfaceDataToNestedCompositionData(substitutionServiceTemplate, consolidationData,
+          unifiedCompositionData);
     }
 
     return unifiedCompositionDataList;
   }
 
+  private void addSubInterfaceDataToNestedCompositionData(ServiceTemplate substitutionServiceTemplate,
+                                                          ConsolidationData consolidationData,
+                                                          UnifiedCompositionData unifiedCompositionData) {
+    FileComputeConsolidationData nestedFileComputeConsolidationData = consolidationData.getComputeConsolidationData()
+        .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
+    FilePortConsolidationData nestedFilePortConsolidationData = consolidationData.getPortConsolidationData()
+        .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
+    if (Objects.isNull(nestedFileComputeConsolidationData)
+        || Objects.isNull(nestedFilePortConsolidationData)) {
+      return;
+    }
+    TypeComputeConsolidationData computeType =
+        nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next();
+    if (Objects.isNull(computeType)) {
+      return;
+    }
+    ComputeTemplateConsolidationData computeTemplateConsolidationData =
+        computeType.getAllComputeTemplateConsolidationData().iterator().next();
+    setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, nestedFilePortConsolidationData,
+        unifiedCompositionData);
+  }
+
+  private void setUnifiedCompositionDataWithPortTemplateData(ComputeTemplateConsolidationData
+                                                                 computeTemplateConsolidationData,
+                                                             FilePortConsolidationData filePortConsolidationData,
+                                                             UnifiedCompositionData unifiedCompositionData) {
+    Collection<List<String>> portCollection =
+        computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
+            : computeTemplateConsolidationData.getPorts().values();
+    List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = new ArrayList<>();
+    portCollection.stream()
+        .flatMap(Collection::stream)
+        .forEach(portId -> setPortTemplateConsolidationData(filePortConsolidationData, portId,
+            unifiedCompositionData, subInterfaceTemplateConsolidationDataList));
+    unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList(
+        subInterfaceTemplateConsolidationDataList);
+  }
+
   private boolean consolidationPreCondition(
       ServiceTemplate serviceTemplate,
       ConsolidationData consolidationData,
index f064fb6..0217d02 100644 (file)
@@ -36,7 +36,6 @@ import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositi
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewComputeNodeTemplateId;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewPortNodeTemplateId;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewSubInterfaceNodeTemplateId;
-import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfacePortTemplateConsolidationData;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTemplateConsolidationDataList;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTypeSuffix;
 
@@ -282,46 +281,53 @@ public class UnifiedCompositionService {
     if (!TranslationContext.isVfcInstanceGroupingEnabled()) {
       return;
     }
-    for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
-      List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
-          getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
-      if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) {
-        createVfcInstanceGroupPerSubInterface(abstractNodeTemplateId, serviceTemplate,
-            subInterfaceTemplateConsolidationDataList, context);
-      }
-    }
+    UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, null,
+        unifiedCompositionDataList, context);
+    unifiedCompositionDataList.forEach(unifiedCompositionData ->
+        createSubInterfaceVfcInstanceGroup(abstractNodeTemplateId, unifiedCompositionTo, unifiedCompositionData));
   }
 
-  private void createVfcInstanceGroupPerSubInterface(String abstractNodeTemplateId,
-                                                     ServiceTemplate serviceTemplate,
-                                                     List<SubInterfaceTemplateConsolidationData>
-                                                         subInterfaceList,
-                                                     TranslationContext context) {
-    for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceList) {
-      PortTemplateConsolidationData subInterfacePortTemplateConsolidationData =
-          getSubInterfacePortTemplateConsolidationData(serviceTemplate, subInterface, context);
-      String subInterfaceNetworkRole = subInterface.getNetworkRole();
-      if (Objects.isNull(subInterfaceNetworkRole)
-          || Objects.isNull(subInterfacePortTemplateConsolidationData.getNetworkRole())) {
-        continue;
+  private void createSubInterfaceVfcInstanceGroup(String abstractNodeTemplateId,
+                                                  UnifiedCompositionTo unifiedCompositionTo,
+                                                  UnifiedCompositionData unifiedCompositionData) {
+    List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
+        getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
+    for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceTemplateConsolidationDataList) {
+      Optional<String> parentPortNetworkRole;
+      if (Objects.isNull(unifiedCompositionTo.getSubstitutionServiceTemplate())) {
+        parentPortNetworkRole = subInterface.getParentPortNetworkRole(unifiedCompositionTo.getServiceTemplate(),
+            unifiedCompositionTo.getContext());
+      } else {
+        parentPortNetworkRole = subInterface.getParentPortNetworkRole(unifiedCompositionTo
+            .getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext());
       }
-      String vfcNetworkRoleGroupId = getVfcNetworkRoleGroupId(subInterfaceNetworkRole);
-      Map<String, GroupDefinition> groups = DataModelUtil.getGroups(serviceTemplate);
-      if (!groups.containsKey(vfcNetworkRoleGroupId)) {
-        createNewVfcInstanceGroup(serviceTemplate, subInterfacePortTemplateConsolidationData,
-            subInterfaceNetworkRole, vfcNetworkRoleGroupId);
+      String subInterfaceNetworkRole = subInterface.getNetworkRole();
+      if (Objects.nonNull(subInterfaceNetworkRole) && parentPortNetworkRole.isPresent()) {
+        createVfcInstanceGroupPerSubInterfaceNetworkRole(abstractNodeTemplateId, subInterfaceNetworkRole,
+            parentPortNetworkRole.get(), unifiedCompositionTo.getServiceTemplate());
       }
-      DataModelUtil.addGroupMember(serviceTemplate, vfcNetworkRoleGroupId, abstractNodeTemplateId);
     }
   }
 
+  private void createVfcInstanceGroupPerSubInterfaceNetworkRole(String abstractNodeTemplateId,
+                                                                String subInterfaceNetworkRole,
+                                                                String parentPortNetworkRole,
+                                                                ServiceTemplate serviceTemplate) {
+    String vfcNetworkRoleGroupId = getVfcNetworkRoleGroupId(subInterfaceNetworkRole);
+    Map<String, GroupDefinition> groups = DataModelUtil.getGroups(serviceTemplate);
+    if (!groups.containsKey(vfcNetworkRoleGroupId)) {
+      createNewVfcInstanceGroup(serviceTemplate, parentPortNetworkRole, subInterfaceNetworkRole, vfcNetworkRoleGroupId);
+    }
+    DataModelUtil.addGroupMember(serviceTemplate, vfcNetworkRoleGroupId, abstractNodeTemplateId);
+  }
+
   private void createNewVfcInstanceGroup(ServiceTemplate serviceTemplate,
-                                         PortTemplateConsolidationData portTemplate,
+                                         String parentPortNetworkRole,
                                          String subInterfaceNetworkRole,
                                          String vfcNetworkRoleGroupId) {
     Map<String, Object> properties = new HashMap<>();
     properties.put(SUB_INTERFACE_ROLE, subInterfaceNetworkRole);
-    properties.put(VFC_PARENT_PORT_ROLE, portTemplate.getNetworkRole());
+    properties.put(VFC_PARENT_PORT_ROLE, parentPortNetworkRole);
 
     updateVfcInstanceGroupExposedProperties(subInterfaceNetworkRole,
         serviceTemplate, properties);
@@ -494,18 +500,15 @@ public class UnifiedCompositionService {
   /**
    * Handle unified nested definition.
    *
-   * @param mainServiceTemplate    the main service template
-   * @param nestedServiceTemplate  the nested service template
-   * @param unifiedCompositionData the unified composition data
-   * @param context                the context
+   * @param unifiedCompositionTo    the unified composition data transfer object
+   * @param unifiedCompositionData  the unified composition data
    */
-  public void handleUnifiedNestedDefinition(ServiceTemplate mainServiceTemplate,
-                                            ServiceTemplate nestedServiceTemplate,
-                                            UnifiedCompositionData unifiedCompositionData,
-                                            TranslationContext context) {
-    handleUnifiedNestedNodeType(mainServiceTemplate, nestedServiceTemplate, context);
-    updateUnifiedNestedTemplates(mainServiceTemplate, nestedServiceTemplate,
-            unifiedCompositionData, context);
+  public void handleUnifiedNestedDefinition(UnifiedCompositionTo unifiedCompositionTo,
+                                            UnifiedCompositionData unifiedCompositionData) {
+    handleUnifiedNestedNodeType(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo
+        .getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext());
+    updateUnifiedNestedTemplates(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo
+        .getSubstitutionServiceTemplate(), unifiedCompositionData, unifiedCompositionTo.getContext());
   }
 
   private void handleGetAttrInConnectivity(ServiceTemplate serviceTemplate,
@@ -687,51 +690,55 @@ public class UnifiedCompositionService {
       return;
     }
     handleNestedNodeTemplateInMainServiceTemplate(
-            nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate,
-            nestedServiceTemplate, context);
-
+        nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate,
+        nestedServiceTemplate, context);
   }
 
   /**
    * Update connectivity for unified nested patterns.
    *
-   * @param serviceTemplate        the service template
-   * @param nestedServiceTemplate  the nested service template
-   * @param unifiedCompositionData the unified composition data
-   * @param context                the context
+   * @param unifiedCompositionTo    the unified composition data transfer object
+   * @param unifiedCompositionData  the unified composition data
    */
-  public void updateUnifiedNestedConnectivity(ServiceTemplate serviceTemplate,
-                                              ServiceTemplate nestedServiceTemplate,
-                                              UnifiedCompositionData unifiedCompositionData,
-                                              TranslationContext context) {
+  public void updateUnifiedNestedConnectivity(UnifiedCompositionTo unifiedCompositionTo,
+                                              UnifiedCompositionData unifiedCompositionData) {
 
-    updNestedCompositionNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionData,
-            context);
-    updNestedCompositionNodesConnectedOutConnectivity(serviceTemplate, nestedServiceTemplate,
-            unifiedCompositionData, context);
-    updNestedCompositionNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionData,
-            context);
-    updNestedCompositionOutputParamGetAttrInConnectivity(serviceTemplate,
-            unifiedCompositionData, context);
+    updNestedCompositionNodesConnectedInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData,
+        unifiedCompositionTo.getContext());
+    updNestedCompositionNodesConnectedOutConnectivity(unifiedCompositionTo.getServiceTemplate(),
+        unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionData, unifiedCompositionTo
+            .getContext());
+    updNestedCompositionNodesGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData,
+        unifiedCompositionTo.getContext());
+    updNestedCompositionOutputParamGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(),
+        unifiedCompositionData, unifiedCompositionTo.getContext());
   }
 
 
   /**
    * Clean unified nested entities. Update the heat stack group with the new node template ids.
    *
-   * @param serviceTemplate        the service template
+   * @param unifiedCompositionTo        the unified composition data transfer object
    * @param unifiedCompositionData the unified composition data
-   * @param context                the context
    */
-  public void cleanUnifiedNestedEntities(ServiceTemplate serviceTemplate,
-                                         UnifiedCompositionData unifiedCompositionData,
-                                         TranslationContext context) {
+  public void cleanUnifiedNestedEntities(UnifiedCompositionTo unifiedCompositionTo,
+                                         UnifiedCompositionData unifiedCompositionData) {
     EntityConsolidationData entityConsolidationData =
-            unifiedCompositionData.getNestedTemplateConsolidationData();
-    updateHeatStackGroupNestedComposition(serviceTemplate, entityConsolidationData, context);
+        unifiedCompositionData.getNestedTemplateConsolidationData();
+    updateHeatStackGroupNestedComposition(unifiedCompositionTo.getServiceTemplate(), entityConsolidationData,
+        unifiedCompositionTo.getContext());
 
   }
 
+  public void createNestedVfcInstanceGroup(String nestedNodeTemplateId,
+                                           UnifiedCompositionTo unifiedCompositionTo,
+                                           UnifiedCompositionData unifiedCompositionData) {
+    if (!TranslationContext.isVfcInstanceGroupingEnabled()) {
+      return;
+    }
+    createSubInterfaceVfcInstanceGroup(nestedNodeTemplateId, unifiedCompositionTo, unifiedCompositionData);
+  }
+
   public void handleComplexVfcType(ServiceTemplate serviceTemplate, TranslationContext context) {
     SubstitutionMapping substitutionMapping =
             serviceTemplate.getTopology_template().getSubstitution_mappings();
@@ -1936,18 +1943,17 @@ public class UnifiedCompositionService {
                                                                   subInterfaceTemplateConsolidationDataList) {
     SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData =
             subInterfaceTemplateConsolidationDataList.get(0);
-    PortTemplateConsolidationData portTemplateConsolidationData =
-            getSubInterfacePortTemplateConsolidationData(unifiedCompositionTo.getServiceTemplate(),
-                    subInterfaceTemplateConsolidationData, unifiedCompositionTo.getContext());
-
-    if (Objects.isNull(portTemplateConsolidationData)) {
+    Optional<PortTemplateConsolidationData> portTemplateConsolidationDataOptional =
+        subInterfaceTemplateConsolidationData.getParentPortTemplateConsolidationData(unifiedCompositionTo
+                .getServiceTemplate(), unifiedCompositionTo.getContext());
+    if (!portTemplateConsolidationDataOptional.isPresent()) {
       return;
     }
-
+    PortTemplateConsolidationData portTemplateConsolidationData = portTemplateConsolidationDataOptional.get();
     String originalSubInterfaceNodeTemplateId = subInterfaceTemplateConsolidationDataList.get(0)
             .getNodeTemplateId();
-    NodeTemplate originalSubInterfaceNodeTemplate =
-            DataModelUtil.getNodeTemplate(unifiedCompositionTo.getServiceTemplate(), originalSubInterfaceNodeTemplateId);
+    NodeTemplate originalSubInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(unifiedCompositionTo
+            .getServiceTemplate(), originalSubInterfaceNodeTemplateId);
     if (Objects.isNull(originalSubInterfaceNodeTemplate)) {
       return;
     }
index 223dc87..528dc5e 100644 (file)
@@ -19,33 +19,29 @@ package org.openecomp.sdc.translator.services.heattotosca;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import org.apache.commons.collections4.MapUtils;
-import org.openecomp.sdc.logging.api.Logger;
-import org.openecomp.sdc.logging.api.LoggerFactory;
 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
 import org.openecomp.sdc.tosca.services.DataModelUtil;
-import org.openecomp.sdc.tosca.services.ToscaUtil;
 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
-import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * Utility class for consolidation data collection helper methods.
  */
 public class UnifiedCompositionUtil {
 
-  protected static Logger logger = LoggerFactory.getLogger(UnifiedCompositionUtil.class);
-
   private UnifiedCompositionUtil() {
     //Hiding the implicit public constructor
   }
@@ -155,34 +151,17 @@ public class UnifiedCompositionUtil {
     StringBuilder newSubInterfaceNodeTemplateId = new StringBuilder();
     newSubInterfaceNodeTemplateId.append(getNewPortNodeTemplateId(subInterfaceTemplateConsolidationData
         .getParentPortNodeTemplateId(), connectedComputeNodeType, computeTemplateConsolidationData));
-    PortTemplateConsolidationData portTemplateConsolidationData =
-        getSubInterfacePortTemplateConsolidationData(serviceTemplate, subInterfaceTemplateConsolidationData, context);
+    Optional<PortTemplateConsolidationData> portTemplateConsolidationData =
+        subInterfaceTemplateConsolidationData.getParentPortTemplateConsolidationData(serviceTemplate, context);
     NodeTemplate subInterfaceNodeTemplate =
         DataModelUtil.getNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData.getNodeTemplateId());
-    if (Objects.nonNull(portTemplateConsolidationData)) {
-        String subInterfaceSuffix = (portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(subInterfaceNodeTemplate.getType()))?
-              //If there are more than one subinterfaces with same type use node template id
-              subInterfaceTemplateConsolidationData.getNodeTemplateId():
-                    //Add sub interface type since we have only one subinterface per type
-                     getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());
-        newSubInterfaceNodeTemplateId.append("_").append(subInterfaceSuffix);
-        return newSubInterfaceNodeTemplateId.toString();
-      }
-    return subInterfaceTemplateConsolidationData.getNodeTemplateId();
-  }
-
-  static PortTemplateConsolidationData getSubInterfacePortTemplateConsolidationData(ServiceTemplate serviceTemplate,
-                                                                               SubInterfaceTemplateConsolidationData
-                                                                                   subInterfaceTemplateConsolidationData,
-                                                                                     TranslationContext context) {
-    FilePortConsolidationData filePortConsolidationData = context.getConsolidationData().getPortConsolidationData()
-        .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
-    PortTemplateConsolidationData portTemplateConsolidationData = null;
-    if (filePortConsolidationData != null) {
-      portTemplateConsolidationData = filePortConsolidationData
-          .getPortTemplateConsolidationData(subInterfaceTemplateConsolidationData.getParentPortNodeTemplateId());
+    if (portTemplateConsolidationData.isPresent()) {
+      String subInterfaceSuffix = getSubInterfaceSuffix(portTemplateConsolidationData.get(),
+          subInterfaceNodeTemplate, subInterfaceTemplateConsolidationData);
+      newSubInterfaceNodeTemplateId.append("_").append(subInterfaceSuffix);
+      return newSubInterfaceNodeTemplateId.toString();
     }
-    return portTemplateConsolidationData;
+    return subInterfaceTemplateConsolidationData.getNodeTemplateId();
   }
 
   static String getSubInterfaceTypeSuffix(String nodeType) {
@@ -191,8 +170,19 @@ public class UnifiedCompositionUtil {
 
   public static List<SubInterfaceTemplateConsolidationData> getSubInterfaceTemplateConsolidationDataList(
       UnifiedCompositionData unifiedCompositionData) {
-    return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? new
-        ArrayList<>() : unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();
+    return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? Collections.emptyList() :
+        unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();
   }
 
+  private static String getSubInterfaceSuffix(PortTemplateConsolidationData portTemplateConsolidationData,
+                                              NodeTemplate subInterfaceNodeTemplate,
+                                              SubInterfaceTemplateConsolidationData
+                                                  subInterfaceTemplateConsolidationData) {
+    if (portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(subInterfaceNodeTemplate.getType())) {
+      //If there are more than one subinterfaces with same type use node template id
+      return subInterfaceTemplateConsolidationData.getNodeTemplateId();
+    }
+    //Add sub interface type since we have only one subinterface per type
+    return getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());
+  }
 }
index d6b49ec..a48e107 100644 (file)
@@ -4,17 +4,17 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
+import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.to.UnifiedCompositionTo;
 import org.openecomp.sdc.translator.services.heattotosca.UnifiedComposition;
 import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService;
 
-import java.util.ArrayList;
 import java.util.List;
 
 public class UnifiedCompositionNestedSingleCompute implements UnifiedComposition {
 
-  // There is no consolidation in NestedSingleCompute implemetation.
+  // There is no consolidation in NestedSingleCompute implementation.
   // In case of  nested single compute, if there is more than one entry in the
-  // unifiedComposotionDataList, each one should be handed seperatly, no consolidation between
+  // unifiedCompositionDataList, each one should be handed separately, no consolidation between
   // them.
   @Override
   public void createUnifiedComposition(ServiceTemplate serviceTemplate,
@@ -26,18 +26,15 @@ public class UnifiedCompositionNestedSingleCompute implements UnifiedComposition
       return;
     }
 
-    for (int i = 0; i < unifiedCompositionDataList.size(); i++) {
-      List<UnifiedCompositionData> nestedUnifiedCompositionDataList = new ArrayList<>();
-      nestedUnifiedCompositionDataList.add(unifiedCompositionDataList.get(i));
-
-      unifiedCompositionService
-          .handleUnifiedNestedDefinition(serviceTemplate, nestedServiceTemplate,
-              unifiedCompositionDataList.get(i), context);
-      unifiedCompositionService
-          .updateUnifiedNestedConnectivity(serviceTemplate, nestedServiceTemplate,
-              unifiedCompositionDataList.get(i), context);
+    UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, nestedServiceTemplate,
+        unifiedCompositionDataList, context);
+    for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
+      unifiedCompositionService.handleUnifiedNestedDefinition(unifiedCompositionTo, unifiedCompositionData);
+      String nestedNodeTemplateId = unifiedCompositionData.getNestedTemplateConsolidationData().getNodeTemplateId();
       unifiedCompositionService
-          .cleanUnifiedNestedEntities(serviceTemplate, unifiedCompositionDataList.get(i), context);
+          .createNestedVfcInstanceGroup(nestedNodeTemplateId, unifiedCompositionTo, unifiedCompositionData);
+      unifiedCompositionService.updateUnifiedNestedConnectivity(unifiedCompositionTo, unifiedCompositionData);
+      unifiedCompositionService.cleanUnifiedNestedEntities(unifiedCompositionTo, unifiedCompositionData);
       unifiedCompositionService.updateSubstitutionNodeTypePrefix(nestedServiceTemplate);
     }
   }
index e239805..83b83d3 100644 (file)
 
 package org.openecomp.sdc.translator.services.heattotosca;
 
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
@@ -35,6 +39,7 @@ import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedSubstitutionData;
+import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.to.UnifiedCompositionTo;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
@@ -56,10 +61,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.anyString;
-
 public class UnifiedCompositionServiceTest {
     private static final String BASE_DIRECTORY = "/mock/services/heattotosca/unifiedComposition/";
     @InjectMocks
@@ -1003,9 +1004,11 @@ public class UnifiedCompositionServiceTest {
         context.getTranslatedServiceTemplates()
                 .put(MAIN_SERVICE_TEMPLATE_YAML, inputServiceTemplates.get(MAIN_SERVICE_TEMPLATE_YAML));
 
-        UnifiedCompositionData unifiedComposition = createUnifiedCompositionOnlyNested("server_pcm_001");
-        unifiedCompositionService.handleUnifiedNestedDefinition(inputServiceTemplates.get(MAIN_SERVICE_TEMPLATE_YAML),
-                inputServiceTemplates.get(nestedFileName), unifiedComposition, context);
+    UnifiedCompositionData unifiedComposition = createUnifiedCompositionOnlyNested("server_pcm_001");
+    UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(
+        inputServiceTemplates.get(MAIN_SERVICE_TEMPLATE_YAML), inputServiceTemplates.get(nestedFileName), null,
+        context);
+    unifiedCompositionService.handleUnifiedNestedDefinition(unifiedCompositionTo, unifiedComposition);
 
         checkSTResults(expectedOutserviceTemplates, nestedFileName,
                 context.getTranslatedServiceTemplates().get(nestedFileName),
@@ -1044,13 +1047,15 @@ public class UnifiedCompositionServiceTest {
         context.getTranslatedServiceTemplates()
                 .put(MAIN_SERVICE_TEMPLATE_YAML, inputServiceTemplates.get(MAIN_SERVICE_TEMPLATE_YAML));
 
-        UnifiedCompositionData unifiedComposition =
-                createUnifiedCompositionOnlyNested("server_pcm_001");
-        unifiedCompositionService.handleUnifiedNestedDefinition(inputServiceTemplates.get(MAIN_SERVICE_TEMPLATE_YAML),
-                inputServiceTemplates.get(nestedFileName1), unifiedComposition, context);
-        unifiedComposition = createUnifiedCompositionOnlyNested("server_oam_001");
-        unifiedCompositionService.handleUnifiedNestedDefinition(inputServiceTemplates.get(MAIN_SERVICE_TEMPLATE_YAML),
-                inputServiceTemplates.get(nestedFileName2), unifiedComposition, context);
+    UnifiedCompositionData unifiedComposition =
+        createUnifiedCompositionOnlyNested("server_pcm_001");
+    UnifiedCompositionTo unifiedCompositionTo1 = new UnifiedCompositionTo(inputServiceTemplates
+        .get(MAIN_SERVICE_TEMPLATE_YAML), inputServiceTemplates.get(nestedFileName1), null, context);
+    unifiedCompositionService.handleUnifiedNestedDefinition(unifiedCompositionTo1, unifiedComposition);
+    unifiedComposition = createUnifiedCompositionOnlyNested("server_oam_001");
+    UnifiedCompositionTo unifiedCompositionTo2 = new UnifiedCompositionTo(inputServiceTemplates
+        .get(MAIN_SERVICE_TEMPLATE_YAML), inputServiceTemplates.get(nestedFileName2), null, context);
+    unifiedCompositionService.handleUnifiedNestedDefinition(unifiedCompositionTo2, unifiedComposition);
 
         checkSTResults(expectedOutserviceTemplates, nestedFileName1,
                 context.getTranslatedServiceTemplates().get(nestedFileName1),
index ca31c85..89d7cab 100644 (file)
@@ -350,8 +350,7 @@ public class UnifiedCompositionSubInterfaceFullTest extends BaseFullTranslationT
      * Nested Heat file with one compute, one port and one subinterface resource group with only
      * port connected to network
      */
-    testTranslationWithInit(PATTERN_4_BASE_DIRECTORY +
-        "computePortNetworkSubInterface");
+    testTranslationWithInit(PATTERN_4_BASE_DIRECTORY + "computePortNetworkSubInterface");
   }
 
   @Test
@@ -428,6 +427,7 @@ public class UnifiedCompositionSubInterfaceFullTest extends BaseFullTranslationT
     testTranslationWithInit(PATTERN_4_BASE_DIRECTORY + "subInterfaceNodesConnectedOut");
   }
 
+
   //****************** VFC Instance Group Tests ***************************
 
   @Test
@@ -444,4 +444,15 @@ public class UnifiedCompositionSubInterfaceFullTest extends BaseFullTranslationT
   public void testGroupingTwoSubInterfaceTypeAndTwoAbstractNodes() throws IOException {
     testTranslationWithInit(VFC_INSTANCE_GROUP_BASE_DIRECTORY + "twoSubInterfaceNetworkRoleAndTwoAbstractNodes");
   }
+
+  @Test
+  public void testSubInterfacePattern4WithGroup() throws IOException {
+    /*
+     * Nested Heat file with one compute, one port and one subinterface resource group with
+     * 1. Port connected to network
+     * 2. Sub-interface connected to same network
+     * 3. Sub-interface has depends on (out) connectivity with network resource
+     */
+    testTranslationWithInit(VFC_INSTANCE_GROUP_BASE_DIRECTORY + "pattern4SubInterfaceNodesConnectedOut");
+  }
 }
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/MANIFEST.json b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/MANIFEST.json
new file mode 100644 (file)
index 0000000..6e418db
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "name": "vMME_Small",
+  "description": "HOT template to create 2 cinder volume attachment",
+  "version": "2013-05-23",
+  "data": [
+    {
+      "file": "main.yml",
+      "type": "HEAT",
+      "isBase": "true"
+    },
+    {
+      "file": "nested_pattern4.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    },
+    {
+      "file": "nested_vlan.yml",
+      "type": "HEAT",
+      "isBase": "false"
+    }
+  ]
+}
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/main.yml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/main.yml
new file mode 100644 (file)
index 0000000..6c68813
--- /dev/null
@@ -0,0 +1,35 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  vnf_name:
+      type: string
+      description: Unique name for this VF instance
+  vf_module_name:
+      type: string
+      description: Unique name for this VF Module instance
+  vf_module_id:
+    type: string
+    description: Unique ID for this VF Module instance
+  tdcore_zone_0_count:
+      type: number
+      description: >
+        Number of TD Core VMs to be deployed zone 0.
+        This parameter is used to scale the TD Core instances.
+      constraints:
+          - range: { min: 0, max: 8 }
+
+resources:
+  tdcore_zone_0_RRG:
+      type: OS::Heat::ResourceGroup
+      properties:
+        count: { get_param: tdcore_zone_0_count }
+        index_var: $INDEX
+        resource_def:
+          type: nested_pattern4.yml
+          properties:
+            vnf_name: { get_param: vnf_name }
+            vf_module_id: {get_param: vf_module_id}
+            vf_module_name: {get_param: vf_module_name}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/nested_pattern4.yml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/nested_pattern4.yml
new file mode 100644 (file)
index 0000000..d876202
--- /dev/null
@@ -0,0 +1,233 @@
+heat_template_version: 2013-05-23
+
+description: >
+  Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+
+parameters:
+  aap_address_mode:
+    description: "Address mode for the vDBE cluster IP"
+    type: string
+  control_int_net_forwarding_mode:
+    description: "forwarding mode of the control virtual network"
+    type: string
+  control_int_net_rpf:
+    description: "Reverse Path Filtering enable or disable for the control virtual network"
+    type: string
+  control_int_net_shared:
+    description: "control virtual network shared"
+    type: boolean
+  control_int_net_flood_unknown_unicast:
+    description: "forwarding mode of the control virtual network"
+    type: boolean
+  oam_net_name:
+    description: "Name of NSDNet network from which the management IP addresses will be allocated"
+    type: string
+  untrusted_net_name:
+    description: "Name of public untrusted network into which this vDBE HA cluster is deployed"
+    type: string
+  untrusted_num_vn:
+    constraints:
+      -
+        range:
+          max: 77
+          min: 1
+    description: "Number of vDBE subinterface virtual Networks"
+    type: number
+  untrusted_vlan_tags:
+    description: "List of subinterface vlan tags"
+    type: comma_delimited_list
+  untrusted_vn_networks:
+    description: "List of subinterface virtual networks"
+    type: comma_delimited_list
+  vdbe_aap_sec_untrusted_ip_prefix:
+    description: "ip prefix for secondary vDBE VM aap on the VAN untrusted network"
+    type: string
+  vdbe_aap_sec_untrusted_ip_prefix_len:
+    description: "ip prefix length for the secondary DBE VM aap on the VAN untrusted network"
+    type: string
+  vdbe_aap_untrusted_ip_prefix:
+    description: "ip prefix for primary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_aap_untrusted_ip_prefix_len:
+    description: "ip prefix length for the primary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_aap_untrusted_v6_ip_prefix:
+    description: "ipv6 prefix for the primary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_aap_untrusted_v6_ip_prefix_len:
+    description: "ipv6 prefix length for the primary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_device_name:
+    description: "VDBE device Name for this vdbe VNF"
+    type: string
+  vdbe_hw_untr_mac_1:
+    description: "Secondary MAC address of the secondary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_name_1:
+    description: "VM Name for this vdbe node 1"
+    type: string
+  vdbe_untrusted_ip_1:
+    description: "IPV4 address of the secondary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_untrusted_v6_ip_1:
+    description: "IPV6 address of the secondary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_untrusted_vmac_address:
+    description: "Virtual MAC of the primary vDBE VM on the VAN untrusted network"
+    type: string
+  vdbe_flavor_name:
+    description: "Flavor to use for vDBE"
+    type: string
+  vdbe_image_name:
+    description: "Image to use for vDBE"
+    type: string
+  vnf_id:
+    description: "Unique ID for this VF inst"
+    type: string
+  vnf_name:
+    description: "Unique name for this VF instance"
+    type: string
+  vf_module_id:
+    description: "Unique ID for this VF module inst"
+    type: string
+  vf_module_name:
+      description: "Unique name for this VF module inst"
+      type: string
+  availability_zone_1:
+    description: "The availability zone of secondary node1 vDBE vm in the local HA pair."
+    type: string
+resources:
+  vdbe_node_1:
+    type: OS::Nova::Server
+    properties:
+      availability_zone:
+        get_param: availability_zone_1
+      flavor:
+        get_param: vdbe_flavor_name
+      image:
+        get_param: vdbe_image_name
+      metadata:
+        vf_module_id:
+          get_param: vf_module_id
+        vnf_id:
+          get_param: vnf_id
+        vnf_name:
+          get_param: vnf_name
+      name:
+        get_param: vdbe_name_1
+      networks:
+        - port: {get_resource: vdbe_0_untr_vmi_1}
+  vdbe_0_untr_vmi_1:
+    properties:
+      name:
+        str_replace:
+          params:
+            DBE:
+              get_param: vdbe_device_name
+            VM_NAME:
+              get_param: vdbe_name_1
+          template: VM_NAMEDBE001p1n004
+      virtual_machine_interface_allowed_address_pairs:
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
+          -
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode:
+              get_param: aap_address_mode
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+                get_param: vdbe_aap_untrusted_ip_prefix
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len:
+                get_param: vdbe_aap_untrusted_ip_prefix_len
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac:
+              get_param: vdbe_untrusted_vmac_address
+          -
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode:
+              get_param: aap_address_mode
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+                get_param: vdbe_aap_sec_untrusted_ip_prefix
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len:
+                get_param: vdbe_aap_sec_untrusted_ip_prefix_len
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac:
+              get_param: vdbe_hw_untr_mac_1
+          -
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode:
+              get_param: aap_address_mode
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+                get_param: vdbe_aap_untrusted_v6_ip_prefix
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len:
+                get_param: vdbe_aap_untrusted_v6_ip_prefix_len
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac:
+              get_param: vdbe_untrusted_vmac_address
+      virtual_machine_interface_mac_addresses:
+        virtual_machine_interface_mac_addresses_mac_address:
+          -
+            get_param: vdbe_hw_untr_mac_1
+      virtual_network_refs:
+        -
+          get_resource: control_int_net
+    type: OS::ContrailV2::VirtualMachineInterface
+  vdbe_untr_1_subports:
+    type: OS::Heat::ResourceGroup
+    depends_on: control_int_net
+    properties:
+      count:
+        get_param: untrusted_num_vn
+      resource_def:
+        type: nested_vlan.yml
+        properties:
+          aap_address_mode:
+            get_param: aap_address_mode
+          aap_sec_untrusted_ip_prefix:
+            get_param: vdbe_aap_sec_untrusted_ip_prefix
+          aap_sec_untrusted_ip_prefix_len:
+            get_param: vdbe_aap_sec_untrusted_ip_prefix_len
+          aap_untrusted_ip_prefix:
+            get_param: vdbe_aap_untrusted_ip_prefix
+          aap_untrusted_ip_prefix_len:
+            get_param: vdbe_aap_untrusted_ip_prefix_len
+          aap_untrusted_v6_ip_prefix:
+            get_param: vdbe_aap_untrusted_v6_ip_prefix
+          aap_untrusted_v6_ip_prefix_len:
+            get_param: vdbe_aap_untrusted_v6_ip_prefix_len
+          counter: "%index%"
+          ip_address:
+            get_param: vdbe_untrusted_ip_1
+          ip_v6_address:
+            get_param: vdbe_untrusted_v6_ip_1
+          mac_address:
+            get_param: vdbe_hw_untr_mac_1
+          parent_interface:
+            get_resource: vdbe_0_untr_vmi_1
+          subinterfaces_name_prefix:
+            str_replace:
+              params:
+                DBE:
+                  get_param: vdbe_device_name
+                VM_NAME:
+                  get_param: vdbe_name_1
+              template: VM_NAMEDBE001p1n004
+          vlan_tag_list:
+            get_param: untrusted_vlan_tags
+          vmac_address:
+            get_param: vdbe_untrusted_vmac_address
+          vdbe_subport_network:
+            get_resource: control_int_net
+  control_int_net:
+    type: OS::ContrailV2::VirtualNetwork
+    properties:
+      flood_unknown_unicast:
+        get_param: control_int_net_flood_unknown_unicast
+      is_shared:
+        get_param: control_int_net_shared
+      name:
+        str_replace:
+          params:
+            VNF_NAME:
+              get_param: vnf_name
+          template: VNF_NAME_control_net
+      virtual_network_properties:
+        virtual_network_properties_forwarding_mode:
+          get_param: control_int_net_forwarding_mode
+        virtual_network_properties_rpf:
+          get_param: control_int_net_rpf
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/nested_vlan.yml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/in/nested_vlan.yml
new file mode 100644 (file)
index 0000000..8b4b9b1
--- /dev/null
@@ -0,0 +1,116 @@
+heat_template_version: 2013-05-23
+
+description: cmaui server template for vMMSC
+
+parameters:
+  aap_address_mode:
+    description: "Address mode for the vDBE cluster IP"
+    type: string
+  aap_sec_untrusted_ip_prefix:
+    description: "ip prefix for secondary vDBE VM aap on the VAN untrusted network"
+    type: string
+  aap_sec_untrusted_ip_prefix_len:
+    description: "ip prefix length for the secondary DBE VM aap on the VAN untrusted network"
+    type: string
+  aap_untrusted_ip_prefix:
+    description: "ip prefix for primary vDBE VM on the VAN untrusted network"
+    type: string
+  aap_untrusted_ip_prefix_len:
+    description: "ip prefix length for the primary vDBE VM on the VAN untrusted network"
+    type: string
+  aap_untrusted_v6_ip_prefix:
+    description: "ipv6 prefix for the primary vDBE VM on the VAN untrusted network"
+    type: string
+  aap_untrusted_v6_ip_prefix_len:
+    description: "ipv6 prefix length for the primary vDBE VM on the VAN untrusted network"
+    type: string
+  counter:
+    description: "Index of instance among multiple instances.  Use to retrieve correct parameter for this instance when passed all parameters for all instances."
+    type: number
+  mac_address:
+    description: "HW MAC address to use for subinterface"
+    type: string
+  parent_interface:
+    description: "Parent Contrail interface"
+    type: string
+  subinterfaces_name_prefix:
+    description: "Combined with subinterface_instance_index, this is used as the name of the subinterface resource"
+    type: string
+  vlan_tag_list:
+    description: "List of VLAN IDs to use for subinterfaces"
+    type: comma_delimited_list
+  vmac_address:
+    description: "virtual MAC address to use for subinterface"
+    type: string
+  vdbe_subport_network:
+    description: "List of Contrail VLAN networks to use for the subinterfaces.   The order and number of these must match the VLAN ID list"
+    type: string
+  ip_address:
+    description: "IPv4 address associated with subinterfaces"
+    type: string
+  ip_v6_address:
+    description: "IPv6 address associated with subinterfaces"
+    type: string
+resources:
+  vdbe_0_subint_untr_vmi_1:
+    type: OS::ContrailV2::VirtualMachineInterface
+    properties:
+      name:
+        str_replace:
+          params:
+            $INDEX:
+              get_param:
+                - vlan_tag_list
+                -
+                  get_param: counter
+            $NAME:
+              get_param: subinterfaces_name_prefix
+          template: $NAME_$INDEX
+      virtual_machine_interface_allowed_address_pairs:
+        virtual_machine_interface_allowed_address_pairs_allowed_address_pair:
+          -
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode:
+              get_param: aap_address_mode
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+                get_param: aap_untrusted_ip_prefix
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len:
+                get_param: aap_untrusted_ip_prefix_len
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac:
+              get_param: vmac_address
+          -
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode:
+              get_param: aap_address_mode
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+                get_param: aap_sec_untrusted_ip_prefix
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len:
+                get_param: aap_sec_untrusted_ip_prefix_len
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac:
+              get_param: mac_address
+          -
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_address_mode:
+              get_param: aap_address_mode
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip:
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix:
+                get_param: aap_untrusted_v6_ip_prefix
+              virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix_len:
+                get_param: aap_untrusted_v6_ip_prefix_len
+            virtual_machine_interface_allowed_address_pairs_allowed_address_pair_mac:
+              get_param: vmac_address
+      virtual_machine_interface_mac_addresses:
+        virtual_machine_interface_mac_addresses_mac_address:
+          -
+            get_param: mac_address
+      virtual_machine_interface_properties:
+        virtual_machine_interface_properties_sub_interface_vlan_tag:
+          get_param:
+            - vlan_tag_list
+            -
+              get_param: counter
+      virtual_machine_interface_refs:
+          [{get_param: parent_interface}]
+      virtual_network_refs:
+          [{get_param: vdbe_subport_network}]
+
+
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/GlobalSubstitutionTypesServiceTemplate.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/GlobalSubstitutionTypesServiceTemplate.yaml
new file mode 100644 (file)
index 0000000..e937a9e
--- /dev/null
@@ -0,0 +1,692 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+metadata:
+  template_name: GlobalSubstitutionTypes
+imports:
+- openecomp_heat_index:
+    file: openecomp-heat/_index.yml
+node_types:
+  org.openecomp.resource.abstract.nodes.heat.vdbe:
+    derived_from: org.openecomp.resource.abstract.nodes.VFC
+    properties:
+      vf_module_id:
+        type: string
+        description: Unique ID for this VF module inst
+        required: true
+        status: SUPPORTED
+      port_vdbe_0_untr_vmi_1_network_role_tag:
+        type: string
+        required: true
+        status: SUPPORTED
+      control_int_net_rpf:
+        type: string
+        description: Reverse Path Filtering enable or disable for the control virtual network
+        required: true
+        status: SUPPORTED
+      control_int_net_forwarding_mode:
+        type: string
+        description: forwarding mode of the control virtual network
+        required: true
+        status: SUPPORTED
+      vnf_name:
+        type: string
+        description: Unique name for this VF instance
+        required: true
+        status: SUPPORTED
+      vdbe_untrusted_ip_1:
+        type: string
+        description: IPV4 address of the secondary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      vdbe_aap_untrusted_ip_prefix_len:
+        type: string
+        description: ip prefix length for the primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      port_vdbe_0_untr_vmi_1_vlan_requirements:
+        type: list
+        required: true
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.network.VlanRequirements
+      untrusted_num_vn:
+        type: float
+        description: Number of vDBE subinterface virtual Networks
+        required: true
+        status: SUPPORTED
+        constraints:
+        - in_range:
+          - 1
+          - 77
+      vf_module_name:
+        type: string
+        description: Unique name for this VF module inst
+        required: true
+        status: SUPPORTED
+      aap_address_mode:
+        type: string
+        description: Address mode for the vDBE cluster IP
+        required: true
+        status: SUPPORTED
+      control_int_net_shared:
+        type: boolean
+        description: control virtual network shared
+        required: true
+        status: SUPPORTED
+      vdbe_untrusted_v6_ip_1:
+        type: string
+        description: IPV6 address of the secondary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      vdbe_untrusted_vmac_address:
+        type: string
+        description: Virtual MAC of the primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      control_int_net_flood_unknown_unicast:
+        type: boolean
+        description: forwarding mode of the control virtual network
+        required: true
+        status: SUPPORTED
+      vdbe_aap_sec_untrusted_ip_prefix:
+        type: string
+        description: ip prefix for secondary vDBE VM aap on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      vnf_id:
+        type: string
+        description: Unique ID for this VF inst
+        required: true
+        status: SUPPORTED
+      port_vdbe_0_untr_vmi_1_order:
+        type: integer
+        required: true
+        status: SUPPORTED
+      vdbe_name_1:
+        type: string
+        description: VM Name for this vdbe node 1
+        required: true
+        status: SUPPORTED
+      availability_zone_1:
+        type: string
+        description: The availability zone of secondary node1 vDBE vm in the local HA pair.
+        required: true
+        status: SUPPORTED
+      port_vdbe_0_untr_vmi_1_mac_requirements:
+        type: org.openecomp.datatypes.network.MacRequirements
+        required: true
+        status: SUPPORTED
+      untrusted_vn_networks:
+        type: list
+        description: List of subinterface virtual networks
+        required: true
+        status: SUPPORTED
+        entry_schema:
+          type: string
+      vdbe_image_name:
+        type: string
+        description: Image to use for vDBE
+        required: true
+        status: SUPPORTED
+      oam_net_name:
+        type: string
+        description: Name of NSDNet network from which the management IP addresses will be allocated
+        required: true
+        status: SUPPORTED
+      vdbe_aap_sec_untrusted_ip_prefix_len:
+        type: string
+        description: ip prefix length for the secondary DBE VM aap on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      vdbe_aap_untrusted_v6_ip_prefix:
+        type: string
+        description: ipv6 prefix for the primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      vdbe_aap_untrusted_v6_ip_prefix_len:
+        type: string
+        description: ipv6 prefix length for the primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      untrusted_vlan_tags:
+        type: list
+        description: List of subinterface vlan tags
+        required: true
+        status: SUPPORTED
+        entry_schema:
+          type: string
+      port_vdbe_0_untr_vmi_1_subnetpoolid:
+        type: string
+        required: true
+        status: SUPPORTED
+      vdbe_flavor_name:
+        type: string
+        description: Flavor to use for vDBE
+        required: true
+        status: SUPPORTED
+      port_vdbe_0_untr_vmi_1_ip_requirements:
+        type: list
+        required: true
+        status: SUPPORTED
+        entry_schema:
+          type: org.openecomp.datatypes.network.IpRequirements
+      vdbe_hw_untr_mac_1:
+        type: string
+        description: Secondary MAC address of the secondary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      untrusted_net_name:
+        type: string
+        description: Name of public untrusted network into which this vDBE HA cluster is deployed
+        required: true
+        status: SUPPORTED
+      vdbe_device_name:
+        type: string
+        description: VDBE device Name for this vdbe VNF
+        required: true
+        status: SUPPORTED
+      port_vdbe_0_untr_vmi_1_network_role:
+        type: string
+        required: true
+        status: SUPPORTED
+      vdbe_aap_untrusted_ip_prefix:
+        type: string
+        description: ip prefix for primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      port_vdbe_0_untr_vmi_1_exCP_naming:
+        type: org.openecomp.datatypes.Naming
+        required: true
+        status: SUPPORTED
+    requirements:
+    - dependency_vdbe_0_untr_vmi_1:
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - dependency_vdbe_node_1:
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - local_storage_vdbe_node_1:
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - dependency_vdbe_untr_1_subports:
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - dependency_vdbe_0_subint_untr_vmi_1_vdbe_untr_1_subports:
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - dependency_control_int_net:
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+        occurrences:
+        - 0
+        - UNBOUNDED
+    capabilities:
+      disk.latency_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      binding_vdbe_node_1:
+        type: tosca.capabilities.network.Bindable
+        occurrences:
+        - 1
+        - UNBOUNDED
+      instance_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.outgoing.bytes_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.read.requests_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.usage_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      binding_vdbe_0_untr_vmi_1:
+        type: tosca.capabilities.network.Bindable
+        valid_source_types:
+        - org.openecomp.resource.cp.nodes.heat.network.contrailV2.VLANSubInterface
+        occurrences:
+        - 0
+        - UNBOUNDED
+      forwarder_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.Forwarder
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.write.bytes_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.write.bytes_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.allocation_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      memory_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      cpu_util_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.read.bytes_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.incoming.bytes.rate_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.read.bytes.rate_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.allocation_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.write.requests.rate_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.root.size_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.iops_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.write.requests_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.write.requests_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      vcpus_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.ephemeral.size_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      feature_vdbe_0_untr_vmi_1:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      feature_vdbe_untr_1_subports:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.incoming.packets_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.latency_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.capacity_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.capacity_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.outgoing.packets.rate_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      link_control_int_net:
+        type: tosca.capabilities.network.Linkable
+        occurrences:
+        - 1
+        - UNBOUNDED
+      end_point_control_int_net:
+        type: tosca.capabilities.Endpoint
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.usage_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.read.bytes_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.read.requests.rate_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      host_vdbe_node_1:
+        type: tosca.capabilities.Container
+        valid_source_types:
+        - tosca.nodes.SoftwareComponent
+        occurrences:
+        - 1
+        - UNBOUNDED
+      feature_control_int_net:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.incoming.bytes_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      cpu.delta_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      scalable_vdbe_node_1:
+        type: tosca.capabilities.Scalable
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.iops_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.incoming.packets.rate_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      feature_vdbe_node_1:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      memory.resident_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      endpoint_vdbe_node_1:
+        type: tosca.capabilities.Endpoint.Admin
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.outgoing.bytes.rate_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      os_vdbe_node_1:
+        type: tosca.capabilities.OperatingSystem
+        occurrences:
+        - 1
+        - UNBOUNDED
+      feature_vdbe_0_subint_untr_vmi_1_vdbe_untr_1_subports:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.read.bytes.rate_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.write.bytes.rate_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      network.outpoing.packets_vdbe_0_untr_vmi_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      attachment_control_int_net:
+        type: tosca.capabilities.Attachment
+        occurrences:
+        - 1
+        - UNBOUNDED
+      cpu_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.device.write.requests.rate_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.read.requests_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      disk.write.bytes.rate_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+      memory.usage_vdbe_node_1:
+        type: org.openecomp.capabilities.metric.Ceilometer
+        description: A node type that includes the Metric capability indicates that it can be monitored using ceilometer.
+        occurrences:
+        - 1
+        - UNBOUNDED
+  org.openecomp.resource.abstract.nodes.heat.subinterface.nested_vlan:
+    derived_from: org.openecomp.resource.abstract.nodes.AbstractSubstitute
+    properties:
+      aap_untrusted_ip_prefix:
+        type: string
+        description: ip prefix for primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      aap_sec_untrusted_ip_prefix:
+        type: string
+        description: ip prefix for secondary vDBE VM aap on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      vdbe_subport_network:
+        type: string
+        description: List of Contrail VLAN networks to use for the subinterfaces.   The order and number of these must match the VLAN ID list
+        required: true
+        status: SUPPORTED
+      ip_v6_address:
+        type: string
+        description: IPv6 address associated with subinterfaces
+        required: true
+        status: SUPPORTED
+      counter:
+        type: float
+        description: Index of instance among multiple instances.  Use to retrieve correct parameter for this instance when passed all parameters for all instances.
+        required: true
+        status: SUPPORTED
+      subinterfaces_name_prefix:
+        type: string
+        description: Combined with subinterface_instance_index, this is used as the name of the subinterface resource
+        required: true
+        status: SUPPORTED
+      ip_address:
+        type: string
+        description: IPv4 address associated with subinterfaces
+        required: true
+        status: SUPPORTED
+      aap_address_mode:
+        type: string
+        description: Address mode for the vDBE cluster IP
+        required: true
+        status: SUPPORTED
+      aap_untrusted_v6_ip_prefix:
+        type: string
+        description: ipv6 prefix for the primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      parent_interface:
+        type: string
+        description: Parent Contrail interface
+        required: true
+        status: SUPPORTED
+      mac_address:
+        type: string
+        description: HW MAC address to use for subinterface
+        required: true
+        status: SUPPORTED
+      vlan_tag_list:
+        type: list
+        description: List of VLAN IDs to use for subinterfaces
+        required: true
+        status: SUPPORTED
+        entry_schema:
+          type: string
+      aap_sec_untrusted_ip_prefix_len:
+        type: string
+        description: ip prefix length for the secondary DBE VM aap on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      vmac_address:
+        type: string
+        description: virtual MAC address to use for subinterface
+        required: true
+        status: SUPPORTED
+      aap_untrusted_v6_ip_prefix_len:
+        type: string
+        description: ipv6 prefix length for the primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+      aap_untrusted_ip_prefix_len:
+        type: string
+        description: ip prefix length for the primary vDBE VM on the VAN untrusted network
+        required: true
+        status: SUPPORTED
+    requirements:
+    - dependency_vdbe_0_subint_untr_vmi_1:
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+        occurrences:
+        - 0
+        - UNBOUNDED
+    - link_vdbe_0_subint_untr_vmi_1:
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+        occurrences:
+        - 1
+        - 1
+    - binding_vdbe_0_subint_untr_vmi_1:
+        capability: tosca.capabilities.network.Bindable
+        node: org.openecomp.resource.cp.nodes.network.Port
+        relationship: tosca.relationships.network.BindsTo
+        occurrences:
+        - 1
+        - 1
+    capabilities:
+      feature_vdbe_0_subint_untr_vmi_1:
+        type: tosca.capabilities.Node
+        occurrences:
+        - 1
+        - UNBOUNDED
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/MainServiceTemplate.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/MainServiceTemplate.yaml
new file mode 100644 (file)
index 0000000..94f7b2f
--- /dev/null
@@ -0,0 +1,110 @@
+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
+topology_template:
+  inputs:
+    vf_module_id:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - main
+            source_type: HEAT
+            param_name: vf_module_id
+      type: string
+      description: Unique ID for this VF Module instance
+    vnf_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - main
+            source_type: HEAT
+            param_name: vnf_name
+      type: string
+      description: Unique name for this VF instance
+    tdcore_zone_0_count:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - main
+            source_type: HEAT
+            param_name: tdcore_zone_0_count
+      type: float
+      description: |
+        Number of TD Core VMs to be deployed zone 0. This parameter is used to scale the TD Core instances.
+      constraints:
+      - in_range:
+        - 0
+        - 8
+    untr_network_collection_function:
+      type: string
+      required: true
+    untr_vfc_instance_group_function:
+      type: string
+      required: true
+    vf_module_name:
+      hidden: false
+      immutable: false
+      annotations:
+        source:
+          type: org.openecomp.annotations.Source
+          properties:
+            vf_module_label:
+            - main
+            source_type: HEAT
+            param_name: vf_module_name
+      type: string
+      description: Unique name for this VF Module instance
+  node_templates:
+    tdcore_zone_0_RRG:
+      type: org.openecomp.resource.abstract.nodes.heat.vdbe
+      directives:
+      - substitutable
+      properties:
+        vf_module_id:
+          get_input: vf_module_id
+        service_template_filter:
+          substitute_service_template: nested_pattern4ServiceTemplate.yaml
+          count:
+            get_input: tdcore_zone_0_count
+          mandatory: false
+        vnf_name:
+          get_input: vnf_name
+        vf_module_name:
+          get_input: vf_module_name
+  groups:
+    main_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/main.yml
+        description: |
+          Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+      members:
+      - tdcore_zone_0_RRG
+    untr_group:
+      type: org.openecomp.groups.VfcInstanceGroup
+      properties:
+        vfc_parent_port_role: untr
+        network_collection_function:
+          get_input: untr_network_collection_function
+        vfc_instance_group_function:
+          get_input: untr_vfc_instance_group_function
+        subinterface_role: untr
+      members:
+      - tdcore_zone_0_RRG
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/nested_pattern4ServiceTemplate.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/nested_pattern4ServiceTemplate.yaml
new file mode 100644 (file)
index 0000000..2ba36df
--- /dev/null
@@ -0,0 +1,561 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+metadata:
+  template_name: nested_pattern4
+imports:
+- openecomp_heat_index:
+    file: openecomp-heat/_index.yml
+- GlobalSubstitutionTypes:
+    file: GlobalSubstitutionTypesServiceTemplate.yaml
+node_types:
+  org.openecomp.resource.vfc.compute.nodes.heat.vdbe:
+    derived_from: org.openecomp.resource.vfc.nodes.heat.nova.Server
+topology_template:
+  inputs:
+    vf_module_id:
+      hidden: false
+      immutable: false
+      type: string
+      description: Unique ID for this VF module inst
+    port_vdbe_0_untr_vmi_1_network_role_tag:
+      type: string
+      required: true
+    control_int_net_rpf:
+      hidden: false
+      immutable: false
+      type: string
+      description: Reverse Path Filtering enable or disable for the control virtual network
+    control_int_net_forwarding_mode:
+      hidden: false
+      immutable: false
+      type: string
+      description: forwarding mode of the control virtual network
+    vnf_name:
+      hidden: false
+      immutable: false
+      type: string
+      description: Unique name for this VF instance
+    vdbe_untrusted_ip_1:
+      hidden: false
+      immutable: false
+      type: string
+      description: IPV4 address of the secondary vDBE VM on the VAN untrusted network
+    vdbe_aap_untrusted_ip_prefix_len:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix length for the primary vDBE VM on the VAN untrusted network
+    port_vdbe_0_untr_vmi_1_vlan_requirements:
+      type: list
+      required: true
+      entry_schema:
+        type: org.openecomp.datatypes.network.VlanRequirements
+    untrusted_num_vn:
+      hidden: false
+      immutable: false
+      type: float
+      description: Number of vDBE subinterface virtual Networks
+      constraints:
+      - in_range:
+        - 1
+        - 77
+    vf_module_name:
+      hidden: false
+      immutable: false
+      type: string
+      description: Unique name for this VF module inst
+    aap_address_mode:
+      hidden: false
+      immutable: false
+      type: string
+      description: Address mode for the vDBE cluster IP
+    control_int_net_shared:
+      hidden: false
+      immutable: false
+      type: boolean
+      description: control virtual network shared
+    vdbe_untrusted_v6_ip_1:
+      hidden: false
+      immutable: false
+      type: string
+      description: IPV6 address of the secondary vDBE VM on the VAN untrusted network
+    vdbe_untrusted_vmac_address:
+      hidden: false
+      immutable: false
+      type: string
+      description: Virtual MAC of the primary vDBE VM on the VAN untrusted network
+    control_int_net_flood_unknown_unicast:
+      hidden: false
+      immutable: false
+      type: boolean
+      description: forwarding mode of the control virtual network
+    vdbe_aap_sec_untrusted_ip_prefix:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix for secondary vDBE VM aap on the VAN untrusted network
+    vnf_id:
+      hidden: false
+      immutable: false
+      type: string
+      description: Unique ID for this VF inst
+    port_vdbe_0_untr_vmi_1_order:
+      type: integer
+      required: true
+    vdbe_name_1:
+      hidden: false
+      immutable: false
+      type: string
+      description: VM Name for this vdbe node 1
+    availability_zone_1:
+      hidden: false
+      immutable: false
+      type: string
+      description: The availability zone of secondary node1 vDBE vm in the local HA pair.
+    port_vdbe_0_untr_vmi_1_mac_requirements:
+      type: org.openecomp.datatypes.network.MacRequirements
+      required: true
+    untrusted_vn_networks:
+      hidden: false
+      immutable: false
+      type: list
+      description: List of subinterface virtual networks
+      entry_schema:
+        type: string
+    vdbe_image_name:
+      hidden: false
+      immutable: false
+      type: string
+      description: Image to use for vDBE
+    oam_net_name:
+      hidden: false
+      immutable: false
+      type: string
+      description: Name of NSDNet network from which the management IP addresses will be allocated
+    vdbe_aap_sec_untrusted_ip_prefix_len:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix length for the secondary DBE VM aap on the VAN untrusted network
+    vdbe_aap_untrusted_v6_ip_prefix:
+      hidden: false
+      immutable: false
+      type: string
+      description: ipv6 prefix for the primary vDBE VM on the VAN untrusted network
+    vdbe_aap_untrusted_v6_ip_prefix_len:
+      hidden: false
+      immutable: false
+      type: string
+      description: ipv6 prefix length for the primary vDBE VM on the VAN untrusted network
+    untrusted_vlan_tags:
+      hidden: false
+      immutable: false
+      type: list
+      description: List of subinterface vlan tags
+      entry_schema:
+        type: string
+    port_vdbe_0_untr_vmi_1_subnetpoolid:
+      type: string
+      required: true
+    vdbe_flavor_name:
+      hidden: false
+      immutable: false
+      type: string
+      description: Flavor to use for vDBE
+    port_vdbe_0_untr_vmi_1_ip_requirements:
+      type: list
+      required: true
+      entry_schema:
+        type: org.openecomp.datatypes.network.IpRequirements
+    vdbe_hw_untr_mac_1:
+      hidden: false
+      immutable: false
+      type: string
+      description: Secondary MAC address of the secondary vDBE VM on the VAN untrusted network
+    untrusted_net_name:
+      hidden: false
+      immutable: false
+      type: string
+      description: Name of public untrusted network into which this vDBE HA cluster is deployed
+    vdbe_device_name:
+      hidden: false
+      immutable: false
+      type: string
+      description: VDBE device Name for this vdbe VNF
+    port_vdbe_0_untr_vmi_1_network_role:
+      type: string
+      required: true
+    vdbe_aap_untrusted_ip_prefix:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix for primary vDBE VM on the VAN untrusted network
+    port_vdbe_0_untr_vmi_1_exCP_naming:
+      type: org.openecomp.datatypes.Naming
+      required: true
+  node_templates:
+    vdbe_0_untr_vmi_1:
+      type: org.openecomp.resource.cp.nodes.heat.contrailV2.VirtualMachineInterface
+      properties:
+        ip_requirements:
+          get_input: port_vdbe_0_untr_vmi_1_ip_requirements
+        network_role:
+          get_input: port_vdbe_0_untr_vmi_1_network_role
+        subnetpoolid:
+          get_input: port_vdbe_0_untr_vmi_1_subnetpoolid
+        mac_requirements:
+          get_input: port_vdbe_0_untr_vmi_1_mac_requirements
+        name:
+          str_replace:
+            template: VM_NAMEDBE001p1n004
+            params:
+              DBE:
+                get_input: vdbe_device_name
+              VM_NAME:
+                get_input: vdbe_name_1
+        exCP_naming:
+          get_input: port_vdbe_0_untr_vmi_1_exCP_naming
+        virtual_network_refs:
+        - control_int_net
+        vlan_requirements:
+          get_input: port_vdbe_0_untr_vmi_1_vlan_requirements
+        virtual_machine_interface_allowed_address_pairs:
+          allowed_address_pair:
+          - address_mode:
+              get_input: aap_address_mode
+            ip:
+              ip_prefix:
+                get_input: vdbe_aap_untrusted_ip_prefix
+              ip_prefix_len:
+                get_input: vdbe_aap_untrusted_ip_prefix_len
+            mac:
+              get_input: vdbe_untrusted_vmac_address
+          - address_mode:
+              get_input: aap_address_mode
+            ip:
+              ip_prefix:
+                get_input: vdbe_aap_sec_untrusted_ip_prefix
+              ip_prefix_len:
+                get_input: vdbe_aap_sec_untrusted_ip_prefix_len
+            mac:
+              get_input: vdbe_hw_untr_mac_1
+          - address_mode:
+              get_input: aap_address_mode
+            ip:
+              ip_prefix:
+                get_input: vdbe_aap_untrusted_v6_ip_prefix
+              ip_prefix_len:
+                get_input: vdbe_aap_untrusted_v6_ip_prefix_len
+            mac:
+              get_input: vdbe_untrusted_vmac_address
+        network_role_tag:
+          get_input: port_vdbe_0_untr_vmi_1_network_role_tag
+        virtual_machine_interface_mac_addresses:
+        - get_input: vdbe_hw_untr_mac_1
+        order:
+          get_input: port_vdbe_0_untr_vmi_1_order
+      requirements:
+      - link:
+          capability: tosca.capabilities.network.Linkable
+          node: control_int_net
+          relationship: tosca.relationships.network.LinksTo
+      - binding:
+          capability: tosca.capabilities.network.Bindable
+          node: vdbe_node_1
+          relationship: tosca.relationships.network.BindsTo
+    vdbe_node_1:
+      type: org.openecomp.resource.vfc.compute.nodes.heat.vdbe
+      properties:
+        flavor:
+          get_input: vdbe_flavor_name
+        availability_zone:
+          get_input: availability_zone_1
+        image:
+          get_input: vdbe_image_name
+        metadata:
+          vf_module_id:
+            get_input: vf_module_id
+          vnf_id:
+            get_input: vnf_id
+          vnf_name:
+            get_input: vnf_name
+        name:
+          get_input: vdbe_name_1
+    vdbe_untr_1_subports:
+      type: org.openecomp.resource.abstract.nodes.heat.subinterface.nested_vlan
+      directives:
+      - substitutable
+      properties:
+        aap_untrusted_ip_prefix:
+          get_input: vdbe_aap_untrusted_ip_prefix
+        aap_sec_untrusted_ip_prefix:
+          get_input: vdbe_aap_sec_untrusted_ip_prefix
+        vdbe_subport_network: control_int_net
+        ip_v6_address:
+          get_input: vdbe_untrusted_v6_ip_1
+        counter:
+          get_property:
+          - SELF
+          - service_template_filter
+          - index_value
+        ip_address:
+          get_input: vdbe_untrusted_ip_1
+        subinterfaces_name_prefix:
+          str_replace:
+            template: VM_NAMEDBE001p1n004
+            params:
+              DBE:
+                get_input: vdbe_device_name
+              VM_NAME:
+                get_input: vdbe_name_1
+        aap_address_mode:
+          get_input: aap_address_mode
+        service_template_filter:
+          substitute_service_template: nested_vlanServiceTemplate.yaml
+          count:
+            get_input: untrusted_num_vn
+          mandatory: false
+        aap_untrusted_v6_ip_prefix:
+          get_input: vdbe_aap_untrusted_v6_ip_prefix
+        parent_interface: vdbe_0_untr_vmi_1
+        mac_address:
+          get_input: vdbe_hw_untr_mac_1
+        vlan_tag_list:
+          get_input: untrusted_vlan_tags
+        aap_sec_untrusted_ip_prefix_len:
+          get_input: vdbe_aap_sec_untrusted_ip_prefix_len
+        vmac_address:
+          get_input: vdbe_untrusted_vmac_address
+        aap_untrusted_v6_ip_prefix_len:
+          get_input: vdbe_aap_untrusted_v6_ip_prefix_len
+        aap_untrusted_ip_prefix_len:
+          get_input: vdbe_aap_untrusted_ip_prefix_len
+      requirements:
+      - link_vdbe_0_subint_untr_vmi_1:
+          capability: tosca.capabilities.network.Linkable
+          node: control_int_net
+          relationship: tosca.relationships.network.LinksTo
+      - binding_vdbe_0_subint_untr_vmi_1:
+          capability: tosca.capabilities.network.Bindable
+          node: vdbe_0_untr_vmi_1
+          relationship: tosca.relationships.network.BindsTo
+      - dependency:
+          capability: tosca.capabilities.Node
+          node: control_int_net
+          relationship: tosca.relationships.DependsOn
+    control_int_net:
+      type: org.openecomp.resource.vl.nodes.heat.network.contrailV2.VirtualNetwork
+      properties:
+        network_name:
+          str_replace:
+            template: VNF_NAME_control_net
+            params:
+              VNF_NAME:
+                get_input: vnf_name
+  groups:
+    nested_pattern4_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/nested_pattern4.yml
+        description: |
+          Version 2.0 02-09-2016 (Authors: John Doe, user PROD)
+      members:
+      - vdbe_0_untr_vmi_1
+      - vdbe_node_1
+      - vdbe_untr_1_subports
+      - control_int_net
+  substitution_mappings:
+    node_type: org.openecomp.resource.abstract.nodes.heat.vdbe
+    capabilities:
+      disk.latency_vdbe_node_1:
+      - vdbe_node_1
+      - disk.latency
+      binding_vdbe_node_1:
+      - vdbe_node_1
+      - binding
+      instance_vdbe_node_1:
+      - vdbe_node_1
+      - instance
+      network.outgoing.bytes_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.outgoing.bytes
+      disk.device.read.requests_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.read.requests
+      disk.device.usage_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.usage
+      binding_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - binding
+      forwarder_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - forwarder
+      disk.write.bytes_vdbe_node_1:
+      - vdbe_node_1
+      - disk.write.bytes
+      disk.device.write.bytes_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.write.bytes
+      disk.allocation_vdbe_node_1:
+      - vdbe_node_1
+      - disk.allocation
+      memory_vdbe_node_1:
+      - vdbe_node_1
+      - memory
+      cpu_util_vdbe_node_1:
+      - vdbe_node_1
+      - cpu_util
+      disk.device.read.bytes_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.read.bytes
+      network.incoming.bytes.rate_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.incoming.bytes.rate
+      disk.device.read.bytes.rate_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.read.bytes.rate
+      disk.device.allocation_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.allocation
+      disk.write.requests.rate_vdbe_node_1:
+      - vdbe_node_1
+      - disk.write.requests.rate
+      disk.root.size_vdbe_node_1:
+      - vdbe_node_1
+      - disk.root.size
+      disk.device.iops_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.iops
+      disk.device.write.requests_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.write.requests
+      disk.write.requests_vdbe_node_1:
+      - vdbe_node_1
+      - disk.write.requests
+      vcpus_vdbe_node_1:
+      - vdbe_node_1
+      - vcpus
+      disk.ephemeral.size_vdbe_node_1:
+      - vdbe_node_1
+      - disk.ephemeral.size
+      feature_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - feature
+      feature_vdbe_untr_1_subports:
+      - vdbe_untr_1_subports
+      - feature
+      network.incoming.packets_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.incoming.packets
+      disk.device.latency_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.latency
+      disk.capacity_vdbe_node_1:
+      - vdbe_node_1
+      - disk.capacity
+      disk.device.capacity_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.capacity
+      network.outgoing.packets.rate_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.outgoing.packets.rate
+      link_control_int_net:
+      - control_int_net
+      - link
+      end_point_control_int_net:
+      - control_int_net
+      - end_point
+      disk.usage_vdbe_node_1:
+      - vdbe_node_1
+      - disk.usage
+      disk.read.bytes_vdbe_node_1:
+      - vdbe_node_1
+      - disk.read.bytes
+      disk.device.read.requests.rate_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.read.requests.rate
+      host_vdbe_node_1:
+      - vdbe_node_1
+      - host
+      feature_control_int_net:
+      - control_int_net
+      - feature
+      network.incoming.bytes_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.incoming.bytes
+      cpu.delta_vdbe_node_1:
+      - vdbe_node_1
+      - cpu.delta
+      scalable_vdbe_node_1:
+      - vdbe_node_1
+      - scalable
+      disk.iops_vdbe_node_1:
+      - vdbe_node_1
+      - disk.iops
+      network.incoming.packets.rate_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.incoming.packets.rate
+      feature_vdbe_node_1:
+      - vdbe_node_1
+      - feature
+      memory.resident_vdbe_node_1:
+      - vdbe_node_1
+      - memory.resident
+      endpoint_vdbe_node_1:
+      - vdbe_node_1
+      - endpoint
+      network.outgoing.bytes.rate_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.outgoing.bytes.rate
+      os_vdbe_node_1:
+      - vdbe_node_1
+      - os
+      feature_vdbe_0_subint_untr_vmi_1_vdbe_untr_1_subports:
+      - vdbe_untr_1_subports
+      - feature_vdbe_0_subint_untr_vmi_1
+      disk.read.bytes.rate_vdbe_node_1:
+      - vdbe_node_1
+      - disk.read.bytes.rate
+      disk.device.write.bytes.rate_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.write.bytes.rate
+      network.outpoing.packets_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - network.outpoing.packets
+      attachment_control_int_net:
+      - control_int_net
+      - attachment
+      cpu_vdbe_node_1:
+      - vdbe_node_1
+      - cpu
+      disk.device.write.requests.rate_vdbe_node_1:
+      - vdbe_node_1
+      - disk.device.write.requests.rate
+      disk.read.requests_vdbe_node_1:
+      - vdbe_node_1
+      - disk.read.requests
+      disk.write.bytes.rate_vdbe_node_1:
+      - vdbe_node_1
+      - disk.write.bytes.rate
+      memory.usage_vdbe_node_1:
+      - vdbe_node_1
+      - memory.usage
+    requirements:
+      dependency_vdbe_0_untr_vmi_1:
+      - vdbe_0_untr_vmi_1
+      - dependency
+      dependency_vdbe_node_1:
+      - vdbe_node_1
+      - dependency
+      local_storage_vdbe_node_1:
+      - vdbe_node_1
+      - local_storage
+      dependency_vdbe_0_subint_untr_vmi_1_vdbe_untr_1_subports:
+      - vdbe_untr_1_subports
+      - dependency_vdbe_0_subint_untr_vmi_1
+      dependency_control_int_net:
+      - control_int_net
+      - dependency
+      dependency_vdbe_untr_1_subports:
+      - vdbe_untr_1_subports
+      - dependency
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/nested_vlanServiceTemplate.yaml b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/test/resources/mock/services/heattotosca/fulltest/subinterface/vlantagging/vfcInstanceGroup/pattern4SubInterfaceNodesConnectedOut/out/nested_vlanServiceTemplate.yaml
new file mode 100644 (file)
index 0000000..94e55fe
--- /dev/null
@@ -0,0 +1,171 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+metadata:
+  template_name: nested_vlan
+imports:
+- openecomp_heat_index:
+    file: openecomp-heat/_index.yml
+- GlobalSubstitutionTypes:
+    file: GlobalSubstitutionTypesServiceTemplate.yaml
+topology_template:
+  inputs:
+    aap_untrusted_ip_prefix:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix for primary vDBE VM on the VAN untrusted network
+    aap_sec_untrusted_ip_prefix:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix for secondary vDBE VM aap on the VAN untrusted network
+    vdbe_subport_network:
+      hidden: false
+      immutable: false
+      type: string
+      description: List of Contrail VLAN networks to use for the subinterfaces.   The order and number of these must match the VLAN ID list
+    ip_v6_address:
+      hidden: false
+      immutable: false
+      type: string
+      description: IPv6 address associated with subinterfaces
+    counter:
+      hidden: false
+      immutable: false
+      type: float
+      description: Index of instance among multiple instances.  Use to retrieve correct parameter for this instance when passed all parameters for all instances.
+    subinterfaces_name_prefix:
+      hidden: false
+      immutable: false
+      type: string
+      description: Combined with subinterface_instance_index, this is used as the name of the subinterface resource
+    ip_address:
+      hidden: false
+      immutable: false
+      type: string
+      description: IPv4 address associated with subinterfaces
+    aap_address_mode:
+      hidden: false
+      immutable: false
+      type: string
+      description: Address mode for the vDBE cluster IP
+    aap_untrusted_v6_ip_prefix:
+      hidden: false
+      immutable: false
+      type: string
+      description: ipv6 prefix for the primary vDBE VM on the VAN untrusted network
+    parent_interface:
+      hidden: false
+      immutable: false
+      type: string
+      description: Parent Contrail interface
+    mac_address:
+      hidden: false
+      immutable: false
+      type: string
+      description: HW MAC address to use for subinterface
+    vlan_tag_list:
+      hidden: false
+      immutable: false
+      type: list
+      description: List of VLAN IDs to use for subinterfaces
+      entry_schema:
+        type: string
+    aap_sec_untrusted_ip_prefix_len:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix length for the secondary DBE VM aap on the VAN untrusted network
+    vmac_address:
+      hidden: false
+      immutable: false
+      type: string
+      description: virtual MAC address to use for subinterface
+    aap_untrusted_v6_ip_prefix_len:
+      hidden: false
+      immutable: false
+      type: string
+      description: ipv6 prefix length for the primary vDBE VM on the VAN untrusted network
+    aap_untrusted_ip_prefix_len:
+      hidden: false
+      immutable: false
+      type: string
+      description: ip prefix length for the primary vDBE VM on the VAN untrusted network
+  node_templates:
+    vdbe_0_subint_untr_vmi_1:
+      type: org.openecomp.resource.cp.nodes.heat.network.contrailV2.VLANSubInterface
+      properties:
+        virtual_machine_interface_refs:
+        - get_input: parent_interface
+        name:
+          str_replace:
+            template: $NAME_$INDEX
+            params:
+              $NAME:
+                get_input: subinterfaces_name_prefix
+              $INDEX:
+                get_input:
+                - vlan_tag_list
+                - get_input: counter
+        virtual_network_refs:
+        - get_input: vdbe_subport_network
+        virtual_machine_interface_properties:
+          sub_interface_vlan_tag:
+            get_input:
+            - vlan_tag_list
+            - get_input: counter
+        virtual_machine_interface_allowed_address_pairs:
+          allowed_address_pair:
+          - address_mode:
+              get_input: aap_address_mode
+            ip:
+              ip_prefix:
+                get_input: aap_untrusted_ip_prefix
+              ip_prefix_len:
+                get_input: aap_untrusted_ip_prefix_len
+            mac:
+              get_input: vmac_address
+          - address_mode:
+              get_input: aap_address_mode
+            ip:
+              ip_prefix:
+                get_input: aap_sec_untrusted_ip_prefix
+              ip_prefix_len:
+                get_input: aap_sec_untrusted_ip_prefix_len
+            mac:
+              get_input: mac_address
+          - address_mode:
+              get_input: aap_address_mode
+            ip:
+              ip_prefix:
+                get_input: aap_untrusted_v6_ip_prefix
+              ip_prefix_len:
+                get_input: aap_untrusted_v6_ip_prefix_len
+            mac:
+              get_input: vmac_address
+        virtual_machine_interface_mac_addresses:
+          mac_address:
+          - get_input: mac_address
+  groups:
+    nested_vlan_group:
+      type: org.openecomp.groups.heat.HeatStack
+      properties:
+        heat_file: ../Artifacts/nested_vlan.yml
+        description: cmaui server template for vMMSC
+      members:
+      - vdbe_0_subint_untr_vmi_1
+  substitution_mappings:
+    node_type: org.openecomp.resource.abstract.nodes.heat.subinterface.nested_vlan
+    capabilities:
+      feature_vdbe_0_subint_untr_vmi_1:
+      - vdbe_0_subint_untr_vmi_1
+      - feature
+    requirements:
+      dependency_vdbe_0_subint_untr_vmi_1:
+      - vdbe_0_subint_untr_vmi_1
+      - dependency
+      binding_vdbe_0_subint_untr_vmi_1:
+      - vdbe_0_subint_untr_vmi_1
+      - binding
+      link_vdbe_0_subint_untr_vmi_1:
+      - vdbe_0_subint_untr_vmi_1
+      - link
\ No newline at end of file