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