From b8e2faf476202b6ffe61bc3a9a37df1304881d40 Mon Sep 17 00:00:00 2001 From: Avi Ziv Date: Tue, 18 Jul 2017 19:45:38 +0300 Subject: [SDC] Onboarding 1710 rebase. Change-Id: If3b6b81d221fde13908f1e8160db6f7d9433c535 Signed-off-by: Avi Ziv --- .../datatypes/heattotosca/TranslationContext.java | 116 +++- .../composition/UnifiedSubstitutionData.java | 50 +- .../consolidation/ConsolidationData.java | 28 - .../heattotosca/ConsolidationDataUtil.java | 10 +- .../heattotosca/ConsolidationEntityType.java | 33 +- .../services/heattotosca/ConsolidationService.java | 83 +-- .../services/heattotosca/HeatToToscaUtil.java | 289 ++------- .../services/heattotosca/TranslationService.java | 15 +- .../heattotosca/UnifiedCompositionManager.java | 97 ++- .../heattotosca/UnifiedCompositionService.java | 716 +++++++++++++-------- .../heattotosca/UnifiedCompositionUtil.java | 2 - .../globaltypes/GlobalTypesGenerator.java | 17 + .../globaltypes/GlobalTypesServiceTemplates.java | 2 +- .../helper/VolumeTranslationHelper.java | 2 +- .../FunctionTranslationGetAttrImpl.java | 2 +- .../BaseResourceConnection.java | 2 +- ...urceTranslationContrailServiceInstanceImpl.java | 2 +- .../ResourceTranslationNovaServerImpl.java | 3 +- .../UnifiedCompositionCatalogInstance.java | 44 +- .../UnifiedCompositionNestedSingleCompute.java | 11 +- .../UnifiedCompositionScalingInstances.java | 13 +- .../UnifiedCompositionSingleSubstitution.java | 19 +- 22 files changed, 848 insertions(+), 708 deletions(-) (limited to 'openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main') diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java index 7401ac5f2c..0e6610d5cd 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java @@ -42,6 +42,8 @@ import org.openecomp.sdc.translator.services.heattotosca.NameExtractor; import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -68,8 +70,8 @@ public class TranslationContext { config.generateMap(ConfigConstants.MAPPING_NAMESPACE, ConfigConstants.RESOURCE_MAPPING_KEY); try { globalServiceTemplates = GlobalTypesGenerator.getGlobalTypesServiceTemplate(); - } catch (Exception e) { - throw new RuntimeException("Failed to load GlobalTypes", e); + } catch (Exception exc) { + throw new RuntimeException("Failed to load GlobalTypes", exc); } nameExtractorImplMap = config.populateMap(ConfigConstants.TRANSLATOR_NAMESPACE, ConfigConstants.NAMING_CONVENTION_EXTRACTOR_IMPL_KEY, ImplementationConfiguration.class); @@ -85,7 +87,6 @@ public class TranslationContext { } - private Map unifiedSubstitutionData = new HashMap<>(); private ManifestFile manifest; public static List getEnrichPortResourceProperties() { @@ -114,6 +115,8 @@ public class TranslationContext { private Map> usedHeatPseudoParams = new HashMap<>(); //Consolidation data gathered for Unified TOSCA model private ConsolidationData consolidationData = new ConsolidationData(); + private Map unifiedSubstitutionData = new HashMap<>(); + private Set unifiedHandledServiceTemplates = new HashSet<>(); public static Map getSupportedConsolidationComputeResources() { @@ -184,20 +187,23 @@ public class TranslationContext { public Optional getUnifiedNestedNodeTemplateId(String serviceTemplateName, String nestedNodeTemplateId) { return this.unifiedSubstitutionData.get(serviceTemplateName) == null ? Optional.empty() - :this.unifiedSubstitutionData.get(serviceTemplateName).getUnifiedNestedNodeTemplateId(nestedNodeTemplateId); + : this.unifiedSubstitutionData.get(serviceTemplateName) + .getUnifiedNestedNodeTemplateId(nestedNodeTemplateId); } public void addUnifiedNestedNodeTypeId(String serviceTemplateName, - String nestedNodeTypeId, - String unifiedNestedNodeTypeId){ + String nestedNodeTypeId, + String unifiedNestedNodeTypeId) { this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); - this.unifiedSubstitutionData.get(serviceTemplateName).addUnifiedNestedNodeTypeId(nestedNodeTypeId, unifiedNestedNodeTypeId); + this.unifiedSubstitutionData.get(serviceTemplateName) + .addUnifiedNestedNodeTypeId(nestedNodeTypeId, unifiedNestedNodeTypeId); } public Optional getUnifiedNestedNodeTypeId(String serviceTemplateName, String nestedNodeTemplateId) { return this.unifiedSubstitutionData.get(serviceTemplateName) == null ? Optional.empty() - : this.unifiedSubstitutionData.get(serviceTemplateName).getUnifiedNestedNodeTypeId(nestedNodeTemplateId); + : this.unifiedSubstitutionData.get(serviceTemplateName) + .getUnifiedNestedNodeTypeId(nestedNodeTemplateId); } public ConsolidationData getConsolidationData() { @@ -323,7 +329,7 @@ public class TranslationContext { } private void addHeatSharedResourcesByParam(String parameterName, - TranslatedHeatResource translatedHeatResource) { + TranslatedHeatResource translatedHeatResource) { this.heatSharedResourcesByParam.put(parameterName, translatedHeatResource); } @@ -385,9 +391,10 @@ public class TranslationContext { * @param substitutionServiceTemplateNodeTemplateId the node template id in the substitution * service template */ - public void addSubstitutionServiceTemplateUnifiedSubstitutionData(String serviceTemplateFileName, - String originalNodeTemplateId, - String substitutionServiceTemplateNodeTemplateId) { + public void addSubstitutionServiceTemplateUnifiedSubstitutionData( + String serviceTemplateFileName, + String originalNodeTemplateId, + String substitutionServiceTemplateNodeTemplateId) { Map nodesRelatedSubstitutionServiceTemplateNodeTemplateIdMap = this .getUnifiedSubstitutionData() @@ -433,22 +440,49 @@ public class TranslationContext { } public int getHandledNestedComputeNodeTemplateIndex(String serviceTemplateName, - String computeType){ + String computeType) { return this.unifiedSubstitutionData.get(serviceTemplateName) .getHandledNestedComputeNodeTemplateIndex(computeType); } public void updateHandledComputeType(String serviceTemplateName, - String nestedServiceTemplateFileName, - String handledComputeType){ + String handledComputeType, + String nestedServiceTemplateFileName) { + String globalSTName = + ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + this.unifiedSubstitutionData.putIfAbsent( + globalSTName, new UnifiedSubstitutionData()); + this.unifiedSubstitutionData.get(globalSTName) + .addHandledComputeType(handledComputeType); + this.unifiedSubstitutionData.get(globalSTName).addHandlesNestedServiceTemplate(nestedServiceTemplateFileName); + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); - this.unifiedSubstitutionData.get(serviceTemplateName) - .addHandledComputeType(nestedServiceTemplateFileName, handledComputeType); + this.unifiedSubstitutionData.get(serviceTemplateName).addHandlesNestedServiceTemplate(nestedServiceTemplateFileName); + } + + public void addHandledComputeTypeInServiceTemplate(String serviceTemplateName, + String handledComputeType){ + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + this.unifiedSubstitutionData.get(serviceTemplateName).addHandledComputeType(handledComputeType); + } + + public boolean isComputeTypeHandledInServiceTemplate(String serviceTemplateName, + String computeType) { + return !Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName)) + && this.unifiedSubstitutionData.get(serviceTemplateName) + .isComputeTypeHandledInServiceTemplate(computeType); + } + + public int getHandledNestedComputeNodeTemplateIndex(String serviceTemplateName, + String nestedServiceTemplateName, + String computeType){ + return this.unifiedSubstitutionData.get(serviceTemplateName) + .getHandledNestedComputeNodeTemplateIndex(computeType); } public boolean isNestedServiceTemplateWasHandled(String serviceTemplateName, - String nestedServiceTemplateFileName){ - if(Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName))){ + String nestedServiceTemplateFileName) { + if (Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName))) { return false; } return this.unifiedSubstitutionData.get(serviceTemplateName) @@ -465,18 +499,48 @@ public class TranslationContext { return this.unifiedSubstitutionData.get(globalName).getAllRelatedNestedNodeTypeIds(); } - public void addNestedFileToUsedNestedComputeType(String serviceTemplateName, - String nestedServiceTemplateFileName, - String computeType){ + public boolean isUnifiedHandledServiceTemplate(ServiceTemplate serviceTemplate) { + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + if (unifiedHandledServiceTemplates.contains(serviceTemplateFileName)) { + return true; + } + return false; + } + + + + public void addUnifiedHandledServiceTeamplte(ServiceTemplate serviceTemplate) { + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + this.unifiedHandledServiceTemplates.add(serviceTemplateFileName); + } + + public boolean isNestedNodeWasHandled(String serviceTemplateName, + String nestedNodeTemplateId) { + if (Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName))) { + return false; + } + return this.unifiedSubstitutionData.get(serviceTemplateName) + .isNestedNodeWasHandled(nestedNodeTemplateId); + } + + public void addNestedNodeAsHandled(String serviceTemplateName, + String nestedNodeTemplateId) { this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + this.unifiedSubstitutionData.get(serviceTemplateName) + .addHandledNestedNodes(nestedNodeTemplateId); + } - this.unifiedSubstitutionData.get(serviceTemplateName).addNestedFileToUsedNestedComputeType - (computeType, nestedServiceTemplateFileName); + public void updateUsedTimesForNestedComputeNodeType(String serviceTemplateName, + String computeType) { + this.unifiedSubstitutionData.putIfAbsent(serviceTemplateName, new UnifiedSubstitutionData()); + + this.unifiedSubstitutionData.get(serviceTemplateName) + .updateUsedTimesForNestedComputeNodeType(computeType); } public int getGlobalNodeTypeIndex(String serviceTemplateName, - String computeType){ - if(Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName))){ + String computeType) { + if (Objects.isNull(this.unifiedSubstitutionData.get(serviceTemplateName))) { return 0; } return this.unifiedSubstitutionData.get(serviceTemplateName).getGlobalNodeTypeIndex diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedSubstitutionData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedSubstitutionData.java index c7fb7bb75a..7b461d2903 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedSubstitutionData.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/composition/UnifiedSubstitutionData.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -25,11 +26,13 @@ public class UnifiedSubstitutionData { private Map handledComputeTypesInNestedSubstitutionTemplate = new HashMap<>(); //Key - nested compute type, Value - list of nested files that the compute type is present - private Map> handledNestedComputeTypesNestedFiles = new HashMap<>(); + private Map handledNestedComputeTypesNestedFiles = new HashMap<>(); //Key - new property id, Value - orig property value private Map newParameterIdsToPropertiesFromOrigNodeTemplate = new HashMap<>(); //handled nested files private Set handledNestedFiles = new HashSet<>(); + //handled nested nodes + private Set handledNestedNodes = new HashSet<>(); public Map getNodesRelatedAbstractNode() { return nodesRelatedAbstractNode; @@ -40,6 +43,10 @@ public class UnifiedSubstitutionData { this.nodesRelatedAbstractNode = nodesRelatedAbstractNode; } + public void addHandledNestedNodes(String handledNestedNodeId) { + this.handledNestedNodes.add(handledNestedNodeId); + } + public Map getNodesRelatedSubstitutionServiceTemplateNode() { return nodesRelatedSubstitutionServiceTemplateNode; } @@ -114,8 +121,7 @@ public class UnifiedSubstitutionData { return new HashSet<>(this.nestedNodeTypeRelatedUnifiedTranslatedId.values()); } - public void addHandledComputeType(String nestedServiceTemplateFileName, - String handledComputeType) { + public void addHandledComputeType(String handledComputeType) { if (this.handledComputeTypesInNestedSubstitutionTemplate.containsKey(handledComputeType)) { Integer timesHandled = @@ -123,7 +129,7 @@ public class UnifiedSubstitutionData { this.handledComputeTypesInNestedSubstitutionTemplate .put(handledComputeType, timesHandled + 1); } else { - this.handledNestedFiles.add(nestedServiceTemplateFileName); + //this.handledNestedFiles.add(nestedServiceTemplateFileName); handledComputeTypesInNestedSubstitutionTemplate.put(handledComputeType, 0); } } @@ -134,23 +140,38 @@ public class UnifiedSubstitutionData { public int getHandledNestedComputeNodeTemplateIndex(String computeType) { return this.handledComputeTypesInNestedSubstitutionTemplate.containsKey(computeType) ? - this.handledComputeTypesInNestedSubstitutionTemplate.get(computeType): - 0; + this.handledComputeTypesInNestedSubstitutionTemplate.get(computeType) : 0; + } + + public void addHandlesNestedServiceTemplate(String nestedServiceTemplateFileName){ + this.handledNestedFiles.add(nestedServiceTemplateFileName); } public boolean isNestedServiceTemplateWasHandled(String nestedServiceTemplateFileName) { return this.handledNestedFiles.contains(nestedServiceTemplateFileName); } - public void addNestedFileToUsedNestedComputeType(String computeType, - String nestedServiceTemplateFileName){ - this.handledNestedComputeTypesNestedFiles.putIfAbsent(computeType, new HashSet<>()); - this.handledNestedComputeTypesNestedFiles.get(computeType).add(nestedServiceTemplateFileName); + public void updateUsedTimesForNestedComputeNodeType(String computeType) { + this.handledNestedComputeTypesNestedFiles.putIfAbsent(computeType, 0); + + Integer usedNumber = this.handledNestedComputeTypesNestedFiles.get(computeType); + this.handledNestedComputeTypesNestedFiles.put(computeType, usedNumber + 1); + + } + + public int getGlobalNodeTypeIndex(String computeType) { + return Objects.isNull(this.handledNestedComputeTypesNestedFiles.get(computeType)) + || this.handledNestedComputeTypesNestedFiles.get(computeType)== 0 ? 0 + : this.handledNestedComputeTypesNestedFiles.get(computeType); } - public int getGlobalNodeTypeIndex(String computeType){ - return this.handledNestedComputeTypesNestedFiles.get(computeType).size() == 1 ? 0: - this.handledNestedComputeTypesNestedFiles.get(computeType).size() - 1; + public boolean isNestedNodeWasHandled(String nestedNodeId) { + return this.handledNestedNodes.contains(nestedNodeId); + } + + + public Map getAllNewPropertyInputParamIds(){ + return this.newParameterIdsToPropertiesFromOrigNodeTemplate; } public void addNewPropertyIdToNodeTemplate(String newPropertyId, @@ -168,7 +189,4 @@ public class UnifiedSubstitutionData { return Optional.of(newParameterIdsToPropertiesFromOrigNodeTemplate.get(newPropertyId)); } - public Map getAllNewPropertyInputParamIds(){ - return this.newParameterIdsToPropertiesFromOrigNodeTemplate; - } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ConsolidationData.java index 496da78f76..20cc3be3cd 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ConsolidationData.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/ConsolidationData.java @@ -1,9 +1,5 @@ package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - /** * The type Consolidation data. */ @@ -15,11 +11,6 @@ public class ConsolidationData { //Port Consolidation data private PortConsolidationData portConsolidationData; - //Key - Service Template file name - //value - List of the abstract/substitute node template id - private Map> substituteNodeTemplates; // todo - remove this one and use - // nestedConsolidationData instead - //Nested Consolidation data private NestedConsolidationData nestedConsolidationData; @@ -31,7 +22,6 @@ public class ConsolidationData { computeConsolidationData = new ComputeConsolidationData(); portConsolidationData = new PortConsolidationData(); nestedConsolidationData = new NestedConsolidationData(); - substituteNodeTemplates = new HashMap<>(); } /** @@ -71,24 +61,6 @@ public class ConsolidationData { this.portConsolidationData = portConsolidationData; } - /** - * Gets substitute node templates. - * - * @return the substitute node templates - */ - public Map> getSubstituteNodeTemplates() { - return substituteNodeTemplates; - } - - /** - * Sets substitute node templates. - * - * @param substituteNodeTemplates the substitute node templates - */ - public void setSubstituteNodeTemplates(Map> substituteNodeTemplates) { - this.substituteNodeTemplates = substituteNodeTemplates; - } - /** * Gets nested consolidation data. * diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java index 148e754cfd..4e92372b7e 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java @@ -271,10 +271,7 @@ public class ConsolidationDataUtil { targetResource, translateTo.getContext()); // Add resource dependency information in nodesConnectedIn if the target node // is a consolidation entity - if (isConsolidationEntity(consolidationEntityType.getTargetEntityType()) - && HeatToToscaUtil - .isValidDependsOnCandidate(heatOrchestrationTemplate, sourceResource, - targetResource, consolidationEntityType, translationContext)) { + if (isConsolidationEntity(consolidationEntityType.getTargetEntityType())) { ConsolidationDataUtil.updateNodesConnectedIn(translateTo, nodeTemplateId, consolidationEntityType.getTargetEntityType(), targetResourceId, requirementId, requirementAssignment); @@ -282,10 +279,7 @@ public class ConsolidationDataUtil { //Add resource dependency information in nodesConnectedOut if the source node //is a consolidation entity - if (isConsolidationEntity(consolidationEntityType.getSourceEntityType()) - && HeatToToscaUtil - .isValidDependsOnCandidate(heatOrchestrationTemplate, sourceResource, - targetResource, consolidationEntityType, translationContext)) { + if (isConsolidationEntity(consolidationEntityType.getSourceEntityType())) { ConsolidationDataUtil.updateNodesConnectedOut(translateTo, requirementAssignment.getNode(), consolidationEntityType.getSourceEntityType(), requirementId, requirementAssignment); diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationEntityType.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationEntityType.java index c2de58fd5a..8e6e9024fb 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationEntityType.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationEntityType.java @@ -1,19 +1,12 @@ package org.openecomp.sdc.translator.services.heattotosca; -import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isComputeResource; -import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isPortResource; -import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isVolumeResource; - -import org.apache.commons.lang3.ObjectUtils; -import org.openecomp.core.utilities.yaml.YamlUtil; -import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; -import java.util.Collection; -import java.util.Objects; -import java.util.Optional; +import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isComputeResource; +import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isPortResource; +import static org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil.isVolumeResource; /** * The enum Entity type. @@ -23,6 +16,8 @@ public enum ConsolidationEntityType { PORT, VOLUME, NESTED, + //Simple nested VFC (nested file with one compute) or a complex VFC (nested ST with more than + //one compute) VFC_NESTED, SUB_PORT, OTHER; @@ -64,21 +59,11 @@ public enum ConsolidationEntityType { } else if (isVolumeResource(resource)) { return ConsolidationEntityType.VOLUME; } else if (HeatToToscaUtil.isNestedResource(resource)) { - Optional nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource); - if (nestedHeatFileName.isPresent()) { - HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() - .yamlToObject(context.getFileContent(nestedHeatFileName.get()), - HeatOrchestrationTemplate.class); - if (Objects.nonNull(nestedHeatOrchestrationTemplate.getResources())) { - for (String innerResourceId : nestedHeatOrchestrationTemplate.getResources().keySet()) { - if (ConsolidationDataUtil - .isComputeResource(nestedHeatOrchestrationTemplate, innerResourceId)) { - return ConsolidationEntityType.VFC_NESTED; - } - } - } + if (HeatToToscaUtil.isNestedVfcResource(resource, context)) { + return ConsolidationEntityType.VFC_NESTED; + } else { + return ConsolidationEntityType.NESTED; } - return ConsolidationEntityType.NESTED; } else { return ConsolidationEntityType.OTHER; } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java index 9566e222ff..16a6301968 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java @@ -48,8 +48,8 @@ public class ConsolidationService { } - void mainServiceTemplateConsolidation(ServiceTemplate serviceTemplate, - TranslationContext translationContext) { + void serviceTemplateConsolidation(ServiceTemplate serviceTemplate, + TranslationContext translationContext) { ConsolidationData consolidationData = translationContext.getConsolidationData(); @@ -90,7 +90,7 @@ public class ConsolidationService { } - private Map getConsolidationEntityIdToType(ServiceTemplate serviceTemplate, + public static Map getConsolidationEntityIdToType(ServiceTemplate serviceTemplate, ConsolidationData consolidationData) { Map consolidationEntityIdToType = new HashMap<>(); @@ -101,21 +101,24 @@ public class ConsolidationService { FilePortConsolidationData filePortConsolidationData = consolidationData.getPortConsolidationData() .getFilePortConsolidationData(serviceTemplateFileName); - - for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) { - TypeComputeConsolidationData typeComputeConsolidationData = - fileComputeConsolidationData.getTypeComputeConsolidationData(computeType); - Set computeNodeTemplateIds = - typeComputeConsolidationData.getAllComputeNodeTemplateIds(); - for (String computeNodeTemplateId : computeNodeTemplateIds) { - consolidationEntityIdToType.put(computeNodeTemplateId, computeType); + if(Objects.nonNull(fileComputeConsolidationData)) { + for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) { + TypeComputeConsolidationData typeComputeConsolidationData = + fileComputeConsolidationData.getTypeComputeConsolidationData(computeType); + Set computeNodeTemplateIds = + typeComputeConsolidationData.getAllComputeNodeTemplateIds(); + for (String computeNodeTemplateId : computeNodeTemplateIds) { + consolidationEntityIdToType.put(computeNodeTemplateId, computeType); + } } } - Set portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds(); - for (String portNodeTemplateId : portNodeTemplateIds) { - consolidationEntityIdToType - .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId)); + if(Objects.nonNull(filePortConsolidationData)) { + Set portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds(); + for (String portNodeTemplateId : portNodeTemplateIds) { + consolidationEntityIdToType + .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId)); + } } return consolidationEntityIdToType; @@ -287,8 +290,9 @@ public class ConsolidationService { return new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values())); } - private Set getEntityGetAttrFuncAsSet(String portType, - EntityConsolidationData entityConsolidationData) { + private Set getEntityGetAttrFuncAsSet( + String portType, + EntityConsolidationData entityConsolidationData) { Set getAttrFuncDataFromPortsWithSameType = new HashSet<>(); Map> nodesGetAttrOut = @@ -506,8 +510,8 @@ public class ConsolidationService { private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity, EntityConsolidationData currentEntity) { - if (CollectionUtils.isEmpty(startingEntity.getGroupIds()) && - CollectionUtils.isEmpty(currentEntity.getGroupIds())) { + if (CollectionUtils.isEmpty(startingEntity.getGroupIds()) + && CollectionUtils.isEmpty(currentEntity.getGroupIds())) { return true; } @@ -710,7 +714,7 @@ public class ConsolidationService { } public void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId, - ServiceTemplate mainServiceTemplate, + ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, TranslationContext translationContext) { @@ -720,24 +724,28 @@ public class ConsolidationService { translationContext.getConsolidationData().getComputeConsolidationData() .getFileComputeConsolidationData( ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate)); - boolean consolidationRuleResult = + boolean substitutionConsolidationRuleResult = substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate, fileComputeConsolidationData, translationContext); - if (consolidationRuleResult) { + if (substitutionConsolidationRuleResult) { List unifiedCompositionDataList = createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId, - mainServiceTemplate, consolidationData); + serviceTemplate, consolidationData); unifiedCompositionService - .createUnifiedComposition(mainServiceTemplate, substitutionServiceTemplate, + .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, UnifiedCompositionMode.NestedSingleCompute, translationContext); } else { - //The node template does not qualify for unified composition + //The node template does not represent unified VFC but complexVFC //Adding the id in the context for fixing connectivity from/to nested non-unified nodes translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil - .getServiceTemplateFileName(mainServiceTemplate), + .getServiceTemplateFileName(serviceTemplate), substituteNodeTemplateId, substituteNodeTemplateId); + + if (!translationContext.isUnifiedHandledServiceTemplate(substitutionServiceTemplate)) { + serviceTemplateConsolidation(substitutionServiceTemplate, translationContext); + } } } @@ -829,24 +837,21 @@ public class ConsolidationService { .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate)); if (Objects.nonNull(fileNestedConsolidationData)) { - Collection nestedConsolidationDatas = - fileNestedConsolidationData.getAllNestedConsolidationData(); - - for (NestedTemplateConsolidationData nested : nestedConsolidationDatas) { - if (nested.getNodeTemplateId().equals(substituteNodeTemplateId)) { - UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData(); - unifiedCompositionData.setNestedTemplateConsolidationData(nested); - unifiedCompositionDataList.add(unifiedCompositionData); - } - } + NestedTemplateConsolidationData nestedTemplateConsolidationData = + fileNestedConsolidationData.getNestedTemplateConsolidationData(substituteNodeTemplateId); + UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData(); + unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData); + unifiedCompositionDataList.add(unifiedCompositionData); + return unifiedCompositionDataList; } return unifiedCompositionDataList; } - private boolean consolidationPreCondition(ServiceTemplate serviceTemplate, - ConsolidationData consolidationData, - TypeComputeConsolidationData typeComputeConsolidationData) { + private boolean consolidationPreCondition( + ServiceTemplate serviceTemplate, + ConsolidationData consolidationData, + TypeComputeConsolidationData typeComputeConsolidationData) { return (isThereMoreThanOneComputeTypeInstance(typeComputeConsolidationData) && isNumberOfPortsEqualsBetweenComputeNodes(typeComputeConsolidationData) diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java index 7c67a5af2c..81ef3e01ce 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/HeatToToscaUtil.java @@ -25,10 +25,9 @@ import org.apache.commons.collections4.MapUtils; import org.openecomp.core.translator.api.HeatToToscaTranslator; import org.openecomp.core.translator.datatypes.TranslatorOutput; import org.openecomp.core.translator.factory.HeatToToscaTranslatorFactory; -import org.openecomp.core.utilities.CommonMethods; import org.openecomp.core.utilities.file.FileContentHandler; import org.openecomp.core.utilities.file.FileUtils; -import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.tosca.services.YamlUtil; import org.openecomp.core.validation.util.MessageContainerUtil; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.common.utils.SdcCommon; @@ -68,7 +67,6 @@ import org.openecomp.sdc.tosca.datatypes.model.PropertyType; import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping; import org.openecomp.sdc.tosca.datatypes.model.Template; import org.openecomp.sdc.tosca.datatypes.model.TopologyTemplate; import org.openecomp.sdc.tosca.services.DataModelUtil; @@ -76,7 +74,7 @@ import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; import org.openecomp.sdc.tosca.services.ToscaConstants; import org.openecomp.sdc.tosca.services.ToscaUtil; import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; -import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil; +import org.openecomp.sdc.tosca.services.ToscaExtensionYamlUtil; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedPropertyVal; import org.openecomp.sdc.translator.datatypes.heattotosca.AttachedResourceId; import org.openecomp.sdc.translator.datatypes.heattotosca.ReferenceType; @@ -337,10 +335,11 @@ public class HeatToToscaUtil { * @param propertyValue the property value * @return the optional */ - public static Optional extractAttachedResourceId(String heatFileName, - HeatOrchestrationTemplate heatOrchestrationTemplate, - TranslationContext context, - Object propertyValue) { + public static Optional extractAttachedResourceId( + String heatFileName, + HeatOrchestrationTemplate heatOrchestrationTemplate, + TranslationContext context, + Object propertyValue) { Object entity; Object translatedId; @@ -538,6 +537,32 @@ public class HeatToToscaUtil { return false; } + /** + * Checks if the nested resource represents a VFC or a complex VFC (Heat file should contain at + * least one or more compute nodes). + * + * @param resource the resource + * @param context the context + * @return true if the resource represents a VFC and false otherwise. + */ + public static boolean isNestedVfcResource(Resource resource, TranslationContext context) { + mdcDataDebugMessage.debugEntryMessage(null, null); + Optional nestedHeatFileName = HeatToToscaUtil.getNestedHeatFileName(resource); + HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil() + .yamlToObject(context.getFileContent(nestedHeatFileName.get()), + HeatOrchestrationTemplate.class); + if (Objects.nonNull(nestedHeatOrchestrationTemplate.getResources())) { + for (String innerResourceId : nestedHeatOrchestrationTemplate.getResources().keySet()) { + if (ConsolidationDataUtil + .isComputeResource(nestedHeatOrchestrationTemplate, innerResourceId)) { + return true; + } + } + } + mdcDataDebugMessage.debugExitMessage(null, null); + return false; + } + /** * Get nested heat file name in case of nested resource. * @@ -734,8 +759,9 @@ public class HeatToToscaUtil { * @param entryDefinitionMetadata template name of the entry definition servie template * @return the tosca service model */ - public static ToscaServiceModel getToscaServiceModel(TranslationContext context, - Map entryDefinitionMetadata) { + public static ToscaServiceModel getToscaServiceModel( + TranslationContext context, + Map entryDefinitionMetadata) { mdcDataDebugMessage.debugEntryMessage(null, null); Map serviceTemplates = @@ -775,28 +801,6 @@ public class HeatToToscaUtil { return Optional.empty(); } - /** - * Adding binding requerment from port node template to compute node template. - * - * @param computeNodeTemplateId compute node template id - * @param portNodeTemplate port node template - */ - public static void addBindingReqFromPortToCompute(String computeNodeTemplateId, - NodeTemplate portNodeTemplate) { - - - mdcDataDebugMessage.debugEntryMessage(null, null); - - RequirementAssignment requirementAssignment = new RequirementAssignment(); - requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_NETWORK_BINDABLE); - requirementAssignment.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_BINDS_TO); - requirementAssignment.setNode(computeNodeTemplateId); - DataModelUtil.addRequirementAssignment(portNodeTemplate, ToscaConstants.BINDING_REQUIREMENT_ID, - requirementAssignment); - - mdcDataDebugMessage.debugExitMessage(null, null); - } - /** * Adding link requerment from port node template to network node template. * @@ -1062,7 +1066,7 @@ public class HeatToToscaUtil { nestedSubstitutionServiceTemplate, context); //add substitution mapping after capability and requirement expose calculation nestedSubstitutionServiceTemplate.getTopology_template().setSubstitution_mappings( - createSubstitutionTemplateSubMapping(substitutionNodeTypeKey, + DataModelUtil.createSubstitutionTemplateSubMapping(substitutionNodeTypeKey, substitutionNodeType, substitutionMapping)); } @@ -1233,69 +1237,6 @@ public class HeatToToscaUtil { return substitutionProperties; } - private static SubstitutionMapping createSubstitutionTemplateSubMapping( - String nodeTypeKey, - NodeType substitutionNodeType, - Map>> mapping) { - mdcDataDebugMessage.debugEntryMessage(null, null); - SubstitutionMapping substitutionMapping = new SubstitutionMapping(); - substitutionMapping.setNode_type(nodeTypeKey); - substitutionMapping.setCapabilities( - manageCapabilityMapping(substitutionNodeType.getCapabilities(), mapping.get("capability"))); - substitutionMapping.setRequirements( - manageRequirementMapping(substitutionNodeType.getRequirements(), - mapping.get("requirement"))); - - mdcDataDebugMessage.debugExitMessage(null, null); - return substitutionMapping; - } - - private static Map> manageRequirementMapping( - List> requirementList, - Map> requirementSubstitutionMapping) { - mdcDataDebugMessage.debugEntryMessage(null, null); - - if (requirementList == null) { - return null; - } - Map> requirementMapping = new HashMap<>(); - String requirementKey; - List requirementMap; - for (Map requirementDefMap : requirementList) { - for (Map.Entry entry : requirementDefMap.entrySet()) { - requirementKey = entry.getKey(); - requirementMap = requirementSubstitutionMapping.get(requirementKey); - requirementMapping.put(requirementKey, requirementMap); - } - } - - mdcDataDebugMessage.debugExitMessage(null, null); - return requirementMapping; - } - - private static Map> manageCapabilityMapping( - Map capabilities, - Map> capabilitySubstitutionMapping) { - mdcDataDebugMessage.debugEntryMessage(null, null); - - if (capabilities == null) { - mdcDataDebugMessage.debugExitMessage(null, null); - return null; - } - - Map> capabilityMapping = new HashMap<>(); - String capabilityKey; - List capabilityMap; - for (Map.Entry entry : capabilities.entrySet()) { - capabilityKey = entry.getKey(); - capabilityMap = capabilitySubstitutionMapping.get(capabilityKey); - capabilityMapping.put(capabilityKey, capabilityMap); - } - - mdcDataDebugMessage.debugExitMessage(null, null); - return capabilityMapping; - } - private static Map>> getSubstitutionNodeTypeExposedConnectionPoints(NodeType substitutionNodeType, ServiceTemplate substitutionServiceTemplate, @@ -1323,6 +1264,7 @@ public class HeatToToscaUtil { new HashMap<>(); Map nodeTypeCapabilitiesDefinition = new HashMap<>(); Map exposedCapabilitiesDefinition; + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); for (Map.Entry entry : nodeTemplates.entrySet()) { nodeTemplateId = entry.getKey(); @@ -1336,9 +1278,11 @@ public class HeatToToscaUtil { nodeTemplateRequirementsAssignment = DataModelUtil.getNodeTemplateRequirements(nodeTemplate); fullFilledRequirementsDefinition.put(nodeTemplateId, nodeTemplateRequirementsAssignment); //set substitution node type requirements - exposedRequirementsDefinition = calculateExposedRequirements(nodeTypeRequirementsDefinition, + exposedRequirementsDefinition = + toscaAnalyzerService.calculateExposedRequirements(nodeTypeRequirementsDefinition, nodeTemplateRequirementsAssignment); - addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition, + DataModelUtil + .addSubstitutionNodeTypeRequirements(substitutionNodeType, exposedRequirementsDefinition, nodeTemplateId); //get capabilities @@ -1347,7 +1291,8 @@ public class HeatToToscaUtil { nodeTemplateId, substitutionServiceTemplate, context); } - exposedCapabilitiesDefinition = calculateExposedCapabilities(nodeTypeCapabilitiesDefinition, + exposedCapabilitiesDefinition = + toscaAnalyzerService.calculateExposedCapabilities(nodeTypeCapabilitiesDefinition, fullFilledRequirementsDefinition); DataModelUtil.addNodeTypeCapabilitiesDef(substitutionNodeType, exposedCapabilitiesDefinition); @@ -1355,48 +1300,6 @@ public class HeatToToscaUtil { return substitutionMapping; } - private static Map calculateExposedCapabilities( - Map nodeTypeCapabilitiesDefinition, - Map> fullFilledRequirementsDefinitionMap) { - - - mdcDataDebugMessage.debugEntryMessage(null, null); - - String capabilityKey; - String capability; - String node; - for (Map.Entry> entry : - fullFilledRequirementsDefinitionMap.entrySet()) { - for (Map.Entry fullFilledEntry : entry.getValue().entrySet()) { - - capability = fullFilledEntry.getValue().getCapability(); - fullFilledEntry.getValue().getOccurrences(); - node = fullFilledEntry.getValue().getNode(); - capabilityKey = capability + "_" + node; - CapabilityDefinition capabilityDefinition = nodeTypeCapabilitiesDefinition.get( - capabilityKey); - if (capabilityDefinition != null) { - CapabilityDefinition clonedCapabilityDefinition = capabilityDefinition.clone(); - nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityDefinition.clone()); - if (evaluateCapabilityFulfillment(clonedCapabilityDefinition)) { - nodeTypeCapabilitiesDefinition.remove(capabilityKey); - } else { - nodeTypeCapabilitiesDefinition.put(capabilityKey, clonedCapabilityDefinition); - } - } - } - } - - Map exposedCapabilitiesDefinition = new HashMap<>(); - for (Map.Entry entry : nodeTypeCapabilitiesDefinition - .entrySet()) { - exposedCapabilitiesDefinition.put(entry.getKey(), entry.getValue()); - } - - mdcDataDebugMessage.debugExitMessage(null, null); - return exposedCapabilitiesDefinition; - } - private static void addNodeTypeCapabilitiesToSubMapping( Map nodeTypeCapabilitiesDefinition, Map> capabilitySubstitutionMapping, String type, String templateName, @@ -1422,31 +1325,6 @@ public class HeatToToscaUtil { mdcDataDebugMessage.debugExitMessage(null, null); } - private static void addSubstitutionNodeTypeRequirements(NodeType substitutionNodeType, - List> - requirementsList, - String templateName) { - mdcDataDebugMessage.debugEntryMessage(null, null); - - if (requirementsList == null || requirementsList.size() == 0) { - return; - } - - if (substitutionNodeType.getRequirements() == null) { - substitutionNodeType.setRequirements(new ArrayList<>()); - } - - for (Map requirementDef : requirementsList) { - for (Map.Entry entry : requirementDef.entrySet()) { - Map requirementMap = new HashMap<>(); - requirementMap.put(entry.getKey() + "_" + templateName, entry.getValue().clone()); - substitutionNodeType.getRequirements().add(requirementMap); - } - } - - mdcDataDebugMessage.debugExitMessage(null, null); - } - private static List> getNodeTypeReqs( String type, String templateName, @@ -1489,85 +1367,6 @@ public class HeatToToscaUtil { return requirementList; } - private static List> calculateExposedRequirements( - List> nodeTypeRequirementsDefinitionList, - Map nodeTemplateRequirementsAssignment) { - mdcDataDebugMessage.debugEntryMessage(null, null); - - if (nodeTypeRequirementsDefinitionList == null) { - return null; - } - for (Map.Entry entry : nodeTemplateRequirementsAssignment - .entrySet()) { - if (entry.getValue().getNode() != null) { - Optional requirementDefinition = - DataModelUtil.getRequirementDefinition(nodeTypeRequirementsDefinitionList, entry - .getKey()); - RequirementDefinition cloneRequirementDefinition; - if (requirementDefinition.isPresent()) { - cloneRequirementDefinition = requirementDefinition.get().clone(); - if (!evaluateRequirementFulfillment(cloneRequirementDefinition)) { - CommonMethods.mergeEntryInList(entry.getKey(), cloneRequirementDefinition, - nodeTypeRequirementsDefinitionList); - } else { - DataModelUtil.removeRequirementsDefinition(nodeTypeRequirementsDefinitionList, entry - .getKey()); - } - } - } else { - for (Map nodeTypeRequirementsMap : - nodeTypeRequirementsDefinitionList) { - Object max = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null - && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 - ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[1] : 1; - Object min = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null - && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 - ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[0] : 1; - nodeTypeRequirementsMap.get(entry.getKey()).setOccurrences(new Object[]{min, max}); - } - } - } - - mdcDataDebugMessage.debugExitMessage(null, null); - return nodeTypeRequirementsDefinitionList; - } - - private static boolean evaluateRequirementFulfillment(RequirementDefinition - requirementDefinition) { - Object[] occurrences = requirementDefinition.getOccurrences(); - if (occurrences == null) { - requirementDefinition.setOccurrences(new Object[]{1, 1}); - return false; - } - if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { - return false; - } - - if (occurrences[1].equals(1)) { - return true; - } - occurrences[1] = (Integer) occurrences[1] - 1; - return false; - } - - private static boolean evaluateCapabilityFulfillment(CapabilityDefinition capabilityDefinition) { - - Object[] occurrences = capabilityDefinition.getOccurrences(); - if (occurrences == null) { - capabilityDefinition.setOccurrences(new Object[]{1, ToscaConstants.UNBOUNDED}); - return false; - } - if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { - return false; - } - - if (occurrences[1].equals(1)) { - return true; - } - occurrences[1] = (Integer) occurrences[1] - 1; - return false; - } - /** * Fetch global substitution service template service template. * diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java index ab41d43cc9..43079f9025 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/TranslationService.java @@ -22,9 +22,7 @@ package org.openecomp.sdc.translator.services.heattotosca; import org.apache.commons.collections4.MapUtils; import org.openecomp.core.translator.datatypes.TranslatorOutput; -import org.openecomp.core.utilities.file.FileContentHandler; import org.openecomp.core.utilities.file.FileUtils; -import org.openecomp.core.utilities.yaml.YamlUtil; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.datatypes.error.ErrorLevel; import org.openecomp.sdc.heat.datatypes.manifest.FileData; @@ -32,9 +30,6 @@ import org.openecomp.sdc.heat.datatypes.model.Environment; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.Output; import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.heat.datatypes.structure.ValidationStructureList; -import org.openecomp.sdc.heat.services.tree.HeatTreeManager; -import org.openecomp.sdc.heat.services.tree.HeatTreeManagerUtil; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; @@ -46,7 +41,6 @@ import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; import org.openecomp.sdc.tosca.datatypes.model.GroupDefinition; -import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; import org.openecomp.sdc.tosca.datatypes.model.PropertyType; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; @@ -54,13 +48,11 @@ 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; import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import org.openecomp.sdc.translator.datatypes.heattotosca.to.FileDataCollection; -import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData; -import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData; import org.openecomp.sdc.translator.services.heattotosca.errors.ResourceNotFoundInHeatFileErrorBuilder; import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator; import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatToToscaParameterConverter; @@ -68,7 +60,6 @@ import org.openecomp.sdc.translator.services.heattotosca.mapping.TranslatorHeatT import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -121,6 +112,10 @@ public class TranslationService { HeatToToscaUtil.createToscaServiceModel(mainServiceTemplate, translationContext); TranslatorOutput translatorOutput = new TranslatorOutput(); + //Keeping a copy of tosca service model after first stage of translation for extraction of + // composition data + translatorOutput.setNonUnifiedToscaServiceModel( + ToscaServiceModel.getClonedServiceModel(toscaServiceModel)); translatorOutput.setToscaServiceModel(toscaServiceModel); mdcDataDebugMessage.debugExitMessage(null, null); diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionManager.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionManager.java index 2e67983194..a7ba9b549e 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionManager.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionManager.java @@ -4,15 +4,16 @@ import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; 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.ToscaAnalyzerService; +import org.openecomp.sdc.tosca.services.ToscaUtil; import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl; import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext; import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData; -import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Optional; -import java.util.Set; public class UnifiedCompositionManager { @@ -43,38 +44,80 @@ public class UnifiedCompositionManager { Map serviceTemplates = toscaServiceModel.getServiceTemplates(); ServiceTemplate mainServiceTemplate = serviceTemplates.get(toscaServiceModel.getEntryDefinitionServiceTemplate()); - consolidationService.mainServiceTemplateConsolidation(mainServiceTemplate, translationContext); - ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + createUnifiedComposition(toscaServiceModel, mainServiceTemplate, translationContext); + ToscaServiceModel unifiedToscaServiceModel = + HeatToToscaUtil.createToscaServiceModel(mainServiceTemplate, translationContext); + + mdcDataDebugMessage.debugExitMessage(null, null); + return unifiedToscaServiceModel; + } + + private void createUnifiedComposition(ToscaServiceModel toscaServiceModel, + ServiceTemplate serviceTemplate, + TranslationContext translationContext) { + mdcDataDebugMessage.debugEntryMessage(null, null); + + handleNestedServiceTemplates(toscaServiceModel, serviceTemplate, translationContext); + consolidationService.serviceTemplateConsolidation(serviceTemplate, translationContext); + unifiedCompositionService + .updateUnifiedAbstractNodesConnectivity(serviceTemplate, translationContext); + translationContext.addUnifiedHandledServiceTeamplte(serviceTemplate); + + mdcDataDebugMessage.debugExitMessage(null, null); + } + private void handleNestedServiceTemplates(ToscaServiceModel toscaServiceModel, + ServiceTemplate serviceTemplate, + TranslationContext translationContext) { + mdcDataDebugMessage.debugEntryMessage(null, null); - FileNestedConsolidationData mainFileNestedConsolidationData = + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + FileNestedConsolidationData fileNestedConsolidationData = translationContext.getConsolidationData().getNestedConsolidationData() - .getFileNestedConsolidationData(toscaServiceModel.getEntryDefinitionServiceTemplate()); - Set substituteNodeTemplatesId = - mainFileNestedConsolidationData == null - || mainFileNestedConsolidationData.getAllNestedNodeTemplateIds() == null - ? new HashSet<>() : mainFileNestedConsolidationData.getAllNestedNodeTemplateIds(); - - for (String substituteNodeTemplateId : substituteNodeTemplatesId) { - NodeTemplate subNodeTemplate = mainServiceTemplate.getTopology_template().getNode_templates() - .get(substituteNodeTemplateId); - Optional substituteServiceTemplateName = toscaAnalyzerService - .getSubstituteServiceTemplateName(substituteNodeTemplateId, subNodeTemplate); - if (substituteServiceTemplateName.isPresent()) { - ServiceTemplate substituteServiceTemplate = - serviceTemplates.get(substituteServiceTemplateName.get()); - - consolidationService.substitutionServiceTemplateConsolidation(substituteNodeTemplateId, - mainServiceTemplate, substituteServiceTemplate, translationContext); + .getFileNestedConsolidationData(serviceTemplateFileName); + + if (Objects.nonNull(fileNestedConsolidationData)) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + for (String substitutedNodeTemplateId : fileNestedConsolidationData + .getAllNestedNodeTemplateIds()) { + if (translationContext + .isNestedNodeWasHandled(serviceTemplateFileName, substitutedNodeTemplateId)) { + continue; + } + NodeTemplate nestedNodeTemplate = + DataModelUtil.getNodeTemplate(serviceTemplate, substitutedNodeTemplateId); + Optional substituteServiceTemplateName = + toscaAnalyzerService.getSubstituteServiceTemplateName(substitutedNodeTemplateId, + nestedNodeTemplate); + if (substituteServiceTemplateName.isPresent()) { + ServiceTemplate substitutionServiceTemplate = + toscaServiceModel.getServiceTemplates().get(substituteServiceTemplateName.get()); + createUnifiedCompositionForNestedServiceTemplate(toscaServiceModel, serviceTemplate, + substitutionServiceTemplate, substitutedNodeTemplateId, translationContext); + } + translationContext.addNestedNodeAsHandled(serviceTemplateFileName, + substitutedNodeTemplateId); } } - unifiedCompositionService - .updateUnifiedAbstractNodesConnectivity(mainServiceTemplate, translationContext); - ToscaServiceModel unifiedToscaServiceModel = - HeatToToscaUtil.createToscaServiceModel(mainServiceTemplate, translationContext); mdcDataDebugMessage.debugExitMessage(null, null); - return unifiedToscaServiceModel; + } + + private void createUnifiedCompositionForNestedServiceTemplate( + ToscaServiceModel toscaServiceModel, + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + String substitutedNodeTemplateId, + TranslationContext translationContext) { + mdcDataDebugMessage.debugEntryMessage(null, null); + handleNestedServiceTemplates(toscaServiceModel, substitutionServiceTemplate, + translationContext); + consolidationService.substitutionServiceTemplateConsolidation(substitutedNodeTemplateId, + serviceTemplate, substitutionServiceTemplate, translationContext); + unifiedCompositionService + .updateUnifiedAbstractNodesConnectivity(substitutionServiceTemplate, translationContext); + translationContext.addUnifiedHandledServiceTeamplte(substitutionServiceTemplate); + mdcDataDebugMessage.debugExitMessage(null, null); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java index 185316dad7..3704960466 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java @@ -20,6 +20,12 @@ package org.openecomp.sdc.translator.services.heattotosca; +import static org.openecomp.sdc.tosca.services.DataModelUtil.getClonedObject; +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.PORT_IDENTICAL_VALUE_PROPERTY_PREFIX; + import org.apache.commons.collections.map.HashedMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; @@ -29,7 +35,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.openecomp.config.api.Configuration; import org.openecomp.config.api.ConfigurationManager; import org.openecomp.core.utilities.CommonMethods; -import org.openecomp.core.utilities.yaml.YamlUtil; import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; import org.openecomp.sdc.heat.services.HeatConstants; import org.openecomp.sdc.logging.api.Logger; @@ -39,6 +44,7 @@ import org.openecomp.sdc.tosca.datatypes.ToscaFunctions; import org.openecomp.sdc.tosca.datatypes.ToscaGroupType; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType; +import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition; import org.openecomp.sdc.tosca.datatypes.model.Constraint; import org.openecomp.sdc.tosca.datatypes.model.EntrySchema; @@ -74,12 +80,6 @@ import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolida import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData; import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.NotSerializableException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -92,11 +92,6 @@ import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; -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.PORT_IDENTICAL_VALUE_PROPERTY_PREFIX; - public class UnifiedCompositionService { protected static Logger logger = @@ -169,14 +164,17 @@ public class UnifiedCompositionService { * @return the substitution service template */ public Optional createUnifiedSubstitutionServiceTemplate( - ServiceTemplate serviceTemplate, List unifiedCompositionDataList, - TranslationContext context, Integer index) { + ServiceTemplate serviceTemplate, + List unifiedCompositionDataList, + TranslationContext context, + String substitutionNodeTypeId, + Integer index) { if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { return Optional.empty(); } UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0); String templateName = - getTemplateName(serviceTemplate, unifiedCompositionData, index); + getTemplateName(serviceTemplate, unifiedCompositionData, substitutionNodeTypeId, index); ServiceTemplate substitutionServiceTemplate = HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName); @@ -188,13 +186,13 @@ public class UnifiedCompositionService { handlePorts(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, computeNodeType, context); createOutputParameters(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, - computeNodeType); + computeNodeType, context); NodeType substitutionGlobalNodeType = handleSubstitutionGlobalNodeType(serviceTemplate, substitutionServiceTemplate, - context, unifiedCompositionData, index); + context, unifiedCompositionData, substitutionNodeTypeId, index); HeatToToscaUtil.handleSubstitutionMapping(context, - getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionData, index), + substitutionNodeTypeId, substitutionServiceTemplate, substitutionGlobalNodeType); context.getTranslatedServiceTemplates().put(templateName, substitutionServiceTemplate); @@ -218,6 +216,7 @@ public class UnifiedCompositionService { ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, List unifiedCompositionDataList, + String substituteNodeTypeId, TranslationContext context, Integer index) { @@ -225,9 +224,7 @@ public class UnifiedCompositionService { List directiveList = new ArrayList<>(); directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); substitutionNodeTemplate.setDirectives(directiveList); - String substituteNodeTemplateType = - getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionDataList.get(0), index); - substitutionNodeTemplate.setType(substituteNodeTemplateType); + substitutionNodeTemplate.setType(substituteNodeTypeId); Optional> abstractSubstitutionProperties = createAbstractSubstitutionProperties(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, context); @@ -237,12 +234,13 @@ public class UnifiedCompositionService { String substitutionServiceTemplateName = ToscaUtil.getServiceTemplateFileName( substitutionServiceTemplate); int count = unifiedCompositionDataList.size(); - addSubstitutionFilteringProperty(substitutionServiceTemplateName, substitutionNodeTemplate, - count); + DataModelUtil.addSubstitutionFilteringProperty(substitutionServiceTemplateName, + substitutionNodeTemplate, count); //Add index_value property addIndexValueProperty(substitutionNodeTemplate); String substituteNodeTemplateId = - getSubstituteNodeTemplateId(serviceTemplate, unifiedCompositionDataList.get(0), index); + getSubstituteNodeTemplateId(serviceTemplate, unifiedCompositionDataList.get(0), + substituteNodeTypeId, index); //Add node template id and related abstract node template id in context addUnifiedSubstitionData(context, serviceTemplate, unifiedCompositionDataList, substituteNodeTemplateId); @@ -304,6 +302,13 @@ public class UnifiedCompositionService { } + /** + * Clean node types. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list + * @param context the context + */ public void cleanNodeTypes(ServiceTemplate serviceTemplate, List unifiedCompositionDataList, TranslationContext context) { @@ -312,7 +317,6 @@ public class UnifiedCompositionService { unifiedData.getComputeTemplateConsolidationData().getNodeTemplateId(), serviceTemplate, context); } - if (MapUtils.isEmpty(serviceTemplate.getNode_types())) { serviceTemplate.setNode_types(null); } @@ -344,13 +348,21 @@ 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 + */ public void handleUnifiedNestedDefinition(ServiceTemplate mainServiceTemplate, ServiceTemplate nestedServiceTemplate, - List unifiedCompositionDataList, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { handleUnifiedNestedNodeType(mainServiceTemplate, nestedServiceTemplate, context); updateUnifiedNestedTemplates(mainServiceTemplate, nestedServiceTemplate, - unifiedCompositionDataList, context); + unifiedCompositionData, context); } private void handleGetAttrInConnectivity(ServiceTemplate serviceTemplate, @@ -378,17 +390,19 @@ public class UnifiedCompositionService { Optional newNestedNodeTypeId = getNewNestedNodeTypeId(mainServiceTemplate, nestedServiceTemplate, context); - if (isNestedServiceTemplateWasHandled(mainServiceTemplate, nestedServiceTemplate, context, + ServiceTemplate globalSubstitutionServiceTemplate = + context.getGlobalSubstitutionServiceTemplate(); + + if (isNestedServiceTemplateWasHandled(globalSubstitutionServiceTemplate, nestedServiceTemplate, + context, newNestedNodeTypeId)) { - context.updateHandledComputeType( - ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), - ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate), - newNestedNodeTypeId.get()); + context + .updateHandledComputeType(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + newNestedNodeTypeId.get(), + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); return; } - ServiceTemplate globalSubstitutionServiceTemplate = - context.getGlobalSubstitutionServiceTemplate(); newNestedNodeTypeId.ifPresent( newNestedNodeTypeIdVal -> handleNestedNodeType(nodeTypeId, newNestedNodeTypeIdVal, @@ -481,16 +495,12 @@ public class UnifiedCompositionService { ServiceTemplate mainServiceTemplate, ServiceTemplate globalSubstitutionServiceTemplate, TranslationContext context) { - context.addNestedFileToUsedNestedComputeType( - ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), - ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate), - newNestedNodeTypeId); String indexedNewNestedNodeTypeId = handleNestedNodeTypeInGlobalSubstitutionTemplate(nodeTypeId, newNestedNodeTypeId, - mainServiceTemplate, globalSubstitutionServiceTemplate, context); + globalSubstitutionServiceTemplate, context); handleSubstitutionMappingInNestedServiceTemplate(indexedNewNestedNodeTypeId, - nestedServiceTemplate); + nestedServiceTemplate, context); context .updateHandledComputeType( @@ -502,82 +512,101 @@ public class UnifiedCompositionService { private String handleNestedNodeTypeInGlobalSubstitutionTemplate(String nodeTypeId, String newNestedNodeTypeId, - ServiceTemplate mainServiceTemplate, ServiceTemplate globalSubstitutionServiceTemplate, TranslationContext context) { String indexedNodeType = - getIndexedGlobalNodeTypeId(newNestedNodeTypeId, mainServiceTemplate, context); + getIndexedGlobalNodeTypeId(newNestedNodeTypeId, context); + context.updateUsedTimesForNestedComputeNodeType( + ToscaUtil.getServiceTemplateFileName(globalSubstitutionServiceTemplate), + newNestedNodeTypeId); handleNestedNodeTypesInGlobalSubstituteServiceTemplate(nodeTypeId, indexedNodeType, globalSubstitutionServiceTemplate, context); return indexedNodeType; } private String getIndexedGlobalNodeTypeId(String newNestedNodeTypeId, - ServiceTemplate mainServiceTemplate, TranslationContext context) { int globalNodeTypeIndex = - context.getGlobalNodeTypeIndex(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + context.getGlobalNodeTypeIndex( + ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME), newNestedNodeTypeId); - return globalNodeTypeIndex > 0 ? - newNestedNodeTypeId + "_" + String.valueOf(globalNodeTypeIndex) : newNestedNodeTypeId; + return globalNodeTypeIndex > 0 ? newNestedNodeTypeId + "_" + + String.valueOf(globalNodeTypeIndex) : newNestedNodeTypeId; } private void updateUnifiedNestedTemplates(ServiceTemplate mainServiceTemplate, ServiceTemplate nestedServiceTemplate, - List unifiedCompositionDataList, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - NestedTemplateConsolidationData nestedTemplateConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - if (Objects.isNull(nestedTemplateConsolidationData)) { - continue; - } - handleNestedNodeTemplateInMainServiceTemplate( - nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate, - nestedServiceTemplate, context); + NestedTemplateConsolidationData nestedTemplateConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.isNull(nestedTemplateConsolidationData)) { + return; } + handleNestedNodeTemplateInMainServiceTemplate( + nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate, + nestedServiceTemplate, context); + } /** * Update connectivity for unified nested patterns. * - * @param serviceTemplate the service template - * @param nestedServiceTemplate the nested service template - * @param unifiedCompositionDataList the unified composition data list - * @param context the context + * @param serviceTemplate the service template + * @param nestedServiceTemplate the nested service template + * @param unifiedCompositionData the unified composition data + * @param context the context */ public void updateUnifiedNestedConnectivity(ServiceTemplate serviceTemplate, ServiceTemplate nestedServiceTemplate, - List - unifiedCompositionDataList, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { - updNestedCompositionNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionDataList, + updNestedCompositionNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionData, context); - updNestedCompositionNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, + updNestedCompositionNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionData, context); updNestedCompositionOutputParamGetAttrInConnectivity(serviceTemplate, - unifiedCompositionDataList, context); + unifiedCompositionData, context); } /** * Clean unified nested entities. Update the heat stack group with the new node template ids. * - * @param serviceTemplate the service template - * @param unifiedCompositionDataList the unified composition data list - * @param context the context + * @param serviceTemplate the service template + * @param unifiedCompositionData the unified composition data + * @param context the context */ public void cleanUnifiedNestedEntities(ServiceTemplate serviceTemplate, - List unifiedCompositionDataList, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { - EntityConsolidationData entityConsolidationData = unifiedCompositionDataList.get(0) - .getNestedTemplateConsolidationData(); + EntityConsolidationData entityConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); updateHeatStackGroupNestedComposition(serviceTemplate, entityConsolidationData, context); } + public void handleComplexVfcType(ServiceTemplate serviceTemplate, TranslationContext context) { + SubstitutionMapping substitution_mappings = + serviceTemplate.getTopology_template().getSubstitution_mappings(); + + if (Objects.isNull(substitution_mappings)) { + return; + } + + ServiceTemplate globalSubstitutionServiceTemplate = + context.getGlobalSubstitutionServiceTemplate(); + + String substitutionNT = substitution_mappings.getNode_type(); + if (globalSubstitutionServiceTemplate.getNode_types().containsKey(substitutionNT)) { + //todo - remove comment after integration with AT&T +// globalSubstitutionServiceTemplate.getNode_types().get(substitutionNT).setDerived_from +// (ToscaNodeType.COMPLEX_VFC_NODE_TYPE); + } + } + protected void updNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate, List unifiedCompositionDataList, @@ -677,22 +706,21 @@ public class UnifiedCompositionService { } } - protected void updNestedCompositionNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, - List - unifiedCompositionDataList, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData - .getNestedTemplateConsolidationData(); - //Update requirements in the node template which pointing to the nested nodes - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - Optional newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( - serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); - newNestedNodeTemplateId.ifPresent( - newNestedNodeTemplateIdVal -> updNodesConnectedInConnectivity(serviceTemplate, - nestedTemplateConsolidationData, - newNestedNodeTemplateIdVal, context, true)); - } + protected void updNestedCompositionNodesConnectedInConnectivity( + ServiceTemplate serviceTemplate, + UnifiedCompositionData unifiedCompositionData, + TranslationContext context) { + NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData + .getNestedTemplateConsolidationData(); + //Update requirements in the node template which pointing to the nested nodes + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( + serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); + newNestedNodeTemplateId.ifPresent( + newNestedNodeTemplateIdVal -> updNodesConnectedInConnectivity(serviceTemplate, + nestedTemplateConsolidationData, + newNestedNodeTemplateIdVal, context, true)); + } protected void updVolumeConnectivity(ServiceTemplate serviceTemplate, @@ -835,44 +863,40 @@ public class UnifiedCompositionService { } protected void updNestedCompositionOutputParamGetAttrInConnectivity( - ServiceTemplate serviceTemplate, List unifiedComposotionDataList, + ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { - NestedTemplateConsolidationData nestedTemplateConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - if (Objects.isNull(nestedTemplateConsolidationData)) { - continue; - } - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - Optional newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( - serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); - - newNestedNodeTemplateId.ifPresent( - newNestedNodeTemplateIdVal -> updOutputParamGetAttrInConnectivity(serviceTemplate, - nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(), - newNestedNodeTemplateIdVal, context, true)); + NestedTemplateConsolidationData nestedTemplateConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.isNull(nestedTemplateConsolidationData)) { + return; } + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( + serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); + + newNestedNodeTemplateId.ifPresent( + newNestedNodeTemplateIdVal -> updOutputParamGetAttrInConnectivity(serviceTemplate, + nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(), + newNestedNodeTemplateIdVal, context, true)); } protected void updNestedCompositionNodesGetAttrInConnectivity( ServiceTemplate serviceTemplate, - List unifiedCompositionDataList, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - NestedTemplateConsolidationData nestedTemplateConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - if (Objects.isNull(nestedTemplateConsolidationData)) { - continue; - } - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - Optional newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( - serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); - - newNestedNodeTemplateId.ifPresent( - newNestedNodeTemplateIdVal -> updNodeGetAttrInConnectivity(serviceTemplate, - nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(), - newNestedNodeTemplateIdVal, context, null, true)); + NestedTemplateConsolidationData nestedTemplateConsolidationData = + unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.isNull(nestedTemplateConsolidationData)) { + return; } + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( + serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); + + newNestedNodeTemplateId.ifPresent( + newNestedNodeTemplateIdVal -> updNodeGetAttrInConnectivity(serviceTemplate, + nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(), + newNestedNodeTemplateIdVal, context, null, true)); } private void updateRequirementForNodesConnectedIn( @@ -1100,11 +1124,11 @@ public class UnifiedCompositionService { private String getTemplateName(ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, + String nodeTypeId, Integer index) { ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); - String computeType = - getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + String computeType = getComputeTypeSuffix(nodeTypeId); String templateName = "Nested_" + computeType; if (Objects.nonNull(index)) { templateName = templateName + "_" + index.toString(); @@ -1205,19 +1229,20 @@ public class UnifiedCompositionService { private void createOutputParameters(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, List unifiedCompositionDataList, - String computeNodeType) { + String computeNodeType, TranslationContext context) { createOutputParametersForCompute(serviceTemplate, substitutionServiceTemplate, - unifiedCompositionDataList); + unifiedCompositionDataList, context); createOutputParameterForPorts(serviceTemplate, substitutionServiceTemplate, - unifiedCompositionDataList, computeNodeType); + unifiedCompositionDataList, computeNodeType, context); } private void createOutputParameterForPorts( ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, List unifiedCompositionDataList, - String connectedComputeNodeType) { + String connectedComputeNodeType, + TranslationContext context) { for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { List portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); @@ -1232,7 +1257,7 @@ public class UnifiedCompositionService { connectedComputeNodeType, unifiedCompositionData.getComputeTemplateConsolidationData()); addOutputParameters(portTemplateConsolidationData, newPortNodeTemplateId, - substitutionServiceTemplate, unifiedCompositionDataList); + serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, context); } } } @@ -1260,7 +1285,8 @@ public class UnifiedCompositionService { ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, List - unifiedCompositionDataList) { + unifiedCompositionDataList, + TranslationContext context) { List computeConsolidationDataList = getComputeConsolidationDataList(unifiedCompositionDataList); @@ -1269,38 +1295,44 @@ public class UnifiedCompositionService { getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); addOutputParameters(computeTemplateConsolidationData, newComputeNodeTemplateId, - substitutionServiceTemplate, unifiedCompositionDataList); + serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, context); } } private void addOutputParameters(EntityConsolidationData entityConsolidationData, String newNodeTemplateId, + ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, - List unifiedCompositionDataList) { - handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, substitutionServiceTemplate, - unifiedCompositionDataList); + List unifiedCompositionDataList, + TranslationContext context) { + handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, serviceTemplate, + substitutionServiceTemplate, unifiedCompositionDataList, context); - handleOutputParamGetAttrIn(entityConsolidationData, newNodeTemplateId, - substitutionServiceTemplate); + handleOutputParamGetAttrIn(entityConsolidationData, newNodeTemplateId, serviceTemplate, + substitutionServiceTemplate, context); } private void handleOutputParamGetAttrIn(EntityConsolidationData entityConsolidationData, String newNodeTemplateId, - ServiceTemplate substitutionServiceTemplate) { + ServiceTemplate serviceTemplate, + ServiceTemplate substitutionServiceTemplate, + TranslationContext context) { List outputParametersGetAttrIn = entityConsolidationData.getOutputParametersGetAttrIn(); if (!CollectionUtils.isEmpty(outputParametersGetAttrIn)) { for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) { createAndAddOutputParameter(entityConsolidationData, newNodeTemplateId, - substitutionServiceTemplate, getAttrFuncData); + substitutionServiceTemplate, getAttrFuncData, context); } } } private void handleNodesGetAttrIn(EntityConsolidationData entityConsolidationData, String newNodeTemplateId, + ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, - List unifiedCompositionDataList) { + List unifiedCompositionDataList, + TranslationContext context) { Map> getAttrIn = entityConsolidationData.getNodesGetAttrIn(); if (!MapUtils.isEmpty(getAttrIn)) { @@ -1311,7 +1343,7 @@ public class UnifiedCompositionService { List getAttrFuncDataList = getAttrIn.get(sourceNodeTemplateId); for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) { createAndAddOutputParameter(entityConsolidationData, newNodeTemplateId, - substitutionServiceTemplate, getAttrFuncData); + substitutionServiceTemplate, getAttrFuncData, context); } } } @@ -1321,7 +1353,8 @@ public class UnifiedCompositionService { private void createAndAddOutputParameter(EntityConsolidationData entityConsolidationData, String newNodeTemplateId, ServiceTemplate substitutionServiceTemplate, - GetAttrFuncData getAttrFuncData) { + GetAttrFuncData getAttrFuncData, + TranslationContext context) { Map> parameterValue = new HashMap<>(); List valueList = new ArrayList<>(); valueList.add(newNodeTemplateId); @@ -1329,16 +1362,93 @@ public class UnifiedCompositionService { parameterValue.put(ToscaFunctions.GET_ATTRIBUTE.getDisplayName(), valueList); ParameterDefinition outputParameter = new ParameterDefinition(); outputParameter.setValue(parameterValue); - //todo - the type need to be change based on the attribute type in the accordingly node type - // of this node template - XXX, instead of list of string, list of XXXX, - outputParameter.setType(PropertyType.LIST.getDisplayName()); - outputParameter.setEntry_schema( - DataModelUtil.createEntrySchema(PropertyType.STRING.getDisplayName(), null, null)); + setOutputParameterType(substitutionServiceTemplate, newNodeTemplateId, getAttrFuncData + .getAttributeName(), outputParameter, context); DataModelUtil.addOutputParameterToTopologyTemplate(substitutionServiceTemplate, getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData.getAttributeName()), outputParameter); } + private void setOutputParameterType(ServiceTemplate substitutionServiceTemplate, + String newNodeTemplateId, + String outputParameterName, + ParameterDefinition outputParameter, + TranslationContext context) { + NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(substitutionServiceTemplate, + newNodeTemplateId); + //Get the type and entry schema of the output parameter from the node type flat hierarchy + String outputParameterType = null; + EntrySchema outputParameterEntrySchema = null; + NodeType nodeTypeWithFlatHierarchy = + HeatToToscaUtil.getNodeTypeWithFlatHierarchy(nodeTemplate.getType(), + substitutionServiceTemplate, context); + //Check if the parameter is present in the attributes + AttributeDefinition outputParameterDefinitionFromAttributes = + getOutputParameterDefinitionFromAttributes(nodeTypeWithFlatHierarchy, outputParameterName); + if (Objects.nonNull(outputParameterDefinitionFromAttributes)) { + outputParameterType = outputParameterDefinitionFromAttributes.getType(); + outputParameterEntrySchema = outputParameterDefinitionFromAttributes.getEntry_schema(); + } else { + //If the below fails due to null pointer then we need to check if the heatToToscaMapping + // properties and global types are in sync. Ideally the parameter should be found in either + // properties or attributes collected from global types + PropertyDefinition outputParameterDefinitionFromProperties = + nodeTypeWithFlatHierarchy.getProperties().get(outputParameterName); + outputParameterType = outputParameterDefinitionFromProperties.getType(); + outputParameterEntrySchema = outputParameterDefinitionFromProperties.getEntry_schema(); + } + //Set the type and entry schema for the output param obtained from the node type hierarchy + outputParameter.setType(outputParameterType); + outputParameter.setEntry_schema(outputParameterEntrySchema); + } + + private String getNewInputParameterType(NodeTemplate nodeTemplate, + ServiceTemplate serviceTemplate, + String inputParameterName, + TranslationContext context) { + NodeType nodeTypeWithFlatHierarchy = + HeatToToscaUtil.getNodeTypeWithFlatHierarchy(nodeTemplate.getType(), + serviceTemplate, context); + String parameterType = nodeTypeWithFlatHierarchy.getProperties() + .get(inputParameterName).getType(); + return getUnifiedInputParameterType(parameterType); + } + + private AttributeDefinition getOutputParameterDefinitionFromAttributes(NodeType + nodeTypeWithFlatHierarchy, + String outputParameterName) { + AttributeDefinition outputParameterDefinition = null; + if ((Objects.nonNull(nodeTypeWithFlatHierarchy.getAttributes())) + && (nodeTypeWithFlatHierarchy.getAttributes().containsKey(outputParameterName))) { + outputParameterDefinition = + nodeTypeWithFlatHierarchy.getAttributes().get(outputParameterName); + } + return outputParameterDefinition; + } + + private String getUnifiedInputParameterType(String parameterType) { + String unifiedInputParameterType = null; + if (Objects.nonNull(parameterType)) { + if (parameterType.equalsIgnoreCase(PropertyType.STRING.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.TIMESTAMP.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.NULL.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.SCALAR_UNIT_SIZE.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.SCALAR_UNIT_FREQUENCY.getDisplayName())) { + unifiedInputParameterType = parameterType.toLowerCase(); + } else if (parameterType.equalsIgnoreCase(PropertyType.MAP.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) + || parameterType.equalsIgnoreCase(PropertyTypeExt.JSON.getDisplayName())) { + unifiedInputParameterType = PropertyTypeExt.JSON.getDisplayName(); + } else { + unifiedInputParameterType = parameterType; + } + } + return unifiedInputParameterType; + } + private String getNewSubstitutionOutputParameterId(String newNodeTemplateId, String attributeName) { return newNodeTemplateId + "_" + attributeName; @@ -1370,18 +1480,6 @@ public class UnifiedCompositionService { } } - private void addSubstitutionFilteringProperty(String templateName, NodeTemplate nodeTemplate, - int count) { - Map serviceTemplateFilterPropertyValue = new HashMap<>(); - Map properties = nodeTemplate.getProperties(); - serviceTemplateFilterPropertyValue.put(ToscaConstants - .SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, templateName); - serviceTemplateFilterPropertyValue.put(ToscaConstants.COUNT_PROPERTY_NAME, count); - properties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, - serviceTemplateFilterPropertyValue); - nodeTemplate.setProperties(properties); - } - private void addIndexValueProperty(NodeTemplate nodeTemplate) { List indexValueGetPropertyValue = new ArrayList<>(); indexValueGetPropertyValue.add(ToscaConstants.MODELABLE_ENTITY_NAME_SELF); @@ -1399,28 +1497,45 @@ public class UnifiedCompositionService { private String getSubstituteNodeTemplateId(ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, + String nodeTypeId, Integer index) { String computeNodeTemplateId = unifiedCompositionData.getComputeTemplateConsolidationData().getNodeTemplateId(); NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId); String nodeTemplateId = ABSTRACT_NODE_TEMPLATE_ID_PREFIX + DataModelUtil - .getNamespaceSuffix(computeNodeTemplate.getType()); + .getNamespaceSuffix(nodeTypeId); if (Objects.nonNull(index)) { nodeTemplateId = nodeTemplateId + "_" + index.toString(); } return nodeTemplateId; } - private String getSubstitutionNodeTypeId(ServiceTemplate serviceTemplate, - UnifiedCompositionData unifiedCompositionData, - Integer index) { + /** + * Gets substitution node type id. + * + * @param serviceTemplate the service template + * @param unifiedCompositionData the unified composition data + * @param index the index + * @return the substitution node type id + */ + public String getSubstitutionNodeTypeId(ServiceTemplate serviceTemplate, + UnifiedCompositionData unifiedCompositionData, + Integer index, + TranslationContext context) { String computeNodeTemplateId = unifiedCompositionData.getComputeTemplateConsolidationData().getNodeTemplateId(); NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId); + String computeType = computeNodeTemplate.getType(); + String globalSTName = ToscaUtil.getServiceTemplateFileName(Constants + .GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + String nodeTypeId = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX - + DataModelUtil.getNamespaceSuffix(computeNodeTemplate.getType()); + + DataModelUtil.getNamespaceSuffix(getIndexedGlobalNodeTypeId(computeType, context)); + + context.updateUsedTimesForNestedComputeNodeType(globalSTName, computeType); + if (Objects.nonNull(index)) { nodeTypeId = nodeTypeId + "_" + index.toString(); } @@ -1437,9 +1552,10 @@ public class UnifiedCompositionService { ServiceTemplate substitutionServiceTemplate, TranslationContext context, UnifiedCompositionData unifiedCompositionData, + String substitutionNodeTypeId, Integer index) { - String substitutionNodeTypeId = - getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionData, index); +// String substitutionNodeTypeId = +// getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionData, index, context); NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl() .createInitSubstitutionNodeType(substitutionServiceTemplate, ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); @@ -1539,16 +1655,20 @@ public class UnifiedCompositionService { computeTemplateConsolidationData); //Update requirements for relationships between the consolidation entities handleConsolidationEntitiesRequirementConnectivity(newPortNodeTemplateId, newPortNodeTemplate, - substitutionServiceTemplate, context); + serviceTemplate, context); DataModelUtil.addNodeTemplate(substitutionServiceTemplate, newPortNodeTemplateId, newPortNodeTemplate); //Add the node template mapping in the context for handling requirement updation - context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil - .getServiceTemplateFileName(substitutionServiceTemplate), - portTemplateConsolidationData.getNodeTemplateId(), newPortNodeTemplateId); - } + for (EntityConsolidationData data : portTemplateConsolidationDataList) { + String newPortTemplateId = getNewPortNodeTemplateId(data.getNodeTemplateId(), + connectedComputeNodeType, computeTemplateConsolidationData); + context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil + .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(), + newPortTemplateId); + } + } private NodeTemplate getNodeTemplate(String nodeTemplateId, ServiceTemplate serviceTemplate, TranslationContext context) { @@ -1616,15 +1736,18 @@ public class UnifiedCompositionService { //Update requirements for relationships between the consolidation entities handleConsolidationEntitiesRequirementConnectivity(newComputeNodeTemplateId, newComputeNodeTemplate, - substitutionServiceTemplate, context); + serviceTemplate, context); DataModelUtil .addNodeTemplate(substitutionServiceTemplate, newComputeNodeTemplateId, newComputeNodeTemplate); //Add the node template mapping in the context for handling requirement updation - context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil - .getServiceTemplateFileName(substitutionServiceTemplate), - computeTemplateConsolidationData.getNodeTemplateId(), newComputeNodeTemplateId); - + for (EntityConsolidationData data : computeConsoliadtionDataList) { + String newComputeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, + computeTemplateConsolidationData.getNodeTemplateId()); + context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil + .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(), + newComputeTemplateId); + } } private List getComputeConsolidationDataList( @@ -1646,7 +1769,8 @@ public class UnifiedCompositionService { ComputeTemplateConsolidationData computeTemplateConsolidationData, List unifiedCompositionDataList, TranslationContext context) { - + List propertiesWithIdenticalVal = + consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity, context); nodeTemplate.setProperties(new HashedMap()); handleNodeTemplateProperties(serviceTemplate, nodeTemplate, substitutionServiceTemplate, unifiedCompositionEntity, entityConsolidationDataList, computeTemplateConsolidationData, @@ -1739,10 +1863,10 @@ public class UnifiedCompositionService { Map enrichNodeTypeProperties = enrichNodeType.get().getProperties(); if (Objects.nonNull(enrichNodeTypeProperties)) { for (String enrichPropertyName : enrichProperties) { - handleEntityConsolidationDataNodeTypeProperties( - enrichPropertyName, substitutionServiceTemplate, - enrichNodeType.get(), nodeTemplate, compositionEntity, computeTemplateConsolidationData, - entityConsolidationDataList, nodeTemplateProperties, context); + handleEntityConsolidationDataNodeTypeProperties( + enrichPropertyName, substitutionServiceTemplate, + enrichNodeType.get(), nodeTemplate, compositionEntity, computeTemplateConsolidationData, + entityConsolidationDataList, nodeTemplateProperties, context); } } } @@ -1768,7 +1892,8 @@ public class UnifiedCompositionService { Map propertyValMap = new HashMap<>(); context - .addNewPropertyIdToNodeTemplate(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate), + .addNewPropertyIdToNodeTemplate( + ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate), inputParamId, nodeTemplateProperties.get(enrichPropertyName)); if (nodeTemplateProperties.containsKey(enrichPropertyName)) { @@ -1816,14 +1941,13 @@ public class UnifiedCompositionService { EntrySchema entrySchema, Optional parameterId, UnifiedCompositionEntity unifiedCompositionEntity, TranslationContext context) { - if(parameterId.isPresent() && - isParameterBelongsToEnrichedPortProperties(parameterId.get(), context)){ + if (parameterId.isPresent() && + isParameterBelongsToEnrichedPortProperties(parameterId.get(), context)) { addInputParameter(parameterId.get(), propertyType, - propertyType.equals(PropertyType.LIST.getDisplayName()) ? entrySchema : null , + propertyType.equals(PropertyType.LIST.getDisplayName()) ? entrySchema : null, substitutionServiceTemplate); - } - else if (isPropertySimpleType(propertyType)) { + } else if (isPropertySimpleType(propertyType)) { parameterId .ifPresent(parameterIdValue -> addInputParameter(parameterIdValue, PropertyType.LIST.getDisplayName(), @@ -1831,7 +1955,7 @@ public class UnifiedCompositionService { .createEntrySchema(propertyType.toLowerCase(), null, null), substitutionServiceTemplate)); - } else if(propertyType.equals(PropertyTypeExt.JSON.getDisplayName()) || + } else if (propertyType.equals(PropertyTypeExt.JSON.getDisplayName()) || (Objects.nonNull(entrySchema) && isPropertySimpleType(entrySchema.getType()))) { parameterId .ifPresent(parameterIdValue -> addInputParameter(parameterIdValue, @@ -1851,11 +1975,11 @@ public class UnifiedCompositionService { } private boolean isParameterBelongsToEnrichedPortProperties(String parameterId, - TranslationContext context){ + TranslationContext context) { List enrichPortResourceProperties = context.getEnrichPortResourceProperties(); - for(int i = 0; i < enrichPortResourceProperties.size(); i++){ - if(parameterId.contains((CharSequence) enrichPortResourceProperties.get(i))){ + for (int i = 0; i < enrichPortResourceProperties.size(); i++) { + if (parameterId.contains((CharSequence) enrichPortResourceProperties.get(i))) { return true; } } @@ -1866,9 +1990,9 @@ public class UnifiedCompositionService { private boolean isPropertySimpleType(String propertyType) { return !Objects.isNull(propertyType) && (propertyType.equalsIgnoreCase(PropertyType.STRING.getDisplayName()) - || propertyType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName()) - || propertyType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName()) - || propertyType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName())); + || propertyType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName()) + || propertyType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName()) + || propertyType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName())); } private String analyzeParameterType(String propertyType) { @@ -1883,8 +2007,7 @@ public class UnifiedCompositionService { private void handleConsolidationEntitiesRequirementConnectivity(String nodeTemplateId, NodeTemplate nodeTemplate, - ServiceTemplate - substitutionServiceTemplate, + ServiceTemplate serviceTemplate, TranslationContext context) { Map updatedNodeTemplateRequirements = new HashMap<>(); List> nodeTemplateRequirements = DataModelUtil @@ -1898,7 +2021,7 @@ public class UnifiedCompositionService { RequirementAssignment requirementAssignment = entry.getValue(); String requirementNode = requirementAssignment.getNode(); String unifiedNodeTemplateId = - context.getUnifiedSubstitutionNodeTemplateId(substitutionServiceTemplate, + context.getUnifiedSubstitutionNodeTemplateId(serviceTemplate, requirementNode); if (unifiedNodeTemplateId != null) { //Update the node id in the requirement @@ -2021,10 +2144,12 @@ public class UnifiedCompositionService { List unifiedCompositionDataList, TranslationContext context) { - if (handleGetAttrFromConsolidationNodes(serviceTemplate, nodeTemplate, propertyEntry, - unifiedCompositionDataList, context)) { + if (handleGetAttrFromConsolidationNodes(serviceTemplate, nodeTemplateId, nodeTemplate, + propertyEntry, unifiedCompositionDataList, context)) { return Optional.empty(); } + + String inputParamId = getParameterId(nodeTemplateId, nodeTemplate, propertyEntry.getKey(), compositionEntity, computeTemplateConsolidationData); @@ -2047,7 +2172,7 @@ public class UnifiedCompositionService { private boolean handleGetAttrFromConsolidationNodes( ServiceTemplate serviceTemplate, - NodeTemplate nodeTemplate, + String nodeTemplateId, NodeTemplate nodeTemplate, Map.Entry propertyEntry, List unifiedCompositionDataList, TranslationContext context) { @@ -2055,12 +2180,19 @@ public class UnifiedCompositionService { getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList); Set consolidationNodeTemplateIds = consolidationNodeTemplateIdAndType.keySet(); + Map entityIdToType = ConsolidationService.getConsolidationEntityIdToType( + serviceTemplate, context.getConsolidationData()); boolean includeGetAttrFromConsolidationNodes = false; boolean includeGetAttrFromOutsideNodes = false; + boolean isGetAttrFromConsolidationIsFromSameType = false; List> getAttrFunctionList = extractGetAttrFunction(propertyEntry.getValue()); for (List getAttrFunc : getAttrFunctionList) { - if (consolidationNodeTemplateIds.contains(getAttrFunc.get(0))) { + String getAttrNodeId = (String) getAttrFunc.get(0); + if (consolidationNodeTemplateIds.contains(getAttrNodeId)) { includeGetAttrFromConsolidationNodes = true; + if (isGetAttrNodeTemplateFromSameType(nodeTemplateId, getAttrNodeId, entityIdToType)) { + isGetAttrFromConsolidationIsFromSameType = true; + } } else { includeGetAttrFromOutsideNodes = true; } @@ -2071,7 +2203,7 @@ public class UnifiedCompositionService { ToscaFunctions.GET_INPUT))) { //This case is currently not supported - this property will be ignored return true; - } else if (includeGetAttrFromConsolidationNodes) { + } else if (includeGetAttrFromConsolidationNodes && !isGetAttrFromConsolidationIsFromSameType) { Object clonedPropertyValue = getClonedPropertyValue(propertyEntry); List> clonedGetAttrFuncList = extractGetAttrFunction(clonedPropertyValue); for (List getAttrFunc : clonedGetAttrFuncList) { @@ -2087,6 +2219,32 @@ public class UnifiedCompositionService { return false; } + private boolean isGetAttrFromConsolidationNodesIsFromSameType(String sourceNodeTemplateId, + Set nodeTemplateIdsFromConsolidation, + Map + nodeTemplateIdToType) { + for (String idFromConsolidation : nodeTemplateIdsFromConsolidation) { + if (isGetAttrNodeTemplateFromSameType(sourceNodeTemplateId, idFromConsolidation, + nodeTemplateIdToType)) { + return true; + } + } + return false; + } + + private boolean isGetAttrNodeTemplateFromSameType(String sourceNodeTemplateId, + String targetNodeTemplateId, + Map nodeTemplateIdToType) { + + if (Objects.isNull(nodeTemplateIdToType.get(sourceNodeTemplateId)) + || Objects.isNull(nodeTemplateIdToType.get(targetNodeTemplateId))) { + return false; + } + + return nodeTemplateIdToType.get(sourceNodeTemplateId).equals(nodeTemplateIdToType + .get(targetNodeTemplateId)); + } + private void updatePropertyGetAttrFunc( ServiceTemplate serviceTemplate, List unifiedCompositionDataList, @@ -2153,11 +2311,6 @@ public class UnifiedCompositionService { if (portIdList.contains(portNodeTemplateId)) { return unifiedCompositionData.getComputeTemplateConsolidationData(); } -// for (String portId : portIdList) { -// if (portId.equals(portNodeTemplateId)) { -// return unifiedCompositionData.getComputeTemplateConsolidationData(); -// } -// } } } return null; @@ -2334,7 +2487,7 @@ public class UnifiedCompositionService { //If the value object is Optional.empty it implies that the property name was not // found in the input name if (!(propertyValue instanceof Optional)) { - if(!abstractPropertyValue.contains(propertyValue)) { + if (!abstractPropertyValue.contains(propertyValue)) { abstractPropertyValue.add(propertyValue); } } @@ -2360,16 +2513,16 @@ public class UnifiedCompositionService { ParameterDefinition parameterDefinition, List abstractPropertyValue, Map abstractSubstituteProperties) { - if(abstractPropertyValue.size() > 1) { + if (abstractPropertyValue.size() > 1) { abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); } else { Object propertyValue = abstractPropertyValue.get(0); String entrySchemaType = parameterDefinition.getEntry_schema().getType(); - if(entrySchemaType.equalsIgnoreCase(PropertyType.STRING.getDisplayName()) + if (entrySchemaType.equalsIgnoreCase(PropertyType.STRING.getDisplayName()) || entrySchemaType.equalsIgnoreCase(PropertyType.INTEGER.getDisplayName()) || entrySchemaType.equalsIgnoreCase(PropertyType.FLOAT.getDisplayName()) || entrySchemaType.equalsIgnoreCase(PropertyType.BOOLEAN.getDisplayName()) - || entrySchemaType.equals(PropertyTypeExt.JSON.getDisplayName())){ + || entrySchemaType.equals(PropertyTypeExt.JSON.getDisplayName())) { abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); } else { abstractSubstituteProperties.put(substitutionTemplateInputName, propertyValue); @@ -2475,6 +2628,7 @@ public class UnifiedCompositionService { TranslationContext context) { removeNodeTemplateFromServiceTemplate(serviceTemplate, entity, context); updateHeatStackGroup(serviceTemplate, entity, context); + updateSubstitutionMapping(serviceTemplate, context); } private void removeNodeTemplateFromServiceTemplate(ServiceTemplate serviceTemplate, @@ -2544,6 +2698,64 @@ public class UnifiedCompositionService { groupEntry.getValue().setMembers(members); } + private void updateSubstitutionMapping(ServiceTemplate serviceTemplate, + TranslationContext context) { + SubstitutionMapping substitutionMappings = + DataModelUtil.getSubstitutionMappings(serviceTemplate); + if (Objects.nonNull(substitutionMappings)) { + + if (Objects.nonNull(substitutionMappings.getRequirements())) { + updateSubstitutionMappingRequirements(substitutionMappings.getRequirements(), + serviceTemplate, context); + } + + if (Objects.nonNull(substitutionMappings.getCapabilities())) { + updateSubstitutionMappingCapabilities(substitutionMappings.getCapabilities(), + serviceTemplate, context); + } + } + } + + private void updateSubstitutionMappingRequirements(Map> + substitutionMappingRequirements, + ServiceTemplate serviceTemplate, + TranslationContext context) { + for (Map.Entry> entry : substitutionMappingRequirements.entrySet()) { + List requirement = entry.getValue(); + String oldNodeTemplateId = requirement.get(0); + String newAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, + requirement.get(0)); + String newSubstitutionNodeTemplateId = context.getUnifiedSubstitutionNodeTemplateId( + serviceTemplate, oldNodeTemplateId); + if (Objects.nonNull(newAbstractNodeTemplateId) + && Objects.nonNull(newSubstitutionNodeTemplateId)) { + requirement.set(0, newAbstractNodeTemplateId); + String newRequirementValue = requirement.get(1) + "_" + newSubstitutionNodeTemplateId; + requirement.set(1, newRequirementValue); + } + } + } + + private void updateSubstitutionMappingCapabilities(Map> + substitutionMappingCapabilities, + ServiceTemplate serviceTemplate, + TranslationContext context) { + for (Map.Entry> entry : substitutionMappingCapabilities.entrySet()) { + List capability = entry.getValue(); + String oldNodeTemplateId = capability.get(0); + String newAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, + capability.get(0)); + String newSubstitutionNodeTemplateId = context.getUnifiedSubstitutionNodeTemplateId( + serviceTemplate, oldNodeTemplateId); + if (Objects.nonNull(newAbstractNodeTemplateId) + && Objects.nonNull(newSubstitutionNodeTemplateId)) { + capability.set(0, newAbstractNodeTemplateId); + String newRequirementValue = capability.get(1) + "_" + newSubstitutionNodeTemplateId; + capability.set(1, newRequirementValue); + } + } + } + private void updateHeatStackGroupNestedComposition(ServiceTemplate serviceTemplate, EntityConsolidationData entity, TranslationContext context) { @@ -2576,24 +2788,25 @@ public class UnifiedCompositionService { updateNestedNodeTemplateProperties(nestedServiceTemplate, nestedNodeTemplate, context); Optional unifiedNestedNodeTypeId = context - .getUnifiedNestedNodeTypeId(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, + .getUnifiedNestedNodeTypeId( + ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME), nestedNodeTemplate.getType()); unifiedNestedNodeTypeId .ifPresent(unifiedNestedNodeTypeIdVal -> updateNestedNodeTemplate( unifiedNestedNodeTypeIdVal, nestedNodeTemplateId, nestedNodeTemplate, - mainServiceTemplate, nestedServiceTemplate, context)); + mainServiceTemplate, context)); } private void updateNestedNodeTemplateProperties(ServiceTemplate nestedServiceTemplate, NodeTemplate nestedNodeTemplate, - TranslationContext context){ + TranslationContext context) { Map newPropertyInputParamIds = context.getAllNewPropertyInputParamIdsPerNodeTenplateId(ToscaUtil .getServiceTemplateFileName(nestedServiceTemplate)); - for(Map.Entry entry : newPropertyInputParamIds.entrySet()){ - if(Objects.nonNull(entry.getValue())) { + for (Map.Entry entry : newPropertyInputParamIds.entrySet()) { + if (Objects.nonNull(entry.getValue())) { Object value = getClonedObject(entry.getValue()); nestedNodeTemplate.getProperties().put(entry.getKey(), value); } @@ -2603,38 +2816,42 @@ public class UnifiedCompositionService { private void handleSubstitutionMappingInNestedServiceTemplate( String newNestedNodeType, - ServiceTemplate nestedServiceTemplate) { + ServiceTemplate nestedServiceTemplate, + TranslationContext context) { if (Objects.isNull(newNestedNodeType)) { return; } - SubstitutionMapping substitutionMappings = + Set relatedNestedNodeTypeIds = + context.getAllRelatedNestedNodeTypeIds(); + + SubstitutionMapping substitutionMappings = nestedServiceTemplate.getTopology_template().getSubstitution_mappings(); - substitutionMappings.setNode_type(newNestedNodeType); + if(!relatedNestedNodeTypeIds.contains(substitutionMappings.getNode_type())) { + substitutionMappings.setNode_type(newNestedNodeType); + } } private void updateNestedNodeTemplate(String newNestedNodeTypeId, String nestedNodeTemplateId, NodeTemplate nestedNodeTemplate, ServiceTemplate mainServiceTemplate, - ServiceTemplate nestedServiceTemplate, TranslationContext context) { - String mainServiceTemplateName = ToscaUtil.getServiceTemplateFileName(mainServiceTemplate); + String mainSTName = ToscaUtil.getServiceTemplateFileName(mainServiceTemplate); + String globalSTName = + ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); int index = - context.getHandledNestedComputeNodeTemplateIndex(mainServiceTemplateName, - newNestedNodeTypeId); + context.getHandledNestedComputeNodeTemplateIndex(globalSTName, newNestedNodeTypeId); String newNodeTemplateId = - Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX + getComputeTypeSuffix(newNestedNodeTypeId) + - "_" + index; + Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX + getComputeTypeSuffix(newNestedNodeTypeId) + + "_" + index; nestedNodeTemplate.setType(newNestedNodeTypeId); mainServiceTemplate.getTopology_template().getNode_templates().remove(nestedNodeTemplateId); mainServiceTemplate.getTopology_template().getNode_templates() .put(newNodeTemplateId, nestedNodeTemplate); - context - .addUnifiedNestedNodeTemplateId(mainServiceTemplateName, - nestedNodeTemplateId, newNodeTemplateId); + context.addUnifiedNestedNodeTemplateId(mainSTName, nestedNodeTemplateId, newNodeTemplateId); } private void handleNestedNodeTypesInGlobalSubstituteServiceTemplate( @@ -2645,14 +2862,20 @@ public class UnifiedCompositionService { Set relatedNestedNodeTypeIds = context.getAllRelatedNestedNodeTypeIds(); - if(!relatedNestedNodeTypeIds.contains(origNestedNodeTypeId)) { - Map nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); + Map nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); + if (!relatedNestedNodeTypeIds.contains(origNestedNodeTypeId)) { NodeType nested = DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, origNestedNodeTypeId); setNewValuesForNestedNodeType(origNestedNodeTypeId, newNestedNodeTypeId, nested, nodeTypes); - context.addUnifiedNestedNodeTypeId(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, - origNestedNodeTypeId, newNestedNodeTypeId); + } else { + NodeType nested = + (NodeType) DataModelUtil.getClonedObject( + DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, origNestedNodeTypeId)); + nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); + nodeTypes.put(newNestedNodeTypeId, nested); } + context.addUnifiedNestedNodeTypeId(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME, + origNestedNodeTypeId, newNestedNodeTypeId); } private void setNewValuesForNestedNodeType(String origNestedNodeType, @@ -3041,35 +3264,6 @@ public class UnifiedCompositionService { return null; } - private Object getClonedObject(Object objectValue, Class clazz) { - YamlUtil yamlUtil = new YamlUtil(); - Object clonedObjectValue; - String objectToYaml = yamlUtil.objectToYaml(objectValue); - clonedObjectValue = yamlUtil.yamlToObject(objectToYaml, clazz); - return clonedObjectValue; - } - - private Object getClonedObject(Object objectValue) { - Object clonedObjectValue; - try { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); - objectOutputStream.writeObject(objectValue); - - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream - .toByteArray()); - ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); - clonedObjectValue = objectInputStream.readObject(); - } catch (NotSerializableException ex) { - return getClonedObject(objectValue, objectValue.getClass()); - } catch (IOException ioe) { - return null; - } catch (ClassNotFoundException cnfe) { - return null; - } - return clonedObjectValue; - } - private Map getAllConsolidationNodeTemplateIdAndType( List unifiedCompositionDataList) { @@ -3100,15 +3294,15 @@ public class UnifiedCompositionService { return consolidationNodeTemplateIdAndType; } - private enum PortInputType { - NodeTemplateId, - PortType, - Other; - } - private List getPortTemplateConsolidationDataList( UnifiedCompositionData unifiedCompositionData) { return unifiedCompositionData.getPortTemplateConsolidationDataList() == null ? new ArrayList<>() : unifiedCompositionData.getPortTemplateConsolidationDataList(); } + + private enum PortInputType { + NodeTemplateId, + PortType, + Other; + } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java index 4d08176943..5586574669 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java @@ -1,10 +1,8 @@ package org.openecomp.sdc.translator.services.heattotosca; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; -import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData; import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; import java.util.Collection; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java index 6dada6ab84..9eadfc2907 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesGenerator.java @@ -60,4 +60,21 @@ public class GlobalTypesGenerator { globalImports.add(globalImportMap); return globalImports; } + + /** + * Gets global types import list for Manual Vsp onboarding. + * + * @return the global types import list + */ + public static List> getManualVspGlobalTypesImportList() { + List> globalImports = new ArrayList<>(); + Map globalImportMap = new HashMap<>(); + Map globalTypesServiceTemplate = + GlobalTypesGenerator.getGlobalTypesServiceTemplate(); + globalImportMap.put("openecomp_index", + HeatToToscaUtil.createServiceTemplateImport(globalTypesServiceTemplate.get + ("openecomp/_index.yml"))); + globalImports.add(globalImportMap); + return globalImports; + } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesServiceTemplates.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesServiceTemplates.java index cbc56d7773..531de16998 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesServiceTemplates.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/globaltypes/GlobalTypesServiceTemplates.java @@ -6,7 +6,7 @@ import org.openecomp.sdc.common.errors.ErrorCode; import org.openecomp.sdc.logging.types.LoggerErrorDescription; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.services.ToscaUtil; -import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil; +import org.openecomp.sdc.tosca.services.ToscaExtensionYamlUtil; import org.openecomp.sdc.translator.utils.ResourceWalker; import java.util.HashMap; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java index 5f4e40a4b2..f1cb33372e 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/helper/VolumeTranslationHelper.java @@ -25,7 +25,7 @@ import static org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes.CINDER_V import org.apache.commons.collections4.CollectionUtils; import org.openecomp.sdc.common.utils.CommonUtil; import org.openecomp.sdc.logging.api.Logger; -import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.tosca.services.YamlUtil; import org.openecomp.sdc.heat.datatypes.manifest.FileData; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.Output; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetAttrImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetAttrImpl.java index 823daa53c8..6f7d7a921e 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetAttrImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/functiontranslation/FunctionTranslationGetAttrImpl.java @@ -20,7 +20,7 @@ package org.openecomp.sdc.translator.services.heattotosca.impl.functiontranslation; -import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.tosca.services.YamlUtil; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.Resource; import org.openecomp.sdc.heat.services.HeatConstants; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/BaseResourceConnection.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/BaseResourceConnection.java index b9fed89133..b0094b0a7c 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/BaseResourceConnection.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/BaseResourceConnection.java @@ -21,7 +21,7 @@ package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation; import org.apache.commons.collections4.MapUtils; -import org.openecomp.core.utilities.yaml.YamlUtil; +import org.openecomp.sdc.tosca.services.YamlUtil; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.common.errors.ErrorCategory; import org.openecomp.sdc.common.errors.ErrorCode; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceInstanceImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceInstanceImpl.java index eed7953cda..3b9eb08f53 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceInstanceImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationContrailServiceInstanceImpl.java @@ -507,7 +507,7 @@ public class ResourceTranslationContrailServiceInstanceImpl extends ResourceTran portProperties.put("order", index); } portNodeTemplate.setProperties(portProperties); - HeatToToscaUtil.addBindingReqFromPortToCompute(computeNodeTemplateId, portNodeTemplate); + DataModelUtil.addBindingReqFromPortToCompute(computeNodeTemplateId, portNodeTemplate); mdcDataDebugMessage.debugExitMessage(null, null); return portNodeTemplate; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java index 499ac5f80a..96c105c04a 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/resourcetranslation/ResourceTranslationNovaServerImpl.java @@ -46,7 +46,6 @@ import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo; import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource; import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData; -import org.openecomp.sdc.translator.services.heattotosca.ConfigConstants; import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil; import org.openecomp.sdc.translator.services.heattotosca.Constants; import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; @@ -480,7 +479,7 @@ public class ResourceTranslationNovaServerImpl extends ResourceTranslationBase { if (translatedPortId.isPresent()) { NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, translatedPortId.get()); - HeatToToscaUtil.addBindingReqFromPortToCompute(novaServerResourceId, portNodeTemplate); + DataModelUtil.addBindingReqFromPortToCompute(novaServerResourceId, portNodeTemplate); // Add ports ConsolidationDataUtil.updatePortInConsolidationData(translateTo, novaNodeTemplate.getType(), diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java index 9742a44f52..c1daf1891a 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java @@ -11,18 +11,56 @@ import java.util.List; import java.util.Optional; public class UnifiedCompositionCatalogInstance implements UnifiedComposition { + + UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + + // There is consolidation in ScalingInstance implemetation. + // In case of scaling instance, if there is more than one entry in the + // unifiedComposotionDataList, we should have consolidation between them. + // (all entries in the list are the once which need to be consolidated) @Override public void createUnifiedComposition(ServiceTemplate serviceTemplate, ServiceTemplate nestedServiceTemplate, List unifiedComposotionDataList, TranslationContext context) { + UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + unifiedCompositionService.handleComplexVfcType(serviceTemplate, context); + UnifiedCompositionSingleSubstitution unifiedCompositionSingleSubstitution = new UnifiedCompositionSingleSubstitution(); - unifiedCompositionSingleSubstitution - .createUnifiedComposition(serviceTemplate, null, unifiedComposotionDataList, context); - } + String substitutionNodeTypeId = + unifiedCompositionService.getSubstitutionNodeTypeId(serviceTemplate, + unifiedComposotionDataList.get(0), null, context); + // create one substitution ST for all computes + Optional substitutionServiceTemplate = + unifiedCompositionService.createUnifiedSubstitutionServiceTemplate(serviceTemplate, + unifiedComposotionDataList, context, substitutionNodeTypeId, null); + + if (!substitutionServiceTemplate.isPresent()) { + return; + } + + // create abstract NT for each compute + for(int i = 0; i < unifiedComposotionDataList.size(); i++){ + List catalogInstanceUnifiedList = new ArrayList<>(); + catalogInstanceUnifiedList.add(unifiedComposotionDataList.get(i)); + Integer index = unifiedComposotionDataList.size() > 1 ? i : null; + + unifiedCompositionService + .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), + catalogInstanceUnifiedList, substitutionNodeTypeId, context, index); + + unifiedCompositionService + .updateCompositionConnectivity(serviceTemplate, catalogInstanceUnifiedList, context); + + unifiedCompositionService + .cleanUnifiedCompositionEntities(serviceTemplate, catalogInstanceUnifiedList, context); + } + + unifiedCompositionService.cleanNodeTypes(serviceTemplate, unifiedComposotionDataList, context); + } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java index 03d7eb02df..8530d5150d 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionNestedSingleCompute.java @@ -11,6 +11,11 @@ import java.util.ArrayList; import java.util.List; public class UnifiedCompositionNestedSingleCompute implements UnifiedComposition { + + // There is no consolidation in NestedSingleCompute implemetation. + // 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 + // them. @Override public void createUnifiedComposition(ServiceTemplate serviceTemplate, ServiceTemplate nestedServiceTemplate, @@ -27,12 +32,12 @@ public class UnifiedCompositionNestedSingleCompute implements UnifiedComposition unifiedCompositionService .handleUnifiedNestedDefinition(serviceTemplate, nestedServiceTemplate, - unifiedCompositionDataList, context); + unifiedCompositionDataList.get(i), context); unifiedCompositionService .updateUnifiedNestedConnectivity(serviceTemplate, nestedServiceTemplate, - nestedUnifiedCompositionDataList, context); + unifiedCompositionDataList.get(i), context); unifiedCompositionService - .cleanUnifiedNestedEntities(serviceTemplate, nestedUnifiedCompositionDataList, context); + .cleanUnifiedNestedEntities(serviceTemplate, unifiedCompositionDataList.get(i), context); } } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java index fe287a4014..001655d2b0 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java @@ -7,7 +7,6 @@ import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.compositi import org.openecomp.sdc.translator.services.heattotosca.UnifiedComposition; import org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionService; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -20,14 +19,20 @@ public class UnifiedCompositionScalingInstances implements UnifiedComposition { ServiceTemplate nestedServiceTemplate, List unifiedCompositionDataList, TranslationContext context) { - if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { + if (CollectionUtils.isEmpty(unifiedCompositionDataList) + || context.isUnifiedHandledServiceTemplate(serviceTemplate)) { return; } + unifiedCompositionService.handleComplexVfcType(serviceTemplate, context); + Integer index = null; + String substitutionNodeTypeId = + unifiedCompositionService.getSubstitutionNodeTypeId(serviceTemplate, + unifiedCompositionDataList.get(0), null, context); Optional substitutionServiceTemplate = unifiedCompositionService.createUnifiedSubstitutionServiceTemplate(serviceTemplate, - unifiedCompositionDataList, context, index); + unifiedCompositionDataList, context, substitutionNodeTypeId, index); if (!substitutionServiceTemplate.isPresent()) { return; @@ -35,7 +40,7 @@ public class UnifiedCompositionScalingInstances implements UnifiedComposition { String abstractNodeTemplateId = unifiedCompositionService .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), - unifiedCompositionDataList, context, index); + unifiedCompositionDataList, substitutionNodeTypeId, context, index); unifiedCompositionService .updateCompositionConnectivity(serviceTemplate, unifiedCompositionDataList, context); diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java index c3965a5f52..a7078f2e5d 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java @@ -17,6 +17,8 @@ import java.util.Optional; */ public class UnifiedCompositionSingleSubstitution implements UnifiedComposition { + UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + // There is no consolidation in SingleSubstitution implemetation. // In case of single substitution, if there is more than one entry in the // unifiedComposotionDataList, they all should contain the same compute type but the @@ -28,27 +30,35 @@ public class UnifiedCompositionSingleSubstitution implements UnifiedComposition ServiceTemplate nestedServiceTemplate, List unifiedCompositionDataList, TranslationContext context) { - UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); - if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { + if (CollectionUtils.isEmpty(unifiedCompositionDataList) + || context.isUnifiedHandledServiceTemplate(serviceTemplate)) { return; } + unifiedCompositionService.handleComplexVfcType(serviceTemplate, context); + for (int i = 0; i < unifiedCompositionDataList.size(); i++) { List singleSubstitutionUnifiedList = new ArrayList<>(); singleSubstitutionUnifiedList.add(unifiedCompositionDataList.get(i)); Integer index = unifiedCompositionDataList.size() > 1 ? i : null; + + String substitutionNodeTypeId = + unifiedCompositionService.getSubstitutionNodeTypeId(serviceTemplate, + singleSubstitutionUnifiedList.get(0), null, context); + Optional substitutionServiceTemplate = unifiedCompositionService.createUnifiedSubstitutionServiceTemplate(serviceTemplate, - singleSubstitutionUnifiedList, context, index); + singleSubstitutionUnifiedList, context, substitutionNodeTypeId, null); if (!substitutionServiceTemplate.isPresent()) { continue; } + String abstractNodeTemplateId = unifiedCompositionService .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), - singleSubstitutionUnifiedList, context, index); + singleSubstitutionUnifiedList, substitutionNodeTypeId, context, null); unifiedCompositionService .updateCompositionConnectivity(serviceTemplate, singleSubstitutionUnifiedList, context); @@ -60,6 +70,5 @@ public class UnifiedCompositionSingleSubstitution implements UnifiedComposition unifiedCompositionService .cleanNodeTypes(serviceTemplate, unifiedCompositionDataList, context); - } } -- cgit 1.2.3-korg