diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java')
-rw-r--r-- | openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ToscaServiceModelHealer.java | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ToscaServiceModelHealer.java b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ToscaServiceModelHealer.java new file mode 100644 index 0000000000..e07faad4fa --- /dev/null +++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ToscaServiceModelHealer.java @@ -0,0 +1,116 @@ +package org.openecomp.sdc.healing.healers; + +import org.apache.commons.collections4.MapUtils; +import org.openecomp.core.converter.ToscaConverter; +import org.openecomp.core.converter.factory.ToscaConverterFactory; +import org.openecomp.core.model.dao.ServiceModelDao; +import org.openecomp.core.model.dao.ServiceModelDaoFactory; +import org.openecomp.core.model.types.ServiceElement; +import org.openecomp.core.translator.datatypes.TranslatorOutput; +import org.openecomp.core.utilities.file.FileContentHandler; +import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum; +import org.openecomp.core.validation.util.MessageContainerUtil; +import org.openecomp.sdc.common.utils.CommonUtil; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.healing.interfaces.Healer; +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; +import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDao; +import org.openecomp.sdc.vendorsoftwareproduct.dao.OrchestrationTemplateDaoFactory; +import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateEntity; +import org.openecomp.sdc.versioning.dao.types.Version; + +import java.io.IOException; +import java.util.Objects; +import java.util.Optional; + +public class ToscaServiceModelHealer implements Healer { + private ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao; + private OrchestrationTemplateDao orchestrationTemplateDao; + private static final String VALIDATION_FAILURE_MESSAGE = "Product was updated. Please " + + "update the uploaded Heat file according to these validation errors: \n"; + + public ToscaServiceModelHealer() { + this.serviceModelDao = ServiceModelDaoFactory.getInstance().createInterface(); + this.orchestrationTemplateDao = OrchestrationTemplateDaoFactory.getInstance().createInterface(); + } + + public ToscaServiceModelHealer( + ServiceModelDao<ToscaServiceModel, ServiceElement> serviceModelDao, + OrchestrationTemplateDao orchestrationTemplateDao) { + this.serviceModelDao = serviceModelDao; + this.orchestrationTemplateDao = orchestrationTemplateDao; + } + + @Override + public Object heal(String itemId, Version version) throws Exception { + OrchestrationTemplateEntity orchestrationTemplateEntity = + orchestrationTemplateDao.get(itemId, version); + OnboardingTypesEnum type = + OnboardingTypesEnum.getOnboardingTypesEnum(orchestrationTemplateEntity.getFileSuffix()); + + if (Objects.isNull(type) + || Objects.isNull(orchestrationTemplateEntity.getContentData())) { + return null; + } + + Optional<ToscaServiceModel> healedServiceModel = + healServiceModel(orchestrationTemplateEntity, type); + + healedServiceModel.ifPresent(serviceModel -> serviceModelDao + .overrideServiceModel(itemId, version, serviceModel)); + + return healedServiceModel; + + } + + private Optional<ToscaServiceModel> healServiceModel( + OrchestrationTemplateEntity orchestrationTemplateEntity, + OnboardingTypesEnum type) throws IOException { + switch (type) { + case ZIP: + return Optional.of(healServiceModelFromZip( + getFileContentHandlerForHealing(orchestrationTemplateEntity, type))); + + case CSAR: + return Optional.of(healServiceModelFromCsar( + getFileContentHandlerForHealing(orchestrationTemplateEntity, type))); + + default: + return Optional.empty(); + } + + } + + private FileContentHandler getFileContentHandlerForHealing( + OrchestrationTemplateEntity orchestrationTemplateEntity, OnboardingTypesEnum type) + throws IOException { + byte[] uploadedFileContent = orchestrationTemplateEntity.getContentData().array(); + return CommonUtil.validateAndUploadFileContent(type, uploadedFileContent); + } + + private ToscaServiceModel healServiceModelFromZip(FileContentHandler contentMap) { + TranslatorOutput translatorOutput = + HeatToToscaUtil.loadAndTranslateTemplateData(contentMap); + + if (areThereValidationErrors(translatorOutput)) { + String validationErrorsAsString = MessageContainerUtil.getErrorMessagesListAsString + (MessageContainerUtil + .getMessageByLevel(ErrorLevel.ERROR, translatorOutput.getErrorMessages())); + throw new RuntimeException(VALIDATION_FAILURE_MESSAGE + validationErrorsAsString); + } + + return translatorOutput.getToscaServiceModel(); + } + + private boolean areThereValidationErrors(TranslatorOutput translatorOutput) { + return MapUtils.isNotEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, + translatorOutput.getErrorMessages())); + } + + private ToscaServiceModel healServiceModelFromCsar(FileContentHandler contentMap) + throws IOException { + ToscaConverter toscaConverter = ToscaConverterFactory.getInstance().createInterface(); + return toscaConverter.convert(contentMap); + } +} |