1 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration;
3 import org.apache.commons.lang3.tuple.Pair;
4 import org.openecomp.core.utilities.file.FileContentHandler;
5 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
6 import org.openecomp.sdc.common.errors.CoreException;
7 import org.openecomp.sdc.common.errors.Messages;
8 import org.openecomp.sdc.common.utils.CommonUtil;
9 import org.openecomp.sdc.common.utils.SdcCommon;
10 import org.openecomp.sdc.datatypes.error.ErrorLevel;
11 import org.openecomp.sdc.datatypes.error.ErrorMessage;
12 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateCandidateData;
13 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
14 import org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.OnboardingManifest;
15 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.CandidateService;
16 import org.openecomp.sdc.vendorsoftwareproduct.types.UploadFileResponse;
18 import java.io.IOException;
19 import java.io.InputStream;
20 import java.nio.ByteBuffer;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Optional;
24 import java.util.stream.Collectors;
26 import static org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder.getErrorWithParameters;
27 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.ELIGBLE_FOLDERS;
28 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.ELIGIBLE_FILES;
29 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.MAIN_SERVICE_TEMPLATE_MF_FILE_NAME;
30 import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.MAIN_SERVICE_TEMPLATE_YAML_FILE_NAME;
32 public class OrchestrationTemplateCSARHandler extends BaseOrchestrationTemplateHandler
33 implements OrchestrationTemplateFileHandler {
37 public Optional<FileContentHandler> getFileContentMap(UploadFileResponse uploadFileResponse,
38 byte[] uploadedFileData) {
39 FileContentHandler contentMap = null;
40 List<String> folderList = new ArrayList<>();
42 Pair<FileContentHandler, List<String>> fileContentMapFromOrchestrationCandidateZip =
43 CommonUtil.getFileContentMapFromOrchestrationCandidateZip(uploadedFileData);
44 contentMap = fileContentMapFromOrchestrationCandidateZip.getKey();
45 folderList = fileContentMapFromOrchestrationCandidateZip.getRight();
46 } catch (IOException exception) {
47 uploadFileResponse.addStructureError(
48 SdcCommon.UPLOAD_FILE,
49 new ErrorMessage(ErrorLevel.ERROR, Messages.INVALID_CSAR_FILE.getErrorMessage()));
50 } catch (CoreException coreException) {
51 uploadFileResponse.addStructureError(
52 SdcCommon.UPLOAD_FILE, new ErrorMessage(ErrorLevel.ERROR, coreException.getMessage()));
54 validateContent(uploadFileResponse, contentMap, folderList);
55 return Optional.ofNullable(contentMap);
58 private void validateContent(UploadFileResponse uploadFileResponse, FileContentHandler contentMap,
59 List<String> folderList) {
60 validateManifest(uploadFileResponse, contentMap);
61 validateFileExist(uploadFileResponse, contentMap, MAIN_SERVICE_TEMPLATE_YAML_FILE_NAME);
62 validateNoExtraFiles(uploadFileResponse, contentMap);
63 validateFolders(uploadFileResponse, folderList);
66 private void validateManifest(UploadFileResponse uploadFileResponse,
67 FileContentHandler contentMap) {
69 if (!validateFileExist(uploadFileResponse, contentMap, MAIN_SERVICE_TEMPLATE_MF_FILE_NAME)) {
73 try (InputStream fileContent = contentMap.getFileContent(MAIN_SERVICE_TEMPLATE_MF_FILE_NAME)) {
75 OnboardingManifest onboardingManifest = new OnboardingManifest(fileContent);
76 if (!onboardingManifest.isValid()) {
77 onboardingManifest.getErrors().forEach(error -> uploadFileResponse.addStructureError(
78 SdcCommon.UPLOAD_FILE, new ErrorMessage(ErrorLevel.ERROR, error)));
81 } catch (IOException e) {
82 // convert to runtime to keep the throws unchanged
83 throw new RuntimeException("Failed to validate manifest", e);
87 private void validateNoExtraFiles(UploadFileResponse uploadFileResponse,
88 FileContentHandler contentMap) {
89 List<String> unwantedFiles = contentMap.getFileList().stream()
90 .filter(this::filterFiles).collect(Collectors.toList());
91 if (!unwantedFiles.isEmpty()) {
92 unwantedFiles.stream().filter(this::filterFiles).forEach(unwantedFile ->
93 uploadFileResponse.addStructureError(
94 SdcCommon.UPLOAD_FILE, new ErrorMessage(ErrorLevel.ERROR,
95 getErrorWithParameters(Messages.CSAR_FILES_NOT_ALLOWED.getErrorMessage(),
100 private void validateFolders(UploadFileResponse uploadFileResponse, List<String> folderList) {
101 List<String> filterResult =
102 folderList.stream().filter(this::filterFolders).collect(Collectors.toList());
103 if (!filterResult.isEmpty()) {
104 folderList.stream().filter(this::filterFolders).forEach(unwantedFolder ->
105 uploadFileResponse.addStructureError(
106 SdcCommon.UPLOAD_FILE, new ErrorMessage(ErrorLevel.ERROR,
107 getErrorWithParameters(Messages.CSAR_DIRECTORIES_NOT_ALLOWED.getErrorMessage(),
113 private boolean filterFiles(String inFileName) {
114 boolean valid = ELIGIBLE_FILES.stream().anyMatch(fileName -> fileName.equals(inFileName));
115 return !valid && filterFolders(inFileName);
118 private boolean filterFolders(String fileName) {
119 return ELIGBLE_FOLDERS.stream().noneMatch(fileName::startsWith);
122 private boolean validateFileExist(UploadFileResponse uploadFileResponse,
123 FileContentHandler contentMap, String fileName) {
125 boolean containsFile = contentMap.containsFile(fileName);
127 uploadFileResponse.addStructureError(
128 SdcCommon.UPLOAD_FILE, new ErrorMessage(ErrorLevel.ERROR,
129 getErrorWithParameters(Messages.CSAR_FILE_NOT_FOUND.getErrorMessage(), fileName)));
135 protected boolean updateCandidateData(VspDetails vspDetails, byte[] uploadedFileData,
136 FileContentHandler contentMap,
137 String fileSuffix, String networkPackageName,
138 CandidateService candidateService,
139 UploadFileResponse uploadFileResponse) {
141 candidateService.updateCandidateUploadData(vspDetails.getId(), vspDetails.getVersion(),
142 new OrchestrationTemplateCandidateData(ByteBuffer.wrap(uploadedFileData), "", fileSuffix,
143 networkPackageName));
144 } catch (Exception exception) {
145 logger.error(getErrorWithParameters(Messages.FILE_CONTENT_MAP.getErrorMessage(),
146 getHandlerType().toString()), exception);
147 uploadFileResponse.addStructureError(SdcCommon.UPLOAD_FILE,
148 new ErrorMessage(ErrorLevel.ERROR, exception.getMessage()));
150 mdcDataDebugMessage.debugExitMessage("VSP id", vspDetails.getId());
158 protected OnboardingTypesEnum getHandlerType() {
159 return OnboardingTypesEnum.CSAR;
163 protected boolean isInvalidRawZipData(UploadFileResponse uploadFileResponse,
164 byte[] uploadedFileData,
165 CandidateService candidateService) {
166 return super.isInvalidRawZipData(uploadFileResponse, uploadedFileData, candidateService);