2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.openecomp.sdc.be.components.impl;
22 import fj.data.Either;
23 import java.io.ByteArrayInputStream;
24 import java.io.IOException;
25 import java.io.StringReader;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.List;
30 import java.util.Optional;
31 import java.util.Properties;
32 import java.util.regex.Matcher;
33 import java.util.regex.Pattern;
34 import java.util.stream.Collectors;
35 import org.apache.commons.lang3.tuple.ImmutablePair;
36 import org.openecomp.sdc.be.config.BeEcompErrorManager;
37 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
38 import org.openecomp.sdc.be.dao.api.ActionStatus;
39 import org.openecomp.sdc.be.impl.ComponentsUtils;
40 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
41 import org.openecomp.sdc.be.tosca.CsarUtils;
42 import org.openecomp.sdc.common.log.wrappers.Logger;
43 import org.openecomp.sdc.common.util.GeneralUtility;
44 import org.openecomp.sdc.exception.ResponseFormat;
46 public class CsarValidationUtils {
48 private static final Logger log = Logger.getLogger(CsarValidationUtils.class.getName());
49 private static final String TOSCA_META_FILE_VERSION = "TOSCA-Meta-File-Version";
50 private static final String CSAR_VERSION = "CSAR-Version";
51 private static final String CREATED_BY = "Created-By";
52 private static final String NEW_LINE_DELM = "\n";
53 public static final String TOSCA_METADATA = "TOSCA-Metadata";
54 public static final String TOSCA_FILE = "TOSCA.meta";
55 public static final String DEL_PATTERN = "([/\\\\]+)";
56 public static final String TOSCA_METADATA_PATH_PATTERN = TOSCA_METADATA +
57 // Artifact Group (i.e Deployment/Informational)
58 DEL_PATTERN + TOSCA_FILE;
59 public static final String TOSCA_META_ENTRY_DEFINITIONS = "Entry-Definitions";
60 private static final String[] TOSCA_METADATA_FIELDS = {TOSCA_META_FILE_VERSION, CSAR_VERSION, CREATED_BY, TOSCA_META_ENTRY_DEFINITIONS};
61 private static final String ARTIFACTS_METADATA_FILE = "HEAT.meta";
62 private static final String TOSCA_CSAR_EXTENSION = ".csar";
63 private static final String TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID = "TOSCA-Metadata/TOSCA.meta file is not in expected key-value form in csar, csar ID {}";
64 private static final String TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID = "TOSCA-Metadata/TOSCA.meta file not in expected key-value form in CSAR with id ";
65 private static final String CSAR_INTERNALS_ARE_INVALID = "CSAR internals are invalid";
66 private static final String ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID = "Entry-Definitions entry not found in TOSCA-Metadata/TOSCA.meta file, csar ID {}";
67 private static final String FILE_NOT_FOUND_IN_CSAR_WITH_ID = " file not found in CSAR with id ";
68 private static final String CSAR_STRUCTURE_IS_INVALID = "CSAR structure is invalid";
69 private static final String ENTRY_DEFINITIONS = "Entry-Definitions ";
70 private static final Pattern floatPattern = Pattern.compile("^\\d{1}[.]\\d{1}$");
73 * Utility classes, which are collections of static members, are not meant to be instantiated
75 private CsarValidationUtils() {
83 * @param componentsUtils
86 public static Either<Boolean, ResponseFormat> validateCsar(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
87 Either<Boolean, ResponseFormat> validateStatus = validateIsTOSCAMetadataExist(csar, csarUUID, componentsUtils);
88 if (validateStatus.isRight()) {
89 return Either.right(validateStatus.right().value());
91 removeNonUniqueArtifactsFromCsar(csar);
92 log.trace("TOSCA-Metadata/TOSCA.meta file found, CSAR id {}", csarUUID);
93 validateStatus = validateTOSCAMetadataFile(csar, csarUUID, componentsUtils);
94 if (validateStatus.isRight()) {
95 return Either.right(validateStatus.right().value());
97 return Either.left(true);
100 private static void removeNonUniqueArtifactsFromCsar(Map<String, byte[]> csar) {
101 List<String> nonUniqueArtifactsToRemove = new ArrayList<>();
102 String[] paths = csar.keySet().toArray(new String[csar.keySet().size()]);
103 int numberOfArtifacts = paths.length;
104 for (int i = 0; i < numberOfArtifacts; ++i) {
105 collectNonUniqueArtifact(paths, i, numberOfArtifacts, nonUniqueArtifactsToRemove);
107 nonUniqueArtifactsToRemove.stream().forEach(csar::remove);
110 private static void collectNonUniqueArtifact(String[] paths, int currInd, int numberOfArtifacts, List<String> nonUniqueArtifactsToRemove) {
111 String[] parsedPath = paths[currInd].split("/");
112 String[] otherParsedPath;
113 int artifactNameInd = parsedPath.length - 1;
114 for (int j = currInd + 1; j < numberOfArtifacts; ++j) {
115 otherParsedPath = paths[j].split("/");
116 if (parsedPath.length == otherParsedPath.length && parsedPath.length > 3 && isEqualArtifactNames(parsedPath, otherParsedPath)) {
118 "Can't upload two artifact with the same name {}. The artifact with path {} will be handled, and the artifact with path {} will be ignored. ",
119 parsedPath[artifactNameInd], paths[currInd], paths[j]);
120 nonUniqueArtifactsToRemove.add(paths[j]);
125 private static boolean isEqualArtifactNames(String[] parsedPath, String[] otherParsedPath) {
126 boolean isEqualArtifactNames = false;
127 int artifactNameInd = parsedPath.length - 1;
128 int artifactGroupTypeInd = parsedPath.length - 3;
129 String groupType = parsedPath[artifactGroupTypeInd];
130 String artifactName = parsedPath[artifactNameInd];
131 String otherGroupType = otherParsedPath[artifactGroupTypeInd];
132 String otherArtifactName = otherParsedPath[artifactNameInd];
133 String vfcToscaName = parsedPath.length == 5 ? parsedPath[1] : null;
134 if (artifactName.equalsIgnoreCase(otherArtifactName) && groupType.equalsIgnoreCase(otherGroupType)) {
135 isEqualArtifactNames = vfcToscaName == null || vfcToscaName.equalsIgnoreCase(otherParsedPath[1]);
137 return isEqualArtifactNames;
140 public static Either<ImmutablePair<String, String>, ResponseFormat> getToscaYaml(Map<String, byte[]> csar, String csarUUID,
141 ComponentsUtils componentsUtils, AuditingActionEnum auditingAction) {
142 if (!AuditingActionEnum.UPDATE_SERVICE_TOSCA_TEMPLATE.equals(auditingAction)) {
143 Either<Boolean, ResponseFormat> validateStatus = validateIsTOSCAMetadataExist(csar, csarUUID, componentsUtils);
144 if (validateStatus.isRight()) {
145 return Either.right(validateStatus.right().value());
148 Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN);
149 Optional<String> keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny();
150 if (keyOp.isEmpty()) {
151 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
152 BeEcompErrorManager.getInstance()
153 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
154 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
155 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
157 Properties props = new Properties();
159 props.load(new StringReader(new String(csar.get(keyOp.get())).replace("\\", "\\\\")));
160 } catch (IOException e) {
161 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID, e);
162 BeEcompErrorManager.getInstance()
163 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
164 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
165 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
167 String yamlFileName = props.getProperty(TOSCA_META_ENTRY_DEFINITIONS);
168 String[] ops = yamlFileName.split(DEL_PATTERN);
169 List<String> list = Arrays.asList(ops);
170 String result = list.stream().map(x -> x).collect(Collectors.joining(DEL_PATTERN));
171 keyOp = csar.keySet().stream().filter(k -> Pattern.compile(result).matcher(k).matches()).findAny();
172 if (!keyOp.isPresent()) {
173 log.debug(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID, csarUUID);
174 BeEcompErrorManager.getInstance()
175 .logInternalDataError(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID + csarUUID,
176 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
177 return Either.right(componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, yamlFileName));
179 log.trace("Found Entry-Definitions property in TOSCA-Metadata/TOSCA.meta, Entry-Definitions: {}, CSAR id: {}", yamlFileName, csarUUID);
180 byte[] yamlFileBytes = csar.get(yamlFileName);
181 if (yamlFileBytes == null) {
182 log.debug("Entry-Definitions {} file not found in csar, csar ID {}", yamlFileName, csarUUID);
183 BeEcompErrorManager.getInstance()
184 .logInternalDataError(ENTRY_DEFINITIONS + yamlFileName + FILE_NOT_FOUND_IN_CSAR_WITH_ID + csarUUID, CSAR_STRUCTURE_IS_INVALID,
185 ErrorSeverity.ERROR);
186 return Either.right(componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, yamlFileName));
188 String yamlFileContents = new String(yamlFileBytes);
189 return Either.left(new ImmutablePair<>(yamlFileName, yamlFileContents));
192 public static Either<ImmutablePair<String, String>, ResponseFormat> getArtifactsMeta(Map<String, byte[]> csar, String csarUUID,
193 ComponentsUtils componentsUtils) {
194 if (!csar.containsKey(CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE)) {
195 log.debug(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID, csarUUID);
196 BeEcompErrorManager.getInstance()
197 .logInternalDataError(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID + csarUUID,
198 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
199 return Either.right(componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, ARTIFACTS_METADATA_FILE));
201 log.trace("Found Entry-Definitions property in TOSCA-Metadata/TOSCA.meta, Entry-Definitions: {}, CSAR id: {}", ARTIFACTS_METADATA_FILE,
203 byte[] artifactsMetaBytes = csar.get(CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE);
204 if (artifactsMetaBytes == null) {
205 log.debug("Entry-Definitions {}{} file not found in csar, csar ID {}", CsarUtils.ARTIFACTS_PATH, ARTIFACTS_METADATA_FILE, csarUUID);
206 BeEcompErrorManager.getInstance().logInternalDataError(
207 ENTRY_DEFINITIONS + CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE + FILE_NOT_FOUND_IN_CSAR_WITH_ID + csarUUID,
208 CSAR_STRUCTURE_IS_INVALID, ErrorSeverity.ERROR);
210 componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE));
212 String artifactsFileContents = new String(artifactsMetaBytes);
213 return Either.left(new ImmutablePair<>(CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE, artifactsFileContents));
216 public static Either<ImmutablePair<String, byte[]>, ResponseFormat> getArtifactContent(String csarUUID, Map<String, byte[]> csar,
217 String artifactPath, String artifactName,
218 ComponentsUtils componentsUtils) {
219 if (!csar.containsKey(artifactPath)) {
220 log.debug("Entry-Definitions entry not found in Artifacts/HEAT.meta file, csar ID {}", csarUUID);
221 BeEcompErrorManager.getInstance()
222 .logInternalDataError(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID + csarUUID,
223 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
225 .right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND_IN_CSAR, CsarUtils.ARTIFACTS_PATH + artifactName, csarUUID));
227 log.trace("Found Entry-Definitions property in Artifacts/HEAT.meta, Entry-Definitions: {}, CSAR id: {}", artifactPath, csarUUID);
228 byte[] artifactFileBytes = csar.get(artifactPath);
229 if (artifactFileBytes == null) {
230 log.debug("Entry-Definitions {}{} file not found in csar, csar ID {}", CsarUtils.ARTIFACTS_PATH, artifactName, csarUUID);
231 BeEcompErrorManager.getInstance()
232 .logInternalDataError(ENTRY_DEFINITIONS + artifactPath + FILE_NOT_FOUND_IN_CSAR_WITH_ID + csarUUID, CSAR_STRUCTURE_IS_INVALID,
233 ErrorSeverity.ERROR);
234 return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND_IN_CSAR, artifactPath, csarUUID));
236 return Either.left(new ImmutablePair<>(artifactName, artifactFileBytes));
239 private static Either<Boolean, ResponseFormat> validateTOSCAMetadataFile(Map<String, byte[]> csar, String csarUUID,
240 ComponentsUtils componentsUtils) {
241 Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN);
242 Optional<String> keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny();
243 if (!keyOp.isPresent()) {
244 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
245 BeEcompErrorManager.getInstance()
246 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
247 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
248 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
250 byte[] toscaMetaBytes = csar.get(keyOp.get());
251 String toscaMetadata = new String(toscaMetaBytes);
252 String[] splited = toscaMetadata.split(NEW_LINE_DELM);
253 if (splited == null || splited.length < TOSCA_METADATA_FIELDS.length) {
254 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
255 BeEcompErrorManager.getInstance()
256 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
257 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
258 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
260 Either<Boolean, ResponseFormat> blockStatus = validateBlock(csarUUID, splited, componentsUtils);
261 if (blockStatus.isRight()) {
262 return Either.right(blockStatus.right().value());
264 return Either.left(true);
267 private static Either<Boolean, ResponseFormat> validateBlock(String csarUUID, String[] splited, ComponentsUtils componentsUtils) {
269 for (String toscaField : TOSCA_METADATA_FIELDS) {
270 Properties props = new Properties();
272 props.load(new ByteArrayInputStream(splited[index].getBytes()));
273 } catch (IOException e) {
274 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID, e);
275 BeEcompErrorManager.getInstance()
276 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
277 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
278 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
280 if (!props.containsKey(toscaField)) {
281 log.debug("TOSCA.meta file format is invalid: No new line after block_0 as expected in csar, csar ID {}", csarUUID);
282 BeEcompErrorManager.getInstance()
283 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
284 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
285 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
287 String value = props.getProperty(toscaField);
288 if (value == null || value.isEmpty()) {
289 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
290 BeEcompErrorManager.getInstance()
291 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
292 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
293 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
295 // TOSCA-Meta-File-Version & CSAR-Version : digit.digit - format
298 if ((toscaField.equals(TOSCA_META_FILE_VERSION) || toscaField.equals(CSAR_VERSION)) && !validateTOSCAMetaProperty(value)) {
299 log.debug("TOSCA-Metadata/TOSCA.meta file contains {} in wrong format (digit.digit), csar ID {}", toscaField, csarUUID);
300 BeEcompErrorManager.getInstance()
301 .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID,
302 CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
303 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
307 return Either.left(true);
310 private static boolean validateTOSCAMetaProperty(String toscaProperty) {
311 Matcher floatMatcher = floatPattern.matcher(toscaProperty);
312 return floatMatcher.matches();
315 private static Either<Boolean, ResponseFormat> validateIsTOSCAMetadataExist(Map<String, byte[]> csar, String csarUUID,
316 ComponentsUtils componentsUtils) {
317 if (csar == null || csar.isEmpty()) {
318 log.debug("Error when fetching csar with ID {}", csarUUID);
319 BeEcompErrorManager.getInstance().logBeDaoSystemError("Creating resource from CSAR: fetching CSAR with id " + csarUUID + " failed");
320 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID, csarUUID);
321 return Either.right(responseFormat);
323 Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN);
324 Optional<String> keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny();
325 if (!keyOp.isPresent()) {
326 log.debug("TOSCA-Metadata/TOSCA.meta file not found in csar, csar ID {}", csarUUID);
327 BeEcompErrorManager.getInstance()
328 .logInternalDataError("TOSCA-Metadata/TOSCA.meta file not found in CSAR with id " + csarUUID, CSAR_STRUCTURE_IS_INVALID,
329 ErrorSeverity.ERROR);
330 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID, csarUUID));
332 byte[] toscaMetaBytes = csar.get(keyOp.get());
333 if (toscaMetaBytes == null || toscaMetaBytes.length == 0) {
334 log.debug("TOSCA-Metadata/TOSCA.meta file not found in csar, csar ID {}", csarUUID);
335 BeEcompErrorManager.getInstance()
336 .logInternalDataError("TOSCA-Metadata/TOSCA.meta file not found in CSAR with id " + csarUUID, CSAR_STRUCTURE_IS_INVALID,
337 ErrorSeverity.ERROR);
338 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID, csarUUID));
340 return Either.left(Boolean.TRUE);
343 public static Either<String, ResponseFormat> getToscaYamlChecksum(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
344 Either<ImmutablePair<String, String>, ResponseFormat> toscaYamlRes = getToscaYaml(csar, csarUUID, componentsUtils, AuditingActionEnum.GET_TOSCA_MODEL);
345 if (toscaYamlRes.isRight() || toscaYamlRes.left().value() == null || toscaYamlRes.left().value().getRight() == null) {
346 log.debug("Faild to create toscaYamlChecksum for csar, csar ID {}", csarUUID);
347 return Either.right(toscaYamlRes.right().value());
349 String newCheckSum = GeneralUtility.calculateMD5Base64EncodedByByteArray(toscaYamlRes.left().value().getRight().getBytes());
350 return Either.left(newCheckSum);
353 public static boolean isCsarPayloadName(String payloadName) {
354 return payloadName != null && payloadName.toLowerCase().endsWith(TOSCA_CSAR_EXTENSION);