Add collaboration feature
[sdc.git] / openecomp-be / lib / openecomp-healing-lib / openecomp-sdc-healing-impl / src / main / java / org / openecomp / sdc / healing / healers / CompositionDataHealer.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.healing.healers;
22
23 import org.apache.commons.collections4.CollectionUtils;
24 import org.apache.commons.lang3.tuple.ImmutablePair;
25 import org.apache.commons.lang3.tuple.Pair;
26 import org.openecomp.core.model.dao.ServiceModelDao;
27 import org.openecomp.core.model.dao.ServiceModelDaoFactory;
28 import org.openecomp.core.model.types.ServiceElement;
29 import org.openecomp.core.translator.datatypes.TranslatorOutput;
30 import org.openecomp.core.utilities.file.FileContentHandler;
31 import org.openecomp.core.utilities.json.JsonUtil;
32 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
33 import org.openecomp.sdc.common.utils.CommonUtil;
34 import org.openecomp.sdc.healing.interfaces.Healer;
35 import org.openecomp.sdc.logging.api.Logger;
36 import org.openecomp.sdc.logging.api.LoggerFactory;
37 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
38 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
39 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
40 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
41 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
42 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
43 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDaoFactory;
44 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
45 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDaoFactory;
46 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
47 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDaoFactory;
48 import org.openecomp.sdc.vendorsoftwareproduct.dao.NetworkDao;
49 import org.openecomp.sdc.vendorsoftwareproduct.dao.NetworkDaoFactory;
50 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDao;
51 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDaoFactory;
52 import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDao;
53 import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDaoFactory;
54 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NetworkEntity;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NicEntity;
59 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateEntity;
60 import org.openecomp.sdc.vendorsoftwareproduct.factory.CompositionDataExtractorFactory;
61 import org.openecomp.sdc.vendorsoftwareproduct.factory.CompositionEntityDataManagerFactory;
62 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionDataExtractor;
63 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
64 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Component;
65 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentData;
66 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionData;
67 import org.openecomp.sdc.versioning.dao.types.Version;
68
69 import java.io.IOException;
70 import java.util.Collection;
71 import java.util.Objects;
72 import java.util.Optional;
73
74 public class CompositionDataHealer implements Healer {
75   private static final Version VERSION00 = new Version(0, 0);
76   private static final Version VERSION01 = new Version(0, 1);
77   private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
78
79   private static final OrchestrationTemplateDao orchestrationTemplateDataDao =
80       OrchestrationTemplateDaoFactory.getInstance().createInterface();
81
82   private static ComponentDao componentDao = ComponentDaoFactory.getInstance().createInterface();
83   private static NicDao nicDao = NicDaoFactory.getInstance().createInterface();
84   private static NetworkDao networkDao = NetworkDaoFactory.getInstance().createInterface();
85   private static ComputeDao computeDao = ComputeDaoFactory.getInstance().createInterface();
86   private static DeploymentFlavorDao deloymentFlavorDao = DeploymentFlavorDaoFactory.getInstance()
87       .createInterface();
88   private static ImageDao imageDao = ImageDaoFactory.getInstance().createInterface();
89
90   private static final ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao =
91       ServiceModelDaoFactory.getInstance().createInterface();
92   private static CompositionDataExtractor compositionDataExtractor =
93       CompositionDataExtractorFactory.getInstance().createInterface();
94   private static CompositionEntityDataManager compositionEntityDataManager =
95       CompositionEntityDataManagerFactory.getInstance().createInterface();
96
97   private final Logger log = (Logger) LoggerFactory.getLogger(this.getClass().getName());
98
99   public CompositionDataHealer() {
100   }
101
102   @Override
103   public Optional<CompositionData> heal(String vspId,
104                                         Version version) throws IOException {
105     mdcDataDebugMessage.debugEntryMessage(null);
106
107     Collection<ComponentEntity> componentEntities =
108         componentDao.list(new ComponentEntity(vspId, version, null));
109     Collection<NicEntity> nicEntities = nicDao.listByVsp(vspId, version);
110     Collection<NetworkEntity> networkEntities =
111         networkDao.list(new NetworkEntity(vspId, version, null));
112
113     Optional<Pair<ToscaServiceModel, ToscaServiceModel>> serviceModels =
114         getServiceModelForHealing(vspId, version);
115     CompositionData compositionData = null;
116     if (!doesVspNeedCompositionDataHealing(componentEntities, networkEntities, nicEntities)) {
117       updateComponentsDisplayNames(componentEntities);
118       mdcDataDebugMessage.debugExitMessage(null, null);
119     } else {
120       if (!serviceModels.isPresent()) {
121         mdcDataDebugMessage.debugExitMessage(null, null);
122         return Optional.empty();
123       }
124       compositionData = serviceModels.isPresent() ? healCompositionData(vspId, version,
125           serviceModels.get()) : null;
126     }
127
128     if (serviceModels.isPresent()) {
129       compositionData =
130           getCompositionDataForHealing(vspId, version, serviceModels.get());
131       HealNfodData(vspId, version, compositionData);
132     }
133     mdcDataDebugMessage.debugExitMessage(null, null);
134     return Optional.ofNullable(compositionData);
135   }
136
137   private void HealNfodData(String vspId, Version version, CompositionData compositionData) {
138     Collection<ComponentEntity> componentEntities;
139     componentEntities = componentDao.list(new ComponentEntity(vspId, version, null));
140
141     Collection<ComputeEntity> computeEntities = computeDao.listByVsp(vspId, version);
142     Collection<ImageEntity> imageEntities = imageDao.listByVsp(vspId, version);
143
144     if (CollectionUtils.isEmpty(computeEntities) && CollectionUtils.isEmpty(imageEntities)) {
145       for (Component component : compositionData.getComponents()) {
146         String componentId = null;
147         for (ComponentEntity componentEntity : componentEntities) {
148           if (componentEntity.getComponentCompositionData().getName().equals(component.getData()
149               .getName())) {
150             componentId = componentEntity.getId();
151             break;
152           }
153         }
154         compositionEntityDataManager.saveComputesFlavorByComponent(vspId, version, component,
155             componentId);
156         compositionEntityDataManager.saveImagesByComponent(vspId, version, component,
157             componentId);
158       }
159
160     }
161   }
162
163   private CompositionData healCompositionData(String vspId, Version version,
164                                               Pair<ToscaServiceModel, ToscaServiceModel> toscaServiceModels) {
165     CompositionData compositionData =
166         getCompositionDataForHealing(vspId, version, toscaServiceModels);
167     compositionEntityDataManager.saveCompositionData(vspId, version, compositionData);
168     return compositionData;
169   }
170
171   private boolean doesVspNeedCompositionDataHealing(Collection<ComponentEntity> componentEntities,
172                                                     Collection<NetworkEntity> networkEntities,
173                                                     Collection<NicEntity> nicEntities) {
174
175     return (CollectionUtils.isEmpty(componentEntities) && CollectionUtils.isEmpty(nicEntities) &&
176         CollectionUtils.isEmpty(networkEntities));
177   }
178
179   private CompositionData getCompositionDataForHealing(String vspId, Version version,
180                                                        Pair<ToscaServiceModel, ToscaServiceModel> toscaServiceModels) {
181     mdcDataDebugMessage.debugEntryMessage(null);
182
183     if (Objects.isNull(toscaServiceModels)) {
184       return null;
185     }
186
187     CompositionData compositionData = compositionDataExtractor
188         .extractServiceCompositionData(toscaServiceModels.getRight());
189     serviceModelDao.storeServiceModel(vspId, version, toscaServiceModels.getLeft());
190
191     mdcDataDebugMessage.debugExitMessage(null);
192     return compositionData;
193   }
194
195   private void updateComponentsDisplayNames(Collection<ComponentEntity> componentEntities) {
196     if (CollectionUtils.isEmpty(componentEntities)) {
197       return;
198     }
199
200     for (ComponentEntity component : componentEntities) {
201       updateComponentName(component);
202       componentDao.update(component);
203     }
204   }
205
206   private void updateComponentName(ComponentEntity component) {
207     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", component.getVspId(), component
208         .getId());
209
210     ComponentData componentData =
211         JsonUtil.json2Object(component.getCompositionData(), ComponentData.class);
212     componentData
213         .setDisplayName(compositionDataExtractor.getComponentDisplayName(componentData.getName()));
214     String displayName = componentData.getDisplayName();
215     componentData.setName(componentData.getName().replace("com.att.d2", "org.openecomp"));
216     componentData.setVfcCode(displayName);
217     component.setCompositionData(JsonUtil.object2Json(componentData));
218
219     mdcDataDebugMessage.debugExitMessage("VSP id, component id", component.getVspId(), component
220         .getId());
221
222   }
223
224   private Optional<Pair<ToscaServiceModel, ToscaServiceModel>> getServiceModelForHealing(String
225                                                                                              vspId,
226                                                                                          Version
227                                                                                              version)
228       throws IOException {
229     mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
230
231     /*OrchestrationTemplateEntity uploadData =
232         vendorSoftwareProductDao.getUploadData(new OrchestrationTemplateEntity(vspId, version));*/
233     OrchestrationTemplateEntity uploadData = orchestrationTemplateDataDao.get(vspId, version);
234
235     if (Objects.isNull(uploadData) || Objects.isNull(uploadData.getContentData())) {
236       return Optional.empty();
237     }
238
239     TranslatorOutput translatorOutput = getTranslatorOutputForHealing(uploadData);
240
241     if (Objects.isNull(translatorOutput)) {
242       return Optional.empty();
243     }
244
245     try {
246       serviceModelDao.storeServiceModel(vspId, version,
247           translatorOutput.getToscaServiceModel());
248     } catch (Exception e) {
249       log.debug("", e);
250       return Optional.empty();
251     }
252
253     mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
254     return Optional.of(new ImmutablePair<>(translatorOutput.getToscaServiceModel(), translatorOutput
255         .getNonUnifiedToscaServiceModel()));
256   }
257
258   private TranslatorOutput getTranslatorOutputForHealing(OrchestrationTemplateEntity uploadData) {
259
260     FileContentHandler fileContentHandler;
261     try {
262       fileContentHandler =
263           CommonUtil.validateAndUploadFileContent(
264               OnboardingTypesEnum.ZIP, uploadData.getContentData().array());
265       return HeatToToscaUtil.loadAndTranslateTemplateData(fileContentHandler);
266     } catch (Exception e) {
267       log.debug("", e);
268       return null;
269     }
270   }
271 }