}
- 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);
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());
if (fileData.getData() != null) {
scanTree(fileName, fileData.getData());
}
+ handleHeatContentReference(childHeatStructureTree, null);
} else if (FileData.Type.HEAT_VOL.equals(type)) {
//parentHeatStructureTree.addVolumeFileToVolumeList(childHeatStructureTree);
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);
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;
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);
+ }
}
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;
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;
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,
handleArtifactsFromTree(volume, structure);
module.setVol(volume.getFileName());
handleEnv(module, volume, true, structure);
+ addNestedToFileDataStructure(volume, structure);
}
mdcDataDebugMessage.debugExitMessage(null);
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.
*
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;
/**
/**
* 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) {
}
+ 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.