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.
16 package org.openecomp.sdc.enrichment.impl.external.artifact;
18 import static org.openecomp.sdc.tosca.services.ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME;
19 import static org.openecomp.sdc.tosca.services.ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME;
22 import java.io.IOException;
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.datatypes.error.ErrorLevel;
46 import org.openecomp.sdc.datatypes.error.ErrorMessage;
47 import org.openecomp.sdc.enrichment.EnrichmentInfo;
48 import org.openecomp.sdc.enrichment.inter.ExternalArtifactEnricherInterface;
49 import org.openecomp.sdc.logging.api.Logger;
50 import org.openecomp.sdc.logging.api.LoggerFactory;
51 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
52 import org.openecomp.sdc.tosca.services.DataModelUtil;
53 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentArtifactDao;
54 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.MonitoringUploadDaoFactory;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentMonitoringUploadEntity;
59 import org.openecomp.sdc.versioning.dao.types.Version;
61 public class MonitoringMibEnricher implements ExternalArtifactEnricherInterface {
63 private static final String COMPONENT_PREFIX = "org.openecomp.resource.vfc.";
64 private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
65 private EnrichedServiceModelDao enrichedServiceModelDao;
66 private ComponentDao componentDao;
67 private ComponentArtifactDao componentArtifactDao;
72 * @param enrichmentInfo the enrichmentInfo
76 public Map<String, List<ErrorMessage>> enrich(EnrichmentInfo enrichmentInfo, ToscaServiceModel serviceModel) {
77 Map<String, List<ErrorMessage>> errors = new HashMap<>();
78 String vspId = enrichmentInfo.getKey();
79 Version version = enrichmentInfo.getVersion();
80 Collection<ComponentEntity> components = getComponentDao().list(new ComponentEntity(vspId, version, null));
81 components.forEach(componentEntry -> errors.putAll(enrichComponent(vspId, version, componentEntry, serviceModel)));
85 private Map<String, List<ErrorMessage>> enrichComponent(String vspId, Version version, ComponentEntity component,
86 ToscaServiceModel serviceModel) {
87 Set<String> abstractNodeTypes = extractAbstractTypesFromSameTypeFromServiceModel(component, serviceModel);
88 return enrichComponent(vspId, version, component, abstractNodeTypes);
91 private Set<String> extractAbstractTypesFromSameTypeFromServiceModel(ComponentEntity component, ToscaServiceModel serviceModel) {
92 Set<String> abstractNodeTypes = new HashSet<>();
93 Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
94 String typeToCheck = getComponentVfcTypeToCheck(component.getComponentCompositionData().getName());
95 for (ServiceTemplate serviceTemplate : serviceTemplates.values()) {
96 collectAllAbstractNodeTypesPointingToType(typeToCheck, serviceTemplate, serviceTemplates, abstractNodeTypes);
98 return abstractNodeTypes;
101 private String getComponentVfcTypeToCheck(String type) {
102 return Objects.isNull(type) ? "" : type.replace(COMPONENT_PREFIX, COMPONENT_PREFIX + "compute.");
105 private void collectAllAbstractNodeTypesPointingToType(String typeToCheck, ServiceTemplate serviceTemplate,
106 Map<String, ServiceTemplate> serviceTemplates, Set<String> abstractNodeTypes) {
107 Map<String, NodeTemplate> nodeTemplates = DataModelUtil.getNodeTemplates(serviceTemplate);
108 for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
109 handleNodeTemplate(nodeTemplateEntry.getValue(), typeToCheck, serviceTemplates, abstractNodeTypes);
113 private void handleNodeTemplate(NodeTemplate nodeTemplate, String typeToCheck, Map<String, ServiceTemplate> serviceTemplates,
114 Set<String> abstractNodeTypes) {
115 List<String> directives = DataModelUtil.getDirectives(nodeTemplate);
116 if (directives.contains(Directive.SUBSTITUTABLE.getDisplayName())) {
117 handleSubstitutionServiceTemplate(typeToCheck, nodeTemplate, serviceTemplates, abstractNodeTypes);
121 private void handleSubstitutionServiceTemplate(String typeToCheck, NodeTemplate nodeTemplate, Map<String, ServiceTemplate> serviceTemplates,
122 Set<String> abstractNodeTypes) {
123 Object serviceTemplateFilter = DataModelUtil.getPropertyValue(nodeTemplate, SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
124 if (Objects.nonNull(serviceTemplateFilter) && serviceTemplateFilter instanceof Map) {
125 String substituteServiceTemplateName = (String) ((Map<String, Object>) serviceTemplateFilter)
126 .get(SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME);
127 ServiceTemplate substituteServiceTemplate = serviceTemplates.get(substituteServiceTemplateName);
128 if (doesNodeTypeExistInSubServiceTemplate(typeToCheck, substituteServiceTemplate)) {
129 abstractNodeTypes.add(nodeTemplate.getType());
134 private boolean doesNodeTypeExistInSubServiceTemplate(String nodeTypeId, ServiceTemplate substituteServiceTemplate) {
135 return Objects.nonNull(DataModelUtil.getNodeType(substituteServiceTemplate, nodeTypeId));
138 Map<String, List<ErrorMessage>> enrichComponent(String vspId, Version version, ComponentEntity componentEntry, Set<String> abstractNodeTypes) {
139 Map<String, List<ErrorMessage>> errors = new HashMap<>();
140 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = extractComponentMibInfo(vspId, version, componentEntry,
142 componentMonitoringUploadInfoList.forEach(componentUploadInfo -> enrichComponentMib(vspId, version, componentUploadInfo, errors));
146 private List<ComponentMonitoringUploadInfo> extractComponentMibInfo(String vspId, Version version, ComponentEntity componentEntity,
147 Set<String> abstractNodeTypes) {
148 String componentId = componentEntity.getId();
149 ComponentMonitoringUploadEntity entity = new ComponentMonitoringUploadEntity();
150 entity.setVspId(vspId);
151 entity.setVersion(version);
152 entity.setComponentId(componentId);
153 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = new ArrayList<>();
155 .forEach(unifiedComponentNodeType -> componentMonitoringUploadInfoList.add(updComponentMibInfoByType(unifiedComponentNodeType, entity)));
156 return componentMonitoringUploadInfoList;
159 private ComponentMonitoringUploadInfo updComponentMibInfoByType(String componentName,
160 ComponentMonitoringUploadEntity componentMonitoringUploadEntity) {
161 ComponentMonitoringUploadInfo componentMonitoringUploadInfo = new ComponentMonitoringUploadInfo();
162 for (MonitoringUploadType type : MonitoringUploadType.values()) {
163 componentMonitoringUploadEntity.setType(type);
164 Optional<ComponentMonitoringUploadEntity> artifact = getComponentArtifactDao().getByType(componentMonitoringUploadEntity);
165 if (!artifact.isPresent()) {
168 ComponentMonitoringUploadEntity mibArtifact = artifact.get();
169 updateComponentMonitoringUploadInfoWithMib(getArtifactPath(type, componentName), type, mibArtifact, componentMonitoringUploadInfo);
171 return componentMonitoringUploadInfo;
174 private String getArtifactPath(MonitoringUploadType type, String unifiedComponentNodeType) {
175 return unifiedComponentNodeType + File.separator + ArtifactCategory.DEPLOYMENT.getDisplayName() + File.separator + type.name();
178 private void updateComponentMonitoringUploadInfoWithMib(String path, MonitoringUploadType type, ComponentMonitoringUploadEntity mibArtifact,
179 ComponentMonitoringUploadInfo componentMonitoringUploadInfo) {
180 MonitoringArtifactInfo monitoringArtifactInfo = new MonitoringArtifactInfo();
181 monitoringArtifactInfo.setName(path);
182 monitoringArtifactInfo.setContent(mibArtifact.getArtifact().array());
183 componentMonitoringUploadInfo.setMonitoringArtifactFile(type, monitoringArtifactInfo);
186 private void enrichComponentMib(String vspId, Version version, ComponentMonitoringUploadInfo componentUploadInfo,
187 Map<String, List<ErrorMessage>> errors) {
188 ServiceArtifact mibServiceArtifact = new ServiceArtifact();
189 mibServiceArtifact.setVspId(vspId);
190 mibServiceArtifact.setVersion(version);
191 enrichMibFiles(mibServiceArtifact, componentUploadInfo, errors);
194 private void enrichMibFiles(ServiceArtifact monitoringArtifact, ComponentMonitoringUploadInfo componentMonitoringUploadInfo,
195 Map<String, List<ErrorMessage>> errors) {
196 if (componentMonitoringUploadInfo == null) {
199 enrichMibByType(componentMonitoringUploadInfo.getSnmpTrap(), MonitoringUploadType.SNMP_TRAP, monitoringArtifact, errors);
200 enrichMibByType(componentMonitoringUploadInfo.getSnmpPoll(), MonitoringUploadType.SNMP_POLL, monitoringArtifact, errors);
201 enrichMibByType(componentMonitoringUploadInfo.getVesEvent(), MonitoringUploadType.VES_EVENTS, monitoringArtifact, errors);
204 private void enrichMibByType(MonitoringArtifactInfo monitoringArtifactInfo, MonitoringUploadType type, ServiceArtifact mibServiceArtifact,
205 Map<String, List<ErrorMessage>> errors) {
206 if (monitoringArtifactInfo == null) {
209 FileContentHandler mibs;
211 mibs = FileUtils.getFileContentMapFromZip(monitoringArtifactInfo.getContent());
212 } catch (final IOException ex) {
213 log.error("Failed to get file content map from zip ", ex);
214 ErrorMessage.ErrorMessageUtil.addMessage(mibServiceArtifact.getName() + "." + type.name(), errors)
215 .add(new ErrorMessage(ErrorLevel.ERROR, Messages.INVALID_ZIP_FILE.getErrorMessage()));
218 Set<String> fileList = mibs.getFileList();
219 for (String fileName : fileList) {
220 mibServiceArtifact.setContentData(mibs.getFileContent(fileName));
221 mibServiceArtifact.setName(monitoringArtifactInfo.getName() + File.separator + fileName);
222 getEnrichedServiceModelDao().storeExternalArtifact(mibServiceArtifact);
226 private EnrichedServiceModelDao getEnrichedServiceModelDao() {
227 if (enrichedServiceModelDao == null) {
228 enrichedServiceModelDao = EnrichedServiceModelDaoFactory.getInstance().createInterface();
230 return enrichedServiceModelDao;
233 private ComponentDao getComponentDao() {
234 if (componentDao == null) {
235 componentDao = ComponentDaoFactory.getInstance().createInterface();
240 private ComponentArtifactDao getComponentArtifactDao() {
241 if (componentArtifactDao == null) {
242 componentArtifactDao = MonitoringUploadDaoFactory.getInstance().createInterface();
244 return componentArtifactDao;