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 org.onap.sdc.tosca.datatypes.model.Directive;
20 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
21 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
22 import org.openecomp.core.enrichment.types.ArtifactCategory;
23 import org.openecomp.core.enrichment.types.ComponentMonitoringUploadInfo;
24 import org.openecomp.core.enrichment.types.MonitoringArtifactInfo;
25 import org.openecomp.core.enrichment.types.MonitoringUploadType;
26 import org.openecomp.core.model.dao.EnrichedServiceModelDao;
27 import org.openecomp.core.model.dao.EnrichedServiceModelDaoFactory;
28 import org.openecomp.core.model.types.ServiceArtifact;
29 import org.openecomp.core.utilities.file.FileContentHandler;
30 import org.openecomp.core.utilities.file.FileUtils;
31 import org.openecomp.sdc.common.errors.Messages;
32 import org.openecomp.sdc.datatypes.error.ErrorLevel;
33 import org.openecomp.sdc.datatypes.error.ErrorMessage;
34 import org.openecomp.sdc.enrichment.EnrichmentInfo;
35 import org.openecomp.sdc.enrichment.inter.ExternalArtifactEnricherInterface;
36 import org.openecomp.sdc.logging.api.Logger;
37 import org.openecomp.sdc.logging.api.LoggerFactory;
38 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
39 import org.openecomp.sdc.tosca.services.DataModelUtil;
40 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentArtifactDao;
41 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDao;
42 import org.openecomp.sdc.vendorsoftwareproduct.dao.ComponentDaoFactory;
43 import org.openecomp.sdc.vendorsoftwareproduct.dao.MonitoringUploadDaoFactory;
44 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentEntity;
45 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentMonitoringUploadEntity;
46 import org.openecomp.sdc.versioning.dao.types.Version;
49 import java.io.IOException;
52 import static org.openecomp.sdc.tosca.services.ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME;
53 import static org.openecomp.sdc.tosca.services.ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME;
55 public class MonitoringMibEnricher implements ExternalArtifactEnricherInterface {
57 private EnrichedServiceModelDao enrichedServiceModelDao;
58 private ComponentDao componentDao;
59 private ComponentArtifactDao componentArtifactDao;
60 private static final String COMPONENT_PREFIX = "org.openecomp.resource.vfc.";
62 private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
67 * @param enrichmentInfo the enrichmentInfo
71 public Map<String, List<ErrorMessage>> enrich(EnrichmentInfo enrichmentInfo,
72 ToscaServiceModel serviceModel) {
74 Map<String, List<ErrorMessage>> errors = new HashMap<>();
75 String vspId = enrichmentInfo.getKey();
76 Version version = enrichmentInfo.getVersion();
78 Collection<ComponentEntity> components =
79 getComponentDao().list(new ComponentEntity(vspId, version, null));
81 .forEach(componentEntry -> errors.putAll(enrichComponent(vspId, version, componentEntry,
87 private Map<String, List<ErrorMessage>> enrichComponent(String vspId,
89 ComponentEntity component,
90 ToscaServiceModel serviceModel) {
91 Set<String> abstractNodeTypes =
92 extractAbstractTypesFromSameTypeFromServiceModel(component, serviceModel);
93 return enrichComponent(vspId, version, component, abstractNodeTypes);
96 private Set<String> extractAbstractTypesFromSameTypeFromServiceModel(ComponentEntity component,
97 ToscaServiceModel serviceModel) {
98 Set<String> abstractNodeTypes = new HashSet<>();
99 Map<String, ServiceTemplate> serviceTemplates = serviceModel.getServiceTemplates();
101 getComponentVfcTypeToCheck(component.getComponentCompositionData().getName());
103 for (ServiceTemplate serviceTemplate : serviceTemplates.values()) {
104 collectAllAbstractNodeTypesPointingToType(
105 typeToCheck, serviceTemplate, serviceTemplates, abstractNodeTypes);
108 return abstractNodeTypes;
111 private String getComponentVfcTypeToCheck(String type) {
112 return Objects.isNull(type) ? ""
113 : type.replace(COMPONENT_PREFIX, COMPONENT_PREFIX + "compute.");
116 private void collectAllAbstractNodeTypesPointingToType(String typeToCheck,
117 ServiceTemplate serviceTemplate,
118 Map<String, ServiceTemplate> serviceTemplates,
119 Set<String> abstractNodeTypes) {
120 Map<String, NodeTemplate> nodeTemplates =
121 DataModelUtil.getNodeTemplates(serviceTemplate);
123 for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : nodeTemplates.entrySet()) {
124 handleNodeTemplate(nodeTemplateEntry.getValue(), typeToCheck,
125 serviceTemplates, abstractNodeTypes);
129 private void handleNodeTemplate(NodeTemplate nodeTemplate,
131 Map<String, ServiceTemplate> serviceTemplates,
132 Set<String> abstractNodeTypes) {
133 List<String> directives = DataModelUtil.getDirectives(nodeTemplate);
134 if (directives.contains(Directive.SUBSTITUTABLE.getDisplayName())) {
135 handleSubstitutionServiceTemplate(typeToCheck, nodeTemplate, serviceTemplates,
140 private void handleSubstitutionServiceTemplate(String typeToCheck,
141 NodeTemplate nodeTemplate,
142 Map<String, ServiceTemplate> serviceTemplates,
143 Set<String> abstractNodeTypes) {
144 Object serviceTemplateFilter =
145 DataModelUtil.getPropertyValue(nodeTemplate, SERVICE_TEMPLATE_FILTER_PROPERTY_NAME);
146 if (Objects.nonNull(serviceTemplateFilter) && serviceTemplateFilter instanceof Map) {
147 String substituteServiceTemplateName =
148 (String) ((Map<String, Object>) serviceTemplateFilter)
149 .get(SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME);
150 ServiceTemplate substituteServiceTemplate =
151 serviceTemplates.get(substituteServiceTemplateName);
152 if (doesNodeTypeExistInSubServiceTemplate(typeToCheck, substituteServiceTemplate)) {
153 abstractNodeTypes.add(nodeTemplate.getType());
158 private boolean doesNodeTypeExistInSubServiceTemplate(String nodeTypeId,
159 ServiceTemplate substituteServiceTemplate) {
161 .nonNull(DataModelUtil.getNodeType(substituteServiceTemplate, nodeTypeId));
164 Map<String, List<ErrorMessage>> enrichComponent(String vspId,
166 ComponentEntity componentEntry,
167 Set<String> abstractNodeTypes) {
168 Map<String, List<ErrorMessage>> errors = new HashMap<>();
170 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList =
171 extractComponentMibInfo(vspId, version, componentEntry, abstractNodeTypes);
173 componentMonitoringUploadInfoList.forEach(
174 componentUploadInfo -> enrichComponentMib(vspId, version, componentUploadInfo, errors));
178 private List<ComponentMonitoringUploadInfo> extractComponentMibInfo(String vspId, Version version,
179 ComponentEntity componentEntity,
180 Set<String> abstractNodeTypes) {
181 String componentId = componentEntity.getId();
182 ComponentMonitoringUploadEntity entity = new ComponentMonitoringUploadEntity();
184 entity.setVspId(vspId);
185 entity.setVersion(version);
186 entity.setComponentId(componentId);
187 List<ComponentMonitoringUploadInfo> componentMonitoringUploadInfoList = new ArrayList<>();
189 abstractNodeTypes.forEach(unifiedComponentNodeType -> componentMonitoringUploadInfoList
190 .add(updComponentMibInfoByType(unifiedComponentNodeType, entity)));
191 return componentMonitoringUploadInfoList;
194 private ComponentMonitoringUploadInfo updComponentMibInfoByType(String componentName,
195 ComponentMonitoringUploadEntity componentMonitoringUploadEntity) {
196 ComponentMonitoringUploadInfo componentMonitoringUploadInfo =
197 new ComponentMonitoringUploadInfo();
199 for (MonitoringUploadType type : MonitoringUploadType.values()) {
200 componentMonitoringUploadEntity.setType(type);
201 Optional<ComponentMonitoringUploadEntity> artifact =
202 getComponentArtifactDao().getByType(componentMonitoringUploadEntity);
204 if (!artifact.isPresent()) {
207 ComponentMonitoringUploadEntity mibArtifact = artifact.get();
208 updateComponentMonitoringUploadInfoWithMib(getArtifactPath(type, componentName), type,
210 componentMonitoringUploadInfo);
212 return componentMonitoringUploadInfo;
215 private String getArtifactPath(MonitoringUploadType type, String unifiedComponentNodeType) {
216 return unifiedComponentNodeType + File.separator + ArtifactCategory.DEPLOYMENT.getDisplayName()
217 + File.separator + type.name();
220 private void updateComponentMonitoringUploadInfoWithMib(String path,
221 MonitoringUploadType type,
222 ComponentMonitoringUploadEntity mibArtifact,
223 ComponentMonitoringUploadInfo componentMonitoringUploadInfo) {
224 MonitoringArtifactInfo monitoringArtifactInfo = new MonitoringArtifactInfo();
225 monitoringArtifactInfo.setName(path);
226 monitoringArtifactInfo.setContent(mibArtifact.getArtifact().array());
227 componentMonitoringUploadInfo.setMonitoringArtifactFile(type, monitoringArtifactInfo);
230 private void enrichComponentMib(String vspId,
232 ComponentMonitoringUploadInfo componentUploadInfo,
233 Map<String, List<ErrorMessage>> errors) {
234 ServiceArtifact mibServiceArtifact = new ServiceArtifact();
235 mibServiceArtifact.setVspId(vspId);
236 mibServiceArtifact.setVersion(version);
237 enrichMibFiles(mibServiceArtifact, componentUploadInfo, errors);
240 private void enrichMibFiles(ServiceArtifact monitoringArtifact,
241 ComponentMonitoringUploadInfo componentMonitoringUploadInfo,
242 Map<String, List<ErrorMessage>> errors) {
243 if (componentMonitoringUploadInfo == null) {
246 enrichMibByType(componentMonitoringUploadInfo.getSnmpTrap(), MonitoringUploadType.SNMP_TRAP,
249 enrichMibByType(componentMonitoringUploadInfo.getSnmpPoll(), MonitoringUploadType.SNMP_POLL,
252 enrichMibByType(componentMonitoringUploadInfo.getVesEvent(), MonitoringUploadType.VES_EVENTS,
257 private void enrichMibByType(MonitoringArtifactInfo monitoringArtifactInfo,
258 MonitoringUploadType type,
259 ServiceArtifact mibServiceArtifact,
260 Map<String, List<ErrorMessage>> errors) {
261 if (monitoringArtifactInfo == null) {
264 FileContentHandler mibs;
267 .getFileContentMapFromZip(FileUtils.toByteArray(monitoringArtifactInfo.getContent()));
268 } catch (IOException ioException) {
269 log.error("Failed to get file content map from zip ", ioException);
270 ErrorMessage.ErrorMessageUtil
271 .addMessage(mibServiceArtifact.getName() + "." + type.name(), errors)
272 .add(new ErrorMessage(ErrorLevel.ERROR, Messages.INVALID_ZIP_FILE.getErrorMessage()));
275 Set<String> fileList = mibs.getFileList();
276 for (String fileName : fileList) {
277 mibServiceArtifact.setContentData(FileUtils.toByteArray(mibs.getFileContent(fileName)));
278 mibServiceArtifact.setName(monitoringArtifactInfo.getName() + File.separator + fileName);
279 getEnrichedServiceModelDao().storeExternalArtifact(mibServiceArtifact);
283 private EnrichedServiceModelDao getEnrichedServiceModelDao() {
284 if (enrichedServiceModelDao == null) {
285 enrichedServiceModelDao = EnrichedServiceModelDaoFactory.getInstance().createInterface();
287 return enrichedServiceModelDao;
290 private ComponentDao getComponentDao() {
291 if (componentDao == null) {
292 componentDao = ComponentDaoFactory.getInstance().createInterface();
297 private ComponentArtifactDao getComponentArtifactDao() {
298 if (componentArtifactDao == null) {
299 componentArtifactDao = MonitoringUploadDaoFactory.getInstance().createInterface();
301 return componentArtifactDao;