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 | 6020 |
1 files changed, 2517 insertions, 3503 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 77b5520a09..88f0b8f313 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 @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.openecomp.sdc.translator.services.heattotosca; import static org.openecomp.sdc.tosca.datatypes.ToscaFunctions.GET_INPUT; @@ -31,19 +30,18 @@ import static org.openecomp.sdc.translator.services.heattotosca.Constants.PORT_I import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_PROPERTY_VALUE_PREFIX; import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_ROLE; import static org.openecomp.sdc.translator.services.heattotosca.Constants.VFC_PARENT_PORT_ROLE; -import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getPortTemplateConsolidationDataForPort; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getComputeTypeSuffix; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getConnectedComputeConsolidationData; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewComputeNodeTemplateId; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewPortNodeTemplateId; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewSubInterfaceNodeTemplateId; +import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getPortTemplateConsolidationDataForPort; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTemplateConsolidationDataList; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTypeSuffix; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimap; - import java.util.ArrayList; import java.util.Collection; import java.util.EnumMap; @@ -57,7 +55,6 @@ import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; - import org.apache.commons.collections.map.HashedMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; @@ -116,1177 +113,856 @@ import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolida public class UnifiedCompositionService { - private static final Map<String, ImplementationConfiguration> unifiedCompositionImplMap; - - private static final EnumMap<UnifiedCompositionEntity, String> unifiedSubstitutionNodeTemplateIdGeneratorImplMap; - private static final String SUB_INTERFACE_INDICATOR_PROPERTY = "subinterface_indicator"; - private final ConsolidationService consolidationService = new ConsolidationService(); - - static { - Configuration config = ConfigurationManager.lookup(); - unifiedCompositionImplMap = - config.populateMap(ConfigConstants.MANDATORY_UNIFIED_MODEL_NAMESPACE, - ConfigConstants.UNIFIED_COMPOSITION_IMPL_KEY, ImplementationConfiguration.class); - unifiedSubstitutionNodeTemplateIdGeneratorImplMap = new EnumMap<>(UnifiedCompositionEntity.class); - initNodeTemplateIdGeneratorImplMap(); - } - - private static void initNodeTemplateIdGeneratorImplMap() { - unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(COMPUTE, CommandImplNames - .COMPUTE_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL); - unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(PORT, CommandImplNames - .PORT_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL); - unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(SUB_INTERFACE, CommandImplNames - .SUB_INTERFACE_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL); - } - - private static List<EntityConsolidationData> getPortConsolidationDataList( - List<String> portIds, - List<UnifiedCompositionData> unifiedCompositionDataList) { - return unifiedCompositionDataList.stream() + private static final Map<String, ImplementationConfiguration> unifiedCompositionImplMap; + private static final EnumMap<UnifiedCompositionEntity, String> unifiedSubstitutionNodeTemplateIdGeneratorImplMap; + private static final String SUB_INTERFACE_INDICATOR_PROPERTY = "subinterface_indicator"; + + static { + Configuration config = ConfigurationManager.lookup(); + unifiedCompositionImplMap = config + .populateMap(ConfigConstants.MANDATORY_UNIFIED_MODEL_NAMESPACE, ConfigConstants.UNIFIED_COMPOSITION_IMPL_KEY, + ImplementationConfiguration.class); + unifiedSubstitutionNodeTemplateIdGeneratorImplMap = new EnumMap<>(UnifiedCompositionEntity.class); + initNodeTemplateIdGeneratorImplMap(); + } + + private final ConsolidationService consolidationService = new ConsolidationService(); + + private static void initNodeTemplateIdGeneratorImplMap() { + unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(COMPUTE, CommandImplNames.COMPUTE_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL); + unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(PORT, CommandImplNames.PORT_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL); + unifiedSubstitutionNodeTemplateIdGeneratorImplMap.put(SUB_INTERFACE, CommandImplNames.SUB_INTERFACE_NEW_NODE_TEMPLATE_ID_GENERATOR_IMPL); + } + + private static List<EntityConsolidationData> getPortConsolidationDataList(List<String> portIds, + List<UnifiedCompositionData> unifiedCompositionDataList) { + return unifiedCompositionDataList.stream() .flatMap(unifiedCompositionData -> unifiedCompositionData.getPortTemplateConsolidationDataList().stream()) .filter(portTemplateConsolidationData -> portIds.contains(portTemplateConsolidationData.getNodeTemplateId())) .collect(Collectors.toList()); - } - - /** - * Create unified composition. - * - * @param serviceTemplate the service template - * @param nestedServiceTemplate the nested service template - * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, - * one entry will be in this list, in case of having - * consolidation, all entries in the list are the once which - * need to be consolidated. - * @param mode the mode - * @param context the context - */ - public void createUnifiedComposition(ServiceTemplate serviceTemplate, - ServiceTemplate nestedServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - UnifiedCompositionMode mode, TranslationContext context) { - Optional<UnifiedComposition> unifiedCompositionInstance = getUnifiedCompositionInstance(mode); - if (!unifiedCompositionInstance.isPresent()) { - return; - } - unifiedCompositionInstance.get() - .createUnifiedComposition(serviceTemplate, nestedServiceTemplate, - unifiedCompositionDataList, context); - } - - /** - * Create unified substitution service template according to the input service template, based on - * the unified composition data. - * - * @param serviceTemplate the service template - * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, - * one entry will be in this list, in case of having - * consolidation, all entries in the list are the once which - * need to be consolidated. - * @param context the translation context - * @return the substitution service template - */ - public Optional<ServiceTemplate> createUnifiedSubstitutionServiceTemplate( - ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context, - String substitutionNodeTypeId, - Integer index) { - if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { - return Optional.empty(); - } - String templateName = getTemplateName(substitutionNodeTypeId, index); - ServiceTemplate substitutionServiceTemplate = - HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName); - - createIndexInputParameter(substitutionServiceTemplate); - - String computeNodeType = - handleCompute(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, - context); - handlePorts(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, - computeNodeType, context); - - UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, - substitutionServiceTemplate, unifiedCompositionDataList, context, null); - handleSubInterfaces(unifiedCompositionTo); - createOutputParameters(unifiedCompositionTo, computeNodeType); - NodeType substitutionGlobalNodeType = - handleSubstitutionGlobalNodeType(serviceTemplate, substitutionServiceTemplate, - context, substitutionNodeTypeId); - - HeatToToscaUtil.handleSubstitutionMapping(context, - substitutionNodeTypeId, - substitutionServiceTemplate, substitutionGlobalNodeType); - - context.getTranslatedServiceTemplates().put(templateName, substitutionServiceTemplate); - return Optional.of(substitutionServiceTemplate); - } - - - /** - * Create abstract substitute node template that can be substituted by the input - * substitutionServiceTemplate. - * - * @param serviceTemplate the service template - * @param substitutionServiceTemplate the subtitution service template - * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, - * one entry will be in this list, in case of having - * consolidation, all entries in the list are the once which - * need to be consolidated. - * @param context the translation context - * @return the abstract substitute node template id - */ - public String createAbstractSubstituteNodeTemplate( - ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - String substituteNodeTypeId, - TranslationContext context, - Integer index) { - - NodeTemplate substitutionNodeTemplate = new NodeTemplate(); - List<String> directiveList = new ArrayList<>(); - directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); - substitutionNodeTemplate.setDirectives(directiveList); - substitutionNodeTemplate.setType(substituteNodeTypeId); - Map<String, ParameterDefinition> substitutionTemplateInputs = DataModelUtil - .getInputParameters(substitutionServiceTemplate); - Optional<Map<String, Object>> abstractSubstitutionProperties = Optional.empty(); - if (Objects.nonNull(substitutionTemplateInputs)) { - abstractSubstitutionProperties = createAbstractSubstitutionProperties(serviceTemplate, - substitutionTemplateInputs, unifiedCompositionDataList, context); - } - abstractSubstitutionProperties.ifPresent(substitutionNodeTemplate::setProperties); - - //Add substitution filtering property - String substitutionServiceTemplateName = ToscaUtil.getServiceTemplateFileName( - substitutionServiceTemplate); - int count = unifiedCompositionDataList.size(); - DataModelUtil.addSubstitutionFilteringProperty(substitutionServiceTemplateName, - substitutionNodeTemplate, count); - //Add index_value property - addIndexValueProperty(substitutionNodeTemplate); - String substituteNodeTemplateId = getSubstituteNodeTemplateId(substituteNodeTypeId, index); - //Add node template id and related abstract node template id in context - addUnifiedSubstitionData(context, serviceTemplate, unifiedCompositionDataList, - substituteNodeTemplateId); - DataModelUtil - .addNodeTemplate(serviceTemplate, substituteNodeTemplateId, substitutionNodeTemplate); - return substituteNodeTemplateId; - - } - - public void createVfcInstanceGroup(String abstractNodeTemplateId, - ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - if (!TranslationContext.isVfcInstanceGroupingEnabled()) { - return; - } - UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, null, - unifiedCompositionDataList, context, null); - unifiedCompositionDataList.forEach(unifiedCompositionData -> - createSubInterfaceVfcInstanceGroup(abstractNodeTemplateId, unifiedCompositionTo, unifiedCompositionData)); - } - - private void createSubInterfaceVfcInstanceGroup(String abstractNodeTemplateId, - UnifiedCompositionTo unifiedCompositionTo, - UnifiedCompositionData unifiedCompositionData) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceTemplateConsolidationDataList) { - Optional<String> parentPortNetworkRole; - if (Objects.isNull(unifiedCompositionTo.getSubstitutionServiceTemplate())) { - parentPortNetworkRole = subInterface.getParentPortNetworkRole(unifiedCompositionTo.getServiceTemplate(), + } + + /** + * Create unified composition. + * + * @param serviceTemplate the service template + * @param nestedServiceTemplate the nested service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, one entry will be in this list, in case of + * having consolidation, all entries in the list are the once which need to be consolidated. + * @param mode the mode + * @param context the context + */ + public void createUnifiedComposition(ServiceTemplate serviceTemplate, ServiceTemplate nestedServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, UnifiedCompositionMode mode, + TranslationContext context) { + Optional<UnifiedComposition> unifiedCompositionInstance = getUnifiedCompositionInstance(mode); + if (!unifiedCompositionInstance.isPresent()) { + return; + } + unifiedCompositionInstance.get().createUnifiedComposition(serviceTemplate, nestedServiceTemplate, unifiedCompositionDataList, context); + } + + /** + * Create unified substitution service template according to the input service template, based on the unified composition data. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, one entry will be in this list, in case of + * having consolidation, all entries in the list are the once which need to be consolidated. + * @param context the translation context + * @return the substitution service template + */ + public Optional<ServiceTemplate> createUnifiedSubstitutionServiceTemplate(ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context, String substitutionNodeTypeId, + Integer index) { + if (CollectionUtils.isEmpty(unifiedCompositionDataList)) { + return Optional.empty(); + } + String templateName = getTemplateName(substitutionNodeTypeId, index); + ServiceTemplate substitutionServiceTemplate = HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName); + createIndexInputParameter(substitutionServiceTemplate); + String computeNodeType = handleCompute(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, context); + handlePorts(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, computeNodeType, context); + UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, + context, null); + handleSubInterfaces(unifiedCompositionTo); + createOutputParameters(unifiedCompositionTo, computeNodeType); + NodeType substitutionGlobalNodeType = handleSubstitutionGlobalNodeType(serviceTemplate, substitutionServiceTemplate, context, + substitutionNodeTypeId); + HeatToToscaUtil.handleSubstitutionMapping(context, substitutionNodeTypeId, substitutionServiceTemplate, substitutionGlobalNodeType); + context.getTranslatedServiceTemplates().put(templateName, substitutionServiceTemplate); + return Optional.of(substitutionServiceTemplate); + } + + /** + * Create abstract substitute node template that can be substituted by the input substitutionServiceTemplate. + * + * @param serviceTemplate the service template + * @param substitutionServiceTemplate the subtitution service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, one entry will be in this list, in case of + * having consolidation, all entries in the list are the once which need to be consolidated. + * @param context the translation context + * @return the abstract substitute node template id + */ + public String createAbstractSubstituteNodeTemplate(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, String substituteNodeTypeId, + TranslationContext context, Integer index) { + NodeTemplate substitutionNodeTemplate = new NodeTemplate(); + List<String> directiveList = new ArrayList<>(); + directiveList.add(ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); + substitutionNodeTemplate.setDirectives(directiveList); + substitutionNodeTemplate.setType(substituteNodeTypeId); + Map<String, ParameterDefinition> substitutionTemplateInputs = DataModelUtil.getInputParameters(substitutionServiceTemplate); + Optional<Map<String, Object>> abstractSubstitutionProperties = Optional.empty(); + if (Objects.nonNull(substitutionTemplateInputs)) { + abstractSubstitutionProperties = createAbstractSubstitutionProperties(serviceTemplate, substitutionTemplateInputs, + unifiedCompositionDataList, context); + } + abstractSubstitutionProperties.ifPresent(substitutionNodeTemplate::setProperties); + //Add substitution filtering property + String substitutionServiceTemplateName = ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate); + int count = unifiedCompositionDataList.size(); + DataModelUtil.addSubstitutionFilteringProperty(substitutionServiceTemplateName, substitutionNodeTemplate, count); + //Add index_value property + addIndexValueProperty(substitutionNodeTemplate); + String substituteNodeTemplateId = getSubstituteNodeTemplateId(substituteNodeTypeId, index); + //Add node template id and related abstract node template id in context + addUnifiedSubstitionData(context, serviceTemplate, unifiedCompositionDataList, substituteNodeTemplateId); + DataModelUtil.addNodeTemplate(serviceTemplate, substituteNodeTemplateId, substitutionNodeTemplate); + return substituteNodeTemplateId; + } + + public void createVfcInstanceGroup(String abstractNodeTemplateId, ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + if (!TranslationContext.isVfcInstanceGroupingEnabled()) { + return; + } + UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, null, unifiedCompositionDataList, context, null); + unifiedCompositionDataList.forEach( + unifiedCompositionData -> createSubInterfaceVfcInstanceGroup(abstractNodeTemplateId, unifiedCompositionTo, unifiedCompositionData)); + } + + private void createSubInterfaceVfcInstanceGroup(String abstractNodeTemplateId, UnifiedCompositionTo unifiedCompositionTo, + UnifiedCompositionData unifiedCompositionData) { + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceTemplateConsolidationDataList) { + Optional<String> parentPortNetworkRole; + if (Objects.isNull(unifiedCompositionTo.getSubstitutionServiceTemplate())) { + parentPortNetworkRole = subInterface + .getParentPortNetworkRole(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo.getContext()); + } else { + parentPortNetworkRole = subInterface + .getParentPortNetworkRole(unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext()); + } + String subInterfaceNetworkRole = subInterface.getNetworkRole(); + if (Objects.nonNull(subInterfaceNetworkRole) && parentPortNetworkRole.isPresent()) { + createVfcInstanceGroupPerSubInterfaceNetworkRole(abstractNodeTemplateId, subInterfaceNetworkRole, parentPortNetworkRole.get(), + unifiedCompositionTo.getServiceTemplate()); + } + } + } + + private void createVfcInstanceGroupPerSubInterfaceNetworkRole(String abstractNodeTemplateId, String subInterfaceNetworkRole, + String parentPortNetworkRole, ServiceTemplate serviceTemplate) { + String vfcNetworkRoleGroupId = getVfcNetworkRoleGroupId(subInterfaceNetworkRole); + Map<String, GroupDefinition> groups = DataModelUtil.getGroups(serviceTemplate); + if (!groups.containsKey(vfcNetworkRoleGroupId)) { + createNewVfcInstanceGroup(serviceTemplate, parentPortNetworkRole, subInterfaceNetworkRole, vfcNetworkRoleGroupId); + } + DataModelUtil.addGroupMember(serviceTemplate, vfcNetworkRoleGroupId, abstractNodeTemplateId); + } + + private void createNewVfcInstanceGroup(ServiceTemplate serviceTemplate, String parentPortNetworkRole, String subInterfaceNetworkRole, + String vfcNetworkRoleGroupId) { + Map<String, Object> properties = new HashMap<>(); + properties.put(SUB_INTERFACE_ROLE, subInterfaceNetworkRole); + properties.put(VFC_PARENT_PORT_ROLE, parentPortNetworkRole); + updateVfcInstanceGroupExposedProperties(subInterfaceNetworkRole, serviceTemplate, properties); + GroupDefinition groupDefinition = new GroupDefinition(); + groupDefinition.setType(GROUP_TYPE_PREFIX + VFC_INSTANCE_GROUP); + groupDefinition.setProperties(properties); + DataModelUtil.addGroupDefinitionToTopologyTemplate(serviceTemplate, vfcNetworkRoleGroupId, groupDefinition); + } + + private void updateVfcInstanceGroupExposedProperties(String subInterfaceNetworkRole, ServiceTemplate serviceTemplate, + Map<String, Object> properties) { + List<String> exposedVfcInstanceGroupingProperties = TranslationContext.getExposedVfcInstanceGroupingProperties(); + if (CollectionUtils.isEmpty(exposedVfcInstanceGroupingProperties)) { + return; + } + for (String propertyName : exposedVfcInstanceGroupingProperties) { + Map<String, Object> getInputMap = new HashMap<>(); + String vfcGroupPropertyInputName = subInterfaceNetworkRole + "_" + propertyName; + getInputMap.put(GET_INPUT.getFunctionName(), vfcGroupPropertyInputName); + properties.put(propertyName, getInputMap); + addInputParameter(vfcGroupPropertyInputName, PropertyType.STRING.getDisplayName(), null, serviceTemplate); + } + } + + private String getVfcNetworkRoleGroupId(String subInterfaceNetworkRole) { + StringBuilder sb = new StringBuilder(); + sb.append(subInterfaceNetworkRole).append("_").append(GROUP); + return sb.toString(); + } + + /** + * Update the connectivity from/to the "moved" nodes from the original service template to the new substitution service template. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, one entry will be in this list, in case of + * having consolidation, all entries in the list are the once which need to be consolidated. + * @param context the translation context + */ + public void updateCompositionConnectivity(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + updOutputParamGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updNodesConnectedOutConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updVolumeConnectivity(serviceTemplate, unifiedCompositionDataList, context); + updGroupsConnectivity(serviceTemplate, unifiedCompositionDataList, context); + } + + /** + * Delete the "moved" nodes from the original service template to the new substitution service template. + * + * @param serviceTemplate the service template + * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, one entry will be in this list, in case of + * having consolidation, all entries in the list are the once which need to be consolidated. + * @param context the translation context + */ + public void cleanUnifiedCompositionEntities(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + //Clean compute node template data from top level service template + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + cleanServiceTemplate(serviceTemplate, computeTemplateConsolidationData, context); + //Clean port node template data from top level service template + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + cleanServiceTemplate(serviceTemplate, portTemplateConsolidationData, context); + } + //Clean sub-interface node template data from top level service template + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + cleanServiceTemplate(serviceTemplate, subInterfaceTemplateConsolidationData, context); + } + } + } + + /** + * 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) { + for (UnifiedCompositionData unifiedData : unifiedCompositionDataList) { + removeCleanedNodeType(unifiedData.getComputeTemplateConsolidationData().getNodeTemplateId(), serviceTemplate, context); + } + if (MapUtils.isEmpty(serviceTemplate.getNode_types())) { + serviceTemplate.setNode_types(null); + } + } + + public void updateSubstitutionNodeTypePrefix(ServiceTemplate substitutionServiceTemplate) { + Map<String, NodeTemplate> nodeTemplates = substitutionServiceTemplate.getTopology_template().getNode_templates(); + for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) { + String nodeTypeId = nodeTemplateEntry.getValue().getType(); + NodeType origNodeType = substitutionServiceTemplate.getNode_types().get(nodeTypeId); + if (Objects.nonNull(origNodeType) && nodeTypeId.startsWith(ToscaNodeType.VFC_TYPE_PREFIX) && origNodeType.getDerived_from() + .equals(ToscaNodeType.NOVA_SERVER)) { + substitutionServiceTemplate.getNode_types().remove(nodeTypeId); + String newNodeTypeId = nodeTypeId.replace(ToscaNodeType.VFC_TYPE_PREFIX, ToscaNodeType.COMPUTE_TYPE_PREFIX); + nodeTemplateEntry.getValue().setType(newNodeTypeId); + DataModelUtil.addNodeTemplate(substitutionServiceTemplate, nodeTemplateEntry.getKey(), nodeTemplateEntry.getValue()); + substitutionServiceTemplate.getNode_types().put(newNodeTypeId, origNodeType); + } + } + } + + /** + * Update unified abstract nodes connectivity. + * + * @param serviceTemplate the service template + * @param context the context + */ + public void updateUnifiedAbstractNodesConnectivity(ServiceTemplate serviceTemplate, TranslationContext context) { + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + UnifiedSubstitutionData unifiedSubstitutionData = context.getUnifiedSubstitutionData().get(serviceTemplateFileName); + if (Objects.nonNull(unifiedSubstitutionData)) { + //Handle get attribute in connectivity for abstarct node to abstract node templates + Set<String> abstractNodeIds = new HashSet<>(unifiedSubstitutionData.getAllRelatedAbstractNodeIds()); + handleGetAttrInConnectivity(serviceTemplate, abstractNodeIds, context); + //Handle get attribute in connectivity for abstract node templates to nested node template + Set<String> nestedNodeIds = new HashSet<>(unifiedSubstitutionData.getAllUnifiedNestedNodeTemplateIds()); + handleGetAttrInConnectivity(serviceTemplate, nestedNodeIds, context); + } + } + + /** + * Handle unified nested definition. + * + * @param unifiedCompositionTo the unified composition data transfer object + * @param unifiedCompositionData the unified composition data + */ + public void handleUnifiedNestedDefinition(UnifiedCompositionTo unifiedCompositionTo, UnifiedCompositionData unifiedCompositionData) { + handleUnifiedNestedNodeType(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext()); - } else { - parentPortNetworkRole = subInterface.getParentPortNetworkRole(unifiedCompositionTo - .getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext()); - } - String subInterfaceNetworkRole = subInterface.getNetworkRole(); - if (Objects.nonNull(subInterfaceNetworkRole) && parentPortNetworkRole.isPresent()) { - createVfcInstanceGroupPerSubInterfaceNetworkRole(abstractNodeTemplateId, subInterfaceNetworkRole, - parentPortNetworkRole.get(), unifiedCompositionTo.getServiceTemplate()); - } - } - } - - private void createVfcInstanceGroupPerSubInterfaceNetworkRole(String abstractNodeTemplateId, - String subInterfaceNetworkRole, - String parentPortNetworkRole, - ServiceTemplate serviceTemplate) { - String vfcNetworkRoleGroupId = getVfcNetworkRoleGroupId(subInterfaceNetworkRole); - Map<String, GroupDefinition> groups = DataModelUtil.getGroups(serviceTemplate); - if (!groups.containsKey(vfcNetworkRoleGroupId)) { - createNewVfcInstanceGroup(serviceTemplate, parentPortNetworkRole, subInterfaceNetworkRole, vfcNetworkRoleGroupId); - } - DataModelUtil.addGroupMember(serviceTemplate, vfcNetworkRoleGroupId, abstractNodeTemplateId); - } - - private void createNewVfcInstanceGroup(ServiceTemplate serviceTemplate, - String parentPortNetworkRole, - String subInterfaceNetworkRole, - String vfcNetworkRoleGroupId) { - Map<String, Object> properties = new HashMap<>(); - properties.put(SUB_INTERFACE_ROLE, subInterfaceNetworkRole); - properties.put(VFC_PARENT_PORT_ROLE, parentPortNetworkRole); - - updateVfcInstanceGroupExposedProperties(subInterfaceNetworkRole, - serviceTemplate, properties); - - GroupDefinition groupDefinition = new GroupDefinition(); - groupDefinition.setType(GROUP_TYPE_PREFIX + VFC_INSTANCE_GROUP); - groupDefinition.setProperties(properties); - - DataModelUtil.addGroupDefinitionToTopologyTemplate(serviceTemplate, - vfcNetworkRoleGroupId, groupDefinition); - } - - private void updateVfcInstanceGroupExposedProperties(String subInterfaceNetworkRole, - ServiceTemplate serviceTemplate, - Map<String, Object> properties) { - List<String> exposedVfcInstanceGroupingProperties = - TranslationContext.getExposedVfcInstanceGroupingProperties(); - - if (CollectionUtils.isEmpty(exposedVfcInstanceGroupingProperties)) { - return; - } - - for (String propertyName : exposedVfcInstanceGroupingProperties) { - Map<String, Object> getInputMap = new HashMap<>(); - String vfcGroupPropertyInputName = subInterfaceNetworkRole + "_" + propertyName; - getInputMap.put(GET_INPUT.getFunctionName(), vfcGroupPropertyInputName); - properties.put(propertyName, getInputMap); - - addInputParameter(vfcGroupPropertyInputName, PropertyType.STRING.getDisplayName(), null, - serviceTemplate); - } - } - - private String getVfcNetworkRoleGroupId(String subInterfaceNetworkRole) { - StringBuilder sb = new StringBuilder(); - sb.append(subInterfaceNetworkRole).append("_").append(GROUP); - return sb.toString(); - } - - /** - * Update the connectivity from/to the "moved" nodes from the original service template to the new - * substitution service template. - * - * @param serviceTemplate the service template - * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, - * one entry will be in this list, in case of having - * consolidation, all entries in the list are the once which - * need to be consolidated. - * @param context the translation context - */ - public void updateCompositionConnectivity(ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - updOutputParamGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context); - updNodesGetAttrInConnectivity(serviceTemplate, unifiedCompositionDataList, context); - updNodesConnectedOutConnectivity(serviceTemplate, unifiedCompositionDataList, context); - updNodesConnectedInConnectivity(serviceTemplate, unifiedCompositionDataList, context); - updVolumeConnectivity(serviceTemplate, unifiedCompositionDataList, context); - updGroupsConnectivity(serviceTemplate, unifiedCompositionDataList, context); - } - - /** - * Delete the "moved" nodes from the original service template to the new substitution service - * template. - * - * @param serviceTemplate the service template - * @param unifiedCompositionDataList the unified composition data list. In case no consolidation, - * one entry will be in this list, in case of having - * consolidation, all entries in the list are the once which - * need to be consolidated. - * @param context the translation context - */ - public void cleanUnifiedCompositionEntities( - ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - //Clean compute node template data from top level service template - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionData.getComputeTemplateConsolidationData(); - cleanServiceTemplate(serviceTemplate, computeTemplateConsolidationData, context); - - //Clean port node template data from top level service template - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - cleanServiceTemplate(serviceTemplate, portTemplateConsolidationData, context); - } - - //Clean sub-interface node template data from top level service template - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - cleanServiceTemplate(serviceTemplate, subInterfaceTemplateConsolidationData, context); - } - } - } - - /** - * 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) { - for (UnifiedCompositionData unifiedData : unifiedCompositionDataList) { - removeCleanedNodeType( - unifiedData.getComputeTemplateConsolidationData().getNodeTemplateId(), serviceTemplate, - context); - } - if (MapUtils.isEmpty(serviceTemplate.getNode_types())) { - serviceTemplate.setNode_types(null); - } - } - - public void updateSubstitutionNodeTypePrefix(ServiceTemplate substitutionServiceTemplate) { - Map<String, NodeTemplate> nodeTemplates = - substitutionServiceTemplate.getTopology_template().getNode_templates(); - - for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) { - String nodeTypeId = nodeTemplateEntry.getValue().getType(); - NodeType origNodeType = substitutionServiceTemplate.getNode_types().get(nodeTypeId); - if (Objects.nonNull(origNodeType) - && nodeTypeId.startsWith(ToscaNodeType.VFC_TYPE_PREFIX) - && origNodeType.getDerived_from().equals(ToscaNodeType.NOVA_SERVER)) { - substitutionServiceTemplate.getNode_types().remove(nodeTypeId); - - String newNodeTypeId = - nodeTypeId.replace(ToscaNodeType.VFC_TYPE_PREFIX, ToscaNodeType.COMPUTE_TYPE_PREFIX); - nodeTemplateEntry.getValue().setType(newNodeTypeId); - DataModelUtil - .addNodeTemplate(substitutionServiceTemplate, nodeTemplateEntry.getKey(), - nodeTemplateEntry.getValue()); - substitutionServiceTemplate.getNode_types().put(newNodeTypeId, origNodeType); - } - } - } - - /** - * Update unified abstract nodes connectivity. - * - * @param serviceTemplate the service template - * @param context the context - */ - public void updateUnifiedAbstractNodesConnectivity(ServiceTemplate serviceTemplate, - TranslationContext context) { + updateUnifiedNestedTemplates(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo.getSubstitutionServiceTemplate(), + unifiedCompositionData, unifiedCompositionTo.getContext()); + } + private void handleGetAttrInConnectivity(ServiceTemplate serviceTemplate, Set<String> unifiedNodeIds, TranslationContext context) { + Map<String, NodeTemplate> nodeTemplates = serviceTemplate.getTopology_template().getNode_templates(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + for (String unifiedNodeId : unifiedNodeIds) { + NodeTemplate nodeTemplate = nodeTemplates.get(unifiedNodeId); + handleGetAttrInAbstractNodeTemplate(serviceTemplate, context, serviceTemplateFileName, nodeTemplate); + } + } - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - UnifiedSubstitutionData unifiedSubstitutionData = context.getUnifiedSubstitutionData() - .get(serviceTemplateFileName); - - if (Objects.nonNull(unifiedSubstitutionData)) { - //Handle get attribute in connectivity for abstarct node to abstract node templates - Set<String> abstractNodeIds = - new HashSet<>(unifiedSubstitutionData.getAllRelatedAbstractNodeIds()); - handleGetAttrInConnectivity(serviceTemplate, abstractNodeIds, context); - //Handle get attribute in connectivity for abstract node templates to nested node template - Set<String> nestedNodeIds = - new HashSet<>(unifiedSubstitutionData.getAllUnifiedNestedNodeTemplateIds()); - handleGetAttrInConnectivity(serviceTemplate, nestedNodeIds, context); - } - } - - /** - * Handle unified nested definition. - * - * @param unifiedCompositionTo the unified composition data transfer object - * @param unifiedCompositionData the unified composition data - */ - public void handleUnifiedNestedDefinition(UnifiedCompositionTo unifiedCompositionTo, - UnifiedCompositionData unifiedCompositionData) { - handleUnifiedNestedNodeType(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo - .getSubstitutionServiceTemplate(), unifiedCompositionTo.getContext()); - updateUnifiedNestedTemplates(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo - .getSubstitutionServiceTemplate(), unifiedCompositionData, unifiedCompositionTo.getContext()); - } - - private void handleGetAttrInConnectivity(ServiceTemplate serviceTemplate, - Set<String> unifiedNodeIds, - TranslationContext context) { - Map<String, NodeTemplate> nodeTemplates = - serviceTemplate.getTopology_template().getNode_templates(); - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - for (String unifiedNodeId : unifiedNodeIds) { - NodeTemplate nodeTemplate = nodeTemplates.get(unifiedNodeId); - handleGetAttrInAbstractNodeTemplate(serviceTemplate, context, serviceTemplateFileName, - nodeTemplate); - } - } - - private void handleUnifiedNestedNodeType(ServiceTemplate mainServiceTemplate, - ServiceTemplate nestedServiceTemplate, - TranslationContext context) { - - - SubstitutionMapping substitutionMappings = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings(); - String nodeTypeId = substitutionMappings.getNode_type(); - - Optional<String> newNestedNodeTypeId = getNewNestedNodeTypeId(nestedServiceTemplate, context); - - ServiceTemplate globalSubstitutionServiceTemplate = - context.getGlobalSubstitutionServiceTemplate(); - - if (isNestedServiceTemplateWasHandled(globalSubstitutionServiceTemplate, nestedServiceTemplate, - context, - newNestedNodeTypeId)) { - context - .updateHandledComputeType(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), - newNestedNodeTypeId.get(), - ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); - return; - } - - - newNestedNodeTypeId.ifPresent( - newNestedNodeTypeIdVal -> handleNestedNodeType(nodeTypeId, newNestedNodeTypeIdVal, - nestedServiceTemplate, mainServiceTemplate, globalSubstitutionServiceTemplate, - context)); - - } - - private boolean isNestedServiceTemplateWasHandled(ServiceTemplate mainServiceTemplate, - ServiceTemplate nestedServiceTemplate, - TranslationContext context, - Optional<String> newNestedNodeTypeId) { - return newNestedNodeTypeId.isPresent() - && context.isNestedServiceTemplateWasHandled( - ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + private void handleUnifiedNestedNodeType(ServiceTemplate mainServiceTemplate, ServiceTemplate nestedServiceTemplate, TranslationContext context) { + SubstitutionMapping substitutionMappings = nestedServiceTemplate.getTopology_template().getSubstitution_mappings(); + String nodeTypeId = substitutionMappings.getNode_type(); + Optional<String> newNestedNodeTypeId = getNewNestedNodeTypeId(nestedServiceTemplate, context); + ServiceTemplate globalSubstitutionServiceTemplate = context.getGlobalSubstitutionServiceTemplate(); + if (isNestedServiceTemplateWasHandled(globalSubstitutionServiceTemplate, nestedServiceTemplate, context, newNestedNodeTypeId)) { + context.updateHandledComputeType(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), newNestedNodeTypeId.get(), + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); + return; + } + newNestedNodeTypeId.ifPresent( + newNestedNodeTypeIdVal -> handleNestedNodeType(nodeTypeId, newNestedNodeTypeIdVal, nestedServiceTemplate, mainServiceTemplate, + globalSubstitutionServiceTemplate, context)); + } + + private boolean isNestedServiceTemplateWasHandled(ServiceTemplate mainServiceTemplate, ServiceTemplate nestedServiceTemplate, + TranslationContext context, Optional<String> newNestedNodeTypeId) { + return newNestedNodeTypeId.isPresent() && context.isNestedServiceTemplateWasHandled(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); - } + } + + private void handleNestedNodeType(String nodeTypeId, String newNestedNodeTypeId, ServiceTemplate nestedServiceTemplate, + ServiceTemplate mainServiceTemplate, ServiceTemplate globalSubstitutionServiceTemplate, + TranslationContext context) { + updateNestedServiceTemplate(nestedServiceTemplate, context); + updateNestedNodeType(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate, mainServiceTemplate, globalSubstitutionServiceTemplate, context); + } + + private void updateNestedServiceTemplate(ServiceTemplate nestedServiceTemplate, TranslationContext context) { + enrichPortProperties(nestedServiceTemplate, context); + } + + private void enrichPortProperties(ServiceTemplate nestedServiceTemplate, TranslationContext context) { + String nestedServiceTemplateFileName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate); + FilePortConsolidationData filePortConsolidationData = context.getConsolidationData().getPortConsolidationData() + .getFilePortConsolidationData(nestedServiceTemplateFileName); + if (Objects.nonNull(filePortConsolidationData)) { + Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds(); + if (Objects.nonNull(portNodeTemplateIds)) { + for (String portNodeTemplateId : portNodeTemplateIds) { + NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(nestedServiceTemplate, portNodeTemplateId); + List<EntityConsolidationData> portEntityConsolidationDataList = new ArrayList<>(); + portEntityConsolidationDataList.add(filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId)); + handleNodeTypeProperties(nestedServiceTemplate, portEntityConsolidationDataList, portNodeTemplate, UnifiedCompositionEntity.PORT, + null, context); + //Add subinterface_indicator property to PORT + addPortSubInterfaceIndicatorProperty(portNodeTemplate.getProperties(), + filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId)); + } + } + } + } + + private void updateNestedNodeType(String nodeTypeId, String newNestedNodeTypeId, ServiceTemplate nestedServiceTemplate, + ServiceTemplate mainServiceTemplate, ServiceTemplate globalSubstitutionServiceTemplate, + TranslationContext context) { + String indexedNewNestedNodeTypeId = updateNodeTypeId(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate, mainServiceTemplate, + globalSubstitutionServiceTemplate, context); + updateNodeTypeProperties(nestedServiceTemplate, globalSubstitutionServiceTemplate, indexedNewNestedNodeTypeId); + } - private void handleNestedNodeType(String nodeTypeId, String newNestedNodeTypeId, - ServiceTemplate nestedServiceTemplate, - ServiceTemplate mainServiceTemplate, - ServiceTemplate globalSubstitutionServiceTemplate, + private void updateNodeTypeProperties(ServiceTemplate nestedServiceTemplate, ServiceTemplate globalSubstitutionServiceTemplate, + String nodeTypeId) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + Map<String, PropertyDefinition> nodeTypePropertiesDefinition = toscaAnalyzerService + .manageSubstitutionNodeTypeProperties(nestedServiceTemplate); + NodeType nestedNodeType = DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, nodeTypeId); + nestedNodeType.setProperties(nodeTypePropertiesDefinition); + } + + private String updateNodeTypeId(String nodeTypeId, String newNestedNodeTypeId, ServiceTemplate nestedServiceTemplate, + ServiceTemplate mainServiceTemplate, ServiceTemplate globalSubstitutionServiceTemplate, TranslationContext context) { - updateNestedServiceTemplate(nestedServiceTemplate, context); - updateNestedNodeType(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate, - mainServiceTemplate, + String indexedNewNestedNodeTypeId = handleNestedNodeTypeInGlobalSubstitutionTemplate(nodeTypeId, newNestedNodeTypeId, globalSubstitutionServiceTemplate, context); + handleSubstitutionMappingInNestedServiceTemplate(indexedNewNestedNodeTypeId, nestedServiceTemplate, context); + context.updateHandledComputeType(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), + ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate), newNestedNodeTypeId); + return indexedNewNestedNodeTypeId; + } + private String handleNestedNodeTypeInGlobalSubstitutionTemplate(String nodeTypeId, String newNestedNodeTypeId, + ServiceTemplate globalSubstitutionServiceTemplate, TranslationContext context) { + String indexedNodeType = getIndexedGlobalNodeTypeId(newNestedNodeTypeId, context); + context.updateUsedTimesForNestedComputeNodeType(ToscaUtil.getServiceTemplateFileName(globalSubstitutionServiceTemplate), newNestedNodeTypeId); + handleNestedNodeTypesInGlobalSubstituteServiceTemplate(nodeTypeId, indexedNodeType, globalSubstitutionServiceTemplate, context); + return indexedNodeType; + } - } + private String getIndexedGlobalNodeTypeId(String newNestedNodeTypeId, TranslationContext context) { + int globalNodeTypeIndex = context + .getGlobalNodeTypeIndex(ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME), newNestedNodeTypeId); + return globalNodeTypeIndex > 0 ? newNestedNodeTypeId + "_" + globalNodeTypeIndex : newNestedNodeTypeId; + } - private void updateNestedServiceTemplate(ServiceTemplate nestedServiceTemplate, - TranslationContext context) { - enrichPortProperties(nestedServiceTemplate, context); - } + private void updateUnifiedNestedTemplates(ServiceTemplate mainServiceTemplate, ServiceTemplate nestedServiceTemplate, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { + NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.isNull(nestedTemplateConsolidationData)) { + return; + } + handleNestedNodeTemplateInMainServiceTemplate(nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate, nestedServiceTemplate, + context); + } - private void enrichPortProperties(ServiceTemplate nestedServiceTemplate, - TranslationContext context) { - String nestedServiceTemplateFileName = - ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate); - FilePortConsolidationData filePortConsolidationData = - context.getConsolidationData().getPortConsolidationData().getFilePortConsolidationData - (nestedServiceTemplateFileName); - - if (Objects.nonNull(filePortConsolidationData)) { - Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds(); - if (Objects.nonNull(portNodeTemplateIds)) { - for (String portNodeTemplateId : portNodeTemplateIds) { - NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(nestedServiceTemplate, - portNodeTemplateId); - List<EntityConsolidationData> portEntityConsolidationDataList = new ArrayList<>(); - portEntityConsolidationDataList.add(filePortConsolidationData - .getPortTemplateConsolidationData(portNodeTemplateId)); - - handleNodeTypeProperties(nestedServiceTemplate, - portEntityConsolidationDataList, portNodeTemplate, UnifiedCompositionEntity.PORT, - null, context); - //Add subinterface_indicator property to PORT - addPortSubInterfaceIndicatorProperty(portNodeTemplate.getProperties(), - filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId)); - } - } - } - } - - private void updateNestedNodeType(String nodeTypeId, String newNestedNodeTypeId, - ServiceTemplate nestedServiceTemplate, - ServiceTemplate mainServiceTemplate, - ServiceTemplate globalSubstitutionServiceTemplate, - TranslationContext context) { - String indexedNewNestedNodeTypeId = - updateNodeTypeId(nodeTypeId, newNestedNodeTypeId, nestedServiceTemplate, - mainServiceTemplate, - globalSubstitutionServiceTemplate, context); - - updateNodeTypeProperties(nestedServiceTemplate, globalSubstitutionServiceTemplate, - indexedNewNestedNodeTypeId); - } - - private void updateNodeTypeProperties(ServiceTemplate nestedServiceTemplate, - ServiceTemplate globalSubstitutionServiceTemplate, - String nodeTypeId) { - ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - Map<String, PropertyDefinition> nodeTypePropertiesDefinition = - toscaAnalyzerService.manageSubstitutionNodeTypeProperties(nestedServiceTemplate); - NodeType nestedNodeType = - DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, nodeTypeId); - nestedNodeType.setProperties(nodeTypePropertiesDefinition); - } - - private String updateNodeTypeId(String nodeTypeId, String newNestedNodeTypeId, - ServiceTemplate nestedServiceTemplate, - ServiceTemplate mainServiceTemplate, - ServiceTemplate globalSubstitutionServiceTemplate, - TranslationContext context) { - String indexedNewNestedNodeTypeId = - handleNestedNodeTypeInGlobalSubstitutionTemplate(nodeTypeId, newNestedNodeTypeId, - globalSubstitutionServiceTemplate, context); - - handleSubstitutionMappingInNestedServiceTemplate(indexedNewNestedNodeTypeId, - nestedServiceTemplate, context); - - context - .updateHandledComputeType( - ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), - ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate), - newNestedNodeTypeId); - return indexedNewNestedNodeTypeId; - } - - private String handleNestedNodeTypeInGlobalSubstitutionTemplate(String nodeTypeId, - String newNestedNodeTypeId, - ServiceTemplate globalSubstitutionServiceTemplate, - TranslationContext context) { - String indexedNodeType = - getIndexedGlobalNodeTypeId(newNestedNodeTypeId, context); - context.updateUsedTimesForNestedComputeNodeType( - ToscaUtil.getServiceTemplateFileName(globalSubstitutionServiceTemplate), - newNestedNodeTypeId); - handleNestedNodeTypesInGlobalSubstituteServiceTemplate(nodeTypeId, indexedNodeType, - globalSubstitutionServiceTemplate, context); - return indexedNodeType; - } + /** + * Update connectivity for unified nested patterns. + * + * @param unifiedCompositionTo the unified composition data transfer object + * @param unifiedCompositionData the unified composition data + */ + public void updateUnifiedNestedConnectivity(UnifiedCompositionTo unifiedCompositionTo, UnifiedCompositionData unifiedCompositionData) { + updNestedCompositionNodesConnectedInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData, + unifiedCompositionTo.getContext()); + updNestedCompositionNodesConnectedOutConnectivity(unifiedCompositionTo.getServiceTemplate(), + unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionData, unifiedCompositionTo.getContext()); + updNestedCompositionNodesGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData, + unifiedCompositionTo.getContext()); + updNestedCompositionOutputParamGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData, + unifiedCompositionTo.getContext()); + } - private String getIndexedGlobalNodeTypeId(String newNestedNodeTypeId, - TranslationContext context) { - int globalNodeTypeIndex = - context.getGlobalNodeTypeIndex( - ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME), - newNestedNodeTypeId); - return globalNodeTypeIndex > 0 ? newNestedNodeTypeId + "_" - + globalNodeTypeIndex : newNestedNodeTypeId; - } - - private void updateUnifiedNestedTemplates(ServiceTemplate mainServiceTemplate, - ServiceTemplate nestedServiceTemplate, - UnifiedCompositionData unifiedCompositionData, - TranslationContext context) { + /** + * Clean unified nested entities. Update the heat stack group with the new node template ids. + * + * @param unifiedCompositionTo the unified composition data transfer object + * @param unifiedCompositionData the unified composition data + */ + public void cleanUnifiedNestedEntities(UnifiedCompositionTo unifiedCompositionTo, UnifiedCompositionData unifiedCompositionData) { + EntityConsolidationData entityConsolidationData = unifiedCompositionData.getNestedTemplateConsolidationData(); + updateHeatStackGroupNestedComposition(unifiedCompositionTo.getServiceTemplate(), entityConsolidationData, unifiedCompositionTo.getContext()); + } - NestedTemplateConsolidationData nestedTemplateConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - if (Objects.isNull(nestedTemplateConsolidationData)) { - return; - } - handleNestedNodeTemplateInMainServiceTemplate( - nestedTemplateConsolidationData.getNodeTemplateId(), mainServiceTemplate, - nestedServiceTemplate, context); - } - - /** - * Update connectivity for unified nested patterns. - * - * @param unifiedCompositionTo the unified composition data transfer object - * @param unifiedCompositionData the unified composition data - */ - public void updateUnifiedNestedConnectivity(UnifiedCompositionTo unifiedCompositionTo, - UnifiedCompositionData unifiedCompositionData) { - - updNestedCompositionNodesConnectedInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData, - unifiedCompositionTo.getContext()); - updNestedCompositionNodesConnectedOutConnectivity(unifiedCompositionTo.getServiceTemplate(), - unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionData, unifiedCompositionTo - .getContext()); - updNestedCompositionNodesGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionData, - unifiedCompositionTo.getContext()); - updNestedCompositionOutputParamGetAttrInConnectivity(unifiedCompositionTo.getServiceTemplate(), - unifiedCompositionData, unifiedCompositionTo.getContext()); - } - - - /** - * Clean unified nested entities. Update the heat stack group with the new node template ids. - * - * @param unifiedCompositionTo the unified composition data transfer object - * @param unifiedCompositionData the unified composition data - */ - public void cleanUnifiedNestedEntities(UnifiedCompositionTo unifiedCompositionTo, - UnifiedCompositionData unifiedCompositionData) { - EntityConsolidationData entityConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - updateHeatStackGroupNestedComposition(unifiedCompositionTo.getServiceTemplate(), entityConsolidationData, - unifiedCompositionTo.getContext()); - - } - - public void createNestedVfcInstanceGroup(String nestedNodeTemplateId, - UnifiedCompositionTo unifiedCompositionTo, - UnifiedCompositionData unifiedCompositionData) { - if (!TranslationContext.isVfcInstanceGroupingEnabled()) { - return; - } - createSubInterfaceVfcInstanceGroup(nestedNodeTemplateId, unifiedCompositionTo, unifiedCompositionData); - } - - public void handleComplexVfcType(ServiceTemplate serviceTemplate, TranslationContext context) { - SubstitutionMapping substitutionMapping = - serviceTemplate.getTopology_template().getSubstitution_mappings(); - - if (Objects.isNull(substitutionMapping)) { - return; - } - - ServiceTemplate globalSubstitutionServiceTemplate = - context.getGlobalSubstitutionServiceTemplate(); - - String substitutionNT = substitutionMapping.getNode_type(); - if (globalSubstitutionServiceTemplate.getNode_types().containsKey(substitutionNT)) { - //This needs to be done when catalog is ready for complex VFC - } - } - - - protected void updNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> - unifiedCompositionDataList, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData - .getComputeTemplateConsolidationData(); - //Add requirements in the abstract node template for nodes connected out for computes - String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - Multimap<String, RequirementAssignmentData> computeNodesConnectedOut = - computeTemplateConsolidationData.getNodesConnectedOut(); - if (computeNodesConnectedOut != null) { - updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData, - newComputeNodeTemplateId, computeNodesConnectedOut, context); - } - String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData - .getNodeTemplateId()); - //Add requirements in the abstract node template for nodes connected out for ports - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData - .getNodeTemplateId(), computeType, computeTemplateConsolidationData); - Multimap<String, RequirementAssignmentData> portNodesConnectedOut = - portTemplateConsolidationData.getNodesConnectedOut(); - if (portNodesConnectedOut != null) { - updateRequirementInAbstractNodeTemplate(serviceTemplate, portTemplateConsolidationData, - newPortNodeTemplateId, portNodesConnectedOut, context); - } - } - //For sub-interface - //Add requirements in the abstract node template for nodes connected out for ports - updateSubInterfaceNodesConnectedOut(serviceTemplate, unifiedCompositionData, - computeTemplateConsolidationData, computeType, context); - } - } - - private void updateSubInterfaceNodesConnectedOut(ServiceTemplate serviceTemplate, - UnifiedCompositionData unifiedCompositionData, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - String computeType, - TranslationContext context) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, - computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context); - Multimap<String, RequirementAssignmentData> subInterfaceNodesConnectedOut = - subInterfaceTemplateConsolidationData.getNodesConnectedOut(); - if (subInterfaceNodesConnectedOut != null) { - updateRequirementInAbstractNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData, - newSubInterfaceNodeTemplateId, subInterfaceNodesConnectedOut, context); - } - } - } - - private void updNestedCompositionNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate, - ServiceTemplate nestedServiceTemplate, - UnifiedCompositionData unifiedCompositionData, - TranslationContext context) { - NestedTemplateConsolidationData nestedTemplateConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - Multimap<String, RequirementAssignmentData> nodesConnectedOut = - Objects.isNull(nestedTemplateConsolidationData) ? ArrayListMultimap.create() - : nestedTemplateConsolidationData.getNodesConnectedOut(); + public void createNestedVfcInstanceGroup(String nestedNodeTemplateId, UnifiedCompositionTo unifiedCompositionTo, + UnifiedCompositionData unifiedCompositionData) { + if (!TranslationContext.isVfcInstanceGroupingEnabled()) { + return; + } + createSubInterfaceVfcInstanceGroup(nestedNodeTemplateId, unifiedCompositionTo, unifiedCompositionData); + } + + public void handleComplexVfcType(ServiceTemplate serviceTemplate, TranslationContext context) { + SubstitutionMapping substitutionMapping = serviceTemplate.getTopology_template().getSubstitution_mappings(); + if (Objects.isNull(substitutionMapping)) { + return; + } + ServiceTemplate globalSubstitutionServiceTemplate = context.getGlobalSubstitutionServiceTemplate(); + String substitutionNT = substitutionMapping.getNode_type(); + if (globalSubstitutionServiceTemplate.getNode_types().containsKey(substitutionNT)) { + //This needs to be done when catalog is ready for complex VFC + } + } - FileComputeConsolidationData nestedFileComputeConsolidationData = - context.getConsolidationData().getComputeConsolidationData().getFileComputeConsolidationData - (ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); + protected void updNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + //Add requirements in the abstract node template for nodes connected out for computes + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + Multimap<String, RequirementAssignmentData> computeNodesConnectedOut = computeTemplateConsolidationData.getNodesConnectedOut(); + if (computeNodesConnectedOut != null) { + updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData, newComputeNodeTemplateId, + computeNodesConnectedOut, context); + } + String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + //Add requirements in the abstract node template for nodes connected out for ports + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, + computeTemplateConsolidationData); + Multimap<String, RequirementAssignmentData> portNodesConnectedOut = portTemplateConsolidationData.getNodesConnectedOut(); + if (portNodesConnectedOut != null) { + updateRequirementInAbstractNodeTemplate(serviceTemplate, portTemplateConsolidationData, newPortNodeTemplateId, + portNodesConnectedOut, context); + } + } + //For sub-interface - if (Objects.isNull(nestedFileComputeConsolidationData)) { - return; + //Add requirements in the abstract node template for nodes connected out for ports + updateSubInterfaceNodesConnectedOut(serviceTemplate, unifiedCompositionData, computeTemplateConsolidationData, computeType, context); + } } - TypeComputeConsolidationData computeType = - nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next(); - if (Objects.isNull(computeType)) { - return; + private void updateSubInterfaceNodesConnectedOut(ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, + ComputeTemplateConsolidationData computeTemplateConsolidationData, String computeType, + TranslationContext context) { + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, computeTemplateConsolidationData, + subInterfaceTemplateConsolidationData, context); + Multimap<String, RequirementAssignmentData> subInterfaceNodesConnectedOut = subInterfaceTemplateConsolidationData.getNodesConnectedOut(); + if (subInterfaceNodesConnectedOut != null) { + updateRequirementInAbstractNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData, newSubInterfaceNodeTemplateId, + subInterfaceNodesConnectedOut, context); + } + } } - String singleComputeId = computeType.getAllComputeNodeTemplateIds().iterator().next(); - if (Objects.nonNull(singleComputeId) && (Objects.nonNull(nestedTemplateConsolidationData))) { - updateRequirementInNestedNodeTemplate(serviceTemplate, nestedTemplateConsolidationData, - singleComputeId, nodesConnectedOut); + private void updNestedCompositionNodesConnectedOutConnectivity(ServiceTemplate serviceTemplate, ServiceTemplate nestedServiceTemplate, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { + NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData.getNestedTemplateConsolidationData(); + Multimap<String, RequirementAssignmentData> nodesConnectedOut = + Objects.isNull(nestedTemplateConsolidationData) ? ArrayListMultimap.create() : nestedTemplateConsolidationData.getNodesConnectedOut(); + FileComputeConsolidationData nestedFileComputeConsolidationData = context.getConsolidationData().getComputeConsolidationData() + .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); + if (Objects.isNull(nestedFileComputeConsolidationData)) { + return; + } + TypeComputeConsolidationData computeType = nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next(); + if (Objects.isNull(computeType)) { + return; + } + String singleComputeId = computeType.getAllComputeNodeTemplateIds().iterator().next(); + if (Objects.nonNull(singleComputeId) && (Objects.nonNull(nestedTemplateConsolidationData))) { + updateRequirementInNestedNodeTemplate(serviceTemplate, nestedTemplateConsolidationData, singleComputeId, nodesConnectedOut); + } } - } - private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> - unifiedCompositionDataList, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData - .getComputeTemplateConsolidationData(); - //Update requirements in the node template which pointing to the computes - String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - updNodesConnectedInConnectivity(serviceTemplate, computeTemplateConsolidationData, - newComputeNodeTemplateId, context, false); - - String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData - .getNodeTemplateId()); - //Update requirements in the node template which pointing to the ports - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData - .getNodeTemplateId(), computeType, computeTemplateConsolidationData); - updNodesConnectedInConnectivity(serviceTemplate, portTemplateConsolidationData, - newPortNodeTemplateId, context, false); - } - - //Update requirements in the node template which pointing to the sub-interface - updateSubInterfaceNodesConnectedIn(serviceTemplate, unifiedCompositionData, - computeTemplateConsolidationData, computeType, context); - } - } - - private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, - EntityConsolidationData entityConsolidationData, - String newNodeTemplateId, - TranslationContext context, - boolean isNested) { - Multimap<String, RequirementAssignmentData> nodesConnectedIn = - entityConsolidationData.getNodesConnectedIn(); + private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + //Update requirements in the node template which pointing to the computes + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + updNodesConnectedInConnectivity(serviceTemplate, computeTemplateConsolidationData, newComputeNodeTemplateId, context, false); + String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + //Update requirements in the node template which pointing to the ports + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, + computeTemplateConsolidationData); + updNodesConnectedInConnectivity(serviceTemplate, portTemplateConsolidationData, newPortNodeTemplateId, context, false); + } + //Update requirements in the node template which pointing to the sub-interface + updateSubInterfaceNodesConnectedIn(serviceTemplate, unifiedCompositionData, computeTemplateConsolidationData, computeType, context); + } + } + + private void updNodesConnectedInConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData entityConsolidationData, + String newNodeTemplateId, TranslationContext context, boolean isNested) { + Multimap<String, RequirementAssignmentData> nodesConnectedIn = entityConsolidationData.getNodesConnectedIn(); if (nodesConnectedIn == null) { //No nodes connected in info return; } - for (String key : nodesConnectedIn.keySet()) { Collection<RequirementAssignmentData> requirementAssignmentDataList = nodesConnectedIn.get(key); for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) { - RequirementAssignment requirementAssignment = requirementAssignmentData - .getRequirementAssignment(); - if (!requirementAssignment.getNode().equals(entityConsolidationData - .getNodeTemplateId())) { + RequirementAssignment requirementAssignment = requirementAssignmentData.getRequirementAssignment(); + if (!requirementAssignment.getNode().equals(entityConsolidationData.getNodeTemplateId())) { //The requirement assignment target node should be the one which we are handling in the + //consolidation object continue; } //Update the requirement assignment object in the original node template if (isNested) { - updateRequirementForNestedCompositionNodesConnectedIn(serviceTemplate, - requirementAssignmentData, newNodeTemplateId); + updateRequirementForNestedCompositionNodesConnectedIn(serviceTemplate, requirementAssignmentData, newNodeTemplateId); } else { - updateRequirementForNodesConnectedIn(serviceTemplate, requirementAssignmentData, - entityConsolidationData, key, newNodeTemplateId, context); + updateRequirementForNodesConnectedIn(serviceTemplate, requirementAssignmentData, entityConsolidationData, key, newNodeTemplateId, + context); } + } + } + } + + private void updateSubInterfaceNodesConnectedIn(ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, + ComputeTemplateConsolidationData computeTemplateConsolidationData, String computeType, + TranslationContext context) { + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, computeTemplateConsolidationData, + subInterfaceTemplateConsolidationData, context); + updNodesConnectedInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, newSubInterfaceNodeTemplateId, context, false); + } + } + + 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)); + } + + private void updVolumeConnectivity(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + //Add requirements in the abstract node template for compute volumes + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + Multimap<String, RequirementAssignmentData> computeVolumes = computeTemplateConsolidationData.getVolumes(); + if (computeVolumes != null) { + updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData, newComputeNodeTemplateId, computeVolumes, + context); + } + } + } + + private void updGroupsConnectivity(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + //Add requirements in the abstract node template for nodes connected in for computes + updGroupsConnectivity(serviceTemplate, computeTemplateConsolidationData, context); + //Add requirements in the abstract node template for nodes connected in for ports + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + updGroupsConnectivity(serviceTemplate, portTemplateConsolidationData, context); + } + //Add requirements in the abstract node template for nodes connected in for subInterface + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + updGroupsConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, context); + } + } + } + + private void updGroupsConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData entityConsolidationData, TranslationContext context) { + List<String> groupIds = entityConsolidationData.getGroupIds(); + if (groupIds == null) { + return; + } + String oldNodeTemplateId = entityConsolidationData.getNodeTemplateId(); + String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, entityConsolidationData.getNodeTemplateId()); + Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template().getGroups(); + if (groups == null) { + return; + } + for (String groupId : groupIds) { + GroupDefinition groupDefinition = groups.get(groupId); + if (groupDefinition == null) { + continue; + } + List<String> groupMembers = groupDefinition.getMembers(); + if (groupMembers.contains(oldNodeTemplateId)) { + //Replace the old node template id + groupMembers.remove(oldNodeTemplateId); + if (!groupMembers.contains(abstractNodeTemplateId)) { + //Add the abstract node template id if not already present + groupMembers.add(abstractNodeTemplateId); + } + } + } + } + + private void updOutputParamGetAttrInConnectivity(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedComposotionDataList, + TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + updOutputParamGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData, + computeTemplateConsolidationData.getNodeTemplateId(), newComputeNodeTemplateId, context, false); + String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, + computeTemplateConsolidationData); + updOutputParamGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData, portTemplateConsolidationData.getNodeTemplateId(), + newPortNodeTemplateId, context, false); + } + updateSubInterfaceOutputParamGetAttrIn(serviceTemplate, unifiedCompositionData, computeTemplateConsolidationData, computeType, context); + } + } + private void updateSubInterfaceOutputParamGetAttrIn(ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, + ComputeTemplateConsolidationData computeTemplateConsolidationData, String computeType, + TranslationContext context) { + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, computeTemplateConsolidationData, + subInterfaceTemplateConsolidationData, context); + updOutputParamGetAttrInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, + subInterfaceTemplateConsolidationData.getNodeTemplateId(), newSubInterfaceNodeTemplateId, context, false); + } + } + + private void updNodesGetAttrInConnectivity(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedComposotionDataList, + TranslationContext context) { + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = getAllConsolidationNodeTemplateIdAndType( + unifiedComposotionDataList); + for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + updNodeGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData, computeTemplateConsolidationData.getNodeTemplateId(), + newComputeNodeTemplateId, context, consolidationNodeTemplateIdAndType, false); + String computeType = getComputeTypeSuffix(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + String newPotNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, + computeTemplateConsolidationData); + updNodeGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData, portTemplateConsolidationData.getNodeTemplateId(), + newPotNodeTemplateId, context, consolidationNodeTemplateIdAndType, false); } + updateSubInterfaceNodesGetAttrIn(serviceTemplate, unifiedCompositionData, computeTemplateConsolidationData, computeType, + consolidationNodeTemplateIdAndType, context); } } - private void updateSubInterfaceNodesConnectedIn(ServiceTemplate serviceTemplate, - UnifiedCompositionData unifiedCompositionData, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - String computeType, + private void updateSubInterfaceNodesGetAttrIn(ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, + ComputeTemplateConsolidationData computeTemplateConsolidationData, String computeType, + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, TranslationContext context) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, - computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context); - updNodesConnectedInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, - newSubInterfaceNodeTemplateId, context, false); - } - } - - 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)); - - } - - private void updVolumeConnectivity(ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> - unifiedCompositionDataList, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData - .getComputeTemplateConsolidationData(); - //Add requirements in the abstract node template for compute volumes - String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - Multimap<String, RequirementAssignmentData> computeVolumes = - computeTemplateConsolidationData.getVolumes(); - if (computeVolumes != null) { - updateRequirementInAbstractNodeTemplate(serviceTemplate, computeTemplateConsolidationData, - newComputeNodeTemplateId, computeVolumes, context); - } - } - } - - private void updGroupsConnectivity(ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> - unifiedCompositionDataList, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData - .getComputeTemplateConsolidationData(); - //Add requirements in the abstract node template for nodes connected in for computes - updGroupsConnectivity(serviceTemplate, computeTemplateConsolidationData, context); - - //Add requirements in the abstract node template for nodes connected in for ports - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - updGroupsConnectivity(serviceTemplate, portTemplateConsolidationData, context); - } - - //Add requirements in the abstract node template for nodes connected in for subInterface - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - updGroupsConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, context); - } - } - } - - private void updGroupsConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData - entityConsolidationData, TranslationContext context) { - List<String> groupIds = entityConsolidationData.getGroupIds(); - if (groupIds == null) { - return; - } - String oldNodeTemplateId = entityConsolidationData.getNodeTemplateId(); - String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId( - serviceTemplate, entityConsolidationData.getNodeTemplateId()); - Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template().getGroups(); - if (groups == null) { - return; - } - for (String groupId : groupIds) { - GroupDefinition groupDefinition = groups.get(groupId); - if (groupDefinition == null) { - continue; - } - List<String> groupMembers = groupDefinition.getMembers(); - if (groupMembers.contains(oldNodeTemplateId)) { - //Replace the old node template id - groupMembers.remove(oldNodeTemplateId); - if (!groupMembers.contains(abstractNodeTemplateId)) { - //Add the abstract node template id if not already present - groupMembers.add(abstractNodeTemplateId); - } - } - } - } - - private void updOutputParamGetAttrInConnectivity( - ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedComposotionDataList, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionData.getComputeTemplateConsolidationData(); - String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - - updOutputParamGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData, - computeTemplateConsolidationData.getNodeTemplateId(), newComputeNodeTemplateId, - context, false); - - String computeType = - getComputeTypeSuffix(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - String newPortNodeTemplateId = - getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, - computeTemplateConsolidationData); - - updOutputParamGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData, - portTemplateConsolidationData.getNodeTemplateId(), newPortNodeTemplateId, context, + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, computeTemplateConsolidationData, + subInterfaceTemplateConsolidationData, context); + updNodeGetAttrInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, + subInterfaceTemplateConsolidationData.getNodeTemplateId(), newSubInterfaceNodeTemplateId, context, consolidationNodeTemplateIdAndType, false); - } - - updateSubInterfaceOutputParamGetAttrIn(serviceTemplate, unifiedCompositionData, - computeTemplateConsolidationData, computeType, context); - } - } - - private void updateSubInterfaceOutputParamGetAttrIn(ServiceTemplate serviceTemplate, - UnifiedCompositionData unifiedCompositionData, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - String computeType, - TranslationContext context) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, - computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context); - updOutputParamGetAttrInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, - subInterfaceTemplateConsolidationData.getNodeTemplateId(), newSubInterfaceNodeTemplateId, context, - false); - } - } - - private void updNodesGetAttrInConnectivity( - ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> unifiedComposotionDataList, - TranslationContext context) { - Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = - getAllConsolidationNodeTemplateIdAndType(unifiedComposotionDataList); - for (UnifiedCompositionData unifiedCompositionData : unifiedComposotionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionData.getComputeTemplateConsolidationData(); - String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - - updNodeGetAttrInConnectivity(serviceTemplate, computeTemplateConsolidationData, - computeTemplateConsolidationData.getNodeTemplateId(), - newComputeNodeTemplateId, context, consolidationNodeTemplateIdAndType, false); - - String computeType = - getComputeTypeSuffix(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - String newPotNodeTemplateId = - getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), computeType, - computeTemplateConsolidationData); - - updNodeGetAttrInConnectivity(serviceTemplate, portTemplateConsolidationData, - portTemplateConsolidationData.getNodeTemplateId(), - newPotNodeTemplateId, context, consolidationNodeTemplateIdAndType, false); - } - - updateSubInterfaceNodesGetAttrIn(serviceTemplate, unifiedCompositionData, - computeTemplateConsolidationData, computeType, consolidationNodeTemplateIdAndType, context); - } - } - - private void updateSubInterfaceNodesGetAttrIn(ServiceTemplate serviceTemplate, - UnifiedCompositionData unifiedCompositionData, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - String computeType, - Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, - TranslationContext context) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(serviceTemplate, computeType, - computeTemplateConsolidationData, subInterfaceTemplateConsolidationData, context); - updNodeGetAttrInConnectivity(serviceTemplate, subInterfaceTemplateConsolidationData, - subInterfaceTemplateConsolidationData.getNodeTemplateId(), - newSubInterfaceNodeTemplateId, context, - consolidationNodeTemplateIdAndType, false); - } - } - - protected void updNestedCompositionOutputParamGetAttrInConnectivity( - ServiceTemplate serviceTemplate, UnifiedCompositionData unifiedCompositionData, - TranslationContext context) { - 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, - UnifiedCompositionData unifiedCompositionData, - TranslationContext context) { - 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( - ServiceTemplate serviceTemplate, - RequirementAssignmentData requirementAssignmentData, - EntityConsolidationData entityConsolidationData, - String originalNodeTemplateId, - String newNodeTemplateId, - TranslationContext context) { - ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - RequirementAssignment requirementAssignment = requirementAssignmentData - .getRequirementAssignment(); - String newAbstractUnifiedNodeTemplateId = context.getUnifiedAbstractNodeTemplateId( - serviceTemplate, entityConsolidationData.getNodeTemplateId()); - NodeTemplate abstractUnifiedNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - newAbstractUnifiedNodeTemplateId); - Optional<String> newCapabilityId = getNewCapabilityForNodesConnectedIn(serviceTemplate, - abstractUnifiedNodeTemplate, requirementAssignment, newNodeTemplateId, context); - if (newCapabilityId.isPresent()) { - //Creating a copy of the requirement object and checking if it already exists in the - // original node template - RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject( - requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class); - NodeTemplate originalNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - originalNodeTemplateId); - requirementAssignmentCopy.setCapability(newCapabilityId.get()); - requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId); - if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(originalNodeTemplate, - requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) { - //Update the existing requirement - requirementAssignmentData.getRequirementAssignment().setCapability(newCapabilityId - .get()); - requirementAssignmentData.getRequirementAssignment() - .setNode(newAbstractUnifiedNodeTemplateId); - } else { - //The updated requirement already exists in the node template so simply remove the - // current one - DataModelUtil.removeRequirementAssignment(originalNodeTemplate, requirementAssignmentData - .getRequirementId(), requirementAssignmentData.getRequirementAssignment()); - } - } - } - - private void updateRequirementForNestedCompositionNodesConnectedIn( - ServiceTemplate serviceTemplate, - RequirementAssignmentData requirementAssignmentData, - String newNodeTemplateId) { - ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - String newAbstractUnifiedNodeTemplateId = newNodeTemplateId; - RequirementAssignment requirementAssignment = requirementAssignmentData - .getRequirementAssignment(); - //Creating a copy of the requirement object and checking if it already exists in the - // original node template - RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject( + } + } + + protected void updNestedCompositionOutputParamGetAttrInConnectivity(ServiceTemplate serviceTemplate, + UnifiedCompositionData unifiedCompositionData, TranslationContext context) { + 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, UnifiedCompositionData unifiedCompositionData, + TranslationContext context) { + 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(ServiceTemplate serviceTemplate, RequirementAssignmentData requirementAssignmentData, + EntityConsolidationData entityConsolidationData, String originalNodeTemplateId, + String newNodeTemplateId, TranslationContext context) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + RequirementAssignment requirementAssignment = requirementAssignmentData.getRequirementAssignment(); + String newAbstractUnifiedNodeTemplateId = context + .getUnifiedAbstractNodeTemplateId(serviceTemplate, entityConsolidationData.getNodeTemplateId()); + NodeTemplate abstractUnifiedNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, newAbstractUnifiedNodeTemplateId); + Optional<String> newCapabilityId = getNewCapabilityForNodesConnectedIn(serviceTemplate, abstractUnifiedNodeTemplate, requirementAssignment, + newNodeTemplateId, context); + if (newCapabilityId.isPresent()) { + //Creating a copy of the requirement object and checking if it already exists in the + + // original node template + RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject( + requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class); + NodeTemplate originalNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, originalNodeTemplateId); + requirementAssignmentCopy.setCapability(newCapabilityId.get()); + requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId); + if (!toscaAnalyzerService + .isRequirementExistInNodeTemplate(originalNodeTemplate, requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) { + //Update the existing requirement + requirementAssignmentData.getRequirementAssignment().setCapability(newCapabilityId.get()); + requirementAssignmentData.getRequirementAssignment().setNode(newAbstractUnifiedNodeTemplateId); + } else { + //The updated requirement already exists in the node template so simply remove the + + // current one + DataModelUtil.removeRequirementAssignment(originalNodeTemplate, requirementAssignmentData.getRequirementId(), + requirementAssignmentData.getRequirementAssignment()); + } + } + } + + private void updateRequirementForNestedCompositionNodesConnectedIn(ServiceTemplate serviceTemplate, + RequirementAssignmentData requirementAssignmentData, + String newNodeTemplateId) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + String newAbstractUnifiedNodeTemplateId = newNodeTemplateId; + RequirementAssignment requirementAssignment = requirementAssignmentData.getRequirementAssignment(); + //Creating a copy of the requirement object and checking if it already exists in the + + // original node template + RequirementAssignment requirementAssignmentCopy = (RequirementAssignment) getClonedObject( requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class); - NodeTemplate unifiedAbstractNestedNodeTemplate = DataModelUtil - .getNodeTemplate(serviceTemplate, newAbstractUnifiedNodeTemplateId); - requirementAssignmentCopy.setCapability(requirementAssignment.getCapability()); - requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId); - if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(unifiedAbstractNestedNodeTemplate, - requirementAssignmentData.getRequirementId(), requirementAssignmentCopy)) { - //Update the existing requirement - requirementAssignmentData.getRequirementAssignment() - .setNode(newAbstractUnifiedNodeTemplateId); - } else { - //The updated requirement already exists in the node template so simply remove the - // current one - DataModelUtil.removeRequirementAssignment(unifiedAbstractNestedNodeTemplate, - requirementAssignmentData.getRequirementId(), requirementAssignmentData - .getRequirementAssignment()); - } - } - - private Optional<String> getNewCapabilityForNodesConnectedIn(ServiceTemplate serviceTemplate, - NodeTemplate unifiedNodeTemplate, - RequirementAssignment - requirementAssignment, - String newNodeTemplateId, - TranslationContext context) { - ServiceTemplate globalSubstitutionServiceTemplate = - HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context); - Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); - String unifiedNodeTemplateType = unifiedNodeTemplate.getType(); - NodeType unifiedNodeType = nodeTypes.get(unifiedNodeTemplateType); - Map<String, CapabilityDefinition> abstractNodeTypeCapabilities = unifiedNodeType - .getCapabilities(); - for (Map.Entry<String, CapabilityDefinition> entry : abstractNodeTypeCapabilities.entrySet()) { - String capabilityId = entry.getKey(); - CapabilityDefinition capabilityDefinition = entry.getValue(); - String capabilityType = capabilityDefinition.getType(); - if (capabilityType.equals(requirementAssignment.getCapability()) - && capabilityId.endsWith(newNodeTemplateId)) { - //Matching capability type found..Check if the id ends with new node template id - return Optional.ofNullable(capabilityId); - } - } - return Optional.empty(); - } - - - private void updateRequirementInAbstractNodeTemplate(ServiceTemplate serviceTemplate, - EntityConsolidationData - entityConsolidationData, + NodeTemplate unifiedAbstractNestedNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, newAbstractUnifiedNodeTemplateId); + requirementAssignmentCopy.setCapability(requirementAssignment.getCapability()); + requirementAssignmentCopy.setNode(newAbstractUnifiedNodeTemplateId); + if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(unifiedAbstractNestedNodeTemplate, requirementAssignmentData.getRequirementId(), + requirementAssignmentCopy)) { + //Update the existing requirement + requirementAssignmentData.getRequirementAssignment().setNode(newAbstractUnifiedNodeTemplateId); + } else { + //The updated requirement already exists in the node template so simply remove the + + // current one + DataModelUtil.removeRequirementAssignment(unifiedAbstractNestedNodeTemplate, requirementAssignmentData.getRequirementId(), + requirementAssignmentData.getRequirementAssignment()); + } + } + + private Optional<String> getNewCapabilityForNodesConnectedIn(ServiceTemplate serviceTemplate, NodeTemplate unifiedNodeTemplate, + RequirementAssignment requirementAssignment, String newNodeTemplateId, + TranslationContext context) { + ServiceTemplate globalSubstitutionServiceTemplate = HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context); + Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); + String unifiedNodeTemplateType = unifiedNodeTemplate.getType(); + NodeType unifiedNodeType = nodeTypes.get(unifiedNodeTemplateType); + Map<String, CapabilityDefinition> abstractNodeTypeCapabilities = unifiedNodeType.getCapabilities(); + for (Map.Entry<String, CapabilityDefinition> entry : abstractNodeTypeCapabilities.entrySet()) { + String capabilityId = entry.getKey(); + CapabilityDefinition capabilityDefinition = entry.getValue(); + String capabilityType = capabilityDefinition.getType(); + if (capabilityType.equals(requirementAssignment.getCapability()) && capabilityId.endsWith(newNodeTemplateId)) { + //Matching capability type found..Check if the id ends with new node template id + return Optional.ofNullable(capabilityId); + } + } + return Optional.empty(); + } + + private void updateRequirementInAbstractNodeTemplate(ServiceTemplate serviceTemplate, EntityConsolidationData entityConsolidationData, String newNodeTemplateId, - Multimap<String, RequirementAssignmentData> - requirementAssignmentDataMap, + Multimap<String, RequirementAssignmentData> requirementAssignmentDataMap, TranslationContext context) { ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); for (String key : requirementAssignmentDataMap.keySet()) { - String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId( - serviceTemplate, entityConsolidationData.getNodeTemplateId()); - NodeTemplate abstractNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - abstractNodeTemplateId); + String abstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, entityConsolidationData.getNodeTemplateId()); + NodeTemplate abstractNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, abstractNodeTemplateId); if (abstractNodeTemplate == null) { //The abstract node template is not found from id in the context return; @@ -1294,35 +970,28 @@ public class UnifiedCompositionService { Collection<RequirementAssignmentData> requirementAssignmentDataList = requirementAssignmentDataMap.get(key); for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) { String oldRequirementId = requirementAssignmentData.getRequirementId(); - RequirementAssignment abstractRequirementAssignment = (RequirementAssignment) - getClonedObject(requirementAssignmentData.getRequirementAssignment(), - RequirementAssignment.class); + RequirementAssignment abstractRequirementAssignment = (RequirementAssignment) getClonedObject( + requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class); String newRequirementId = oldRequirementId + "_" + newNodeTemplateId; //Check if the requirement is not already present in the list of requirements of the + // abstract node template - if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(abstractNodeTemplate, - newRequirementId, abstractRequirementAssignment)) { - DataModelUtil.addRequirementAssignment(abstractNodeTemplate, newRequirementId, - abstractRequirementAssignment); + if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(abstractNodeTemplate, newRequirementId, abstractRequirementAssignment)) { + DataModelUtil.addRequirementAssignment(abstractNodeTemplate, newRequirementId, abstractRequirementAssignment); //Update the volume relationship template if required - updateVolumeRelationshipTemplate(serviceTemplate, abstractRequirementAssignment - .getRelationship(), context); + updateVolumeRelationshipTemplate(serviceTemplate, abstractRequirementAssignment.getRelationship(), context); } } } } - private void updateRequirementInNestedNodeTemplate(ServiceTemplate serviceTemplate, - EntityConsolidationData entityConsolidationData, + private void updateRequirementInNestedNodeTemplate(ServiceTemplate serviceTemplate, EntityConsolidationData entityConsolidationData, String newNodeTemplateId, - Multimap<String, RequirementAssignmentData> - requirementAssignmentDataMap) { + Multimap<String, RequirementAssignmentData> requirementAssignmentDataMap) { ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - if (CommonUtil.isMultimapEmpty(requirementAssignmentDataMap)) { return; } - for (String key : requirementAssignmentDataMap.keySet()) { String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, nodeTemplateId); @@ -1333,2472 +1002,1817 @@ public class UnifiedCompositionService { Collection<RequirementAssignmentData> requirementAssignmentDataList = requirementAssignmentDataMap.get(key); for (RequirementAssignmentData requirementAssignmentData : requirementAssignmentDataList) { String oldRequirementId = requirementAssignmentData.getRequirementId(); - RequirementAssignment clonedRequirementAssignment = (RequirementAssignment) - getClonedObject(requirementAssignmentData.getRequirementAssignment(), - RequirementAssignment.class); + RequirementAssignment clonedRequirementAssignment = (RequirementAssignment) getClonedObject( + requirementAssignmentData.getRequirementAssignment(), RequirementAssignment.class); String newRequirementId = oldRequirementId + "_" + newNodeTemplateId; //Check if the requirement is not already present in the list of requirements of the + // node template - if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(nodeTemplate, - newRequirementId, clonedRequirementAssignment)) { - DataModelUtil.removeRequirementAssignment(nodeTemplate, oldRequirementId, - requirementAssignmentData.getRequirementAssignment()); - DataModelUtil.addRequirementAssignment(nodeTemplate, newRequirementId, - clonedRequirementAssignment); + if (!toscaAnalyzerService.isRequirementExistInNodeTemplate(nodeTemplate, newRequirementId, clonedRequirementAssignment)) { + DataModelUtil.removeRequirementAssignment(nodeTemplate, oldRequirementId, requirementAssignmentData.getRequirementAssignment()); + DataModelUtil.addRequirementAssignment(nodeTemplate, newRequirementId, clonedRequirementAssignment); } } } } - private void updNodeGetAttrInConnectivity( - ServiceTemplate serviceTemplate, - EntityConsolidationData entityConsolidationData, - String oldNodeTemplateId, String newNodeTemplateId, - TranslationContext context, - Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, - boolean isNested) { - Map<String, List<GetAttrFuncData>> nodesGetAttrIn = entityConsolidationData.getNodesGetAttrIn(); - if (MapUtils.isEmpty(nodesGetAttrIn)) { - return; - } - - for (Map.Entry<String, List<GetAttrFuncData>> nodesGetAttrInEntry : nodesGetAttrIn.entrySet()) { - String sourceNodeTemplateId = nodesGetAttrInEntry.getKey(); - NodeTemplate sourceNodeTemplate = - DataModelUtil.getNodeTemplate(serviceTemplate, sourceNodeTemplateId); - if (!isNested && consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) { - continue; - } - List<GetAttrFuncData> getAttrFuncDataList = nodesGetAttrInEntry.getValue(); - for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) { - Object propertyValue = - DataModelUtil.getPropertyValue(sourceNodeTemplate, getAttrFuncData.getFieldName()); - String newAttrName = null; - String newGetAttrAbstractNodeTemplateId = newNodeTemplateId; - if (!isNested) { - newGetAttrAbstractNodeTemplateId = - context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId); - newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData - .getAttributeName()); - } - List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(propertyValue); - updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId, - newAttrName, getAttrFuncValueList, isNested); - } - } - } - - private void updateGetAttrValue(String oldNodeTemplateId, GetAttrFuncData getAttrFuncData, - String newNodeTemplateId, String newAttrName, - List<List<Object>> getAttrFuncValueList, boolean isNested) { - for (List<Object> getAttrFuncValue : getAttrFuncValueList) { - if (oldNodeTemplateId.equals(getAttrFuncValue.get(0)) - && getAttrFuncData.getAttributeName().equals(getAttrFuncValue.get(1))) { - getAttrFuncValue.set(0, newNodeTemplateId); - if (!isNested) { - getAttrFuncValue.set(1, newAttrName); - } - } - } - } - - private String getTemplateName(String nodeTypeId, - Integer index) { - String computeType = getComputeTypeSuffix(nodeTypeId); - String templateName = "Nested_" + computeType; - if (Objects.nonNull(index)) { - templateName = templateName + "_" + index.toString(); - } - return templateName; - } - - private void updOutputParamGetAttrInConnectivity(ServiceTemplate serviceTemplate, - EntityConsolidationData entityConsolidationData, - String oldNodeTemplateId, - String newNodeTemplateId, - TranslationContext context, - boolean isNested) { - List<GetAttrFuncData> outputParametersGetAttrIn = - entityConsolidationData.getOutputParametersGetAttrIn(); - if (CollectionUtils.isEmpty(outputParametersGetAttrIn)) { - return; - } - for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) { - Object outputParamValue = - DataModelUtil.getOuputParameter(serviceTemplate, getAttrFuncData.getFieldName()) - .getValue(); - String newAttrName = null; - String newGetAttrAbstractNodeTemplateId = newNodeTemplateId; - if (!isNested) { - newGetAttrAbstractNodeTemplateId = - context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId); - newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData - .getAttributeName()); - } - List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(outputParamValue); - updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId, - newAttrName, - getAttrFuncValueList, isNested); - } - - } - - private List<List<Object>> extractGetAttrFunction(Object valueObject) { - - List<List<Object>> getAttrValueList = new ArrayList<>(); - - if (valueObject instanceof Map) { - if (((Map) valueObject).containsKey(ToscaFunctions.GET_ATTRIBUTE.getFunctionName())) { - getAttrValueList.add( - (List<Object>) ((Map) valueObject).get(ToscaFunctions.GET_ATTRIBUTE.getFunctionName())); - } - - for (Object key : ((Map) valueObject).keySet()) { - getAttrValueList.addAll(extractGetAttrFunction(((Map) valueObject).get(key))); - } - - - } else if (valueObject instanceof List) { - for (Object valueEntity : (List) valueObject) { - getAttrValueList.addAll(extractGetAttrFunction(valueEntity)); - } - } - return getAttrValueList; - } - - private boolean isIncludeToscaFunc(Object valueObject, ToscaFunctions toscaFunction) { - if (valueObject instanceof Map) { - if (((Map) valueObject).containsKey(toscaFunction.getFunctionName())) { - return true; - } - - Set<Map.Entry<String, Object>> entries = ((Map<String, Object>) valueObject).entrySet(); - for (Map.Entry<String, Object> valueObjectEntry : entries) { - if (isIncludeToscaFunc(valueObjectEntry.getValue(), toscaFunction)) { - return true; - } - } - } else if (valueObject instanceof List) { - for (Object valueEntity : (List) valueObject) { - if (isIncludeToscaFunc(valueEntity, toscaFunction)) { - return true; - } - } - } - return false; - } - - private void createOutputParameters(UnifiedCompositionTo unifiedCompositionTo, - String computeNodeType) { - - createOutputParametersForCompute(unifiedCompositionTo.getServiceTemplate(), - unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getUnifiedCompositionDataList(), - unifiedCompositionTo.getContext()); - createOutputParameterForPorts(unifiedCompositionTo.getSubstitutionServiceTemplate(), - unifiedCompositionTo.getUnifiedCompositionDataList(), computeNodeType, unifiedCompositionTo.getContext()); - createOutputParameterForSubInterfaces(unifiedCompositionTo, computeNodeType); - } - - private void createOutputParameterForPorts( - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - String connectedComputeNodeType, - TranslationContext context) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { - return; - } - - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - String newPortNodeTemplateId = - getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), - connectedComputeNodeType, - unifiedCompositionData.getComputeTemplateConsolidationData()); - addOutputParameters(portTemplateConsolidationData, newPortNodeTemplateId, - substitutionServiceTemplate, unifiedCompositionDataList, context); - } - } - } - - private void createOutputParameterForSubInterfaces(UnifiedCompositionTo unifiedCompositionTo, - String connectedComputeNodeType) { - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionTo.getUnifiedCompositionDataList()) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - if (CollectionUtils.isEmpty(subInterfaceTemplateConsolidationDataList)) { - return; - } - - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(unifiedCompositionTo - .getServiceTemplate(), connectedComputeNodeType, unifiedCompositionData - .getComputeTemplateConsolidationData(), subInterfaceTemplateConsolidationData, - unifiedCompositionTo.getContext()); - addOutputParameters(subInterfaceTemplateConsolidationData, newSubInterfaceNodeTemplateId, - unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getUnifiedCompositionDataList(), - unifiedCompositionTo.getContext()); - } - } - } - - private void createOutputParametersForCompute( - ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> - unifiedCompositionDataList, - TranslationContext context) { - List<EntityConsolidationData> computeConsolidationDataList = - getComputeConsolidationDataList(unifiedCompositionDataList); - - for (EntityConsolidationData computeTemplateConsolidationData : computeConsolidationDataList) { - String newComputeNodeTemplateId = - getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - addOutputParameters(computeTemplateConsolidationData, newComputeNodeTemplateId, - substitutionServiceTemplate, unifiedCompositionDataList, context); - } - } - - private void addOutputParameters(EntityConsolidationData entityConsolidationData, - String newNodeTemplateId, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, substitutionServiceTemplate, - unifiedCompositionDataList, context); - - handleOutputParamGetAttrIn(entityConsolidationData, newNodeTemplateId, - substitutionServiceTemplate, context); - } - - private void handleOutputParamGetAttrIn(EntityConsolidationData entityConsolidationData, - String newNodeTemplateId, - ServiceTemplate substitutionServiceTemplate, - TranslationContext context) { - List<GetAttrFuncData> outputParametersGetAttrIn = - entityConsolidationData.getOutputParametersGetAttrIn(); - if (!CollectionUtils.isEmpty(outputParametersGetAttrIn)) { - for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) { - createAndAddOutputParameter(newNodeTemplateId, - substitutionServiceTemplate, getAttrFuncData, context); - } - } - } - - private void handleNodesGetAttrIn(EntityConsolidationData entityConsolidationData, - String newNodeTemplateId, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - Map<String, List<GetAttrFuncData>> getAttrIn = entityConsolidationData.getNodesGetAttrIn(); - if (MapUtils.isEmpty(getAttrIn)) { - return; - } - Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = - getAllConsolidationNodeTemplateIdAndType(unifiedCompositionDataList); - for (Map.Entry<String, List<GetAttrFuncData>> getAttrInEntry : getAttrIn.entrySet()) { - String sourceNodeTemplateId = getAttrInEntry.getKey(); - if (!consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) { - List<GetAttrFuncData> getAttrFuncDataList = getAttrInEntry.getValue(); - for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) { - createAndAddOutputParameter(newNodeTemplateId, - substitutionServiceTemplate, getAttrFuncData, context); - } - } - } - } - - private void createAndAddOutputParameter(String newNodeTemplateId, - ServiceTemplate substitutionServiceTemplate, - GetAttrFuncData getAttrFuncData, - TranslationContext context) { - Map<String, List<Object>> parameterValue = new HashMap<>(); - List<Object> valueList = new ArrayList<>(); - valueList.add(newNodeTemplateId); - valueList.add(getAttrFuncData.getAttributeName()); - parameterValue.put(ToscaFunctions.GET_ATTRIBUTE.getFunctionName(), valueList); - ParameterDefinition outputParameter = new ParameterDefinition(); - outputParameter.setValue(parameterValue); - 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; - EntrySchema outputParameterEntrySchema; - 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 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 getNewSubstitutionOutputParameterId(String newNodeTemplateId, - String attributeName) { - return newNodeTemplateId + "_" + attributeName; - } - - private void addUnifiedSubstitionData(TranslationContext context, ServiceTemplate - serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, String - substituteNodeTemplateId) { - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - //Add compute node template mapping information - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionData.getComputeTemplateConsolidationData(); - String computeNodeTemplateId = computeTemplateConsolidationData.getNodeTemplateId(); - context.addUnifiedSubstitutionData(serviceTemplateFileName, computeNodeTemplateId, - substituteNodeTemplateId); - //Add Port template mapping information - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - - if (CollectionUtils.isNotEmpty(portTemplateConsolidationDataList)) { - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - String oldPortNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId(); - context.addUnifiedSubstitutionData(serviceTemplateFileName, oldPortNodeTemplateId, - substituteNodeTemplateId); - } - } - //Add Sub-interface template mapping information - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) { - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - context.addUnifiedSubstitutionData(serviceTemplateFileName, - subInterfaceTemplateConsolidationData.getNodeTemplateId(), substituteNodeTemplateId); - } - } - } - } - - private void addIndexValueProperty(NodeTemplate nodeTemplate) { - List<String> indexValueGetPropertyValue = new ArrayList<>(); - indexValueGetPropertyValue.add(ToscaConstants.MODELABLE_ENTITY_NAME_SELF); - indexValueGetPropertyValue.add(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); - indexValueGetPropertyValue.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME); - - Map<String, Object> indexPropertyValue = new HashMap<>(); - Map<String, Object> properties = nodeTemplate.getProperties(); - indexPropertyValue.put(ToscaFunctions.GET_PROPERTY.getFunctionName(), - indexValueGetPropertyValue); - properties.put(ToscaConstants.INDEX_VALUE_PROPERTY_NAME, - indexPropertyValue); - nodeTemplate.setProperties(properties); - } - - private String getSubstituteNodeTemplateId(String nodeTypeId, - Integer index) { - String nodeTemplateId = ABSTRACT_NODE_TEMPLATE_ID_PREFIX + DataModelUtil - .getNamespaceSuffix(nodeTypeId); - if (Objects.nonNull(index)) { - nodeTemplateId = nodeTemplateId + "_" + index.toString(); - } - return nodeTemplateId; - } - - /** - * 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(getIndexedGlobalNodeTypeId(computeType, context)); - - context.updateUsedTimesForNestedComputeNodeType(globalSTName, computeType); - - if (Objects.nonNull(index)) { - nodeTypeId = nodeTypeId + "_" + index.toString(); - } - return nodeTypeId; - } - - private NodeType handleSubstitutionGlobalNodeType(ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - TranslationContext context, - String substitutionNodeTypeId) { - NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl() - .createInitSubstitutionNodeType(substitutionServiceTemplate, - ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); - ServiceTemplate globalSubstitutionServiceTemplate = - HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context); - DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeId, - substitutionNodeType); - - return substitutionNodeType; - } - - private void handlePorts(ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - String connectedComputeNodeType, - TranslationContext context) { - - if (unifiedCompositionDataList.size() > 1) { - handleConsolidationPorts(serviceTemplate, substitutionServiceTemplate, - unifiedCompositionDataList, connectedComputeNodeType, context); - } else { - handleSinglePorts(serviceTemplate, substitutionServiceTemplate, connectedComputeNodeType, - unifiedCompositionDataList, context); - } - } - - private void handleSinglePorts(ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - String connectedComputeNodeType, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0); - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { - return; - } - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - List<EntityConsolidationData> portConsolidationDataList = new ArrayList<>(); - portConsolidationDataList.add(portTemplateConsolidationData); - handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate, - portConsolidationDataList, connectedComputeNodeType, - unifiedCompositionData.getComputeTemplateConsolidationData(), - unifiedCompositionDataList, context); - } - } - - private void handleConsolidationPorts(ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - String connectedComputeNodeType, - TranslationContext context) { - Map<String, List<String>> portIdsPerPortType = - UnifiedCompositionUtil.collectAllPortsOfEachTypeFromComputes(unifiedCompositionDataList); + private void updNodeGetAttrInConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData entityConsolidationData, + String oldNodeTemplateId, String newNodeTemplateId, TranslationContext context, + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, boolean isNested) { + Map<String, List<GetAttrFuncData>> nodesGetAttrIn = entityConsolidationData.getNodesGetAttrIn(); + if (MapUtils.isEmpty(nodesGetAttrIn)) { + return; + } + for (Map.Entry<String, List<GetAttrFuncData>> nodesGetAttrInEntry : nodesGetAttrIn.entrySet()) { + String sourceNodeTemplateId = nodesGetAttrInEntry.getKey(); + NodeTemplate sourceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, sourceNodeTemplateId); + if (!isNested && consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) { + continue; + } + List<GetAttrFuncData> getAttrFuncDataList = nodesGetAttrInEntry.getValue(); + for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) { + Object propertyValue = DataModelUtil.getPropertyValue(sourceNodeTemplate, getAttrFuncData.getFieldName()); + String newAttrName = null; + String newGetAttrAbstractNodeTemplateId = newNodeTemplateId; + if (!isNested) { + newGetAttrAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId); + newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData.getAttributeName()); + } + List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(propertyValue); + updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId, newAttrName, getAttrFuncValueList, isNested); + } + } + } - for (Map.Entry<String, List<String>> portIdsPerPortTypeEntry : portIdsPerPortType.entrySet()) { - List<EntityConsolidationData> portTemplateConsolidationDataList = - getPortConsolidationDataList(portIdsPerPortTypeEntry.getValue(), unifiedCompositionDataList); + private void updateGetAttrValue(String oldNodeTemplateId, GetAttrFuncData getAttrFuncData, String newNodeTemplateId, String newAttrName, + List<List<Object>> getAttrFuncValueList, boolean isNested) { + for (List<Object> getAttrFuncValue : getAttrFuncValueList) { + if (oldNodeTemplateId.equals(getAttrFuncValue.get(0)) && getAttrFuncData.getAttributeName().equals(getAttrFuncValue.get(1))) { + getAttrFuncValue.set(0, newNodeTemplateId); + if (!isNested) { + getAttrFuncValue.set(1, newAttrName); + } + } + } + } + + private String getTemplateName(String nodeTypeId, Integer index) { + String computeType = getComputeTypeSuffix(nodeTypeId); + String templateName = "Nested_" + computeType; + if (Objects.nonNull(index)) { + templateName = templateName + "_" + index.toString(); + } + return templateName; + } + + private void updOutputParamGetAttrInConnectivity(ServiceTemplate serviceTemplate, EntityConsolidationData entityConsolidationData, + String oldNodeTemplateId, String newNodeTemplateId, TranslationContext context, + boolean isNested) { + List<GetAttrFuncData> outputParametersGetAttrIn = entityConsolidationData.getOutputParametersGetAttrIn(); + if (CollectionUtils.isEmpty(outputParametersGetAttrIn)) { + return; + } + for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) { + Object outputParamValue = DataModelUtil.getOuputParameter(serviceTemplate, getAttrFuncData.getFieldName()).getValue(); + String newAttrName = null; + String newGetAttrAbstractNodeTemplateId = newNodeTemplateId; + if (!isNested) { + newGetAttrAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, oldNodeTemplateId); + newAttrName = getNewSubstitutionOutputParameterId(newNodeTemplateId, getAttrFuncData.getAttributeName()); + } + List<List<Object>> getAttrFuncValueList = extractGetAttrFunction(outputParamValue); + updateGetAttrValue(oldNodeTemplateId, getAttrFuncData, newGetAttrAbstractNodeTemplateId, newAttrName, getAttrFuncValueList, isNested); + } + } + + private List<List<Object>> extractGetAttrFunction(Object valueObject) { + List<List<Object>> getAttrValueList = new ArrayList<>(); + if (valueObject instanceof Map) { + if (((Map) valueObject).containsKey(ToscaFunctions.GET_ATTRIBUTE.getFunctionName())) { + getAttrValueList.add((List<Object>) ((Map) valueObject).get(ToscaFunctions.GET_ATTRIBUTE.getFunctionName())); + } + for (Object key : ((Map) valueObject).keySet()) { + getAttrValueList.addAll(extractGetAttrFunction(((Map) valueObject).get(key))); + } + } else if (valueObject instanceof List) { + for (Object valueEntity : (List) valueObject) { + getAttrValueList.addAll(extractGetAttrFunction(valueEntity)); + } + } + return getAttrValueList; + } + + private boolean isIncludeToscaFunc(Object valueObject, ToscaFunctions toscaFunction) { + if (valueObject instanceof Map) { + if (((Map) valueObject).containsKey(toscaFunction.getFunctionName())) { + return true; + } + Set<Map.Entry<String, Object>> entries = ((Map<String, Object>) valueObject).entrySet(); + for (Map.Entry<String, Object> valueObjectEntry : entries) { + if (isIncludeToscaFunc(valueObjectEntry.getValue(), toscaFunction)) { + return true; + } + } + } else if (valueObject instanceof List) { + for (Object valueEntity : (List) valueObject) { + if (isIncludeToscaFunc(valueEntity, toscaFunction)) { + return true; + } + } + } + return false; + } + + private void createOutputParameters(UnifiedCompositionTo unifiedCompositionTo, String computeNodeType) { + createOutputParametersForCompute(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo.getSubstitutionServiceTemplate(), + unifiedCompositionTo.getUnifiedCompositionDataList(), unifiedCompositionTo.getContext()); + createOutputParameterForPorts(unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getUnifiedCompositionDataList(), + computeNodeType, unifiedCompositionTo.getContext()); + createOutputParameterForSubInterfaces(unifiedCompositionTo, computeNodeType); + } + + private void createOutputParameterForPorts(ServiceTemplate substitutionServiceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + String connectedComputeNodeType, TranslationContext context) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { - continue; + return; } + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), connectedComputeNodeType, + unifiedCompositionData.getComputeTemplateConsolidationData()); + addOutputParameters(portTemplateConsolidationData, newPortNodeTemplateId, substitutionServiceTemplate, unifiedCompositionDataList, + context); + } + } + } - handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate, portTemplateConsolidationDataList, - connectedComputeNodeType, unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(), - unifiedCompositionDataList, context); + private void createOutputParameterForSubInterfaces(UnifiedCompositionTo unifiedCompositionTo, String connectedComputeNodeType) { + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionTo.getUnifiedCompositionDataList()) { + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + if (CollectionUtils.isEmpty(subInterfaceTemplateConsolidationDataList)) { + return; + } + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(unifiedCompositionTo.getServiceTemplate(), + connectedComputeNodeType, unifiedCompositionData.getComputeTemplateConsolidationData(), subInterfaceTemplateConsolidationData, + unifiedCompositionTo.getContext()); + addOutputParameters(subInterfaceTemplateConsolidationData, newSubInterfaceNodeTemplateId, + unifiedCompositionTo.getSubstitutionServiceTemplate(), unifiedCompositionTo.getUnifiedCompositionDataList(), + unifiedCompositionTo.getContext()); + } } } - private void handlePortNodeTemplate( - ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - List<EntityConsolidationData> portTemplateConsolidationDataList, - String connectedComputeNodeType, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - EntityConsolidationData portTemplateConsolidationData = - portTemplateConsolidationDataList.get(0); - NodeTemplate newPortNodeTemplate = getNodeTemplate( - portTemplateConsolidationData.getNodeTemplateId(), serviceTemplate, context).clone(); + private void createOutputParametersForCompute(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + List<EntityConsolidationData> computeConsolidationDataList = getComputeConsolidationDataList(unifiedCompositionDataList); + for (EntityConsolidationData computeTemplateConsolidationData : computeConsolidationDataList) { + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + addOutputParameters(computeTemplateConsolidationData, newComputeNodeTemplateId, substitutionServiceTemplate, unifiedCompositionDataList, + context); + } + } - removeConnectivityOut(portTemplateConsolidationData, newPortNodeTemplate); - handleProperties(serviceTemplate, newPortNodeTemplate, - substitutionServiceTemplate, UnifiedCompositionEntity.PORT, - portTemplateConsolidationDataList, computeTemplateConsolidationData, - unifiedCompositionDataList, context); + private void addOutputParameters(EntityConsolidationData entityConsolidationData, String newNodeTemplateId, + ServiceTemplate substitutionServiceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + handleNodesGetAttrIn(entityConsolidationData, newNodeTemplateId, substitutionServiceTemplate, unifiedCompositionDataList, context); + handleOutputParamGetAttrIn(entityConsolidationData, newNodeTemplateId, substitutionServiceTemplate, context); + } - //Add subinterface_indicator property to PORT - portTemplateConsolidationDataList.forEach(entity -> - addPortSubInterfaceIndicatorProperty(newPortNodeTemplate.getProperties(), entity)); + private void handleOutputParamGetAttrIn(EntityConsolidationData entityConsolidationData, String newNodeTemplateId, + ServiceTemplate substitutionServiceTemplate, TranslationContext context) { + List<GetAttrFuncData> outputParametersGetAttrIn = entityConsolidationData.getOutputParametersGetAttrIn(); + if (!CollectionUtils.isEmpty(outputParametersGetAttrIn)) { + for (GetAttrFuncData getAttrFuncData : outputParametersGetAttrIn) { + createAndAddOutputParameter(newNodeTemplateId, substitutionServiceTemplate, getAttrFuncData, context); + } + } + } - String newPortNodeTemplateId = - getNewPortNodeTemplateId(portTemplateConsolidationData - .getNodeTemplateId(), connectedComputeNodeType, - computeTemplateConsolidationData); - //Update requirements for relationships between the consolidation entities - handleConsolidationEntitiesRequirementConnectivity(newPortNodeTemplate, - serviceTemplate, context); - DataModelUtil.addNodeTemplate(substitutionServiceTemplate, newPortNodeTemplateId, - newPortNodeTemplate); - - //Add the node template mapping in the context for handling requirement updation - for (EntityConsolidationData data : portTemplateConsolidationDataList) { - String newPortTemplateId = getNewPortNodeTemplateId(data.getNodeTemplateId(), - connectedComputeNodeType, computeTemplateConsolidationData); - context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil - .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(), - newPortTemplateId); - } - - } - - private void handleSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) { - if (unifiedCompositionTo.getUnifiedCompositionDataList().size() > 1) { - handleConsolidationSubInterfaces(unifiedCompositionTo); - } else { - handleSingleSubInterfaces(unifiedCompositionTo); - } - } - - private void handleSingleSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) { - UnifiedCompositionData unifiedCompositionData = unifiedCompositionTo.getUnifiedCompositionDataList().get(0); - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - List<SubInterfaceTemplateConsolidationData> subInterfaceDataList = new ArrayList<>(); - subInterfaceDataList.add(subInterfaceTemplateConsolidationData); - createSubInterfaceSubstitutionNodeTemplate(unifiedCompositionTo, subInterfaceDataList); - } - } + private void handleNodesGetAttrIn(EntityConsolidationData entityConsolidationData, String newNodeTemplateId, + ServiceTemplate substitutionServiceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + Map<String, List<GetAttrFuncData>> getAttrIn = entityConsolidationData.getNodesGetAttrIn(); + if (MapUtils.isEmpty(getAttrIn)) { + return; + } + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = getAllConsolidationNodeTemplateIdAndType( + unifiedCompositionDataList); + for (Map.Entry<String, List<GetAttrFuncData>> getAttrInEntry : getAttrIn.entrySet()) { + String sourceNodeTemplateId = getAttrInEntry.getKey(); + if (!consolidationNodeTemplateIdAndType.keySet().contains(sourceNodeTemplateId)) { + List<GetAttrFuncData> getAttrFuncDataList = getAttrInEntry.getValue(); + for (GetAttrFuncData getAttrFuncData : getAttrFuncDataList) { + createAndAddOutputParameter(newNodeTemplateId, substitutionServiceTemplate, getAttrFuncData, context); + } + } + } + } - private void handleConsolidationSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) { - Map<String, List<String>> portIdsPerPortType = - UnifiedCompositionUtil.collectAllPortsOfEachTypeFromComputes( - unifiedCompositionTo.getUnifiedCompositionDataList()); + private void createAndAddOutputParameter(String newNodeTemplateId, ServiceTemplate substitutionServiceTemplate, GetAttrFuncData getAttrFuncData, + TranslationContext context) { + Map<String, List<Object>> parameterValue = new HashMap<>(); + List<Object> valueList = new ArrayList<>(); + valueList.add(newNodeTemplateId); + valueList.add(getAttrFuncData.getAttributeName()); + parameterValue.put(ToscaFunctions.GET_ATTRIBUTE.getFunctionName(), valueList); + ParameterDefinition outputParameter = new ParameterDefinition(); + outputParameter.setValue(parameterValue); + 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; + EntrySchema outputParameterEntrySchema; + 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 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 getNewSubstitutionOutputParameterId(String newNodeTemplateId, String attributeName) { + return newNodeTemplateId + "_" + attributeName; + } + + private void addUnifiedSubstitionData(TranslationContext context, ServiceTemplate serviceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, String substituteNodeTemplateId) { + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + //Add compute node template mapping information + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + String computeNodeTemplateId = computeTemplateConsolidationData.getNodeTemplateId(); + context.addUnifiedSubstitutionData(serviceTemplateFileName, computeNodeTemplateId, substituteNodeTemplateId); + //Add Port template mapping information + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + if (CollectionUtils.isNotEmpty(portTemplateConsolidationDataList)) { + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + String oldPortNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId(); + context.addUnifiedSubstitutionData(serviceTemplateFileName, oldPortNodeTemplateId, substituteNodeTemplateId); + } + } + //Add Sub-interface template mapping information + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) { + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + context.addUnifiedSubstitutionData(serviceTemplateFileName, subInterfaceTemplateConsolidationData.getNodeTemplateId(), + substituteNodeTemplateId); + } + } + } + } + + private void addIndexValueProperty(NodeTemplate nodeTemplate) { + List<String> indexValueGetPropertyValue = new ArrayList<>(); + indexValueGetPropertyValue.add(ToscaConstants.MODELABLE_ENTITY_NAME_SELF); + indexValueGetPropertyValue.add(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); + indexValueGetPropertyValue.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME); + Map<String, Object> indexPropertyValue = new HashMap<>(); + Map<String, Object> properties = nodeTemplate.getProperties(); + indexPropertyValue.put(ToscaFunctions.GET_PROPERTY.getFunctionName(), indexValueGetPropertyValue); + properties.put(ToscaConstants.INDEX_VALUE_PROPERTY_NAME, indexPropertyValue); + nodeTemplate.setProperties(properties); + } + + private String getSubstituteNodeTemplateId(String nodeTypeId, Integer index) { + String nodeTemplateId = ABSTRACT_NODE_TEMPLATE_ID_PREFIX + DataModelUtil.getNamespaceSuffix(nodeTypeId); + if (Objects.nonNull(index)) { + nodeTemplateId = nodeTemplateId + "_" + index.toString(); + } + return nodeTemplateId; + } + + /** + * 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(getIndexedGlobalNodeTypeId(computeType, context)); + context.updateUsedTimesForNestedComputeNodeType(globalSTName, computeType); + if (Objects.nonNull(index)) { + nodeTypeId = nodeTypeId + "_" + index.toString(); + } + return nodeTypeId; + } + + private NodeType handleSubstitutionGlobalNodeType(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + TranslationContext context, String substitutionNodeTypeId) { + NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl() + .createInitSubstitutionNodeType(substitutionServiceTemplate, ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); + ServiceTemplate globalSubstitutionServiceTemplate = HeatToToscaUtil.fetchGlobalSubstitutionServiceTemplate(serviceTemplate, context); + DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeId, substitutionNodeType); + return substitutionNodeType; + } + + private void handlePorts(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, String connectedComputeNodeType, TranslationContext context) { + if (unifiedCompositionDataList.size() > 1) { + handleConsolidationPorts(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, connectedComputeNodeType, context); + } else { + handleSinglePorts(serviceTemplate, substitutionServiceTemplate, connectedComputeNodeType, unifiedCompositionDataList, context); + } + } + + private void handleSinglePorts(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, String connectedComputeNodeType, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + UnifiedCompositionData unifiedCompositionData = unifiedCompositionDataList.get(0); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { + return; + } + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + List<EntityConsolidationData> portConsolidationDataList = new ArrayList<>(); + portConsolidationDataList.add(portTemplateConsolidationData); + handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate, portConsolidationDataList, connectedComputeNodeType, + unifiedCompositionData.getComputeTemplateConsolidationData(), unifiedCompositionDataList, context); + } + } + + private void handleConsolidationPorts(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, String connectedComputeNodeType, + TranslationContext context) { + Map<String, List<String>> portIdsPerPortType = UnifiedCompositionUtil.collectAllPortsOfEachTypeFromComputes(unifiedCompositionDataList); for (Map.Entry<String, List<String>> portIdsPerPortTypeEntry : portIdsPerPortType.entrySet()) { - List<EntityConsolidationData> portEntityConsolidationDataList = - getPortConsolidationDataList(portIdsPerPortTypeEntry.getValue(), - unifiedCompositionTo.getUnifiedCompositionDataList()); - if (CollectionUtils.isEmpty(portEntityConsolidationDataList)) { + List<EntityConsolidationData> portTemplateConsolidationDataList = getPortConsolidationDataList(portIdsPerPortTypeEntry.getValue(), + unifiedCompositionDataList); + if (CollectionUtils.isEmpty(portTemplateConsolidationDataList)) { continue; } + handlePortNodeTemplate(serviceTemplate, substitutionServiceTemplate, portTemplateConsolidationDataList, connectedComputeNodeType, + unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(), unifiedCompositionDataList, context); + } + } - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - portEntityConsolidationDataList.stream().map(data -> (PortTemplateConsolidationData) data) - .collect(Collectors.toList()); + private void handlePortNodeTemplate(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + List<EntityConsolidationData> portTemplateConsolidationDataList, String connectedComputeNodeType, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + EntityConsolidationData portTemplateConsolidationData = portTemplateConsolidationDataList.get(0); + NodeTemplate newPortNodeTemplate = getNodeTemplate(portTemplateConsolidationData.getNodeTemplateId(), serviceTemplate, context).clone(); + removeConnectivityOut(portTemplateConsolidationData, newPortNodeTemplate); + handleProperties(serviceTemplate, newPortNodeTemplate, substitutionServiceTemplate, UnifiedCompositionEntity.PORT, + portTemplateConsolidationDataList, computeTemplateConsolidationData, unifiedCompositionDataList, context); + //Add subinterface_indicator property to PORT + portTemplateConsolidationDataList.forEach(entity -> addPortSubInterfaceIndicatorProperty(newPortNodeTemplate.getProperties(), entity)); + String newPortNodeTemplateId = getNewPortNodeTemplateId(portTemplateConsolidationData.getNodeTemplateId(), connectedComputeNodeType, + computeTemplateConsolidationData); + //Update requirements for relationships between the consolidation entities + handleConsolidationEntitiesRequirementConnectivity(newPortNodeTemplate, serviceTemplate, context); + DataModelUtil.addNodeTemplate(substitutionServiceTemplate, newPortNodeTemplateId, newPortNodeTemplate); + //Add the node template mapping in the context for handling requirement updation + for (EntityConsolidationData data : portTemplateConsolidationDataList) { + String newPortTemplateId = getNewPortNodeTemplateId(data.getNodeTemplateId(), connectedComputeNodeType, computeTemplateConsolidationData); + context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + data.getNodeTemplateId(), newPortTemplateId); + } + } + + private void handleSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) { + if (unifiedCompositionTo.getUnifiedCompositionDataList().size() > 1) { + handleConsolidationSubInterfaces(unifiedCompositionTo); + } else { + handleSingleSubInterfaces(unifiedCompositionTo); + } + } + + private void handleSingleSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) { + UnifiedCompositionData unifiedCompositionData = unifiedCompositionTo.getUnifiedCompositionDataList().get(0); + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + List<SubInterfaceTemplateConsolidationData> subInterfaceDataList = new ArrayList<>(); + subInterfaceDataList.add(subInterfaceTemplateConsolidationData); + createSubInterfaceSubstitutionNodeTemplate(unifiedCompositionTo, subInterfaceDataList); + } + } - ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesByType = - UnifiedCompositionUtil.collectAllSubInterfacesOfEachTypesFromPorts( - portTemplateConsolidationDataList); + private void handleConsolidationSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) { + Map<String, List<String>> portIdsPerPortType = UnifiedCompositionUtil + .collectAllPortsOfEachTypeFromComputes(unifiedCompositionTo.getUnifiedCompositionDataList()); + for (Map.Entry<String, List<String>> portIdsPerPortTypeEntry : portIdsPerPortType.entrySet()) { + List<EntityConsolidationData> portEntityConsolidationDataList = getPortConsolidationDataList(portIdsPerPortTypeEntry.getValue(), + unifiedCompositionTo.getUnifiedCompositionDataList()); + if (CollectionUtils.isEmpty(portEntityConsolidationDataList)) { + continue; + } + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = portEntityConsolidationDataList.stream() + .map(data -> (PortTemplateConsolidationData) data).collect(Collectors.toList()); + ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesByType = UnifiedCompositionUtil + .collectAllSubInterfacesOfEachTypesFromPorts(portTemplateConsolidationDataList); Set<String> subInterfaceTypes = subInterfacesByType.keySet(); for (String subInterfaceType : subInterfaceTypes) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - subInterfacesByType.get(subInterfaceType); - createSubInterfaceSubstitutionNodeTemplate(unifiedCompositionTo, - subInterfaceTemplateConsolidationDataList); - } - } - } - - private void createSubInterfaceSubstitutionNodeTemplate(UnifiedCompositionTo unifiedCompositionTo, - List<SubInterfaceTemplateConsolidationData> - subInterfaceTemplateConsolidationDataList) { - SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData = - subInterfaceTemplateConsolidationDataList.get(0); - Optional<PortTemplateConsolidationData> portTemplateConsolidationDataOptional = - subInterfaceTemplateConsolidationData.getParentPortTemplateConsolidationData(unifiedCompositionTo - .getServiceTemplate(), unifiedCompositionTo.getContext()); - if (!portTemplateConsolidationDataOptional.isPresent()) { - return; - } - PortTemplateConsolidationData portTemplateConsolidationData = portTemplateConsolidationDataOptional.get(); - String originalSubInterfaceNodeTemplateId = subInterfaceTemplateConsolidationDataList.get(0) - .getNodeTemplateId(); - NodeTemplate originalSubInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(unifiedCompositionTo - .getServiceTemplate(), originalSubInterfaceNodeTemplateId); - if (Objects.isNull(originalSubInterfaceNodeTemplate)) { - return; - } - NodeTemplate newSubInterfaceNodeTemplate = originalSubInterfaceNodeTemplate.clone(); - ComputeTemplateConsolidationData connectedComputeConsolidationData = - getConnectedComputeConsolidationData(unifiedCompositionTo.getUnifiedCompositionDataList(), - portTemplateConsolidationData.getNodeTemplateId()); - if (Objects.nonNull(connectedComputeConsolidationData)) { - NodeTemplate connectedComputeNodeTemplate = DataModelUtil.getNodeTemplate(unifiedCompositionTo - .getServiceTemplate(), connectedComputeConsolidationData.getNodeTemplateId()); - String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(unifiedCompositionTo - .getServiceTemplate(), connectedComputeNodeTemplate.getType(), connectedComputeConsolidationData, - subInterfaceTemplateConsolidationData, unifiedCompositionTo.getContext()); - DataModelUtil.addNodeTemplate(unifiedCompositionTo.getSubstitutionServiceTemplate(), - newSubInterfaceNodeTemplateId, newSubInterfaceNodeTemplate); - List<EntityConsolidationData> entityConsolidationDataList = - new ArrayList<>(subInterfaceTemplateConsolidationDataList); - //Remove all the existing properties as we are going to create new based on the - // naming convention for the substitution - handleSubInterfaceProperties(unifiedCompositionTo, originalSubInterfaceNodeTemplateId, - newSubInterfaceNodeTemplate, entityConsolidationDataList, portTemplateConsolidationData); - //Update requirements for relationships between the consolidation entities - handleConsolidationEntitiesRequirementConnectivity(newSubInterfaceNodeTemplate, unifiedCompositionTo - .getServiceTemplate(), unifiedCompositionTo.getContext()); - removeConnectivityOut(subInterfaceTemplateConsolidationData,newSubInterfaceNodeTemplate); - } - } - - private void handleSubInterfaceProperties(UnifiedCompositionTo unifiedCompositionTo, - String subInterfaceNodeTemplateId, - NodeTemplate newSubInterfaceNodeTemplate, - List<EntityConsolidationData> - entityConsolidationDataList, - PortTemplateConsolidationData - portTemplateConsolidationData) { - UnifiedCompositionData unifiedCompositionData = unifiedCompositionTo.getUnifiedCompositionDataList().get(0); - ServiceTemplate serviceTemplate = unifiedCompositionTo.getServiceTemplate(); - TranslationContext context = unifiedCompositionTo.getContext(); - newSubInterfaceNodeTemplate.setProperties(new HashMap<>()); - for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { - String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); - Optional<List<String>> indexVarProperties = - context.getIndexVarProperties(ToscaUtil.getServiceTemplateFileName(serviceTemplate), - nodeTemplateId); - Map<String, Object> properties = - DataModelUtil.getNodeTemplateProperties(serviceTemplate, nodeTemplateId); - if (MapUtils.isEmpty(properties)) { - continue; - } - - for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) { - NodeType nodeTypeWithFlatHierarchy = - HeatToToscaUtil.getNodeTypeWithFlatHierarchy(newSubInterfaceNodeTemplate.getType(), - serviceTemplate, context); - PropertyDefinition propertyDefinition = - nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey()); - String propertyType = propertyDefinition.getType(); - //Handle service_template_filter property for subinterface as we should not create inputs - // for this property - if (propertyEntry.getKey().equals(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME)) { - handleSubInterfaceServiceTemplateFilterProperty(subInterfaceNodeTemplateId, newSubInterfaceNodeTemplate, - propertyEntry.getKey(), propertyEntry.getValue(), portTemplateConsolidationData, - unifiedCompositionTo.getSubstitutionServiceTemplate()); - } else if (indexVarProperties.isPresent() - && indexVarProperties.get().contains(propertyEntry.getKey())) { - //Handle index property - handleIndexVarProperty(propertyEntry.getKey(), propertyEntry.getValue(), - newSubInterfaceNodeTemplate); - } else { - Optional<String> parameterId = - updateProperty(serviceTemplate, nodeTemplateId, newSubInterfaceNodeTemplate, - propertyEntry, UnifiedCompositionEntity.SUB_INTERFACE, unifiedCompositionData - .getComputeTemplateConsolidationData(), portTemplateConsolidationData, - unifiedCompositionTo.getUnifiedCompositionDataList(), context); - parameterId.ifPresent( - parameterIdValue -> addPropertyInputParameter(propertyType, - unifiedCompositionTo.getSubstitutionServiceTemplate(), - propertyDefinition.getEntry_schema(), parameterIdValue)); + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = subInterfacesByType.get(subInterfaceType); + createSubInterfaceSubstitutionNodeTemplate(unifiedCompositionTo, subInterfaceTemplateConsolidationDataList); + } } - } } - } - private NodeTemplate getNodeTemplate(String nodeTemplateId, ServiceTemplate serviceTemplate, - TranslationContext context) { + private void createSubInterfaceSubstitutionNodeTemplate(UnifiedCompositionTo unifiedCompositionTo, + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList) { + SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData = subInterfaceTemplateConsolidationDataList.get(0); + Optional<PortTemplateConsolidationData> portTemplateConsolidationDataOptional = subInterfaceTemplateConsolidationData + .getParentPortTemplateConsolidationData(unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo.getContext()); + if (!portTemplateConsolidationDataOptional.isPresent()) { + return; + } + PortTemplateConsolidationData portTemplateConsolidationData = portTemplateConsolidationDataOptional.get(); + String originalSubInterfaceNodeTemplateId = subInterfaceTemplateConsolidationDataList.get(0).getNodeTemplateId(); + NodeTemplate originalSubInterfaceNodeTemplate = DataModelUtil + .getNodeTemplate(unifiedCompositionTo.getServiceTemplate(), originalSubInterfaceNodeTemplateId); + if (Objects.isNull(originalSubInterfaceNodeTemplate)) { + return; + } + NodeTemplate newSubInterfaceNodeTemplate = originalSubInterfaceNodeTemplate.clone(); + ComputeTemplateConsolidationData connectedComputeConsolidationData = getConnectedComputeConsolidationData( + unifiedCompositionTo.getUnifiedCompositionDataList(), portTemplateConsolidationData.getNodeTemplateId()); + if (Objects.nonNull(connectedComputeConsolidationData)) { + NodeTemplate connectedComputeNodeTemplate = DataModelUtil + .getNodeTemplate(unifiedCompositionTo.getServiceTemplate(), connectedComputeConsolidationData.getNodeTemplateId()); + String newSubInterfaceNodeTemplateId = getNewSubInterfaceNodeTemplateId(unifiedCompositionTo.getServiceTemplate(), + connectedComputeNodeTemplate.getType(), connectedComputeConsolidationData, subInterfaceTemplateConsolidationData, + unifiedCompositionTo.getContext()); + DataModelUtil + .addNodeTemplate(unifiedCompositionTo.getSubstitutionServiceTemplate(), newSubInterfaceNodeTemplateId, newSubInterfaceNodeTemplate); + List<EntityConsolidationData> entityConsolidationDataList = new ArrayList<>(subInterfaceTemplateConsolidationDataList); + //Remove all the existing properties as we are going to create new based on the + + // naming convention for the substitution + handleSubInterfaceProperties(unifiedCompositionTo, originalSubInterfaceNodeTemplateId, newSubInterfaceNodeTemplate, + entityConsolidationDataList, portTemplateConsolidationData); + //Update requirements for relationships between the consolidation entities + handleConsolidationEntitiesRequirementConnectivity(newSubInterfaceNodeTemplate, unifiedCompositionTo.getServiceTemplate(), + unifiedCompositionTo.getContext()); + removeConnectivityOut(subInterfaceTemplateConsolidationData, newSubInterfaceNodeTemplate); + } + } - NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, nodeTemplateId); + private void handleSubInterfaceProperties(UnifiedCompositionTo unifiedCompositionTo, String subInterfaceNodeTemplateId, + NodeTemplate newSubInterfaceNodeTemplate, List<EntityConsolidationData> entityConsolidationDataList, + PortTemplateConsolidationData portTemplateConsolidationData) { + UnifiedCompositionData unifiedCompositionData = unifiedCompositionTo.getUnifiedCompositionDataList().get(0); + ServiceTemplate serviceTemplate = unifiedCompositionTo.getServiceTemplate(); + TranslationContext context = unifiedCompositionTo.getContext(); + newSubInterfaceNodeTemplate.setProperties(new HashMap<>()); + for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { + String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); + Optional<List<String>> indexVarProperties = context + .getIndexVarProperties(ToscaUtil.getServiceTemplateFileName(serviceTemplate), nodeTemplateId); + Map<String, Object> properties = DataModelUtil.getNodeTemplateProperties(serviceTemplate, nodeTemplateId); + if (MapUtils.isEmpty(properties)) { + continue; + } + for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) { + NodeType nodeTypeWithFlatHierarchy = HeatToToscaUtil + .getNodeTypeWithFlatHierarchy(newSubInterfaceNodeTemplate.getType(), serviceTemplate, context); + PropertyDefinition propertyDefinition = nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey()); + String propertyType = propertyDefinition.getType(); + //Handle service_template_filter property for subinterface as we should not create inputs + + // for this property + if (propertyEntry.getKey().equals(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME)) { + handleSubInterfaceServiceTemplateFilterProperty(subInterfaceNodeTemplateId, newSubInterfaceNodeTemplate, propertyEntry.getKey(), + propertyEntry.getValue(), portTemplateConsolidationData, unifiedCompositionTo.getSubstitutionServiceTemplate()); + } else if (indexVarProperties.isPresent() && indexVarProperties.get().contains(propertyEntry.getKey())) { + //Handle index property + handleIndexVarProperty(propertyEntry.getKey(), propertyEntry.getValue(), newSubInterfaceNodeTemplate); + } else { + Optional<String> parameterId = updateProperty(serviceTemplate, nodeTemplateId, newSubInterfaceNodeTemplate, propertyEntry, + UnifiedCompositionEntity.SUB_INTERFACE, unifiedCompositionData.getComputeTemplateConsolidationData(), + portTemplateConsolidationData, unifiedCompositionTo.getUnifiedCompositionDataList(), context); + parameterId.ifPresent( + parameterIdValue -> addPropertyInputParameter(propertyType, unifiedCompositionTo.getSubstitutionServiceTemplate(), + propertyDefinition.getEntry_schema(), parameterIdValue)); + } + } + } + } - if (Objects.isNull(nodeTemplate)) { - nodeTemplate = context - .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), - nodeTemplateId); + private NodeTemplate getNodeTemplate(String nodeTemplateId, ServiceTemplate serviceTemplate, TranslationContext context) { + NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, nodeTemplateId); + if (Objects.isNull(nodeTemplate)) { + nodeTemplate = context.getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), nodeTemplateId); + } + return nodeTemplate; + } + + private String handleCompute(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(); + handleComputeNodeTemplate(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, context); + return handleComputeNodeType(serviceTemplate, substitutionServiceTemplate, computeTemplateConsolidationData); + } + + private String handleComputeNodeType(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + String computeNodeTypeId = computeNodeTemplate.getType(); + NodeType computeNodeType = DataModelUtil.getNodeType(serviceTemplate, computeNodeTypeId); + DataModelUtil.addNodeType(substitutionServiceTemplate, computeNodeTypeId, computeNodeType); + return computeNodeTypeId; + } + + private void handleComputeNodeTemplate(ServiceTemplate serviceTemplate, ServiceTemplate substitutionServiceTemplate, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(); + NodeTemplate newComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()) + .clone(); + removeConnectivityOut(computeTemplateConsolidationData, newComputeNodeTemplate); + removeVolumeConnectivity(computeTemplateConsolidationData, newComputeNodeTemplate); + List<EntityConsolidationData> computeConsolidationDataList = getComputeConsolidationDataList(unifiedCompositionDataList); + handleProperties(serviceTemplate, newComputeNodeTemplate, substitutionServiceTemplate, COMPUTE, computeConsolidationDataList, + computeTemplateConsolidationData, unifiedCompositionDataList, context); + String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + //Update requirements for relationships between the consolidation entities + handleConsolidationEntitiesRequirementConnectivity(newComputeNodeTemplate, serviceTemplate, context); + DataModelUtil.addNodeTemplate(substitutionServiceTemplate, newComputeNodeTemplateId, newComputeNodeTemplate); + //Add the node template mapping in the context for handling requirement updation + for (EntityConsolidationData data : computeConsolidationDataList) { + String newComputeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil.getServiceTemplateFileName(serviceTemplate), + data.getNodeTemplateId(), newComputeTemplateId); + } + } + private List<EntityConsolidationData> getComputeConsolidationDataList(List<UnifiedCompositionData> unifiedCompositionDataList) { + return unifiedCompositionDataList.stream().map(UnifiedCompositionData::getComputeTemplateConsolidationData).collect(Collectors.toList()); } - return nodeTemplate; - } + private void handleProperties(ServiceTemplate serviceTemplate, NodeTemplate nodeTemplate, ServiceTemplate substitutionServiceTemplate, + UnifiedCompositionEntity unifiedCompositionEntity, List<EntityConsolidationData> entityConsolidationDataList, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + nodeTemplate.setProperties(new HashedMap()); + UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList, + context, nodeTemplate); + handleNodeTemplateProperties(unifiedCompositionTo, unifiedCompositionEntity, entityConsolidationDataList, computeTemplateConsolidationData); + //Add enrich properties from openecomp node type as input to global and substitution ST + handleNodeTypeProperties(substitutionServiceTemplate, entityConsolidationDataList, nodeTemplate, unifiedCompositionEntity, + computeTemplateConsolidationData, context); + } - private String handleCompute(ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(); - handleComputeNodeTemplate(serviceTemplate, substitutionServiceTemplate, - unifiedCompositionDataList, context); - return handleComputeNodeType(serviceTemplate, substitutionServiceTemplate, - computeTemplateConsolidationData); - } - - private String handleComputeNodeType( - ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - ComputeTemplateConsolidationData computeTemplateConsolidationData) { - NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - String computeNodeTypeId = computeNodeTemplate.getType(); - NodeType computeNodeType = - DataModelUtil.getNodeType(serviceTemplate, computeNodeTypeId); - DataModelUtil - .addNodeType(substitutionServiceTemplate, computeNodeTypeId, computeNodeType); - - return computeNodeTypeId; - } - - private void handleComputeNodeTemplate(ServiceTemplate serviceTemplate, - ServiceTemplate substitutionServiceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData(); - NodeTemplate newComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()).clone(); + private void addPortSubInterfaceIndicatorProperty(Map<String, Object> properties, EntityConsolidationData entityConsolidationData) { + properties.put(SUB_INTERFACE_INDICATOR_PROPERTY, ((PortTemplateConsolidationData) entityConsolidationData).isPortBoundToSubInterface()); + } - removeConnectivityOut(computeTemplateConsolidationData, newComputeNodeTemplate); - removeVolumeConnectivity(computeTemplateConsolidationData, newComputeNodeTemplate); + private void handleNodeTemplateProperties(UnifiedCompositionTo unifiedCompositionTo, UnifiedCompositionEntity unifiedCompositionEntity, + List<EntityConsolidationData> entityConsolidationDataList, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + List<String> propertiesWithIdenticalVal = consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity); + for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { + String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); + Optional<List<String>> indexVarProperties = unifiedCompositionTo.getContext() + .getIndexVarProperties(ToscaUtil.getServiceTemplateFileName(unifiedCompositionTo.getServiceTemplate()), nodeTemplateId); + Map<String, Object> properties = DataModelUtil.getNodeTemplateProperties(unifiedCompositionTo.getServiceTemplate(), nodeTemplateId); + if (MapUtils.isEmpty(properties)) { + continue; + } + for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) { + NodeType nodeTypeWithFlatHierarchy = HeatToToscaUtil + .getNodeTypeWithFlatHierarchy(unifiedCompositionTo.getNodeTemplate().getType(), unifiedCompositionTo.getServiceTemplate(), + unifiedCompositionTo.getContext()); + PropertyDefinition propertyDefinition = nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey()); + String propertyType = propertyDefinition.getType(); + if (propertiesWithIdenticalVal.contains(propertyEntry.getKey())) { + String parameterId = updateIdenticalProperty(nodeTemplateId, propertyEntry.getKey(), unifiedCompositionTo.getNodeTemplate(), + unifiedCompositionEntity, unifiedCompositionTo.getUnifiedCompositionDataList()); + addInputParameter(parameterId, propertyType, + propertyType.equals(PropertyType.LIST.getDisplayName()) ? propertyDefinition.getEntry_schema() : null, + unifiedCompositionTo.getSubstitutionServiceTemplate()); + } else if (indexVarProperties.isPresent() && indexVarProperties.get().contains(propertyEntry.getKey())) { + //Handle index property + handleIndexVarProperty(propertyEntry.getKey(), propertyEntry.getValue(), unifiedCompositionTo.getNodeTemplate()); + } else { + Optional<String> parameterId = updateProperty(unifiedCompositionTo.getServiceTemplate(), nodeTemplateId, + unifiedCompositionTo.getNodeTemplate(), propertyEntry, unifiedCompositionEntity, computeTemplateConsolidationData, + getPortTemplateConsolidationDataForPort(unifiedCompositionTo.getUnifiedCompositionDataList(), nodeTemplateId), + unifiedCompositionTo.getUnifiedCompositionDataList(), unifiedCompositionTo.getContext()); + parameterId.ifPresent( + parameterIdValue -> addPropertyInputParameter(propertyType, unifiedCompositionTo.getSubstitutionServiceTemplate(), + propertyDefinition.getEntry_schema(), parameterIdValue)); + } + } + } + } - List<EntityConsolidationData> computeConsolidationDataList = - getComputeConsolidationDataList(unifiedCompositionDataList); + private void handleIndexVarProperty(String propertyKey, Object propertyValue, NodeTemplate nodeTemplate) { + //Retain properties translated from %index% value in heat + nodeTemplate.getProperties().put(propertyKey, propertyValue); + } - handleProperties(serviceTemplate, newComputeNodeTemplate, - substitutionServiceTemplate, COMPUTE, - computeConsolidationDataList, computeTemplateConsolidationData, unifiedCompositionDataList, - context); + private void handleSubInterfaceServiceTemplateFilterProperty(String subInterfaceNodeTemplateId, NodeTemplate nodeTemplate, String propertyKey, + Object propertyValue, PortTemplateConsolidationData portTemplateConsolidationData, + ServiceTemplate substitutionServiceTemplate) { + //Retain service_template_filter (Can be present in a sub-interface resource-def) + if (propertyValue instanceof Map) { + Map<String, Object> serviceTemplateFilterPropertyMap = new HashMap<>((Map<String, Object>) propertyValue); + handleCountProperty(subInterfaceNodeTemplateId, nodeTemplate, portTemplateConsolidationData, substitutionServiceTemplate, + serviceTemplateFilterPropertyMap); + DataModelUtil.addNodeTemplateProperty(nodeTemplate, propertyKey, serviceTemplateFilterPropertyMap); + } + } - String newComputeNodeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - //Update requirements for relationships between the consolidation entities - handleConsolidationEntitiesRequirementConnectivity( - newComputeNodeTemplate, - serviceTemplate, context); - DataModelUtil - .addNodeTemplate(substitutionServiceTemplate, - newComputeNodeTemplateId, newComputeNodeTemplate); - //Add the node template mapping in the context for handling requirement updation - for (EntityConsolidationData data : computeConsolidationDataList) { - String newComputeTemplateId = getNewComputeNodeTemplateId(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - context.addSubstitutionServiceTemplateUnifiedSubstitutionData(ToscaUtil - .getServiceTemplateFileName(serviceTemplate), data.getNodeTemplateId(), - newComputeTemplateId); - } - } - - private List<EntityConsolidationData> getComputeConsolidationDataList( - List<UnifiedCompositionData> unifiedCompositionDataList) { - return unifiedCompositionDataList.stream() - .map(UnifiedCompositionData::getComputeTemplateConsolidationData) - .collect(Collectors.toList()); - } - - - private void handleProperties(ServiceTemplate serviceTemplate, - NodeTemplate nodeTemplate, - ServiceTemplate substitutionServiceTemplate, - UnifiedCompositionEntity unifiedCompositionEntity, - List<EntityConsolidationData> entityConsolidationDataList, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - nodeTemplate.setProperties(new HashedMap()); - UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, substitutionServiceTemplate,unifiedCompositionDataList, context, nodeTemplate); - handleNodeTemplateProperties(unifiedCompositionTo, unifiedCompositionEntity, entityConsolidationDataList, computeTemplateConsolidationData); - //Add enrich properties from openecomp node type as input to global and substitution ST - handleNodeTypeProperties(substitutionServiceTemplate, - entityConsolidationDataList, nodeTemplate, unifiedCompositionEntity, - computeTemplateConsolidationData, context); - } - - private void addPortSubInterfaceIndicatorProperty(Map<String, Object> properties, - EntityConsolidationData entityConsolidationData) { - properties.put(SUB_INTERFACE_INDICATOR_PROPERTY, - ((PortTemplateConsolidationData) entityConsolidationData).isPortBoundToSubInterface()); - } - - private void handleNodeTemplateProperties(UnifiedCompositionTo unifiedCompositionTo, - UnifiedCompositionEntity unifiedCompositionEntity, - List<EntityConsolidationData> - entityConsolidationDataList, - ComputeTemplateConsolidationData - computeTemplateConsolidationData - ) { - List<String> propertiesWithIdenticalVal = - consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity); - - for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { - String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); - Optional<List<String>> indexVarProperties = - unifiedCompositionTo.getContext().getIndexVarProperties(ToscaUtil.getServiceTemplateFileName(unifiedCompositionTo.getServiceTemplate()), - nodeTemplateId); - Map<String, Object> properties = - DataModelUtil.getNodeTemplateProperties(unifiedCompositionTo.getServiceTemplate(), - nodeTemplateId); - if (MapUtils.isEmpty(properties)) { - continue; - } - - for (Map.Entry<String, Object> propertyEntry : properties.entrySet()) { - NodeType nodeTypeWithFlatHierarchy = - HeatToToscaUtil.getNodeTypeWithFlatHierarchy(unifiedCompositionTo.getNodeTemplate().getType(), - unifiedCompositionTo.getServiceTemplate(), unifiedCompositionTo.getContext()); - PropertyDefinition propertyDefinition = - nodeTypeWithFlatHierarchy.getProperties().get(propertyEntry.getKey()); - String propertyType = propertyDefinition.getType(); - - if (propertiesWithIdenticalVal.contains(propertyEntry.getKey())) { - String parameterId = - updateIdenticalProperty(nodeTemplateId, propertyEntry.getKey(), - unifiedCompositionTo.getNodeTemplate(),unifiedCompositionEntity, unifiedCompositionTo.getUnifiedCompositionDataList()); - - addInputParameter( - parameterId, propertyType, - propertyType.equals(PropertyType.LIST.getDisplayName()) ? propertyDefinition - .getEntry_schema() : null, - unifiedCompositionTo.getSubstitutionServiceTemplate()); - } else if (indexVarProperties.isPresent() - && indexVarProperties.get().contains(propertyEntry.getKey())) { - //Handle index property - handleIndexVarProperty(propertyEntry.getKey(), propertyEntry.getValue(), - unifiedCompositionTo.getNodeTemplate()); - } else { - Optional<String> parameterId = - updateProperty(unifiedCompositionTo.getServiceTemplate(), nodeTemplateId, unifiedCompositionTo.getNodeTemplate(), propertyEntry, - unifiedCompositionEntity, computeTemplateConsolidationData, - getPortTemplateConsolidationDataForPort(unifiedCompositionTo.getUnifiedCompositionDataList(), nodeTemplateId), - unifiedCompositionTo.getUnifiedCompositionDataList(), - unifiedCompositionTo.getContext()); - parameterId.ifPresent( - parameterIdValue -> addPropertyInputParameter(propertyType, - unifiedCompositionTo.getSubstitutionServiceTemplate(), - propertyDefinition.getEntry_schema(), parameterIdValue)); - } - } - } - } - - private void handleIndexVarProperty(String propertyKey, Object propertyValue, - NodeTemplate nodeTemplate) { - //Retain properties translated from %index% value in heat - nodeTemplate.getProperties().put(propertyKey, propertyValue); - } - - private void handleSubInterfaceServiceTemplateFilterProperty(String subInterfaceNodeTemplateId, - NodeTemplate nodeTemplate, - String propertyKey, - Object propertyValue, - PortTemplateConsolidationData - portTemplateConsolidationData, - ServiceTemplate substitutionServiceTemplate) { - //Retain service_template_filter (Can be present in a sub-interface resource-def) - if (propertyValue instanceof Map) { - Map<String, Object> serviceTemplateFilterPropertyMap = new HashMap<>((Map<String, Object>) propertyValue); - handleCountProperty(subInterfaceNodeTemplateId, nodeTemplate, portTemplateConsolidationData, - substitutionServiceTemplate, serviceTemplateFilterPropertyMap); - DataModelUtil.addNodeTemplateProperty(nodeTemplate, propertyKey, serviceTemplateFilterPropertyMap); - } - } - - private void handleCountProperty(String subInterfaceNodeTemplateId, NodeTemplate nodeTemplate, - PortTemplateConsolidationData portTemplateConsolidationData, - ServiceTemplate substitutionServiceTemplate, - Map<String, Object> serviceTemplatePropertyMap) { - String countInputParameterId = getSubInterfaceInputParameterId(nodeTemplate.getType(), subInterfaceNodeTemplateId, + private void handleCountProperty(String subInterfaceNodeTemplateId, NodeTemplate nodeTemplate, + PortTemplateConsolidationData portTemplateConsolidationData, ServiceTemplate substitutionServiceTemplate, + Map<String, Object> serviceTemplatePropertyMap) { + String countInputParameterId = getSubInterfaceInputParameterId(nodeTemplate.getType(), subInterfaceNodeTemplateId, ToscaConstants.SERVICE_TEMPLATE_FILTER_COUNT, portTemplateConsolidationData); - EntrySchema entrySchema = new EntrySchema(); - entrySchema.setType(PropertyType.FLOAT.getDisplayName()); - addInputParameter(countInputParameterId, PropertyType.LIST.getDisplayName(), entrySchema, - substitutionServiceTemplate); - Map<String, List<String>> countPropertyValueInputParam = getPropertyValueInputParam(countInputParameterId); - serviceTemplatePropertyMap.remove(ToscaConstants.COUNT_PROPERTY_NAME); - serviceTemplatePropertyMap.put(ToscaConstants.COUNT_PROPERTY_NAME, countPropertyValueInputParam); - } - - private void handleNodeTypeProperties(ServiceTemplate substitutionServiceTemplate, - List<EntityConsolidationData> entityConsolidationDataList, - NodeTemplate nodeTemplate, - UnifiedCompositionEntity compositionEntity, - ComputeTemplateConsolidationData - computeTemplateConsolidationData, - TranslationContext context) { - ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - Optional<NodeType> enrichNodeType; - List<String> enrichProperties; - - if (compositionEntity.equals(UnifiedCompositionEntity.PORT)) { - enrichNodeType = - toscaAnalyzerService.fetchNodeType(ToscaNodeType.NETWORK_PORT, - context.getGlobalServiceTemplates().values()); - enrichProperties = TranslationContext.getEnrichPortResourceProperties(); - if (!enrichNodeType.isPresent() || Objects.isNull(enrichProperties)) { - return; - } - } else { - return; - } - - Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties(); - 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); - } - } - } - - private void handleEntityConsolidationDataNodeTypeProperties(String enrichPropertyName, - ServiceTemplate substitutionServiceTemplate, - NodeType enrichNodeType, - NodeTemplate nodeTemplate, - UnifiedCompositionEntity compositionEntity, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - List<EntityConsolidationData> entityConsolidationDataList, - Map<String, Object> nodeTemplateProperties, - TranslationContext context) { - - String propertyType; - - for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { - String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); - - String inputParamId = - getParameterId(nodeTemplateId, nodeTemplate, enrichPropertyName, - compositionEntity, computeTemplateConsolidationData, - (PortTemplateConsolidationData) entityConsolidationData); - Map<String, String> propertyValMap = new HashMap<>(); - - context - .addNewPropertyIdToNodeTemplate( - ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate), - inputParamId, nodeTemplateProperties.get(enrichPropertyName)); - - if (nodeTemplateProperties.containsKey(enrichPropertyName)) { - handleExistingEnrichedProperty(enrichPropertyName, nodeTemplateProperties, inputParamId); - } else { - propertyValMap.put(GET_INPUT.getFunctionName(), inputParamId); - nodeTemplate.getProperties().put(enrichPropertyName, propertyValMap); - } - propertyType = - enrichNodeType.getProperties().get(enrichPropertyName).getType(); - - addPropertyInputParameter(propertyType, substitutionServiceTemplate, enrichNodeType - .getProperties().get(enrichPropertyName).getEntry_schema(), - inputParamId); - - } - } - - private void handleExistingEnrichedProperty(String enrichPropertyName, - Map<String, Object> nodeTemplateProperties, - String inputParamId) { - Object enrichedProperty = nodeTemplateProperties.get(enrichPropertyName); - if (!isPropertyContainsToscaFunction(enrichedProperty)) { - Map<String, Object> propertyWithGetInput = new HashMap<>(); - propertyWithGetInput.put(ToscaFunctions.GET_INPUT.getFunctionName(), inputParamId); - nodeTemplateProperties.put(enrichPropertyName, propertyWithGetInput); - } - } - - - private boolean isPropertyContainsToscaFunction(Object propertyValue) { - ToscaFunctions[] values = ToscaFunctions.values(); - for (ToscaFunctions toscaFunction : values) { - if (isIncludeToscaFunc(propertyValue, toscaFunction)) { - return true; - } - } - - return false; - } - - - private void addPropertyInputParameter(String propertyType, - ServiceTemplate substitutionServiceTemplate, - EntrySchema entrySchema, String parameterId) { - if (Objects.isNull(propertyType)) { - return; - } - if (isParameterBelongsToEnrichedPortProperties(parameterId)) { - addInputParameter(parameterId, - propertyType, - propertyType.equals(PropertyType.LIST.getDisplayName()) ? entrySchema : null, - substitutionServiceTemplate); - } else if (isPropertySimpleType(propertyType)) { - addInputParameter(parameterId, PropertyType.LIST.getDisplayName(), - DataModelUtil.createEntrySchema(propertyType.toLowerCase(), null, null), - substitutionServiceTemplate); - - } else if (propertyType.equals(PropertyTypeExt.JSON.getDisplayName()) || - (Objects.nonNull(entrySchema) && isPropertySimpleType(entrySchema.getType()))) { - addInputParameter(parameterId, PropertyType.LIST.getDisplayName(), - DataModelUtil.createEntrySchema(PropertyTypeExt.JSON.getDisplayName(), null, null), - substitutionServiceTemplate); - } else { - addInputParameter(parameterId, analyzeParameterType(propertyType), DataModelUtil - .createEntrySchema(analyzeEntrySchemaType(propertyType, entrySchema), null, null), - substitutionServiceTemplate); - } - } - - private boolean isParameterBelongsToEnrichedPortProperties(String parameterId) { - List enrichPortResourceProperties = TranslationContext.getEnrichPortResourceProperties(); - - for (int i = 0; i < enrichPortResourceProperties.size(); i++) { - if (parameterId.contains((CharSequence) enrichPortResourceProperties.get(i))) { - return true; - } - } - - return false; - } - - private boolean isPropertySimpleType(String propertyType) { - return !Objects.isNull(propertyType) - && (PropertyType.getSimplePropertyTypes().contains(propertyType.toLowerCase())); - } - - private String analyzeParameterType(String propertyType) { - return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) ? PropertyType.LIST - .getDisplayName() : propertyType; - } - - private String analyzeEntrySchemaType(String propertyType, EntrySchema entrySchema) { - return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) && entrySchema != null ? - entrySchema.getType() : null; - } - - private void handleConsolidationEntitiesRequirementConnectivity(NodeTemplate nodeTemplate, - ServiceTemplate serviceTemplate, - TranslationContext context) { - List<Map<String, RequirementAssignment>> nodeTemplateRequirements = DataModelUtil - .getNodeTemplateRequirementList(nodeTemplate); - if (CollectionUtils.isEmpty(nodeTemplateRequirements)) { - return; - } - - for (Map<String, RequirementAssignment> requirement : nodeTemplateRequirements) { - for (Map.Entry<String, RequirementAssignment> entry : requirement.entrySet()) { - RequirementAssignment requirementAssignment = entry.getValue(); - String requirementNode = requirementAssignment.getNode(); - String unifiedNodeTemplateId = - context.getUnifiedSubstitutionNodeTemplateId(serviceTemplate, - requirementNode); - if (unifiedNodeTemplateId != null) { - //Update the node id in the requirement - requirementAssignment.setNode(unifiedNodeTemplateId); - } - } - } - nodeTemplate.setRequirements(nodeTemplateRequirements); - } - - /** - * Update the node references in the volume relationship templates. - * - * @param serviceTemplate the service template - * @param context the context - */ - private void updateVolumeRelationshipTemplate(ServiceTemplate serviceTemplate, - String relationshipId, - TranslationContext context) { - Map<String, RelationshipTemplate> relationshipTemplates = DataModelUtil - .getRelationshipTemplates(serviceTemplate); - if (relationshipTemplates != null) { - RelationshipTemplate relationshipTemplate = relationshipTemplates.get(relationshipId); - if (relationshipTemplate != null) { - String relationshipTemplateType = relationshipTemplate.getType(); - if (relationshipTemplateType.equals(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO)) { - handleCinderVolumeAttachmentRelationshipTemplate(serviceTemplate, - relationshipTemplate, context); - } - } - } - } - - - private void handleCinderVolumeAttachmentRelationshipTemplate(ServiceTemplate - substitutionServiceTemplate, - RelationshipTemplate - relationshipTemplate, - TranslationContext context) { - Map<String, Object> properties = relationshipTemplate.getProperties(); - properties.computeIfPresent(HeatConstants.INSTANCE_UUID_PROPERTY_NAME, (key, value) -> - context.getUnifiedAbstractNodeTemplateId(substitutionServiceTemplate, - (String) value)); - } - - private String updateIdenticalProperty(String nodeTemplateId, String propertyId, - NodeTemplate nodeTemplate, - UnifiedCompositionEntity unifiedCompositionEntity, - List<UnifiedCompositionData> unifiedCompositionDataList) { - - String inputParamId = null; - Map<String, Object> propertyVal = new HashMap<>(); - - switch (unifiedCompositionEntity) { - case COMPUTE: - inputParamId = COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX + propertyId - + COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX; - propertyVal.put(ToscaFunctions.GET_INPUT.getFunctionName(), inputParamId); - nodeTemplate.getProperties().put(propertyId, propertyVal); - break; - case PORT: - PortTemplateConsolidationData portTemplateConsolidationData = - getPortTemplateConsolidationDataForPort(unifiedCompositionDataList, - nodeTemplateId); - String portType = null; - if (Objects.nonNull(portTemplateConsolidationData)) { - portType = portTemplateConsolidationData.getPortType(); - } - ComputeTemplateConsolidationData computeTemplateConsolidationData = - getConnectedComputeConsolidationData(unifiedCompositionDataList, nodeTemplateId); - inputParamId = getInputParamIdForPort(nodeTemplateId, propertyId, portType, computeTemplateConsolidationData); - propertyVal.put(ToscaFunctions.GET_INPUT.getFunctionName(), inputParamId); - nodeTemplate.getProperties().put(propertyId, propertyVal); - break; - default: - break; - } - return inputParamId; - } - - private String getInputParamIdForPort(String nodeTemplateId, String propertyId, String portType, - ComputeTemplateConsolidationData computeTemplateConsolidationData) { - String inputParamId; - if (Objects.isNull(computeTemplateConsolidationData) - || computeTemplateConsolidationData.getPorts().get(portType).size() > 1) { - inputParamId = - UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + nodeTemplateId + "_" + - propertyId; - - } else { - inputParamId = - UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + portType + "_" - + propertyId; - } - return inputParamId; - } - - private void addInputParameter(String parameterId, - String parameterType, - EntrySchema entrySchema, - ServiceTemplate serviceTemplate) { - - ParameterDefinition parameterDefinition = DataModelUtil.createParameterDefinition(parameterType, null, true, - null, entrySchema, null); - - - DataModelUtil - .addInputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition); - } - - // Return the input parameter Id which is used in the new property value if there is one - private Optional<String> updateProperty( - ServiceTemplate serviceTemplate, - String nodeTemplateId, NodeTemplate nodeTemplate, - Map.Entry<String, Object> propertyEntry, - UnifiedCompositionEntity compositionEntity, - ComputeTemplateConsolidationData computeTemplateConsolidationData, - PortTemplateConsolidationData portTemplateConsolidationData, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - - if (handleGetAttrFromConsolidationNodes(serviceTemplate, nodeTemplateId, nodeTemplate, - propertyEntry, unifiedCompositionDataList, context)) { - return Optional.empty(); - } - - - String inputParamId = - getParameterId(nodeTemplateId, nodeTemplate, propertyEntry.getKey(), compositionEntity, - computeTemplateConsolidationData, portTemplateConsolidationData); - Map<String, List<String>> propertyVal = getPropertyValueInputParam(inputParamId); - nodeTemplate.getProperties().put(propertyEntry.getKey(), propertyVal); - return Optional.of(inputParamId); - } - - private Map<String, List<String>> getPropertyValueInputParam(String inputParamId) { - Map<String, List<String>> propertyVal = new HashMap<>(); - List<String> getInputFuncParams = new ArrayList<>(); - getInputFuncParams.add(inputParamId); - getInputFuncParams.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME); - propertyVal.put(ToscaFunctions.GET_INPUT.getFunctionName(), getInputFuncParams); - return propertyVal; - } - - private boolean handleGetAttrFromConsolidationNodes( - ServiceTemplate serviceTemplate, - String nodeTemplateId, NodeTemplate nodeTemplate, - Map.Entry<String, Object> propertyEntry, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = - 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) { - String getAttrNodeId = (String) getAttrFunc.get(0); - if (consolidationNodeTemplateIds.contains(getAttrNodeId)) { - includeGetAttrFromConsolidationNodes = true; - if (isGetAttrNodeTemplateFromSameType(nodeTemplateId, getAttrNodeId, entityIdToType)) { - isGetAttrFromConsolidationIsFromSameType = true; - } - } else { - includeGetAttrFromOutsideNodes = true; - } - } - if ((includeGetAttrFromConsolidationNodes && includeGetAttrFromOutsideNodes) - || - (includeGetAttrFromConsolidationNodes && isIncludeToscaFunc(propertyEntry.getValue(), - ToscaFunctions.GET_INPUT))) { - //This case is currently not supported - this property will be ignored - return true; - } else if (includeGetAttrFromConsolidationNodes && !isGetAttrFromConsolidationIsFromSameType) { - Object clonedPropertyValue = getClonedPropertyValue(propertyEntry); - List<List<Object>> clonedGetAttrFuncList = extractGetAttrFunction(clonedPropertyValue); - for (List<Object> getAttrFunc : clonedGetAttrFuncList) { - String targetNodeTemplateId = (String) getAttrFunc.get(0); - if (consolidationNodeTemplateIds.contains(targetNodeTemplateId)) { - updatePropertyGetAttrFunc(serviceTemplate, unifiedCompositionDataList, - consolidationNodeTemplateIdAndType, targetNodeTemplateId, getAttrFunc, context); - } - } - nodeTemplate.getProperties().put(propertyEntry.getKey(), clonedPropertyValue); - 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, - Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, - String targetNodeTemplateId, - List<Object> getAttrFunc, TranslationContext context) { - UnifiedCompositionEntity targetCompositionEntity = - consolidationNodeTemplateIdAndType.get(targetNodeTemplateId); - String targetNewNodeTemplateId = - getNewNodeTemplateId(serviceTemplate, unifiedCompositionDataList, targetNodeTemplateId, - targetCompositionEntity, context); - getAttrFunc.set(0, targetNewNodeTemplateId); - } - - private String getNewNodeTemplateId(ServiceTemplate serviceTemplate, - List<UnifiedCompositionData> unifiedCompositionDataList, - String nodeTemplateId, - UnifiedCompositionEntity compositionEntity, - TranslationContext context) { - String newNodeTemplateId = nodeTemplateId; - String nodeTemplateIdGeneratorImpl = unifiedSubstitutionNodeTemplateIdGeneratorImplMap.get(compositionEntity); - UnifiedSubstitutionNodeTemplateIdGenerator nodeTemplateIdGenerator = - CommonMethods.newInstance(nodeTemplateIdGeneratorImpl, UnifiedSubstitutionNodeTemplateIdGenerator.class); - UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, null, - unifiedCompositionDataList, context, null); - Optional<String> generatedNodeTemplateId = nodeTemplateIdGenerator.generate(unifiedCompositionTo, nodeTemplateId); - if (generatedNodeTemplateId.isPresent()) { - newNodeTemplateId = generatedNodeTemplateId.get(); - } - return newNodeTemplateId; - } - - private String getNewNodeTemplateId(String origNodeTemplateId, - String serviceTemplateFileName, - ServiceTemplate serviceTemplate, - TranslationContext context) { - ConsolidationData consolidationData = context.getConsolidationData(); - - if (isIdIsOfExpectedType(origNodeTemplateId, UnifiedCompositionEntity.PORT, - serviceTemplateFileName, - context)) { - return handleIdOfPort(origNodeTemplateId, serviceTemplateFileName, consolidationData); - } else if (isIdIsOfExpectedType(origNodeTemplateId, COMPUTE, - serviceTemplateFileName, context)) { - NodeTemplate nodeTemplate = - getComputeNodeTemplate(origNodeTemplateId, serviceTemplate, context); - return getComputeTypeSuffix(nodeTemplate.getType()); - } - - return null; - } - - private Object getClonedPropertyValue(Map.Entry<String, Object> propertyEntry) { - if (propertyEntry.getValue() instanceof Map) { - return getClonedObject(propertyEntry.getValue(), Map.class); - } else if (propertyEntry.getValue() instanceof List) { - return getClonedObject(propertyEntry.getValue(), List.class); - } - return propertyEntry.getValue(); - } - - - private String getParameterId(String nodeTemplateId, NodeTemplate nodeTemplate, String propertyId, - UnifiedCompositionEntity unifiedCompositionEntity, - ComputeTemplateConsolidationData - computeTemplateConsolidationData, - PortTemplateConsolidationData portTemplateConsolidationData) { - String paramterId = propertyId; - switch (unifiedCompositionEntity) { - case COMPUTE: - paramterId = COMPUTE.getDisplayName().toLowerCase() + "_" - + getComputeTypeSuffix(nodeTemplate.getType()) + "_" + propertyId; - break; - case PORT: - String portType = portTemplateConsolidationData.getPortType(); - if (Objects.isNull(computeTemplateConsolidationData) - || (computeTemplateConsolidationData.getPorts().get(portType) != null - && computeTemplateConsolidationData.getPorts().get(portType).size() > 1)) { - paramterId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" - + nodeTemplateId + "_" + propertyId; + EntrySchema entrySchema = new EntrySchema(); + entrySchema.setType(PropertyType.FLOAT.getDisplayName()); + addInputParameter(countInputParameterId, PropertyType.LIST.getDisplayName(), entrySchema, substitutionServiceTemplate); + Map<String, List<String>> countPropertyValueInputParam = getPropertyValueInputParam(countInputParameterId); + serviceTemplatePropertyMap.remove(ToscaConstants.COUNT_PROPERTY_NAME); + serviceTemplatePropertyMap.put(ToscaConstants.COUNT_PROPERTY_NAME, countPropertyValueInputParam); + } + + private void handleNodeTypeProperties(ServiceTemplate substitutionServiceTemplate, List<EntityConsolidationData> entityConsolidationDataList, + NodeTemplate nodeTemplate, UnifiedCompositionEntity compositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData, TranslationContext context) { + ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + Optional<NodeType> enrichNodeType; + List<String> enrichProperties; + if (compositionEntity.equals(UnifiedCompositionEntity.PORT)) { + enrichNodeType = toscaAnalyzerService.fetchNodeType(ToscaNodeType.NETWORK_PORT, context.getGlobalServiceTemplates().values()); + enrichProperties = TranslationContext.getEnrichPortResourceProperties(); + if (!enrichNodeType.isPresent() || Objects.isNull(enrichProperties)) { + return; + } } else { - paramterId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + portType + "_" - + propertyId; - } - break; - case SUB_INTERFACE: - paramterId = getSubInterfaceInputParameterId(nodeTemplate.getType(), nodeTemplateId, propertyId, - portTemplateConsolidationData); - break; - default: - break; - } - return paramterId; - } - - private String getSubInterfaceInputParameterId(String type, - String nodeTemplateId, - String propertyId, - PortTemplateConsolidationData portTemplateConsolidationData) { - String subInterfaceType = getSubInterfaceTypeSuffix(type); - if (Objects.isNull(portTemplateConsolidationData) - || portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(type)) { - return UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_" - + nodeTemplateId + "_" + propertyId; - } - return UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_" - + subInterfaceType + "_" + propertyId; - } - - private void removeConnectivityOut(EntityConsolidationData entityConsolidationData, - NodeTemplate nodeTemplate) { + return; + } + Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties(); + 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); + } + } + } - Multimap<String, RequirementAssignmentData> nodesConnectedOut = entityConsolidationData.getNodesConnectedOut(); + private void handleEntityConsolidationDataNodeTypeProperties(String enrichPropertyName, ServiceTemplate substitutionServiceTemplate, + NodeType enrichNodeType, NodeTemplate nodeTemplate, + UnifiedCompositionEntity compositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + List<EntityConsolidationData> entityConsolidationDataList, + Map<String, Object> nodeTemplateProperties, TranslationContext context) { + String propertyType; + for (EntityConsolidationData entityConsolidationData : entityConsolidationDataList) { + String nodeTemplateId = entityConsolidationData.getNodeTemplateId(); + String inputParamId = getParameterId(nodeTemplateId, nodeTemplate, enrichPropertyName, compositionEntity, + computeTemplateConsolidationData, (PortTemplateConsolidationData) entityConsolidationData); + Map<String, String> propertyValMap = new HashMap<>(); + context.addNewPropertyIdToNodeTemplate(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate), inputParamId, + nodeTemplateProperties.get(enrichPropertyName)); + if (nodeTemplateProperties.containsKey(enrichPropertyName)) { + handleExistingEnrichedProperty(enrichPropertyName, nodeTemplateProperties, inputParamId); + } else { + propertyValMap.put(GET_INPUT.getFunctionName(), inputParamId); + nodeTemplate.getProperties().put(enrichPropertyName, propertyValMap); + } + propertyType = enrichNodeType.getProperties().get(enrichPropertyName).getType(); + addPropertyInputParameter(propertyType, substitutionServiceTemplate, + enrichNodeType.getProperties().get(enrichPropertyName).getEntry_schema(), inputParamId); + } + } - if (CommonUtil.isMultimapEmpty(nodesConnectedOut)) { + private void handleExistingEnrichedProperty(String enrichPropertyName, Map<String, Object> nodeTemplateProperties, String inputParamId) { + Object enrichedProperty = nodeTemplateProperties.get(enrichPropertyName); + if (!isPropertyContainsToscaFunction(enrichedProperty)) { + Map<String, Object> propertyWithGetInput = new HashMap<>(); + propertyWithGetInput.put(ToscaFunctions.GET_INPUT.getFunctionName(), inputParamId); + nodeTemplateProperties.put(enrichPropertyName, propertyWithGetInput); + } + } + + private boolean isPropertyContainsToscaFunction(Object propertyValue) { + ToscaFunctions[] values = ToscaFunctions.values(); + for (ToscaFunctions toscaFunction : values) { + if (isIncludeToscaFunc(propertyValue, toscaFunction)) { + return true; + } + } + return false; + } + + private void addPropertyInputParameter(String propertyType, ServiceTemplate substitutionServiceTemplate, EntrySchema entrySchema, + String parameterId) { + if (Objects.isNull(propertyType)) { return; } + if (isParameterBelongsToEnrichedPortProperties(parameterId)) { + addInputParameter(parameterId, propertyType, propertyType.equals(PropertyType.LIST.getDisplayName()) ? entrySchema : null, + substitutionServiceTemplate); + } else if (isPropertySimpleType(propertyType)) { + addInputParameter(parameterId, PropertyType.LIST.getDisplayName(), + DataModelUtil.createEntrySchema(propertyType.toLowerCase(), null, null), substitutionServiceTemplate); + } else if (propertyType.equals(PropertyTypeExt.JSON.getDisplayName()) || (Objects.nonNull(entrySchema) && isPropertySimpleType( + entrySchema.getType()))) { + addInputParameter(parameterId, PropertyType.LIST.getDisplayName(), + DataModelUtil.createEntrySchema(PropertyTypeExt.JSON.getDisplayName(), null, null), substitutionServiceTemplate); + } else { + addInputParameter(parameterId, analyzeParameterType(propertyType), + DataModelUtil.createEntrySchema(analyzeEntrySchemaType(propertyType, entrySchema), null, null), substitutionServiceTemplate); + } + } - nodesConnectedOut.values().forEach(requirementAssignmentData -> - DataModelUtil.removeRequirementsAssignment(nodeTemplate.getRequirements(), - requirementAssignmentData.getRequirementId()) - ); + private boolean isParameterBelongsToEnrichedPortProperties(String parameterId) { + List enrichPortResourceProperties = TranslationContext.getEnrichPortResourceProperties(); + for (int i = 0; i < enrichPortResourceProperties.size(); i++) { + if (parameterId.contains((CharSequence) enrichPortResourceProperties.get(i))) { + return true; + } + } + return false; + } + + private boolean isPropertySimpleType(String propertyType) { + return !Objects.isNull(propertyType) && (PropertyType.getSimplePropertyTypes().contains(propertyType.toLowerCase())); + } + + private String analyzeParameterType(String propertyType) { + return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) ? PropertyType.LIST.getDisplayName() : propertyType; + } + + private String analyzeEntrySchemaType(String propertyType, EntrySchema entrySchema) { + return propertyType.equalsIgnoreCase(PropertyType.LIST.getDisplayName()) && entrySchema != null ? entrySchema.getType() : null; + } + + private void handleConsolidationEntitiesRequirementConnectivity(NodeTemplate nodeTemplate, ServiceTemplate serviceTemplate, + TranslationContext context) { + List<Map<String, RequirementAssignment>> nodeTemplateRequirements = DataModelUtil.getNodeTemplateRequirementList(nodeTemplate); + if (CollectionUtils.isEmpty(nodeTemplateRequirements)) { + return; + } + for (Map<String, RequirementAssignment> requirement : nodeTemplateRequirements) { + for (Map.Entry<String, RequirementAssignment> entry : requirement.entrySet()) { + RequirementAssignment requirementAssignment = entry.getValue(); + String requirementNode = requirementAssignment.getNode(); + String unifiedNodeTemplateId = context.getUnifiedSubstitutionNodeTemplateId(serviceTemplate, requirementNode); + if (unifiedNodeTemplateId != null) { + //Update the node id in the requirement + requirementAssignment.setNode(unifiedNodeTemplateId); + } + } + } + nodeTemplate.setRequirements(nodeTemplateRequirements); + } + + /** + * Update the node references in the volume relationship templates. + * + * @param serviceTemplate the service template + * @param context the context + */ + private void updateVolumeRelationshipTemplate(ServiceTemplate serviceTemplate, String relationshipId, TranslationContext context) { + Map<String, RelationshipTemplate> relationshipTemplates = DataModelUtil.getRelationshipTemplates(serviceTemplate); + if (relationshipTemplates != null) { + RelationshipTemplate relationshipTemplate = relationshipTemplates.get(relationshipId); + if (relationshipTemplate != null) { + String relationshipTemplateType = relationshipTemplate.getType(); + if (relationshipTemplateType.equals(ToscaRelationshipType.CINDER_VOLUME_ATTACHES_TO)) { + handleCinderVolumeAttachmentRelationshipTemplate(serviceTemplate, relationshipTemplate, context); + } + } + } + } + + private void handleCinderVolumeAttachmentRelationshipTemplate(ServiceTemplate substitutionServiceTemplate, + RelationshipTemplate relationshipTemplate, TranslationContext context) { + Map<String, Object> properties = relationshipTemplate.getProperties(); + properties.computeIfPresent(HeatConstants.INSTANCE_UUID_PROPERTY_NAME, + (key, value) -> context.getUnifiedAbstractNodeTemplateId(substitutionServiceTemplate, (String) value)); + } + + private String updateIdenticalProperty(String nodeTemplateId, String propertyId, NodeTemplate nodeTemplate, + UnifiedCompositionEntity unifiedCompositionEntity, + List<UnifiedCompositionData> unifiedCompositionDataList) { + String inputParamId = null; + Map<String, Object> propertyVal = new HashMap<>(); + switch (unifiedCompositionEntity) { + case COMPUTE: + inputParamId = COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX + propertyId + COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX; + propertyVal.put(ToscaFunctions.GET_INPUT.getFunctionName(), inputParamId); + nodeTemplate.getProperties().put(propertyId, propertyVal); + break; + case PORT: + PortTemplateConsolidationData portTemplateConsolidationData = getPortTemplateConsolidationDataForPort(unifiedCompositionDataList, + nodeTemplateId); + String portType = null; + if (Objects.nonNull(portTemplateConsolidationData)) { + portType = portTemplateConsolidationData.getPortType(); + } + ComputeTemplateConsolidationData computeTemplateConsolidationData = getConnectedComputeConsolidationData(unifiedCompositionDataList, + nodeTemplateId); + inputParamId = getInputParamIdForPort(nodeTemplateId, propertyId, portType, computeTemplateConsolidationData); + propertyVal.put(ToscaFunctions.GET_INPUT.getFunctionName(), inputParamId); + nodeTemplate.getProperties().put(propertyId, propertyVal); + break; + default: + break; + } + return inputParamId; + } + + private String getInputParamIdForPort(String nodeTemplateId, String propertyId, String portType, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + String inputParamId; + if (Objects.isNull(computeTemplateConsolidationData) || computeTemplateConsolidationData.getPorts().get(portType).size() > 1) { + inputParamId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + nodeTemplateId + "_" + propertyId; + } else { + inputParamId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + portType + "_" + propertyId; + } + return inputParamId; + } + + private void addInputParameter(String parameterId, String parameterType, EntrySchema entrySchema, ServiceTemplate serviceTemplate) { + ParameterDefinition parameterDefinition = DataModelUtil.createParameterDefinition(parameterType, null, true, null, entrySchema, null); + DataModelUtil.addInputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition); + } + + // Return the input parameter Id which is used in the new property value if there is one + private Optional<String> updateProperty(ServiceTemplate serviceTemplate, String nodeTemplateId, NodeTemplate nodeTemplate, + Map.Entry<String, Object> propertyEntry, UnifiedCompositionEntity compositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + PortTemplateConsolidationData portTemplateConsolidationData, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + if (handleGetAttrFromConsolidationNodes(serviceTemplate, nodeTemplateId, nodeTemplate, propertyEntry, unifiedCompositionDataList, context)) { + return Optional.empty(); + } + String inputParamId = getParameterId(nodeTemplateId, nodeTemplate, propertyEntry.getKey(), compositionEntity, + computeTemplateConsolidationData, portTemplateConsolidationData); + Map<String, List<String>> propertyVal = getPropertyValueInputParam(inputParamId); + nodeTemplate.getProperties().put(propertyEntry.getKey(), propertyVal); + return Optional.of(inputParamId); + } + + private Map<String, List<String>> getPropertyValueInputParam(String inputParamId) { + Map<String, List<String>> propertyVal = new HashMap<>(); + List<String> getInputFuncParams = new ArrayList<>(); + getInputFuncParams.add(inputParamId); + getInputFuncParams.add(ToscaConstants.INDEX_VALUE_PROPERTY_NAME); + propertyVal.put(ToscaFunctions.GET_INPUT.getFunctionName(), getInputFuncParams); + return propertyVal; + } + + private boolean handleGetAttrFromConsolidationNodes(ServiceTemplate serviceTemplate, String nodeTemplateId, NodeTemplate nodeTemplate, + Map.Entry<String, Object> propertyEntry, + List<UnifiedCompositionData> unifiedCompositionDataList, TranslationContext context) { + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = 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) { + String getAttrNodeId = (String) getAttrFunc.get(0); + if (consolidationNodeTemplateIds.contains(getAttrNodeId)) { + includeGetAttrFromConsolidationNodes = true; + if (isGetAttrNodeTemplateFromSameType(nodeTemplateId, getAttrNodeId, entityIdToType)) { + isGetAttrFromConsolidationIsFromSameType = true; + } + } else { + includeGetAttrFromOutsideNodes = true; + } + } + if ((includeGetAttrFromConsolidationNodes && includeGetAttrFromOutsideNodes) || (includeGetAttrFromConsolidationNodes && isIncludeToscaFunc( + propertyEntry.getValue(), ToscaFunctions.GET_INPUT))) { + //This case is currently not supported - this property will be ignored + return true; + } else if (includeGetAttrFromConsolidationNodes && !isGetAttrFromConsolidationIsFromSameType) { + Object clonedPropertyValue = getClonedPropertyValue(propertyEntry); + List<List<Object>> clonedGetAttrFuncList = extractGetAttrFunction(clonedPropertyValue); + for (List<Object> getAttrFunc : clonedGetAttrFuncList) { + String targetNodeTemplateId = (String) getAttrFunc.get(0); + if (consolidationNodeTemplateIds.contains(targetNodeTemplateId)) { + updatePropertyGetAttrFunc(serviceTemplate, unifiedCompositionDataList, consolidationNodeTemplateIdAndType, targetNodeTemplateId, + getAttrFunc, context); + } + } + nodeTemplate.getProperties().put(propertyEntry.getKey(), clonedPropertyValue); + 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, + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType, String targetNodeTemplateId, + List<Object> getAttrFunc, TranslationContext context) { + UnifiedCompositionEntity targetCompositionEntity = consolidationNodeTemplateIdAndType.get(targetNodeTemplateId); + String targetNewNodeTemplateId = getNewNodeTemplateId(serviceTemplate, unifiedCompositionDataList, targetNodeTemplateId, + targetCompositionEntity, context); + getAttrFunc.set(0, targetNewNodeTemplateId); + } + + private String getNewNodeTemplateId(ServiceTemplate serviceTemplate, List<UnifiedCompositionData> unifiedCompositionDataList, + String nodeTemplateId, UnifiedCompositionEntity compositionEntity, TranslationContext context) { + String newNodeTemplateId = nodeTemplateId; + String nodeTemplateIdGeneratorImpl = unifiedSubstitutionNodeTemplateIdGeneratorImplMap.get(compositionEntity); + UnifiedSubstitutionNodeTemplateIdGenerator nodeTemplateIdGenerator = CommonMethods + .newInstance(nodeTemplateIdGeneratorImpl, UnifiedSubstitutionNodeTemplateIdGenerator.class); + UnifiedCompositionTo unifiedCompositionTo = new UnifiedCompositionTo(serviceTemplate, null, unifiedCompositionDataList, context, null); + Optional<String> generatedNodeTemplateId = nodeTemplateIdGenerator.generate(unifiedCompositionTo, nodeTemplateId); + if (generatedNodeTemplateId.isPresent()) { + newNodeTemplateId = generatedNodeTemplateId.get(); + } + return newNodeTemplateId; + } + private String getNewNodeTemplateId(String origNodeTemplateId, String serviceTemplateFileName, ServiceTemplate serviceTemplate, + TranslationContext context) { + ConsolidationData consolidationData = context.getConsolidationData(); + if (isIdIsOfExpectedType(origNodeTemplateId, UnifiedCompositionEntity.PORT, serviceTemplateFileName, context)) { + return handleIdOfPort(origNodeTemplateId, serviceTemplateFileName, consolidationData); + } else if (isIdIsOfExpectedType(origNodeTemplateId, COMPUTE, serviceTemplateFileName, context)) { + NodeTemplate nodeTemplate = getComputeNodeTemplate(origNodeTemplateId, serviceTemplate, context); + return getComputeTypeSuffix(nodeTemplate.getType()); + } + return null; + } + + private Object getClonedPropertyValue(Map.Entry<String, Object> propertyEntry) { + if (propertyEntry.getValue() instanceof Map) { + return getClonedObject(propertyEntry.getValue(), Map.class); + } else if (propertyEntry.getValue() instanceof List) { + return getClonedObject(propertyEntry.getValue(), List.class); + } + return propertyEntry.getValue(); + } + + private String getParameterId(String nodeTemplateId, NodeTemplate nodeTemplate, String propertyId, + UnifiedCompositionEntity unifiedCompositionEntity, + ComputeTemplateConsolidationData computeTemplateConsolidationData, + PortTemplateConsolidationData portTemplateConsolidationData) { + String paramterId = propertyId; + switch (unifiedCompositionEntity) { + case COMPUTE: + paramterId = COMPUTE.getDisplayName().toLowerCase() + "_" + getComputeTypeSuffix(nodeTemplate.getType()) + "_" + propertyId; + break; + case PORT: + String portType = portTemplateConsolidationData.getPortType(); + if (Objects.isNull(computeTemplateConsolidationData) || (computeTemplateConsolidationData.getPorts().get(portType) != null + && computeTemplateConsolidationData.getPorts().get(portType).size() > 1)) { + paramterId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + nodeTemplateId + "_" + propertyId; + } else { + paramterId = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_" + portType + "_" + propertyId; + } + break; + case SUB_INTERFACE: + paramterId = getSubInterfaceInputParameterId(nodeTemplate.getType(), nodeTemplateId, propertyId, portTemplateConsolidationData); + break; + default: + break; + } + return paramterId; + } + + private String getSubInterfaceInputParameterId(String type, String nodeTemplateId, String propertyId, + PortTemplateConsolidationData portTemplateConsolidationData) { + String subInterfaceType = getSubInterfaceTypeSuffix(type); + if (Objects.isNull(portTemplateConsolidationData) || portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(type)) { + return UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_" + nodeTemplateId + "_" + propertyId; + } + return UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_" + subInterfaceType + "_" + propertyId; + } + + private void removeConnectivityOut(EntityConsolidationData entityConsolidationData, NodeTemplate nodeTemplate) { + Multimap<String, RequirementAssignmentData> nodesConnectedOut = entityConsolidationData.getNodesConnectedOut(); + if (CommonUtil.isMultimapEmpty(nodesConnectedOut)) { + return; + } + nodesConnectedOut.values().forEach(requirementAssignmentData -> DataModelUtil + .removeRequirementsAssignment(nodeTemplate.getRequirements(), requirementAssignmentData.getRequirementId())); if (nodeTemplate.getRequirements().isEmpty()) { nodeTemplate.setRequirements(null); } } - private void removeVolumeConnectivity(ComputeTemplateConsolidationData computeTemplateConsolidationData, - NodeTemplate computeNodeTemplate) { + private void removeVolumeConnectivity(ComputeTemplateConsolidationData computeTemplateConsolidationData, NodeTemplate computeNodeTemplate) { if (CommonUtil.isMultimapEmpty(computeTemplateConsolidationData.getVolumes())) { return; } - - computeTemplateConsolidationData.getVolumes().values().forEach(requirementAssignmentData -> - DataModelUtil.removeRequirementsAssignment(computeNodeTemplate.getRequirements(), - requirementAssignmentData.getRequirementId()) - ); - + computeTemplateConsolidationData.getVolumes().values().forEach(requirementAssignmentData -> DataModelUtil + .removeRequirementsAssignment(computeNodeTemplate.getRequirements(), requirementAssignmentData.getRequirementId())); if (computeNodeTemplate.getRequirements().isEmpty()) { computeNodeTemplate.setRequirements(null); } } - private void createIndexInputParameter(ServiceTemplate substitutionServiceTemplate) { - ParameterDefinition indexParameterDefinition = - DataModelUtil.createParameterDefinition(PropertyType.INTEGER.getDisplayName(), - "Index value of this substitution service template runtime instance", - false, createIndexValueConstraint(), null, 0); - DataModelUtil.addInputParameterToTopologyTemplate(substitutionServiceTemplate, - ToscaConstants.INDEX_VALUE_PROPERTY_NAME, indexParameterDefinition); - } - - - private List<Constraint> createIndexValueConstraint() { - List<Constraint> constraints; - constraints = new ArrayList<>(); - Constraint constraint = new Constraint(); - constraint.setGreater_or_equal(0); - constraints.add(constraint); - return constraints; - } - - private Optional<UnifiedComposition> getUnifiedCompositionInstance(UnifiedCompositionMode mode) { - String unifiedCompositionImplClassName = - unifiedCompositionImplMap.get(mode.name()).getImplementationClass(); - if (StringUtils.isEmpty(unifiedCompositionImplClassName)) { - return Optional.empty(); - } - return Optional - .of(CommonMethods.newInstance(unifiedCompositionImplClassName, UnifiedComposition.class)); - } - - private Optional<Map<String, Object>> createAbstractSubstitutionProperties( - ServiceTemplate serviceTemplate, - Map<String, ParameterDefinition> substitutionTemplateInputs, - List<UnifiedCompositionData> unifiedCompositionDataList, - TranslationContext context) { - Map<String, Object> abstractSubstituteProperties = new LinkedHashMap<>(); - //Since all the computes have the same type fetching the type from the first entry - NodeTemplate firstComputeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - unifiedCompositionDataList.get(0) - .getComputeTemplateConsolidationData().getNodeTemplateId()); - String computeType = getComputeTypeSuffix(firstComputeNodeTemplate.getType()); - for (Map.Entry<String, ParameterDefinition> input : substitutionTemplateInputs.entrySet()) { - String substitutionTemplateInputName = input.getKey(); - ParameterDefinition inputParameterDefinition = input.getValue(); - String inputType = inputParameterDefinition.getType(); - UnifiedCompositionEntity inputUnifiedCompositionEntity = - getInputCompositionEntity(substitutionTemplateInputName); - - if (isIdenticalValueProperty(substitutionTemplateInputName, inputUnifiedCompositionEntity) - || !inputType.equalsIgnoreCase(PropertyType.LIST.getDisplayName())) { - //Handle identical value properties - Optional<String> identicalValuePropertyName = - getIdenticalValuePropertyName(substitutionTemplateInputName, - inputUnifiedCompositionEntity); - - identicalValuePropertyName.ifPresent(propertyName -> updateIdenticalPropertyValue(propertyName, - substitutionTemplateInputName, inputUnifiedCompositionEntity, - unifiedCompositionDataList.get(0), serviceTemplate, abstractSubstituteProperties, - context)); - continue; - } - - //Check if the input is of type compute, port or sub interface - List<Object> abstractPropertyValue = new ArrayList<>(); - switch (inputUnifiedCompositionEntity) { - case COMPUTE: - createAbstractComputeProperties(unifiedCompositionDataList, - substitutionTemplateInputName, serviceTemplate, abstractPropertyValue); - break; - case PORT: - createAbstractPortProperties(unifiedCompositionDataList, substitutionTemplateInputName, - computeType, serviceTemplate, abstractPropertyValue); - break; - case SUB_INTERFACE: - createAbstractSubInterfaceProperties(unifiedCompositionDataList, - substitutionTemplateInputName, serviceTemplate, abstractPropertyValue); - break; - default: - break; - } - //Add the property only if it has at least one non-null value - if (abstractPropertyValue.stream().anyMatch(Objects::nonNull)) { - updateAbstractPropertyValue(substitutionTemplateInputName, inputParameterDefinition, - abstractPropertyValue, abstractSubstituteProperties); - } - } - return Optional.ofNullable(abstractSubstituteProperties); - } - - private void createAbstractComputeProperties(List<UnifiedCompositionData> - unifiedCompositionDataList, - String substitutionTemplateInputName, - ServiceTemplate serviceTemplate, - List<Object> abstractPropertyValue) { - for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = - compositionData.getComputeTemplateConsolidationData(); - Object propertyValue = getComputePropertyValue(substitutionTemplateInputName, - serviceTemplate, computeTemplateConsolidationData); - if (!(propertyValue instanceof Optional)) { - abstractPropertyValue.add(propertyValue); - } - } - } - - private void createAbstractPortProperties(List<UnifiedCompositionData> - unifiedCompositionDataList, - String substitutionTemplateInputName, - String computeType, - ServiceTemplate serviceTemplate, - List<Object> abstractPropertyValue) { - for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(compositionData); - //Get the input type for this input whether it is of type - // port_<port_node_template_id>_<property_name> or port_<port_type>_<property_name> - PropertyInputType portInputType = getPortInputType(substitutionTemplateInputName, - compositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - //Get the port property value - String portNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId(); - Object propertyValue = getPortPropertyValue(substitutionTemplateInputName, - computeType, portInputType, serviceTemplate, - portNodeTemplateId, portTemplateConsolidationData); - //If the value object is Optional.empty it implies that the property name was not - // found in the input name - if (!(propertyValue instanceof Optional)) { - abstractPropertyValue.add(propertyValue); - } - } - } - } - - private void createAbstractSubInterfaceProperties(List<UnifiedCompositionData> - unifiedCompositionDataList, - String substitutionTemplateInputName, - ServiceTemplate serviceTemplate, - List<Object> abstractPropertyValue) { - for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(compositionData); - //Get the input type for this input whether it is of type - // subInterface_<subinterface_node_template_id>_<property_name> or - // subInterface_<subinterface_type>_<property_name> - PropertyInputType subInterfaceInputType = - getSubInterfaceInputType(substitutionTemplateInputName, compositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - //Get the subInterface property value - String subInterfaceNodeTemplateId = subInterfaceTemplateConsolidationData - .getNodeTemplateId(); - NodeTemplate subInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - subInterfaceNodeTemplateId); - String subInterfaceType = getSubInterfaceTypeSuffix(subInterfaceNodeTemplate - .getType()); - Object propertyValue = getSubInterfacePropertyValue(substitutionTemplateInputName, - subInterfaceType, subInterfaceInputType, serviceTemplate, - subInterfaceNodeTemplateId); - //If the value object is Optional.empty it implies that the property name was not - // found in the input name - if (!(propertyValue instanceof Optional)) { - abstractPropertyValue.add(propertyValue); - } - } - } - } - - private void updateAbstractPropertyValue(String substitutionTemplateInputName, - ParameterDefinition parameterDefinition, - List<Object> abstractPropertyValue, - Map<String, Object> abstractSubstituteProperties) { - if (abstractPropertyValue.size() > 1) { - abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); - } else { - Object propertyValue = abstractPropertyValue.get(0); - String entrySchemaType = parameterDefinition.getEntry_schema().getType(); - if (PropertyType.getSimplePropertyTypes().contains(entrySchemaType.toLowerCase()) - || entrySchemaType.equals(PropertyTypeExt.JSON.getDisplayName())) { - abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); - } else { - abstractSubstituteProperties.put(substitutionTemplateInputName, propertyValue); - } - } - } - - private void updateIdenticalPropertyValue(String identicalValuePropertyName, - String substitutionTemplateInputName, - UnifiedCompositionEntity entity, - UnifiedCompositionData unifiedCompositionData, - ServiceTemplate serviceTemplate, - Map<String, Object> abstractSubstituteProperties, - TranslationContext context) { - Optional<Object> identicalPropertyValueByType = - getIdenticalPropertyValueByType(identicalValuePropertyName, substitutionTemplateInputName, - entity, unifiedCompositionData, serviceTemplate, context); - - if (identicalPropertyValueByType.isPresent()) { - abstractSubstituteProperties - .put(substitutionTemplateInputName, identicalPropertyValueByType.get()); - - } - - - } - - private Optional<Object> getIdenticalPropertyValueByType(String identicalValuePropertyName, - String substitutionTemplateInputName, - UnifiedCompositionEntity entity, - UnifiedCompositionData - unifiedCompositionData, - ServiceTemplate serviceTemplate, - TranslationContext context) { - - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionData.getComputeTemplateConsolidationData(); - - Optional<Object> identicalPropertyValue = Optional.empty(); - switch (entity) { - case COMPUTE: - identicalPropertyValue = - getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate, - computeTemplateConsolidationData, context); - break; - case OTHER: - identicalPropertyValue = - getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate, - computeTemplateConsolidationData, context); - break; - case PORT: - PropertyInputType portInputType = getPortInputType(substitutionTemplateInputName, - unifiedCompositionData); - Optional <PortTemplateConsolidationData> portTemplateConsolidationData = - unifiedCompositionData.getPortTemplateConsolidationDataList() - .stream() - .filter(s -> substitutionTemplateInputName. - contains(getPropertyInputPrefix(s.getNodeTemplateId(), - s.getPortType(), - portInputType, UnifiedCompositionEntity.PORT))) - .findFirst(); - - if(portTemplateConsolidationData.isPresent()) { - return getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate, - portTemplateConsolidationData.get(), context); - } - break; - default: - break; - } - return identicalPropertyValue; - } - - - private PropertyInputType getPortInputType(String inputName, - UnifiedCompositionData unifiedCompositionData) { - String portInputPrefix = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_"; - ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData - .getComputeTemplateConsolidationData(); - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - //Scan the available port node template ids to check if the input is of the form - // "port_<port_node_template_id>_<property_name>" - if (portTemplateConsolidationDataList.stream().map(EntityConsolidationData::getNodeTemplateId) - .map(portNodeTemplateId -> portInputPrefix + portNodeTemplateId).anyMatch(inputName::startsWith)) { - return PropertyInputType.NODE_TEMPLATE_ID; - } - //Check whether the input is of the form "port_<port_type>_<property_name>" - Set<String> portTypes = computeTemplateConsolidationData.getPorts().keySet(); - if (portTypes.stream().map(portType -> portInputPrefix + portType + "_").anyMatch(inputName::startsWith)) { - return PropertyInputType.TYPE; - } - return PropertyInputType.OTHER; - } - - private PropertyInputType getSubInterfaceInputType(String inputName, - UnifiedCompositionData unifiedCompositionData) { - String subInterfaceInputPrefix = UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() - + "_"; - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - //Scan the available port node template ids to check if the input is of the form - // "subinterface_<subinterface_node_template_id>_<property_name>" - if (subInterfaceTemplateConsolidationDataList.stream().map(EntityConsolidationData::getNodeTemplateId) - .map(subInterfaceNodeTemplateId -> subInterfaceInputPrefix - + subInterfaceNodeTemplateId) - .anyMatch(inputName::startsWith)) { - return PropertyInputType.NODE_TEMPLATE_ID; - } - //Check whether the input is of the form "subinterface_<subinterface_type>_<property_name>" - Set<String> subInterfaceTypes = new HashSet<>(); - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create(); - portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity); - subInterfaceTypes.addAll(subInterfaceTypeToEntity.keySet()); - } - - if (subInterfaceTypes.stream().map(UnifiedCompositionUtil::getSubInterfaceTypeSuffix) - .map(subInterfaceTypeSuffix -> subInterfaceInputPrefix + subInterfaceTypeSuffix + "_") - .anyMatch(inputName::startsWith)) { - return PropertyInputType.TYPE; - } - return PropertyInputType.OTHER; - } - - private void cleanServiceTemplate(ServiceTemplate serviceTemplate, - EntityConsolidationData entity, - TranslationContext context) { - removeNodeTemplateFromServiceTemplate(serviceTemplate, entity, context); - updateHeatStackGroup(serviceTemplate, entity, context); - updateSubstitutionMapping(serviceTemplate, context); - } + private void createIndexInputParameter(ServiceTemplate substitutionServiceTemplate) { + ParameterDefinition indexParameterDefinition = DataModelUtil + .createParameterDefinition(PropertyType.INTEGER.getDisplayName(), "Index value of this substitution service template runtime instance", + false, createIndexValueConstraint(), null, 0); + DataModelUtil + .addInputParameterToTopologyTemplate(substitutionServiceTemplate, ToscaConstants.INDEX_VALUE_PROPERTY_NAME, indexParameterDefinition); + } - private void removeNodeTemplateFromServiceTemplate(ServiceTemplate serviceTemplate, - EntityConsolidationData entity, - TranslationContext context) { - String nodeTemplateIdToRemove = entity.getNodeTemplateId(); - Map<String, NodeTemplate> nodeTemplates = - serviceTemplate.getTopology_template().getNode_templates(); - NodeTemplate nodeTemplateToRemove = - nodeTemplates.get(nodeTemplateIdToRemove); - nodeTemplates.remove(nodeTemplateIdToRemove); - - context.addCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), - nodeTemplateIdToRemove, - entity.getClass() == ComputeTemplateConsolidationData.class - ? COMPUTE - : UnifiedCompositionEntity.PORT, - nodeTemplateToRemove); - - } - - private void removeCleanedNodeType(String cleanedNodeTemplateId, - ServiceTemplate serviceTemplate, - TranslationContext context) { - NodeTemplate cleanedNodeTemplate = - context - .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), - cleanedNodeTemplateId); - String typeToRemove = cleanedNodeTemplate.getType(); + private List<Constraint> createIndexValueConstraint() { + List<Constraint> constraints; + constraints = new ArrayList<>(); + Constraint constraint = new Constraint(); + constraint.setGreater_or_equal(0); + constraints.add(constraint); + return constraints; + } + + private Optional<UnifiedComposition> getUnifiedCompositionInstance(UnifiedCompositionMode mode) { + String unifiedCompositionImplClassName = unifiedCompositionImplMap.get(mode.name()).getImplementationClass(); + if (StringUtils.isEmpty(unifiedCompositionImplClassName)) { + return Optional.empty(); + } + return Optional.of(CommonMethods.newInstance(unifiedCompositionImplClassName, UnifiedComposition.class)); + } + + private Optional<Map<String, Object>> createAbstractSubstitutionProperties(ServiceTemplate serviceTemplate, + Map<String, ParameterDefinition> substitutionTemplateInputs, + List<UnifiedCompositionData> unifiedCompositionDataList, + TranslationContext context) { + Map<String, Object> abstractSubstituteProperties = new LinkedHashMap<>(); + //Since all the computes have the same type fetching the type from the first entry + NodeTemplate firstComputeNodeTemplate = DataModelUtil + .getNodeTemplate(serviceTemplate, unifiedCompositionDataList.get(0).getComputeTemplateConsolidationData().getNodeTemplateId()); + String computeType = getComputeTypeSuffix(firstComputeNodeTemplate.getType()); + for (Map.Entry<String, ParameterDefinition> input : substitutionTemplateInputs.entrySet()) { + String substitutionTemplateInputName = input.getKey(); + ParameterDefinition inputParameterDefinition = input.getValue(); + String inputType = inputParameterDefinition.getType(); + UnifiedCompositionEntity inputUnifiedCompositionEntity = getInputCompositionEntity(substitutionTemplateInputName); + if (isIdenticalValueProperty(substitutionTemplateInputName, inputUnifiedCompositionEntity) || !inputType + .equalsIgnoreCase(PropertyType.LIST.getDisplayName())) { + //Handle identical value properties + Optional<String> identicalValuePropertyName = getIdenticalValuePropertyName(substitutionTemplateInputName, + inputUnifiedCompositionEntity); + identicalValuePropertyName.ifPresent( + propertyName -> updateIdenticalPropertyValue(propertyName, substitutionTemplateInputName, inputUnifiedCompositionEntity, + unifiedCompositionDataList.get(0), serviceTemplate, abstractSubstituteProperties, context)); + continue; + } + //Check if the input is of type compute, port or sub interface + List<Object> abstractPropertyValue = new ArrayList<>(); + switch (inputUnifiedCompositionEntity) { + case COMPUTE: + createAbstractComputeProperties(unifiedCompositionDataList, substitutionTemplateInputName, serviceTemplate, + abstractPropertyValue); + break; + case PORT: + createAbstractPortProperties(unifiedCompositionDataList, substitutionTemplateInputName, computeType, serviceTemplate, + abstractPropertyValue); + break; + case SUB_INTERFACE: + createAbstractSubInterfaceProperties(unifiedCompositionDataList, substitutionTemplateInputName, serviceTemplate, + abstractPropertyValue); + break; + default: + break; + } + //Add the property only if it has at least one non-null value + if (abstractPropertyValue.stream().anyMatch(Objects::nonNull)) { + updateAbstractPropertyValue(substitutionTemplateInputName, inputParameterDefinition, abstractPropertyValue, + abstractSubstituteProperties); + } + } + return Optional.ofNullable(abstractSubstituteProperties); + } - if (Objects.nonNull(typeToRemove) - && serviceTemplate.getNode_types().containsKey(typeToRemove)) { - serviceTemplate.getNode_types().remove(typeToRemove); + private void createAbstractComputeProperties(List<UnifiedCompositionData> unifiedCompositionDataList, String substitutionTemplateInputName, + ServiceTemplate serviceTemplate, List<Object> abstractPropertyValue) { + for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = compositionData.getComputeTemplateConsolidationData(); + Object propertyValue = getComputePropertyValue(substitutionTemplateInputName, serviceTemplate, computeTemplateConsolidationData); + if (!(propertyValue instanceof Optional)) { + abstractPropertyValue.add(propertyValue); + } + } } - } - private void updateHeatStackGroup(ServiceTemplate serviceTemplate, - EntityConsolidationData entity, - TranslationContext context) { - Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template() - .getGroups() == null ? new HashMap<>() - : serviceTemplate.getTopology_template().getGroups(); - String nodeRelatedAbstractNodeId = - context.getUnifiedAbstractNodeTemplateId(serviceTemplate, entity.getNodeTemplateId()); - - for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) { - GroupDefinition groupDefinition = groupEntry.getValue(); - if (isHeatStackGroup(groupDefinition.getType())) { - updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nodeRelatedAbstractNodeId, - groupEntry); - } - } - } - - private void updateGroupMembersWithNewUnifiedNodeTemplateId( - EntityConsolidationData entity, - String newNodetemplateId, - Map.Entry<String, GroupDefinition> groupEntry) { - List<String> members = groupEntry.getValue().getMembers(); - if (members.contains(entity.getNodeTemplateId())) { - members.remove(entity.getNodeTemplateId()); - if (!members.contains(newNodetemplateId)) { - members.add(newNodetemplateId); - } - } - groupEntry.getValue().setMembers(members); - } - - private void updateSubstitutionMapping(ServiceTemplate serviceTemplate, - TranslationContext context) { - SubstitutionMapping substitutionMappings = - DataModelUtil.getSubstitutionMappings(serviceTemplate); - if (Objects.nonNull(substitutionMappings)) { + private void createAbstractPortProperties(List<UnifiedCompositionData> unifiedCompositionDataList, String substitutionTemplateInputName, + String computeType, ServiceTemplate serviceTemplate, List<Object> abstractPropertyValue) { + for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(compositionData); + //Get the input type for this input whether it is of type + + // port_<port_node_template_id>_<property_name> or port_<port_type>_<property_name> + PropertyInputType portInputType = getPortInputType(substitutionTemplateInputName, compositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + //Get the port property value + String portNodeTemplateId = portTemplateConsolidationData.getNodeTemplateId(); + Object propertyValue = getPortPropertyValue(substitutionTemplateInputName, computeType, portInputType, serviceTemplate, + portNodeTemplateId, portTemplateConsolidationData); + //If the value object is Optional.empty it implies that the property name was not + + // found in the input name + if (!(propertyValue instanceof Optional)) { + abstractPropertyValue.add(propertyValue); + } + } + } + } - if (Objects.nonNull(substitutionMappings.getRequirements())) { - updateSubstitutionMappingRequirements(substitutionMappings.getRequirements(), - serviceTemplate, context); - } + private void createAbstractSubInterfaceProperties(List<UnifiedCompositionData> unifiedCompositionDataList, String substitutionTemplateInputName, + ServiceTemplate serviceTemplate, List<Object> abstractPropertyValue) { + for (UnifiedCompositionData compositionData : unifiedCompositionDataList) { + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + compositionData); + //Get the input type for this input whether it is of type + + // subInterface_<subinterface_node_template_id>_<property_name> or + + // subInterface_<subinterface_type>_<property_name> + PropertyInputType subInterfaceInputType = getSubInterfaceInputType(substitutionTemplateInputName, compositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + //Get the subInterface property value + String subInterfaceNodeTemplateId = subInterfaceTemplateConsolidationData.getNodeTemplateId(); + NodeTemplate subInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, subInterfaceNodeTemplateId); + String subInterfaceType = getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType()); + Object propertyValue = getSubInterfacePropertyValue(substitutionTemplateInputName, subInterfaceType, subInterfaceInputType, + serviceTemplate, subInterfaceNodeTemplateId); + //If the value object is Optional.empty it implies that the property name was not + + // found in the input name + if (!(propertyValue instanceof Optional)) { + abstractPropertyValue.add(propertyValue); + } + } + } + } - if (Objects.nonNull(substitutionMappings.getCapabilities())) { - updateSubstitutionMappingCapabilities(substitutionMappings.getCapabilities(), - serviceTemplate, context); - } + private void updateAbstractPropertyValue(String substitutionTemplateInputName, ParameterDefinition parameterDefinition, + List<Object> abstractPropertyValue, Map<String, Object> abstractSubstituteProperties) { + if (abstractPropertyValue.size() > 1) { + abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); + } else { + Object propertyValue = abstractPropertyValue.get(0); + String entrySchemaType = parameterDefinition.getEntry_schema().getType(); + if (PropertyType.getSimplePropertyTypes().contains(entrySchemaType.toLowerCase()) || entrySchemaType + .equals(PropertyTypeExt.JSON.getDisplayName())) { + abstractSubstituteProperties.put(substitutionTemplateInputName, abstractPropertyValue); + } else { + abstractSubstituteProperties.put(substitutionTemplateInputName, propertyValue); + } + } } - } - 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) { - Map<String, GroupDefinition> groups = serviceTemplate.getTopology_template() - .getGroups() == null ? new HashMap<>() : serviceTemplate.getTopology_template().getGroups(); - String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); - Optional<String> nestedNodeTemplateId = - context.getUnifiedNestedNodeTemplateId(serviceTemplateFileName, entity.getNodeTemplateId()); - if (nestedNodeTemplateId.isPresent()) { - for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) { - GroupDefinition groupDefinition = groupEntry.getValue(); - if (isHeatStackGroup(groupDefinition.getType())) { - updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nestedNodeTemplateId.get(), - groupEntry); - } - } - } - } - - private void handleNestedNodeTemplateInMainServiceTemplate(String nestedNodeTemplateId, - ServiceTemplate mainServiceTemplate, - ServiceTemplate nestedServiceTemplate, - TranslationContext context) { - NodeTemplate nestedNodeTemplate = DataModelUtil.getNodeTemplate(mainServiceTemplate, - nestedNodeTemplateId); - if (Objects.isNull(nestedNodeTemplate)) { - return; - } - - updateNestedNodeTemplateProperties(nestedServiceTemplate, nestedNodeTemplate, context); - - Optional<String> unifiedNestedNodeTypeId = context - .getUnifiedNestedNodeTypeId( - ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME), - nestedNodeTemplate.getType()); - unifiedNestedNodeTypeId - .ifPresent(unifiedNestedNodeTypeIdVal -> updateNestedNodeTemplate( - unifiedNestedNodeTypeIdVal, nestedNodeTemplateId, nestedNodeTemplate, - mainServiceTemplate, context)); - } - - private void updateNestedNodeTemplateProperties(ServiceTemplate nestedServiceTemplate, - NodeTemplate nestedNodeTemplate, - TranslationContext context) { + private void updateIdenticalPropertyValue(String identicalValuePropertyName, String substitutionTemplateInputName, + UnifiedCompositionEntity entity, UnifiedCompositionData unifiedCompositionData, + ServiceTemplate serviceTemplate, Map<String, Object> abstractSubstituteProperties, + TranslationContext context) { + Optional<Object> identicalPropertyValueByType = getIdenticalPropertyValueByType(identicalValuePropertyName, substitutionTemplateInputName, + entity, unifiedCompositionData, serviceTemplate, context); + if (identicalPropertyValueByType.isPresent()) { + abstractSubstituteProperties.put(substitutionTemplateInputName, identicalPropertyValueByType.get()); + } + } + + private Optional<Object> getIdenticalPropertyValueByType(String identicalValuePropertyName, String substitutionTemplateInputName, + UnifiedCompositionEntity entity, UnifiedCompositionData unifiedCompositionData, + ServiceTemplate serviceTemplate, TranslationContext context) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + Optional<Object> identicalPropertyValue = Optional.empty(); + switch (entity) { + case COMPUTE: + identicalPropertyValue = getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate, computeTemplateConsolidationData, + context); + break; + case OTHER: + identicalPropertyValue = getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate, computeTemplateConsolidationData, + context); + break; + case PORT: + PropertyInputType portInputType = getPortInputType(substitutionTemplateInputName, unifiedCompositionData); + Optional<PortTemplateConsolidationData> portTemplateConsolidationData = unifiedCompositionData.getPortTemplateConsolidationDataList() + .stream().filter(s -> substitutionTemplateInputName + .contains(getPropertyInputPrefix(s.getNodeTemplateId(), s.getPortType(), portInputType, UnifiedCompositionEntity.PORT))) + .findFirst(); + if (portTemplateConsolidationData.isPresent()) { + return getIdenticalPropertyValue(identicalValuePropertyName, serviceTemplate, portTemplateConsolidationData.get(), context); + } + break; + default: + break; + } + return identicalPropertyValue; + } - Map<String, Object> newPropertyInputParamIds = - context.getAllNewPropertyInputParamIdsPerNodeTenplateId(ToscaUtil - .getServiceTemplateFileName(nestedServiceTemplate)); + private PropertyInputType getPortInputType(String inputName, UnifiedCompositionData unifiedCompositionData) { + String portInputPrefix = UnifiedCompositionEntity.PORT.getDisplayName().toLowerCase() + "_"; + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + //Scan the available port node template ids to check if the input is of the form - for (Map.Entry<String, Object> entry : newPropertyInputParamIds.entrySet()) { - if (Objects.nonNull(entry.getValue())) { - Object value = getClonedObject(entry.getValue()); - nestedNodeTemplate.getProperties().put(entry.getKey(), value); - } + // "port_<port_node_template_id>_<property_name>" + if (portTemplateConsolidationDataList.stream().map(EntityConsolidationData::getNodeTemplateId) + .map(portNodeTemplateId -> portInputPrefix + portNodeTemplateId).anyMatch(inputName::startsWith)) { + return PropertyInputType.NODE_TEMPLATE_ID; + } + //Check whether the input is of the form "port_<port_type>_<property_name>" + Set<String> portTypes = computeTemplateConsolidationData.getPorts().keySet(); + if (portTypes.stream().map(portType -> portInputPrefix + portType + "_").anyMatch(inputName::startsWith)) { + return PropertyInputType.TYPE; + } + return PropertyInputType.OTHER; } - String subNodeType = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getNode_type(); - nestedNodeTemplate.setType(subNodeType); + private PropertyInputType getSubInterfaceInputType(String inputName, UnifiedCompositionData unifiedCompositionData) { + String subInterfaceInputPrefix = UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_"; + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + //Scan the available port node template ids to check if the input is of the form - } + // "subinterface_<subinterface_node_template_id>_<property_name>" + if (subInterfaceTemplateConsolidationDataList.stream().map(EntityConsolidationData::getNodeTemplateId) + .map(subInterfaceNodeTemplateId -> subInterfaceInputPrefix + subInterfaceNodeTemplateId).anyMatch(inputName::startsWith)) { + return PropertyInputType.NODE_TEMPLATE_ID; + } + //Check whether the input is of the form "subinterface_<subinterface_type>_<property_name>" + Set<String> subInterfaceTypes = new HashSet<>(); + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create(); + portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity); + subInterfaceTypes.addAll(subInterfaceTypeToEntity.keySet()); + } + if (subInterfaceTypes.stream().map(UnifiedCompositionUtil::getSubInterfaceTypeSuffix) + .map(subInterfaceTypeSuffix -> subInterfaceInputPrefix + subInterfaceTypeSuffix + "_").anyMatch(inputName::startsWith)) { + return PropertyInputType.TYPE; + } + return PropertyInputType.OTHER; + } - private void handleSubstitutionMappingInNestedServiceTemplate( - String newNestedNodeType, - ServiceTemplate nestedServiceTemplate, - TranslationContext context) { - if (Objects.isNull(newNestedNodeType)) { - return; + private void cleanServiceTemplate(ServiceTemplate serviceTemplate, EntityConsolidationData entity, TranslationContext context) { + removeNodeTemplateFromServiceTemplate(serviceTemplate, entity, context); + updateHeatStackGroup(serviceTemplate, entity, context); + updateSubstitutionMapping(serviceTemplate, context); } - Set<String> relatedNestedNodeTypeIds = - context.getAllRelatedNestedNodeTypeIds(); + private void removeNodeTemplateFromServiceTemplate(ServiceTemplate serviceTemplate, EntityConsolidationData entity, TranslationContext context) { + String nodeTemplateIdToRemove = entity.getNodeTemplateId(); + Map<String, NodeTemplate> nodeTemplates = serviceTemplate.getTopology_template().getNode_templates(); + NodeTemplate nodeTemplateToRemove = nodeTemplates.get(nodeTemplateIdToRemove); + nodeTemplates.remove(nodeTemplateIdToRemove); + context.addCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), nodeTemplateIdToRemove, + entity.getClass() == ComputeTemplateConsolidationData.class ? COMPUTE : UnifiedCompositionEntity.PORT, nodeTemplateToRemove); + } - SubstitutionMapping substitutionMappings = - nestedServiceTemplate.getTopology_template().getSubstitution_mappings(); - if (!relatedNestedNodeTypeIds.contains(substitutionMappings.getNode_type())) { - substitutionMappings.setNode_type(newNestedNodeType); + private void removeCleanedNodeType(String cleanedNodeTemplateId, ServiceTemplate serviceTemplate, TranslationContext context) { + NodeTemplate cleanedNodeTemplate = context + .getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), cleanedNodeTemplateId); + String typeToRemove = cleanedNodeTemplate.getType(); + if (Objects.nonNull(typeToRemove) && serviceTemplate.getNode_types().containsKey(typeToRemove)) { + serviceTemplate.getNode_types().remove(typeToRemove); + } } - } - private void updateNestedNodeTemplate(String newNestedNodeTypeId, - String nestedNodeTemplateId, - NodeTemplate nestedNodeTemplate, - ServiceTemplate mainServiceTemplate, - TranslationContext context) { - String mainSTName = ToscaUtil.getServiceTemplateFileName(mainServiceTemplate); - String globalSTName = - ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); - int index = - context.getHandledNestedComputeNodeTemplateIndex(globalSTName, newNestedNodeTypeId); - String newNodeTemplateId = - 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(mainSTName, nestedNodeTemplateId, newNodeTemplateId); - } - - private void handleNestedNodeTypesInGlobalSubstituteServiceTemplate( - String origNestedNodeTypeId, - String newNestedNodeTypeId, - ServiceTemplate globalSubstitutionServiceTemplate, - TranslationContext context) { - Set<String> relatedNestedNodeTypeIds = - context.getAllRelatedNestedNodeTypeIds(); - - Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); - if (!relatedNestedNodeTypeIds.contains(origNestedNodeTypeId)) { - NodeType nested = DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, - origNestedNodeTypeId); - setNewValuesForNestedNodeType(origNestedNodeTypeId, newNestedNodeTypeId, nested, nodeTypes); - } 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, - String newNestedNodeTypeId, - NodeType nested, - Map<String, NodeType> nodeTypes) { - if (Objects.nonNull(nested)) { - nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); - nodeTypes.remove(origNestedNodeType); - nodeTypes.put(newNestedNodeTypeId, nested); - } - } - - private Optional<String> getNewNestedNodeTypeId(ServiceTemplate nestedServiceTemplate, - TranslationContext context) { - FileComputeConsolidationData fileComputeConsolidationData = - context.getConsolidationData().getComputeConsolidationData() - .getFileComputeConsolidationData( - ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); - - if (Objects.nonNull(fileComputeConsolidationData)) { - String nestedNodeTypePrefix = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat."; - return Optional - .of(nestedNodeTypePrefix + getComputeTypeInNestedFile(fileComputeConsolidationData)); - } - return Optional.empty(); - } - - private String getComputeTypeInNestedFile( - FileComputeConsolidationData fileComputeConsolidationData) { - List<TypeComputeConsolidationData> typeComputeConsolidationDatas = - new ArrayList<>(fileComputeConsolidationData.getAllTypeComputeConsolidationData()); - if (typeComputeConsolidationDatas.isEmpty()) { - return null; - } else { - String computeNodeType = fileComputeConsolidationData.getAllComputeTypes().iterator().next(); - return getComputeTypeSuffix(computeNodeType); - } - } - - private void handleGetAttrInAbstractNodeTemplate(ServiceTemplate serviceTemplate, - TranslationContext context, - String serviceTemplateFileName, - NodeTemplate abstractNodeTemplate) { - Map<String, Object> properties = - abstractNodeTemplate == null || abstractNodeTemplate.getProperties() == null - ? new HashMap<>() - : abstractNodeTemplate.getProperties(); - for (Object propertyValue : properties.values()) { - List<List<Object>> getAttrList = extractGetAttrFunction(propertyValue); - for (List<Object> getAttrFuncValue : getAttrList) { - String origNodeTemplateId = (String) getAttrFuncValue.get(0); - Optional<String> nestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(ToscaUtil - .getServiceTemplateFileName(serviceTemplate), origNodeTemplateId); + private void updateHeatStackGroup(ServiceTemplate serviceTemplate, EntityConsolidationData entity, TranslationContext context) { + Map<String, GroupDefinition> groups = + serviceTemplate.getTopology_template().getGroups() == null ? new HashMap<>() : serviceTemplate.getTopology_template().getGroups(); + String nodeRelatedAbstractNodeId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, entity.getNodeTemplateId()); + for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) { + GroupDefinition groupDefinition = groupEntry.getValue(); + if (isHeatStackGroup(groupDefinition.getType())) { + updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nodeRelatedAbstractNodeId, groupEntry); + } + } + } + + private void updateGroupMembersWithNewUnifiedNodeTemplateId(EntityConsolidationData entity, String newNodetemplateId, + Map.Entry<String, GroupDefinition> groupEntry) { + List<String> members = groupEntry.getValue().getMembers(); + if (members.contains(entity.getNodeTemplateId())) { + members.remove(entity.getNodeTemplateId()); + if (!members.contains(newNodetemplateId)) { + members.add(newNodetemplateId); + } + } + 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) { + Map<String, GroupDefinition> groups = + serviceTemplate.getTopology_template().getGroups() == null ? new HashMap<>() : serviceTemplate.getTopology_template().getGroups(); + String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate); + Optional<String> nestedNodeTemplateId = context.getUnifiedNestedNodeTemplateId(serviceTemplateFileName, entity.getNodeTemplateId()); if (nestedNodeTemplateId.isPresent()) { - getAttrFuncValue.set(0, nestedNodeTemplateId.get()); + for (Map.Entry<String, GroupDefinition> groupEntry : groups.entrySet()) { + GroupDefinition groupDefinition = groupEntry.getValue(); + if (isHeatStackGroup(groupDefinition.getType())) { + updateGroupMembersWithNewUnifiedNodeTemplateId(entity, nestedNodeTemplateId.get(), groupEntry); + } + } + } + } + + private void handleNestedNodeTemplateInMainServiceTemplate(String nestedNodeTemplateId, ServiceTemplate mainServiceTemplate, + ServiceTemplate nestedServiceTemplate, TranslationContext context) { + NodeTemplate nestedNodeTemplate = DataModelUtil.getNodeTemplate(mainServiceTemplate, nestedNodeTemplateId); + if (Objects.isNull(nestedNodeTemplate)) { + return; + } + updateNestedNodeTemplateProperties(nestedServiceTemplate, nestedNodeTemplate, context); + Optional<String> unifiedNestedNodeTypeId = context + .getUnifiedNestedNodeTypeId(ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME), + nestedNodeTemplate.getType()); + unifiedNestedNodeTypeId.ifPresent( + unifiedNestedNodeTypeIdVal -> updateNestedNodeTemplate(unifiedNestedNodeTypeIdVal, nestedNodeTemplateId, nestedNodeTemplate, + mainServiceTemplate, context)); + } + + private void updateNestedNodeTemplateProperties(ServiceTemplate nestedServiceTemplate, NodeTemplate nestedNodeTemplate, + TranslationContext context) { + Map<String, Object> newPropertyInputParamIds = context + .getAllNewPropertyInputParamIdsPerNodeTenplateId(ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); + for (Map.Entry<String, Object> entry : newPropertyInputParamIds.entrySet()) { + if (Objects.nonNull(entry.getValue())) { + Object value = getClonedObject(entry.getValue()); + nestedNodeTemplate.getProperties().put(entry.getKey(), value); + } + } + String subNodeType = nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getNode_type(); + nestedNodeTemplate.setType(subNodeType); + } + + private void handleSubstitutionMappingInNestedServiceTemplate(String newNestedNodeType, ServiceTemplate nestedServiceTemplate, + TranslationContext context) { + if (Objects.isNull(newNestedNodeType)) { + return; + } + Set<String> relatedNestedNodeTypeIds = context.getAllRelatedNestedNodeTypeIds(); + SubstitutionMapping substitutionMappings = nestedServiceTemplate.getTopology_template().getSubstitution_mappings(); + if (!relatedNestedNodeTypeIds.contains(substitutionMappings.getNode_type())) { + substitutionMappings.setNode_type(newNestedNodeType); + } + } + + private void updateNestedNodeTemplate(String newNestedNodeTypeId, String nestedNodeTemplateId, NodeTemplate nestedNodeTemplate, + ServiceTemplate mainServiceTemplate, TranslationContext context) { + String mainSTName = ToscaUtil.getServiceTemplateFileName(mainServiceTemplate); + String globalSTName = ToscaUtil.getServiceTemplateFileName(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME); + int index = context.getHandledNestedComputeNodeTemplateIndex(globalSTName, newNestedNodeTypeId); + String newNodeTemplateId = 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(mainSTName, nestedNodeTemplateId, newNodeTemplateId); + } + + private void handleNestedNodeTypesInGlobalSubstituteServiceTemplate(String origNestedNodeTypeId, String newNestedNodeTypeId, + ServiceTemplate globalSubstitutionServiceTemplate, + TranslationContext context) { + Set<String> relatedNestedNodeTypeIds = context.getAllRelatedNestedNodeTypeIds(); + Map<String, NodeType> nodeTypes = globalSubstitutionServiceTemplate.getNode_types(); + if (!relatedNestedNodeTypeIds.contains(origNestedNodeTypeId)) { + NodeType nested = DataModelUtil.getNodeType(globalSubstitutionServiceTemplate, origNestedNodeTypeId); + setNewValuesForNestedNodeType(origNestedNodeTypeId, newNestedNodeTypeId, nested, nodeTypes); } else { - replaceGetAttrNodeIdAndAttrName(serviceTemplate, context, serviceTemplateFileName, - getAttrFuncValue); + 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 replaceGetAttrNodeIdAndAttrName(ServiceTemplate serviceTemplate, - TranslationContext context, - String serviceTemplateFileName, - List<Object> getAttrFuncValue) { - String origNodeTemplateId = (String) getAttrFuncValue.get(0); - String attributeName = (String) getAttrFuncValue.get(1); + private void setNewValuesForNestedNodeType(String origNestedNodeType, String newNestedNodeTypeId, NodeType nested, + Map<String, NodeType> nodeTypes) { + if (Objects.nonNull(nested)) { + nested.setDerived_from(ToscaNodeType.VFC_ABSTRACT_SUBSTITUTE); + nodeTypes.remove(origNestedNodeType); + nodeTypes.put(newNestedNodeTypeId, nested); + } + } - String unifiedAbstractNodeTemplateId = - context.getUnifiedAbstractNodeTemplateId(serviceTemplate, origNodeTemplateId); + private Optional<String> getNewNestedNodeTypeId(ServiceTemplate nestedServiceTemplate, TranslationContext context) { + FileComputeConsolidationData fileComputeConsolidationData = context.getConsolidationData().getComputeConsolidationData() + .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate)); + if (Objects.nonNull(fileComputeConsolidationData)) { + String nestedNodeTypePrefix = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat."; + return Optional.of(nestedNodeTypePrefix + getComputeTypeInNestedFile(fileComputeConsolidationData)); + } + return Optional.empty(); + } - if (Objects.isNull(unifiedAbstractNodeTemplateId)) { - return; + private String getComputeTypeInNestedFile(FileComputeConsolidationData fileComputeConsolidationData) { + List<TypeComputeConsolidationData> typeComputeConsolidationDatas = new ArrayList<>( + fileComputeConsolidationData.getAllTypeComputeConsolidationData()); + if (typeComputeConsolidationDatas.isEmpty()) { + return null; + } else { + String computeNodeType = fileComputeConsolidationData.getAllComputeTypes().iterator().next(); + return getComputeTypeSuffix(computeNodeType); + } } - String newNodeTemplateId = - getNewNodeTemplateId(origNodeTemplateId, serviceTemplateFileName, serviceTemplate, context); + private void handleGetAttrInAbstractNodeTemplate(ServiceTemplate serviceTemplate, TranslationContext context, String serviceTemplateFileName, + NodeTemplate abstractNodeTemplate) { + Map<String, Object> properties = + abstractNodeTemplate == null || abstractNodeTemplate.getProperties() == null ? new HashMap<>() : abstractNodeTemplate.getProperties(); + for (Object propertyValue : properties.values()) { + List<List<Object>> getAttrList = extractGetAttrFunction(propertyValue); + for (List<Object> getAttrFuncValue : getAttrList) { + String origNodeTemplateId = (String) getAttrFuncValue.get(0); + Optional<String> nestedNodeTemplateId = context + .getUnifiedNestedNodeTemplateId(ToscaUtil.getServiceTemplateFileName(serviceTemplate), origNodeTemplateId); + if (nestedNodeTemplateId.isPresent()) { + getAttrFuncValue.set(0, nestedNodeTemplateId.get()); + } else { + replaceGetAttrNodeIdAndAttrName(serviceTemplate, context, serviceTemplateFileName, getAttrFuncValue); + } + } + } + } - String newSubstitutionOutputParameterId = - getNewSubstitutionOutputParameterId(newNodeTemplateId, attributeName); + private void replaceGetAttrNodeIdAndAttrName(ServiceTemplate serviceTemplate, TranslationContext context, String serviceTemplateFileName, + List<Object> getAttrFuncValue) { + String origNodeTemplateId = (String) getAttrFuncValue.get(0); + String attributeName = (String) getAttrFuncValue.get(1); + String unifiedAbstractNodeTemplateId = context.getUnifiedAbstractNodeTemplateId(serviceTemplate, origNodeTemplateId); + if (Objects.isNull(unifiedAbstractNodeTemplateId)) { + return; + } + String newNodeTemplateId = getNewNodeTemplateId(origNodeTemplateId, serviceTemplateFileName, serviceTemplate, context); + String newSubstitutionOutputParameterId = getNewSubstitutionOutputParameterId(newNodeTemplateId, attributeName); + getAttrFuncValue.set(0, unifiedAbstractNodeTemplateId); + getAttrFuncValue.set(1, newSubstitutionOutputParameterId); + } - getAttrFuncValue.set(0, unifiedAbstractNodeTemplateId); - getAttrFuncValue.set(1, newSubstitutionOutputParameterId); - } + private NodeTemplate getComputeNodeTemplate(String origNodeTemplateId, ServiceTemplate serviceTemplate, TranslationContext context) { + NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, origNodeTemplateId); + if (computeNodeTemplate == null) { + computeNodeTemplate = context.getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), origNodeTemplateId); + } + return computeNodeTemplate; + } - private NodeTemplate getComputeNodeTemplate(String origNodeTemplateId, - ServiceTemplate serviceTemplate, - TranslationContext context) { - NodeTemplate computeNodeTemplate = - DataModelUtil.getNodeTemplate(serviceTemplate, origNodeTemplateId); - if (computeNodeTemplate == null) { - computeNodeTemplate = - context.getCleanedNodeTemplate(ToscaUtil.getServiceTemplateFileName(serviceTemplate), - origNodeTemplateId); - } - return computeNodeTemplate; - } - - private String handleIdOfPort(String origNodeTemplateId, String serviceTemplateFileName, - ConsolidationData consolidationData) { - Optional<Pair<String, ComputeTemplateConsolidationData>> - computeTypeAndComputeTemplateByPortId = - getComputeTypeAndComputeTemplateByPortId(origNodeTemplateId, serviceTemplateFileName, - consolidationData); - if (computeTypeAndComputeTemplateByPortId.isPresent()) { - Pair<String, ComputeTemplateConsolidationData> computeIdToComputeData = - computeTypeAndComputeTemplateByPortId.get(); - return getNewPortNodeTemplateId(origNodeTemplateId, computeIdToComputeData.getKey(), - computeIdToComputeData.getValue()); - } - - return null; - } - - private Optional<Pair<String, ComputeTemplateConsolidationData>> - getComputeTypeAndComputeTemplateByPortId(String portId, String serviceTemplateFileName, - ConsolidationData consolidationData) { - FileComputeConsolidationData fileComputeConsolidationData = - consolidationData.getComputeConsolidationData() - .getFileComputeConsolidationData(serviceTemplateFileName); - Set<String> computeTypes = - fileComputeConsolidationData.getAllComputeTypes(); - - for (String computeType : computeTypes) { - Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas = - fileComputeConsolidationData.getTypeComputeConsolidationData(computeType) - .getAllComputeTemplateConsolidationData(); - - for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDatas) { - if (ConsolidationDataUtil.isComputeReferenceToPortId(compute, portId)) { - return Optional.of(new ImmutablePair<>(computeType, compute)); - } - } - } - - return Optional.empty(); - } - - private boolean isIdIsOfExpectedType(String id, - UnifiedCompositionEntity expectedUnifiedCompositionEntity, - String serviceTemplateFileName, - TranslationContext context) { - UnifiedSubstitutionData unifiedSubstitutionData = - context.getUnifiedSubstitutionData().get(serviceTemplateFileName); - if (Objects.isNull(unifiedSubstitutionData)) { - return false; - } - - UnifiedCompositionEntity actualUnifiedCompositionEntity = - unifiedSubstitutionData.getCleanedNodeTemplateCompositionEntity(id); - - return actualUnifiedCompositionEntity == null ? false - : actualUnifiedCompositionEntity.equals(expectedUnifiedCompositionEntity); - } - - private boolean isHeatStackGroup(String groupType) { - return groupType.equals(ToscaGroupType.HEAT_STACK); - } - - private Object getPortPropertyValue(String inputName, - String computeType, - PropertyInputType portInputType, - ServiceTemplate serviceTemplate, - String portNodeTemplateId, - PortTemplateConsolidationData portTemplateConsolidationData) { - //Get the input prefix to extract the property name from the input name - String portType = portTemplateConsolidationData.getPortType(); - String portInputPrefix = getPropertyInputPrefix( - portNodeTemplateId, portType, portInputType, UnifiedCompositionEntity.PORT); - //Get the property name from the input - Optional<String> propertyName = getPropertyNameFromInput(inputName, - UnifiedCompositionEntity.PORT, computeType, portInputPrefix); - //Get the property value from the node template - if (propertyName.isPresent()) { - NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - portNodeTemplateId); - if (Objects.nonNull(portNodeTemplate)) { - return getPropertyValueFromNodeTemplate(propertyName.get(), portNodeTemplate); - } - } - return Optional.empty(); - } - - private Object getComputePropertyValue( - String inputName, - ServiceTemplate serviceTemplate, - ComputeTemplateConsolidationData computeTemplateConsolidationData) { - NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - computeTemplateConsolidationData.getNodeTemplateId()); - String nodeType = getComputeTypeSuffix(nodeTemplate.getType()); - Optional<String> propertyName = - getPropertyNameFromInput(inputName, COMPUTE, nodeType, null); - if (propertyName.isPresent()) { - return getPropertyValueFromNodeTemplate(propertyName.get(), nodeTemplate); - } - return Optional.empty(); - } - - private Object getSubInterfacePropertyValue(String inputName, - String subInterfaceTypeSuffix, - PropertyInputType propertyInputType, - ServiceTemplate serviceTemplate, - String subInterfaceNodeTemplateId) { - //Get the input prefix to extract the property name from the input name - String propertyInputPrefix = getPropertyInputPrefix(subInterfaceNodeTemplateId, - subInterfaceTypeSuffix, propertyInputType, UnifiedCompositionEntity.SUB_INTERFACE); - //Get the property name from the input - Optional<String> propertyName = getPropertyNameFromInput(inputName, - UnifiedCompositionEntity.SUB_INTERFACE, null, propertyInputPrefix); - //Get the property value from the node template - if (propertyName.isPresent()) { - NodeTemplate subInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, - subInterfaceNodeTemplateId); - if (Objects.nonNull(subInterfaceNodeTemplate)) { - return getPropertyValueFromNodeTemplate(propertyName.get(), subInterfaceNodeTemplate); - } - } - return Optional.empty(); - } - - private Optional<Object> getIdenticalPropertyValue(String identicalValuePropertyName, - ServiceTemplate serviceTemplate, - EntityConsolidationData entity, - TranslationContext context) { - NodeTemplate nodeTemplate = - getNodeTemplate(entity.getNodeTemplateId(), serviceTemplate, context); - - Object propertyValueFromNodeTemplate = - getPropertyValueFromNodeTemplate(identicalValuePropertyName, nodeTemplate); - - return Objects.isNull(propertyValueFromNodeTemplate) ? Optional.empty() - : Optional.of(propertyValueFromNodeTemplate); - } - - private UnifiedCompositionEntity getInputCompositionEntity(String inputName) { - UnifiedCompositionEntity inputCompositionEntity = UnifiedCompositionEntity.OTHER; - if (inputName.indexOf('_') != -1) { - String inputType = inputName.substring(0, inputName.indexOf('_')); - if (inputType.equalsIgnoreCase(COMPUTE.getDisplayName())) { - inputCompositionEntity = COMPUTE; - } else if (inputType.equalsIgnoreCase(UnifiedCompositionEntity.PORT.getDisplayName())) { - inputCompositionEntity = UnifiedCompositionEntity.PORT; - } else if (inputType.equalsIgnoreCase(UnifiedCompositionEntity.SUB_INTERFACE - .getDisplayName())) { - inputCompositionEntity = UnifiedCompositionEntity.SUB_INTERFACE; - } - } - return inputCompositionEntity; - } - - private Optional<String> getPropertyNameFromInput( - String inputName, - UnifiedCompositionEntity compositionEntity, - String entityType, String propertyInputPrefix) { - String propertyName = null; - switch (compositionEntity) { - case COMPUTE: - propertyName = inputName.substring(inputName.lastIndexOf(entityType) - + entityType.length() + 1); - break; - case PORT: - case SUB_INTERFACE: - if (inputName.startsWith(propertyInputPrefix)) { - propertyName = inputName.split(propertyInputPrefix)[1]; - } - break; - default: - break; - } - return Optional.ofNullable(propertyName); - } - - private String getPropertyInputPrefix(String nodeTemplateId, - String propertyEntityType, - PropertyInputType propertyInputType, - UnifiedCompositionEntity unifiedCompositionEntity) { - String propertyInputPrefix = unifiedCompositionEntity.getDisplayName().toLowerCase() + "_"; - if (propertyInputType == PropertyInputType.NODE_TEMPLATE_ID) { - propertyInputPrefix += nodeTemplateId + "_"; - } else if (propertyInputType == PropertyInputType.TYPE) { - propertyInputPrefix += propertyEntityType + "_"; - } - return propertyInputPrefix; - } - - private boolean isIdenticalValueProperty(String inputName, - UnifiedCompositionEntity unifiedCompositionEntity) { - - List<String> identicalValuePropertyList = - consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity); - - StringBuilder builder = getPropertyValueStringBuilder(unifiedCompositionEntity); - if (Objects.isNull(builder)) { - return false; - } - - boolean isMatchingProperty = Pattern.matches(builder.toString(), inputName); - return isMatchingProperty - && isPropertyFromIdenticalValuesList(inputName, unifiedCompositionEntity, - identicalValuePropertyList); - } - - private boolean isPropertyFromIdenticalValuesList(String inputName, - UnifiedCompositionEntity unifiedCompositionEntity, - List<String> identicalValuePropertyList) { - switch (unifiedCompositionEntity) { - case COMPUTE: - case OTHER: - Optional<String> identicalValueProperty = getIdenticalValuePropertyName(inputName, unifiedCompositionEntity); - return identicalValueProperty.filter(identicalValuePropertyList::contains).isPresent(); - - case PORT: - return getPortPropertyNameFromInput(inputName, identicalValuePropertyList).isPresent(); - - default: - return false; + private String handleIdOfPort(String origNodeTemplateId, String serviceTemplateFileName, ConsolidationData consolidationData) { + Optional<Pair<String, ComputeTemplateConsolidationData>> computeTypeAndComputeTemplateByPortId = getComputeTypeAndComputeTemplateByPortId( + origNodeTemplateId, serviceTemplateFileName, consolidationData); + if (computeTypeAndComputeTemplateByPortId.isPresent()) { + Pair<String, ComputeTemplateConsolidationData> computeIdToComputeData = computeTypeAndComputeTemplateByPortId.get(); + return getNewPortNodeTemplateId(origNodeTemplateId, computeIdToComputeData.getKey(), computeIdToComputeData.getValue()); + } + return null; } - } - private Optional<String> getPortPropertyNameFromInput(String inputName, - List<String> identicalValuePropertyList) { - for (String identicalProperty : identicalValuePropertyList) { - if (inputName.endsWith(identicalProperty)) { - return Optional.of(identicalProperty); - } + private Optional<Pair<String, ComputeTemplateConsolidationData>> getComputeTypeAndComputeTemplateByPortId(String portId, + String serviceTemplateFileName, + ConsolidationData consolidationData) { + FileComputeConsolidationData fileComputeConsolidationData = consolidationData.getComputeConsolidationData() + .getFileComputeConsolidationData(serviceTemplateFileName); + Set<String> computeTypes = fileComputeConsolidationData.getAllComputeTypes(); + for (String computeType : computeTypes) { + Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDatas = fileComputeConsolidationData + .getTypeComputeConsolidationData(computeType).getAllComputeTemplateConsolidationData(); + for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDatas) { + if (ConsolidationDataUtil.isComputeReferenceToPortId(compute, portId)) { + return Optional.of(new ImmutablePair<>(computeType, compute)); + } + } + } + return Optional.empty(); } - return Optional.empty(); - } - private StringBuilder getPropertyValueStringBuilder( - UnifiedCompositionEntity unifiedCompositionEntity) { + private boolean isIdIsOfExpectedType(String id, UnifiedCompositionEntity expectedUnifiedCompositionEntity, String serviceTemplateFileName, + TranslationContext context) { + UnifiedSubstitutionData unifiedSubstitutionData = context.getUnifiedSubstitutionData().get(serviceTemplateFileName); + if (Objects.isNull(unifiedSubstitutionData)) { + return false; + } + UnifiedCompositionEntity actualUnifiedCompositionEntity = unifiedSubstitutionData.getCleanedNodeTemplateCompositionEntity(id); + return actualUnifiedCompositionEntity == null ? false : actualUnifiedCompositionEntity.equals(expectedUnifiedCompositionEntity); + } + + private boolean isHeatStackGroup(String groupType) { + return groupType.equals(ToscaGroupType.HEAT_STACK); + } - switch (unifiedCompositionEntity) { - case COMPUTE: - return getComputePropertyValueStringBuilder(); + private Object getPortPropertyValue(String inputName, String computeType, PropertyInputType portInputType, ServiceTemplate serviceTemplate, + String portNodeTemplateId, PortTemplateConsolidationData portTemplateConsolidationData) { + //Get the input prefix to extract the property name from the input name + String portType = portTemplateConsolidationData.getPortType(); + String portInputPrefix = getPropertyInputPrefix(portNodeTemplateId, portType, portInputType, UnifiedCompositionEntity.PORT); + //Get the property name from the input + Optional<String> propertyName = getPropertyNameFromInput(inputName, UnifiedCompositionEntity.PORT, computeType, portInputPrefix); + //Get the property value from the node template + if (propertyName.isPresent()) { + NodeTemplate portNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, portNodeTemplateId); + if (Objects.nonNull(portNodeTemplate)) { + return getPropertyValueFromNodeTemplate(propertyName.get(), portNodeTemplate); + } + } + return Optional.empty(); + } - case OTHER: - return getComputePropertyValueStringBuilder(); + private Object getComputePropertyValue(String inputName, ServiceTemplate serviceTemplate, + ComputeTemplateConsolidationData computeTemplateConsolidationData) { + NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeTemplateConsolidationData.getNodeTemplateId()); + String nodeType = getComputeTypeSuffix(nodeTemplate.getType()); + Optional<String> propertyName = getPropertyNameFromInput(inputName, COMPUTE, nodeType, null); + if (propertyName.isPresent()) { + return getPropertyValueFromNodeTemplate(propertyName.get(), nodeTemplate); + } + return Optional.empty(); + } - case PORT: - return getPortPropertyValueStringBuilder(); + private Object getSubInterfacePropertyValue(String inputName, String subInterfaceTypeSuffix, PropertyInputType propertyInputType, + ServiceTemplate serviceTemplate, String subInterfaceNodeTemplateId) { + //Get the input prefix to extract the property name from the input name + String propertyInputPrefix = getPropertyInputPrefix(subInterfaceNodeTemplateId, subInterfaceTypeSuffix, propertyInputType, + UnifiedCompositionEntity.SUB_INTERFACE); + //Get the property name from the input + Optional<String> propertyName = getPropertyNameFromInput(inputName, UnifiedCompositionEntity.SUB_INTERFACE, null, propertyInputPrefix); + //Get the property value from the node template + if (propertyName.isPresent()) { + NodeTemplate subInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, subInterfaceNodeTemplateId); + if (Objects.nonNull(subInterfaceNodeTemplate)) { + return getPropertyValueFromNodeTemplate(propertyName.get(), subInterfaceNodeTemplate); + } + } + return Optional.empty(); + } - case SUB_INTERFACE: - return getSubInterfacePropertyValueStringBuilder(); + private Optional<Object> getIdenticalPropertyValue(String identicalValuePropertyName, ServiceTemplate serviceTemplate, + EntityConsolidationData entity, TranslationContext context) { + NodeTemplate nodeTemplate = getNodeTemplate(entity.getNodeTemplateId(), serviceTemplate, context); + Object propertyValueFromNodeTemplate = getPropertyValueFromNodeTemplate(identicalValuePropertyName, nodeTemplate); + return Objects.isNull(propertyValueFromNodeTemplate) ? Optional.empty() : Optional.of(propertyValueFromNodeTemplate); + } - default: - return null; + private UnifiedCompositionEntity getInputCompositionEntity(String inputName) { + UnifiedCompositionEntity inputCompositionEntity = UnifiedCompositionEntity.OTHER; + if (inputName.indexOf('_') != -1) { + String inputType = inputName.substring(0, inputName.indexOf('_')); + if (inputType.equalsIgnoreCase(COMPUTE.getDisplayName())) { + inputCompositionEntity = COMPUTE; + } else if (inputType.equalsIgnoreCase(UnifiedCompositionEntity.PORT.getDisplayName())) { + inputCompositionEntity = UnifiedCompositionEntity.PORT; + } else if (inputType.equalsIgnoreCase(UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName())) { + inputCompositionEntity = UnifiedCompositionEntity.SUB_INTERFACE; + } + } + return inputCompositionEntity; + } + + private Optional<String> getPropertyNameFromInput(String inputName, UnifiedCompositionEntity compositionEntity, String entityType, + String propertyInputPrefix) { + String propertyName = null; + switch (compositionEntity) { + case COMPUTE: + propertyName = inputName.substring(inputName.lastIndexOf(entityType) + entityType.length() + 1); + break; + case PORT: + case SUB_INTERFACE: + if (inputName.startsWith(propertyInputPrefix)) { + propertyName = inputName.split(propertyInputPrefix)[1]; + } + break; + default: + break; + } + return Optional.ofNullable(propertyName); + } + + private String getPropertyInputPrefix(String nodeTemplateId, String propertyEntityType, PropertyInputType propertyInputType, + UnifiedCompositionEntity unifiedCompositionEntity) { + String propertyInputPrefix = unifiedCompositionEntity.getDisplayName().toLowerCase() + "_"; + if (propertyInputType == PropertyInputType.NODE_TEMPLATE_ID) { + propertyInputPrefix += nodeTemplateId + "_"; + } else if (propertyInputType == PropertyInputType.TYPE) { + propertyInputPrefix += propertyEntityType + "_"; + } + return propertyInputPrefix; } - } - - private StringBuilder getPortPropertyValueStringBuilder() { - StringBuilder builder; - builder = new StringBuilder(PORT_IDENTICAL_VALUE_PROPERTY_PREFIX); - builder.append(".+"); - return builder; - } - - private StringBuilder getComputePropertyValueStringBuilder() { - StringBuilder builder; - builder = new StringBuilder(COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX); - builder.append("[a-z]+"); - builder.append(COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX); - return builder; - } - - private StringBuilder getSubInterfacePropertyValueStringBuilder() { - StringBuilder builder; - builder = new StringBuilder(SUB_INTERFACE_PROPERTY_VALUE_PREFIX); - builder.append(".+"); - return builder; - } - - private Optional<String> getIdenticalValuePropertyName(String input, - UnifiedCompositionEntity - unifiedCompositionEntity) { - switch (unifiedCompositionEntity) { - case COMPUTE: - return Optional.of(input.split("_")[1]); - - case OTHER: - return Optional.of(input.split("_")[1]); - - case PORT: - return getPortPropertyNameFromInput(input, consolidationService - .getPropertiesWithIdenticalVal(unifiedCompositionEntity)); - - default: + + private boolean isIdenticalValueProperty(String inputName, UnifiedCompositionEntity unifiedCompositionEntity) { + List<String> identicalValuePropertyList = consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity); + StringBuilder builder = getPropertyValueStringBuilder(unifiedCompositionEntity); + if (Objects.isNull(builder)) { + return false; + } + boolean isMatchingProperty = Pattern.matches(builder.toString(), inputName); + return isMatchingProperty && isPropertyFromIdenticalValuesList(inputName, unifiedCompositionEntity, identicalValuePropertyList); + } + + private boolean isPropertyFromIdenticalValuesList(String inputName, UnifiedCompositionEntity unifiedCompositionEntity, + List<String> identicalValuePropertyList) { + switch (unifiedCompositionEntity) { + case COMPUTE: + case OTHER: + Optional<String> identicalValueProperty = getIdenticalValuePropertyName(inputName, unifiedCompositionEntity); + return identicalValueProperty.filter(identicalValuePropertyList::contains).isPresent(); + case PORT: + return getPortPropertyNameFromInput(inputName, identicalValuePropertyList).isPresent(); + default: + return false; + } + } + + private Optional<String> getPortPropertyNameFromInput(String inputName, List<String> identicalValuePropertyList) { + for (String identicalProperty : identicalValuePropertyList) { + if (inputName.endsWith(identicalProperty)) { + return Optional.of(identicalProperty); + } + } return Optional.empty(); } - } - - private Object getPropertyValueFromNodeTemplate(String propertyName, NodeTemplate nodeTemplate) { - Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties(); - if (nodeTemplateProperties != null) { - Object propertyValue; - if (propertyName.startsWith(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME)) { - propertyValue = getServiceTemplateFilterPropertyValue(propertyName, nodeTemplateProperties); - } else { - propertyValue = nodeTemplateProperties.get(propertyName); - propertyValue = getClonedObject(propertyValue); - } - return propertyValue; - } - return null; - } - - private Object getServiceTemplateFilterPropertyValue(String propertyName, - Map<String, Object> nodeTemplateProperties) { - Object propertyValue = null; - Object serviceTemplateFilterProperties = - nodeTemplateProperties.get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); - String serviceTemplateFilterPropertyName = - propertyName.replace(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME + "_", ""); - - if (Objects.nonNull(serviceTemplateFilterProperties) - && serviceTemplateFilterProperties instanceof Map) { - propertyValue = ((Map<String, Object>) serviceTemplateFilterProperties).get(serviceTemplateFilterPropertyName); - } - return propertyValue; - } - - private Map<String, UnifiedCompositionEntity> getAllConsolidationNodeTemplateIdAndType( - List<UnifiedCompositionData> unifiedCompositionDataList) { - - Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = new HashMap<>(); - for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { - ComputeTemplateConsolidationData computeTemplateConsolidationData = - unifiedCompositionData.getComputeTemplateConsolidationData(); - if (Objects.nonNull(computeTemplateConsolidationData)) { - consolidationNodeTemplateIdAndType.put(computeTemplateConsolidationData.getNodeTemplateId(), COMPUTE); - } - List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = - getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - consolidationNodeTemplateIdAndType.put(subInterfaceTemplateConsolidationData.getNodeTemplateId(), - UnifiedCompositionEntity.SUB_INTERFACE); - } - List<PortTemplateConsolidationData> portTemplateConsolidationDataList = - getPortTemplateConsolidationDataList(unifiedCompositionData); - for (PortTemplateConsolidationData portTemplateConsolidationData : - portTemplateConsolidationDataList) { - consolidationNodeTemplateIdAndType.put(portTemplateConsolidationData.getNodeTemplateId(), - UnifiedCompositionEntity.PORT); - } - NestedTemplateConsolidationData nestedTemplateConsolidationData = - unifiedCompositionData.getNestedTemplateConsolidationData(); - if (Objects.nonNull(nestedTemplateConsolidationData)) { - consolidationNodeTemplateIdAndType - .put(nestedTemplateConsolidationData.getNodeTemplateId(), - UnifiedCompositionEntity.NESTED); - } - } - return consolidationNodeTemplateIdAndType; - } - - private List<PortTemplateConsolidationData> getPortTemplateConsolidationDataList( - UnifiedCompositionData unifiedCompositionData) { - return unifiedCompositionData.getPortTemplateConsolidationDataList() == null ? new - ArrayList<>() : unifiedCompositionData.getPortTemplateConsolidationDataList(); - } - - private enum PropertyInputType { - NODE_TEMPLATE_ID, - TYPE, - OTHER - } + + private StringBuilder getPropertyValueStringBuilder(UnifiedCompositionEntity unifiedCompositionEntity) { + switch (unifiedCompositionEntity) { + case COMPUTE: + return getComputePropertyValueStringBuilder(); + case OTHER: + return getComputePropertyValueStringBuilder(); + case PORT: + return getPortPropertyValueStringBuilder(); + case SUB_INTERFACE: + return getSubInterfacePropertyValueStringBuilder(); + default: + return null; + } + } + + private StringBuilder getPortPropertyValueStringBuilder() { + StringBuilder builder; + builder = new StringBuilder(PORT_IDENTICAL_VALUE_PROPERTY_PREFIX); + builder.append(".+"); + return builder; + } + + private StringBuilder getComputePropertyValueStringBuilder() { + StringBuilder builder; + builder = new StringBuilder(COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX); + builder.append("[a-z]+"); + builder.append(COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX); + return builder; + } + + private StringBuilder getSubInterfacePropertyValueStringBuilder() { + StringBuilder builder; + builder = new StringBuilder(SUB_INTERFACE_PROPERTY_VALUE_PREFIX); + builder.append(".+"); + return builder; + } + + private Optional<String> getIdenticalValuePropertyName(String input, UnifiedCompositionEntity unifiedCompositionEntity) { + switch (unifiedCompositionEntity) { + case COMPUTE: + return Optional.of(input.split("_")[1]); + case OTHER: + return Optional.of(input.split("_")[1]); + case PORT: + return getPortPropertyNameFromInput(input, consolidationService.getPropertiesWithIdenticalVal(unifiedCompositionEntity)); + default: + return Optional.empty(); + } + } + + private Object getPropertyValueFromNodeTemplate(String propertyName, NodeTemplate nodeTemplate) { + Map<String, Object> nodeTemplateProperties = nodeTemplate.getProperties(); + if (nodeTemplateProperties != null) { + Object propertyValue; + if (propertyName.startsWith(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME)) { + propertyValue = getServiceTemplateFilterPropertyValue(propertyName, nodeTemplateProperties); + } else { + propertyValue = nodeTemplateProperties.get(propertyName); + propertyValue = getClonedObject(propertyValue); + } + return propertyValue; + } + return null; + } + + private Object getServiceTemplateFilterPropertyValue(String propertyName, Map<String, Object> nodeTemplateProperties) { + Object propertyValue = null; + Object serviceTemplateFilterProperties = nodeTemplateProperties.get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); + String serviceTemplateFilterPropertyName = propertyName.replace(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME + "_", ""); + if (Objects.nonNull(serviceTemplateFilterProperties) && serviceTemplateFilterProperties instanceof Map) { + propertyValue = ((Map<String, Object>) serviceTemplateFilterProperties).get(serviceTemplateFilterPropertyName); + } + return propertyValue; + } + + private Map<String, UnifiedCompositionEntity> getAllConsolidationNodeTemplateIdAndType(List<UnifiedCompositionData> unifiedCompositionDataList) { + Map<String, UnifiedCompositionEntity> consolidationNodeTemplateIdAndType = new HashMap<>(); + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + ComputeTemplateConsolidationData computeTemplateConsolidationData = unifiedCompositionData.getComputeTemplateConsolidationData(); + if (Objects.nonNull(computeTemplateConsolidationData)) { + consolidationNodeTemplateIdAndType.put(computeTemplateConsolidationData.getNodeTemplateId(), COMPUTE); + } + List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = getSubInterfaceTemplateConsolidationDataList( + unifiedCompositionData); + for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : subInterfaceTemplateConsolidationDataList) { + consolidationNodeTemplateIdAndType + .put(subInterfaceTemplateConsolidationData.getNodeTemplateId(), UnifiedCompositionEntity.SUB_INTERFACE); + } + List<PortTemplateConsolidationData> portTemplateConsolidationDataList = getPortTemplateConsolidationDataList(unifiedCompositionData); + for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { + consolidationNodeTemplateIdAndType.put(portTemplateConsolidationData.getNodeTemplateId(), UnifiedCompositionEntity.PORT); + } + NestedTemplateConsolidationData nestedTemplateConsolidationData = unifiedCompositionData.getNestedTemplateConsolidationData(); + if (Objects.nonNull(nestedTemplateConsolidationData)) { + consolidationNodeTemplateIdAndType.put(nestedTemplateConsolidationData.getNodeTemplateId(), UnifiedCompositionEntity.NESTED); + } + } + return consolidationNodeTemplateIdAndType; + } + + private List<PortTemplateConsolidationData> getPortTemplateConsolidationDataList(UnifiedCompositionData unifiedCompositionData) { + return unifiedCompositionData.getPortTemplateConsolidationDataList() == null ? new ArrayList<>() + : unifiedCompositionData.getPortTemplateConsolidationDataList(); + } + + private enum PropertyInputType {NODE_TEMPLATE_ID, TYPE, OTHER} } |