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 java.util.List;
21 import java.util.Optional;
23 import org.apache.commons.collections4.MapUtils;
24 import org.apache.commons.lang3.StringUtils;
25 import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
26 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
27 import org.openecomp.core.utilities.file.FileUtils;
28 import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration;
29 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
30 import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes;
31 import org.openecomp.sdc.heat.datatypes.model.Resource;
32 import org.openecomp.sdc.tosca.services.ToscaUtil;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeConsolidationDataHandler;
36 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
37 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationDataHandler;
38 import org.openecomp.sdc.translator.services.heattotosca.impl.functiontranslation.FunctionTranslator;
40 import static org.openecomp.sdc.translator.services.heattotosca.ConfigConstants.TRANS_MAPPING_DELIMITER_CHAR;
43 * Utility class for consolidation data collection helper methods.
45 public class ConsolidationDataUtil {
47 private static final String UNDERSCORE = "_";
48 private static final String DIGIT_REGEX = "\\d+";
50 private ConsolidationDataUtil() {
51 // prevent instantiation of utility class
54 public static boolean isNodeTemplatePointsToServiceTemplateWithoutNodeTemplates(
55 String nestedNodeTemplateId, String nestedHeatFileName, TranslationContext context) {
56 return context.isServiceTemplateWithoutNodeTemplatesSection(
57 FileUtils.getFileWithoutExtention(nestedHeatFileName))
58 || context.isNodeTemplateIdPointsToStWithoutNodeTemplates(nestedNodeTemplateId);
62 * Update volume information in consolidation data.
64 * @param translateTo {@link TranslateTo} object
65 * @param computeType Local type of the compute node
66 * @param computeNodeTemplateId Node template id of the compute node
67 * @param requirementAssignment RequirementAssignment object
69 public static void updateComputeConsolidationDataVolumes(TranslateTo translateTo,
71 String computeNodeTemplateId,
73 RequirementAssignment requirementAssignment) {
74 ComputeConsolidationDataHandler handler =
75 translateTo.getContext().getComputeConsolidationDataHandler();
76 handler.addVolumeToConsolidationData(
77 translateTo, computeType, computeNodeTemplateId, requirementId, requirementAssignment);
81 * Update port in consolidation data.
83 * @param translateTo the translate to
84 * @param computeNodeType the compute node type
85 * @param portResourceId the port resource id
86 * @param portNodeTemplateId the port node template id
88 public static void updatePortInConsolidationData(TranslateTo translateTo,
89 String computeNodeType,
90 String portResourceId,
91 String portResourceType,
92 String portNodeTemplateId) {
93 TranslationContext translationContext = translateTo.getContext();
94 String computeNodeTemplateId = translateTo.getTranslatedId();
95 String portType = getPortType(portNodeTemplateId);
97 translationContext.getComputeConsolidationDataHandler().addPortToConsolidationData(
98 translateTo, computeNodeType, computeNodeTemplateId, portType, portNodeTemplateId);
100 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
101 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
102 translationContext.getPortConsolidationDataHandler().addConsolidationData(
103 serviceTemplateFileName, portResourceId, portResourceType, portNodeTemplateId);
107 * Update nodes connected in and out for Depends on and connectivity in consolidation data.
109 * @param translateTo the translate to
110 * @param targetResourceId the target resource id
111 * @param nodeTemplateId the source node template id
112 * @param requirementAssignment the requirement assignment
114 public static void updateNodesConnectedData(TranslateTo translateTo, String targetResourceId,
115 Resource targetResource, Resource sourceResource,
116 String nodeTemplateId, String requirementId,
117 RequirementAssignment requirementAssignment) {
118 ConsolidationEntityType consolidationEntityType = ConsolidationEntityType.OTHER;
119 consolidationEntityType.setEntityType(sourceResource, targetResource, translateTo.getContext());
120 // Add resource dependency information in nodesConnectedIn if the target node
121 // is a consolidation entity
122 if (isConsolidationEntity(consolidationEntityType.getTargetEntityType())) {
123 ConsolidationDataUtil.updateNodesConnectedIn(translateTo,
124 nodeTemplateId, consolidationEntityType.getTargetEntityType(), targetResourceId,
125 requirementId, requirementAssignment);
128 //Add resource dependency information in nodesConnectedOut if the source node
129 //is a consolidation entity
130 if (isConsolidationEntity(consolidationEntityType.getSourceEntityType())) {
131 ConsolidationDataUtil.updateNodesConnectedOut(translateTo,
132 requirementAssignment.getNode(), consolidationEntityType.getSourceEntityType(),
133 requirementId, requirementAssignment);
139 private static boolean isConsolidationEntity(ConsolidationEntityType consolidationEntityType) {
140 return ConsolidationEntityType.getSupportedConsolidationEntities().contains(consolidationEntityType);
144 * Update nodes connected from this node in consolidation data.
146 * @param translateTo the translate to
147 * @param nodeTemplateId the node template id of the target node
148 * @param consolidationEntityType the entity type (compute or port)
149 * @param requirementId the requirement id
150 * @param requirementAssignment the requirement assignment
152 public static void updateNodesConnectedOut(TranslateTo translateTo,
153 String nodeTemplateId,
154 ConsolidationEntityType consolidationEntityType,
155 String requirementId,
156 RequirementAssignment requirementAssignment) {
157 TranslationContext translationContext = translateTo.getContext();
158 translationContext.updateRequirementAssignmentIdIndex(
159 ToscaUtil.getServiceTemplateFileName(translateTo.getServiceTemplate()), translateTo.getResourceId(),
162 Optional<ConsolidationDataHandler> consolidationDataHandler =
163 translationContext.getConsolidationDataHandler(consolidationEntityType);
164 consolidationDataHandler.ifPresent(handler -> handler.addNodesConnectedOut(
165 translateTo, nodeTemplateId, requirementId, requirementAssignment));
170 * Update nodes connected from this node in consolidation data.
172 * @param translateTo the translate to
173 * @param sourceNodeTemplateId the node template id of the source node
174 * @param consolidationEntityType Entity type (compute or port)
175 * @param targetResourceId Target Resource Id
176 * @param requirementId Requirement Id
177 * @param requirementAssignment the requirement assignment
179 public static void updateNodesConnectedIn(TranslateTo translateTo, String sourceNodeTemplateId,
180 ConsolidationEntityType consolidationEntityType,
181 String targetResourceId,
182 String requirementId,
183 RequirementAssignment requirementAssignment) {
185 TranslationContext translationContext = translateTo.getContext();
186 Optional<ConsolidationDataHandler> consolidationDataHandler =
187 translationContext.getConsolidationDataHandler(consolidationEntityType);
188 String dependentNodeTemplateId = requirementAssignment.getNode();
189 consolidationDataHandler.ifPresent(
190 handler -> handler.addNodesConnectedIn(translateTo, sourceNodeTemplateId, dependentNodeTemplateId,
191 targetResourceId, requirementId, requirementAssignment));
196 * Checks if the current HEAT resource if of type compute.
198 * @param heatOrchestrationTemplate the heat orchestration template
199 * @param resourceId the resource id
200 * @return true if the resource is of compute type and false otherwise
202 public static boolean isComputeResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
204 String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType();
205 Map<String, ImplementationConfiguration> supportedComputeResources =
206 TranslationContext.getSupportedConsolidationComputeResources();
207 if (supportedComputeResources.containsKey(resourceType)) {
208 return supportedComputeResources.get(resourceType).isEnable();
214 * Checks if the current HEAT resource if of type compute.
216 * @param resource the resource
217 * @return true if the resource is of compute type and false otherwise
219 public static boolean isComputeResource(Resource resource) {
220 String resourceType = resource.getType();
221 Map<String, ImplementationConfiguration> supportedComputeResources =
222 TranslationContext.getSupportedConsolidationComputeResources();
223 if (supportedComputeResources.containsKey(resourceType)) {
224 return supportedComputeResources.get(resourceType).isEnable();
230 * Checks if the current HEAT resource if of type port.
232 * @param heatOrchestrationTemplate the heat orchestration template
233 * @param resourceId the resource id
234 * @return true if the resource is of port type and false otherwise
236 public static boolean isPortResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
238 String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType();
239 Map<String, ImplementationConfiguration> supportedPortResources =
240 TranslationContext.getSupportedConsolidationPortResources();
241 if (supportedPortResources.containsKey(resourceType)) {
242 return supportedPortResources.get(resourceType).isEnable();
248 * Checks if the current HEAT resource if of type port.
250 * @param resource the resource
251 * @return true if the resource is of port type and false otherwise
253 public static boolean isPortResource(Resource resource) {
254 String resourceType = resource.getType();
255 Map<String, ImplementationConfiguration> supportedPortResources =
256 TranslationContext.getSupportedConsolidationPortResources();
257 if (supportedPortResources.containsKey(resourceType)) {
258 return supportedPortResources.get(resourceType).isEnable();
264 * Checks if the current HEAT resource if of type volume.
266 * @param heatOrchestrationTemplate the heat orchestration template
267 * @param resourceId the resource id
268 * @return true if the resource is of volume type and false otherwise
270 public static boolean isVolumeResource(HeatOrchestrationTemplate heatOrchestrationTemplate,
272 String resourceType = heatOrchestrationTemplate.getResources().get(resourceId).getType();
273 return resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource())
274 || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE
279 * Checks if the current HEAT resource if of type volume.
281 * @param resource the resource
282 * @return true if the resource is of volume type and false otherwise
284 public static boolean isVolumeResource(Resource resource) {
285 String resourceType = resource.getType();
286 return resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource())
287 || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE
294 * @param portNodeTemplateId the port node template id
295 * @return the port type
297 public static String getPortType(String portNodeTemplateId) {
299 if (StringUtils.isBlank(portNodeTemplateId)) {
300 return portNodeTemplateId;
303 String formattedName = portNodeTemplateId.replaceAll(UNDERSCORE + DIGIT_REGEX + "$", "");
305 StringBuilder sb = new StringBuilder();
307 for (String token : formattedName.split(UNDERSCORE)) {
309 if (StringUtils.isNotBlank(token)) {
313 if (count != 2 || (!StringUtils.isBlank(token) && !token.matches(DIGIT_REGEX))) {
314 sb.append(token).append(UNDERSCORE);
318 return portNodeTemplateId.endsWith(UNDERSCORE) ? sb.toString() : sb.substring(0, sb.length() - 1);
322 * Update node template id for the nested node templates in the consolidation data.
324 * @param translateTo the translate to
326 public static void updateNestedNodeTemplateId(TranslateTo translateTo) {
327 TranslationContext context = translateTo.getContext();
328 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
329 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
330 // create nested in consolidation data
331 context.getNestedConsolidationDataHandler()
332 .addConsolidationData(serviceTemplateFileName, context,
333 translateTo.getHeatFileName(), translateTo.getTranslatedId());
337 public static void removeSharedResource(ServiceTemplate serviceTemplate,
338 HeatOrchestrationTemplate heatOrchestrationTemplate,
339 TranslationContext context,
341 String contrailSharedResourceId,
342 String sharedTranslatedResourceId) {
343 Optional<ConsolidationDataHandler> consolidationDataHandler =
344 ConsolidationDataUtil.getConsolidationDataHandler(heatOrchestrationTemplate, context,
345 contrailSharedResourceId);
347 consolidationDataHandler.ifPresent(
348 handler -> handler.removeParamNameFromAttrFuncList(serviceTemplate, heatOrchestrationTemplate,
349 paramName, contrailSharedResourceId, sharedTranslatedResourceId));
352 public static void updateNodeGetAttributeIn(FunctionTranslator functionTranslator, String resourceTranslatedId,
353 String targetResourceId, String targetResourceTranslatedId, String attributeName) {
355 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
358 Optional<ConsolidationDataHandler> consolidationDataHandler =
359 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
360 functionTranslator.getContext(), targetResourceId);
362 consolidationDataHandler.ifPresent(handler -> handler.addNodesGetAttrIn(functionTranslator,
363 resourceTranslatedId, targetResourceId, targetResourceTranslatedId,
364 getToscaPropertyName(functionTranslator), attributeName));
367 public static void updateNodeGetAttributeOut(FunctionTranslator functionTranslator,
368 String targetTranslatedResourceId, String resourceTranslatedId, String attrName) {
370 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
374 Optional<ConsolidationDataHandler> consolidationDataHandler =
375 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
376 functionTranslator.getContext(), functionTranslator.getResourceId());
378 consolidationDataHandler.ifPresent(handler -> handler.addNodesGetAttrOut(functionTranslator,
379 targetTranslatedResourceId, resourceTranslatedId, getToscaPropertyName(functionTranslator), attrName));
382 public static void updateOutputParamGetAttrIn(FunctionTranslator functionTranslator,
383 String targetResourceId, String targetResourceTranslatedId, String propertyName, String attrName) {
384 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
388 Optional<ConsolidationDataHandler> consolidationDataHandler =
389 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
390 functionTranslator.getContext(), targetResourceId);
392 consolidationDataHandler.ifPresent(handler -> handler.addOutputParamGetAttrIn(functionTranslator,
393 targetResourceId, targetResourceTranslatedId, propertyName, attrName));
396 private static Optional<ConsolidationDataHandler> getConsolidationDataHandler(
397 HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context,
398 String contrailSharedResourceId) {
399 Resource resource = heatOrchestrationTemplate.getResources().get(contrailSharedResourceId);
400 ConsolidationEntityType consolidationEntityType = ConsolidationEntityType.OTHER;
401 consolidationEntityType.setEntityType(resource, resource, context);
402 return context.getConsolidationDataHandler(consolidationEntityType.getSourceEntityType());
405 private static String getToscaPropertyName(FunctionTranslator functionTranslator) {
406 String toscaPropertyName = functionTranslator.getPropertyName();
407 HeatOrchestrationTemplate heatOrchestrationTemplate = functionTranslator.getHeatOrchestrationTemplate();
408 Resource resource = heatOrchestrationTemplate.getResources().get(functionTranslator.getResourceId());
409 boolean isNestedResource = HeatToToscaUtil.isNestedResource(resource);
410 if (!isNestedResource) {
411 String heatPropertyName = toscaPropertyName;
412 //For handling get_attr in inner levels for complex properties
413 if (toscaPropertyName.contains(TRANS_MAPPING_DELIMITER_CHAR)) {
415 toscaPropertyName.substring(0, toscaPropertyName.indexOf(TRANS_MAPPING_DELIMITER_CHAR));
417 toscaPropertyName = HeatToToscaUtil.getToscaPropertyName(functionTranslator.getContext(),
418 resource.getType(), heatPropertyName);
420 return toscaPropertyName;
423 public static boolean isComputeReferenceToPortId(ComputeTemplateConsolidationData compute,
425 if (MapUtils.isEmpty(compute.getPorts())) {
429 for (List<String> portIdsPerType : compute.getPorts().values()) {
430 if (portIdsPerType.contains(portId)) {