Refactor catalog-be code
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / CsarValidationUtils.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.openecomp.sdc.be.components.impl;
22
23 import fj.data.Either;
24 import org.apache.commons.lang3.tuple.ImmutablePair;
25 import org.openecomp.sdc.be.config.BeEcompErrorManager;
26 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
27 import org.openecomp.sdc.be.dao.api.ActionStatus;
28 import org.openecomp.sdc.be.impl.ComponentsUtils;
29 import org.openecomp.sdc.be.tosca.CsarUtils;
30 import org.openecomp.sdc.common.log.wrappers.Logger;
31 import org.openecomp.sdc.common.util.GeneralUtility;
32 import org.openecomp.sdc.exception.ResponseFormat;
33
34 import java.io.ByteArrayInputStream;
35 import java.io.IOException;
36 import java.io.StringReader;
37 import java.util.*;
38 import java.util.regex.Matcher;
39 import java.util.regex.Pattern;
40 import java.util.stream.Collectors;
41
42 public class CsarValidationUtils {
43
44     private static final Logger log = Logger.getLogger(CsarValidationUtils.class.getName());
45
46     private static final String TOSCA_META_FILE_VERSION = "TOSCA-Meta-File-Version";
47     private static final String CSAR_VERSION = "CSAR-Version";
48     private static final String CREATED_BY = "Created-By";
49     private static final String NEW_LINE_DELM = "\n";
50     public static final String TOSCA_METADATA = "TOSCA-Metadata";
51     public static final String TOSCA_FILE = "TOSCA.meta";
52     public static final String DEL_PATTERN = "([/\\\\]+)";
53     public static final String TOSCA_METADATA_PATH_PATTERN = TOSCA_METADATA +
54             // Artifact Group (i.e Deployment/Informational)
55             DEL_PATTERN + TOSCA_FILE;
56
57     public static final String TOSCA_META_ENTRY_DEFINITIONS = "Entry-Definitions";
58     private static final String[] TOSCA_METADATA_FIELDS = { TOSCA_META_FILE_VERSION, CSAR_VERSION, CREATED_BY, TOSCA_META_ENTRY_DEFINITIONS };
59     public static final String ARTIFACTS_METADATA_FILE = "HEAT.meta";
60     public static final String TOSCA_CSAR_EXTENSION = ".csar";
61     public 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 {}";
62     public 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 ";
63     public static final String CSAR_INTERNALS_ARE_INVALID = "CSAR internals are invalid";
64     public 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 {}";
65     public static final String FILE_NOT_FOUND_IN_CSAR_WITH_ID = " file not found in CSAR with id ";
66     public static final String CSAR_STRUCTURE_IS_INVALID = "CSAR structure is invalid";
67     public static final String ENTRY_DEFINITIONS = "Entry-Definitions ";
68     private static final Pattern floatPattern = Pattern.compile("^\\d{1}[.]\\d{1}$");
69
70     /**
71      * Validates Csar
72      * @param csar
73      * @param csarUUID
74      * @param componentsUtils
75      * @return
76      */
77     public static Either<Boolean, ResponseFormat> validateCsar(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
78         Either<Boolean, ResponseFormat> validateStatus = validateIsTOSCAMetadataExist(csar, csarUUID, componentsUtils);
79         if (validateStatus.isRight()) {
80             return Either.right(validateStatus.right().value());
81         }
82
83         removeNonUniqueArtifactsFromCsar(csar);
84
85         log.trace("TOSCA-Metadata/TOSCA.meta file found, CSAR id {}", csarUUID);
86         validateStatus = validateTOSCAMetadataFile(csar, csarUUID, componentsUtils);
87         if (validateStatus.isRight()) {
88             return Either.right(validateStatus.right().value());
89         }
90         return Either.left(true);
91     }
92
93     private static void removeNonUniqueArtifactsFromCsar(Map<String, byte[]> csar) {
94
95         List<String> nonUniqueArtifactsToRemove = new ArrayList<>();
96         String[] paths = csar.keySet().toArray(new String[csar.keySet().size()]);
97         int numberOfArtifacts = paths.length;
98         for(int i = 0; i < numberOfArtifacts; ++i ){
99             collectNonUniqueArtifact(paths, i, numberOfArtifacts, nonUniqueArtifactsToRemove);
100         }
101         nonUniqueArtifactsToRemove.stream().forEach(csar::remove);
102     }
103
104     private static void collectNonUniqueArtifact( String[] paths, int currInd, int numberOfArtifacts, List<String> nonUniqueArtifactsToRemove) {
105
106         String[] parsedPath = paths[currInd].split("/");
107         String[] otherParsedPath;
108         int artifactNameInd = parsedPath.length - 1;
109         for(int j = currInd + 1; j < numberOfArtifacts; ++j ){
110             otherParsedPath = paths[j].split("/");
111             if(parsedPath.length == otherParsedPath.length && parsedPath.length > 3 && isEqualArtifactNames(parsedPath, otherParsedPath)){
112                 log.error("Can't upload two artifact with the same name {}. The artifact with path {} will be handled, and the artifact with path {} will be ignored. ",
113                         parsedPath[artifactNameInd], paths[currInd], paths[j]);
114                 nonUniqueArtifactsToRemove.add(paths[j]);
115             }
116         }
117     }
118
119     private static boolean isEqualArtifactNames(String[] parsedPath, String[] otherParsedPath) {
120         boolean isEqualArtifactNames = false;
121         int artifactNameInd = parsedPath.length - 1;
122         int artifactGroupTypeInd = parsedPath.length - 3;
123         String groupType = parsedPath[artifactGroupTypeInd];
124         String artifactName = parsedPath[artifactNameInd];
125         String otherGroupType = otherParsedPath[artifactGroupTypeInd];
126         String otherArtifactName = otherParsedPath[artifactNameInd];
127         String vfcToscaName = parsedPath.length == 5 ? parsedPath[1] : null;
128
129         if(artifactName.equalsIgnoreCase(otherArtifactName) && groupType.equalsIgnoreCase(otherGroupType)){
130             isEqualArtifactNames = vfcToscaName == null || vfcToscaName.equalsIgnoreCase(otherParsedPath[1]);
131         }
132         return isEqualArtifactNames;
133     }
134
135     public static Either<ImmutablePair<String, String>, ResponseFormat> getToscaYaml(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
136         Either<Boolean, ResponseFormat> validateStatus = validateIsTOSCAMetadataExist(csar, csarUUID, componentsUtils);
137         if (validateStatus.isRight()) {
138             return Either.right(validateStatus.right().value());
139         }
140         Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN);
141         Optional<String> keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny();
142         if(!keyOp.isPresent()){
143             log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
144             BeEcompErrorManager.getInstance().logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
145             return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
146         }
147         byte[] toscaMetaBytes = csar.get(keyOp.get());
148         Properties props = new Properties();
149         try {
150             String propStr = new String(toscaMetaBytes);
151             props.load(new StringReader(propStr.replace("\\","\\\\")));
152         } catch (IOException e) {
153             log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID, e);
154             BeEcompErrorManager.getInstance().logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
155             return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
156         }
157
158         String yamlFileName = props.getProperty(TOSCA_META_ENTRY_DEFINITIONS);
159         String[] ops = yamlFileName.split(DEL_PATTERN);
160         List<String> list = Arrays.asList(ops);
161         String result = list.stream().map(x -> x).collect(Collectors.joining(DEL_PATTERN));
162         keyOp = csar.keySet().stream().filter(k -> Pattern.compile(result).matcher(k).matches()).findAny();
163         if(!keyOp.isPresent()){
164             log.debug(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID, csarUUID);
165             BeEcompErrorManager.getInstance().logInternalDataError(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
166             return Either.right(componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, yamlFileName));
167         }
168
169         log.trace("Found Entry-Definitions property in TOSCA-Metadata/TOSCA.meta, Entry-Definitions: {}, CSAR id: {}", yamlFileName, csarUUID);
170         byte[] yamlFileBytes = csar.get(yamlFileName);
171         if (yamlFileBytes == null) {
172             log.debug("Entry-Definitions {} file not found in csar, csar ID {}", yamlFileName, csarUUID);
173             BeEcompErrorManager.getInstance().logInternalDataError(ENTRY_DEFINITIONS + yamlFileName + FILE_NOT_FOUND_IN_CSAR_WITH_ID + csarUUID, CSAR_STRUCTURE_IS_INVALID, ErrorSeverity.ERROR);
174             return Either.right(componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, yamlFileName));
175         }
176
177         String yamlFileContents = new String(yamlFileBytes);
178
179         return Either.left(new ImmutablePair<>(yamlFileName, yamlFileContents));
180     }
181
182     public static Either<ImmutablePair<String, String>, ResponseFormat> getArtifactsMeta(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
183
184         if( !csar.containsKey(CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE) ) {
185             log.debug(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID, csarUUID);
186             BeEcompErrorManager.getInstance().logInternalDataError(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
187             return Either.right(componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, ARTIFACTS_METADATA_FILE));
188         }
189
190         log.trace("Found Entry-Definitions property in TOSCA-Metadata/TOSCA.meta, Entry-Definitions: {}, CSAR id: {}", ARTIFACTS_METADATA_FILE, csarUUID);
191         byte[] artifactsMetaBytes = csar.get(CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE);
192         if (artifactsMetaBytes == null) {
193             log.debug("Entry-Definitions {}{} file not found in csar, csar ID {}", CsarUtils.ARTIFACTS_PATH, ARTIFACTS_METADATA_FILE, csarUUID);
194             BeEcompErrorManager.getInstance().logInternalDataError(ENTRY_DEFINITIONS + CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE + FILE_NOT_FOUND_IN_CSAR_WITH_ID + csarUUID, CSAR_STRUCTURE_IS_INVALID, ErrorSeverity.ERROR);
195             return Either.right(componentsUtils.getResponseFormat(ActionStatus.YAML_NOT_FOUND_IN_CSAR, csarUUID, CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE));
196         }
197
198         String artifactsFileContents = new String(artifactsMetaBytes);
199
200         return Either.left(new ImmutablePair<>(CsarUtils.ARTIFACTS_PATH + ARTIFACTS_METADATA_FILE, artifactsFileContents));
201     }
202
203     public static Either<ImmutablePair<String, byte[]>, ResponseFormat> getArtifactsContent(String csarUUID, Map<String, byte[]> csar, String artifactPath, String artifactName, ComponentsUtils componentsUtils) {
204         if (!csar.containsKey(artifactPath)) {
205             log.debug("Entry-Definitions entry not found in Artifacts/HEAT.meta file, csar ID {}", csarUUID);
206             BeEcompErrorManager.getInstance().logInternalDataError(ENTRY_DEFINITIONS_ENTRY_NOT_FOUND_IN_TOSCA_METADATA_TOSCA_META_FILE_CSAR_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
207             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND_IN_CSAR, CsarUtils.ARTIFACTS_PATH + artifactName, csarUUID));
208         }
209
210         log.trace("Found Entry-Definitions property in Artifacts/HEAT.meta, Entry-Definitions: {}, CSAR id: {}", artifactPath, csarUUID);
211         byte[] artifactFileBytes = csar.get(artifactPath);
212         if (artifactFileBytes == null) {
213             log.debug("Entry-Definitions {}{} file not found in csar, csar ID {}", CsarUtils.ARTIFACTS_PATH, artifactName, csarUUID);
214             BeEcompErrorManager.getInstance().logInternalDataError(ENTRY_DEFINITIONS + artifactPath + FILE_NOT_FOUND_IN_CSAR_WITH_ID + csarUUID, CSAR_STRUCTURE_IS_INVALID, ErrorSeverity.ERROR);
215             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND_IN_CSAR, artifactPath, csarUUID));
216         }
217
218         return Either.left(new ImmutablePair<>(artifactName, artifactFileBytes));
219     }
220
221     private static Either<Boolean, ResponseFormat> validateTOSCAMetadataFile(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
222
223         Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN);
224         Optional<String> keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny();
225         if(!keyOp.isPresent()){
226             log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
227             BeEcompErrorManager.getInstance().logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
228             return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
229         }
230
231         byte[] toscaMetaBytes = csar.get(keyOp.get());
232         String toscaMetadata = new String(toscaMetaBytes);
233         String[] splited = toscaMetadata.split(NEW_LINE_DELM);
234         if (splited == null || splited.length < TOSCA_METADATA_FIELDS.length) {
235             log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
236             BeEcompErrorManager.getInstance().logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
237             return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
238         }
239
240         Either<Boolean, ResponseFormat> blockStatus = validateBlock(csarUUID, splited, componentsUtils);
241         if (blockStatus.isRight()) {
242             return Either.right(blockStatus.right().value());
243         }
244
245         return Either.left(true);
246
247     }
248
249     private static Either<Boolean, ResponseFormat> validateBlock(String csarUUID, String[] splited, ComponentsUtils componentsUtils) {
250         int index = 0;
251         for (String toscaField : TOSCA_METADATA_FIELDS) {
252
253             Properties props = new Properties();
254
255             try {
256                 props.load(new ByteArrayInputStream(splited[index].getBytes()));
257             } catch (IOException e) {
258                 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID, e);
259                 BeEcompErrorManager.getInstance().logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
260                 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
261             }
262             if (!props.containsKey(toscaField)) {
263                 log.debug("TOSCA.meta file format is invalid: No new line after block_0 as expected in csar, csar ID {}", csarUUID);
264                 BeEcompErrorManager.getInstance().logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
265                 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
266             }
267             String value = props.getProperty(toscaField);
268             if (value == null || value.isEmpty()) {
269                 log.debug(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID);
270                 BeEcompErrorManager.getInstance().logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
271                 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
272             }
273
274             // TOSCA-Meta-File-Version & CSAR-Version : digit.digit - format
275             // validation
276             if ((toscaField.equals(TOSCA_META_FILE_VERSION) || toscaField.equals(CSAR_VERSION)) && !validateTOSCAMetaProperty(value)) {
277                 log.debug("TOSCA-Metadata/TOSCA.meta file contains {} in wrong format (digit.digit), csar ID {}", toscaField, csarUUID);
278                 BeEcompErrorManager.getInstance()
279                         .logInternalDataError(TOSCA_METADATA_TOSCA_META_FILE_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_WITH_ID + csarUUID, CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR);
280                 return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID));
281             }
282             index++;
283         }
284         return Either.left(true);
285     }
286
287     private static boolean validateTOSCAMetaProperty(String toscaProperty) {
288         Matcher floatMatcher = floatPattern.matcher(toscaProperty);
289         return floatMatcher.matches();
290     }
291
292     private static Either<Boolean, ResponseFormat> validateIsTOSCAMetadataExist(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
293         if (csar == null || csar.isEmpty()) {
294             log.debug("Error when fetching csar with ID {}", csarUUID);
295             BeEcompErrorManager.getInstance().logBeDaoSystemError("Creating resource from CSAR: fetching CSAR with id " + csarUUID + " failed");
296             ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID, csarUUID);
297             return Either.right(responseFormat);
298         }
299
300         Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN);
301         Optional<String> keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny();
302         if(!keyOp.isPresent()){
303
304             log.debug("TOSCA-Metadata/TOSCA.meta file not found in csar, csar ID {}", csarUUID);
305             BeEcompErrorManager.getInstance().logInternalDataError("TOSCA-Metadata/TOSCA.meta file not found in CSAR with id " + csarUUID, CSAR_STRUCTURE_IS_INVALID, ErrorSeverity.ERROR);
306             return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID, csarUUID));
307         }
308         byte[] toscaMetaBytes = csar.get(keyOp.get());
309
310         if (toscaMetaBytes == null || toscaMetaBytes.length == 0) {
311             log.debug("TOSCA-Metadata/TOSCA.meta file not found in csar, csar ID {}", csarUUID);
312             BeEcompErrorManager.getInstance().logInternalDataError("TOSCA-Metadata/TOSCA.meta file not found in CSAR with id " + csarUUID, CSAR_STRUCTURE_IS_INVALID, ErrorSeverity.ERROR);
313             return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID, csarUUID));
314         }
315
316         return Either.left(Boolean.TRUE);
317     }
318
319     public static Either<String, ResponseFormat> getToscaYamlChecksum(Map<String, byte[]> csar, String csarUUID, ComponentsUtils componentsUtils) {
320
321         Either<ImmutablePair<String, String>, ResponseFormat> toscaYamlRes = getToscaYaml(csar, csarUUID, componentsUtils);
322         if (toscaYamlRes.isRight() || toscaYamlRes.left().value() == null || toscaYamlRes.left().value().getRight() == null) {
323             log.debug("Faild to create toscaYamlChecksum for csar, csar ID {}", csarUUID);
324             return Either.right(toscaYamlRes.right().value());
325         }
326
327         String newCheckSum = GeneralUtility.calculateMD5Base64EncodedByByteArray(toscaYamlRes.left().value().getRight().getBytes());
328         return Either.left(newCheckSum);
329
330     }
331
332     public static boolean isCsarPayloadName(String payloadName) {
333         return payloadName != null && payloadName.toLowerCase().endsWith(TOSCA_CSAR_EXTENSION);
334     }
335
336 }