Add collaboration feature
[sdc.git] / openecomp-be / backend / openecomp-sdc-vendor-software-product-manager / src / main / java / org / openecomp / sdc / vendorsoftwareproduct / impl / orchestration / OrchestrationTemplateCSARHandler.java
1 package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration;
2
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;
17
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;
25
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;
31
32 public class OrchestrationTemplateCSARHandler extends BaseOrchestrationTemplateHandler
33     implements OrchestrationTemplateFileHandler {
34
35
36   @Override
37   public Optional<FileContentHandler> getFileContentMap(UploadFileResponse uploadFileResponse,
38                                                         byte[] uploadedFileData) {
39     FileContentHandler contentMap = null;
40     List<String> folderList = new ArrayList<>();
41     try {
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()));
53     }
54     validateContent(uploadFileResponse, contentMap, folderList);
55     return Optional.ofNullable(contentMap);
56   }
57
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);
64   }
65
66   private void validateManifest(UploadFileResponse uploadFileResponse,
67                                 FileContentHandler contentMap) {
68
69     if (!validateFileExist(uploadFileResponse, contentMap, MAIN_SERVICE_TEMPLATE_MF_FILE_NAME)) {
70       return;
71     }
72
73     try (InputStream fileContent = contentMap.getFileContent(MAIN_SERVICE_TEMPLATE_MF_FILE_NAME)) {
74
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)));
79       }
80
81     } catch (IOException e) {
82       // convert to runtime to keep the throws unchanged
83       throw new RuntimeException("Failed to validate manifest", e);
84     }
85   }
86
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(),
96                       unwantedFile))));
97     }
98   }
99
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(),
108                       unwantedFolder))));
109
110     }
111   }
112
113   private boolean filterFiles(String inFileName) {
114     boolean valid = ELIGIBLE_FILES.stream().anyMatch(fileName -> fileName.equals(inFileName));
115     return !valid && filterFolders(inFileName);
116   }
117
118   private boolean filterFolders(String fileName) {
119     return ELIGBLE_FOLDERS.stream().noneMatch(fileName::startsWith);
120   }
121
122   private boolean validateFileExist(UploadFileResponse uploadFileResponse,
123                                     FileContentHandler contentMap, String fileName) {
124
125     boolean containsFile = contentMap.containsFile(fileName);
126     if (!containsFile) {
127       uploadFileResponse.addStructureError(
128           SdcCommon.UPLOAD_FILE, new ErrorMessage(ErrorLevel.ERROR,
129               getErrorWithParameters(Messages.CSAR_FILE_NOT_FOUND.getErrorMessage(), fileName)));
130     }
131     return containsFile;
132   }
133
134   @Override
135   protected boolean updateCandidateData(VspDetails vspDetails, byte[] uploadedFileData,
136                                         FileContentHandler contentMap,
137                                         String fileSuffix, String networkPackageName,
138                                         CandidateService candidateService,
139                                         UploadFileResponse uploadFileResponse) {
140     try {
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()));
149
150       mdcDataDebugMessage.debugExitMessage("VSP id", vspDetails.getId());
151       return true;
152     }
153     return false;
154   }
155
156
157   @Override
158   protected OnboardingTypesEnum getHandlerType() {
159     return OnboardingTypesEnum.CSAR;
160   }
161
162   @Override
163   protected boolean isInvalidRawZipData(UploadFileResponse uploadFileResponse,
164                                         byte[] uploadedFileData,
165                                         CandidateService candidateService) {
166     return super.isInvalidRawZipData(uploadFileResponse, uploadedFileData, candidateService);
167   }
168 }