2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.enrichment.impl.external.artifact;
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;
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;
61 import java.util.Objects;
62 import java.util.Optional;
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;
68 public class MonitoringMibEnricher implements ExternalArtifactEnricherInterface {
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.";
76 private final Logger LOG = LoggerFactory.getLogger(this.getClass().getName());
81 * @param enrichmentInfo the enrichmentInfo
84 public Map<String, List<ErrorMessage>> enrich(EnrichmentInfo enrichmentInfo,
85 ToscaServiceModel serviceModel) {
87 Map<String, List<ErrorMessage>> errors = new HashMap<>();
88 String vspId = enrichmentInfo.getKey();
89 Version version = enrichmentInfo.getVersion();
91 Collection<ComponentEntity> components =
92 getComponentDao().list(new ComponentEntity(vspId, version, null));
94 .forEach(componentEntry -> errors.putAll(enrichComponent(vspId, version, componentEntry,
100 private Map<String, List<ErrorMessage>> enrichComponent(String vspId,
102 ComponentEntity component,
103 ToscaServiceModel serviceModel) {
104 Set<String> abstractNodeTypes =
105 extractAbstractTypesFromSameTypeFromServiceModel(component, serviceModel);
106 return enrichComponent(vspId, version, component, abstractNodeTypes);
109 private Set<String> extractAbstractTypesFromSameTypeFromServiceModel(ComponentEntity component,
110 ToscaServiceModel serviceModel) {
111 Set<String> abstractNodeTypes = new HashSet<>();
112 Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
114 getComponentVfcTypeToCheck(component.getComponentCompositionData().getName());
116 for (ServiceTemplate serviceTemplate : serviceTemplates.values()) {
117 collectAllAbstractNodeTypesPointingToType(
118 typeToCheck, serviceTemplate, serviceTemplates, abstractNodeTypes);
121 return abstractNodeTypes;
124 private String getComponentVfcTypeToCheck(String type) {
125 return Objects.isNull(type) ? ""
126 : type.replace(COMPONENT_PREFIX, COMPONENT_PREFIX + "compute.");
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);
136 for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
137 handleNodeTemplate(nodeTemplateEntry.getValue(), typeToCheck,
138 serviceTemplates, abstractNodeTypes);
142 private void handleNodeTemplate(NodeTemplate nodeTemplate,
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,
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());
171 private boolean doesNodeTypeExistInSubServiceTemplate(String nodeTypeId,
172 ServiceTemplate substituteServiceTemplate) {
174 .nonNull(DataModelUtil.getNodeType(substituteServiceTemplate, nodeTypeId));
177 Map<String, List<ErrorMessage>> enrichComponent(String vspId,
179 ComponentEntity componentEntry,
180 Set<String> abstractNodeTypes) {
183 mdcDataDebugMessage.debugEntryMessage(null);
185 Map<String, List<ErrorMessage>> errors = new HashMap<>();
187 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList =
188 extractComponentMibInfo(vspId, version, componentEntry, abstractNodeTypes);
190 componentMonitoringUploadInfoList.forEach(
191 componentUploadInfo -> enrichComponentMib(vspId, version, componentUploadInfo, errors));
193 mdcDataDebugMessage.debugExitMessage(null);
197 private List<ComponentMonitoringUploadInfo> extractComponentMibInfo(String vspId, Version version,
198 ComponentEntity componentEntity,
199 Set<String> abstractNodeTypes) {
202 mdcDataDebugMessage.debugEntryMessage(null);
204 String componentId = componentEntity.getId();
205 ComponentMonitoringUploadEntity entity = new ComponentMonitoringUploadEntity();
207 entity.setVspId(vspId);
208 entity.setVersion(version);
209 entity.setComponentId(componentId);
210 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = new ArrayList<>();
212 abstractNodeTypes.forEach(unifiedComponentNodeType -> componentMonitoringUploadInfoList
213 .add(updComponentMibInfoByType(unifiedComponentNodeType, entity)));
215 mdcDataDebugMessage.debugExitMessage(null);
216 return componentMonitoringUploadInfoList;
219 private ComponentMonitoringUploadInfo updComponentMibInfoByType(String componentName,
220 ComponentMonitoringUploadEntity componentMonitoringUploadEntity) {
223 mdcDataDebugMessage.debugEntryMessage(null);
225 ComponentMonitoringUploadInfo componentMonitoringUploadInfo =
226 new ComponentMonitoringUploadInfo();
228 for (MonitoringUploadType type : MonitoringUploadType.values()) {
229 componentMonitoringUploadEntity.setType(type);
230 Optional<ComponentMonitoringUploadEntity> artifact =
231 getComponentArtifactDao().getByType(componentMonitoringUploadEntity);
233 if (!artifact.isPresent()) {
236 ComponentMonitoringUploadEntity mibArtifact = artifact.get();
237 updateComponentMonitoringUploadInfoWithMib(getArtifactPath(type, componentName), type,
239 componentMonitoringUploadInfo);
242 mdcDataDebugMessage.debugExitMessage(null);
243 return componentMonitoringUploadInfo;
246 private String getArtifactPath(MonitoringUploadType type, String unifiedComponentNodeType) {
247 return unifiedComponentNodeType + File.separator + ArtifactCategory.DEPLOYMENT.getDisplayName()
248 + File.separator + type.name();
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);
261 private void enrichComponentMib(String vspId,
263 ComponentMonitoringUploadInfo componentUploadInfo,
264 Map<String, List<ErrorMessage>> errors) {
265 mdcDataDebugMessage.debugEntryMessage(null);
267 ServiceArtifact mibServiceArtifact = new ServiceArtifact();
268 mibServiceArtifact.setVspId(vspId);
269 mibServiceArtifact.setVersion(version);
270 enrichMibFiles(mibServiceArtifact, componentUploadInfo, errors);
273 mdcDataDebugMessage.debugExitMessage(null);
276 private void enrichMibFiles(ServiceArtifact monitoringArtifact,
277 ComponentMonitoringUploadInfo componentMonitoringUploadInfo,
278 Map<String, List<ErrorMessage>> errors) {
281 mdcDataDebugMessage.debugEntryMessage(null);
283 if (componentMonitoringUploadInfo == null) {
286 enrichMibByType(componentMonitoringUploadInfo.getSnmpTrap(), MonitoringUploadType.SNMP_TRAP,
289 enrichMibByType(componentMonitoringUploadInfo.getSnmpPoll(), MonitoringUploadType.SNMP_POLL,
292 enrichMibByType(componentMonitoringUploadInfo.getVesEvent(), MonitoringUploadType.VES_EVENTS,
296 mdcDataDebugMessage.debugExitMessage(null);
299 private void enrichMibByType(MonitoringArtifactInfo monitoringArtifactInfo,
300 MonitoringUploadType type,
301 ServiceArtifact mibServiceArtifact,
302 Map<String, List<ErrorMessage>> errors) {
305 mdcDataDebugMessage.debugEntryMessage(null);
307 if (monitoringArtifactInfo == null) {
310 FileContentHandler mibs;
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()));
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);
328 mdcDataDebugMessage.debugExitMessage(null);
331 private EnrichedServiceModelDao getEnrichedServiceModelDao() {
332 if (enrichedServiceModelDao == null) {
333 enrichedServiceModelDao = EnrichedServiceModelDaoFactory.getInstance().createInterface();
335 return enrichedServiceModelDao;
338 private ComponentDao getComponentDao() {
339 if (componentDao == null) {
340 componentDao = ComponentDaoFactory.getInstance().createInterface();
345 private ComponentArtifactDao getComponentArtifactDao() {
346 if (componentArtifactDao == null) {
347 componentArtifactDao = MonitoringUploadDaoFactory.getInstance().createInterface();
349 return componentArtifactDao;