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.resourcetranslation;
23 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
24 import org.openecomp.sdc.heat.datatypes.model.Resource;
25 import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition;
26 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
27 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
28 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
29 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
30 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
31 import org.openecomp.sdc.tosca.services.DataModelUtil;
32 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource;
34 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
35 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
36 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
38 import java.util.ArrayList;
39 import java.util.HashMap;
40 import java.util.List;
42 import java.util.Optional;
43 import java.util.function.Predicate;
45 public abstract class ResourceConnectionUsingCapabilityHelper
46 extends BaseResourceConnection<CapabilityDefinition> {
47 public ResourceConnectionUsingCapabilityHelper(ResourceTranslationBase resourceTranslationBase,
48 TranslateTo translateTo, FileData nestedFileData,
49 NodeTemplate substitutionNodeTemplate,
51 super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
54 abstract Map.Entry<String, RequirementDefinition> createRequirementDefinition(
55 String capabilityKey);
58 String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate,
60 CapabilityDefinition> connectionPointEntry) {
63 mdcDataDebugMessage.debugEntryMessage(null, null);
65 List<String> substitutionMapping =
66 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
67 .get(connectionPointEntry.getKey());
69 mdcDataDebugMessage.debugExitMessage(null, null);
70 return substitutionMapping.get(0);
74 Map.Entry<String, CapabilityDefinition> getMappedConnectionPointEntry(
75 ServiceTemplate nestedServiceTemplate,
76 Map.Entry<String, CapabilityDefinition> connectionPointEntry) {
79 mdcDataDebugMessage.debugEntryMessage(null, null);
81 List<String> substitutionMapping =
82 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
83 .get(connectionPointEntry.getKey());
84 String mappedNodeTranslatedId = substitutionMapping.get(0);
85 String mappedCapabilityId = substitutionMapping.get(1);
86 NodeTemplate mappedNodeTemplate =
87 nestedServiceTemplate.getTopology_template().getNode_templates()
88 .get(mappedNodeTranslatedId);
89 NodeType substituteNodeType =
90 translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types()
91 .get(mappedNodeTemplate.getType());
92 Optional<CapabilityDefinition> capabilityDefinition =
93 DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId);
95 mdcDataDebugMessage.debugExitMessage(null, null);
96 return new Map.Entry<String, CapabilityDefinition>() {
98 public String getKey() {
99 return mappedCapabilityId;
103 public CapabilityDefinition getValue() {
104 return capabilityDefinition.get();
108 public CapabilityDefinition setValue(CapabilityDefinition value) {
115 protected List<Map<String, CapabilityDefinition>> getAllConnectionPoints() {
118 mdcDataDebugMessage.debugEntryMessage(null, null);
120 List<Map<String, CapabilityDefinition>> exposedRequirementsList = new ArrayList<>();
121 List<Predicate<CapabilityDefinition>> predicates = getPredicatesListForConnectionPoints();
122 Map<String, CapabilityDefinition> capabilities = this.nodeType.getCapabilities();
123 if (capabilities == null) {
124 return exposedRequirementsList;
126 capabilities.entrySet()
128 .filter(entry -> predicates
130 .anyMatch(p -> p.test(entry.getValue())))
132 Map<String, CapabilityDefinition> exposedRequirementsMap = new HashMap<>();
133 exposedRequirementsMap.put(entry.getKey(), entry.getValue());
134 exposedRequirementsList.add(exposedRequirementsMap);
137 mdcDataDebugMessage.debugExitMessage(null, null);
138 return exposedRequirementsList;
141 void addRequirementToConnectResource(Map.Entry<String, CapabilityDefinition> connectionPointEntry,
142 List<String> supportedSourceNodeTypes, String paramName) {
145 mdcDataDebugMessage.debugEntryMessage(null, null);
147 Object paramValue = translateTo.getResource().getProperties().get(paramName);
148 if (paramValue == null) {
149 logger.warn("'" + paramName + "' property is not define in nested resource '"
150 + translateTo.getResourceId() + "' for the nested heat file, therefore, '"
151 + connectionPointEntry.getKey() + "' TOSCA capability will not be connected.");
152 mdcDataDebugMessage.debugExitMessage(null, null);
156 Map.Entry<String, RequirementDefinition> requirementDefinition =
157 createRequirementDefinition(connectionPointEntry.getKey());
159 Optional<String> sourceResourceId =
160 getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue,
161 supportedSourceNodeTypes);
162 if (sourceResourceId.isPresent()) {
163 Resource sourceResource = HeatToToscaUtil
164 .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(),
165 translateTo.getHeatFileName());
166 Optional<String> translatedSourceNodeId =
167 ResourceTranslationFactory.getInstance(sourceResource)
168 .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
169 translateTo.getHeatOrchestrationTemplate(), sourceResource,
170 sourceResourceId.get(), translateTo.getContext());
171 if (translatedSourceNodeId.isPresent()) {
172 NodeTemplate sourceNodeTemplate = DataModelUtil
173 .getNodeTemplate(translateTo.getServiceTemplate(), translatedSourceNodeId.get());
174 RequirementAssignment requirementAssignment = createRequirementAssignment(
175 requirementDefinition, translateTo.getTranslatedId(), sourceNodeTemplate);
176 ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
177 translateTo.getResource(), sourceResource, translatedSourceNodeId.get(),
178 requirementDefinition.getKey(), requirementAssignment);
181 "'" + sourceResource.getType() + "' connection to '" + connectionPointEntry.getKey()
182 + "' capability of type '" + connectionPointEntry.getValue().getType()
183 + "' is not supported/invalid, therefore this connection will be ignored in the "
184 + "TOSCA translation");
187 Optional<TranslatedHeatResource> sharedSourceTranslatedHeatResource =
188 getConnectionTranslatedHeatResourceUsingGetParamFunc(connectionPointEntry, paramName,
189 supportedSourceNodeTypes);
190 if (sharedSourceTranslatedHeatResource.isPresent()) {
191 NodeTemplate sharedSourceNodeTemplate = DataModelUtil
192 .getNodeTemplate(translateTo.getServiceTemplate(),
193 sharedSourceTranslatedHeatResource.get().getTranslatedId());
194 RequirementAssignment requirementAssignment = createRequirementAssignment(
195 requirementDefinition, translateTo.getTranslatedId(), sharedSourceNodeTemplate);
197 ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
198 translateTo.getResource(), sharedSourceTranslatedHeatResource.get().getHeatResource(),
199 sharedSourceTranslatedHeatResource.get().getTranslatedId(),
200 requirementDefinition.getKey(),
201 requirementAssignment);
205 mdcDataDebugMessage.debugExitMessage(null, null);