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.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;
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;
60 import java.util.Objects;
61 import java.util.Optional;
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;
67 public class MonitoringMibEnricher implements ExternalArtifactEnricherInterface {
69 private EnrichedServiceModelDao enrichedServiceModelDao;
70 private ComponentDao componentDao;
71 private ComponentArtifactDao componentArtifactDao;
72 private static final String COMPONENT_PREFIX = "org.openecomp.resource.vfc.";
74 private final Logger LOG = LoggerFactory.getLogger(this.getClass().getName());
79 * @param enrichmentInfo the enrichmentInfo
82 public Map<String, List<ErrorMessage>> enrich(EnrichmentInfo enrichmentInfo,
83 ToscaServiceModel serviceModel) {
85 Map<String, List<ErrorMessage>> errors = new HashMap<>();
86 String vspId = enrichmentInfo.getKey();
87 Version version = enrichmentInfo.getVersion();
89 Collection<ComponentEntity> components =
90 getComponentDao().list(new ComponentEntity(vspId, version, null));
92 .forEach(componentEntry -> errors.putAll(enrichComponent(vspId, version, componentEntry,
98 private Map<String, List<ErrorMessage>> enrichComponent(String vspId,
100 ComponentEntity component,
101 ToscaServiceModel serviceModel) {
102 Set<String> abstractNodeTypes =
103 extractAbstractTypesFromSameTypeFromServiceModel(component, serviceModel);
104 return enrichComponent(vspId, version, component, abstractNodeTypes);
107 private Set<String> extractAbstractTypesFromSameTypeFromServiceModel(ComponentEntity component,
108 ToscaServiceModel serviceModel) {
109 Set<String> abstractNodeTypes = new HashSet<>();
110 Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
112 getComponentVfcTypeToCheck(component.getComponentCompositionData().getName());
114 for (ServiceTemplate serviceTemplate : serviceTemplates.values()) {
115 collectAllAbstractNodeTypesPointingToType(
116 typeToCheck, serviceTemplate, serviceTemplates, abstractNodeTypes);
119 return abstractNodeTypes;
122 private String getComponentVfcTypeToCheck(String type) {
123 return Objects.isNull(type) ? ""
124 : type.replace(COMPONENT_PREFIX, COMPONENT_PREFIX + "compute.");
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);
134 for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
135 handleNodeTemplate(nodeTemplateEntry.getValue(), typeToCheck,
136 serviceTemplates, abstractNodeTypes);
140 private void handleNodeTemplate(NodeTemplate nodeTemplate,
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,
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());
169 private boolean doesNodeTypeExistInSubServiceTemplate(String nodeTypeId,
170 ServiceTemplate substituteServiceTemplate) {
172 .nonNull(DataModelUtil.getNodeType(substituteServiceTemplate, nodeTypeId));
175 Map<String, List<ErrorMessage>> enrichComponent(String vspId,
177 ComponentEntity componentEntry,
178 Set<String> abstractNodeTypes) {
179 Map<String, List<ErrorMessage>> errors = new HashMap<>();
181 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList =
182 extractComponentMibInfo(vspId, version, componentEntry, abstractNodeTypes);
184 componentMonitoringUploadInfoList.forEach(
185 componentUploadInfo -> enrichComponentMib(vspId, version, componentUploadInfo, errors));
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();
195 entity.setVspId(vspId);
196 entity.setVersion(version);
197 entity.setComponentId(componentId);
198 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = new ArrayList<>();
200 abstractNodeTypes.forEach(unifiedComponentNodeType -> componentMonitoringUploadInfoList
201 .add(updComponentMibInfoByType(unifiedComponentNodeType, entity)));
202 return componentMonitoringUploadInfoList;
205 private ComponentMonitoringUploadInfo updComponentMibInfoByType(String componentName,
206 ComponentMonitoringUploadEntity componentMonitoringUploadEntity) {
207 ComponentMonitoringUploadInfo componentMonitoringUploadInfo =
208 new ComponentMonitoringUploadInfo();
210 for (MonitoringUploadType type : MonitoringUploadType.values()) {
211 componentMonitoringUploadEntity.setType(type);
212 Optional<ComponentMonitoringUploadEntity> artifact =
213 getComponentArtifactDao().getByType(componentMonitoringUploadEntity);
215 if (!artifact.isPresent()) {
218 ComponentMonitoringUploadEntity mibArtifact = artifact.get();
219 updateComponentMonitoringUploadInfoWithMib(getArtifactPath(type, componentName), type,
221 componentMonitoringUploadInfo);
223 return componentMonitoringUploadInfo;
226 private String getArtifactPath(MonitoringUploadType type, String unifiedComponentNodeType) {
227 return unifiedComponentNodeType + File.separator + ArtifactCategory.DEPLOYMENT.getDisplayName()
228 + File.separator + type.name();
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);
241 private void enrichComponentMib(String vspId,
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);
251 private void enrichMibFiles(ServiceArtifact monitoringArtifact,
252 ComponentMonitoringUploadInfo componentMonitoringUploadInfo,
253 Map<String, List<ErrorMessage>> errors) {
254 if (componentMonitoringUploadInfo == null) {
257 enrichMibByType(componentMonitoringUploadInfo.getSnmpTrap(), MonitoringUploadType.SNMP_TRAP,
260 enrichMibByType(componentMonitoringUploadInfo.getSnmpPoll(), MonitoringUploadType.SNMP_POLL,
263 enrichMibByType(componentMonitoringUploadInfo.getVesEvent(), MonitoringUploadType.VES_EVENTS,
268 private void enrichMibByType(MonitoringArtifactInfo monitoringArtifactInfo,
269 MonitoringUploadType type,
270 ServiceArtifact mibServiceArtifact,
271 Map<String, List<ErrorMessage>> errors) {
272 if (monitoringArtifactInfo == null) {
275 FileContentHandler mibs;
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()));
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);
294 private EnrichedServiceModelDao getEnrichedServiceModelDao() {
295 if (enrichedServiceModelDao == null) {
296 enrichedServiceModelDao = EnrichedServiceModelDaoFactory.getInstance().createInterface();
298 return enrichedServiceModelDao;
301 private ComponentDao getComponentDao() {
302 if (componentDao == null) {
303 componentDao = ComponentDaoFactory.getInstance().createInterface();
308 private ComponentArtifactDao getComponentArtifactDao() {
309 if (componentArtifactDao == null) {
310 componentArtifactDao = MonitoringUploadDaoFactory.getInstance().createInterface();
312 return componentArtifactDao;