1 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.process;
3 import org.apache.commons.collections4.CollectionUtils;
4 import org.apache.commons.collections4.MapUtils;
5 import org.openecomp.core.translator.datatypes.TranslatorOutput;
6 import org.openecomp.core.utilities.file.FileContentHandler;
7 import org.openecomp.core.utilities.json.JsonUtil;
8 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
9 import org.openecomp.core.validation.util.MessageContainerUtil;
10 import org.openecomp.sdc.common.errors.Messages;
11 import org.openecomp.sdc.common.utils.SdcCommon;
12 import org.openecomp.sdc.datatypes.error.ErrorLevel;
13 import org.openecomp.sdc.datatypes.error.ErrorMessage;
14 import org.openecomp.sdc.heat.datatypes.structure.HeatStructureTree;
15 import org.openecomp.sdc.logging.api.Logger;
16 import org.openecomp.sdc.logging.api.LoggerFactory;
17 import org.openecomp.sdc.logging.context.impl.MdcDataDebugMessage;
18 import org.openecomp.sdc.logging.messages.AuditMessages;
19 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
20 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
21 import org.openecomp.sdc.validation.util.ValidationManagerUtil;
22 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ComponentMonitoringUploadEntity;
23 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateCandidateData;
24 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.ProcessEntity;
25 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
26 import org.openecomp.sdc.vendorsoftwareproduct.factory.CandidateServiceFactory;
27 import org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.OrchestrationUtil;
28 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.CandidateService;
29 import org.openecomp.sdc.vendorsoftwareproduct.types.OrchestrationTemplateActionResponse;
30 import org.openecomp.sdc.vendorsoftwareproduct.types.UploadFileResponse;
31 import org.openecomp.sdc.vendorsoftwareproduct.types.candidateheat.FilesDataStructure;
32 import org.openecomp.sdc.vendorsoftwareproduct.utils.VendorSoftwareProductUtils;
33 import org.openecomp.sdc.versioning.dao.types.Version;
35 import java.io.ByteArrayInputStream;
36 import java.util.Collection;
37 import java.util.HashMap;
38 import java.util.List;
40 import java.util.Optional;
42 import static org.openecomp.sdc.logging.messages.AuditMessages.HEAT_VALIDATION_ERROR;
44 public class OrchestrationTemplateProcessZipHandler implements OrchestrationTemplateProcessHandler {
45 private Logger logger = LoggerFactory.getLogger(OrchestrationTemplateProcessZipHandler.class);
46 private static MdcDataDebugMessage mdcDataDebugMessage = new MdcDataDebugMessage();
47 private CandidateService candidateService =
48 CandidateServiceFactory.getInstance().createInterface();
51 public OrchestrationTemplateActionResponse process(VspDetails vspDetails,
52 OrchestrationTemplateCandidateData candidateData) {
53 String vspId = vspDetails.getId();
54 Version version = vspDetails.getVersion();
55 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_VALIDATION_STARTED + vspId);
56 OrchestrationTemplateActionResponse response = new OrchestrationTemplateActionResponse();
57 UploadFileResponse uploadFileResponse = new UploadFileResponse();
58 Optional<FileContentHandler> fileContent = OrchestrationUtil
59 .getFileContentMap(OnboardingTypesEnum.ZIP, uploadFileResponse,
60 candidateData.getContentData().array());
61 if (!fileContent.isPresent()) {
62 response.addStructureErrors(uploadFileResponse.getErrors());
63 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
64 response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList, vspId,
65 HEAT_VALIDATION_ERROR));
69 Map<String, List<ErrorMessage>> uploadErrors = uploadFileResponse.getErrors();
70 FileContentHandler fileContentMap = fileContent.get();
71 FilesDataStructure structure =
72 JsonUtil.json2Object(candidateData.getFilesDataStructure(), FilesDataStructure.class);
74 if (CollectionUtils.isNotEmpty(structure.getUnassigned())) {
75 response.addErrorMessageToMap(SdcCommon.UPLOAD_FILE,
76 Messages.FOUND_UNASSIGNED_FILES.getErrorMessage(), ErrorLevel.ERROR);
78 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
79 response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList, vspId,
80 HEAT_VALIDATION_ERROR));
85 String manifest = candidateService.createManifest(vspDetails, structure);
86 fileContentMap.addFile(SdcCommon.MANIFEST_NAME, manifest.getBytes());
88 Optional<ByteArrayInputStream> zipByteArrayInputStream = candidateService
89 .fetchZipFileByteArrayInputStream(
90 vspId, candidateData, manifest, OnboardingTypesEnum.ZIP, uploadErrors);
91 if (!zipByteArrayInputStream.isPresent()) {
92 response.getErrors().values()
93 .forEach(errorList -> printAuditForErrors(errorList, vspId, HEAT_VALIDATION_ERROR));
97 HeatStructureTree tree = createAndValidateHeatTree(response, fileContentMap);
99 Map<String, String> componentsQuestionnaire = new HashMap<>();
100 Map<String, Map<String, String>> componentNicsQuestionnaire = new HashMap<>();
101 Map<String, Collection<ComponentMonitoringUploadEntity>> componentMibList = new HashMap<>();
102 Map<String, Collection<ProcessEntity>> processes = new HashMap<>();
103 Map<String, ProcessEntity> processArtifact = new HashMap<>();
105 OrchestrationUtil orchestrationUtil = new OrchestrationUtil();
106 Map<String, String> vspComponentIdNameInfoBeforeProcess =
107 orchestrationUtil.getVspComponentIdNameInfo(vspId, version);
109 .backupComponentsQuestionnaireBeforeDelete(vspId, version, componentsQuestionnaire,
110 componentNicsQuestionnaire, componentMibList, processes, processArtifact);
112 orchestrationUtil.deleteUploadDataAndContent(vspId, version);
114 .saveUploadData(vspDetails, candidateData, zipByteArrayInputStream.get(), fileContentMap,
117 response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList, vspId,
118 HEAT_VALIDATION_ERROR));
120 .isEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, response.getErrors()))) {
121 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_VALIDATION_COMPLETED + vspId);
124 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_TRANSLATION_STARTED + vspId);
126 TranslatorOutput translatorOutput =
127 HeatToToscaUtil.loadAndTranslateTemplateData(fileContentMap);
129 ToscaServiceModel toscaServiceModel = translatorOutput.getToscaServiceModel();
131 .saveServiceModel(vspId, version, translatorOutput.getNonUnifiedToscaServiceModel(),
133 orchestrationUtil.retainComponentQuestionnaireData(vspId, version, componentsQuestionnaire,
134 componentNicsQuestionnaire, componentMibList, processes, processArtifact);
135 orchestrationUtil.updateVspComponentDependencies(vspId, version,
136 vspComponentIdNameInfoBeforeProcess);
138 logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_TRANSLATION_COMPLETED + vspId);
139 uploadFileResponse.addStructureErrors(uploadErrors);
141 mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
145 private HeatStructureTree createAndValidateHeatTree(OrchestrationTemplateActionResponse response,
146 FileContentHandler fileContentMap) {
147 VendorSoftwareProductUtils.addFileNamesToUploadFileResponse(fileContentMap, response);
148 Map<String, List<ErrorMessage>> validationErrors =
149 ValidationManagerUtil.initValidationManager(fileContentMap).validate();
150 response.getErrors().putAll(validationErrors);
152 return OrchestrationUtil.createHeatTree(fileContentMap, validationErrors);
155 private void printAuditForErrors(List<ErrorMessage> errorList, String vspId, String auditType) {
157 errorList.forEach(errorMessage -> {
158 if (errorMessage.getLevel().equals(ErrorLevel.ERROR)) {
160 AuditMessages.AUDIT_MSG + String.format(auditType, errorMessage.getMessage(), vspId));