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