[SDC-29] Amdocs OnBoard 1707 initial commit.
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / impl / resourcetranslation / ResourceConnectionUsingCapabilityHelper.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.translator.services.heattotosca.impl.resourcetranslation;
22
23 import org.openecomp.sdc.common.utils.CommonUtil;
24 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
25 import org.openecomp.sdc.heat.datatypes.model.Resource;
26 import org.openecomp.sdc.tosca.datatypes.model.CapabilityDefinition;
27 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
28 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
29 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
30 import org.openecomp.sdc.tosca.datatypes.model.RequirementDefinition;
31 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
32 import org.openecomp.sdc.tosca.services.DataModelUtil;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslatedHeatResource;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ConsolidationData;
36 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
37 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
38 import org.openecomp.sdc.translator.services.heattotosca.ResourceTranslationFactory;
39
40 import java.util.ArrayList;
41 import java.util.HashMap;
42 import java.util.List;
43 import java.util.Map;
44 import java.util.Optional;
45 import java.util.function.Predicate;
46
47 public abstract class ResourceConnectionUsingCapabilityHelper
48     extends BaseResourceConnection<CapabilityDefinition> {
49   public ResourceConnectionUsingCapabilityHelper(ResourceTranslationBase resourceTranslationBase,
50                                                  TranslateTo translateTo, FileData nestedFileData,
51                                                  NodeTemplate substitutionNodeTemplate,
52                                                  NodeType nodeType) {
53     super(resourceTranslationBase, translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
54   }
55
56   abstract Map.Entry<String, RequirementDefinition> createRequirementDefinition(
57       String capabilityKey);
58
59   @Override
60   String getMappedNodeTranslatedResourceId(ServiceTemplate nestedServiceTemplate,
61                                            Map.Entry<String,
62                                                CapabilityDefinition> connectionPointEntry) {
63
64
65     mdcDataDebugMessage.debugEntryMessage(null, null);
66
67     List<String> substitutionMapping =
68         nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
69             .get(connectionPointEntry.getKey());
70
71     mdcDataDebugMessage.debugExitMessage(null, null);
72     return substitutionMapping.get(0);
73   }
74
75   @Override
76   Map.Entry<String, CapabilityDefinition> getMappedConnectionPointEntry(
77       ServiceTemplate nestedServiceTemplate,
78       Map.Entry<String, CapabilityDefinition> connectionPointEntry) {
79
80
81     mdcDataDebugMessage.debugEntryMessage(null, null);
82
83     List<String> substitutionMapping =
84         nestedServiceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities()
85             .get(connectionPointEntry.getKey());
86     String mappedNodeTranslatedId = substitutionMapping.get(0);
87     String mappedCapabilityId = substitutionMapping.get(1);
88     NodeTemplate mappedNodeTemplate =
89         nestedServiceTemplate.getTopology_template().getNode_templates()
90             .get(mappedNodeTranslatedId);
91     NodeType substituteNodeType =
92         translateTo.getContext().getGlobalSubstitutionServiceTemplate().getNode_types()
93             .get(mappedNodeTemplate.getType());
94     Optional<CapabilityDefinition> capabilityDefinition =
95         DataModelUtil.getCapabilityDefinition(substituteNodeType, mappedCapabilityId);
96
97     mdcDataDebugMessage.debugExitMessage(null, null);
98     return new Map.Entry<String, CapabilityDefinition>() {
99       @Override
100       public String getKey() {
101         return mappedCapabilityId;
102       }
103
104       @Override
105       public CapabilityDefinition getValue() {
106         return capabilityDefinition.get();
107       }
108
109       @Override
110       public CapabilityDefinition setValue(CapabilityDefinition value) {
111         return null;
112       }
113     };
114   }
115
116   @Override
117   protected List<Map<String, CapabilityDefinition>> getAllConnectionPoints() {
118
119
120     mdcDataDebugMessage.debugEntryMessage(null, null);
121
122     List<Map<String, CapabilityDefinition>> exposedRequirementsList = new ArrayList<>();
123     List<Predicate<CapabilityDefinition>> predicates = getPredicatesListForConnectionPoints();
124     Map<String, CapabilityDefinition> capabilities = this.nodeType.getCapabilities();
125     if (capabilities == null) {
126       return exposedRequirementsList;
127     }
128     capabilities.entrySet()
129         .stream()
130         .filter(entry -> predicates
131             .stream()
132             .anyMatch(p -> p.test(entry.getValue())))
133         .forEach(entry -> {
134           Map<String, CapabilityDefinition> exposedRequirementsMap = new HashMap<>();
135           exposedRequirementsMap.put(entry.getKey(), entry.getValue());
136           exposedRequirementsList.add(exposedRequirementsMap);
137         });
138
139     mdcDataDebugMessage.debugExitMessage(null, null);
140     return exposedRequirementsList;
141   }
142
143   void addRequirementToConnectResource(Map.Entry<String, CapabilityDefinition> connectionPointEntry,
144                                        List<String> supportedSourceNodeTypes, String paramName) {
145
146
147     mdcDataDebugMessage.debugEntryMessage(null, null);
148
149     Object paramValue = translateTo.getResource().getProperties().get(paramName);
150     if (paramValue == null) {
151       logger.warn("'" + paramName + "' property is not define in nested resource '"
152           + translateTo.getResourceId() + "' for the nested heat file, therefore, '"
153           + connectionPointEntry.getKey() + "' TOSCA capability will not be connected.");
154       mdcDataDebugMessage.debugExitMessage(null, null);
155       return;
156     }
157
158     Map.Entry<String, RequirementDefinition> requirementDefinition =
159         createRequirementDefinition(connectionPointEntry.getKey());
160
161     Optional<String> sourceResourceId =
162         getConnectionResourceUsingGetResourceFunc(connectionPointEntry, paramName, paramValue,
163             supportedSourceNodeTypes);
164     if (sourceResourceId.isPresent()) {
165       Resource sourceResource = HeatToToscaUtil
166           .getResource(translateTo.getHeatOrchestrationTemplate(), sourceResourceId.get(),
167               translateTo.getHeatFileName());
168       Optional<String> translatedSourceNodeId =
169           ResourceTranslationFactory.getInstance(sourceResource)
170               .translateResource(translateTo.getHeatFileName(), translateTo.getServiceTemplate(),
171                   translateTo.getHeatOrchestrationTemplate(), sourceResource,
172                   sourceResourceId.get(), translateTo.getContext());
173       if (translatedSourceNodeId.isPresent()) {
174         NodeTemplate sourceNodeTemplate = DataModelUtil
175             .getNodeTemplate(translateTo.getServiceTemplate(), translatedSourceNodeId.get());
176         RequirementAssignment requirementAssignment = createRequirementAssignment(
177             requirementDefinition, translateTo.getTranslatedId(), sourceNodeTemplate);
178         ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
179             translateTo.getResource(), sourceResource, translatedSourceNodeId.get(),
180             requirementDefinition.getKey(), requirementAssignment);
181       } else {
182         logger.warn(
183             "'" + sourceResource.getType() + "' connection to '" + connectionPointEntry.getKey()
184                 + "' capability of type '" + connectionPointEntry.getValue().getType()
185                 + "' is not supported/invalid, therefore this connection will be ignored in the "
186                 + "TOSCA translation");
187       }
188     } else {
189       Optional<TranslatedHeatResource> sharedSourceTranslatedHeatResource =
190           getConnectionTranslatedHeatResourceUsingGetParamFunc(connectionPointEntry, paramName,
191               supportedSourceNodeTypes);
192       if (sharedSourceTranslatedHeatResource.isPresent()) {
193         NodeTemplate sharedSourceNodeTemplate = DataModelUtil
194             .getNodeTemplate(translateTo.getServiceTemplate(),
195                 sharedSourceTranslatedHeatResource.get().getTranslatedId());
196         RequirementAssignment requirementAssignment = createRequirementAssignment(
197             requirementDefinition, translateTo.getTranslatedId(), sharedSourceNodeTemplate);
198
199         ConsolidationDataUtil.updateNodesConnectedData(translateTo, translateTo.getResourceId(),
200             translateTo.getResource(), sharedSourceTranslatedHeatResource.get().getHeatResource(),
201             sharedSourceTranslatedHeatResource.get().getTranslatedId(),
202             requirementDefinition.getKey(),
203             requirementAssignment);
204       }
205     }
206
207     mdcDataDebugMessage.debugExitMessage(null, null);
208   }
209
210 }