da5cb01c791e31959dcc10334420bab20a612b67
[sdc.git] /
1 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.process;
2
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;
34
35 import java.io.ByteArrayInputStream;
36 import java.util.Collection;
37 import java.util.HashMap;
38 import java.util.List;
39 import java.util.Map;
40 import java.util.Optional;
41
42 import static org.openecomp.sdc.logging.messages.AuditMessages.HEAT_VALIDATION_ERROR;
43
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();
49
50   @Override
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));
66       return response;
67     }
68
69     Map<String, List<ErrorMessage>> uploadErrors = uploadFileResponse.getErrors();
70     FileContentHandler fileContentMap = fileContent.get();
71     FilesDataStructure structure =
72         JsonUtil.json2Object(candidateData.getFilesDataStructure(), FilesDataStructure.class);
73
74     if (CollectionUtils.isNotEmpty(structure.getUnassigned())) {
75       response.addErrorMessageToMap(SdcCommon.UPLOAD_FILE,
76           Messages.FOUND_UNASSIGNED_FILES.getErrorMessage(), ErrorLevel.ERROR);
77
78       mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
79       response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList, vspId,
80           HEAT_VALIDATION_ERROR));
81       return response;
82     }
83
84
85     String manifest = candidateService.createManifest(vspDetails, structure);
86     fileContentMap.addFile(SdcCommon.MANIFEST_NAME, manifest.getBytes());
87
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));
94       return response;
95     }
96
97     HeatStructureTree tree = createAndValidateHeatTree(response, fileContentMap);
98
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<>();
104
105     OrchestrationUtil orchestrationUtil = new OrchestrationUtil();
106     Map<String, String> vspComponentIdNameInfoBeforeProcess =
107         orchestrationUtil.getVspComponentIdNameInfo(vspId, version);
108     orchestrationUtil
109         .backupComponentsQuestionnaireBeforeDelete(vspId, version, componentsQuestionnaire,
110             componentNicsQuestionnaire, componentMibList, processes, processArtifact);
111
112     orchestrationUtil.deleteUploadDataAndContent(vspId, version);
113     orchestrationUtil
114         .saveUploadData(vspDetails, candidateData, zipByteArrayInputStream.get(), fileContentMap,
115             tree);
116
117     response.getErrors().values().forEach(errorList -> printAuditForErrors(errorList, vspId,
118         HEAT_VALIDATION_ERROR));
119     if (MapUtils
120         .isEmpty(MessageContainerUtil.getMessageByLevel(ErrorLevel.ERROR, response.getErrors()))) {
121       logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_VALIDATION_COMPLETED + vspId);
122     }
123
124     logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_TRANSLATION_STARTED + vspId);
125
126     TranslatorOutput translatorOutput =
127         HeatToToscaUtil.loadAndTranslateTemplateData(fileContentMap);
128
129     ToscaServiceModel toscaServiceModel = translatorOutput.getToscaServiceModel();
130     orchestrationUtil
131         .saveServiceModel(vspId, version, translatorOutput.getNonUnifiedToscaServiceModel(),
132             toscaServiceModel);
133     orchestrationUtil.retainComponentQuestionnaireData(vspId, version, componentsQuestionnaire,
134         componentNicsQuestionnaire, componentMibList, processes, processArtifact);
135     orchestrationUtil.updateVspComponentDependencies(vspId, version,
136         vspComponentIdNameInfoBeforeProcess);
137
138     logger.audit(AuditMessages.AUDIT_MSG + AuditMessages.HEAT_TRANSLATION_COMPLETED + vspId);
139     uploadFileResponse.addStructureErrors(uploadErrors);
140
141     mdcDataDebugMessage.debugExitMessage("VSP id", vspId);
142     return response;
143   }
144
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);
151
152     return OrchestrationUtil.createHeatTree(fileContentMap, validationErrors);
153   }
154
155   private void printAuditForErrors(List<ErrorMessage> errorList, String vspId, String auditType) {
156
157     errorList.forEach(errorMessage -> {
158       if (errorMessage.getLevel().equals(ErrorLevel.ERROR)) {
159         logger.audit(
160             AuditMessages.AUDIT_MSG + String.format(auditType, errorMessage.getMessage(), vspId));
161       }
162     });
163   }
164 }