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