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.impl.resourcetranslation;
19 import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_NESTED_RESOURCE_PROPERTY_NOT_DEFINED;
20 import static org.openecomp.sdc.translator.services.heattotosca.HeatToToscaLogConstants.LOG_UNSUPPORTED_CAPABILITY_CONNECTION;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
26 import java.util.Optional;
27 import java.util.function.Predicate;
29 import org.onap.sdc.tosca.datatypes.model.CapabilityDefinition;
30 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
31 import org.onap.sdc.tosca.datatypes.model.NodeType;
32 import org.onap.sdc.tosca.datatypes.model.RequirementAssignment;
33 import org.onap.sdc.tosca.datatypes.model.RequirementDefinition;
34 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
35 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
36 import org.openecomp.sdc.heat.datatypes.model.Resource;
37 import org.openecomp.sdc.tosca.services.DataModelUtil;
38 import org.openecomp.sdc.tosca.services.ToscaConstants;
39 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
40 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource;
41 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
42 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
43 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
45 public abstract class ResourceConnectionUsingCapabilityHelper extends BaseResourceConnection<CapabilityDefinition> {
47 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) {
61 List<String> substitutionMapping =
62 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
63 .get(connectionPointEntry.getKey());
64 return substitutionMapping.get(0);
68 Map.Entry<String, CapabilityDefinition> getMappedConnectionPointEntry(
69 ServiceTemplate nestedServiceTemplate,
70 Map.Entry<String, CapabilityDefinition> connectionPointEntry) {
71 List<String> substitutionMapping =
72 nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
73 .get(connectionPointEntry.getKey());
74 String mappedNodeTranslatedId = substitutionMapping.get(0);
75 String mappedCapabilityId = substitutionMapping.get(1);
76 NodeTemplate mappedNodeTemplate =
77 nestedServiceTemplate.getTopology_template().getNode_templates()
78 .get(mappedNodeTranslatedId);
79 NodeType substituteNodeType =
80 translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types()
81 .get(mappedNodeTemplate.getType());
82 Optional<CapabilityDefinition> capabilityDefinition =
83 DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId);
84 return new Map.Entry<String, CapabilityDefinition>() {
86 public String getKey() {
87 return mappedCapabilityId;
91 public CapabilityDefinition getValue() {
92 return capabilityDefinition.orElse(null);
96 public CapabilityDefinition setValue(CapabilityDefinition value) {
103 protected List<Map<String, CapabilityDefinition>> getAllConnectionPoints() {
104 List<Map<String, CapabilityDefinition>> exposedRequirementsList = new ArrayList<>();
105 List<Predicate<CapabilityDefinition>> predicates = getPredicatesListForConnectionPoints();
106 Map<String, CapabilityDefinition> capabilities = this.nodeType.getCapabilities();
107 if (capabilities == null) {
108 return exposedRequirementsList;
110 capabilities.entrySet()
112 .filter(entry -> predicates
114 .anyMatch(p -> p.test(entry.getValue())))
116 Map<String, CapabilityDefinition> exposedRequirementsMap = new HashMap<>();
117 exposedRequirementsMap.put(entry.getKey(), entry.getValue());
118 exposedRequirementsList.add(exposedRequirementsMap);
120 return exposedRequirementsList;
123 void addRequirementToConnectResource(Map.Entry<String, CapabilityDefinition> connectionPointEntry,
124 List<String> supportedSourceNodeTypes, String paramName) {
125 Object paramValue = translateTo.getResource().getProperties().get(paramName);
126 if (paramValue == null) {
127 logger.warn(LOG_NESTED_RESOURCE_PROPERTY_NOT_DEFINED, paramName,
128 translateTo.getResourceId(), connectionPointEntry.getKey(), ToscaConstants.CAPABILITY);
132 Map.Entry<String, RequirementDefinition> requirementDefinition =
133 createRequirementDefinition(connectionPointEntry.getKey());
135 Optional<String> sourceResourceId =
136 getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue,
137 supportedSourceNodeTypes);
138 if (sourceResourceId.isPresent()) {
139 Resource sourceResource = HeatToToscaUtil
140 .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(),
141 translateTo.getHeatFileName());
142 Optional<String> translatedSourceNodeId =
143 ResourceTranslationFactory.getInstance(sourceResource)
144 .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
145 translateTo.getHeatOrchestrationTemplate(), sourceResource,
146 sourceResourceId.get(), translateTo.getContext());
147 if (translatedSourceNodeId.isPresent()) {
148 NodeTemplate sourceNodeTemplate = DataModelUtil
149 .getNodeTemplate(translateTo.getServiceTemplate(), translatedSourceNodeId.get());
150 RequirementAssignment requirementAssignment = createRequirementAssignment(
151 requirementDefinition, translateTo.getTranslatedId(), sourceNodeTemplate);
152 ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
153 translateTo.getResource(), sourceResource, translatedSourceNodeId.get(),
154 requirementDefinition.getKey(), requirementAssignment);
156 logger.warn(LOG_UNSUPPORTED_CAPABILITY_CONNECTION, sourceResource.getType(),
157 connectionPointEntry.getKey(),
158 connectionPointEntry.getValue().getType());
161 Optional<TranslatedHeatResource> sharedSourceTranslatedHeatResource =
162 getConnectionTranslatedHeatResourceUsingGetParamFunc(connectionPointEntry, paramName,
163 supportedSourceNodeTypes);
164 if (sharedSourceTranslatedHeatResource.isPresent()) {
165 NodeTemplate sharedSourceNodeTemplate = DataModelUtil
166 .getNodeTemplate(translateTo.getServiceTemplate(),
167 sharedSourceTranslatedHeatResource.get().getTranslatedId());
168 RequirementAssignment requirementAssignment = createRequirementAssignment(
169 requirementDefinition, translateTo.getTranslatedId(), sharedSourceNodeTemplate);
171 ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
172 translateTo.getResource(), sharedSourceTranslatedHeatResource.get().getHeatResource(),
173 sharedSourceTranslatedHeatResource.get().getTranslatedId(),
174 requirementDefinition.getKey(),
175 requirementAssignment);