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, ConsolidationDataUtil.getPortType(portNodeTemplateId));
154 return consolidationEntityIdToType;
158 private boolean checkConsolidationRules(ServiceTemplate serviceTemplate,
159 TypeComputeConsolidationData typeComputeConsolidationData,
160 ConsolidationData consolidationData) {
161 return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData)
162 && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData,
164 && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate,
165 typeComputeConsolidationData, consolidationData);
168 private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(
169 ServiceTemplate serviceTemplate,
170 TypeComputeConsolidationData typeComputeConsolidationData,
171 ConsolidationData consolidationData) {
172 Collection<String> computeNodeTemplateIds = typeComputeConsolidationData.getAllComputeNodeTemplateIds();
174 Map<String, List<String>> portTypeToIds =
175 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
177 return typeComputeConsolidationData.isGetAttrOutFromEntityLegal(portTypeToIds)
178 && checkGetAttrOutFromPortLegal(
179 ToscaUtil.getServiceTemplateFileName(serviceTemplate),
180 computeNodeTemplateIds, portTypeToIds, consolidationData);
184 private boolean checkGetAttrOutFromPortLegal(String serviceTemplateName,
185 Collection<String> computeNodeTemplateIds,
186 Map<String, List<String>> portTypeToIds,
187 ConsolidationData consolidationData) {
188 for (List<String> portIdsFromSameType : portTypeToIds.values()) {
189 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
190 collectAllPortsTemplateConsolidationData(portIdsFromSameType, serviceTemplateName,
193 if (!(checkGetAttrOutFromEntityToPortIsLegal(portTemplateConsolidationDataList, portTypeToIds)
194 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
195 portTemplateConsolidationDataList,
196 computeNodeTemplateIds))) {
204 private boolean checkGetAttrOutFromEntityToPortIsLegal(Collection<? extends EntityConsolidationData> entities,
205 Map<String, List<String>> portTypeToIds) {
206 return CollectionUtils.isEmpty(entities)
207 || entities.iterator().next().isGetAttrOutFromEntityLegal(entities, portTypeToIds);
210 private boolean checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
211 List entityConsolidationDataList,
212 Collection<String> consolidationEntityNodeTemplateIds) {
213 if (CollectionUtils.isEmpty(entityConsolidationDataList)) {
216 EntityConsolidationData startingEntityTemplate =
217 (EntityConsolidationData) entityConsolidationDataList.get(0);
218 Map<String, Set<GetAttrFuncData>> startingGetAttrOutFuncData =
219 getConsolidationEntityGetAttrOutFuncData(startingEntityTemplate.getNodesGetAttrOut(),
220 consolidationEntityNodeTemplateIds);
222 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
223 EntityConsolidationData currentEntityTemplate =
224 (EntityConsolidationData) entityConsolidationDataList.get(i);
225 Map<String, Set<GetAttrFuncData>> currentGetAttrOutFuncData =
226 getConsolidationEntityGetAttrOutFuncData(currentEntityTemplate.getNodesGetAttrOut(),
227 consolidationEntityNodeTemplateIds);
229 if (!isGetAttrRelationToEntitySimilarBetweenEntities(startingGetAttrOutFuncData,
230 currentGetAttrOutFuncData)) {
238 private boolean isGetAttrRelationToEntitySimilarBetweenEntities(
239 Map<String, Set<GetAttrFuncData>> firstMap,
240 Map<String, Set<GetAttrFuncData>> secondMap) {
241 if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) {
245 return (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) ||
246 (new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values())));
250 private boolean checkSubInterfaceConsolidationPreCondition(ServiceTemplate serviceTemplate,
251 ConsolidationData consolidationData,
252 TypeComputeConsolidationData typeComputeConsolidationData) {
253 FilePortConsolidationData filePortConsolidationData =
254 consolidationData.getPortConsolidationData()
255 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
257 if (Objects.isNull(filePortConsolidationData)) {
261 Map<String, List<String>> portTypeToPortIds =
262 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
264 Collection<String> computeNodeTemplateIds =
265 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
267 for (List<String> portIdsFromSameType : portTypeToPortIds.values()) {
268 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
269 getAllPortTemplateConsolidationData(portIdsFromSameType, filePortConsolidationData);
271 if (!areSubInterfacePreConditionRulesValid(portTypeToPortIds, computeNodeTemplateIds,
272 portTemplateConsolidationDataList, portTemplateConsolidationDataList.get(0))) {
279 private boolean areSubInterfacePreConditionRulesValid(Map<String, List<String>> portTypeToPortIds,
280 Collection<String> computeNodeTemplateIds,
281 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
282 PortTemplateConsolidationData subInterfaceConsolidationData) {
283 return areSubInterfaceTypesSimilarBetweenPorts(portTemplateConsolidationDataList,
284 subInterfaceConsolidationData)
285 && isNumberOfSubInterfacesPerTypeSimilar(portTemplateConsolidationDataList,
286 subInterfaceConsolidationData)
287 && isGetAttrFromSubInterfaceToOtherEntitiesLegal(computeNodeTemplateIds,
288 portTypeToPortIds, portTemplateConsolidationDataList);
291 private boolean isGetAttrFromSubInterfaceToOtherEntitiesLegal(
292 Collection<String> computeNodeTemplateIds,
293 Map<String, List<String>> portTypeToPortIds,
294 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
296 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesFromSameTypeFromPorts =
297 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
299 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfacesFromSameTypeFromPorts
301 return areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
302 computeNodeTemplateIds, portTypeToPortIds, portTemplateConsolidationDataList, subInterfaceList);
305 private boolean areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
306 Collection<String> computeNodeTemplateIds, Map<String, List<String>> portTypeToPortIds,
307 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
308 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
309 return checkGetAttrOutFromEntityToPortIsLegal(subInterfaceList, portTypeToPortIds)
310 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
311 portTemplateConsolidationDataList, getSubInterfaceIdsFromSameType(subInterfaceList))
312 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
313 subInterfaceList, computeNodeTemplateIds);
316 private boolean areSubInterfaceTypesSimilarBetweenPorts(
317 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
318 PortTemplateConsolidationData subInterfaceConsolidationData) {
320 return portTemplateConsolidationDataList.stream().allMatch(
321 element -> element.hasSameSubInterfaceTypes(subInterfaceConsolidationData));
324 private boolean isNumberOfSubInterfacesPerTypeSimilar(
325 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
326 PortTemplateConsolidationData subInterfaceConsolidationData) {
328 return portTemplateConsolidationDataList.stream()
329 .allMatch(element -> element.isNumberOfSubInterfacesPerTypeSimilar(subInterfaceConsolidationData));
332 private Map<String, Set<GetAttrFuncData>> getConsolidationEntityGetAttrOutFuncData(
333 Map<String, List<GetAttrFuncData>> nodesGetAttrOut,
334 Collection<String> computeNodeTemplateIds) {
335 Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>();
337 if (MapUtils.isEmpty(nodesGetAttrOut)) {
338 return computeGetAttrFuncData;
341 for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) {
342 if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) {
343 computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry
348 return computeGetAttrFuncData;
351 private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType(
352 ServiceTemplate serviceTemplate,
353 TypeComputeConsolidationData typeComputeConsolidationData,
354 ConsolidationData consolidationData) {
355 return areThereGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData)
356 || areThereGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate,
357 typeComputeConsolidationData, consolidationData);
361 private boolean areThereGetAttrRelationsBetweenComputesOfSameType(
362 TypeComputeConsolidationData typeComputeConsolidationData) {
364 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities =
365 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
366 Collection<String> computeNodeTemplateIds =
367 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
369 return checkGetAttrRelationsForEntityConsolidationData(
370 computeTemplateConsolidationEntities, computeNodeTemplateIds,
371 EntityConsolidationData::getNodesGetAttrIn);
374 private boolean areThereGetAttrRelationsBetweenPortsOfTheSameType(
375 ServiceTemplate serviceTemplate,
376 TypeComputeConsolidationData typeComputeConsolidationData,
377 ConsolidationData consolidationData) {
378 Map<String, List<String>> portTypeToPortIds =
379 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
381 FilePortConsolidationData filePortConsolidationData =
382 consolidationData.getPortConsolidationData().getFilePortConsolidationData(
383 ToscaUtil.getServiceTemplateFileName(serviceTemplate));
385 for (List<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) {
386 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType =
387 getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData);
388 if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType,
389 portsOfTheSameTypeIds, EntityConsolidationData::getNodesGetAttrIn)) {
397 private boolean areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
398 List<String> subInterfacesIdsFromSameType,
399 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
401 return checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
402 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrIn)
403 || checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
404 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrOut);
408 private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData(
409 List<String> portsIds,
410 FilePortConsolidationData filePortConsolidationData) {
411 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = new ArrayList<>();
413 for (String portId : portsIds) {
414 PortTemplateConsolidationData portTemplateConsolidationData =
415 filePortConsolidationData.getPortTemplateConsolidationData(portId);
416 if (Objects.nonNull(portTemplateConsolidationData)) {
417 portTemplateConsolidationDataOfSameType.add(portTemplateConsolidationData);
421 return portTemplateConsolidationDataOfSameType;
424 private boolean checkGetAttrRelationsForEntityConsolidationData(Collection entities,
425 Collection<String> nodeTemplateIdsOfTheSameType,
426 Function<EntityConsolidationData, Map<String, List<GetAttrFuncData>>> getAttrValuesMethod) {
427 for (Object entity : entities) {
428 Map<String, List<GetAttrFuncData>> getAttrValue =
429 getAttrValuesMethod.apply((EntityConsolidationData) entity);
430 Set<String> getAttrNodeIds =
431 getAttrValue == null ? new HashSet<>()
432 : getAttrValue.keySet();
433 if (getAttrNodeIds.stream().anyMatch(nodeTemplateIdsOfTheSameType::contains)) {
441 private boolean checkComputeConsolidation(
442 ServiceTemplate serviceTemplate,
443 TypeComputeConsolidationData typeComputeConsolidationData) {
444 Collection<String> computeNodeTemplateIds =
445 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
446 List<String> propertiesWithIdenticalVal = getComputePropertiesWithIdenticalVal();
448 return arePropertiesSimilarBetweenComputeNodeTemplates(serviceTemplate, computeNodeTemplateIds,
449 propertiesWithIdenticalVal)
450 && checkComputeRelations(
451 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
455 private boolean checkComputeRelations(
456 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
458 return checkEntityConsolidationDataRelations(computeTemplateConsolidationEntities)
459 && checkComputesRelationsToVolume(computeTemplateConsolidationEntities);
462 private boolean checkEntityConsolidationDataRelations(Collection entities) {
463 EntityConsolidationData startingEntity = (EntityConsolidationData) entities.iterator().next();
465 for (Object entity : entities) {
466 EntityConsolidationData currentEntity = (EntityConsolidationData) entity;
467 if (!(checkNodesConnectedInRelations(startingEntity, currentEntity)
468 && (checkNodesConnectedOutRelations(startingEntity, currentEntity))
469 && (checkGroupIdsRelations(startingEntity, currentEntity)))) {
476 private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity,
477 EntityConsolidationData secondEntity) {
478 return compareNodeConnectivity(firstEntity.getNodesConnectedIn(),
479 secondEntity.getNodesConnectedIn());
482 private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity,
483 EntityConsolidationData secondEntity) {
484 return compareNodeConnectivity(firstEntity.getNodesConnectedOut(),
485 secondEntity.getNodesConnectedOut());
488 private boolean compareNodeConnectivity(
489 Multimap<String, RequirementAssignmentData> firstEntityMap,
490 Multimap<String, RequirementAssignmentData> secondEntityMap) {
492 if (CommonUtil.isMultimapEmpty(firstEntityMap) && CommonUtil.isMultimapEmpty(secondEntityMap)) {
495 return !firstEntityMap.isEmpty() && !secondEntityMap.isEmpty()
496 && firstEntityMap.keySet().equals(secondEntityMap.keySet());
499 private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity,
500 EntityConsolidationData currentEntity) {
501 return CollectionUtils.isEmpty(startingEntity.getGroupIds())
502 && CollectionUtils.isEmpty(currentEntity.getGroupIds())
503 || startingEntity.getGroupIds().equals(currentEntity.getGroupIds());
507 private boolean checkComputesRelationsToVolume(
508 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
509 Iterator<ComputeTemplateConsolidationData> iterator =
510 computeTemplateConsolidationEntities.iterator();
512 Multimap<String, RequirementAssignmentData> startingVolumes =
513 iterator.next().getVolumes();
515 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationEntities) {
516 Multimap<String, RequirementAssignmentData> currentVolumes =
517 compute.getVolumes();
518 if (!compareNodeConnectivity(startingVolumes, currentVolumes)) {
526 private boolean checkPortConsolidation(ServiceTemplate serviceTemplate,
527 TypeComputeConsolidationData typeComputeConsolidationData,
528 ConsolidationData consolidationData) {
529 return validateWantedPortProperties(serviceTemplate,
530 typeComputeConsolidationData)
531 && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
532 typeComputeConsolidationData, consolidationData);
536 private boolean validateWantedPortProperties(ServiceTemplate serviceTemplate,
537 TypeComputeConsolidationData typeComputeConsolidationData) {
538 Map<String, List<String>> portTypeToIds =
539 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
541 List<String> propertiesWithIdenticalVal = getPortPropertiesWithIdenticalVal();
542 List<String> propertiesThatNeedToHaveSameUsage = getPortPropertiesThatNeedToHaveSameUsage();
544 for (List<String> portsIds : portTypeToIds.values()) {
545 if (!arePortPropertiesValid(
546 serviceTemplate, propertiesWithIdenticalVal, propertiesThatNeedToHaveSameUsage, portsIds)) {
554 private boolean arePortPropertiesValid(ServiceTemplate serviceTemplate,
555 List<String> propertiesWithIdenticalVal,
556 List<String> propertiesThatNeedToHaveSameUsage,
557 List<String> portsIds) {
558 Map<String, NodeTemplate> nodeTemplates =
559 serviceTemplate.getTopology_template().getNode_templates();
561 Predicate<String> similar = property ->
562 isPropertyValueSimilarBetweenNodeTemplates(property,
563 portsIds, nodeTemplates);
565 Predicate<String> exists = property ->
566 isPropertyUsageSimilarBetweenAllNodeTemplates(property,
567 portsIds, nodeTemplates);
569 return areWantedPortPropertiesValid(
570 propertiesWithIdenticalVal, similar)
571 && areWantedPortPropertiesValid(
572 propertiesThatNeedToHaveSameUsage, exists);
575 private boolean checkPortRelations(String serviceTemplateName,
576 TypeComputeConsolidationData typeComputeConsolidationData,
577 ConsolidationData consolidationData) {
578 Map<String, List<String>> portTypeToIds =
579 typeComputeConsolidationData.collectAllPortsOfEachTypeFromComputes();
581 for (List<String> portIds : portTypeToIds.values()) {
582 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
583 collectAllPortsTemplateConsolidationData(portIds, serviceTemplateName, consolidationData);
585 if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList) || !checkSubInterfaceRules(
586 portTemplateConsolidationDataList)) {
594 private boolean checkSubInterfaceRules(List<PortTemplateConsolidationData>
595 portTemplateConsolidationDataList) {
596 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity =
597 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
598 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfaceTypeToEntity.values());
599 return areSubInterfacePropertiesAndRelationsValid(subInterfaceList);
602 private boolean areSubInterfacePropertiesAndRelationsValid(
603 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
604 return isResourceGroupPropertiesSimilarBetweenSubPorts(subInterfaceList)
605 && checkSubInterfaceRelations(subInterfaceList)
606 && !areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
607 getSubInterfaceIdsFromSameType(subInterfaceList), subInterfaceList);
610 private boolean checkSubInterfaceRelations(List<SubInterfaceTemplateConsolidationData>
612 return CollectionUtils.isEmpty(subInterfaceList)
613 || checkEntityConsolidationDataRelations(subInterfaceList);
616 private boolean isResourceGroupPropertiesSimilarBetweenSubPorts(
617 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
618 if (CollectionUtils.isEmpty(subInterfaceList)) {
622 SubInterfaceTemplateConsolidationData startingSubInterface = subInterfaceList.get(0);
623 for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceList) {
624 if (!startingSubInterface.getResourceGroupCount().equals(subInterface.getResourceGroupCount())
625 || !StringUtils.equals(startingSubInterface.getNetworkRole(), subInterface.getNetworkRole())) {
633 private List<String> getSubInterfaceIdsFromSameType(List<SubInterfaceTemplateConsolidationData>
635 if (CollectionUtils.isEmpty(subInterfaceList)) {
636 return new ArrayList<>();
639 return subInterfaceList.stream().map(SubInterfaceTemplateConsolidationData::getNodeTemplateId)
640 .collect(Collectors.toList());
643 private ListMultimap<String, SubInterfaceTemplateConsolidationData> collectAllSubInterfacesFromSameTypeFromPorts(
644 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
645 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create();
646 for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
647 portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity);
650 return subInterfaceTypeToEntity;
653 private List<PortTemplateConsolidationData> collectAllPortsTemplateConsolidationData(List<String> portIds,
654 String serviceTemplateName,
655 ConsolidationData consolidationData) {
657 FilePortConsolidationData filePortConsolidationData =
658 consolidationData.getPortConsolidationData()
659 .getFilePortConsolidationData(serviceTemplateName);
660 List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>();
662 for (String portId : portIds) {
663 PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData
664 .getPortTemplateConsolidationData(portId);
665 if (Objects.nonNull(portTemplateConsolidationData)) {
666 portTemplateConsolidationDataList.add(portTemplateConsolidationData);
670 return portTemplateConsolidationDataList;
673 private boolean areWantedPortPropertiesValid(List<String> propertiesToCheck,
674 Predicate<String> condition) {
676 return propertiesToCheck.stream().allMatch(condition);
680 private boolean arePropertiesSimilarBetweenComputeNodeTemplates(
681 ServiceTemplate serviceTemplate,
682 Collection<String> computeNodeTemplateIds,
683 List<String> propertiesThatNeedToBeSimilar) {
685 Map<String, NodeTemplate> idToNodeTemplate =
686 serviceTemplate.getTopology_template().getNode_templates();
688 for (String property : propertiesThatNeedToBeSimilar) {
689 if (!isPropertyValueSimilarBetweenNodeTemplates(property, computeNodeTemplateIds,
697 private boolean isPropertyUsageSimilarBetweenAllNodeTemplates(String propertyToCheck,
698 List<String> entityNodeTemplateIds,
699 Map<String, NodeTemplate> idToNodeTemplate) {
700 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(0));
701 if (Objects.isNull(startingNodeTemplate)) {
702 throw new CoreException(
703 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(0))
707 boolean propertyExistCondition =
708 isPropertyExistInNodeTemplate(propertyToCheck, startingNodeTemplate);
710 for (int i = 1; i < entityNodeTemplateIds.size(); i++) {
711 NodeTemplate currentNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(i));
712 if (Objects.isNull(currentNodeTemplate)) {
713 throw new CoreException(
714 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(i))
717 if (propertyExistCondition != isPropertyExistInNodeTemplate(propertyToCheck, currentNodeTemplate)) {
726 private boolean isPropertyValueSimilarBetweenNodeTemplates(String propertyToCheck,
727 Collection<String> entityNodeTemplateIds,
728 Map<String, NodeTemplate> idToNodeTemplate) {
730 Set<Object> propertiesValues = new HashSet<>();
731 Iterator<String> iterator = entityNodeTemplateIds.iterator();
733 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
735 while (iterator.hasNext()) {
736 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
739 return propertiesValues.size() == 1;
742 private void handlePropertyValue(String propertyToCheck,
743 Map<String, NodeTemplate> idToNodeTemplate,
744 Set<Object> propertiesValues, String nodeId) {
745 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(nodeId);
746 if (Objects.isNull(startingNodeTemplate)) {
747 throw new CoreException(
748 new DuplicateResourceIdsInDifferentFilesErrorBuilder(nodeId)
752 addPropertyValue(propertyToCheck, startingNodeTemplate, propertiesValues);
755 private void addPropertyValue(String property,
756 NodeTemplate nodeTemplate,
757 Set<Object> propertiesValues) {
758 propertiesValues.add(
759 isPropertyExistInNodeTemplate(property, nodeTemplate) ? nodeTemplate.getProperties()
760 .get(property) : "");
763 private boolean isPropertyExistInNodeTemplate(String propertyToCheck, NodeTemplate nodeTemplate) {
764 return !(nodeTemplate.getProperties() == null
765 || nodeTemplate.getProperties().get(propertyToCheck) == null);
768 void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId,
769 ServiceTemplate serviceTemplate,
770 ServiceTemplate substitutionServiceTemplate,
771 TranslationContext translationContext) {
773 ConsolidationData consolidationData = translationContext.getConsolidationData();
775 boolean substitutionConsolidationRuleResult =
776 substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate, translationContext);
778 if (substitutionConsolidationRuleResult) {
779 List<UnifiedCompositionData> unifiedCompositionDataList =
780 createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId, serviceTemplate,
781 substitutionServiceTemplate, consolidationData);
782 unifiedCompositionService
783 .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate, unifiedCompositionDataList,
784 UnifiedCompositionMode.NestedSingleCompute, translationContext);
786 //The node template does not represent unified VFC but complexVFC
787 //Adding the id in the context for fixing connectivity from/to nested non-unified nodes
788 translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
789 substituteNodeTemplateId, substituteNodeTemplateId);
791 if (!translationContext.isUnifiedHandledServiceTemplate(substitutionServiceTemplate)) {
792 serviceTemplateConsolidation(substitutionServiceTemplate, translationContext);
797 private boolean substitutionServiceTemplateConsolidationRule(ServiceTemplate nestedServiceTemplate,
798 TranslationContext context) {
799 ConsolidationData consolidationData = context.getConsolidationData();
801 return consolidationData.getComputeConsolidationDataHandler().isNumberOfComputeTypesLegal(
802 ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate))
803 && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context);
806 private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate,
807 TranslationContext context) {
808 String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
809 if (Objects.isNull(nestedServiceTemplateName)) {
813 NestedConsolidationDataHandler nestedConsolidationDataHandler = context.getNestedConsolidationDataHandler();
815 //Condition to check if there is nested file and if file contains only sub interfaces then
817 return nestedConsolidationDataHandler.isNestedConsolidationDataExist(nestedServiceTemplateName)
818 && !ifNestedFileContainsOnlySubInterface(nestedServiceTemplate, context);
821 private boolean ifNestedFileContainsOnlySubInterface(ServiceTemplate serviceTemplate, TranslationContext context) {
822 Map<String, NodeTemplate> nestedNodeTemplateMap = DataModelUtil.getNodeTemplates(serviceTemplate);
824 Set<String> nestedHeatFileNames = getNestedHeatFileNames(nestedNodeTemplateMap);
826 return ifAllResourceAreSubInterface(nestedHeatFileNames, context);
829 private Set<String> getNestedHeatFileNames(Map<String, NodeTemplate> nestedNodeTemplateMap) {
830 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
832 return nestedNodeTemplateMap.entrySet().stream()
833 .filter(entry -> toscaAnalyzerService.isSubstitutableNodeTemplate(entry.getValue())
834 && toscaAnalyzerService.getSubstituteServiceTemplateName(
835 entry.getKey(), entry.getValue()).isPresent())
836 .map(entry -> toscaAnalyzerService.getSubstituteServiceTemplateName(
837 entry.getKey(), entry.getValue()).get())
838 .collect(Collectors.toSet());
841 // Method returns true if all of the resource are sub interface
842 private boolean ifAllResourceAreSubInterface(Set<String> nestedHeatFileNames,
843 TranslationContext context) {
844 if (nestedHeatFileNames.isEmpty()) {
848 for (String fileName : nestedHeatFileNames) {
849 String heatFileName = context.getNestedHeatFileName().get(fileName);
851 if (Objects.nonNull(heatFileName)
852 && !context.getTranslatedServiceTemplates().get(heatFileName).getTopology_template()
853 .getNode_templates().values().stream()
854 .allMatch(nodeTemplate -> ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE
855 .equals(nodeTemplate.getType()))) {
863 private List<UnifiedCompositionData> createUnifiedCompositionDataList(
864 ServiceTemplate serviceTemplate,
865 ConsolidationData consolidationData,
866 TypeComputeConsolidationData typeComputeConsolidationData) {
868 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
870 for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
871 .getAllComputeTemplateConsolidationData()) {
872 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
873 unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
874 FilePortConsolidationData filePortConsolidationData =
875 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
876 .getServiceTemplateFileName(serviceTemplate));
877 setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, filePortConsolidationData,
878 unifiedCompositionData);
879 unifiedCompositionDataList.add(unifiedCompositionData);
881 return unifiedCompositionDataList;
884 private void setPortTemplateConsolidationData(FilePortConsolidationData filePortConsolidationData,
886 UnifiedCompositionData unifiedCompositionData,
887 List<SubInterfaceTemplateConsolidationData>
888 subInterfaceTemplateConsolidationDataList) {
889 if (Objects.isNull(filePortConsolidationData)) {
892 PortTemplateConsolidationData portTemplateConsolidationData =
893 filePortConsolidationData.getPortTemplateConsolidationData(portId);
894 unifiedCompositionData.addPortTemplateConsolidationData(portTemplateConsolidationData);
895 if (portTemplateConsolidationData != null) {
896 portTemplateConsolidationData.copyFlatInto(subInterfaceTemplateConsolidationDataList);
900 private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
901 String substituteNodeTemplateId,
902 ServiceTemplate serviceTemplate,
903 ServiceTemplate substitutionServiceTemplate,
904 ConsolidationData consolidationData) {
905 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
906 FileNestedConsolidationData fileNestedConsolidationData =
907 consolidationData.getNestedConsolidationData()
908 .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
910 if (Objects.nonNull(fileNestedConsolidationData)) {
911 NestedTemplateConsolidationData nestedTemplateConsolidationData =
912 fileNestedConsolidationData.getNestedTemplateConsolidationData(substituteNodeTemplateId);
913 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
914 unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData);
915 unifiedCompositionDataList.add(unifiedCompositionData);
916 addSubInterfaceDataToNestedCompositionData(substitutionServiceTemplate, consolidationData,
917 unifiedCompositionData);
920 return unifiedCompositionDataList;
923 private void addSubInterfaceDataToNestedCompositionData(ServiceTemplate substitutionServiceTemplate,
924 ConsolidationData consolidationData,
925 UnifiedCompositionData unifiedCompositionData) {
926 FileComputeConsolidationData nestedFileComputeConsolidationData = consolidationData.getComputeConsolidationData()
927 .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
928 FilePortConsolidationData nestedFilePortConsolidationData = consolidationData.getPortConsolidationData()
929 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
930 if (Objects.isNull(nestedFileComputeConsolidationData)
931 || Objects.isNull(nestedFilePortConsolidationData)) {
934 TypeComputeConsolidationData computeType =
935 nestedFileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next();
936 if (Objects.isNull(computeType)) {
939 ComputeTemplateConsolidationData computeTemplateConsolidationData =
940 computeType.getAllComputeTemplateConsolidationData().iterator().next();
941 setUnifiedCompositionDataWithPortTemplateData(computeTemplateConsolidationData, nestedFilePortConsolidationData,
942 unifiedCompositionData);
945 private void setUnifiedCompositionDataWithPortTemplateData(ComputeTemplateConsolidationData
946 computeTemplateConsolidationData,
947 FilePortConsolidationData filePortConsolidationData,
948 UnifiedCompositionData unifiedCompositionData) {
949 Collection<List<String>> portCollection =
950 computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
951 : computeTemplateConsolidationData.getPorts().values();
952 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = new ArrayList<>();
953 portCollection.stream()
954 .flatMap(Collection::stream)
955 .forEach(portId -> setPortTemplateConsolidationData(filePortConsolidationData, portId,
956 unifiedCompositionData, subInterfaceTemplateConsolidationDataList));
957 unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList(
958 subInterfaceTemplateConsolidationDataList);
961 private boolean consolidationPreCondition(
962 ServiceTemplate serviceTemplate,
963 ConsolidationData consolidationData,
964 TypeComputeConsolidationData typeComputeConsolidationData) {
966 return (typeComputeConsolidationData.isThereMoreThanOneComputeTypeInstance()
967 && typeComputeConsolidationData.isNumberOfPortsEqualsBetweenComputeNodes()
968 && typeComputeConsolidationData.isNumberOfPortFromEachTypeLegal()
969 && typeComputeConsolidationData.isPortTypesEqualsBetweenComputeNodes()
970 && checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(serviceTemplate,
971 typeComputeConsolidationData, consolidationData)
972 && checkSubInterfaceConsolidationPreCondition(serviceTemplate, consolidationData,
973 typeComputeConsolidationData));
977 List<String> getPropertiesWithIdenticalVal(UnifiedCompositionEntity entity) {
980 return getComputePropertiesWithIdenticalVal();
983 return getComputePropertiesWithIdenticalVal();
986 return getPortPropertiesWithIdenticalVal();
989 return new ArrayList<>();
993 private List<String> getComputePropertiesWithIdenticalVal() {
994 List<String> propertyWithIdenticalValue = new ArrayList<>();
995 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_IMAGE);
996 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_FLAVOR);
997 return propertyWithIdenticalValue;
1000 private List<String> getPortPropertiesWithIdenticalVal() {
1001 List<String> propertiesThatNeedToHaveIdenticalVal = new ArrayList<>();
1002 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1003 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.MAC_ADDRESS);
1005 propertiesThatNeedToHaveIdenticalVal
1006 .addAll(TranslationContext.getEnrichPortResourceProperties());
1008 return propertiesThatNeedToHaveIdenticalVal;
1011 private List<String> getPortPropertiesThatNeedToHaveSameUsage() {
1012 List<String> propertiesThatNeedToHaveSameUsage = new ArrayList<>();
1013 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_FIXED_IPS);
1014 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1015 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.MAC_ADDRESS);
1017 propertiesThatNeedToHaveSameUsage.addAll(TranslationContext.getEnrichPortResourceProperties());
1019 return propertiesThatNeedToHaveSameUsage;