2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.translator.services.heattotosca;
19 import com.google.common.collect.ArrayListMultimap;
20 import com.google.common.collect.ListMultimap;
21 import com.google.common.collect.Multimap;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.Iterator;
29 import java.util.List;
31 import java.util.Objects;
33 import java.util.function.Function;
34 import java.util.function.Predicate;
35 import java.util.stream.Collectors;
37 import org.apache.commons.collections4.CollectionUtils;
38 import org.apache.commons.collections4.MapUtils;
39 import org.apache.commons.lang3.StringUtils;
40 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
41 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
42 import org.openecomp.sdc.common.errors.CoreException;
43 import org.openecomp.sdc.common.utils.CommonUtil;
44 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
45 import org.openecomp.sdc.tosca.services.DataModelUtil;
46 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
47 import org.openecomp.sdc.tosca.services.ToscaConstants;
48 import org.openecomp.sdc.tosca.services.ToscaUtil;
49 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
50 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
51 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
52 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
53 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
54 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
55 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
56 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
57 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
58 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
59 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
60 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
61 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedConsolidationDataHandler;
62 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
63 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
64 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
65 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
66 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
67 import org.openecomp.sdc.translator.services.heattotosca.errors.DuplicateResourceIdsInDifferentFilesErrorBuilder;
69 public class ConsolidationService {
71 private UnifiedCompositionService unifiedCompositionService;
73 public ConsolidationService(UnifiedCompositionService unifiedCompositionService) {
74 this.unifiedCompositionService = unifiedCompositionService;
77 ConsolidationService() {
81 void serviceTemplateConsolidation(ServiceTemplate serviceTemplate,
82 TranslationContext translationContext) {
84 ConsolidationData consolidationData = translationContext.getConsolidationData();
86 FileComputeConsolidationData fileComputeConsolidationData =
87 consolidationData.getComputeConsolidationData()
88 .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
90 if (Objects.isNull(fileComputeConsolidationData)) {
93 for (TypeComputeConsolidationData typeComputeConsolidationData :
94 fileComputeConsolidationData.getAllTypeComputeConsolidationData()) {
95 boolean preConditionResult =
96 consolidationPreCondition(
97 serviceTemplate, consolidationData, typeComputeConsolidationData);
99 List<UnifiedCompositionData> unifiedCompositionDataList =
100 createUnifiedCompositionDataList(
101 serviceTemplate, consolidationData, typeComputeConsolidationData);
103 if (preConditionResult) {
104 boolean consolidationRuleCheckResult =
105 checkConsolidationRules(serviceTemplate, typeComputeConsolidationData,
108 unifiedCompositionService.createUnifiedComposition(
109 serviceTemplate, null, unifiedCompositionDataList,
110 consolidationRuleCheckResult ? UnifiedCompositionMode.ScalingInstances
111 : UnifiedCompositionMode.CatalogInstance,
114 unifiedCompositionService.createUnifiedComposition(
115 serviceTemplate, null, unifiedCompositionDataList, UnifiedCompositionMode
123 static Map<String, String> getConsolidationEntityIdToType(ServiceTemplate serviceTemplate,
124 ConsolidationData consolidationData) {
125 Map<String, String> consolidationEntityIdToType = new HashMap<>();
127 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
128 FileComputeConsolidationData fileComputeConsolidationData =
129 consolidationData.getComputeConsolidationData()
130 .getFileComputeConsolidationData(serviceTemplateFileName);
131 FilePortConsolidationData filePortConsolidationData =
132 consolidationData.getPortConsolidationData()
133 .getFilePortConsolidationData(serviceTemplateFileName);
134 if (Objects.nonNull(fileComputeConsolidationData)) {
135 for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) {
136 TypeComputeConsolidationData typeComputeConsolidationData =
137 fileComputeConsolidationData.getTypeComputeConsolidationData(computeType);
138 Collection<String> computeNodeTemplateIds =
139 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
140 for (String computeNodeTemplateId : computeNodeTemplateIds) {
141 consolidationEntityIdToType.put(computeNodeTemplateId, computeType);
146 if (Objects.nonNull(filePortConsolidationData)) {
147 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
148 for (String portNodeTemplateId : portNodeTemplateIds) {
149 consolidationEntityIdToType
150 .put(portNodeTemplateId,
151 filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId).getPortType());
155 return consolidationEntityIdToType;
159 private boolean checkConsolidationRules(ServiceTemplate serviceTemplate,
160 TypeComputeConsolidationData typeComputeConsolidationData,
161 ConsolidationData consolidationData) {
162 return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData)
163 && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData,
165 && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate,
166 typeComputeConsolidationData, consolidationData);
169 private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(
170 ServiceTemplate serviceTemplate,
171 TypeComputeConsolidationData typeComputeConsolidationData,
172 ConsolidationData consolidationData) {
173 Collection<String> computeNodeTemplateIds = typeComputeConsolidationData.getAllComputeNodeTemplateIds();
175 Map<String, List<String>> portTypeToIds =
176 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
178 return typeComputeConsolidationData.isGetAttrOutFromEntityLegal(portTypeToIds)
179 && checkGetAttrOutFromPortLegal(
180 ToscaUtil.getServiceTemplateFileName(serviceTemplate),
181 computeNodeTemplateIds, portTypeToIds, consolidationData);
185 private boolean checkGetAttrOutFromPortLegal(String serviceTemplateName,
186 Collection<String> computeNodeTemplateIds,
187 Map<String, List<String>> portTypeToIds,
188 ConsolidationData consolidationData) {
189 for (List<String> portIdsFromSameType : portTypeToIds.values()) {
190 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
191 collectAllPortsTemplateConsolidationData(portIdsFromSameType, serviceTemplateName,
194 if (!(checkGetAttrOutFromEntityToPortIsLegal(portTemplateConsolidationDataList, portTypeToIds)
195 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
196 portTemplateConsolidationDataList,
197 computeNodeTemplateIds))) {
205 private boolean checkGetAttrOutFromEntityToPortIsLegal(Collection<? extends EntityConsolidationData> entities,
206 Map<String, List<String>> portTypeToIds) {
207 return CollectionUtils.isEmpty(entities)
208 || entities.iterator().next().isGetAttrOutFromEntityLegal(entities, portTypeToIds);
211 private boolean checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
212 List entityConsolidationDataList,
213 Collection<String> consolidationEntityNodeTemplateIds) {
214 if (CollectionUtils.isEmpty(entityConsolidationDataList)) {
217 EntityConsolidationData startingEntityTemplate =
218 (EntityConsolidationData) entityConsolidationDataList.get(0);
219 Map<String, Set<GetAttrFuncData>> startingGetAttrOutFuncData =
220 getConsolidationEntityGetAttrOutFuncData(startingEntityTemplate.getNodesGetAttrOut(),
221 consolidationEntityNodeTemplateIds);
223 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
224 EntityConsolidationData currentEntityTemplate =
225 (EntityConsolidationData) entityConsolidationDataList.get(i);
226 Map<String, Set<GetAttrFuncData>> currentGetAttrOutFuncData =
227 getConsolidationEntityGetAttrOutFuncData(currentEntityTemplate.getNodesGetAttrOut(),
228 consolidationEntityNodeTemplateIds);
230 if (!isGetAttrRelationToEntitySimilarBetweenEntities(startingGetAttrOutFuncData,
231 currentGetAttrOutFuncData)) {
239 private boolean isGetAttrRelationToEntitySimilarBetweenEntities(
240 Map<String, Set<GetAttrFuncData>> firstMap,
241 Map<String, Set<GetAttrFuncData>> secondMap) {
242 if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) {
246 return (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) ||
247 (new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values())));
251 private boolean checkSubInterfaceConsolidationPreCondition(ServiceTemplate serviceTemplate,
252 ConsolidationData consolidationData,
253 TypeComputeConsolidationData typeComputeConsolidationData) {
254 FilePortConsolidationData filePortConsolidationData =
255 consolidationData.getPortConsolidationData()
256 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
258 if (Objects.isNull(filePortConsolidationData)) {
262 Map<String, List<String>> portTypeToPortIds =
263 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
265 Collection<String> computeNodeTemplateIds =
266 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
268 for (List<String> portIdsFromSameType : portTypeToPortIds.values()) {
269 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
270 getAllPortTemplateConsolidationData(portIdsFromSameType, filePortConsolidationData);
272 if (!areSubInterfacePreConditionRulesValid(portTypeToPortIds, computeNodeTemplateIds,
273 portTemplateConsolidationDataList, portTemplateConsolidationDataList.get(0))) {
280 private boolean areSubInterfacePreConditionRulesValid(Map<String, List<String>> portTypeToPortIds,
281 Collection<String> computeNodeTemplateIds,
282 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
283 PortTemplateConsolidationData subInterfaceConsolidationData) {
284 return areSubInterfaceTypesSimilarBetweenPorts(portTemplateConsolidationDataList,
285 subInterfaceConsolidationData)
286 && isNumberOfSubInterfacesPerTypeSimilar(portTemplateConsolidationDataList,
287 subInterfaceConsolidationData)
288 && isGetAttrFromSubInterfaceToOtherEntitiesLegal(computeNodeTemplateIds,
289 portTypeToPortIds, portTemplateConsolidationDataList);
292 private boolean isGetAttrFromSubInterfaceToOtherEntitiesLegal(
293 Collection<String> computeNodeTemplateIds,
294 Map<String, List<String>> portTypeToPortIds,
295 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
297 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesFromSameTypeFromPorts =
298 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
300 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfacesFromSameTypeFromPorts
302 return areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
303 computeNodeTemplateIds, portTypeToPortIds, portTemplateConsolidationDataList, subInterfaceList);
306 private boolean areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
307 Collection<String> computeNodeTemplateIds, Map<String, List<String>> portTypeToPortIds,
308 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
309 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
310 return checkGetAttrOutFromEntityToPortIsLegal(subInterfaceList, portTypeToPortIds)
311 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
312 portTemplateConsolidationDataList, getSubInterfaceIdsFromSameType(subInterfaceList))
313 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
314 subInterfaceList, computeNodeTemplateIds);
317 private boolean areSubInterfaceTypesSimilarBetweenPorts(
318 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
319 PortTemplateConsolidationData subInterfaceConsolidationData) {
321 return portTemplateConsolidationDataList.stream().allMatch(
322 element -> element.hasSameSubInterfaceTypes(subInterfaceConsolidationData));
325 private boolean isNumberOfSubInterfacesPerTypeSimilar(
326 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
327 PortTemplateConsolidationData subInterfaceConsolidationData) {
329 return portTemplateConsolidationDataList.stream()
330 .allMatch(element -> element.isNumberOfSubInterfacesPerTypeSimilar(subInterfaceConsolidationData));
333 private Map<String, Set<GetAttrFuncData>> getConsolidationEntityGetAttrOutFuncData(
334 Map<String, List<GetAttrFuncData>> nodesGetAttrOut,
335 Collection<String> computeNodeTemplateIds) {
336 Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>();
338 if (MapUtils.isEmpty(nodesGetAttrOut)) {
339 return computeGetAttrFuncData;
342 for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) {
343 if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) {
344 computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry
349 return computeGetAttrFuncData;
352 private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType(
353 ServiceTemplate serviceTemplate,
354 TypeComputeConsolidationData typeComputeConsolidationData,
355 ConsolidationData consolidationData) {
356 return areThereGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData)
357 || areThereGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate,
358 typeComputeConsolidationData, consolidationData);
362 private boolean areThereGetAttrRelationsBetweenComputesOfSameType(
363 TypeComputeConsolidationData typeComputeConsolidationData) {
365 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities =
366 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
367 Collection<String> computeNodeTemplateIds =
368 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
370 return checkGetAttrRelationsForEntityConsolidationData(
371 computeTemplateConsolidationEntities, computeNodeTemplateIds,
372 EntityConsolidationData::getNodesGetAttrIn);
375 private boolean areThereGetAttrRelationsBetweenPortsOfTheSameType(
376 ServiceTemplate serviceTemplate,
377 TypeComputeConsolidationData typeComputeConsolidationData,
378 ConsolidationData consolidationData) {
379 Map<String, List<String>> portTypeToPortIds =
380 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
382 FilePortConsolidationData filePortConsolidationData =
383 consolidationData.getPortConsolidationData().getFilePortConsolidationData(
384 ToscaUtil.getServiceTemplateFileName(serviceTemplate));
386 for (List<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) {
387 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType =
388 getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData);
389 if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType,
390 portsOfTheSameTypeIds, EntityConsolidationData::getNodesGetAttrIn)) {
398 private boolean areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
399 List<String> subInterfacesIdsFromSameType,
400 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
402 return checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
403 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrIn)
404 || checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
405 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrOut);
409 private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData(
410 List<String> portsIds,
411 FilePortConsolidationData filePortConsolidationData) {
412 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = new ArrayList<>();
414 for (String portId : portsIds) {
415 PortTemplateConsolidationData portTemplateConsolidationData =
416 filePortConsolidationData.getPortTemplateConsolidationData(portId);
417 if (Objects.nonNull(portTemplateConsolidationData)) {
418 portTemplateConsolidationDataOfSameType.add(portTemplateConsolidationData);
422 return portTemplateConsolidationDataOfSameType;
425 private boolean checkGetAttrRelationsForEntityConsolidationData(Collection entities,
426 Collection<String> nodeTemplateIdsOfTheSameType,
427 Function<EntityConsolidationData, Map<String, List<GetAttrFuncData>>> getAttrValuesMethod) {
428 for (Object entity : entities) {
429 Map<String, List<GetAttrFuncData>> getAttrValue =
430 getAttrValuesMethod.apply((EntityConsolidationData) entity);
431 Set<String> getAttrNodeIds =
432 getAttrValue == null ? new HashSet<>()
433 : getAttrValue.keySet();
434 if (getAttrNodeIds.stream().anyMatch(nodeTemplateIdsOfTheSameType::contains)) {
442 private boolean checkComputeConsolidation(
443 ServiceTemplate serviceTemplate,
444 TypeComputeConsolidationData typeComputeConsolidationData) {
445 Collection<String> computeNodeTemplateIds =
446 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
447 List<String> propertiesWithIdenticalVal = getComputePropertiesWithIdenticalVal();
449 return arePropertiesSimilarBetweenComputeNodeTemplates(serviceTemplate, computeNodeTemplateIds,
450 propertiesWithIdenticalVal)
451 && checkComputeRelations(
452 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
456 private boolean checkComputeRelations(
457 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
459 return checkEntityConsolidationDataRelations(computeTemplateConsolidationEntities)
460 && checkComputesRelationsToVolume(computeTemplateConsolidationEntities);
463 private boolean checkEntityConsolidationDataRelations(Collection entities) {
464 EntityConsolidationData startingEntity = (EntityConsolidationData) entities.iterator().next();
466 for (Object entity : entities) {
467 EntityConsolidationData currentEntity = (EntityConsolidationData) entity;
468 if (!(checkNodesConnectedInRelations(startingEntity, currentEntity)
469 && (checkNodesConnectedOutRelations(startingEntity, currentEntity))
470 && (checkGroupIdsRelations(startingEntity, currentEntity)))) {
477 private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity,
478 EntityConsolidationData secondEntity) {
479 return compareNodeConnectivity(firstEntity.getNodesConnectedIn(),
480 secondEntity.getNodesConnectedIn());
483 private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity,
484 EntityConsolidationData secondEntity) {
485 return compareNodeConnectivity(firstEntity.getNodesConnectedOut(),
486 secondEntity.getNodesConnectedOut());
489 private boolean compareNodeConnectivity(
490 Multimap<String, RequirementAssignmentData> firstEntityMap,
491 Multimap<String, RequirementAssignmentData> secondEntityMap) {
493 if (CommonUtil.isMultimapEmpty(firstEntityMap) && CommonUtil.isMultimapEmpty(secondEntityMap)) {
496 return !CommonUtil.isMultimapEmpty(firstEntityMap) && !CommonUtil.isMultimapEmpty(secondEntityMap)
497 && equalsIgnoreSuffix(new HashSet<>(firstEntityMap.keySet()),new HashSet<>(secondEntityMap.keySet()));
500 private boolean equalsIgnoreSuffix(Set<String> firstKeySet, Set<String> secondKeySet){
501 Set<String> firstKeySetTrimmed = firstKeySet.stream().map(this::trimSuffix).collect(Collectors.toSet());
502 Set<String> secondKeySetTrimmed = secondKeySet.stream().map(this::trimSuffix).collect(Collectors.toSet());
503 return firstKeySetTrimmed.equals(secondKeySetTrimmed);
506 private String trimSuffix(String volumeName){
507 int suffixPosition = volumeName.lastIndexOf("_");
508 return volumeName.substring(0, suffixPosition);
511 private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity,
512 EntityConsolidationData currentEntity) {
513 return CollectionUtils.isEmpty(startingEntity.getGroupIds())
514 && CollectionUtils.isEmpty(currentEntity.getGroupIds())
515 || startingEntity.getGroupIds().equals(currentEntity.getGroupIds());
519 private boolean checkComputesRelationsToVolume(
520 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
521 Iterator<ComputeTemplateConsolidationData> iterator =
522 computeTemplateConsolidationEntities.iterator();
524 Multimap<String, RequirementAssignmentData> startingVolumes =
525 iterator.next().getVolumes();
527 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationEntities) {
528 Multimap<String, RequirementAssignmentData> currentVolumes =
529 compute.getVolumes();
530 if (!compareNodeConnectivity(startingVolumes, currentVolumes)) {
538 private boolean checkPortConsolidation(ServiceTemplate serviceTemplate,
539 TypeComputeConsolidationData typeComputeConsolidationData,
540 ConsolidationData consolidationData) {
541 return validateWantedPortProperties(serviceTemplate,
542 typeComputeConsolidationData)
543 && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
544 typeComputeConsolidationData, consolidationData);
548 private boolean validateWantedPortProperties(ServiceTemplate serviceTemplate,
549 TypeComputeConsolidationData typeComputeConsolidationData) {
550 Map<String, List<String>> portTypeToIds =
551 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
553 List<String> propertiesWithIdenticalVal = getPortPropertiesWithIdenticalVal();
554 List<String> propertiesThatNeedToHaveSameUsage = getPortPropertiesThatNeedToHaveSameUsage();
556 for (List<String> portsIds : portTypeToIds.values()) {
557 if (!arePortPropertiesValid(
558 serviceTemplate, propertiesWithIdenticalVal, propertiesThatNeedToHaveSameUsage, portsIds)) {
566 private boolean arePortPropertiesValid(ServiceTemplate serviceTemplate,
567 List<String> propertiesWithIdenticalVal,
568 List<String> propertiesThatNeedToHaveSameUsage,
569 List<String> portsIds) {
570 Map<String, NodeTemplate> nodeTemplates =
571 serviceTemplate.getTopology_template().getNode_templates();
573 Predicate<String> similar = property ->
574 isPropertyValueSimilarBetweenNodeTemplates(property,
575 portsIds, nodeTemplates);
577 Predicate<String> exists = property ->
578 isPropertyUsageSimilarBetweenAllNodeTemplates(property,
579 portsIds, nodeTemplates);
581 return areWantedPortPropertiesValid(
582 propertiesWithIdenticalVal, similar)
583 && areWantedPortPropertiesValid(
584 propertiesThatNeedToHaveSameUsage, exists);
587 private boolean checkPortRelations(String serviceTemplateName,
588 TypeComputeConsolidationData typeComputeConsolidationData,
589 ConsolidationData consolidationData) {
590 Map<String, List<String>> portTypeToIds =
591 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
593 for (List<String> portIds : portTypeToIds.values()) {
594 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
595 collectAllPortsTemplateConsolidationData(portIds, serviceTemplateName, consolidationData);
597 if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList) || !checkSubInterfaceRules(
598 portTemplateConsolidationDataList)) {
606 private boolean checkSubInterfaceRules(List<PortTemplateConsolidationData>
607 portTemplateConsolidationDataList) {
608 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity =
609 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
610 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfaceTypeToEntity.values());
611 return areSubInterfacePropertiesAndRelationsValid(subInterfaceList);
614 private boolean areSubInterfacePropertiesAndRelationsValid(
615 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
616 return isResourceGroupPropertiesSimilarBetweenSubPorts(subInterfaceList)
617 && checkSubInterfaceRelations(subInterfaceList)
618 && !areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
619 getSubInterfaceIdsFromSameType(subInterfaceList), subInterfaceList);
622 private boolean checkSubInterfaceRelations(List<SubInterfaceTemplateConsolidationData>
624 return CollectionUtils.isEmpty(subInterfaceList)
625 || checkEntityConsolidationDataRelations(subInterfaceList);
628 private boolean isResourceGroupPropertiesSimilarBetweenSubPorts(
629 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
630 if (CollectionUtils.isEmpty(subInterfaceList)) {
634 SubInterfaceTemplateConsolidationData startingSubInterface = subInterfaceList.get(0);
635 for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceList) {
636 if (!startingSubInterface.getResourceGroupCount().equals(subInterface.getResourceGroupCount())
637 || !StringUtils.equals(startingSubInterface.getNetworkRole(), subInterface.getNetworkRole())) {
645 private List<String> getSubInterfaceIdsFromSameType(List<SubInterfaceTemplateConsolidationData>
647 if (CollectionUtils.isEmpty(subInterfaceList)) {
648 return new ArrayList<>();
651 return subInterfaceList.stream().map(SubInterfaceTemplateConsolidationData::getNodeTemplateId)
652 .collect(Collectors.toList());
655 private ListMultimap<String, SubInterfaceTemplateConsolidationData> collectAllSubInterfacesFromSameTypeFromPorts(
656 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
657 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create();
658 for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
659 portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity);
662 return subInterfaceTypeToEntity;
665 private List<PortTemplateConsolidationData> collectAllPortsTemplateConsolidationData(List<String> portIds,
666 String serviceTemplateName,
667 ConsolidationData consolidationData) {
669 FilePortConsolidationData filePortConsolidationData =
670 consolidationData.getPortConsolidationData()
671 .getFilePortConsolidationData(serviceTemplateName);
672 List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>();
674 for (String portId : portIds) {
675 PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData
676 .getPortTemplateConsolidationData(portId);
677 if (Objects.nonNull(portTemplateConsolidationData)) {
678 portTemplateConsolidationDataList.add(portTemplateConsolidationData);
682 return portTemplateConsolidationDataList;
685 private boolean areWantedPortPropertiesValid(List<String> propertiesToCheck,
686 Predicate<String> condition) {
688 return propertiesToCheck.stream().allMatch(condition);
692 private boolean arePropertiesSimilarBetweenComputeNodeTemplates(
693 ServiceTemplate serviceTemplate,
694 Collection<String> computeNodeTemplateIds,
695 List<String> propertiesThatNeedToBeSimilar) {
697 Map<String, NodeTemplate> idToNodeTemplate =
698 serviceTemplate.getTopology_template().getNode_templates();
700 for (String property : propertiesThatNeedToBeSimilar) {
701 if (!isPropertyValueSimilarBetweenNodeTemplates(property, computeNodeTemplateIds,
709 private boolean isPropertyUsageSimilarBetweenAllNodeTemplates(String propertyToCheck,
710 List<String> entityNodeTemplateIds,
711 Map<String, NodeTemplate> idToNodeTemplate) {
712 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(0));
713 if (Objects.isNull(startingNodeTemplate)) {
714 throw new CoreException(
715 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(0))
719 boolean propertyExistCondition =
720 isPropertyExistInNodeTemplate(propertyToCheck, startingNodeTemplate);
722 for (int i = 1; i < entityNodeTemplateIds.size(); i++) {
723 NodeTemplate currentNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(i));
724 if (Objects.isNull(currentNodeTemplate)) {
725 throw new CoreException(
726 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(i))
729 if (propertyExistCondition != isPropertyExistInNodeTemplate(propertyToCheck, currentNodeTemplate)) {
738 private boolean isPropertyValueSimilarBetweenNodeTemplates(String propertyToCheck,
739 Collection<String> entityNodeTemplateIds,
740 Map<String, NodeTemplate> idToNodeTemplate) {
742 Set<Object> propertiesValues = new HashSet<>();
743 Iterator<String> iterator = entityNodeTemplateIds.iterator();
745 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
747 while (iterator.hasNext()) {
748 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
751 return propertiesValues.size() == 1;
754 private void handlePropertyValue(String propertyToCheck,
755 Map<String, NodeTemplate> idToNodeTemplate,
756 Set<Object> propertiesValues, String nodeId) {
757 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(nodeId);
758 if (Objects.isNull(startingNodeTemplate)) {
759 throw new CoreException(
760 new DuplicateResourceIdsInDifferentFilesErrorBuilder(nodeId)
764 addPropertyValue(propertyToCheck, startingNodeTemplate, propertiesValues);
767 private void addPropertyValue(String property,
768 NodeTemplate nodeTemplate,
769 Set<Object> propertiesValues) {
770 propertiesValues.add(
771 isPropertyExistInNodeTemplate(property, nodeTemplate) ? nodeTemplate.getProperties()
772 .get(property) : "");
775 private boolean isPropertyExistInNodeTemplate(String propertyToCheck, NodeTemplate nodeTemplate) {
776 return !(nodeTemplate.getProperties() == null
777 || nodeTemplate.getProperties().get(propertyToCheck) == null);
780 void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId,
781 ServiceTemplate serviceTemplate,
782 ServiceTemplate substitutionServiceTemplate,
783 TranslationContext translationContext) {
785 ConsolidationData consolidationData = translationContext.getConsolidationData();
787 boolean substitutionConsolidationRuleResult =
788 substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate, translationContext);
790 if (substitutionConsolidationRuleResult) {
791 List<UnifiedCompositionData> unifiedCompositionDataList =
792 createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId, serviceTemplate,
793 substitutionServiceTemplate, consolidationData);
794 unifiedCompositionService
795 .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
796 UnifiedCompositionMode.NestedSingleCompute, translationContext);
798 //The node template does not represent unified VFC but complexVFC
799 //Adding the id in the context for fixing connectivity from/to nested non-unified nodes
800 translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
801 substituteNodeTemplateId, substituteNodeTemplateId);
803 if (!translationContext.isUnifiedHandledServiceTemplate(substitutionServiceTemplate)) {
804 serviceTemplateConsolidation(substitutionServiceTemplate, translationContext);
809 private boolean substitutionServiceTemplateConsolidationRule(ServiceTemplate nestedServiceTemplate,
810 TranslationContext context) {
811 ConsolidationData consolidationData = context.getConsolidationData();
813 return consolidationData.getComputeConsolidationDataHandler().isNumberOfComputeTypesLegal(
814 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate))
815 && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context);
818 private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate,
819 TranslationContext context) {
820 String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
821 if (Objects.isNull(nestedServiceTemplateName)) {
825 NestedConsolidationDataHandler nestedConsolidationDataHandler = context.getNestedConsolidationDataHandler();
827 //Condition to check if there is nested file and if file contains only sub interfaces then
829 return nestedConsolidationDataHandler.isNestedConsolidationDataExist(nestedServiceTemplateName)
830 && !ifNestedFileContainsOnlySubInterface(nestedServiceTemplate, context);
833 private boolean ifNestedFileContainsOnlySubInterface(ServiceTemplate serviceTemplate, TranslationContext context) {
834 Map<String, NodeTemplate> nestedNodeTemplateMap = DataModelUtil.getNodeTemplates(serviceTemplate);
836 Set<String> nestedHeatFileNames = getNestedHeatFileNames(nestedNodeTemplateMap);
838 return ifAllResourceAreSubInterface(nestedHeatFileNames, context);
841 private Set<String> getNestedHeatFileNames(Map<String, NodeTemplate> nestedNodeTemplateMap) {
842 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
844 return nestedNodeTemplateMap.entrySet().stream()
845 .filter(entry -> toscaAnalyzerService.isSubstitutableNodeTemplate(entry.getValue())
846 && toscaAnalyzerService.getSubstituteServiceTemplateName(
847 entry.getKey(), entry.getValue()).isPresent())
848 .map(entry -> toscaAnalyzerService.getSubstituteServiceTemplateName(
849 entry.getKey(), entry.getValue()).get())
850 .collect(Collectors.toSet());
853 // Method returns true if all of the resource are sub interface
854 private boolean ifAllResourceAreSubInterface(Set<String> nestedHeatFileNames,
855 TranslationContext context) {
856 if (nestedHeatFileNames.isEmpty()) {
860 for (String fileName : nestedHeatFileNames) {
861 String heatFileName = context.getNestedHeatFileName().get(fileName);
863 if (Objects.nonNull(heatFileName)
864 && !context.getTranslatedServiceTemplates().get(heatFileName).getTopology_template()
865 .getNode_templates().values().stream()
866 .allMatch(nodeTemplate -> ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE
867 .equals(nodeTemplate.getType()))) {
875 private List<UnifiedCompositionData> createUnifiedCompositionDataList(
876 ServiceTemplate serviceTemplate,
877 ConsolidationData consolidationData,
878 TypeComputeConsolidationData typeComputeConsolidationData) {
880 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
882 for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
883 .getAllComputeTemplateConsolidationData()) {
884 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
885 unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
886 FilePortConsolidationData filePortConsolidationData =
887 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
888 .getServiceTemplateFileName(serviceTemplate));
889 setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, filePortConsolidationData,
890 unifiedCompositionData);
891 unifiedCompositionDataList.add(unifiedCompositionData);
893 return unifiedCompositionDataList;
896 private void setPortTemplateConsolidationData(FilePortConsolidationData filePortConsolidationData,
898 UnifiedCompositionData unifiedCompositionData,
899 List<SubInterfaceTemplateConsolidationData>
900 subInterfaceTemplateConsolidationDataList) {
901 if (Objects.isNull(filePortConsolidationData)) {
904 PortTemplateConsolidationData portTemplateConsolidationData =
905 filePortConsolidationData.getPortTemplateConsolidationData(portId);
906 unifiedCompositionData.addPortTemplateConsolidationData(portTemplateConsolidationData);
907 if (portTemplateConsolidationData != null) {
908 portTemplateConsolidationData.copyFlatInto(subInterfaceTemplateConsolidationDataList);
912 private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
913 String substituteNodeTemplateId,
914 ServiceTemplate serviceTemplate,
915 ServiceTemplate substitutionServiceTemplate,
916 ConsolidationData consolidationData) {
917 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
918 FileNestedConsolidationData fileNestedConsolidationData =
919 consolidationData.getNestedConsolidationData()
920 .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
922 if (Objects.nonNull(fileNestedConsolidationData)) {
923 NestedTemplateConsolidationData nestedTemplateConsolidationData =
924 fileNestedConsolidationData.getNestedTemplateConsolidationData(substituteNodeTemplateId);
925 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
926 unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData);
927 unifiedCompositionDataList.add(unifiedCompositionData);
928 addSubInterfaceDataToNestedCompositionData(substitutionServiceTemplate, consolidationData,
929 unifiedCompositionData);
932 return unifiedCompositionDataList;
935 private void addSubInterfaceDataToNestedCompositionData(ServiceTemplate substitutionServiceTemplate,
936 ConsolidationData consolidationData,
937 UnifiedCompositionData unifiedCompositionData) {
938 FileComputeConsolidationData nestedFileComputeConsolidationData = consolidationData.getComputeConsolidationData()
939 .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
940 FilePortConsolidationData nestedFilePortConsolidationData = consolidationData.getPortConsolidationData()
941 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
942 if (Objects.isNull(nestedFileComputeConsolidationData)
943 || Objects.isNull(nestedFilePortConsolidationData)) {
946 TypeComputeConsolidationData computeType =
947 nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next();
948 if (Objects.isNull(computeType)) {
951 ComputeTemplateConsolidationData computeTemplateConsolidationData =
952 computeType.getAllComputeTemplateConsolidationData().iterator().next();
953 setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, nestedFilePortConsolidationData,
954 unifiedCompositionData);
957 private void setUnifiedCompositionDataWithPortTemplateData(ComputeTemplateConsolidationData
958 computeTemplateConsolidationData,
959 FilePortConsolidationData filePortConsolidationData,
960 UnifiedCompositionData unifiedCompositionData) {
961 Collection<List<String>> portCollection =
962 computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
963 : computeTemplateConsolidationData.getPorts().values();
964 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = new ArrayList<>();
965 portCollection.stream()
966 .flatMap(Collection::stream)
967 .forEach(portId -> setPortTemplateConsolidationData(filePortConsolidationData, portId,
968 unifiedCompositionData, subInterfaceTemplateConsolidationDataList));
969 unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList(
970 subInterfaceTemplateConsolidationDataList);
973 private boolean consolidationPreCondition(
974 ServiceTemplate serviceTemplate,
975 ConsolidationData consolidationData,
976 TypeComputeConsolidationData typeComputeConsolidationData) {
978 return (typeComputeConsolidationData.isThereMoreThanOneComputeTypeInstance()
979 && typeComputeConsolidationData.isNumberOfPortsEqualsBetweenComputeNodes()
980 && typeComputeConsolidationData.isNumberOfPortFromEachTypeLegal()
981 && typeComputeConsolidationData.isPortTypesEqualsBetweenComputeNodes()
982 && checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(serviceTemplate,
983 typeComputeConsolidationData, consolidationData)
984 && checkSubInterfaceConsolidationPreCondition(serviceTemplate, consolidationData,
985 typeComputeConsolidationData));
989 List<String> getPropertiesWithIdenticalVal(UnifiedCompositionEntity entity) {
992 return getComputePropertiesWithIdenticalVal();
995 return getComputePropertiesWithIdenticalVal();
998 return getPortPropertiesWithIdenticalVal();
1001 return new ArrayList<>();
1005 private List<String> getComputePropertiesWithIdenticalVal() {
1006 List<String> propertyWithIdenticalValue = new ArrayList<>();
1007 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_IMAGE);
1008 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_FLAVOR);
1009 return propertyWithIdenticalValue;
1012 private List<String> getPortPropertiesWithIdenticalVal() {
1013 List<String> propertiesThatNeedToHaveIdenticalVal = new ArrayList<>();
1014 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1015 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.MAC_ADDRESS);
1017 propertiesThatNeedToHaveIdenticalVal
1018 .addAll(TranslationContext.getEnrichPortResourceProperties());
1020 return propertiesThatNeedToHaveIdenticalVal;
1023 private List<String> getPortPropertiesThatNeedToHaveSameUsage() {
1024 List<String> propertiesThatNeedToHaveSameUsage = new ArrayList<>();
1025 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_FIXED_IPS);
1026 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1027 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.MAC_ADDRESS);
1029 propertiesThatNeedToHaveSameUsage.addAll(TranslationContext.getEnrichPortResourceProperties());
1031 return propertiesThatNeedToHaveSameUsage;