diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java')
-rw-r--r-- | openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java | 716 |
1 files changed, 455 insertions, 261 deletions
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<ServiceTemplate> createUnifiedSubstitutionServiceTemplate( - ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context, Integer index) { + ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> 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<UnifiedCompositionData> unifiedCompositionDataList, + String substituteNodeTypeId, TranslationContext context, Integer index) { @@ -225,9 +224,7 @@ public class UnifiedCompositionService { List<String> 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<Map<String, Object>> 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<UnifiedCompositionData> 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<UnifiedCompositionData> 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<String> 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<UnifiedCompositionData> 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<UnifiedCompositionData> - 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<UnifiedCompositionData> 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<UnifiedCompositionData> unifiedCompositionDataList, @@ -677,22 +706,21 @@ public class UnifiedCompositionService { } } - protected void updNestedCompositionNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> - 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<String> 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<String> 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<UnifiedCompositionData> 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<String> 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<String> newNestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId( + serviceTemplateFileName, nestedTemplateConsolidationData.getNodeTemplateId()); + + newNestedNodeTemplateId.ifPresent( + newNestedNodeTemplateIdVal -> updOutputParamGetAttrInConnectivity(serviceTemplate, + nestedTemplateConsolidationData, nestedTemplateConsolidationData.getNodeTemplateId(), + newNestedNodeTemplateIdVal, context, true)); } protected void updNestedCompositionNodesGetAttrInConnectivity( ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - NestedTemplateConsolidationData nestedTemplateConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - if (Objects.isNull(nestedTemplateConsolidationData)) { - continue; - } - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - Optional<String> 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<String> 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<UnifiedCompositionData> 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<UnifiedCompositionData> unifiedCompositionDataList, - String connectedComputeNodeType) { + String connectedComputeNodeType, + TranslationContext context) { for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { List<PortTemplateConsolidationData> 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<UnifiedCompositionData> - unifiedCompositionDataList) { + unifiedCompositionDataList, + TranslationContext context) { List<EntityConsolidationData> 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<UnifiedCompositionData> unifiedCompositionDataList) { - handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, substitutionServiceTemplate, - unifiedCompositionDataList); + List<UnifiedCompositionData> 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<GetAttrFuncData> 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<UnifiedCompositionData> unifiedCompositionDataList) { + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { Map<String, List<GetAttrFuncData>> getAttrIn = entityConsolidationData.getNodesGetAttrIn(); if (!MapUtils.isEmpty(getAttrIn)) { @@ -1311,7 +1343,7 @@ public class UnifiedCompositionService { List<GetAttrFuncData> 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<String, List<Object>> parameterValue = new HashMap<>(); List<Object> 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<String, Object> serviceTemplateFilterPropertyValue = new HashMap<>(); - Map<String, Object> 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<String> 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<EntityConsolidationData> getComputeConsolidationDataList( @@ -1646,7 +1769,8 @@ public class UnifiedCompositionService { ComputeTemplateConsolidationData computeTemplateConsolidationData, List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { - + List<String> propertiesWithIdenticalVal = + consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity, context); nodeTemplate.setProperties(new HashedMap()); handleNodeTemplateProperties(serviceTemplate, nodeTemplate, substitutionServiceTemplate, unifiedCompositionEntity, entityConsolidationDataList, computeTemplateConsolidationData, @@ -1739,10 +1863,10 @@ public class UnifiedCompositionService { Map<String, PropertyDefinition> 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<String, String> 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<String> 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<String, RequirementAssignment> updatedNodeTemplateRequirements = new HashMap<>(); List<Map<String, RequirementAssignment>> 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<UnifiedCompositionData> 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<String, Object> propertyEntry, List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { @@ -2055,12 +2180,19 @@ public class UnifiedCompositionService { getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList); Set<String> consolidationNodeTemplateIds = consolidationNodeTemplateIdAndType.keySet(); + Map<String, String> entityIdToType = ConsolidationService.getConsolidationEntityIdToType( + serviceTemplate, context.getConsolidationData()); boolean includeGetAttrFromConsolidationNodes = false; boolean includeGetAttrFromOutsideNodes = false; + boolean isGetAttrFromConsolidationIsFromSameType = false; List<List<Object>> getAttrFunctionList = extractGetAttrFunction(propertyEntry.getValue()); for (List<Object> 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<List<Object>> clonedGetAttrFuncList = extractGetAttrFunction(clonedPropertyValue); for (List<Object> getAttrFunc : clonedGetAttrFuncList) { @@ -2087,6 +2219,32 @@ public class UnifiedCompositionService { return false; } + private boolean isGetAttrFromConsolidationNodesIsFromSameType(String sourceNodeTemplateId, + Set<String> nodeTemplateIdsFromConsolidation, + Map<String, String> + nodeTemplateIdToType) { + for (String idFromConsolidation : nodeTemplateIdsFromConsolidation) { + if (isGetAttrNodeTemplateFromSameType(sourceNodeTemplateId, idFromConsolidation, + nodeTemplateIdToType)) { + return true; + } + } + return false; + } + + private boolean isGetAttrNodeTemplateFromSameType(String sourceNodeTemplateId, + String targetNodeTemplateId, + Map<String, String> 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<UnifiedCompositionData> 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<Object> abstractPropertyValue, Map<String, Object> 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<String, List<String>> + substitutionMappingRequirements, + ServiceTemplate serviceTemplate, + TranslationContext context) { + for (Map.Entry<String, List<String>> entry : substitutionMappingRequirements.entrySet()) { + List<String> 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<String, List<String>> + substitutionMappingCapabilities, + ServiceTemplate serviceTemplate, + TranslationContext context) { + for (Map.Entry<String, List<String>> entry : substitutionMappingCapabilities.entrySet()) { + List<String> 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<String> 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<String, Object> newPropertyInputParamIds = context.getAllNewPropertyInputParamIdsPerNodeTenplateId(ToscaUtil .getServiceTemplateFileName(nestedServiceTemplate)); - for(Map.Entry<String, Object> entry : newPropertyInputParamIds.entrySet()){ - if(Objects.nonNull(entry.getValue())) { + for (Map.Entry<String, Object> 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<String> 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<String> relatedNestedNodeTypeIds = context.getAllRelatedNestedNodeTypeIds(); - if(!relatedNestedNodeTypeIds.contains(origNestedNodeTypeId)) { - Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); + Map<String, NodeType> 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 <T> Object getClonedObject(Object objectValue, Class<T> 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<String, UnifiedCompositionEntity> getAllConsolidationNodeTemplateIdAndType( List<UnifiedCompositionData> unifiedCompositionDataList) { @@ -3100,15 +3294,15 @@ public class UnifiedCompositionService { return consolidationNodeTemplateIdAndType; } - private enum PortInputType { - NodeTemplateId, - PortType, - Other; - } - private List<PortTemplateConsolidationData> getPortTemplateConsolidationDataList( UnifiedCompositionData unifiedCompositionData) { return unifiedCompositionData.getPortTemplateConsolidationDataList() == null ? new ArrayList<>() : unifiedCompositionData.getPortTemplateConsolidationDataList(); } + + private enum PortInputType { + NodeTemplateId, + PortType, + Other; + } } |