1 package org.openecomp.sdc.healing.healers;
3 import org.apache.commons.collections4.MapUtils;
4 import org.openecomp.core.converter.ToscaConverter;
5 import org.openecomp.core.converter.factory.ToscaConverterFactory;
6 import org.openecomp.core.model.dao.ServiceModelDao;
7 import org.openecomp.core.model.dao.ServiceModelDaoFactory;
8 import org.openecomp.core.model.types.ServiceElement;
9 import org.openecomp.core.translator.datatypes.TranslatorOutput;
10 import org.openecomp.core.utilities.file.FileContentHandler;
11 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
12 import org.openecomp.core.validation.util.MessageContainerUtil;
13 import org.openecomp.sdc.common.utils.CommonUtil;
14 import org.openecomp.sdc.datatypes.error.ErrorLevel;
15 import org.openecomp.sdc.healing.interfaces.Healer;
16 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
17 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
18 import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDao;
19 import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDaoFactory;
20 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateEntity;
21 import org.openecomp.sdc.versioning.dao.types.Version;
23 import java.io.IOException;
24 import java.util.Objects;
25 import java.util.Optional;
27 public class ToscaServiceModelHealer implements Healer {
28 private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao;
29 private OrchestrationTemplateDao orchestrationTemplateDao;
30 private static final String VALIDATION_FAILURE_MESSAGE = "Product was updated. Please " +
31 "update the uploaded Heat file according to these validation errors: \n";
33 public ToscaServiceModelHealer() {
34 this.serviceModelDao = ServiceModelDaoFactory.getInstance().createInterface();
35 this.orchestrationTemplateDao = OrchestrationTemplateDaoFactory.getInstance().createInterface();
38 public ToscaServiceModelHealer(
39 ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao,
40 OrchestrationTemplateDao orchestrationTemplateDao) {
41 this.serviceModelDao = serviceModelDao;
42 this.orchestrationTemplateDao = orchestrationTemplateDao;
46 public Object heal(String itemId, Version version) throws Exception {
47 OrchestrationTemplateEntity orchestrationTemplateEntity =
48 orchestrationTemplateDao.get(itemId, version);
49 OnboardingTypesEnum type =
50 OnboardingTypesEnum.getOnboardingTypesEnum(orchestrationTemplateEntity.getFileSuffix());
52 if (Objects.isNull(type)
53 || Objects.isNull(orchestrationTemplateEntity.getContentData())) {
57 Optional<ToscaServiceModel> healedServiceModel =
58 healServiceModel(orchestrationTemplateEntity, type);
60 healedServiceModel.ifPresent(serviceModel -> serviceModelDao
61 .overrideServiceModel(itemId, version, serviceModel));
63 return healedServiceModel;
67 private Optional<ToscaServiceModel> healServiceModel(
68 OrchestrationTemplateEntity orchestrationTemplateEntity,
69 OnboardingTypesEnum type) throws IOException {
72 return Optional.of(healServiceModelFromZip(
73 getFileContentHandlerForHealing(orchestrationTemplateEntity, type)));
76 return Optional.of(healServiceModelFromCsar(
77 getFileContentHandlerForHealing(orchestrationTemplateEntity, type)));
80 return Optional.empty();
85 private FileContentHandler getFileContentHandlerForHealing(
86 OrchestrationTemplateEntity orchestrationTemplateEntity, OnboardingTypesEnum type)
88 byte[] uploadedFileContent = orchestrationTemplateEntity.getContentData().array();
89 return CommonUtil.validateAndUploadFileContent(type, uploadedFileContent);
92 private ToscaServiceModel healServiceModelFromZip(FileContentHandler contentMap) {
93 TranslatorOutput translatorOutput =
94 HeatToToscaUtil.loadAndTranslateTemplateData(contentMap);
96 if (areThereValidationErrors(translatorOutput)) {
97 String validationErrorsAsString = MessageContainerUtil.getErrorMessagesListAsString
99 .getMessageByLevel(ErrorLevel.ERROR, translatorOutput.getErrorMessages()));
100 throw new RuntimeException(VALIDATION_FAILURE_MESSAGE + validationErrorsAsString);
103 return translatorOutput.getToscaServiceModel();
106 private boolean areThereValidationErrors(TranslatorOutput translatorOutput) {
107 return MapUtils.isNotEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR,
108 translatorOutput.getErrorMessages()));
111 private ToscaServiceModel healServiceModelFromCsar(FileContentHandler contentMap)
113 ToscaConverter toscaConverter = ToscaConverterFactory.getInstance().createInterface();
114 return toscaConverter.convert(contentMap);