[SDC-29] rebase continue work to align source
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / ConsolidationDataUtil.java
1 package org.openecomp.sdc.translator.services.heattotosca;
2
3 import org.apache.commons.collections4.MapUtils;
4 import org.apache.commons.lang3.math.NumberUtils;
5 import org.openecomp.sdc.common.errors.CoreException;
6 import org.openecomp.sdc.common.errors.ErrorCode;
7 import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration;
8 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
9 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
10 import org.openecomp.sdc.heat.datatypes.model.Resource;
11 import org.openecomp.sdc.logging.api.Logger;
12 import org.openecomp.sdc.logging.api.LoggerFactory;
13 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
14 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
15 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
16 import org.openecomp.sdc.tosca.services.DataModelUtil;
17 import org.openecomp.sdc.tosca.services.ToscaUtil;
18 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
19 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
20 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeConsolidationData;
21 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
22 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
23 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.EntityConsolidationData;
24 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileComputeConsolidationData;
25 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
26 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
27 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.GetAttrFuncData;
28 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedConsolidationData;
29 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.NestedTemplateConsolidationData;
30 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortConsolidationData;
31 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
32 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.RequirementAssignmentData;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.TypeComputeConsolidationData;
34
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.Iterator;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.Objects;
41
42
43 /**
44  * Utility class for consolidation data collection helper methods.
45  */
46 public class ConsolidationDataUtil {
47
48   protected static Logger logger = (Logger) LoggerFactory.getLogger(ConsolidationDataUtil.class);
49
50   /**
51    * Gets compute template consolidation data.
52    *
53    * @param context               the translation context
54    * @param serviceTemplate       the service template
55    * @param computeNodeType       the compute node type
56    * @param computeNodeTemplateId the compute node template id
57    * @return the compute template consolidation data
58    */
59   public static ComputeTemplateConsolidationData getComputeTemplateConsolidationData(
60       TranslationContext context,
61       ServiceTemplate serviceTemplate,
62       String computeNodeType,
63       String computeNodeTemplateId) {
64
65     ConsolidationData consolidationData = context.getConsolidationData();
66     String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
67
68     ComputeConsolidationData computeConsolidationData = consolidationData
69         .getComputeConsolidationData();
70
71     FileComputeConsolidationData fileComputeConsolidationData = computeConsolidationData
72         .getFileComputeConsolidationData(serviceTemplateFileName);
73
74     if (fileComputeConsolidationData == null) {
75       fileComputeConsolidationData = new FileComputeConsolidationData();
76       computeConsolidationData.setFileComputeConsolidationData(serviceTemplateFileName,
77           fileComputeConsolidationData);
78     }
79
80     TypeComputeConsolidationData typeComputeConsolidationData = fileComputeConsolidationData
81         .getTypeComputeConsolidationData(computeNodeType);
82     if (typeComputeConsolidationData == null) {
83       typeComputeConsolidationData = new TypeComputeConsolidationData();
84       fileComputeConsolidationData.setTypeComputeConsolidationData(computeNodeType,
85           typeComputeConsolidationData);
86     }
87
88     ComputeTemplateConsolidationData computeTemplateConsolidationData =
89         typeComputeConsolidationData.getComputeTemplateConsolidationData(computeNodeTemplateId);
90     if (computeTemplateConsolidationData == null) {
91       computeTemplateConsolidationData = new ComputeTemplateConsolidationData();
92       computeTemplateConsolidationData.setNodeTemplateId(computeNodeTemplateId);
93       typeComputeConsolidationData.setComputeTemplateConsolidationData(computeNodeTemplateId,
94           computeTemplateConsolidationData);
95     }
96
97     return computeTemplateConsolidationData;
98   }
99
100
101   /**
102    * Gets port template consolidation data.
103    *
104    * @param context            the context
105    * @param serviceTemplate    the service template
106    * @param portNodeTemplateId the port node template id
107    * @return the port template consolidation data
108    */
109   public static PortTemplateConsolidationData getPortTemplateConsolidationData(
110       TranslationContext context,
111       ServiceTemplate serviceTemplate,
112       String portNodeTemplateId) {
113
114     ConsolidationData consolidationData = context.getConsolidationData();
115     String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
116
117     PortConsolidationData portConsolidationData = consolidationData.getPortConsolidationData();
118
119     FilePortConsolidationData filePortConsolidationData = portConsolidationData
120         .getFilePortConsolidationData(serviceTemplateFileName);
121
122     if (filePortConsolidationData == null) {
123       filePortConsolidationData = new FilePortConsolidationData();
124       portConsolidationData.setFilePortConsolidationData(serviceTemplateFileName,
125           filePortConsolidationData);
126     }
127
128     PortTemplateConsolidationData portTemplateConsolidationData =
129         filePortConsolidationData.getPortTemplateConsolidationData(portNodeTemplateId);
130     if (portTemplateConsolidationData == null) {
131       portTemplateConsolidationData = new PortTemplateConsolidationData();
132       portTemplateConsolidationData.setNodeTemplateId(portNodeTemplateId);
133       filePortConsolidationData.setPortTemplateConsolidationData(portNodeTemplateId,
134           portTemplateConsolidationData);
135     }
136
137     return portTemplateConsolidationData;
138   }
139
140
141   /**
142    * Gets nested template consolidation data.
143    *
144    * @param context              the context
145    * @param serviceTemplate      the service template
146    * @param nestedHeatFileName
147    *@param nestedNodeTemplateId the nested node template id  @return the nested template consolidation data
148    */
149   public static NestedTemplateConsolidationData getNestedTemplateConsolidationData(
150       TranslationContext context,
151       ServiceTemplate serviceTemplate,
152       String nestedHeatFileName, String nestedNodeTemplateId) {
153
154     if(isNestedResourceIdOccuresInDifferentNestedFiles(context, nestedHeatFileName,
155         nestedNodeTemplateId)){
156       throw new CoreException((new ErrorCode.ErrorCodeBuilder())
157           .withMessage("Resource with id "
158               + nestedNodeTemplateId + " occures more than once in different addOn "
159               + "files").build());
160     }
161
162     ConsolidationData consolidationData = context.getConsolidationData();
163     String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
164
165     NestedConsolidationData nestedConsolidationData = consolidationData
166         .getNestedConsolidationData();
167
168     FileNestedConsolidationData fileNestedConsolidationData = nestedConsolidationData
169         .getFileNestedConsolidationData(serviceTemplateFileName);
170
171     if (fileNestedConsolidationData == null) {
172       fileNestedConsolidationData = new FileNestedConsolidationData();
173       nestedConsolidationData.setFileNestedConsolidationData(serviceTemplateFileName,
174           fileNestedConsolidationData);
175     }
176
177     NestedTemplateConsolidationData nestedTemplateConsolidationData =
178         fileNestedConsolidationData.getNestedTemplateConsolidationData(nestedNodeTemplateId);
179     if (nestedTemplateConsolidationData == null) {
180       nestedTemplateConsolidationData = new NestedTemplateConsolidationData();
181       nestedTemplateConsolidationData.setNodeTemplateId(nestedNodeTemplateId);
182       fileNestedConsolidationData.setNestedTemplateConsolidationData(nestedNodeTemplateId,
183           nestedTemplateConsolidationData);
184     }
185
186     return nestedTemplateConsolidationData;
187   }
188
189   private static boolean isNestedResourceIdOccuresInDifferentNestedFiles(TranslationContext context,
190                                                                          String nestedHeatFileName,
191                                                                          String nestedNodeTemplateId) {
192     return context.getAllTranslatedResourceIdsFromDiffNestedFiles(nestedHeatFileName).contains(nestedNodeTemplateId);
193   }
194
195   /**
196    * Update group id information in consolidation data.
197    *
198    * @param entityConsolidationData Entity consolidation data (Port/Compute)
199    * @param translatedGroupId       Group id of which compute node is a part
200    */
201   public static void updateGroupIdInConsolidationData(EntityConsolidationData
202                                                           entityConsolidationData,
203                                                       String translatedGroupId) {
204     if (entityConsolidationData.getGroupIds() == null) {
205       entityConsolidationData.setGroupIds(new ArrayList<>());
206     }
207     entityConsolidationData.getGroupIds().add(translatedGroupId);
208   }
209
210   /**
211    * Update volume information in consolidation data.
212    *
213    * @param translateTo           {@link TranslateTo} object
214    * @param computeType           Local type of the compute node
215    * @param computeNodeTemplateId Node template id of the compute node
216    * @param requirementAssignment RequirementAssignment object
217    */
218   public static void updateComputeConsolidationDataVolumes(TranslateTo translateTo,
219                                                            String computeType,
220                                                            String computeNodeTemplateId,
221                                                            String requirementId,
222                                                            RequirementAssignment
223                                                                requirementAssignment) {
224     TranslationContext translationContext = translateTo.getContext();
225     ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
226     ComputeTemplateConsolidationData computeTemplateConsolidationData =
227         getComputeTemplateConsolidationData(translationContext, serviceTemplate, computeType,
228             computeNodeTemplateId);
229     computeTemplateConsolidationData.addVolume(requirementId, requirementAssignment);
230   }
231
232
233   /**
234    * Update port in consolidation data.
235    *
236    * @param translateTo        the translate to
237    * @param computeNodeType    the compute node type
238    * @param portNodeTemplateId the port node template id
239    */
240   public static void updatePortInConsolidationData(TranslateTo translateTo,
241                                                    String computeNodeType,
242                                                    String portNodeTemplateId) {
243     TranslationContext translationContext = translateTo.getContext();
244     ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
245     ComputeTemplateConsolidationData computeTemplateConsolidationData =
246         getComputeTemplateConsolidationData(translationContext, serviceTemplate, computeNodeType,
247             translateTo.getTranslatedId());
248     computeTemplateConsolidationData.addPort(getPortType(portNodeTemplateId), portNodeTemplateId);
249     // create port in consolidation data
250     getPortTemplateConsolidationData(translationContext, serviceTemplate, portNodeTemplateId);
251   }
252
253   /**
254    * Update nodes connected in and out for Depends on and connectivity in consolidation data.
255    *
256    * @param translateTo           the translate to
257    * @param targetResourceId      the target resource id
258    * @param nodeTemplateId        the source node template id
259    * @param requirementAssignment the requirement assignment
260    */
261   public static void updateNodesConnectedData(TranslateTo translateTo, String targetResourceId,
262                                               Resource targetResource, Resource sourceResource,
263                                               String nodeTemplateId, String requirementId,
264                                               RequirementAssignment requirementAssignment) {
265     ConsolidationEntityType consolidationEntityType = ConsolidationEntityType.OTHER;
266     HeatOrchestrationTemplate heatOrchestrationTemplate = translateTo
267         .getHeatOrchestrationTemplate();
268     TranslationContext translationContext = translateTo.getContext();
269
270     consolidationEntityType.setEntityType(heatOrchestrationTemplate, sourceResource,
271         targetResource, translateTo.getContext());
272     // Add resource dependency information in nodesConnectedIn if the target node
273     // is a consolidation entity
274     if (isConsolidationEntity(consolidationEntityType.getTargetEntityType())
275         && HeatToToscaUtil
276         .isValidDependsOnCandidate(heatOrchestrationTemplate, sourceResource,
277             targetResource, consolidationEntityType, translationContext)) {
278       ConsolidationDataUtil.updateNodesConnectedIn(translateTo,
279           nodeTemplateId, consolidationEntityType.getTargetEntityType(), targetResourceId,
280           requirementId, requirementAssignment);
281     }
282
283     //Add resource dependency information in nodesConnectedOut if the source node
284     //is a consolidation entity
285     if (isConsolidationEntity(consolidationEntityType.getSourceEntityType())
286         && HeatToToscaUtil
287         .isValidDependsOnCandidate(heatOrchestrationTemplate, sourceResource,
288             targetResource, consolidationEntityType, translationContext)) {
289       ConsolidationDataUtil.updateNodesConnectedOut(translateTo,
290           requirementAssignment.getNode(), consolidationEntityType.getSourceEntityType(),
291           requirementId, requirementAssignment);
292     }
293   }
294
295
296   private static boolean isConsolidationEntity(ConsolidationEntityType consolidationEntityType) {
297     return (consolidationEntityType == ConsolidationEntityType.COMPUTE
298         || consolidationEntityType == ConsolidationEntityType.PORT
299         || consolidationEntityType == ConsolidationEntityType.NESTED
300         || consolidationEntityType == ConsolidationEntityType.VFC_NESTED);
301   }
302
303   /**
304    * Update nodes connected from this node in consolidation data.
305    *
306    * @param translateTo             the translate to
307    * @param nodeTemplateId          the node template id of the target node
308    * @param consolidationEntityType the entity type (compute or port)
309    * @param requirementId           the requirement id
310    * @param requirementAssignment   the requirement assignment
311    */
312   public static void updateNodesConnectedOut(TranslateTo translateTo,
313                                              String nodeTemplateId,
314                                              ConsolidationEntityType consolidationEntityType,
315                                              String requirementId,
316                                              RequirementAssignment requirementAssignment) {
317     EntityConsolidationData entityConsolidationData = null;
318     TranslationContext translationContext = translateTo.getContext();
319     ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
320     RequirementAssignmentData requirementAssignmentData = new RequirementAssignmentData(
321         requirementId, requirementAssignment);
322
323     if (consolidationEntityType == ConsolidationEntityType.COMPUTE) {
324       String nodeType = DataModelUtil.getNodeTemplate(serviceTemplate, translateTo
325           .getTranslatedId()).getType();
326       entityConsolidationData = getComputeTemplateConsolidationData(translationContext,
327           serviceTemplate, nodeType, translateTo.getTranslatedId());
328     } else if (consolidationEntityType == ConsolidationEntityType.PORT) {
329       entityConsolidationData = getPortTemplateConsolidationData(translationContext,
330           serviceTemplate, translateTo.getTranslatedId());
331     } else if (consolidationEntityType == ConsolidationEntityType.VFC_NESTED
332         || consolidationEntityType == ConsolidationEntityType.NESTED) {
333       //ConnectedOut data for nested is not updated
334       return;
335     }
336
337     if (entityConsolidationData.getNodesConnectedOut() == null) {
338       entityConsolidationData.setNodesConnectedOut(new HashMap<>());
339     }
340
341     entityConsolidationData.getNodesConnectedOut()
342         .computeIfAbsent(nodeTemplateId, k -> new ArrayList<>())
343         .add(requirementAssignmentData);
344   }
345
346   /**
347    * Update nodes connected from this node in consolidation data.
348    *
349    * @param translateTo             the translate to
350    * @param sourceNodeTemplateId    the node template id of the source node
351    * @param consolidationEntityType Entity type (compute or port)
352    * @param requirementId           Requirement Id
353    * @param requirementAssignment   the requirement assignment
354    */
355   public static void updateNodesConnectedIn(TranslateTo translateTo, String sourceNodeTemplateId,
356                                             ConsolidationEntityType consolidationEntityType,
357                                             String targetResourceId,
358                                             String requirementId,
359                                             RequirementAssignment requirementAssignment) {
360     EntityConsolidationData entityConsolidationData = null;
361     TranslationContext translationContext = translateTo.getContext();
362     ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
363     RequirementAssignmentData requirementAssignmentData = new RequirementAssignmentData(
364         requirementId, requirementAssignment);
365     String dependentNodeTemplateId = requirementAssignment.getNode();
366     if (consolidationEntityType == ConsolidationEntityType.COMPUTE) {
367       NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
368           dependentNodeTemplateId);
369       String nodeType = null;
370       if (Objects.isNull(computeNodeTemplate)) {
371         Resource targetResource =
372             translateTo.getHeatOrchestrationTemplate().getResources().get(targetResourceId);
373         NameExtractor nodeTypeNameExtractor =
374             translateTo.getContext().getNameExtractorImpl(targetResource.getType());
375         nodeType =
376             nodeTypeNameExtractor.extractNodeTypeName(translateTo.getHeatOrchestrationTemplate()
377                     .getResources().get(dependentNodeTemplateId),
378                 dependentNodeTemplateId, dependentNodeTemplateId);
379       } else {
380         nodeType = computeNodeTemplate.getType();
381       }
382
383       entityConsolidationData = getComputeTemplateConsolidationData(translationContext,
384           serviceTemplate, nodeType, dependentNodeTemplateId);
385     } else if (consolidationEntityType == ConsolidationEntityType.PORT) {
386       entityConsolidationData = getPortTemplateConsolidationData(translationContext,
387           serviceTemplate, dependentNodeTemplateId);
388     } else if (consolidationEntityType == ConsolidationEntityType.NESTED
389         || consolidationEntityType == ConsolidationEntityType.VFC_NESTED) {
390       entityConsolidationData = getNestedTemplateConsolidationData(translationContext,
391           serviceTemplate, translateTo.getHeatFileName(), dependentNodeTemplateId);
392     }
393
394     if (entityConsolidationData.getNodesConnectedIn() == null) {
395       entityConsolidationData.setNodesConnectedIn(new HashMap<>());
396     }
397
398     entityConsolidationData.getNodesConnectedIn()
399         .computeIfAbsent(sourceNodeTemplateId, k -> new ArrayList<>())
400         .add(requirementAssignmentData);
401
402   }
403
404   /**
405    * Checks if the current HEAT resource if of type compute.
406    *
407    * @param heatOrchestrationTemplate the heat orchestration template
408    * @param resourceId                the resource id
409    * @return true if the resource is of compute type and false otherwise
410    */
411   public static boolean isComputeResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
412                                           String resourceId) {
413     String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType();
414     Map<String, ImplementationConfiguration> supportedComputeResources = TranslationContext
415         .getSupportedConsolidationComputeResources();
416     if (supportedComputeResources.containsKey(resourceType)) {
417       if (supportedComputeResources.get(resourceType).isEnable()) {
418         return true;
419       }
420       return false;
421     }
422     return false;
423   }
424
425   /**
426    * Checks if the current HEAT resource if of type compute.
427    *
428    * @param resource                the resource
429    * @return true if the resource is of compute type and false otherwise
430    */
431   public static boolean isComputeResource(Resource resource) {
432     String resourceType = resource.getType();
433     Map<String, ImplementationConfiguration> supportedComputeResources = TranslationContext
434         .getSupportedConsolidationComputeResources();
435     if (supportedComputeResources.containsKey(resourceType)) {
436       if (supportedComputeResources.get(resourceType).isEnable()) {
437         return true;
438       }
439       return false;
440     }
441     return false;
442   }
443
444   /**
445    * Checks if the current HEAT resource if of type port.
446    *
447    * @param heatOrchestrationTemplate the heat orchestration template
448    * @param resourceId                the resource id
449    * @return true if the resource is of port type and false otherwise
450    */
451   public static boolean isPortResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
452                                        String resourceId) {
453     String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType();
454     Map<String, ImplementationConfiguration> supportedPortResources = TranslationContext
455         .getSupportedConsolidationPortResources();
456     if (supportedPortResources.containsKey(resourceType)) {
457       if (supportedPortResources.get(resourceType).isEnable()) {
458         return true;
459       }
460       return false;
461     }
462     return false;
463   }
464
465   /**
466    * Checks if the current HEAT resource if of type port.
467    *
468    * @param resource                the resource
469    * @return true if the resource is of port type and false otherwise
470    */
471   public static boolean isPortResource(Resource resource) {
472     String resourceType = resource.getType();
473     Map<String, ImplementationConfiguration> supportedPortResources = TranslationContext
474         .getSupportedConsolidationPortResources();
475     if (supportedPortResources.containsKey(resourceType)) {
476       if (supportedPortResources.get(resourceType).isEnable()) {
477         return true;
478       }
479       return false;
480     }
481     return false;
482   }
483
484   /**
485    * Checks if the current HEAT resource if of type volume.
486    *
487    * @param heatOrchestrationTemplate the heat orchestration template
488    * @param resourceId                the resource id
489    * @return true if the resource is of volume type and false otherwise
490    */
491   public static boolean isVolumeResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
492                                          String resourceId) {
493     String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType();
494     return (resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource())
495         || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE
496         .getHeatResource()));
497   }
498
499   /**
500    * Checks if the current HEAT resource if of type volume.
501    *
502    * @param resource                the resource
503    * @return true if the resource is of volume type and false otherwise
504    */
505   public static boolean isVolumeResource(Resource resource) {
506     String resourceType = resource.getType();
507     return (resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource())
508         || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE
509         .getHeatResource()));
510   }
511
512   /**
513    * Gets port type.
514    *
515    * @param portNodeTemplateId the port node template id
516    * @return the port type
517    */
518   public static String getPortType(String portNodeTemplateId) {
519     String[] portSplitArr = portNodeTemplateId.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
520     String finalValue = "";
521     if (NumberUtils.isNumber(portSplitArr[portSplitArr.length - 1])) {
522       for (String id : portSplitArr) {
523         finalValue = finalValue + id;
524       }
525       while (finalValue.length() > 0) {
526         if (Character.isLetter(finalValue.charAt(finalValue.length() - 1))) {
527           break;
528         }
529         finalValue = finalValue.substring(0, finalValue.length() - 1);
530       }
531     } else {
532       for (String id : portSplitArr) {
533         if (!NumberUtils.isNumber(id)) {
534           finalValue = finalValue + id;
535         }
536       }
537     }
538     return finalValue;
539   }
540
541   /**
542    * Update node template id for the nested node templates in the consolidation data.
543    *
544    * @param translateTo the translate to
545    */
546   public static void updateNestedNodeTemplateId(TranslateTo translateTo) {
547     TranslationContext context = translateTo.getContext();
548     ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
549     getNestedTemplateConsolidationData(
550         context, serviceTemplate, translateTo.getHeatFileName(), translateTo.getTranslatedId());
551   }
552
553   public static void removeSharedResource(ServiceTemplate serviceTemplate,
554                                           HeatOrchestrationTemplate heatOrchestrationTemplate,
555                                           TranslationContext context,
556                                           String paramName,
557                                           String contrailSharedResourceId,
558                                           String sharedTranslatedResourceId) {
559     if (ConsolidationDataUtil.isComputeResource(heatOrchestrationTemplate,
560         contrailSharedResourceId)) {
561       NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
562           sharedTranslatedResourceId);
563       EntityConsolidationData entityConsolidationData = getComputeTemplateConsolidationData(
564           context, serviceTemplate, nodeTemplate.getType(), sharedTranslatedResourceId);
565       List<GetAttrFuncData> getAttrFuncDataList = entityConsolidationData
566           .getOutputParametersGetAttrIn();
567       removeParamNameFromAttrFuncList(paramName, getAttrFuncDataList);
568     }
569     if (ConsolidationDataUtil.isPortResource(heatOrchestrationTemplate,
570         contrailSharedResourceId)) {
571       NodeTemplate nodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate,
572           sharedTranslatedResourceId);
573       EntityConsolidationData entityConsolidationData = getPortTemplateConsolidationData(context,
574           serviceTemplate, sharedTranslatedResourceId);
575       List<GetAttrFuncData> getAttrFuncDataList = entityConsolidationData
576           .getOutputParametersGetAttrIn();
577       removeParamNameFromAttrFuncList(paramName, getAttrFuncDataList);
578     }
579   }
580
581   private static void removeParamNameFromAttrFuncList(String paramName,
582                                                       List<GetAttrFuncData> getAttrFuncDataList) {
583     Iterator<GetAttrFuncData> itr = getAttrFuncDataList.iterator();
584     while (itr.hasNext()) {
585       GetAttrFuncData getAttrFuncData = itr.next();
586       if (paramName.equals(getAttrFuncData.getFieldName())) {
587         itr.remove();
588       }
589     }
590   }
591
592   public static void updateNodeGetAttributeIn(EntityConsolidationData entityConsolidationData,
593                                               String nodeTemplateId, String propertyName,
594                                               String attributeName) {
595     GetAttrFuncData getAttrFuncData = new GetAttrFuncData();
596     getAttrFuncData.setFieldName(propertyName);
597     getAttrFuncData.setAttributeName(attributeName);
598     entityConsolidationData.addNodesGetAttrIn(nodeTemplateId, getAttrFuncData);
599
600   }
601
602   public static void updateNodeGetAttributeOut(EntityConsolidationData entityConsolidationData,
603                                                String nodeTemplateId, String propertyName,
604                                                String attributeName) {
605     GetAttrFuncData getAttrFuncData = new GetAttrFuncData();
606     getAttrFuncData.setFieldName(propertyName);
607     getAttrFuncData.setAttributeName(attributeName);
608     entityConsolidationData.addNodesGetAttrOut(nodeTemplateId, getAttrFuncData);
609
610   }
611
612   public static void updateOutputGetAttributeInConsolidationData(EntityConsolidationData
613                                                                      entityConsolidationData,
614                                                                  String outputParameterName,
615                                                                  String attributeName) {
616
617
618     GetAttrFuncData getAttrFuncData = new GetAttrFuncData();
619     getAttrFuncData.setFieldName(outputParameterName);
620     getAttrFuncData.setAttributeName(attributeName);
621     entityConsolidationData.addOutputParamGetAttrIn(getAttrFuncData);
622
623   }
624
625   public static boolean isComputeReferenceToPortId(ComputeTemplateConsolidationData compute,
626                                                    String portId) {
627     if (MapUtils.isEmpty(compute.getPorts())) {
628       return false;
629     }
630     for (List<String> portIdsPerType : compute.getPorts().values()) {
631       if (portIdsPerType.contains(portId)) {
632         return true;
633       }
634     }
635     return false;
636   }
637
638 }