From 11ffaa62b28c517e2eb3b765ab6ec54f18f1ef6a Mon Sep 17 00:00:00 2001 From: vasraz Date: Mon, 18 Sep 2023 19:56:25 +0100 Subject: [PATCH] Fix 'Order of TOSCA.meta field is hardcoded'-bug Signed-off-by: Vasyl Razinkov Change-Id: Ie69bc1b1d1119f64a399ffda45c69169de94d1a2 Issue-ID: SDC-4627 --- .../files/default/error-configuration.yaml | 2 +- .../impl/ComponentInstanceBusinessLogic.java | 6 +- .../be/components/impl/CsarValidationUtils.java | 65 +++++++++++----------- .../main/resources/config/error-configuration.yaml | 2 +- 4 files changed, 35 insertions(+), 40 deletions(-) diff --git a/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml b/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml index 4d26e08831..1b4a9b1224 100644 --- a/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml +++ b/catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml @@ -1327,7 +1327,7 @@ errors: # %1 - csar file name CSAR_INVALID_FORMAT: { code: 400, - message: "Error: TOSCA CSAR '%1' is invalid. Invalid 'TOSCA-Metadata/Tosca.meta' file format.", + message: "Error: TOSCA CSAR '%1' is invalid. Invalid 'TOSCA-Metadata/Tosca.meta' file format.\n%2", messageId: "SVC4605" } #---------SVC4606------------------------------ diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java index 01e87a134b..ff98163b69 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java @@ -3051,8 +3051,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic { } Component eitherOriginComponent = getInstanceOriginNode(currentResourceInstance); - DataForMergeHolder dataHolder = compInstMergeDataBL - .saveAllDataBeforeDeleting(containerComponent, currentResourceInstance, eitherOriginComponent); + DataForMergeHolder dataHolder = compInstMergeDataBL.saveAllDataBeforeDeleting(containerComponent, currentResourceInstance, eitherOriginComponent); ComponentInstance resResourceInfo = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType); @@ -3143,8 +3142,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic { maintainNodeFilters(currentResourceInstance, newComponentInstance, containerComponentId); - resourceInstanceStatus = getResourceInstanceById(updatedComponentRes.left().value(), - updatedComponentInstance.getUniqueId()); + resourceInstanceStatus = getResourceInstanceById(updatedComponentRes.left().value(), updatedComponentInstance.getUniqueId()); if (resourceInstanceStatus.isRight()) { throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse (resourceInstanceStatus.right().value()), updatedComponentInstance.getUniqueId()); diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java index 0fcaf7afe3..287cb1b0c3 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CsarValidationUtils.java @@ -29,7 +29,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Properties; -import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -60,7 +59,7 @@ public class CsarValidationUtils { private static final String[] TOSCA_METADATA_FIELDS = {TOSCA_META_FILE_VERSION, CSAR_VERSION, CREATED_BY, TOSCA_META_ENTRY_DEFINITIONS}; private static final String ARTIFACTS_METADATA_FILE = "HEAT.meta"; private static final String TOSCA_CSAR_EXTENSION = ".csar"; - 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 {}"; + 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 '%s'"; 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 "; private static final String CSAR_INTERNALS_ARE_INVALID = "CSAR internals are invalid"; 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 {}"; @@ -148,23 +147,23 @@ public class CsarValidationUtils { Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN); Optional keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny(); if (keyOp.isEmpty()) { - log.error(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID); + log.error(String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); 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); return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, - TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); + String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID))); } Properties props = new Properties(); try { props.load(new StringReader(new String(csar.get(keyOp.get())).replace("\\", "\\\\"))); } catch (IOException e) { - log.error(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID, e); + log.error(String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID), e); 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); return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, - TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); + String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID))); } String yamlFileName = props.getProperty(TOSCA_META_ENTRY_DEFINITIONS); String result = Arrays.asList(yamlFileName.split(DEL_PATTERN)).stream().map(x -> x).collect(Collectors.joining(DEL_PATTERN)); @@ -239,44 +238,43 @@ public class CsarValidationUtils { Pattern pattern = Pattern.compile(TOSCA_METADATA_PATH_PATTERN); Optional keyOp = csar.keySet().stream().filter(k -> pattern.matcher(k).matches()).findAny(); if (keyOp.isEmpty()) { - log.error(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID); + log.error(String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); 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); return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, - TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); + String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID))); } String toscaMetadata = new String(csar.get(keyOp.get())); - String[] splited = toscaMetadata.split(NEW_LINE_DELM); + Either blockStatus = validateBlock(csarUUID, componentsUtils, toscaMetadata); + if (blockStatus.isRight()) { + return blockStatus; + } + return Either.left(true); + } + + private static Either validateBlock(String csarUUID, ComponentsUtils componentsUtils, String toscaMetadata) { + final String[] splited = toscaMetadata.split(NEW_LINE_DELM); if (splited == null || splited.length < TOSCA_METADATA_FIELDS.length) { - log.error(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID); + log.error(String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); 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); return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, - TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); + String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID))); } - Either blockStatus = validateBlock(csarUUID, splited, componentsUtils); - if (blockStatus.isRight()) { - return blockStatus; + final Properties props = new Properties(); + try { + props.load(new ByteArrayInputStream(toscaMetadata.getBytes())); + } catch (final IOException e) { + log.error(String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID), e); + 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); + return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, + String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID))); } - return Either.left(true); - } - - private static Either validateBlock(String csarUUID, String[] splited, ComponentsUtils componentsUtils) { - int index = 0; - for (String toscaField : TOSCA_METADATA_FIELDS) { - Properties props = new Properties(); - try { - props.load(new ByteArrayInputStream(splited[index].getBytes())); - } catch (IOException e) { - log.error(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID, e); - 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); - return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, - TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); - } + for (final String toscaField : TOSCA_METADATA_FIELDS) { if (!props.containsKey(toscaField)) { final String msg = "TOSCA.meta file format is invalid: No new line after block_0 as expected in csar, csar ID {}"; log.error(msg, csarUUID); @@ -287,12 +285,12 @@ public class CsarValidationUtils { } final String value = props.getProperty(toscaField); if (value == null || value.isEmpty()) { - log.error(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID); + log.error(String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); 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); return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, - TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID)); + String.format(TOSCA_METADATA_TOSCA_META_FILE_IS_NOT_IN_EXPECTED_KEY_VALUE_FORM_IN_CSAR_CSAR_ID, csarUUID))); } // TOSCA-Meta-File-Version & CSAR-Version : digit.digit - format validation if ((toscaField.equals(TOSCA_META_FILE_VERSION) || toscaField.equals(CSAR_VERSION)) && !validateTOSCAMetaProperty(value)) { @@ -303,7 +301,6 @@ public class CsarValidationUtils { CSAR_INTERNALS_ARE_INVALID, ErrorSeverity.ERROR); return Either.right(componentsUtils.getResponseFormat(ActionStatus.CSAR_INVALID_FORMAT, csarUUID, msg, toscaField, csarUUID)); } - index++; } return Either.left(true); } diff --git a/catalog-be/src/main/resources/config/error-configuration.yaml b/catalog-be/src/main/resources/config/error-configuration.yaml index d51b39184d..54097500cf 100644 --- a/catalog-be/src/main/resources/config/error-configuration.yaml +++ b/catalog-be/src/main/resources/config/error-configuration.yaml @@ -1327,7 +1327,7 @@ errors: # %1 - csar file name CSAR_INVALID_FORMAT: { code: 400, - message: "Error: TOSCA CSAR '%1' is invalid. Invalid 'TOSCA-Metadata/Tosca.meta' file format.", + message: "Error: TOSCA CSAR '%1' is invalid. Invalid 'TOSCA-Metadata/Tosca.meta' file format.\n%2", messageId: "SVC4605" } #---------SVC4606------------------------------ -- 2.16.6