34954bdbbb395ff03cf44e3209e578c9c880cd86
[sdc.git] /
1 /*
2  * Copyright © 2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15 */
16
17 package org.openecomp.sdc.enrichment.impl.external.artifact;
18
19 import static org.openecomp.sdc.tosca.services.ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME;
20 import static org.openecomp.sdc.tosca.services.ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME;
21
22 import java.io.File;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Objects;
30 import java.util.Optional;
31 import java.util.Set;
32 import org.onap.sdc.tosca.datatypes.model.Directive;
33 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
34 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
35 import org.openecomp.core.enrichment.types.ArtifactCategory;
36 import org.openecomp.core.enrichment.types.ComponentMonitoringUploadInfo;
37 import org.openecomp.core.enrichment.types.MonitoringArtifactInfo;
38 import org.openecomp.core.enrichment.types.MonitoringUploadType;
39 import org.openecomp.core.model.dao.EnrichedServiceModelDao;
40 import org.openecomp.core.model.dao.EnrichedServiceModelDaoFactory;
41 import org.openecomp.core.model.types.ServiceArtifact;
42 import org.openecomp.core.utilities.file.FileContentHandler;
43 import org.openecomp.core.utilities.file.FileUtils;
44 import org.openecomp.sdc.common.errors.Messages;
45 import org.openecomp.sdc.common.zip.exception.ZipException;
46 import org.openecomp.sdc.datatypes.error.ErrorLevel;
47 import org.openecomp.sdc.datatypes.error.ErrorMessage;
48 import org.openecomp.sdc.enrichment.EnrichmentInfo;
49 import org.openecomp.sdc.enrichment.inter.ExternalArtifactEnricherInterface;
50 import org.openecomp.sdc.logging.api.Logger;
51 import org.openecomp.sdc.logging.api.LoggerFactory;
52 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
53 import org.openecomp.sdc.tosca.services.DataModelUtil;
54 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentArtifactDao;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.MonitoringUploadDaoFactory;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
59 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentMonitoringUploadEntity;
60 import org.openecomp.sdc.versioning.dao.types.Version;
61
62 public class MonitoringMibEnricher implements ExternalArtifactEnricherInterface {
63
64   private EnrichedServiceModelDao enrichedServiceModelDao;
65   private ComponentDao componentDao;
66   private ComponentArtifactDao componentArtifactDao;
67   private static final String COMPONENT_PREFIX = "org.openecomp.resource.vfc.";
68
69   private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
70
71   /**
72    * Enrich map.
73    *
74    * @param enrichmentInfo the enrichmentInfo
75    * @return the map
76    */
77   @Override
78   public Map<String, List<ErrorMessage>> enrich(EnrichmentInfo enrichmentInfo,
79                                                 ToscaServiceModel serviceModel) {
80
81     Map<String, List<ErrorMessage>> errors = new HashMap<>();
82     String vspId = enrichmentInfo.getKey();
83     Version version = enrichmentInfo.getVersion();
84
85     Collection<ComponentEntity> components =
86         getComponentDao().list(new ComponentEntity(vspId, version, null));
87     components
88         .forEach(componentEntry -> errors.putAll(enrichComponent(vspId, version, componentEntry,
89             serviceModel)));
90
91     return errors;
92   }
93
94   private Map<String, List<ErrorMessage>> enrichComponent(String vspId,
95                                                   Version version,
96                                                   ComponentEntity component,
97                                                   ToscaServiceModel serviceModel) {
98     Set<String> abstractNodeTypes =
99         extractAbstractTypesFromSameTypeFromServiceModel(component, serviceModel);
100     return enrichComponent(vspId, version, component, abstractNodeTypes);
101   }
102
103   private Set<String> extractAbstractTypesFromSameTypeFromServiceModel(ComponentEntity component,
104                                                                        ToscaServiceModel serviceModel) {
105     Set<String> abstractNodeTypes = new HashSet<>();
106     Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
107     String typeToCheck =
108         getComponentVfcTypeToCheck(component.getComponentCompositionData().getName());
109
110     for (ServiceTemplate serviceTemplate : serviceTemplates.values()) {
111       collectAllAbstractNodeTypesPointingToType(
112           typeToCheck, serviceTemplate, serviceTemplates, abstractNodeTypes);
113     }
114
115     return abstractNodeTypes;
116   }
117
118   private String getComponentVfcTypeToCheck(String type) {
119     return Objects.isNull(type) ? ""
120         : type.replace(COMPONENT_PREFIX, COMPONENT_PREFIX + "compute.");
121   }
122
123   private void collectAllAbstractNodeTypesPointingToType(String typeToCheck,
124                                                          ServiceTemplate serviceTemplate,
125                                                          Map<String, ServiceTemplate> serviceTemplates,
126                                                          Set<String> abstractNodeTypes) {
127     Map<String, NodeTemplate> nodeTemplates =
128         DataModelUtil.getNodeTemplates(serviceTemplate);
129
130     for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
131       handleNodeTemplate(nodeTemplateEntry.getValue(), typeToCheck,
132           serviceTemplates, abstractNodeTypes);
133     }
134   }
135
136   private void handleNodeTemplate(NodeTemplate nodeTemplate,
137                                   String typeToCheck,
138                                   Map<String, ServiceTemplate> serviceTemplates,
139                                   Set<String> abstractNodeTypes) {
140     List<String> directives = DataModelUtil.getDirectives(nodeTemplate);
141     if (directives.contains(Directive.SUBSTITUTABLE.getDisplayName())) {
142       handleSubstitutionServiceTemplate(typeToCheck, nodeTemplate, serviceTemplates,
143           abstractNodeTypes);
144     }
145   }
146
147   private void handleSubstitutionServiceTemplate(String typeToCheck,
148                                                  NodeTemplate nodeTemplate,
149                                                  Map<String, ServiceTemplate> serviceTemplates,
150                                                  Set<String> abstractNodeTypes) {
151     Object serviceTemplateFilter =
152         DataModelUtil.getPropertyValue(nodeTemplate, SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
153     if (Objects.nonNull(serviceTemplateFilter) && serviceTemplateFilter instanceof Map) {
154       String substituteServiceTemplateName =
155           (String) ((Map<String, Object>) serviceTemplateFilter)
156               .get(SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME);
157       ServiceTemplate substituteServiceTemplate =
158           serviceTemplates.get(substituteServiceTemplateName);
159       if (doesNodeTypeExistInSubServiceTemplate(typeToCheck, substituteServiceTemplate)) {
160         abstractNodeTypes.add(nodeTemplate.getType());
161       }
162     }
163   }
164
165   private boolean doesNodeTypeExistInSubServiceTemplate(String nodeTypeId,
166                                                         ServiceTemplate substituteServiceTemplate) {
167     return Objects
168         .nonNull(DataModelUtil.getNodeType(substituteServiceTemplate, nodeTypeId));
169   }
170
171   Map<String, List<ErrorMessage>> enrichComponent(String vspId,
172                                                   Version version,
173                                                   ComponentEntity componentEntry,
174                                                   Set<String> abstractNodeTypes) {
175     Map<String, List<ErrorMessage>> errors = new HashMap<>();
176
177     List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList =
178         extractComponentMibInfo(vspId, version, componentEntry, abstractNodeTypes);
179
180     componentMonitoringUploadInfoList.forEach(
181         componentUploadInfo -> enrichComponentMib(vspId, version, componentUploadInfo, errors));
182     return errors;
183   }
184
185   private List<ComponentMonitoringUploadInfo> extractComponentMibInfo(String vspId, Version version,
186                                                                       ComponentEntity componentEntity,
187                                                                       Set<String> abstractNodeTypes) {
188     String componentId = componentEntity.getId();
189     ComponentMonitoringUploadEntity entity = new ComponentMonitoringUploadEntity();
190
191     entity.setVspId(vspId);
192     entity.setVersion(version);
193     entity.setComponentId(componentId);
194     List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = new ArrayList<>();
195
196     abstractNodeTypes.forEach(unifiedComponentNodeType -> componentMonitoringUploadInfoList
197         .add(updComponentMibInfoByType(unifiedComponentNodeType, entity)));
198     return componentMonitoringUploadInfoList;
199   }
200
201   private ComponentMonitoringUploadInfo updComponentMibInfoByType(String componentName,
202                                                                   ComponentMonitoringUploadEntity componentMonitoringUploadEntity) {
203     ComponentMonitoringUploadInfo componentMonitoringUploadInfo =
204         new ComponentMonitoringUploadInfo();
205
206     for (MonitoringUploadType type : MonitoringUploadType.values()) {
207       componentMonitoringUploadEntity.setType(type);
208       Optional<ComponentMonitoringUploadEntity> artifact =
209           getComponentArtifactDao().getByType(componentMonitoringUploadEntity);
210
211       if (!artifact.isPresent()) {
212         continue;
213       }
214       ComponentMonitoringUploadEntity mibArtifact = artifact.get();
215       updateComponentMonitoringUploadInfoWithMib(getArtifactPath(type, componentName), type,
216           mibArtifact,
217           componentMonitoringUploadInfo);
218     }
219     return componentMonitoringUploadInfo;
220   }
221
222   private String getArtifactPath(MonitoringUploadType type, String unifiedComponentNodeType) {
223     return unifiedComponentNodeType + File.separator + ArtifactCategory.DEPLOYMENT.getDisplayName()
224         + File.separator + type.name();
225   }
226
227   private void updateComponentMonitoringUploadInfoWithMib(String path,
228                                                           MonitoringUploadType type,
229                                                           ComponentMonitoringUploadEntity mibArtifact,
230                                                           ComponentMonitoringUploadInfo componentMonitoringUploadInfo) {
231     MonitoringArtifactInfo monitoringArtifactInfo = new MonitoringArtifactInfo();
232     monitoringArtifactInfo.setName(path);
233     monitoringArtifactInfo.setContent(mibArtifact.getArtifact().array());
234     componentMonitoringUploadInfo.setMonitoringArtifactFile(type, monitoringArtifactInfo);
235   }
236
237   private void enrichComponentMib(String vspId,
238                                   Version version,
239                                   ComponentMonitoringUploadInfo componentUploadInfo,
240                                   Map<String, List<ErrorMessage>> errors) {
241     ServiceArtifact mibServiceArtifact = new ServiceArtifact();
242     mibServiceArtifact.setVspId(vspId);
243     mibServiceArtifact.setVersion(version);
244     enrichMibFiles(mibServiceArtifact, componentUploadInfo, errors);
245   }
246
247   private void enrichMibFiles(ServiceArtifact monitoringArtifact,
248                               ComponentMonitoringUploadInfo componentMonitoringUploadInfo,
249                               Map<String, List<ErrorMessage>> errors) {
250     if (componentMonitoringUploadInfo == null) {
251       return;
252     }
253     enrichMibByType(componentMonitoringUploadInfo.getSnmpTrap(), MonitoringUploadType.SNMP_TRAP,
254         monitoringArtifact,
255         errors);
256     enrichMibByType(componentMonitoringUploadInfo.getSnmpPoll(), MonitoringUploadType.SNMP_POLL,
257         monitoringArtifact,
258         errors);
259     enrichMibByType(componentMonitoringUploadInfo.getVesEvent(), MonitoringUploadType.VES_EVENTS,
260         monitoringArtifact,
261         errors);
262   }
263
264   private void enrichMibByType(MonitoringArtifactInfo monitoringArtifactInfo,
265                                MonitoringUploadType type,
266                                ServiceArtifact mibServiceArtifact,
267                                Map<String, List<ErrorMessage>> errors) {
268     if (monitoringArtifactInfo == null) {
269       return;
270     }
271     FileContentHandler mibs;
272     try {
273       mibs = FileUtils
274           .getFileContentMapFromZip(FileUtils.toByteArray(monitoringArtifactInfo.getContent()));
275     } catch (ZipException ex) {
276       log.error("Failed to get file content map from zip ", ex);
277       ErrorMessage.ErrorMessageUtil
278           .addMessage(mibServiceArtifact.getName() + "." + type.name(), errors)
279           .add(new ErrorMessage(ErrorLevel.ERROR, Messages.INVALID_ZIP_FILE.getErrorMessage()));
280       return;
281     }
282     Set<String> fileList = mibs.getFileList();
283     for (String fileName : fileList) {
284       mibServiceArtifact.setContentData(mibs.getFileContent(fileName));
285       mibServiceArtifact.setName(monitoringArtifactInfo.getName() + File.separator + fileName);
286       getEnrichedServiceModelDao().storeExternalArtifact(mibServiceArtifact);
287     }
288   }
289
290   private EnrichedServiceModelDao getEnrichedServiceModelDao() {
291     if (enrichedServiceModelDao == null) {
292       enrichedServiceModelDao = EnrichedServiceModelDaoFactory.getInstance().createInterface();
293     }
294     return enrichedServiceModelDao;
295   }
296
297   private ComponentDao getComponentDao() {
298     if (componentDao == null) {
299       componentDao = ComponentDaoFactory.getInstance().createInterface();
300     }
301     return componentDao;
302   }
303
304   private ComponentArtifactDao getComponentArtifactDao() {
305     if (componentArtifactDao == null) {
306       componentArtifactDao = MonitoringUploadDaoFactory.getInstance().createInterface();
307     }
308     return componentArtifactDao;
309   }
310
311 }