e07faad4fa8d5a825fda749acf1c1b1921d096e5
[sdc.git] /
1 package org.openecomp.sdc.healing.healers;
2
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;
22
23 import java.io.IOException;
24 import java.util.Objects;
25 import java.util.Optional;
26
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";
32
33   public ToscaServiceModelHealer() {
34     this.serviceModelDao = ServiceModelDaoFactory.getInstance().createInterface();
35     this.orchestrationTemplateDao = OrchestrationTemplateDaoFactory.getInstance().createInterface();
36   }
37
38   public ToscaServiceModelHealer(
39       ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao,
40       OrchestrationTemplateDao orchestrationTemplateDao) {
41     this.serviceModelDao = serviceModelDao;
42     this.orchestrationTemplateDao = orchestrationTemplateDao;
43   }
44
45   @Override
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());
51
52     if (Objects.isNull(type)
53         || Objects.isNull(orchestrationTemplateEntity.getContentData())) {
54       return null;
55     }
56
57     Optional<ToscaServiceModel> healedServiceModel =
58         healServiceModel(orchestrationTemplateEntity, type);
59
60     healedServiceModel.ifPresent(serviceModel -> serviceModelDao
61         .overrideServiceModel(itemId, version, serviceModel));
62
63     return healedServiceModel;
64
65   }
66
67   private Optional<ToscaServiceModel> healServiceModel(
68       OrchestrationTemplateEntity orchestrationTemplateEntity,
69       OnboardingTypesEnum type) throws IOException {
70     switch (type) {
71       case ZIP:
72         return Optional.of(healServiceModelFromZip(
73             getFileContentHandlerForHealing(orchestrationTemplateEntity, type)));
74
75       case CSAR:
76         return Optional.of(healServiceModelFromCsar(
77             getFileContentHandlerForHealing(orchestrationTemplateEntity, type)));
78
79       default:
80         return Optional.empty();
81     }
82
83   }
84
85   private FileContentHandler getFileContentHandlerForHealing(
86       OrchestrationTemplateEntity orchestrationTemplateEntity, OnboardingTypesEnum type)
87       throws IOException {
88     byte[] uploadedFileContent = orchestrationTemplateEntity.getContentData().array();
89     return CommonUtil.validateAndUploadFileContent(type, uploadedFileContent);
90   }
91
92   private ToscaServiceModel healServiceModelFromZip(FileContentHandler contentMap) {
93     TranslatorOutput translatorOutput =
94         HeatToToscaUtil.loadAndTranslateTemplateData(contentMap);
95
96     if (areThereValidationErrors(translatorOutput)) {
97       String validationErrorsAsString = MessageContainerUtil.getErrorMessagesListAsString
98           (MessageContainerUtil
99               .getMessageByLevel(ErrorLevel.ERROR, translatorOutput.getErrorMessages()));
100       throw new RuntimeException(VALIDATION_FAILURE_MESSAGE + validationErrorsAsString);
101     }
102
103     return translatorOutput.getToscaServiceModel();
104   }
105
106   private boolean areThereValidationErrors(TranslatorOutput translatorOutput) {
107     return MapUtils.isNotEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR,
108         translatorOutput.getErrorMessages()));
109   }
110
111   private ToscaServiceModel healServiceModelFromCsar(FileContentHandler contentMap)
112       throws IOException {
113     ToscaConverter toscaConverter = ToscaConverterFactory.getInstance().createInterface();
114     return toscaConverter.convert(contentMap);
115   }
116 }