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.io.IOException;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.List;
30 import java.util.Objects;
31 import java.util.Optional;
34 import org.onap.sdc.tosca.datatypes.model.Directive;
35 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
36 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
37 import org.openecomp.core.enrichment.types.ArtifactCategory;
38 import org.openecomp.core.enrichment.types.ComponentMonitoringUploadInfo;
39 import org.openecomp.core.enrichment.types.MonitoringArtifactInfo;
40 import org.openecomp.core.enrichment.types.MonitoringUploadType;
41 import org.openecomp.core.model.dao.EnrichedServiceModelDao;
42 import org.openecomp.core.model.dao.EnrichedServiceModelDaoFactory;
43 import org.openecomp.core.model.types.ServiceArtifact;
44 import org.openecomp.core.utilities.file.FileContentHandler;
45 import org.openecomp.core.utilities.file.FileUtils;
46 import org.openecomp.sdc.common.errors.Messages;
47 import org.openecomp.sdc.datatypes.error.ErrorLevel;
48 import org.openecomp.sdc.datatypes.error.ErrorMessage;
49 import org.openecomp.sdc.enrichment.EnrichmentInfo;
50 import org.openecomp.sdc.enrichment.inter.ExternalArtifactEnricherInterface;
51 import org.openecomp.sdc.logging.api.Logger;
52 import org.openecomp.sdc.logging.api.LoggerFactory;
53 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
54 import org.openecomp.sdc.tosca.services.DataModelUtil;
55 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentArtifactDao;
56 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
57 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
58 import org.openecomp.sdc.vendorsoftwareproduct.dao.MonitoringUploadDaoFactory;
59 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
60 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentMonitoringUploadEntity;
61 import org.openecomp.sdc.versioning.dao.types.Version;
63 public class MonitoringMibEnricher implements ExternalArtifactEnricherInterface {
65 private EnrichedServiceModelDao enrichedServiceModelDao;
66 private ComponentDao componentDao;
67 private ComponentArtifactDao componentArtifactDao;
68 private static final String COMPONENT_PREFIX = "org.openecomp.resource.vfc.";
70 private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
75 * @param enrichmentInfo the enrichmentInfo
79 public Map<String, List<ErrorMessage>> enrich(EnrichmentInfo enrichmentInfo,
80 ToscaServiceModel serviceModel) {
82 Map<String, List<ErrorMessage>> errors = new HashMap<>();
83 String vspId = enrichmentInfo.getKey();
84 Version version = enrichmentInfo.getVersion();
86 Collection<ComponentEntity> components =
87 getComponentDao().list(new ComponentEntity(vspId, version, null));
89 .forEach(componentEntry -> errors.putAll(enrichComponent(vspId, version, componentEntry,
95 private Map<String, List<ErrorMessage>> enrichComponent(String vspId,
97 ComponentEntity component,
98 ToscaServiceModel serviceModel) {
99 Set<String> abstractNodeTypes =
100 extractAbstractTypesFromSameTypeFromServiceModel(component, serviceModel);
101 return enrichComponent(vspId, version, component, abstractNodeTypes);
104 private Set<String> extractAbstractTypesFromSameTypeFromServiceModel(ComponentEntity component,
105 ToscaServiceModel serviceModel) {
106 Set<String> abstractNodeTypes = new HashSet<>();
107 Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
109 getComponentVfcTypeToCheck(component.getComponentCompositionData().getName());
111 for (ServiceTemplate serviceTemplate : serviceTemplates.values()) {
112 collectAllAbstractNodeTypesPointingToType(
113 typeToCheck, serviceTemplate, serviceTemplates, abstractNodeTypes);
116 return abstractNodeTypes;
119 private String getComponentVfcTypeToCheck(String type) {
120 return Objects.isNull(type) ? ""
121 : type.replace(COMPONENT_PREFIX, COMPONENT_PREFIX + "compute.");
124 private void collectAllAbstractNodeTypesPointingToType(String typeToCheck,
125 ServiceTemplate serviceTemplate,
126 Map<String, ServiceTemplate> serviceTemplates,
127 Set<String> abstractNodeTypes) {
128 Map<String, NodeTemplate> nodeTemplates =
129 DataModelUtil.getNodeTemplates(serviceTemplate);
131 for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
132 handleNodeTemplate(nodeTemplateEntry.getValue(), typeToCheck,
133 serviceTemplates, abstractNodeTypes);
137 private void handleNodeTemplate(NodeTemplate nodeTemplate,
139 Map<String, ServiceTemplate> serviceTemplates,
140 Set<String> abstractNodeTypes) {
141 List<String> directives = DataModelUtil.getDirectives(nodeTemplate);
142 if (directives.contains(Directive.SUBSTITUTABLE.getDisplayName())) {
143 handleSubstitutionServiceTemplate(typeToCheck, nodeTemplate, serviceTemplates,
148 private void handleSubstitutionServiceTemplate(String typeToCheck,
149 NodeTemplate nodeTemplate,
150 Map<String, ServiceTemplate> serviceTemplates,
151 Set<String> abstractNodeTypes) {
152 Object serviceTemplateFilter =
153 DataModelUtil.getPropertyValue(nodeTemplate, SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
154 if (Objects.nonNull(serviceTemplateFilter) && serviceTemplateFilter instanceof Map) {
155 String substituteServiceTemplateName =
156 (String) ((Map<String, Object>) serviceTemplateFilter)
157 .get(SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME);
158 ServiceTemplate substituteServiceTemplate =
159 serviceTemplates.get(substituteServiceTemplateName);
160 if (doesNodeTypeExistInSubServiceTemplate(typeToCheck, substituteServiceTemplate)) {
161 abstractNodeTypes.add(nodeTemplate.getType());
166 private boolean doesNodeTypeExistInSubServiceTemplate(String nodeTypeId,
167 ServiceTemplate substituteServiceTemplate) {
169 .nonNull(DataModelUtil.getNodeType(substituteServiceTemplate, nodeTypeId));
172 Map<String, List<ErrorMessage>> enrichComponent(String vspId,
174 ComponentEntity componentEntry,
175 Set<String> abstractNodeTypes) {
176 Map<String, List<ErrorMessage>> errors = new HashMap<>();
178 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList =
179 extractComponentMibInfo(vspId, version, componentEntry, abstractNodeTypes);
181 componentMonitoringUploadInfoList.forEach(
182 componentUploadInfo -> enrichComponentMib(vspId, version, componentUploadInfo, errors));
186 private List<ComponentMonitoringUploadInfo> extractComponentMibInfo(String vspId, Version version,
187 ComponentEntity componentEntity,
188 Set<String> abstractNodeTypes) {
189 String componentId = componentEntity.getId();
190 ComponentMonitoringUploadEntity entity = new ComponentMonitoringUploadEntity();
192 entity.setVspId(vspId);
193 entity.setVersion(version);
194 entity.setComponentId(componentId);
195 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = new ArrayList<>();
197 abstractNodeTypes.forEach(unifiedComponentNodeType -> componentMonitoringUploadInfoList
198 .add(updComponentMibInfoByType(unifiedComponentNodeType, entity)));
199 return componentMonitoringUploadInfoList;
202 private ComponentMonitoringUploadInfo updComponentMibInfoByType(String componentName,
203 ComponentMonitoringUploadEntity componentMonitoringUploadEntity) {
204 ComponentMonitoringUploadInfo componentMonitoringUploadInfo =
205 new ComponentMonitoringUploadInfo();
207 for (MonitoringUploadType type : MonitoringUploadType.values()) {
208 componentMonitoringUploadEntity.setType(type);
209 Optional<ComponentMonitoringUploadEntity> artifact =
210 getComponentArtifactDao().getByType(componentMonitoringUploadEntity);
212 if (!artifact.isPresent()) {
215 ComponentMonitoringUploadEntity mibArtifact = artifact.get();
216 updateComponentMonitoringUploadInfoWithMib(getArtifactPath(type, componentName), type,
218 componentMonitoringUploadInfo);
220 return componentMonitoringUploadInfo;
223 private String getArtifactPath(MonitoringUploadType type, String unifiedComponentNodeType) {
224 return unifiedComponentNodeType + File.separator + ArtifactCategory.DEPLOYMENT.getDisplayName()
225 + File.separator + type.name();
228 private void updateComponentMonitoringUploadInfoWithMib(String path,
229 MonitoringUploadType type,
230 ComponentMonitoringUploadEntity mibArtifact,
231 ComponentMonitoringUploadInfo componentMonitoringUploadInfo) {
232 MonitoringArtifactInfo monitoringArtifactInfo = new MonitoringArtifactInfo();
233 monitoringArtifactInfo.setName(path);
234 monitoringArtifactInfo.setContent(mibArtifact.getArtifact().array());
235 componentMonitoringUploadInfo.setMonitoringArtifactFile(type, monitoringArtifactInfo);
238 private void enrichComponentMib(String vspId,
240 ComponentMonitoringUploadInfo componentUploadInfo,
241 Map<String, List<ErrorMessage>> errors) {
242 ServiceArtifact mibServiceArtifact = new ServiceArtifact();
243 mibServiceArtifact.setVspId(vspId);
244 mibServiceArtifact.setVersion(version);
245 enrichMibFiles(mibServiceArtifact, componentUploadInfo, errors);
248 private void enrichMibFiles(ServiceArtifact monitoringArtifact,
249 ComponentMonitoringUploadInfo componentMonitoringUploadInfo,
250 Map<String, List<ErrorMessage>> errors) {
251 if (componentMonitoringUploadInfo == null) {
254 enrichMibByType(componentMonitoringUploadInfo.getSnmpTrap(), MonitoringUploadType.SNMP_TRAP,
257 enrichMibByType(componentMonitoringUploadInfo.getSnmpPoll(), MonitoringUploadType.SNMP_POLL,
260 enrichMibByType(componentMonitoringUploadInfo.getVesEvent(), MonitoringUploadType.VES_EVENTS,
265 private void enrichMibByType(MonitoringArtifactInfo monitoringArtifactInfo,
266 MonitoringUploadType type,
267 ServiceArtifact mibServiceArtifact,
268 Map<String, List<ErrorMessage>> errors) {
269 if (monitoringArtifactInfo == null) {
272 FileContentHandler mibs;
275 .getFileContentMapFromZip(FileUtils.toByteArray(monitoringArtifactInfo.getContent()));
276 } catch (IOException ioException) {
277 log.error("Failed to get file content map from zip ", ioException);
278 ErrorMessage.ErrorMessageUtil
279 .addMessage(mibServiceArtifact.getName() + "." + type.name(), errors)
280 .add(new ErrorMessage(ErrorLevel.ERROR, Messages.INVALID_ZIP_FILE.getErrorMessage()));
283 Set<String> fileList = mibs.getFileList();
284 for (String fileName : fileList) {
285 mibServiceArtifact.setContentData(FileUtils.toByteArray(mibs.getFileContent(fileName)));
286 mibServiceArtifact.setName(monitoringArtifactInfo.getName() + File.separator + fileName);
287 getEnrichedServiceModelDao().storeExternalArtifact(mibServiceArtifact);
291 private EnrichedServiceModelDao getEnrichedServiceModelDao() {
292 if (enrichedServiceModelDao == null) {
293 enrichedServiceModelDao = EnrichedServiceModelDaoFactory.getInstance().createInterface();
295 return enrichedServiceModelDao;
298 private ComponentDao getComponentDao() {
299 if (componentDao == null) {
300 componentDao = ComponentDaoFactory.getInstance().createInterface();
305 private ComponentArtifactDao getComponentArtifactDao() {
306 if (componentArtifactDao == null) {
307 componentArtifactDao = MonitoringUploadDaoFactory.getInstance().createInterface();
309 return componentArtifactDao;