2 * Copyright © 2018 European Support Limited
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org.openecomp.sdc.enrichment.impl.external.artifact;
19 import static org.openecomp.sdc.tosca.services.ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME;
20 import static org.openecomp.sdc.tosca.services.ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
29 import java.util.Objects;
30 import java.util.Optional;
32 import org.onap.sdc.tosca.datatypes.model.Directive;
33 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
34 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
35 import org.openecomp.core.enrichment.types.ArtifactCategory;
36 import org.openecomp.core.enrichment.types.ComponentMonitoringUploadInfo;
37 import org.openecomp.core.enrichment.types.MonitoringArtifactInfo;
38 import org.openecomp.core.enrichment.types.MonitoringUploadType;
39 import org.openecomp.core.model.dao.EnrichedServiceModelDao;
40 import org.openecomp.core.model.dao.EnrichedServiceModelDaoFactory;
41 import org.openecomp.core.model.types.ServiceArtifact;
42 import org.openecomp.core.utilities.file.FileContentHandler;
43 import org.openecomp.core.utilities.file.FileUtils;
44 import org.openecomp.sdc.common.errors.Messages;
45 import org.openecomp.sdc.common.zip.exception.ZipException;
46 import org.openecomp.sdc.datatypes.error.ErrorLevel;
47 import org.openecomp.sdc.datatypes.error.ErrorMessage;
48 import org.openecomp.sdc.enrichment.EnrichmentInfo;
49 import org.openecomp.sdc.enrichment.inter.ExternalArtifactEnricherInterface;
50 import org.openecomp.sdc.logging.api.Logger;
51 import org.openecomp.sdc.logging.api.LoggerFactory;
52 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
53 import org.openecomp.sdc.tosca.services.DataModelUtil;
54 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentArtifactDao;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.MonitoringUploadDaoFactory;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
59 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentMonitoringUploadEntity;
60 import org.openecomp.sdc.versioning.dao.types.Version;
62 public class MonitoringMibEnricher implements ExternalArtifactEnricherInterface {
64 private EnrichedServiceModelDao enrichedServiceModelDao;
65 private ComponentDao componentDao;
66 private ComponentArtifactDao componentArtifactDao;
67 private static final String COMPONENT_PREFIX = "org.openecomp.resource.vfc.";
69 private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
74 * @param enrichmentInfo the enrichmentInfo
78 public Map<String, List<ErrorMessage>> enrich(EnrichmentInfo enrichmentInfo,
79 ToscaServiceModel serviceModel) {
81 Map<String, List<ErrorMessage>> errors = new HashMap<>();
82 String vspId = enrichmentInfo.getKey();
83 Version version = enrichmentInfo.getVersion();
85 Collection<ComponentEntity> components =
86 getComponentDao().list(new ComponentEntity(vspId, version, null));
88 .forEach(componentEntry -> errors.putAll(enrichComponent(vspId, version, componentEntry,
94 private Map<String, List<ErrorMessage>> enrichComponent(String vspId,
96 ComponentEntity component,
97 ToscaServiceModel serviceModel) {
98 Set<String> abstractNodeTypes =
99 extractAbstractTypesFromSameTypeFromServiceModel(component, serviceModel);
100 return enrichComponent(vspId, version, component, abstractNodeTypes);
103 private Set<String> extractAbstractTypesFromSameTypeFromServiceModel(ComponentEntity component,
104 ToscaServiceModel serviceModel) {
105 Set<String> abstractNodeTypes = new HashSet<>();
106 Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
108 getComponentVfcTypeToCheck(component.getComponentCompositionData().getName());
110 for (ServiceTemplate serviceTemplate : serviceTemplates.values()) {
111 collectAllAbstractNodeTypesPointingToType(
112 typeToCheck, serviceTemplate, serviceTemplates, abstractNodeTypes);
115 return abstractNodeTypes;
118 private String getComponentVfcTypeToCheck(String type) {
119 return Objects.isNull(type) ? ""
120 : type.replace(COMPONENT_PREFIX, COMPONENT_PREFIX + "compute.");
123 private void collectAllAbstractNodeTypesPointingToType(String typeToCheck,
124 ServiceTemplate serviceTemplate,
125 Map<String, ServiceTemplate> serviceTemplates,
126 Set<String> abstractNodeTypes) {
127 Map<String, NodeTemplate> nodeTemplates =
128 DataModelUtil.getNodeTemplates(serviceTemplate);
130 for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
131 handleNodeTemplate(nodeTemplateEntry.getValue(), typeToCheck,
132 serviceTemplates, abstractNodeTypes);
136 private void handleNodeTemplate(NodeTemplate nodeTemplate,
138 Map<String, ServiceTemplate> serviceTemplates,
139 Set<String> abstractNodeTypes) {
140 List<String> directives = DataModelUtil.getDirectives(nodeTemplate);
141 if (directives.contains(Directive.SUBSTITUTABLE.getDisplayName())) {
142 handleSubstitutionServiceTemplate(typeToCheck, nodeTemplate, serviceTemplates,
147 private void handleSubstitutionServiceTemplate(String typeToCheck,
148 NodeTemplate nodeTemplate,
149 Map<String, ServiceTemplate> serviceTemplates,
150 Set<String> abstractNodeTypes) {
151 Object serviceTemplateFilter =
152 DataModelUtil.getPropertyValue(nodeTemplate, SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
153 if (Objects.nonNull(serviceTemplateFilter) && serviceTemplateFilter instanceof Map) {
154 String substituteServiceTemplateName =
155 (String) ((Map<String, Object>) serviceTemplateFilter)
156 .get(SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME);
157 ServiceTemplate substituteServiceTemplate =
158 serviceTemplates.get(substituteServiceTemplateName);
159 if (doesNodeTypeExistInSubServiceTemplate(typeToCheck, substituteServiceTemplate)) {
160 abstractNodeTypes.add(nodeTemplate.getType());
165 private boolean doesNodeTypeExistInSubServiceTemplate(String nodeTypeId,
166 ServiceTemplate substituteServiceTemplate) {
168 .nonNull(DataModelUtil.getNodeType(substituteServiceTemplate, nodeTypeId));
171 Map<String, List<ErrorMessage>> enrichComponent(String vspId,
173 ComponentEntity componentEntry,
174 Set<String> abstractNodeTypes) {
175 Map<String, List<ErrorMessage>> errors = new HashMap<>();
177 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList =
178 extractComponentMibInfo(vspId, version, componentEntry, abstractNodeTypes);
180 componentMonitoringUploadInfoList.forEach(
181 componentUploadInfo -> enrichComponentMib(vspId, version, componentUploadInfo, errors));
185 private List<ComponentMonitoringUploadInfo> extractComponentMibInfo(String vspId, Version version,
186 ComponentEntity componentEntity,
187 Set<String> abstractNodeTypes) {
188 String componentId = componentEntity.getId();
189 ComponentMonitoringUploadEntity entity = new ComponentMonitoringUploadEntity();
191 entity.setVspId(vspId);
192 entity.setVersion(version);
193 entity.setComponentId(componentId);
194 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = new ArrayList<>();
196 abstractNodeTypes.forEach(unifiedComponentNodeType -> componentMonitoringUploadInfoList
197 .add(updComponentMibInfoByType(unifiedComponentNodeType, entity)));
198 return componentMonitoringUploadInfoList;
201 private ComponentMonitoringUploadInfo updComponentMibInfoByType(String componentName,
202 ComponentMonitoringUploadEntity componentMonitoringUploadEntity) {
203 ComponentMonitoringUploadInfo componentMonitoringUploadInfo =
204 new ComponentMonitoringUploadInfo();
206 for (MonitoringUploadType type : MonitoringUploadType.values()) {
207 componentMonitoringUploadEntity.setType(type);
208 Optional<ComponentMonitoringUploadEntity> artifact =
209 getComponentArtifactDao().getByType(componentMonitoringUploadEntity);
211 if (!artifact.isPresent()) {
214 ComponentMonitoringUploadEntity mibArtifact = artifact.get();
215 updateComponentMonitoringUploadInfoWithMib(getArtifactPath(type, componentName), type,
217 componentMonitoringUploadInfo);
219 return componentMonitoringUploadInfo;
222 private String getArtifactPath(MonitoringUploadType type, String unifiedComponentNodeType) {
223 return unifiedComponentNodeType + File.separator + ArtifactCategory.DEPLOYMENT.getDisplayName()
224 + File.separator + type.name();
227 private void updateComponentMonitoringUploadInfoWithMib(String path,
228 MonitoringUploadType type,
229 ComponentMonitoringUploadEntity mibArtifact,
230 ComponentMonitoringUploadInfo componentMonitoringUploadInfo) {
231 MonitoringArtifactInfo monitoringArtifactInfo = new MonitoringArtifactInfo();
232 monitoringArtifactInfo.setName(path);
233 monitoringArtifactInfo.setContent(mibArtifact.getArtifact().array());
234 componentMonitoringUploadInfo.setMonitoringArtifactFile(type, monitoringArtifactInfo);
237 private void enrichComponentMib(String vspId,
239 ComponentMonitoringUploadInfo componentUploadInfo,
240 Map<String, List<ErrorMessage>> errors) {
241 ServiceArtifact mibServiceArtifact = new ServiceArtifact();
242 mibServiceArtifact.setVspId(vspId);
243 mibServiceArtifact.setVersion(version);
244 enrichMibFiles(mibServiceArtifact, componentUploadInfo, errors);
247 private void enrichMibFiles(ServiceArtifact monitoringArtifact,
248 ComponentMonitoringUploadInfo componentMonitoringUploadInfo,
249 Map<String, List<ErrorMessage>> errors) {
250 if (componentMonitoringUploadInfo == null) {
253 enrichMibByType(componentMonitoringUploadInfo.getSnmpTrap(), MonitoringUploadType.SNMP_TRAP,
256 enrichMibByType(componentMonitoringUploadInfo.getSnmpPoll(), MonitoringUploadType.SNMP_POLL,
259 enrichMibByType(componentMonitoringUploadInfo.getVesEvent(), MonitoringUploadType.VES_EVENTS,
264 private void enrichMibByType(MonitoringArtifactInfo monitoringArtifactInfo,
265 MonitoringUploadType type,
266 ServiceArtifact mibServiceArtifact,
267 Map<String, List<ErrorMessage>> errors) {
268 if (monitoringArtifactInfo == null) {
271 FileContentHandler mibs;
274 .getFileContentMapFromZip(FileUtils.toByteArray(monitoringArtifactInfo.getContent()));
275 } catch (ZipException ex) {
276 log.error("Failed to get file content map from zip ", ex);
277 ErrorMessage.ErrorMessageUtil
278 .addMessage(mibServiceArtifact.getName() + "." + type.name(), errors)
279 .add(new ErrorMessage(ErrorLevel.ERROR, Messages.INVALID_ZIP_FILE.getErrorMessage()));
282 Set<String> fileList = mibs.getFileList();
283 for (String fileName : fileList) {
284 mibServiceArtifact.setContentData(mibs.getFileContent(fileName));
285 mibServiceArtifact.setName(monitoringArtifactInfo.getName() + File.separator + fileName);
286 getEnrichedServiceModelDao().storeExternalArtifact(mibServiceArtifact);
290 private EnrichedServiceModelDao getEnrichedServiceModelDao() {
291 if (enrichedServiceModelDao == null) {
292 enrichedServiceModelDao = EnrichedServiceModelDaoFactory.getInstance().createInterface();
294 return enrichedServiceModelDao;
297 private ComponentDao getComponentDao() {
298 if (componentDao == null) {
299 componentDao = ComponentDaoFactory.getInstance().createInterface();
304 private ComponentArtifactDao getComponentArtifactDao() {
305 if (componentArtifactDao == null) {
306 componentArtifactDao = MonitoringUploadDaoFactory.getInstance().createInterface();
308 return componentArtifactDao;