Fix legacy batch response with not found CM-handle 54/140654/3
authordanielhanrahan <daniel.hanrahan@est.tech>
Thu, 17 Apr 2025 17:21:14 +0000 (18:21 +0100)
committerdanielhanrahan <daniel.hanrahan@est.tech>
Fri, 25 Apr 2025 14:04:19 +0000 (15:04 +0100)
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 <daniel.hanrahan@est.tech>
Change-Id: Ifff2c4bd291107480ca7462d721a02f8ea138e58

cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/data/DmiDataOperations.java
integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/LegacyBatchDataOperationSpec.groovy

index 0e9db3d..e4f8176 100644 (file)
@@ -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<String> cmHandleIds = getDistinctCmHandleIds(dataOperationRequest);
+        final Collection<String> cmHandleIds = getDistinctCmHandleIds(dataOperationRequest);
 
         final Collection<YangModelCmHandle> yangModelCmHandles
             = inventoryPersistence.getYangModelCmHandles(cmHandleIds);
@@ -250,10 +251,22 @@ public class DmiDataOperations {
         }
     }
 
-    private Set<String> getDistinctCmHandleIds(final DataOperationRequest dataOperationRequest) {
+    private Collection<String> getDistinctCmHandleIds(final DataOperationRequest dataOperationRequest) {
+        final Collection<String> distinctCmHandleReferences = getDistinctCmHandleReferences(dataOperationRequest);
+        final Collection<String> 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<String> getDistinctCmHandleReferences(final DataOperationRequest dataOperationRequest) {
         return dataOperationRequest.getDataOperationDefinitions().stream()
                 .flatMap(it -> it.getCmHandleReferences().stream())
-                .map(alternateIdMatcher::getCmHandleId)
                 .collect(Collectors.toSet());
     }
 
index 83f9122..ee15c4b 100644 (file)
@@ -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) {