push addional code
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / impl / BaseResourceConnection.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;
22
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;
41
42 import java.util.List;
43 import java.util.Map;
44 import java.util.Objects;
45 import java.util.Optional;
46 import java.util.function.Predicate;
47
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;
54   NodeType nodeType;
55   ResourceTranslationBase resourceTranslationBase;
56
57   BaseResourceConnection(ResourceTranslationBase resourceTranslationBase, TranslateTo translateTo,
58                          FileData nestedFileData, NodeTemplate substitutionNodeTemplate,
59                          NodeType nodeType) {
60     this.translateTo = translateTo;
61     this.nestedFileData = nestedFileData;
62     this.substitutionNodeTemplate = substitutionNodeTemplate;
63     this.nodeType = nodeType;
64     this.resourceTranslationBase = resourceTranslationBase;
65   }
66
67   abstract boolean isDesiredNodeTemplateType(NodeTemplate nodeTemplate);
68
69   abstract List<Predicate<T>> getPredicatesListForConnectionPoints();
70
71   abstract Optional<List<String>> getConnectorParamName(String heatResourceId,
72                                                         Resource heatResource,
73                                                         HeatOrchestrationTemplate
74                                                             nestedHeatOrchestrationTemplate);
75
76   abstract String getDesiredResourceType();
77
78   abstract String getTranslatedResourceIdFromSubstitutionMapping(
79       ServiceTemplate nestedServiceTemplate, Map.Entry<String, T> entry);
80
81   abstract void addRequirementToConnectResources(Map.Entry<String, T> entry,
82                                                  List<String> paramNames);
83
84   abstract List<Map<String, T>> getAllConnectionPoints();
85
86   void connect() {
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)) {
101           continue;
102         }
103         paramNames = createResourcesConnection(translatedResourceId, paramNames,
104             nestedHeatOrchestrationTemplate, entry);
105       }
106     }
107   }
108
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()) {
118       params =
119           addRequirementAndGetConnectorParamsFromResourceProperties(nestedHeatOrchestrationTemplate,
120               entry, params, heatResources.get());
121     }
122     return params;
123   }
124
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()) {
136           break;
137         } else {
138           params = connectorParamName.get();
139         }
140       }
141       Objects.requireNonNull(params);
142       addRequirementToConnectResources(entry, params);
143     }
144     return params;
145   }
146
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());
159     }
160     return resourceByTranslatedResourceId;
161   }
162
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);
172     }
173   }
174 }