Update group members ids 79/16979/6
authorvempo <vitaliy.emporopulo@amdocs.com>
Tue, 3 Oct 2017 17:04:37 +0000 (20:04 +0300)
committervempo <vitaliy.emporopulo@amdocs.com>
Tue, 3 Oct 2017 17:06:51 +0000 (20:06 +0300)
Issue-Id: SDC-427
Change-Id: If7a476adfac7c56c97e14330e4fddcc6d9f2d293
Signed-off-by: vempo <vitaliy.emporopulo@amdocs.com>
openecomp-be/lib/openecomp-heat-lib/src/main/java/org/openecomp/sdc/heat/services/tree/HeatTreeManager.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java
openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java
openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/filedatastructuremodule/CandidateServiceImpl.java
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaUtil.java

index 372c09c..df46ef0 100644 (file)
@@ -119,22 +119,19 @@ public class HeatTreeManager {
   }
 
 
-  private void handleHeatContentReference(String filename, HeatStructureTree fileHeatStructureTree,
+  private void handleHeatContentReference(HeatStructureTree fileHeatStructureTree,
                                           GlobalValidationContext globalContext) {
 
     String fileName = fileHeatStructureTree.getFileName();
-    InputStream fileContent = this.heatContentMap.getFileContent(fileName);
-    if (fileContent == null) {
-      return; // file exist in manifest but does not exist in zip
-    }
-    try {
+
+    try (InputStream fileContent = this.heatContentMap.getFileContent(fileName)) {
       HeatOrchestrationTemplate hot =
           new YamlUtil().yamlToObject(fileContent, HeatOrchestrationTemplate.class);
 
-      Set<String> nestedSet = HeatTreeManagerUtil.getNestedFiles(filename, hot, globalContext);
+      Set<String> nestedSet = HeatTreeManagerUtil.getNestedFiles(fileName, hot, globalContext);
       addHeatNestedFiles(fileHeatStructureTree, nestedSet);
 
-      Set<String> artifactSet = HeatTreeManagerUtil.getArtifactFiles(filename, hot, globalContext);
+      Set<String> artifactSet = HeatTreeManagerUtil.getArtifactFiles(fileName, hot, globalContext);
       addHeatArtifactFiles(fileHeatStructureTree, artifactSet);
     } catch (Exception ignore) { /* invalid yaml no need to process reference */
       logger.debug("",ignore);
@@ -224,7 +221,7 @@ public class HeatTreeManager {
         fileHeatStructureTree.setFileName(fileName);
         fileHeatStructureTree.setBase(fileData.getBase());
         fileHeatStructureTree.setType(type);
-        handleHeatContentReference(null, fileHeatStructureTree, null);
+        handleHeatContentReference(fileHeatStructureTree, null);
         parentHeatStructureTree.addHeatToHeatList(fileHeatStructureTree);
         if (fileData.getData() != null) {
           scanTree(fileName, fileData.getData());
@@ -244,6 +241,7 @@ public class HeatTreeManager {
           if (fileData.getData() != null) {
             scanTree(fileName, fileData.getData());
           }
+          handleHeatContentReference(childHeatStructureTree, null);
 
         } else if (FileData.Type.HEAT_VOL.equals(type)) {
           //parentHeatStructureTree.addVolumeFileToVolumeList(childHeatStructureTree);
@@ -251,6 +249,7 @@ public class HeatTreeManager {
           if (fileData.getData() != null) {
             scanTree(fileName, fileData.getData());
           }
+          handleHeatContentReference(childHeatStructureTree, null);
         } else if (FileData.Type.HEAT_ENV.equals(type)) {
           if (parentHeatStructureTree != null && parentHeatStructureTree.getFileName() != null) {
             parentHeatStructureTree.setEnv(childHeatStructureTree);
index 81ef3e0..c1f69cf 100644 (file)
@@ -86,6 +86,7 @@ import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypes
 import org.openecomp.sdc.translator.services.heattotosca.helper.FunctionTranslationHelper;
 import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaPropertyConverter;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -135,11 +136,15 @@ public class HeatToToscaUtil {
       return translatorOutput;
     }
 
-    InputStream structureFile = getHeatStructureTreeFile(fileNameContentMap);
-    heatToToscaTranslator.addExternalArtifacts(SdcCommon.HEAT_META, structureFile);
+    try (InputStream structureFile = getHeatStructureTreeFile(fileNameContentMap)) {
+      heatToToscaTranslator.addExternalArtifacts(SdcCommon.HEAT_META, structureFile);
 
-    mdcDataDebugMessage.debugExitMessage(null, null);
-    return heatToToscaTranslator.translate();
+      mdcDataDebugMessage.debugExitMessage(null, null);
+      return heatToToscaTranslator.translate();
+    } catch (IOException e) {
+      // rethrow as a RuntimeException to keep the signature backward compatible
+      throw new RuntimeException(e);
+    }
   }
 
 
index 43079f9..012be05 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.openecomp.sdc.translator.services.heattotosca;
 
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
 import org.openecomp.core.translator.datatypes.TranslatorOutput;
 import org.openecomp.core.utilities.file.FileUtils;
@@ -48,6 +49,7 @@ import org.openecomp.sdc.tosca.datatypes.model.TopologyTemplate;
 import org.openecomp.sdc.tosca.services.DataModelUtil;
 import org.openecomp.sdc.tosca.services.ToscaConstants;
 import org.openecomp.sdc.tosca.services.ToscaFileOutputService;
+import org.openecomp.sdc.tosca.services.ToscaUtil;
 import org.openecomp.sdc.tosca.services.YamlUtil;
 import org.openecomp.sdc.tosca.services.impl.ToscaFileOutputServiceCsarImpl;
 import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId;
@@ -213,17 +215,54 @@ public class TranslationService {
       groupDefinition.getProperties().put(Constants.DESCRIPTION_PROPERTY_NAME, hotDescription);
     }
     groupDefinition.setMembers(new ArrayList<>());
-    Map<String, Set<String>> heatStackGroupMembers = context.getHeatStackGroupMembers();
-    if (heatStackGroupMembers.get(fileName) == null) {
+    Set<String> heatStackGroupMembersIds = getHeatStackGroupMembers(fileName,
+        serviceTemplate, context);
+    if (CollectionUtils.isEmpty(heatStackGroupMembersIds)) {
       return; //not creating a group when no resources are present in the heat input
     }
-    groupDefinition.getMembers().addAll(heatStackGroupMembers.get(fileName));
+    groupDefinition.getMembers().addAll(heatStackGroupMembersIds);
     DataModelUtil
         .addGroupDefinitionToTopologyTemplate(serviceTemplate, heatStackGroupId, groupDefinition);
 
     mdcDataDebugMessage.debugExitMessage(null, null);
   }
 
+  private Set<String> getHeatStackGroupMembers(String heatFileName,
+                                                            ServiceTemplate serviceTemplate,
+                                                            TranslationContext context){
+
+    Map<String, Set<String>> heatStackGroupMembers = context.getHeatStackGroupMembers();
+    Set<String> groupMembers = MapUtils.isEmpty(heatStackGroupMembers) ? new HashSet<>()
+        : heatStackGroupMembers.get(heatFileName);
+
+    if(CollectionUtils.isEmpty(groupMembers)){
+      return new HashSet<>();
+    }
+
+    Set<String> updatedMembersIds = new HashSet<>();
+
+    groupMembers.forEach(member -> {
+      if (Objects.nonNull(DataModelUtil.getNodeTemplate(serviceTemplate, member))) {
+        updatedMembersIds.add(member);
+      } else {
+        updateSubstitutableGroupMemberId(heatFileName, serviceTemplate, updatedMembersIds);
+      }
+    });
+
+    return updatedMembersIds;
+  }
+
+  private void updateSubstitutableGroupMemberId(String heatFileName,
+                                                ServiceTemplate serviceTemplate,
+                                                Set<String> updatedMembersIds) {
+    Optional<String> substitutableGroupMemberId =
+        ToscaUtil.getSubstitutableGroupMemberId(heatFileName, serviceTemplate);
+
+    if (substitutableGroupMemberId.isPresent()) {
+      updatedMembersIds.add(substitutableGroupMemberId.get());
+    }
+  }
+
   private void translateInputParameters(ServiceTemplate serviceTemplate,
                                         HeatOrchestrationTemplate heatOrchestrationTemplate,
                                         FileData heatFileData, TranslationContext context,
index 26596b9..7c1dfdc 100644 (file)
@@ -198,6 +198,16 @@ public class DataModelUtil {
     mdcDataDebugMessage.debugExitMessage(null, null);
   }
 
+  public static Map<String, NodeTemplate> getNodeTemplates(ServiceTemplate serviceTemplate){
+    if (Objects.isNull(serviceTemplate)
+        || Objects.isNull(serviceTemplate.getTopology_template())
+        || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates())){
+      return new HashMap<>();
+    }
+
+    return serviceTemplate.getTopology_template().getNode_templates();
+  }
+
   /**
    * Add node template.
    *
index f3bf328..3b7db49 100644 (file)
 
 package org.openecomp.sdc.tosca.services;
 
+import org.apache.commons.collections4.MapUtils;
+import org.openecomp.core.utilities.file.FileUtils;
+import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.UUID;
 
 /**
@@ -50,7 +56,7 @@ public class ToscaUtil {
   /**
    * Gets service template file name.
    *
-   * @param metaData the file name
+   * @param metadata the file name
    * @return the service template file name
    */
   public static String getServiceTemplateFileName(Map<String, String> metadata) {
@@ -63,6 +69,50 @@ public class ToscaUtil {
 
   }
 
+  public static Optional<String> getSubstitutableGroupMemberId(String heatFileName,
+                                                         ServiceTemplate serviceTemplate){
+
+    Map<String, NodeTemplate> nodeTemplates =
+        DataModelUtil.getNodeTemplates(serviceTemplate);
+
+    if(MapUtils.isEmpty(nodeTemplates)){
+      return Optional.empty();
+    }
+
+    String heatFileNameWithoutExt = FileUtils.getFileWithoutExtention(heatFileName);
+
+    for(Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()){
+      String subServiceTemplateName =
+          getSubstitutionServiceTemplateNameFromProperties(nodeTemplateEntry);
+
+      if(Objects.nonNull(subServiceTemplateName)
+          && isGroupMemberIdSubstitutable(heatFileNameWithoutExt, subServiceTemplateName)){
+        return Optional.of(nodeTemplateEntry.getKey());
+      }
+    }
+
+    return Optional.empty();
+  }
+
+  private static boolean isGroupMemberIdSubstitutable(String heatFileNameWithoutExt,
+                                                      String subServiceTemplateName) {
+    return subServiceTemplateName.startsWith(heatFileNameWithoutExt);
+  }
+
+  private static String getSubstitutionServiceTemplateNameFromProperties(
+      Map.Entry<String, NodeTemplate> nodeTemplateEntry) {
+    Map<String, Object> properties =
+        nodeTemplateEntry.getValue().getProperties() == null ? Collections.emptyMap() :
+            nodeTemplateEntry.getValue().getProperties();
+
+    Map<String, Object> serviceTemplateFilter =
+        properties.containsKey(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME)?
+            (Map<String, Object>) properties.get(ToscaConstants
+                .SERVICE_TEMPLATE_FILTER_PROPERTY_NAME) : Collections.emptyMap();
+
+    return (String) serviceTemplateFilter.get(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME);
+  }
+
 
   /**
    * Add service template to map with key file name.