c29409fe484896a25563c61f0fdedcde5bf4206a
[sdc.git] /
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.apache.commons.collections4.MapUtils;
24 import org.openecomp.core.utilities.file.FileUtils;
25 import org.openecomp.sdc.heat.datatypes.manifest.FileData;
26 import org.openecomp.sdc.logging.api.Logger;
27 import org.openecomp.sdc.logging.api.LoggerFactory;
28 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
29 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
30 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
31 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
32 import org.openecomp.sdc.tosca.services.DataModelUtil;
33 import org.openecomp.sdc.tosca.services.ToscaUtil;
34 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
35 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
36 import org.openecomp.sdc.translator.datatypes.heattotosca.to.TranslateTo;
37 import org.openecomp.sdc.translator.services.heattotosca.ConsolidationDataUtil;
38 import org.openecomp.sdc.translator.services.heattotosca.Constants;
39 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
40 import org.openecomp.sdc.translator.services.heattotosca.TranslationService;
41
42 import java.util.Objects;
43
44 public class ResourceTranslationNestedImpl extends ResourceTranslationBase {
45
46   protected static Logger logger =
47       (Logger) LoggerFactory.getLogger(ResourceTranslationNestedImpl.class);
48
49   @Override
50   public void translate(TranslateTo translateTo) {
51     mdcDataDebugMessage.debugEntryMessage(null, null);
52
53     TranslationContext context = translateTo.getContext();
54     FileData nestedFileData =
55         HeatToToscaUtil.getFileData(translateTo.getResource().getType(), context);
56     if (nestedFileData == null) {
57       logger.warn("Nested File '" + translateTo.getResource().getType()
58           + "' is not exist, therefore, the nested resource with the ID '"
59           + translateTo.getResourceId() + "' will be ignored in TOSCA translation");
60       return;
61     }
62     String templateName = FileUtils.getFileWithoutExtention(translateTo.getResource().getType());
63     String substitutionNodeTypeKey = ToscaNodeType.ABSTRACT_NODE_TYPE_PREFIX + "heat."
64         + templateName;
65
66     if (!context.getTranslatedServiceTemplates()
67         .containsKey(translateTo.getResource().getType())) {
68
69       //substitution service template
70       ServiceTemplate nestedSubstitutionServiceTemplate =
71           createSubstitutionServiceTemplate(translateTo, nestedFileData, templateName);
72
73       //global substitution service template
74       ServiceTemplate globalSubstitutionServiceTemplate = new HeatToToscaUtil()
75           .fetchGlobalSubstitutionServiceTemplate(translateTo.getServiceTemplate(),
76               context);
77
78       //substitution node type
79       NodeType substitutionNodeType = new ToscaAnalyzerServiceImpl()
80           .createInitSubstitutionNodeType(nestedSubstitutionServiceTemplate,
81               ToscaNodeType.ABSTRACT_SUBSTITUTE);
82       DataModelUtil.addNodeType(globalSubstitutionServiceTemplate, substitutionNodeTypeKey,
83           substitutionNodeType);
84       //substitution mapping
85       HeatToToscaUtil
86           .handleSubstitutionMapping(context, substitutionNodeTypeKey,
87               nestedSubstitutionServiceTemplate, substitutionNodeType);
88
89       //add new nested service template
90       context.getTranslatedServiceTemplates()
91           .put(translateTo.getResource().getType(), nestedSubstitutionServiceTemplate);
92     }
93
94     ServiceTemplate substitutionServiceTemplate = context.getTranslatedServiceTemplates()
95         .get(translateTo.getResource().getType());
96
97     if(DataModelUtil.isNodeTemplateSectionMissingFromServiceTemplate(substitutionServiceTemplate)){
98       handleSubstitutionServiceTemplateWithoutNodeTemplates(translateTo, context, templateName);
99       mdcDataDebugMessage.debugExitMessage(null, null);
100       return;
101     }
102     NodeTemplate substitutionNodeTemplate =
103         HeatToToscaUtil.createAbstractSubstitutionNodeTemplate(translateTo, templateName,
104             substitutionNodeTypeKey);
105     manageSubstitutionNodeTemplateConnectionPoint(translateTo, nestedFileData,
106         substitutionNodeTemplate, substitutionNodeTypeKey);
107     DataModelUtil.addNodeTemplate(translateTo.getServiceTemplate(), translateTo.getTranslatedId(),
108         substitutionNodeTemplate);
109
110     //Add nested node template id to consolidation data
111     ConsolidationDataUtil.updateNestedNodeTemplateId(translateTo);
112
113     mdcDataDebugMessage.debugExitMessage(null, null);
114   }
115
116   private void handleSubstitutionServiceTemplateWithoutNodeTemplates(TranslateTo translateTo,
117                                                                      TranslationContext context,
118                                                                      String templateName) {
119     context.addServiceTemplateWithoutNodeTemplates(templateName);
120     context.getTranslatedServiceTemplates().remove(translateTo.getResource().getType());
121   }
122
123   private ServiceTemplate createSubstitutionServiceTemplate(TranslateTo translateTo,
124                                                             FileData nestedFileData,
125                                                             String templateName) {
126     ServiceTemplate nestedSubstitutionServiceTemplate =
127         HeatToToscaUtil.createInitSubstitutionServiceTemplate(templateName);
128     translateTo.getContext()
129         .addNestedHeatFileName(ToscaUtil.getServiceTemplateFileName(templateName),
130             translateTo.getResource().getType());
131     new TranslationService().translateHeatFile(nestedSubstitutionServiceTemplate, nestedFileData,
132         translateTo.getContext());
133     return nestedSubstitutionServiceTemplate;
134   }
135
136
137   private void manageSubstitutionNodeTemplateConnectionPoint(TranslateTo translateTo,
138                                                              FileData nestedFileData,
139                                                              NodeTemplate substitutionNodeTemplate,
140                                                              String substitutionNodeTypeId) {
141
142
143     mdcDataDebugMessage.debugEntryMessage(null, null);
144
145     ServiceTemplate globalSubstitutionTemplate =
146         translateTo.getContext().getTranslatedServiceTemplates()
147             .get(Constants.GLOBAL_SUBSTITUTION_TYPES_TEMPLATE_NAME);
148     NodeType nodeType = globalSubstitutionTemplate.getNode_types().get(substitutionNodeTypeId);
149     handlePortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
150     handleSecurityRulesToPortConnections(translateTo, nestedFileData, substitutionNodeTemplate,
151         nodeType);
152     handleNovaToVolConnection(translateTo, nestedFileData, substitutionNodeTemplate, nodeType);
153     handleContrailV2VmInterfaceToNetworkConnection(translateTo, nestedFileData,
154         substitutionNodeTemplate, nodeType);
155     handleContrailPortToNetConnections(translateTo, nestedFileData, substitutionNodeTemplate,
156         nodeType);
157     handleVlanSubInterfaceToInterfaceConnections(translateTo, nestedFileData,
158         substitutionNodeTemplate, nodeType);
159
160     mdcDataDebugMessage.debugExitMessage(null, null);
161   }
162
163   private void handleVlanSubInterfaceToInterfaceConnections(TranslateTo translateTo,
164                                                             FileData nestedFileData,
165                                                             NodeTemplate substitutionNodeTemplate,
166                                                             NodeType nodeType) {
167
168
169     mdcDataDebugMessage.debugEntryMessage(null, null);
170
171     ContrailV2VlanToInterfaceResourceConnection linker =
172         new ContrailV2VlanToInterfaceResourceConnection(this, translateTo, nestedFileData,
173             substitutionNodeTemplate, nodeType);
174     linker.connect();
175
176     mdcDataDebugMessage.debugExitMessage(null, null);
177   }
178
179
180   private void handleContrailV2VmInterfaceToNetworkConnection(TranslateTo translateTo,
181                                                               FileData nestedFileData,
182                                                               NodeTemplate substitutionNodeTemplate,
183                                                               NodeType nodeType) {
184
185
186     mdcDataDebugMessage.debugEntryMessage(null, null);
187
188     ContrailV2VmInterfaceToNetResourceConnection linker =
189         new ContrailV2VmInterfaceToNetResourceConnection(this, translateTo, nestedFileData,
190             substitutionNodeTemplate, nodeType);
191     linker.connect();
192
193     mdcDataDebugMessage.debugExitMessage(null, null);
194   }
195
196   private void handleNovaToVolConnection(TranslateTo translateTo, FileData nestedFileData,
197                                          NodeTemplate substitutionNodeTemplate, NodeType nodeType) {
198
199
200     mdcDataDebugMessage.debugEntryMessage(null, null);
201
202     NovaToVolResourceConnection linker =
203         new NovaToVolResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
204             nodeType);
205     linker.connect();
206
207     mdcDataDebugMessage.debugExitMessage(null, null);
208   }
209
210   private void handleSecurityRulesToPortConnections(TranslateTo translateTo,
211                                                     FileData nestedFileData,
212                                                     NodeTemplate substitutionNodeTemplate,
213                                                     NodeType nodeType) {
214
215
216     mdcDataDebugMessage.debugEntryMessage(null, null);
217
218     SecurityRulesToPortResourceConnection linker =
219         new SecurityRulesToPortResourceConnection(this, translateTo, nestedFileData,
220             substitutionNodeTemplate, nodeType);
221     linker.connect();
222
223     mdcDataDebugMessage.debugExitMessage(null, null);
224   }
225
226   private void handlePortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
227                                           NodeTemplate substitutionNodeTemplate,
228                                           NodeType nodeType) {
229
230
231     mdcDataDebugMessage.debugEntryMessage(null, null);
232
233     PortToNetResourceConnection linker =
234         new PortToNetResourceConnection(this, translateTo, nestedFileData, substitutionNodeTemplate,
235             nodeType);
236     linker.connect();
237
238     mdcDataDebugMessage.debugExitMessage(null, null);
239   }
240
241   private void handleContrailPortToNetConnections(TranslateTo translateTo, FileData nestedFileData,
242                                                   NodeTemplate substitutionNodeTemplate,
243                                                   NodeType nodeType) {
244
245
246     mdcDataDebugMessage.debugEntryMessage(null, null);
247
248     ContrailPortToNetResourceConnection linker =
249         new ContrailPortToNetResourceConnection(this, translateTo, nestedFileData,
250             substitutionNodeTemplate, nodeType);
251     linker.connect();
252
253     mdcDataDebugMessage.debugExitMessage(null, null);
254   }
255
256 }