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 resource the resource
199 * @return true if the resource is of compute type and false otherwise
201 public static boolean isComputeResource(Resource resource) {
202 String resourceType = resource.getType();
203 Map<String, ImplementationConfiguration> supportedComputeResources =
204 TranslationContext.getSupportedConsolidationComputeResources();
205 if (supportedComputeResources.containsKey(resourceType)) {
206 return supportedComputeResources.get(resourceType).isEnable();
212 * Checks if the current HEAT resource if of type port.
214 * @param resource the resource
215 * @return true if the resource is of port type and false otherwise
217 public static boolean isPortResource(Resource resource) {
218 String resourceType = resource.getType();
219 Map<String, ImplementationConfiguration> supportedPortResources =
220 TranslationContext.getSupportedConsolidationPortResources();
221 if (supportedPortResources.containsKey(resourceType)) {
222 return supportedPortResources.get(resourceType).isEnable();
228 * Checks if the current HEAT resource if of type volume.
230 * @param resource the resource
231 * @return true if the resource is of volume type and false otherwise
233 public static boolean isVolumeResource(Resource resource) {
234 String resourceType = resource.getType();
235 return resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_RESOURCE_TYPE.getHeatResource())
236 || resourceType.equals(HeatResourcesTypes.CINDER_VOLUME_ATTACHMENT_RESOURCE_TYPE
243 * @param portNodeTemplateId the port node template id
244 * @return the port type
246 public static String getPortType(String portNodeTemplateId) {
248 if (StringUtils.isBlank(portNodeTemplateId)) {
249 return portNodeTemplateId;
252 String formattedName = portNodeTemplateId.replaceAll(UNDERSCORE + DIGIT_REGEX + "$", "");
254 StringBuilder sb = new StringBuilder();
256 for (String token : formattedName.split(UNDERSCORE)) {
258 if (StringUtils.isNotBlank(token)) {
262 if (count != 2 || (!StringUtils.isBlank(token) && !token.matches(DIGIT_REGEX))) {
263 sb.append(token).append(UNDERSCORE);
267 return portNodeTemplateId.endsWith(UNDERSCORE) ? sb.toString() : sb.substring(0, sb.length() - 1);
271 * Update node template id for the nested node templates in the consolidation data.
273 * @param translateTo the translate to
275 public static void updateNestedNodeTemplateId(TranslateTo translateTo) {
276 TranslationContext context = translateTo.getContext();
277 ServiceTemplate serviceTemplate = translateTo.getServiceTemplate();
278 String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
279 // create nested in consolidation data
280 context.getNestedConsolidationDataHandler()
281 .addConsolidationData(serviceTemplateFileName, context,
282 translateTo.getHeatFileName(), translateTo.getTranslatedId());
286 public static void removeSharedResource(ServiceTemplate serviceTemplate,
287 HeatOrchestrationTemplate heatOrchestrationTemplate,
288 TranslationContext context,
290 String contrailSharedResourceId,
291 String sharedTranslatedResourceId) {
292 Optional<ConsolidationDataHandler> consolidationDataHandler =
293 ConsolidationDataUtil.getConsolidationDataHandler(heatOrchestrationTemplate, context,
294 contrailSharedResourceId);
296 consolidationDataHandler.ifPresent(
297 handler -> handler.removeParamNameFromAttrFuncList(serviceTemplate, heatOrchestrationTemplate,
298 paramName, contrailSharedResourceId, sharedTranslatedResourceId));
301 public static void updateNodeGetAttributeIn(FunctionTranslator functionTranslator, String resourceTranslatedId,
302 String targetResourceId, String targetResourceTranslatedId, String attributeName) {
304 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
307 Optional<ConsolidationDataHandler> consolidationDataHandler =
308 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
309 functionTranslator.getContext(), targetResourceId);
311 consolidationDataHandler.ifPresent(handler -> handler.addNodesGetAttrIn(functionTranslator,
312 resourceTranslatedId, targetResourceId, targetResourceTranslatedId,
313 getToscaPropertyName(functionTranslator), attributeName));
316 public static void updateNodeGetAttributeOut(FunctionTranslator functionTranslator,
317 String targetTranslatedResourceId, String resourceTranslatedId, String attrName) {
319 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
323 Optional<ConsolidationDataHandler> consolidationDataHandler =
324 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
325 functionTranslator.getContext(), functionTranslator.getResourceId());
327 consolidationDataHandler.ifPresent(handler -> handler.addNodesGetAttrOut(functionTranslator,
328 targetTranslatedResourceId, resourceTranslatedId, getToscaPropertyName(functionTranslator), attrName));
331 public static void updateOutputParamGetAttrIn(FunctionTranslator functionTranslator,
332 String targetResourceId, String targetResourceTranslatedId, String propertyName, String attrName) {
333 if (functionTranslator == null || functionTranslator.getServiceTemplate() == null) {
337 Optional<ConsolidationDataHandler> consolidationDataHandler =
338 ConsolidationDataUtil.getConsolidationDataHandler(functionTranslator.getHeatOrchestrationTemplate(),
339 functionTranslator.getContext(), targetResourceId);
341 consolidationDataHandler.ifPresent(handler -> handler.addOutputParamGetAttrIn(functionTranslator,
342 targetResourceId, targetResourceTranslatedId, propertyName, attrName));
345 private static Optional<ConsolidationDataHandler> getConsolidationDataHandler(
346 HeatOrchestrationTemplate heatOrchestrationTemplate, TranslationContext context,
347 String contrailSharedResourceId) {
348 Resource resource = heatOrchestrationTemplate.getResources().get(contrailSharedResourceId);
349 ConsolidationEntityType consolidationEntityType = ConsolidationEntityType.OTHER;
350 consolidationEntityType.setEntityType(resource, resource, context);
351 return context.getConsolidationDataHandler(consolidationEntityType.getSourceEntityType());
354 private static String getToscaPropertyName(FunctionTranslator functionTranslator) {
355 HeatOrchestrationTemplate heatOrchestrationTemplate = functionTranslator.getHeatOrchestrationTemplate();
356 Resource resource = heatOrchestrationTemplate.getResources().get(functionTranslator.getResourceId());
357 String toscaPropertyName = functionTranslator.getPropertyName();
358 if (!HeatToToscaUtil.isNestedResource(resource)) {
359 return HeatToToscaUtil.getToscaPropertyName(functionTranslator.getContext(),
360 resource.getType(), getHeatPropertyName(toscaPropertyName));
362 return toscaPropertyName;
365 private static String getHeatPropertyName(String toscaPropertyName) {
366 if (toscaPropertyName.contains(TRANS_MAPPING_DELIMITER_CHAR)) {
367 return toscaPropertyName.substring(0, toscaPropertyName.indexOf(TRANS_MAPPING_DELIMITER_CHAR));
369 return toscaPropertyName;
372 public static boolean isComputeReferenceToPortId(ComputeTemplateConsolidationData compute,
374 if (MapUtils.isEmpty(compute.getPorts())) {
378 for (List<String> portIdsPerType : compute.getPorts().values()) {
379 if (portIdsPerType.contains(portId)) {