+ 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 handleConsolidationSubInterfaces(UnifiedCompositionTo unifiedCompositionTo) {
+ Collection<ComputeTemplateConsolidationData> computeConsolidationDataList =
+ (Collection) getComputeConsolidationDataList(unifiedCompositionTo.getUnifiedCompositionDataList());
+
+ Map<String, List<String>> portIdsPerPortType = UnifiedCompositionUtil
+ .collectAllPortsFromEachTypesFromComputes(computeConsolidationDataList);
+
+ 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);
+ PortTemplateConsolidationData portTemplateConsolidationData =
+ getSubInterfacePortTemplateConsolidationData(unifiedCompositionTo.getServiceTemplate(),
+ subInterfaceTemplateConsolidationData, unifiedCompositionTo.getContext());
+
+ if (Objects.isNull(portTemplateConsolidationData)) {
+ return;
+ }
+
+ 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, 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,
+ 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(newSubInterfaceNodeTemplate,
+ propertyEntry.getKey(), propertyEntry.getValue(), serviceTemplate,
+ 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));
+ }
+ }
+ }
+ }
+