2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.translator.services.heattotosca.impl;
23 import org.apache.commons.collections4.MapUtils;
24 import org.openecomp.core.utilities.yaml.YamlUtil;
25 import org.openecomp.sdc.common.errors.CoreException;
26 import org.openecomp.sdc.common.errors.ErrorCategory;
27 import org.openecomp.sdc.common.errors.ErrorCode;
28 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
29 import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate;
30 import org.openecomp.sdc.heat.datatypes.model.Resource;
31 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
32 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
33 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
34 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
35 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
36 import org.openecomp.sdc.tosca.services.DataModelUtil;
37 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
38 import org.openecomp.sdc.translator.services.heattotosca.errors.TranslatorErrorCodes;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
42 import java.util.List;
44 import java.util.Objects;
45 import java.util.Optional;
46 import java.util.function.Predicate;
48 abstract class BaseResourceConnection<T> {
49 protected static Logger logger =
50 LoggerFactory.getLogger(ResourceTranslationCinderVolumeAttachmentImpl.class);
51 protected TranslateTo translateTo;
52 FileData nestedFileData;
53 NodeTemplate substitutionNodeTemplate;
55 ResourceTranslationBase resourceTranslationBase;
57 BaseResourceConnection(ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo,
58 FileData nestedFileData, NodeTemplate substitutionNodeTemplate,
60 this.translateTo = translateTo;
61 this.nestedFileData = nestedFileData;
62 this.substitutionNodeTemplate = substitutionNodeTemplate;
63 this.nodeType = nodeType;
64 this.resourceTranslationBase = resourceTranslationBase;
67 abstract boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate);
69 abstract List<Predicate<T>> getPredicatesListForConnectionPoints();
71 abstract Optional<List<String>> getConnectorParamName(String heatResourceId,
72 Resource heatResource,
73 HeatOrchestrationTemplate
74 nestedHeatOrchestrationTemplate);
76 abstract String getDesiredResourceType();
78 abstract String getTranslatedResourceIdFromSubstitutionMapping(
79 ServiceTemplate nestedServiceTemplate, Map.Entry<String, T> entry);
81 abstract void addRequirementToConnectResources(Map.Entry<String, T> entry,
82 List<String> paramNames);
84 abstract List<Map<String, T>> getAllConnectionPoints();
87 ServiceTemplate nestedServiceTemplate = translateTo.getContext().getTranslatedServiceTemplates()
88 .get(translateTo.getResource().getType());
89 List<String> paramNames = null;
90 HeatOrchestrationTemplate nestedHeatOrchestrationTemplate = new YamlUtil()
91 .yamlToObject(translateTo.getContext().getFileContent(nestedFileData.getFile()),
92 HeatOrchestrationTemplate.class);
93 List<Map<String, T>> exposedConnectionPoints = getAllConnectionPoints();
94 for (Map<String, T> connectionPointsMap : exposedConnectionPoints) {
95 for (Map.Entry<String, T> entry : connectionPointsMap.entrySet()) {
96 String translatedResourceId =
97 getTranslatedResourceIdFromSubstitutionMapping(nestedServiceTemplate, entry);
98 NodeTemplate nodeTemplate = nestedServiceTemplate.getTopology_template().getNode_templates()
99 .get(translatedResourceId);
100 if (!isDesiredNodeTemplateType(nodeTemplate)) {
103 paramNames = createResourcesConnection(translatedResourceId, paramNames,
104 nestedHeatOrchestrationTemplate, entry);
109 private List<String> createResourcesConnection(String translatedResourceId,
110 List<String> paramNames,
111 HeatOrchestrationTemplate
112 nestedHeatOrchestrationTemplate,
113 Map.Entry<String, T> entry) {
114 List<String> params = paramNames;
115 Optional<List<Map.Entry<String, Resource>>> heatResources =
116 getResourceByTranslatedResourceId(translatedResourceId, nestedHeatOrchestrationTemplate);
117 if (heatResources.isPresent()) {
119 addRequirementAndGetConnectorParamsFromResourceProperties(nestedHeatOrchestrationTemplate,
120 entry, params, heatResources.get());
125 private List<String> addRequirementAndGetConnectorParamsFromResourceProperties(
126 HeatOrchestrationTemplate nestedHeatOrchestrationTemplate, Map.Entry<String, T> entry,
127 List<String> params, List<Map.Entry<String, Resource>> heatResources) {
128 Resource heatResource;
129 for (Map.Entry<String, Resource> resourceEntry : heatResources) {
130 heatResource = resourceEntry.getValue();
131 if (!MapUtils.isEmpty(heatResource.getProperties())) {
132 Optional<List<String>> connectorParamName =
133 getConnectorParamName(resourceEntry.getKey(), heatResource,
134 nestedHeatOrchestrationTemplate);
135 if (!connectorParamName.isPresent()) {
138 params = connectorParamName.get();
141 Objects.requireNonNull(params);
142 addRequirementToConnectResources(entry, params);
147 protected Optional<List<Map.Entry<String, Resource>>> getResourceByTranslatedResourceId(
148 String translatedResourceId, HeatOrchestrationTemplate nestedHeatOrchestrationTemplate) {
149 Optional<List<Map.Entry<String, Resource>>> resourceByTranslatedResourceId =
150 resourceTranslationBase.getResourceByTranslatedResourceId(nestedFileData.getFile(),
151 nestedHeatOrchestrationTemplate, translatedResourceId, translateTo,
152 getDesiredResourceType());
153 if (!resourceByTranslatedResourceId.isPresent()) {
154 throw new CoreException((new ErrorCode.ErrorCodeBuilder()).withMessage(
155 "Failed to get original resource from heat for translate resource id '"
156 + translatedResourceId + "'")
157 .withId(TranslatorErrorCodes.HEAT_TO_TOSCA_MAPPING_COLLISION)
158 .withCategory(ErrorCategory.APPLICATION).build());
160 return resourceByTranslatedResourceId;
163 void createRequirementAssignment(Map.Entry<String, RequirementDefinition> entry, String node,
164 NodeTemplate nodeTemplate) {
165 if (Objects.nonNull(node)) {
166 RequirementAssignment requirementAssignment;
167 requirementAssignment = new RequirementAssignment();
168 requirementAssignment.setRelationship(entry.getValue().getRelationship());
169 requirementAssignment.setCapability(entry.getValue().getCapability());
170 requirementAssignment.setNode(node);
171 DataModelUtil.addRequirementAssignment(nodeTemplate, entry.getKey(), requirementAssignment);