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.DataModelUtil;
33 import org.openecomp.sdc.tosca.services.ToscaUtil;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
36 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeConsolidationDataHandler;
37 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
38 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationDataHandler;
39 import org.openecomp.sdc.translator.services.heattotosca.impl.functiontranslation.FunctionTranslator;
41 import static org.openecomp.sdc.translator.services.heattotosca.ConfigConstants.TRANS_MAPPING_DELIMITER_CHAR;
44 * Utility class for consolidation data collection helper methods.
46 public class ConsolidationDataUtil {
48 private static final String UNDERSCORE = "_";
49 private static final String DIGIT_REGEX = "\\d+";
51 private ConsolidationDataUtil() {
52 // prevent instantiation of utility class
55 public static boolean isNodeTemplatePointsToServiceTemplateWithoutNodeTemplates(
56 String nestedNodeTemplateId, String nestedHeatFileName, TranslationContext context) {
57 return context.isServiceTemplateWithoutNodeTemplatesSection(
58 FileUtils.getFileWithoutExtention(nestedHeatFileName))
59 || context.isNodeTemplateIdPointsToStWithoutNodeTemplates(nestedNodeTemplateId);
63 * Update volume information in consolidation data.
65 * @param translateTo {@link TranslateTo} object
66 * @param computeType Local type of the compute node
67 * @param computeNodeTemplateId Node template id of the compute node
68 * @param requirementAssignment RequirementAssignment object
70 public static void updateComputeConsolidationDataVolumes(TranslateTo translateTo,
72 String computeNodeTemplateId,
74 RequirementAssignment requirementAssignment) {
75 ComputeConsolidationDataHandler handler =
76 translateTo.getContext().getComputeConsolidationDataHandler();
77 handler.addVolumeToConsolidationData(
78 translateTo, computeType, computeNodeTemplateId, requirementId, requirementAssignment);
82 * Update port in consolidation data.
84 * @param translateTo the translate to
85 * @param computeNodeType the compute node type
86 * @param portResourceId the port resource id
87 * @param portNodeTemplateId the port node template id
89 public static void updatePortInConsolidationData(TranslateTo translateTo,
90 String computeNodeType,
91 String portResourceId,
92 String portResourceType,
93 String portNodeTemplateId) {
94 TranslationContext translationContext = translateTo.getContext();
95 String computeNodeTemplateId = translateTo.getTranslatedId();
96 String portType = getPortType(portNodeTemplateId, DataModelUtil.getNamespaceSuffix(computeNodeType));
98 translationContext.getComputeConsolidationDataHandler().addPortToConsolidationData(
99 translateTo, computeNodeType, computeNodeTemplateId, portType, portNodeTemplateId);
101 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
102 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
103 translationContext.getPortConsolidationDataHandler().addConsolidationData(
104 serviceTemplateFileName, portResourceId, portResourceType, portNodeTemplateId, portType);
108 * Update nodes connected in and out for Depends on and connectivity in consolidation data.
110 * @param translateTo the translate to
111 * @param targetResourceId the target resource id
112 * @param nodeTemplateId the source node template id
113 * @param requirementAssignment the requirement assignment
115 public static void updateNodesConnectedData(TranslateTo translateTo, String targetResourceId,
116 Resource targetResource, Resource sourceResource,
117 String nodeTemplateId, String requirementId,
118 RequirementAssignment requirementAssignment) {
119 ConsolidationEntityType consolidationEntityType = ConsolidationEntityType.OTHER;
120 consolidationEntityType.setEntityType(sourceResource, targetResource, translateTo.getContext());
121 // Add resource dependency information in nodesConnectedIn if the target node
122 // is a consolidation entity
123 if (isConsolidationEntity(consolidationEntityType.getTargetEntityType())) {
124 ConsolidationDataUtil.updateNodesConnectedIn(translateTo,
125 nodeTemplateId, consolidationEntityType.getTargetEntityType(), targetResourceId,
126 requirementId, requirementAssignment);
129 //Add resource dependency information in nodesConnectedOut if the source node
130 //is a consolidation entity
131 if (isConsolidationEntity(consolidationEntityType.getSourceEntityType())) {
132 ConsolidationDataUtil.updateNodesConnectedOut(translateTo,
133 requirementAssignment.getNode(), consolidationEntityType.getSourceEntityType(),
134 requirementId, requirementAssignment);
140 private static boolean isConsolidationEntity(ConsolidationEntityType consolidationEntityType) {
141 return ConsolidationEntityType.getSupportedConsolidationEntities().contains(consolidationEntityType);
145 * Update nodes connected from this node in consolidation data.
147 * @param translateTo the translate to
148 * @param nodeTemplateId the node template id of the target node
149 * @param consolidationEntityType the entity type (compute or port)
150 * @param requirementId the requirement id
151 * @param requirementAssignment the requirement assignment
153 public static void updateNodesConnectedOut(TranslateTo translateTo,
154 String nodeTemplateId,
155 ConsolidationEntityType consolidationEntityType,
156 String requirementId,
157 RequirementAssignment requirementAssignment) {
158 TranslationContext translationContext = translateTo.getContext();
159 translationContext.updateRequirementAssignmentIdIndex(
160 ToscaUtil.getServiceTemplateFileName(translateTo.getServiceTemplate()), translateTo.getResourceId(),
163 Optional<ConsolidationDataHandler> consolidationDataHandler =
164 translationContext.getConsolidationDataHandler(consolidationEntityType);
165 consolidationDataHandler.ifPresent(handler -> handler.addNodesConnectedOut(
166 translateTo, nodeTemplateId, requirementId, requirementAssignment));
171 * Update nodes connected from this node in consolidation data.
173 * @param translateTo the translate to
174 * @param sourceNodeTemplateId the node template id of the source node
175 * @param consolidationEntityType Entity type (compute or port)
176 * @param targetResourceId Target Resource Id
177 * @param requirementId Requirement Id
178 * @param requirementAssignment the requirement assignment
180 public static void updateNodesConnectedIn(TranslateTo translateTo, String sourceNodeTemplateId,
181 ConsolidationEntityType consolidationEntityType,
182 String targetResourceId,
183 String requirementId,
184 RequirementAssignment requirementAssignment) {
186 TranslationContext translationContext = translateTo.getContext();
187 Optional<ConsolidationDataHandler> consolidationDataHandler =
188 translationContext.getConsolidationDataHandler(consolidationEntityType);
189 String dependentNodeTemplateId = requirementAssignment.getNode();
190 consolidationDataHandler.ifPresent(
191 handler -> handler.addNodesConnectedIn(translateTo, sourceNodeTemplateId, dependentNodeTemplateId,
192 targetResourceId, requirementId, requirementAssignment));
197 * Checks if the current HEAT resource if of type compute.
199 * @param resource the resource
200 * @return true if the resource is of compute type and false otherwise
202 public static boolean isComputeResource(Resource resource) {
203 String resourceType = resource.getType();
204 Map<String, ImplementationConfiguration> supportedComputeResources =
205 TranslationContext.getSupportedConsolidationComputeResources();
206 if (supportedComputeResources.containsKey(resourceType)) {
207 return supportedComputeResources.get(resourceType).isEnable();
213 * Checks if the current HEAT resource if of type port.
215 * @param resource the resource
216 * @return true if the resource is of port type and false otherwise
218 public static boolean isPortResource(Resource resource) {
219 String resourceType = resource.getType();
220 Map<String, ImplementationConfiguration> supportedPortResources =
221 TranslationContext.getSupportedConsolidationPortResources();
222 if (supportedPortResources.containsKey(resourceType)) {
223 return supportedPortResources.get(resourceType).isEnable();
229 * Checks if the current HEAT resource if of type volume.
231 * @param resource the resource
232 * @return true if the resource is of volume type and false otherwise
234 public static boolean isVolumeResource(Resource resource) {
235 String resourceType = resource.getType();
236 return resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource())
237 || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE
244 * @param portNodeTemplateId the port node template id
245 * @return the port type
247 public static String getPortType(String portNodeTemplateId, String vmType) {
249 if (StringUtils.isBlank(portNodeTemplateId) || !portNodeTemplateId.startsWith(vmType + UNDERSCORE)) {
250 return portNodeTemplateId;
252 String temp = portNodeTemplateId.substring(portNodeTemplateId.indexOf(vmType) + vmType.length());
254 StringBuilder sb = new StringBuilder(vmType + UNDERSCORE);
255 String[] tokens = temp.split(UNDERSCORE);
257 if (tokens.length == 0) {
258 return portNodeTemplateId;
261 for (int i=0; i<tokens.length; i++) {
262 String token = tokens[i];
263 if (token.matches(DIGIT_REGEX) && i != 1) {
265 sb.append(UNDERSCORE);
268 if (StringUtils.isNotBlank(token) && !token.matches(DIGIT_REGEX)) {
270 sb.append(UNDERSCORE);
274 return portNodeTemplateId.endsWith(UNDERSCORE) ? sb.toString() : sb.substring(0, sb.length() - 1);
278 * Update node template id for the nested node templates in the consolidation data.
280 * @param translateTo the translate to
282 public static void updateNestedNodeTemplateId(TranslateTo translateTo) {
283 TranslationContext context = translateTo.getContext();
284 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
285 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
286 // create nested in consolidation data
287 context.getNestedConsolidationDataHandler()
288 .addConsolidationData(serviceTemplateFileName, context,
289 translateTo.getHeatFileName(), translateTo.getTranslatedId());
293 public static void removeSharedResource(ServiceTemplate serviceTemplate,
294 HeatOrchestrationTemplate heatOrchestrationTemplate,
295 TranslationContext context,
297 String contrailSharedResourceId,
298 String sharedTranslatedResourceId) {
299 Optional<ConsolidationDataHandler> consolidationDataHandler =
300 ConsolidationDataUtil.getConsolidationDataHandler(heatOrchestrationTemplate, context,
301 contrailSharedResourceId);
303 consolidationDataHandler.ifPresent(
304 handler -> handler.removeParamNameFromAttrFuncList(serviceTemplate, heatOrchestrationTemplate,
305 paramName, contrailSharedResourceId, sharedTranslatedResourceId));
308 public static void updateNodeGetAttributeIn(FunctionTranslator functionTranslator, String resourceTranslatedId,
309 String targetResourceId, String targetResourceTranslatedId, String attributeName) {
311 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
314 Optional<ConsolidationDataHandler> consolidationDataHandler =
315 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
316 functionTranslator.getContext(), targetResourceId);
318 consolidationDataHandler.ifPresent(handler -> handler.addNodesGetAttrIn(functionTranslator,
319 resourceTranslatedId, targetResourceId, targetResourceTranslatedId,
320 getToscaPropertyName(functionTranslator), attributeName));
323 public static void updateNodeGetAttributeOut(FunctionTranslator functionTranslator,
324 String targetTranslatedResourceId, String resourceTranslatedId, String attrName) {
326 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
330 Optional<ConsolidationDataHandler> consolidationDataHandler =
331 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
332 functionTranslator.getContext(), functionTranslator.getResourceId());
334 consolidationDataHandler.ifPresent(handler -> handler.addNodesGetAttrOut(functionTranslator,
335 targetTranslatedResourceId, resourceTranslatedId, getToscaPropertyName(functionTranslator), attrName));
338 public static void updateOutputParamGetAttrIn(FunctionTranslator functionTranslator,
339 String targetResourceId, String targetResourceTranslatedId, String propertyName, String attrName) {
340 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
344 Optional<ConsolidationDataHandler> consolidationDataHandler =
345 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
346 functionTranslator.getContext(), targetResourceId);
348 consolidationDataHandler.ifPresent(handler -> handler.addOutputParamGetAttrIn(functionTranslator,
349 targetResourceId, targetResourceTranslatedId, propertyName, attrName));
352 private static Optional<ConsolidationDataHandler> getConsolidationDataHandler(
353 HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context,
354 String contrailSharedResourceId) {
355 Resource resource = heatOrchestrationTemplate.getResources().get(contrailSharedResourceId);
356 ConsolidationEntityType consolidationEntityType = ConsolidationEntityType.OTHER;
357 consolidationEntityType.setEntityType(resource, resource, context);
358 return context.getConsolidationDataHandler(consolidationEntityType.getSourceEntityType());
361 private static String getToscaPropertyName(FunctionTranslator functionTranslator) {
362 HeatOrchestrationTemplate heatOrchestrationTemplate = functionTranslator.getHeatOrchestrationTemplate();
363 Resource resource = heatOrchestrationTemplate.getResources().get(functionTranslator.getResourceId());
364 String toscaPropertyName = functionTranslator.getPropertyName();
365 if (!HeatToToscaUtil.isNestedResource(resource)) {
366 return HeatToToscaUtil.getToscaPropertyName(functionTranslator.getContext(),
367 resource.getType(), getHeatPropertyName(toscaPropertyName));
369 return toscaPropertyName;
372 private static String getHeatPropertyName(String toscaPropertyName) {
373 if (toscaPropertyName.contains(TRANS_MAPPING_DELIMITER_CHAR)) {
374 return toscaPropertyName.substring(0, toscaPropertyName.indexOf(TRANS_MAPPING_DELIMITER_CHAR));
376 return toscaPropertyName;
379 public static boolean isComputeReferenceToPortId(ComputeTemplateConsolidationData compute,
381 if (MapUtils.isEmpty(compute.getPorts())) {
385 for (List<String> portIdsPerType : compute.getPorts().values()) {
386 if (portIdsPerType.contains(portId)) {