e3701743ec3ed80b3d938bda5ae5760ab8615918
[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.healing.healers;
22
23 import org.apache.commons.collections4.CollectionUtils;
24 import org.openecomp.core.model.dao.ServiceModelDao;
25 import org.openecomp.core.model.dao.ServiceModelDaoFactory;
26 import org.openecomp.core.model.types.ServiceElement;
27 import org.openecomp.core.translator.datatypes.TranslatorOutput;
28 import org.openecomp.core.utilities.file.FileContentHandler;
29 import org.openecomp.core.utilities.json.JsonUtil;
30 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
31 import org.openecomp.sdc.common.utils.CommonUtil;
32 import org.openecomp.sdc.common.utils.SdcCommon;
33 import org.openecomp.sdc.healing.interfaces.Healer;
34 import org.openecomp.sdc.logging.api.Logger;
35 import org.openecomp.sdc.logging.api.LoggerFactory;
36 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
37 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
38 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
39 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
40 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
41 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDao;
42 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComputeDaoFactory;
43 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDao;
44 import org.openecomp.sdc.vendorsoftwareproduct.dao.DeploymentFlavorDaoFactory;
45 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDao;
46 import org.openecomp.sdc.vendorsoftwareproduct.dao.ImageDaoFactory;
47 import org.openecomp.sdc.vendorsoftwareproduct.dao.NetworkDao;
48 import org.openecomp.sdc.vendorsoftwareproduct.dao.NetworkDaoFactory;
49 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDao;
50 import org.openecomp.sdc.vendorsoftwareproduct.dao.NicDaoFactory;
51 import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDao;
52 import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDaoFactory;
53 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
54 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComputeEntity;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ImageEntity;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NetworkEntity;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.NicEntity;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.UploadDataEntity;
59 import org.openecomp.sdc.vendorsoftwareproduct.factory.CompositionDataExtractorFactory;
60 import org.openecomp.sdc.vendorsoftwareproduct.factory.CompositionEntityDataManagerFactory;
61 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionDataExtractor;
62 import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionEntityDataManager;
63 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Component;
64 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentData;
65 import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionData;
66 import org.openecomp.sdc.versioning.dao.types.Version;
67
68 import java.io.IOException;
69 import java.util.Collection;
70 import java.util.Map;
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(Map<String, Object> healingParams) throws IOException {
104     mdcDataDebugMessage.debugEntryMessage(null);
105
106     String vspId = (String) healingParams.get(SdcCommon.VSP_ID);
107     Version version = VERSION00.equals(healingParams.get(SdcCommon.VERSION))
108         ? VERSION01
109         : (Version) healingParams.get(SdcCommon.VERSION);
110
111     Collection<ComponentEntity> componentEntities =
112         componentDao.list(new ComponentEntity(vspId, version, null));
113     Collection<NicEntity> nicEntities = nicDao.listByVsp(vspId, version);
114     Collection<NetworkEntity> networkEntities =
115         networkDao.list(new NetworkEntity(vspId, version, null));
116
117     Optional<ToscaServiceModel> serviceModelForHealing = getServiceModelForHealing(vspId, version);
118     CompositionData compositionData = null;
119     if (!doesVspNeedCompositionDataHealing(vspId, version, componentEntities, networkEntities,
120         nicEntities)) {
121       updateComponentsDisplayNames(componentEntities);
122       mdcDataDebugMessage.debugExitMessage(null, null);
123       //return Optional.empty();
124     } else {
125       if (!serviceModelForHealing.isPresent()) {
126         mdcDataDebugMessage.debugExitMessage(null, null);
127         return Optional.empty();
128       }
129       compositionData = healCompositionData(vspId, version, serviceModelForHealing);
130     }
131     compositionData =
132         getCompositionDataForHealing(vspId, version, serviceModelForHealing.get());
133     HealNfodData(vspId, version, compositionData);
134     mdcDataDebugMessage.debugExitMessage(null, null);
135     return Optional.of(compositionData);
136   }
137
138   private boolean doesVspNeedCompositionDataHealing(String vspId, Version version,
139                                                     Collection<ComponentEntity> componentEntities,
140                                                     Collection<NetworkEntity> networkEntities,
141                                                     Collection<NicEntity> nicEntities) {
142
143     return (CollectionUtils.isEmpty(componentEntities) && CollectionUtils.isEmpty(nicEntities) &&
144         CollectionUtils.isEmpty(networkEntities) );
145
146 //    mdcDataDebugMessage.debugEntryMessage(null, null);
147 //
148 ////    ToscaServiceModel toscaServiceModel;
149 //
150 //    ByteBuffer contentData = uploadData.getContentData();
151 //    FileContentHandler fileContentHandler = CommonUtil.validateAndUploadFileContent(uploadData
152 //        .getContentData().array());
153 //
154 //
155 //
156 //    TranslatorOutput translatorOutput =
157 //        HeatToToscaUtil.loadAndTranslateTemplateData(fileContentHandler);
158 //    ToscaServiceModel toscaServiceModel = translatorOutput.getToscaServiceModel();
159 //
160 ////    toscaServiceModel = enrichedServiceModelDao.getServiceModel(vspId, version);
161 //
162 //    mdcDataDebugMessage.debugExitMessage(null, null);
163 //    return toscaServiceModel;
164
165   }
166
167   private void HealNfodData(String vspId, Version version, CompositionData compositionData) {
168     Collection<ComponentEntity> componentEntities;
169     /*componentEntities =
170         vendorSoftwareProductDao.listComponents(vspId, version);*/
171     componentEntities = componentDao.list(new ComponentEntity(vspId, version, null));
172
173     /*Collection<ComputeEntity> computeEntities=vendorSoftwareProductDao.listComputesByVsp(vspId,
174         version);
175     Collection<ImageEntity> imageEntities =vendorSoftwareProductDao.listImagesByVsp(vspId, version);
176     Collection<DeploymentFlavorEntity> deploymentFlavorEntities =vendorSoftwareProductDao
177         .listDeploymentFlavors(vspId, version);*/
178
179     Collection<ComputeEntity> computeEntities = computeDao.listByVsp(vspId, version);
180     Collection<ImageEntity> imageEntities = imageDao.listByVsp(vspId, version);
181     //Collection<DeploymentFlavorEntity> deploymentFlavorEntities = deloymentFlavorDao.list(new
182         //DeploymentFlavorEntity(vspId, version, null));
183
184     if (CollectionUtils.isEmpty(computeEntities) && CollectionUtils.isEmpty(imageEntities)) {
185       for (Component component : compositionData.getComponents()) {
186         String componentId = null;
187         for (ComponentEntity componentEntity:componentEntities) {
188           if (componentEntity.getComponentCompositionData().getName().equals(component.getData()
189               .getName())) {
190             componentId = componentEntity.getId();
191             break;
192           }
193         }
194         compositionEntityDataManager.saveComputesFlavorByComponent(vspId,version,component,
195             componentId);
196         compositionEntityDataManager.saveImagesByComponent(vspId,version,component,
197             componentId);
198       }
199
200     }
201
202     /*if (CollectionUtils.isEmpty(deploymentFlavorEntities)) {
203       compositionEntityDataManager.saveDeploymentFlavors(vspId,version,compositionData);
204     }*/
205   }
206
207   private CompositionData healCompositionData(String vspId, Version version,
208                                               Optional<ToscaServiceModel> serviceModelForHealing) {
209     ToscaServiceModel toscaServiceModel = serviceModelForHealing.get();
210     CompositionData compositionData =
211         getCompositionDataForHealing(vspId, version, toscaServiceModel);
212     compositionEntityDataManager.saveCompositionData(vspId, version, compositionData);
213     return compositionData;
214   }
215
216   private boolean doesVspNeedCompositionDataHealing(Collection<ComponentEntity> componentEntities,
217                                                     Collection<NetworkEntity> networkEntities,
218                                                     Collection<NicEntity> nicEntities) {
219
220     return (CollectionUtils.isEmpty(componentEntities) && CollectionUtils.isEmpty(nicEntities) &&
221         CollectionUtils.isEmpty(networkEntities));
222   }
223
224   private CompositionData getCompositionDataForHealing(String vspId, Version version,
225                                                        ToscaServiceModel toscaServiceModel) {
226     mdcDataDebugMessage.debugEntryMessage(null);
227
228     if (Objects.isNull(toscaServiceModel)) {
229       return null;
230     }
231
232     CompositionData compositionData = new CompositionData();
233     if (Objects.nonNull(toscaServiceModel)) {
234       compositionData = compositionDataExtractor
235           .extractServiceCompositionData(toscaServiceModel);
236       serviceModelDao.storeServiceModel(vspId, version, toscaServiceModel);
237     }
238
239     mdcDataDebugMessage.debugExitMessage(null);
240     return compositionData;
241   }
242
243   private void updateComponentsDisplayNames(Collection<ComponentEntity> componentEntities) {
244     if (CollectionUtils.isEmpty(componentEntities)) {
245       return;
246     }
247
248     for (ComponentEntity component : componentEntities) {
249       updateComponentName(component);
250       componentDao.update(component);
251     }
252   }
253
254   private void updateComponentName(ComponentEntity component) {
255     mdcDataDebugMessage.debugEntryMessage("VSP id, component id", component.getVspId(), component
256         .getId());
257
258     ComponentData componentData =
259         JsonUtil.json2Object(component.getCompositionData(), ComponentData.class);
260     componentData
261         .setDisplayName(compositionDataExtractor.getComponentDisplayName(componentData.getName()));
262     String displayName = componentData.getDisplayName();
263     componentData.setName(componentData.getName().replace("com.att.d2", "org.openecomp"));
264     componentData.setVfcCode(displayName);
265     component.setCompositionData(JsonUtil.object2Json(componentData));
266
267     mdcDataDebugMessage.debugExitMessage("VSP id, component id", component.getVspId(), component
268         .getId());
269
270   }
271
272   private Optional<ToscaServiceModel> getServiceModelForHealing(String vspId, Version version)
273       throws IOException {
274     mdcDataDebugMessage.debugEntryMessage("VSP id", vspId);
275
276     /*UploadDataEntity uploadData =
277         vendorSoftwareProductDao.getUploadData(new UploadDataEntity(vspId, version));*/
278     UploadDataEntity uploadData =
279         orchestrationTemplateDataDao.getOrchestrationTemplate(vspId, version);
280
281     if (Objects.isNull(uploadData) || Objects.isNull(uploadData.getContentData())) {
282       return Optional.empty();
283     }
284
285     TranslatorOutput translatorOutput = getTranslatorOutputForHealing(uploadData);
286
287     if (Objects.isNull(translatorOutput)) {
288       return Optional.empty();
289     }
290
291     try {
292       serviceModelDao.storeServiceModel(vspId, version,
293           translatorOutput.getToscaServiceModel());
294     } catch (Exception e) {
295       log.debug("", e);
296       return Optional.empty();
297     }
298
299     mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
300     return Optional.of(translatorOutput.getToscaServiceModel());
301   }
302
303   private TranslatorOutput getTranslatorOutputForHealing(UploadDataEntity uploadData) {
304
305     FileContentHandler fileContentHandler;
306     try {
307       fileContentHandler =
308           CommonUtil.validateAndUploadFileContent(
309               OnboardingTypesEnum.ZIP, uploadData.getContentData().array());
310       return HeatToToscaUtil.loadAndTranslateTemplateData(fileContentHandler);
311     } catch (Exception e) {
312       log.debug("", e);
313       return null;
314     }
315   }
316 }