VLAN tagging - VFC Instance Group
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / UnifiedCompositionService.java
index ae48ccf..f064fb6 100644 (file)
@@ -16,6 +16,9 @@
 
 package org.openecomp.sdc.translator.services.heattotosca;
 
+import static org.openecomp.sdc.tosca.datatypes.ToscaFunctions.GET_INPUT;
+import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.GROUP_TYPE_PREFIX;
+import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.VFC_INSTANCE_GROUP;
 import static org.openecomp.sdc.tosca.services.DataModelUtil.getClonedObject;
 import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity.COMPUTE;
 import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity.PORT;
@@ -23,8 +26,11 @@ import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.co
 import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX;
 import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX;
 import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX;
+import static org.openecomp.sdc.translator.services.heattotosca.Constants.GROUP;
 import static org.openecomp.sdc.translator.services.heattotosca.Constants.PORT_IDENTICAL_VALUE_PROPERTY_PREFIX;
 import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_PROPERTY_VALUE_PREFIX;
+import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_ROLE;
+import static org.openecomp.sdc.translator.services.heattotosca.Constants.VFC_PARENT_PORT_ROLE;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getComputeTypeSuffix;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getConnectedComputeConsolidationData;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewComputeNodeTemplateId;
@@ -34,6 +40,7 @@ import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositi
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTemplateConsolidationDataList;
 import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTypeSuffix;
 
+import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.commons.collections4.CollectionUtils;
@@ -268,6 +275,92 @@ public class UnifiedCompositionService {
 
   }
 
+  public void createVfcInstanceGroup(String abstractNodeTemplateId,
+                                     ServiceTemplate serviceTemplate,
+                                     List<UnifiedCompositionData> unifiedCompositionDataList,
+                                     TranslationContext context) {
+    if (!TranslationContext.isVfcInstanceGroupingEnabled()) {
+      return;
+    }
+    for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
+      List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
+          getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData);
+      if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) {
+        createVfcInstanceGroupPerSubInterface(abstractNodeTemplateId, serviceTemplate,
+            subInterfaceTemplateConsolidationDataList, context);
+      }
+    }
+  }
+
+  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;
+      }
+      String vfcNetworkRoleGroupId = getVfcNetworkRoleGroupId(subInterfaceNetworkRole);
+      Map<String, GroupDefinition> groups = DataModelUtil.getGroups(serviceTemplate);
+      if (!groups.containsKey(vfcNetworkRoleGroupId)) {
+        createNewVfcInstanceGroup(serviceTemplate, subInterfacePortTemplateConsolidationData,
+            subInterfaceNetworkRole, vfcNetworkRoleGroupId);
+      }
+      DataModelUtil.addGroupMember(serviceTemplate, vfcNetworkRoleGroupId, abstractNodeTemplateId);
+    }
+  }
+
+  private void createNewVfcInstanceGroup(ServiceTemplate serviceTemplate,
+                                         PortTemplateConsolidationData portTemplate,
+                                         String subInterfaceNetworkRole,
+                                         String vfcNetworkRoleGroupId) {
+    Map<String, Object> properties = new HashMap<>();
+    properties.put(SUB_INTERFACE_ROLE, subInterfaceNetworkRole);
+    properties.put(VFC_PARENT_PORT_ROLE, portTemplate.getNetworkRole());
+
+    updateVfcInstanceGroupExposedProperties(subInterfaceNetworkRole,
+        serviceTemplate, properties);
+
+    GroupDefinition groupDefinition = new GroupDefinition();
+    groupDefinition.setType(GROUP_TYPE_PREFIX + VFC_INSTANCE_GROUP);
+    groupDefinition.setProperties(properties);
+
+    DataModelUtil.addGroupDefinitionToTopologyTemplate(serviceTemplate,
+        vfcNetworkRoleGroupId, groupDefinition);
+  }
+
+  private void updateVfcInstanceGroupExposedProperties(String subInterfaceNetworkRole,
+                                                       ServiceTemplate serviceTemplate,
+                                                       Map<String, Object> properties) {
+    List<String> exposedVfcInstanceGroupingProperties =
+        TranslationContext.getExposedVfcInstanceGroupingProperties();
+
+    if (CollectionUtils.isEmpty(exposedVfcInstanceGroupingProperties)) {
+      return;
+    }
+
+    for (String propertyName : exposedVfcInstanceGroupingProperties) {
+      Map<String, Object> getInputMap = new HashMap<>();
+      String vfcGroupPropertyInputName = subInterfaceNetworkRole + "_" + propertyName;
+      getInputMap.put(GET_INPUT.getDisplayName(), vfcGroupPropertyInputName);
+      properties.put(propertyName, getInputMap);
+
+      addInputParameter(vfcGroupPropertyInputName, PropertyType.STRING.getDisplayName(), null,
+          serviceTemplate);
+    }
+  }
+
+  private String getVfcNetworkRoleGroupId(String subInterfaceNetworkRole) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(subInterfaceNetworkRole).append("_").append(GROUP);
+    return sb.toString();
+  }
+
   /**
    * Update the connectivity from/to the "moved" nodes from the original service template to the new
    * substitution service template.
@@ -2612,7 +2705,7 @@ public class UnifiedCompositionService {
       case SUB_INTERFACE:
         String subInterfaceType = getSubInterfaceTypeSuffix(nodeTemplate.getType());
         if (Objects.isNull(portTemplateConsolidationData)
-                || isSubInterfaceNodeTemplateIdParameter(portTemplateConsolidationData, nodeTemplate)) {
+                || portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(nodeTemplate.getType())) {
           paramterId = UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_"
                   + nodeTemplateId + "_" + propertyId;
         } else {
@@ -2626,14 +2719,6 @@ public class UnifiedCompositionService {
     return paramterId;
   }
 
-  private boolean isSubInterfaceNodeTemplateIdParameter(PortTemplateConsolidationData portTemplateConsolidationData,
-                                                        NodeTemplate nodeTemplate) {
-    List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
-            portTemplateConsolidationData.getSubInterfaceConsolidationData(nodeTemplate.getType());
-    return (Objects.nonNull(subInterfaceTemplateConsolidationDataList)
-            && subInterfaceTemplateConsolidationDataList.size() > 1) ;
-  }
-
   private void removeConnectivityOut(EntityConsolidationData entityConsolidationData,
                                      NodeTemplate nodeTemplate) {
     if (MapUtils.isEmpty(entityConsolidationData.getNodesConnectedOut())) {
@@ -2966,7 +3051,9 @@ public class UnifiedCompositionService {
             getPortTemplateConsolidationDataList(unifiedCompositionData);
     for (PortTemplateConsolidationData portTemplateConsolidationData :
             portTemplateConsolidationDataList) {
-      subInterfaceTypes.addAll(portTemplateConsolidationData.getAllSubInterfaceNodeTypes());
+      ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create();
+      portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity);
+      subInterfaceTypes.addAll(subInterfaceTypeToEntity.keySet());
     }
 
     if (subInterfaceTypes.stream().map(UnifiedCompositionUtil::getSubInterfaceTypeSuffix)