From b639abf427fb86012fb6358bd5493add3040b02d Mon Sep 17 00:00:00 2001 From: danielhanrahan Date: Thu, 17 Apr 2025 18:21:14 +0100 Subject: [PATCH] Fix legacy batch response with not found CM-handle An unhandled exception leads to the entire batch operation failing, even if only a single CM handle in the batch was not found. This fixes the issue by swallowing the exception. Note there is existing logic in DmiDataOperationsHelper for reporting not-found CM handles. Issue-ID: CPS-2769 Signed-off-by: danielhanrahan Change-Id: Ifff2c4bd291107480ca7462d721a02f8ea138e58 --- .../onap/cps/ncmp/impl/data/DmiDataOperations.java | 21 +++++++++++++++++---- .../ncmp/LegacyBatchDataOperationSpec.groovy | 3 +-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java index 0e9db3d17b..e4f8176048 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java @@ -27,10 +27,10 @@ import static org.onap.cps.ncmp.api.data.models.OperationType.READ; import static org.onap.cps.ncmp.impl.models.RequiredDmiService.DATA; import io.micrometer.core.annotation.Timed; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.onap.cps.api.exceptions.CpsException; @@ -38,6 +38,7 @@ import org.onap.cps.ncmp.api.NcmpResponseStatus; import org.onap.cps.ncmp.api.data.models.CmResourceAddress; import org.onap.cps.ncmp.api.data.models.DataOperationRequest; import org.onap.cps.ncmp.api.data.models.OperationType; +import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException; import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException; import org.onap.cps.ncmp.api.inventory.models.CmHandleState; import org.onap.cps.ncmp.impl.data.models.DmiDataOperation; @@ -142,7 +143,7 @@ public class DmiDataOperations { final String requestId, final String authorization) { - final Set cmHandleIds = getDistinctCmHandleIds(dataOperationRequest); + final Collection cmHandleIds = getDistinctCmHandleIds(dataOperationRequest); final Collection yangModelCmHandles = inventoryPersistence.getYangModelCmHandles(cmHandleIds); @@ -250,10 +251,22 @@ public class DmiDataOperations { } } - private Set getDistinctCmHandleIds(final DataOperationRequest dataOperationRequest) { + private Collection getDistinctCmHandleIds(final DataOperationRequest dataOperationRequest) { + final Collection distinctCmHandleReferences = getDistinctCmHandleReferences(dataOperationRequest); + final Collection resolvedCmHandleIds = new ArrayList<>(distinctCmHandleReferences.size()); + for (final String cmHandleReference : distinctCmHandleReferences) { + try { + resolvedCmHandleIds.add(alternateIdMatcher.getCmHandleId(cmHandleReference)); + } catch (final CmHandleNotFoundException ignored) { + // exception ignored as DmiDataOperationsHelper has its own logic for reporting not found handles + } + } + return resolvedCmHandleIds; + } + + private Collection getDistinctCmHandleReferences(final DataOperationRequest dataOperationRequest) { return dataOperationRequest.getDataOperationDefinitions().stream() .flatMap(it -> it.getCmHandleReferences().stream()) - .map(alternateIdMatcher::getCmHandleId) .collect(Collectors.toSet()); } diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/LegacyBatchDataOperationSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/LegacyBatchDataOperationSpec.groovy index 83f91226be..ee15c4b94f 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/LegacyBatchDataOperationSpec.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/LegacyBatchDataOperationSpec.groovy @@ -114,8 +114,7 @@ class LegacyBatchDataOperationSpec extends CpsIntegrationSpecBase { where: scenario | cmHandleId || expectedStatusCode | expectedStatusMessage 'CM handle not ready' | 'not-ready-ch' || 101 | 'cm handle(s) not ready' - // FIXME BUG CPS-2769: CM handle not found causes batch to fail - // 'CM handle not found' | 'not-found-ch' || 100 | 'cm handle reference(s) not found' + 'CM handle not found' | 'not-found-ch' || 100 | 'cm handle reference(s) not found' } def makeDataOperationRequestBody(cmHandleId) { -- 2.16.6