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