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