Added oparent to sdc main
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / UnifiedCompositionManager.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 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 package org.openecomp.sdc.translator.services.heattotosca;
21
22 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
23 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
24 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
25 import org.openecomp.sdc.tosca.services.DataModelUtil;
26 import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
27 import org.openecomp.sdc.tosca.services.ToscaUtil;
28 import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
29 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
30 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FileNestedConsolidationData;
31
32 import java.util.Map;
33 import java.util.Objects;
34 import java.util.Optional;
35
36 public class UnifiedCompositionManager {
37   private ConsolidationService consolidationService;
38   private TranslationService translationService = new TranslationService();
39   private UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService();
40
41   public UnifiedCompositionManager(ConsolidationService consolidationService) {
42     this.consolidationService = consolidationService;
43   }
44
45   public UnifiedCompositionManager() {
46
47   }
48
49   /**
50    * Create unified composition.
51    *
52    * @param toscaServiceModel  the tosca service model
53    * @param translationContext the translation context
54    * @return the tosca service model
55    */
56   public ToscaServiceModel createUnifiedComposition(ToscaServiceModel toscaServiceModel,
57                                                     TranslationContext translationContext) {
58     Map<String, ServiceTemplate> serviceTemplates = toscaServiceModel.getServiceTemplates();
59     ServiceTemplate mainServiceTemplate =
60         serviceTemplates.get(toscaServiceModel.getEntryDefinitionServiceTemplate());
61     createUnifiedComposition(toscaServiceModel, mainServiceTemplate, translationContext);
62     ToscaServiceModel unifiedToscaServiceModel =
63         HeatToToscaUtil.createToscaServiceModel(mainServiceTemplate, translationContext);
64     return unifiedToscaServiceModel;
65   }
66
67   private void createUnifiedComposition(ToscaServiceModel toscaServiceModel,
68                                         ServiceTemplate serviceTemplate,
69                                         TranslationContext translationContext) {
70     handleNestedServiceTemplates(toscaServiceModel, serviceTemplate, translationContext);
71     consolidationService.serviceTemplateConsolidation(serviceTemplate, translationContext);
72     unifiedCompositionService
73         .updateUnifiedAbstractNodesConnectivity(serviceTemplate, translationContext);
74     translationContext.addUnifiedHandledServiceTeamplte(serviceTemplate);
75   }
76
77   private void handleNestedServiceTemplates(ToscaServiceModel toscaServiceModel,
78                                             ServiceTemplate serviceTemplate,
79                                             TranslationContext translationContext) {
80     String serviceTemplateFileName = ToscaUtil.getServiceTemplateFileName(serviceTemplate);
81     FileNestedConsolidationData fileNestedConsolidationData =
82         translationContext.getConsolidationData().getNestedConsolidationData()
83             .getFileNestedConsolidationData(serviceTemplateFileName);
84
85     if (Objects.nonNull(fileNestedConsolidationData)) {
86       ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
87       for (String substitutedNodeTemplateId : fileNestedConsolidationData
88           .getAllNestedNodeTemplateIds()) {
89         NodeTemplate nestedNodeTemplate =
90             DataModelUtil.getNodeTemplate(serviceTemplate, substitutedNodeTemplateId);
91         if (Objects.isNull(nestedNodeTemplate) || translationContext
92             .isNestedNodeWasHandled(serviceTemplateFileName, substitutedNodeTemplateId)) {
93           continue;
94         }
95         Optional<String> substituteServiceTemplateName =
96             toscaAnalyzerService.getSubstituteServiceTemplateName(substitutedNodeTemplateId,
97                 nestedNodeTemplate);
98         if (substituteServiceTemplateName.isPresent()) {
99           ServiceTemplate substitutionServiceTemplate =
100               toscaServiceModel.getServiceTemplates().get(substituteServiceTemplateName.get());
101           createUnifiedCompositionForNestedServiceTemplate(toscaServiceModel, serviceTemplate,
102               substitutionServiceTemplate, substitutedNodeTemplateId, translationContext);
103         }
104         translationContext.addNestedNodeAsHandled(serviceTemplateFileName,
105             substitutedNodeTemplateId);
106       }
107     }
108   }
109
110   private void createUnifiedCompositionForNestedServiceTemplate(
111       ToscaServiceModel toscaServiceModel,
112       ServiceTemplate serviceTemplate,
113       ServiceTemplate substitutionServiceTemplate,
114       String substitutedNodeTemplateId,
115       TranslationContext translationContext) {
116     handleNestedServiceTemplates(toscaServiceModel, substitutionServiceTemplate,
117         translationContext);
118     consolidationService.substitutionServiceTemplateConsolidation(substitutedNodeTemplateId,
119         serviceTemplate, substitutionServiceTemplate, translationContext);
120     unifiedCompositionService
121         .updateUnifiedAbstractNodesConnectivity(substitutionServiceTemplate, translationContext);
122     translationContext.addUnifiedHandledServiceTeamplte(substitutionServiceTemplate);
123   }
124 }
125