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 org.apache.commons.collections4.CollectionUtils;
22 import org.apache.commons.collections4.MapUtils;
23 import org.apache.commons.lang3.StringUtils;
24 import org.openecomp.sdc.common.errors.CoreException;
25 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
26 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
27 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
28 import org.openecomp.sdc.tosca.services.DataModelUtil;
29 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
30 import org.openecomp.sdc.tosca.services.ToscaConstants;
31 import org.openecomp.sdc.tosca.services.ToscaUtil;
32 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity;
36 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionMode;
37 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
38 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
39 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
40 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
41 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
42 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
43 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
44 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedConsolidationData;
45 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
46 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
47 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
48 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
49 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
50 import org.openecomp.sdc.translator.services.heattotosca.errors.DuplicateResourceIdsInDifferentFilesErrorBuilder;
52 import java.util.ArrayList;
53 import java.util.Collection;
54 import java.util.Collections;
55 import java.util.HashMap;
56 import java.util.HashSet;
57 import java.util.Iterator;
58 import java.util.List;
60 import java.util.Objects;
62 import java.util.function.Function;
63 import java.util.function.Predicate;
64 import java.util.stream.Collectors;
66 public class ConsolidationService {
68 private UnifiedCompositionService unifiedCompositionService;
70 public ConsolidationService(UnifiedCompositionService unifiedCompositionService) {
71 this.unifiedCompositionService = unifiedCompositionService;
74 ConsolidationService() {
78 void serviceTemplateConsolidation(ServiceTemplate serviceTemplate,
79 TranslationContext translationContext) {
81 ConsolidationData consolidationData = translationContext.getConsolidationData();
83 FileComputeConsolidationData fileComputeConsolidationData =
84 consolidationData.getComputeConsolidationData()
85 .getFileComputeConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
87 if (Objects.isNull(fileComputeConsolidationData)) {
90 for (TypeComputeConsolidationData typeComputeConsolidationData :
91 fileComputeConsolidationData.getAllTypeComputeConsolidationData()) {
92 boolean preConditionResult =
93 consolidationPreCondition(
94 serviceTemplate, consolidationData, typeComputeConsolidationData);
96 List<UnifiedCompositionData> unifiedCompositionDataList =
97 createUnifiedCompositionDataList(
98 serviceTemplate, consolidationData, typeComputeConsolidationData);
100 if (preConditionResult) {
101 boolean consolidationRuleCheckResult =
102 checkConsolidationRules(serviceTemplate, typeComputeConsolidationData,
105 unifiedCompositionService.createUnifiedComposition(
106 serviceTemplate, null, unifiedCompositionDataList,
107 consolidationRuleCheckResult ? UnifiedCompositionMode.ScalingInstances
108 : UnifiedCompositionMode.CatalogInstance,
111 unifiedCompositionService.createUnifiedComposition(
112 serviceTemplate, null, unifiedCompositionDataList, UnifiedCompositionMode
120 static Map<String, String> getConsolidationEntityIdToType(ServiceTemplate serviceTemplate,
121 ConsolidationData consolidationData) {
122 Map<String, String> consolidationEntityIdToType = new HashMap<>();
124 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
125 FileComputeConsolidationData fileComputeConsolidationData =
126 consolidationData.getComputeConsolidationData()
127 .getFileComputeConsolidationData(serviceTemplateFileName);
128 FilePortConsolidationData filePortConsolidationData =
129 consolidationData.getPortConsolidationData()
130 .getFilePortConsolidationData(serviceTemplateFileName);
131 if (Objects.nonNull(fileComputeConsolidationData)) {
132 for (String computeType : fileComputeConsolidationData.getAllComputeTypes()) {
133 TypeComputeConsolidationData typeComputeConsolidationData =
134 fileComputeConsolidationData.getTypeComputeConsolidationData(computeType);
135 Collection<String> computeNodeTemplateIds =
136 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
137 for (String computeNodeTemplateId : computeNodeTemplateIds) {
138 consolidationEntityIdToType.put(computeNodeTemplateId, computeType);
143 if (Objects.nonNull(filePortConsolidationData)) {
144 Set<String> portNodeTemplateIds = filePortConsolidationData.getAllPortNodeTemplateIds();
145 for (String portNodeTemplateId : portNodeTemplateIds) {
146 consolidationEntityIdToType
147 .put(portNodeTemplateId, ConsolidationDataUtil.getPortType(portNodeTemplateId));
151 return consolidationEntityIdToType;
155 private boolean checkConsolidationRules(ServiceTemplate serviceTemplate,
156 TypeComputeConsolidationData typeComputeConsolidationData,
157 ConsolidationData consolidationData) {
158 return checkComputeConsolidation(serviceTemplate, typeComputeConsolidationData)
159 && checkPortConsolidation(serviceTemplate, typeComputeConsolidationData,
161 && !checkGetAttrBetweenEntityConsolidationOfTheSameType(serviceTemplate,
162 typeComputeConsolidationData, consolidationData);
165 private boolean checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(
166 ServiceTemplate serviceTemplate,
167 TypeComputeConsolidationData typeComputeConsolidationData,
168 ConsolidationData consolidationData) {
169 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
170 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
172 Collection<String> computeNodeTemplateIds =
173 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
175 Map<String, List<String>> portTypeToIds = UnifiedCompositionUtil
176 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataList);
179 checkGetAttrOutFromEntityToPortIsLegal(computeTemplateConsolidationDataList, portTypeToIds)
180 && checkGetAttrOutFromPortLegal(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 entities,
206 Map<String, List<String>> portTypeToIds) {
208 for (String portType : portTypeToIds.keySet()) {
209 if (CollectionUtils.isEmpty(entities)) {
212 Set<GetAttrFuncData> startingGetAttrFunc =
213 getEntityGetAttrFuncAsSet(portType,
214 (EntityConsolidationData) entities.iterator().next());
215 for (Object entity : entities) {
216 EntityConsolidationData currentEntity = (EntityConsolidationData) entity;
217 Set<GetAttrFuncData> currentGetAttrFuncData =
218 getEntityGetAttrFuncAsSet(portType, currentEntity);
219 if (!(startingGetAttrFunc.equals(currentGetAttrFuncData))) {
228 private boolean checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
229 List entityConsolidationDataList,
230 Collection<String> consolidationEntityNodeTemplateIds) {
231 if (CollectionUtils.isEmpty(entityConsolidationDataList)) {
234 EntityConsolidationData startingEntityTemplate =
235 (EntityConsolidationData) entityConsolidationDataList.get(0);
236 Map<String, Set<GetAttrFuncData>> startingGetAttrOutFuncData =
237 getConsolidationEntityGetAttrOutFuncData(startingEntityTemplate.getNodesGetAttrOut(),
238 consolidationEntityNodeTemplateIds);
240 for (int i = 1; i < entityConsolidationDataList.size(); i++) {
241 EntityConsolidationData currentEntityTemplate =
242 (EntityConsolidationData) entityConsolidationDataList.get(i);
243 Map<String, Set<GetAttrFuncData>> currentGetAttrOutFuncData =
244 getConsolidationEntityGetAttrOutFuncData(currentEntityTemplate.getNodesGetAttrOut(),
245 consolidationEntityNodeTemplateIds);
247 if (!isGetAttrRelationToEntitySimilarBetweenEntities(startingGetAttrOutFuncData,
248 currentGetAttrOutFuncData)) {
256 private boolean isGetAttrRelationToEntitySimilarBetweenEntities(
257 Map<String, Set<GetAttrFuncData>> firstMap,
258 Map<String, Set<GetAttrFuncData>> secondMap) {
259 if (MapUtils.isEmpty(firstMap) != MapUtils.isEmpty(secondMap)) {
263 return (MapUtils.isEmpty(firstMap) && MapUtils.isEmpty(secondMap)) ||
264 (new ArrayList<>(firstMap.values()).equals(new ArrayList<>(secondMap.values())));
268 private boolean checkSubInterfaceConsolidationPreCondition(ServiceTemplate serviceTemplate,
269 ConsolidationData consolidationData,
270 TypeComputeConsolidationData typeComputeConsolidationData) {
271 FilePortConsolidationData filePortConsolidationData =
272 consolidationData.getPortConsolidationData()
273 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
275 if (Objects.isNull(filePortConsolidationData)) {
279 Map<String, List<String>> portTypeToPortIds = UnifiedCompositionUtil
280 .collectAllPortsFromEachTypesFromComputes(
281 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
283 Collection<String> computeNodeTemplateIds =
284 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
286 for (List<String> portIdsFromSameType : portTypeToPortIds.values()) {
287 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
288 getAllPortTemplateConsolidationData(portIdsFromSameType, filePortConsolidationData);
290 if (!areSubInterfacePreConditionRulesValid(portTypeToPortIds, computeNodeTemplateIds,
291 portTemplateConsolidationDataList, portTemplateConsolidationDataList.get(0))) {
298 private boolean areSubInterfacePreConditionRulesValid(Map<String, List<String>> portTypeToPortIds,
299 Collection<String> computeNodeTemplateIds,
300 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
301 PortTemplateConsolidationData subInterfaceConsolidationData) {
302 return areSubInterfaceTypesSimilarBetweenPorts(portTemplateConsolidationDataList,
303 subInterfaceConsolidationData)
304 && isNumberOfSubInterfacesPerTypeSimilar(portTemplateConsolidationDataList,
305 subInterfaceConsolidationData)
306 && isGetAttrFromSubInterfaceToOtherEntitiesLegal(computeNodeTemplateIds,
307 portTypeToPortIds, portTemplateConsolidationDataList);
310 private boolean isGetAttrFromSubInterfaceToOtherEntitiesLegal(
311 Collection<String> computeNodeTemplateIds,
312 Map<String, List<String>> portTypeToPortIds,
313 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
315 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfacesFromSameTypeFromPorts =
316 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
318 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfacesFromSameTypeFromPorts
320 return areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
321 computeNodeTemplateIds, portTypeToPortIds, portTemplateConsolidationDataList, subInterfaceList);
324 private boolean areGetAttrRelationshipsBetweenSubInterfaceToConsolidationEntitiesValid(
325 Collection<String> computeNodeTemplateIds, Map<String, List<String>> portTypeToPortIds,
326 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
327 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
328 return checkGetAttrOutFromEntityToPortIsLegal(subInterfaceList, portTypeToPortIds)
329 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
330 portTemplateConsolidationDataList, getSubInterfaceIdsFromSameType(subInterfaceList))
331 && checkGetAttrOutFromConsolidationEntityToEntityNotFromSameTypeIsLegal(
332 subInterfaceList, computeNodeTemplateIds);
335 private boolean areSubInterfaceTypesSimilarBetweenPorts(
336 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
337 PortTemplateConsolidationData subInterfaceConsolidationData) {
339 return portTemplateConsolidationDataList.stream().allMatch(
340 element -> element.hasSameSubInterfaceTypes(subInterfaceConsolidationData));
343 private boolean isNumberOfSubInterfacesPerTypeSimilar(
344 List<PortTemplateConsolidationData> portTemplateConsolidationDataList,
345 PortTemplateConsolidationData subInterfaceConsolidationData) {
347 return portTemplateConsolidationDataList.stream()
348 .allMatch(element -> element.isNumberOfSubInterfacesPerTypeSimilar(subInterfaceConsolidationData));
352 private Set<GetAttrFuncData> getEntityGetAttrFuncAsSet(
354 EntityConsolidationData entityConsolidationData) {
356 Set<GetAttrFuncData> getAttrFuncDataFromPortsWithSameType = new HashSet<>();
357 Map<String, List<GetAttrFuncData>> nodesGetAttrOut =
358 entityConsolidationData.getNodesGetAttrOut();
360 if (MapUtils.isEmpty(nodesGetAttrOut)) {
361 return getAttrFuncDataFromPortsWithSameType;
364 for (Map.Entry<String, List<GetAttrFuncData>> entry : nodesGetAttrOut.entrySet()) {
365 if (portType.equals(ConsolidationDataUtil.getPortType(entry.getKey()))) {
366 getAttrFuncDataFromPortsWithSameType.addAll(entry.getValue());
370 return getAttrFuncDataFromPortsWithSameType;
373 private Map<String, Set<GetAttrFuncData>> getConsolidationEntityGetAttrOutFuncData(
374 Map<String, List<GetAttrFuncData>> nodesGetAttrOut,
375 Collection<String> computeNodeTemplateIds) {
376 Map<String, Set<GetAttrFuncData>> computeGetAttrFuncData = new HashMap<>();
378 if (MapUtils.isEmpty(nodesGetAttrOut)) {
379 return computeGetAttrFuncData;
382 for (Map.Entry<String, List<GetAttrFuncData>> getAttrFuncEntry : nodesGetAttrOut.entrySet()) {
383 if (computeNodeTemplateIds.contains(getAttrFuncEntry.getKey())) {
384 computeGetAttrFuncData.put(getAttrFuncEntry.getKey(), new HashSet<>(getAttrFuncEntry
389 return computeGetAttrFuncData;
392 private boolean checkGetAttrBetweenEntityConsolidationOfTheSameType(
393 ServiceTemplate serviceTemplate,
394 TypeComputeConsolidationData typeComputeConsolidationData,
395 ConsolidationData consolidationData) {
396 return areThereGetAttrRelationsBetweenComputesOfSameType(typeComputeConsolidationData)
397 || areThereGetAttrRelationsBetweenPortsOfTheSameType(serviceTemplate,
398 typeComputeConsolidationData, consolidationData);
402 private boolean areThereGetAttrRelationsBetweenComputesOfSameType(
403 TypeComputeConsolidationData typeComputeConsolidationData) {
405 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities =
406 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
407 Collection<String> computeNodeTemplateIds =
408 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
410 return checkGetAttrRelationsForEntityConsolidationData(
411 computeTemplateConsolidationEntities, computeNodeTemplateIds,
412 EntityConsolidationData::getNodesGetAttrIn);
415 private boolean areThereGetAttrRelationsBetweenPortsOfTheSameType(
416 ServiceTemplate serviceTemplate,
417 TypeComputeConsolidationData typeComputeConsolidationData,
418 ConsolidationData consolidationData) {
420 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities =
421 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
422 Map<String, List<String>> portTypeToPortIds = UnifiedCompositionUtil
423 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationEntities);
425 FilePortConsolidationData filePortConsolidationData =
426 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
427 .getServiceTemplateFileName(serviceTemplate));
429 for (List<String> portsOfTheSameTypeIds : portTypeToPortIds.values()) {
430 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType =
431 getAllPortTemplateConsolidationData(portsOfTheSameTypeIds, filePortConsolidationData);
432 if (!checkGetAttrRelationsForEntityConsolidationData(portTemplateConsolidationDataOfSameType,
433 portsOfTheSameTypeIds, EntityConsolidationData::getNodesGetAttrIn)) {
441 private boolean areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
442 List<String> subInterfacesIdsFromSameType,
443 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
445 return checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
446 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrIn)
447 || checkGetAttrRelationsForEntityConsolidationData(subInterfaceList,
448 subInterfacesIdsFromSameType, EntityConsolidationData::getNodesGetAttrOut);
452 private List<PortTemplateConsolidationData> getAllPortTemplateConsolidationData(
453 List<String> portsIds,
454 FilePortConsolidationData filePortConsolidationData) {
455 List<PortTemplateConsolidationData> portTemplateConsolidationDataOfSameType = new ArrayList<>();
457 for (String portId : portsIds) {
458 PortTemplateConsolidationData portTemplateConsolidationData =
459 filePortConsolidationData.getPortTemplateConsolidationData(portId);
460 if (Objects.nonNull(portTemplateConsolidationData)) {
461 portTemplateConsolidationDataOfSameType.add(portTemplateConsolidationData);
465 return portTemplateConsolidationDataOfSameType;
468 private boolean checkGetAttrRelationsForEntityConsolidationData(Collection entities,
469 Collection<String> nodeTemplateIdsOfTheSameType,
470 Function<EntityConsolidationData, Map<String, List<GetAttrFuncData>>> getAttrValuesMethod) {
471 for (Object entity : entities) {
472 Map<String, List<GetAttrFuncData>> getAttrValue =
473 getAttrValuesMethod.apply((EntityConsolidationData) entity);
474 Set<String> getAttrNodeIds =
475 getAttrValue == null ? new HashSet<>()
476 : getAttrValue.keySet();
477 if (getAttrNodeIds.stream().anyMatch(nodeTemplateIdsOfTheSameType::contains)) {
485 private boolean checkComputeConsolidation(
486 ServiceTemplate serviceTemplate,
487 TypeComputeConsolidationData typeComputeConsolidationData) {
488 Collection<String> computeNodeTemplateIds =
489 typeComputeConsolidationData.getAllComputeNodeTemplateIds();
490 List<String> propertiesWithIdenticalVal = getComputePropertiesWithIdenticalVal();
492 return arePropertiesSimilarBetweenComputeNodeTemplates(serviceTemplate, computeNodeTemplateIds,
493 propertiesWithIdenticalVal)
494 && checkComputeRelations(
495 typeComputeConsolidationData.getAllComputeTemplateConsolidationData());
499 private boolean checkComputeRelations(
500 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
502 return checkEntityConsolidationDataRelations(computeTemplateConsolidationEntities)
503 && checkComputesRelationsToVolume(computeTemplateConsolidationEntities);
506 private boolean checkEntityConsolidationDataRelations(Collection entities) {
507 EntityConsolidationData startingEntity = (EntityConsolidationData) entities.iterator().next();
509 for (Object entity : entities) {
510 EntityConsolidationData currentEntity = (EntityConsolidationData) entity;
511 if (!(checkNodesConnectedInRelations(startingEntity, currentEntity)
512 && (checkNodesConnectedOutRelations(startingEntity, currentEntity))
513 && (checkGroupIdsRelations(startingEntity, currentEntity)))) {
520 private boolean checkNodesConnectedInRelations(EntityConsolidationData firstEntity,
521 EntityConsolidationData secondEntity) {
522 return compareNodeConnectivity(firstEntity.getNodesConnectedIn(),
523 secondEntity.getNodesConnectedIn());
526 private boolean checkNodesConnectedOutRelations(EntityConsolidationData firstEntity,
527 EntityConsolidationData secondEntity) {
528 return compareNodeConnectivity(firstEntity.getNodesConnectedOut(),
529 secondEntity.getNodesConnectedOut());
532 private boolean compareNodeConnectivity(
533 Map<String, List<RequirementAssignmentData>> firstEntityMap,
534 Map<String, List<RequirementAssignmentData>> secondEntityMap) {
536 if (MapUtils.isEmpty(firstEntityMap)
537 && MapUtils.isEmpty(secondEntityMap)) {
540 return !MapUtils.isEmpty(firstEntityMap) && !MapUtils.isEmpty(secondEntityMap)
541 && firstEntityMap.keySet().equals(secondEntityMap.keySet());
544 private boolean checkGroupIdsRelations(EntityConsolidationData startingEntity,
545 EntityConsolidationData currentEntity) {
546 return CollectionUtils.isEmpty(startingEntity.getGroupIds())
547 && CollectionUtils.isEmpty(currentEntity.getGroupIds())
548 || startingEntity.getGroupIds().equals(currentEntity.getGroupIds());
552 private boolean checkComputesRelationsToVolume(
553 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationEntities) {
554 Iterator<ComputeTemplateConsolidationData> iterator =
555 computeTemplateConsolidationEntities.iterator();
557 Map<String, List<RequirementAssignmentData>> startingVolumes =
558 iterator.next().getVolumes();
560 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationEntities) {
561 Map<String, List<RequirementAssignmentData>> currentVolumes =
562 compute.getVolumes();
563 if (!compareNodeConnectivity(startingVolumes, currentVolumes)) {
571 private boolean checkPortConsolidation(ServiceTemplate serviceTemplate,
572 TypeComputeConsolidationData typeComputeConsolidationData,
573 ConsolidationData consolidationData) {
574 return validateWantedPortProperties(serviceTemplate,
575 typeComputeConsolidationData)
576 && checkPortRelations(ToscaUtil.getServiceTemplateFileName(serviceTemplate),
577 typeComputeConsolidationData, consolidationData);
581 private boolean validateWantedPortProperties(ServiceTemplate serviceTemplate,
582 TypeComputeConsolidationData typeComputeConsolidationData) {
584 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
585 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
586 Map<String, List<String>> portTypeToIds = UnifiedCompositionUtil
587 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
588 List<String> propertiesWithIdenticalVal = getPortPropertiesWithIdenticalVal();
589 List<String> propertiesThatNeedToHaveSameUsage =
590 getPortPropertiesThatNeedToHaveSameUsage();
592 for (List<String> portsIds : portTypeToIds.values()) {
593 if (!arePortPropertiesValid(serviceTemplate, propertiesWithIdenticalVal,
594 propertiesThatNeedToHaveSameUsage, portsIds)) {
602 private boolean arePortPropertiesValid(ServiceTemplate serviceTemplate,
603 List<String> propertiesWithIdenticalVal,
604 List<String> propertiesThatNeedToHaveSameUsage,
605 List<String> portsIds) {
606 Map<String, NodeTemplate> nodeTemplates =
607 serviceTemplate.getTopology_template().getNode_templates();
609 Predicate<String> similar = property ->
610 isPropertyValueSimilarBetweenNodeTemplates(property,
611 portsIds, nodeTemplates);
613 Predicate<String> exists = property ->
614 isPropertyUsageSimilarBetweenAllNodeTemplates(property,
615 portsIds, nodeTemplates);
617 return areWantedPortPropertiesValid(
618 propertiesWithIdenticalVal, similar)
619 && areWantedPortPropertiesValid(
620 propertiesThatNeedToHaveSameUsage, exists);
623 private boolean checkPortRelations(String serviceTemplateName,
624 TypeComputeConsolidationData typeComputeConsolidationData,
625 ConsolidationData consolidationData) {
626 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection =
627 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
628 Map<String, List<String>> portTypeToIds = UnifiedCompositionUtil
629 .collectAllPortsFromEachTypesFromComputes(computeTemplateConsolidationDataCollection);
631 for (List<String> portIds : portTypeToIds.values()) {
632 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
633 collectAllPortsTemplateConsolidationData(
634 portIds, serviceTemplateName, consolidationData);
636 if (!checkEntityConsolidationDataRelations(portTemplateConsolidationDataList)
637 || !checkSubInterfaceRules(portTemplateConsolidationDataList)) {
645 private boolean checkSubInterfaceRules(List<PortTemplateConsolidationData>
646 portTemplateConsolidationDataList) {
647 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity =
648 collectAllSubInterfacesFromSameTypeFromPorts(portTemplateConsolidationDataList);
649 List<SubInterfaceTemplateConsolidationData> subInterfaceList = new ArrayList<>(subInterfaceTypeToEntity.values());
650 return areSubInterfacePropertiesAndRelationsValid(subInterfaceList);
653 private boolean areSubInterfacePropertiesAndRelationsValid(
654 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
655 return isResourceGroupPropertiesSimilarBetweenSubPorts(subInterfaceList)
656 && checkSubInterfaceRelations(subInterfaceList)
657 && !areThereGetAttrRelationsBetweenSubInterfacesOfSameType(
658 getSubInterfaceIdsFromSameType(subInterfaceList), subInterfaceList);
661 private boolean checkSubInterfaceRelations(List<SubInterfaceTemplateConsolidationData>
663 return CollectionUtils.isEmpty(subInterfaceList)
664 || checkEntityConsolidationDataRelations(subInterfaceList);
667 private boolean isResourceGroupPropertiesSimilarBetweenSubPorts(
668 List<SubInterfaceTemplateConsolidationData> subInterfaceList) {
669 if (CollectionUtils.isEmpty(subInterfaceList)) {
673 SubInterfaceTemplateConsolidationData startingSubInterface = subInterfaceList.get(0);
674 for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceList) {
675 if (!startingSubInterface.getResourceGroupCount().equals(subInterface.getResourceGroupCount())
676 || !StringUtils.equals(startingSubInterface.getNetworkRole(), subInterface.getNetworkRole())) {
684 private List<String> getSubInterfaceIdsFromSameType(List<SubInterfaceTemplateConsolidationData>
686 if (CollectionUtils.isEmpty(subInterfaceList)) {
687 return new ArrayList<>();
690 return subInterfaceList.stream().map(SubInterfaceTemplateConsolidationData::getNodeTemplateId)
691 .collect(Collectors.toList());
694 private ListMultimap<String, SubInterfaceTemplateConsolidationData> collectAllSubInterfacesFromSameTypeFromPorts(
695 List<PortTemplateConsolidationData> portTemplateConsolidationDataList) {
696 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity = ArrayListMultimap.create();
697 for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
698 portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity);
701 return subInterfaceTypeToEntity;
704 private List<PortTemplateConsolidationData> collectAllPortsTemplateConsolidationData(List<String> portIds,
705 String serviceTemplateName,
706 ConsolidationData consolidationData) {
708 FilePortConsolidationData filePortConsolidationData =
709 consolidationData.getPortConsolidationData()
710 .getFilePortConsolidationData(serviceTemplateName);
711 List<PortTemplateConsolidationData> portTemplateConsolidationDataList = new ArrayList<>();
713 for (String portId : portIds) {
714 PortTemplateConsolidationData portTemplateConsolidationData = filePortConsolidationData
715 .getPortTemplateConsolidationData(portId);
716 if (Objects.nonNull(portTemplateConsolidationData)) {
717 portTemplateConsolidationDataList.add(portTemplateConsolidationData);
721 return portTemplateConsolidationDataList;
724 private boolean areWantedPortPropertiesValid(List<String> propertiesToCheck,
725 Predicate<String> condition) {
727 return propertiesToCheck.stream().allMatch(condition);
731 private boolean arePropertiesSimilarBetweenComputeNodeTemplates(
732 ServiceTemplate serviceTemplate,
733 Collection<String> computeNodeTemplateIds,
734 List<String> propertiesThatNeedToBeSimilar) {
736 Map<String, NodeTemplate> idToNodeTemplate =
737 serviceTemplate.getTopology_template().getNode_templates();
739 for (String property : propertiesThatNeedToBeSimilar) {
740 if (!isPropertyValueSimilarBetweenNodeTemplates(property, computeNodeTemplateIds,
748 private boolean isPropertyUsageSimilarBetweenAllNodeTemplates(String propertyToCheck,
749 List<String> entityNodeTemplateIds,
750 Map<String, NodeTemplate> idToNodeTemplate) {
751 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(0));
752 if (Objects.isNull(startingNodeTemplate)) {
753 throw new CoreException(
754 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(0))
758 boolean propertyExistCondition =
759 isPropertyExistInNodeTemplate(propertyToCheck, startingNodeTemplate);
761 for (int i = 1; i < entityNodeTemplateIds.size(); i++) {
762 NodeTemplate currentNodeTemplate = idToNodeTemplate.get(entityNodeTemplateIds.get(i));
763 if (Objects.isNull(currentNodeTemplate)) {
764 throw new CoreException(
765 new DuplicateResourceIdsInDifferentFilesErrorBuilder(entityNodeTemplateIds.get(i))
768 if (propertyExistCondition != isPropertyExistInNodeTemplate(propertyToCheck, currentNodeTemplate)) {
777 private boolean isPropertyValueSimilarBetweenNodeTemplates(String propertyToCheck,
778 Collection<String> entityNodeTemplateIds,
779 Map<String, NodeTemplate> idToNodeTemplate) {
781 Set<Object> propertiesValues = new HashSet<>();
782 Iterator<String> iterator = entityNodeTemplateIds.iterator();
784 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
786 while (iterator.hasNext()) {
787 handlePropertyValue(propertyToCheck, idToNodeTemplate, propertiesValues, iterator.next());
790 return propertiesValues.size() == 1;
793 private void handlePropertyValue(String propertyToCheck,
794 Map<String, NodeTemplate> idToNodeTemplate,
795 Set<Object> propertiesValues, String nodeId) {
796 NodeTemplate startingNodeTemplate = idToNodeTemplate.get(nodeId);
797 if (Objects.isNull(startingNodeTemplate)) {
798 throw new CoreException(
799 new DuplicateResourceIdsInDifferentFilesErrorBuilder(nodeId)
803 addPropertyValue(propertyToCheck, startingNodeTemplate, propertiesValues);
806 private void addPropertyValue(String property,
807 NodeTemplate nodeTemplate,
808 Set<Object> propertiesValues) {
809 propertiesValues.add(
810 isPropertyExistInNodeTemplate(property, nodeTemplate) ? nodeTemplate.getProperties()
811 .get(property) : "");
814 private boolean isPropertyExistInNodeTemplate(String propertyToCheck, NodeTemplate nodeTemplate) {
815 return !(nodeTemplate.getProperties() == null
816 || nodeTemplate.getProperties().get(propertyToCheck) == null);
819 void substitutionServiceTemplateConsolidation(String substituteNodeTemplateId,
820 ServiceTemplate serviceTemplate,
821 ServiceTemplate substitutionServiceTemplate,
822 TranslationContext translationContext) {
824 ConsolidationData consolidationData = translationContext.getConsolidationData();
826 FileComputeConsolidationData fileComputeConsolidationData =
827 translationContext.getConsolidationData().getComputeConsolidationData()
828 .getFileComputeConsolidationData(
829 ToscaUtil.getServiceTemplateFileName(substitutionServiceTemplate));
830 boolean substitutionConsolidationRuleResult =
831 substitutionServiceTemplateConsolidationRule(substitutionServiceTemplate,
832 fileComputeConsolidationData, translationContext);
834 if (substitutionConsolidationRuleResult) {
835 List<UnifiedCompositionData> unifiedCompositionDataList =
836 createSubstitutionUnifiedCompositionDataList(substituteNodeTemplateId,
837 serviceTemplate, consolidationData);
838 unifiedCompositionService
839 .createUnifiedComposition(serviceTemplate, substitutionServiceTemplate,
840 unifiedCompositionDataList, UnifiedCompositionMode.NestedSingleCompute,
843 //The node template does not represent unified VFC but complexVFC
844 //Adding the id in the context for fixing connectivity from/to nested non-unified nodes
845 translationContext.addUnifiedNestedNodeTemplateId(ToscaUtil
846 .getServiceTemplateFileName(serviceTemplate),
847 substituteNodeTemplateId, substituteNodeTemplateId);
849 if (!translationContext.isUnifiedHandledServiceTemplate(substitutionServiceTemplate)) {
850 serviceTemplateConsolidation(substitutionServiceTemplate, translationContext);
855 private boolean substitutionServiceTemplateConsolidationRule(
856 ServiceTemplate nestedServiceTemplate,
857 FileComputeConsolidationData fileComputeConsolidationData,
858 TranslationContext context) {
860 return Objects.nonNull(fileComputeConsolidationData)
861 && isNumberOfComputeTypesLegal(fileComputeConsolidationData)
862 && isNumberOfComputeConsolidationDataPerTypeLegal(
863 fileComputeConsolidationData.getAllTypeComputeConsolidationData().iterator().next())
864 && !isThereMoreThanOneNestedLevel(nestedServiceTemplate, context);
867 private boolean isNumberOfComputeTypesLegal(
868 FileComputeConsolidationData fileComputeConsolidationData) {
869 return fileComputeConsolidationData.getAllTypeComputeConsolidationData().size() == 1;
872 private boolean isNumberOfComputeConsolidationDataPerTypeLegal(
873 TypeComputeConsolidationData typeComputeConsolidationData) {
874 return typeComputeConsolidationData.getAllComputeTemplateConsolidationData().size() == 1;
877 private boolean isThereMoreThanOneNestedLevel(ServiceTemplate nestedServiceTemplate,
878 TranslationContext context) {
879 FileNestedConsolidationData fileNestedConsolidationData = null;
880 String nestedServiceTemplateName = ToscaUtil.getServiceTemplateFileName(nestedServiceTemplate);
881 if (Objects.isNull(nestedServiceTemplateName)) {
885 NestedConsolidationData nestedConsolidationData = context.getConsolidationData()
886 .getNestedConsolidationData();
887 if (Objects.nonNull(nestedConsolidationData)) {
888 fileNestedConsolidationData =
889 nestedConsolidationData.getFileNestedConsolidationData(nestedServiceTemplateName);
892 //Condition to check if there is nested file and if file contains only sub interfaces then
894 return Objects.nonNull(fileNestedConsolidationData)
895 && !ifNestedFileContainsOnlySubInterface(nestedServiceTemplate, context);
898 private boolean ifNestedFileContainsOnlySubInterface(ServiceTemplate serviceTemplate,
899 TranslationContext context) {
900 Map<String, NodeTemplate> nestedNodeTemplateMap =
901 DataModelUtil.getNodeTemplates(serviceTemplate);
903 ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
904 Set<Object> nestedHeatFileNames = nestedNodeTemplateMap.entrySet().stream()
905 .filter(entry -> toscaAnalyzerService.isSubstitutableNodeTemplate(entry.getValue())
906 && toscaAnalyzerService
907 .getSubstituteServiceTemplateName(entry.getKey(), entry.getValue()).isPresent())
908 .map(entry -> toscaAnalyzerService
909 .getSubstituteServiceTemplateName(entry.getKey(), entry.getValue()).get())
910 .collect(Collectors.toSet());
912 if (CollectionUtils.isNotEmpty(nestedHeatFileNames)) {
913 for (Object fileName : nestedHeatFileNames) {
914 String heatFileName = context.getNestedHeatFileName().get(String.valueOf(fileName));
916 if (Objects.nonNull(heatFileName)
917 && !ifAllResourceAreSubInterface(context.getTranslatedServiceTemplates()
918 .get(heatFileName).getTopology_template().getNode_templates().values())) {
927 // Method returns true if all of the resource are sub interface
928 private boolean ifAllResourceAreSubInterface(Collection<NodeTemplate> nodeTemplates) {
929 return nodeTemplates.stream().allMatch(nodeTemplate ->
930 ToscaNodeType.CONTRAILV2_VLAN_SUB_INTERFACE.equals(nodeTemplate.getType()));
933 private List<UnifiedCompositionData> createUnifiedCompositionDataList(
934 ServiceTemplate serviceTemplate,
935 ConsolidationData consolidationData,
936 TypeComputeConsolidationData typeComputeConsolidationData) {
938 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
940 for (ComputeTemplateConsolidationData computeTemplateConsolidationData : typeComputeConsolidationData
941 .getAllComputeTemplateConsolidationData()) {
943 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
944 unifiedCompositionData.setComputeTemplateConsolidationData(computeTemplateConsolidationData);
946 Collection<List<String>> portCollection =
947 computeTemplateConsolidationData.getPorts() == null ? Collections.emptyList()
948 : computeTemplateConsolidationData.getPorts().values();
950 FilePortConsolidationData filePortConsolidationData =
951 consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil
952 .getServiceTemplateFileName(serviceTemplate));
953 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList = new ArrayList<>();
954 portCollection.stream()
955 .flatMap(Collection::stream)
956 .forEach(portId -> setUnifiedCompositionDataWithPortTemplateData(filePortConsolidationData, portId,
957 unifiedCompositionData, subInterfaceTemplateConsolidationDataList));
958 unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList(
959 subInterfaceTemplateConsolidationDataList);
960 unifiedCompositionDataList.add(unifiedCompositionData);
962 return unifiedCompositionDataList;
965 private void setUnifiedCompositionDataWithPortTemplateData(FilePortConsolidationData filePortConsolidationData,
967 UnifiedCompositionData unifiedCompositionData,
968 List<SubInterfaceTemplateConsolidationData>
969 subInterfaceTemplateConsolidationDataList) {
970 if (Objects.isNull(filePortConsolidationData)) {
973 PortTemplateConsolidationData portTemplateConsolidationData =
974 filePortConsolidationData.getPortTemplateConsolidationData(portId);
975 unifiedCompositionData.addPortTemplateConsolidationData(portTemplateConsolidationData);
976 if (portTemplateConsolidationData != null) {
977 portTemplateConsolidationData.copyFlatInto(subInterfaceTemplateConsolidationDataList);
981 private List<UnifiedCompositionData> createSubstitutionUnifiedCompositionDataList(
982 String substituteNodeTemplateId,
983 ServiceTemplate serviceTemplate,
984 ConsolidationData consolidationData) {
985 List<UnifiedCompositionData> unifiedCompositionDataList = new ArrayList<>();
986 FileNestedConsolidationData fileNestedConsolidationData =
987 consolidationData.getNestedConsolidationData()
988 .getFileNestedConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
990 if (Objects.nonNull(fileNestedConsolidationData)) {
991 NestedTemplateConsolidationData nestedTemplateConsolidationData =
992 fileNestedConsolidationData.getNestedTemplateConsolidationData(substituteNodeTemplateId);
993 UnifiedCompositionData unifiedCompositionData = new UnifiedCompositionData();
994 unifiedCompositionData.setNestedTemplateConsolidationData(nestedTemplateConsolidationData);
995 unifiedCompositionDataList.add(unifiedCompositionData);
996 return unifiedCompositionDataList;
999 return unifiedCompositionDataList;
1002 private boolean consolidationPreCondition(
1003 ServiceTemplate serviceTemplate,
1004 ConsolidationData consolidationData,
1005 TypeComputeConsolidationData typeComputeConsolidationData) {
1007 return (isThereMoreThanOneComputeTypeInstance(typeComputeConsolidationData)
1008 && isNumberOfPortsEqualsBetweenComputeNodes(typeComputeConsolidationData)
1009 && isNumberOfPortFromEachTypeLegal(typeComputeConsolidationData)
1010 && isPortTypesEqualsBetweenComputeNodes(typeComputeConsolidationData)
1011 && checkGetAttrBetweenConsolidationDataEntitiesNotFromSameType(serviceTemplate,
1012 typeComputeConsolidationData, consolidationData)
1013 && checkSubInterfaceConsolidationPreCondition(serviceTemplate, consolidationData,
1014 typeComputeConsolidationData));
1018 private boolean isThereMoreThanOneComputeTypeInstance(
1019 TypeComputeConsolidationData typeComputeConsolidationData) {
1020 return typeComputeConsolidationData.getAllComputeNodeTemplateIds().size() > 1;
1023 private boolean isNumberOfPortsEqualsBetweenComputeNodes(
1024 TypeComputeConsolidationData typeComputeConsolidationData) {
1025 int startingNumberOfPorts =
1026 getNumberOfPortsPerCompute(typeComputeConsolidationData
1027 .getAllComputeTemplateConsolidationData().iterator().next());
1029 for (ComputeTemplateConsolidationData compute : typeComputeConsolidationData
1030 .getAllComputeTemplateConsolidationData()) {
1031 if (getNumberOfPortsPerCompute(compute) != startingNumberOfPorts) {
1040 private boolean isNumberOfPortFromEachTypeLegal(
1041 TypeComputeConsolidationData typeComputeConsolidationData) {
1043 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataList =
1044 typeComputeConsolidationData.getAllComputeTemplateConsolidationData();
1046 for (ComputeTemplateConsolidationData computeTemplate : computeTemplateConsolidationDataList) {
1047 Map<String, List<String>> currPortsMap = computeTemplate.getPorts();
1048 if (MapUtils.isEmpty(currPortsMap)) {
1051 for (List<String> portList : currPortsMap.values()) {
1052 if (portList.size() > 1) {
1061 private boolean isPortTypesEqualsBetweenComputeNodes(
1062 TypeComputeConsolidationData typeComputeConsolidationData) {
1063 Set<String> staringPortIds = getPortsIds(
1064 typeComputeConsolidationData.getAllComputeTemplateConsolidationData().iterator().next());
1066 for (ComputeTemplateConsolidationData compute : typeComputeConsolidationData
1067 .getAllComputeTemplateConsolidationData()) {
1068 Set<String> currentPortIds = getPortsIds(compute);
1069 if (!currentPortIds.equals(staringPortIds)) {
1076 private int getNumberOfPortsPerCompute(
1077 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
1078 return getPortsIds(computeTemplateConsolidationData).size();
1081 private Set<String> getPortsIds(
1082 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
1083 return MapUtils.isEmpty(computeTemplateConsolidationData.getPorts()) ? new HashSet<>()
1084 : computeTemplateConsolidationData.getPorts().keySet();
1087 List<String> getPropertiesWithIdenticalVal(UnifiedCompositionEntity entity) {
1090 return getComputePropertiesWithIdenticalVal();
1093 return getComputePropertiesWithIdenticalVal();
1096 return getPortPropertiesWithIdenticalVal();
1099 return new ArrayList<>();
1103 private List<String> getComputePropertiesWithIdenticalVal() {
1104 List<String> propertyWithIdenticalValue = new ArrayList<>();
1105 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_IMAGE);
1106 propertyWithIdenticalValue.add(ToscaConstants.COMPUTE_FLAVOR);
1107 return propertyWithIdenticalValue;
1110 private List<String> getPortPropertiesWithIdenticalVal() {
1111 List<String> propertiesThatNeedToHaveIdenticalVal = new ArrayList<>();
1112 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1113 propertiesThatNeedToHaveIdenticalVal.add(ToscaConstants.MAC_ADDRESS);
1115 propertiesThatNeedToHaveIdenticalVal
1116 .addAll(TranslationContext.getEnrichPortResourceProperties());
1118 return propertiesThatNeedToHaveIdenticalVal;
1121 private List<String> getPortPropertiesThatNeedToHaveSameUsage() {
1122 List<String> propertiesThatNeedToHaveSameUsage = new ArrayList<>();
1123 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_FIXED_IPS);
1124 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.PORT_ALLOWED_ADDRESS_PAIRS);
1125 propertiesThatNeedToHaveSameUsage.add(ToscaConstants.MAC_ADDRESS);
1127 propertiesThatNeedToHaveSameUsage.addAll(TranslationContext.getEnrichPortResourceProperties());
1129 return propertiesThatNeedToHaveSameUsage;