Update error response for ncmp endpoints 26/139326/7
authorseanbeirne <sean.beirne@est.tech>
Mon, 4 Nov 2024 16:36:10 +0000 (16:36 +0000)
committerseanbeirne <sean.beirne@est.tech>
Mon, 18 Nov 2024 10:43:36 +0000 (10:43 +0000)
Issue-ID: CPS-2386
Change-Id: Ib4f37858f5f107e350a13e4bf7ed93493864ce60
Signed-off-by: seanbeirne <sean.beirne@est.tech>
15 files changed:
cps-ncmp-rest/docs/openapi/components.yaml
cps-ncmp-rest/docs/openapi/ncmp.yml
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyRestExceptionHandler.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NcmpResponseStatus.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/exceptions/CmHandleNotFoundException.java [new file with mode: 0644]
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServicePropertyHandlerSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy
cps-ncmp-service/src/test/resources/dataOperationResponseEvent.json
docs/api/swagger/ncmp/openapi-inventory.yaml
docs/api/swagger/ncmp/openapi.yaml

index e564c6b..637a138 100644 (file)
@@ -516,7 +516,7 @@ components:
     outputAlternateIdOptionInQuery:
       name: outputAlternateId
       in: query
-      description: Boolean parameter to determine if returned value(s) will be cm handle Ids or alternate Ids for a given query
+      description: Boolean parameter to determine if returned value(s) will be cm handle ids or alternate ids for a given query
       required: false
       schema:
         type: boolean
index 4624bc1..15b8b37 100755 (executable)
@@ -417,7 +417,7 @@ getCmHandleStateById:
 
 searchCmHandleIds:
   post:
-    description: Execute cm handle query search and return a list of cm handle references. Any number of conditions can be applied. To be included in the result a cm-handle must fulfill ALL the conditions. An empty collection will be returned in the case that the cm handle does not match a condition. For more on cm handle query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm handle query search Read the Docs</a>.<br/>By supplying a CPS Path it is possible to query on any data related to the cm handle. For more on CPS Path please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html">CPS Path Read the Docs</a>. The cm handle ancestor is automatically returned for this query.
+    description: Execute cm handle query search and return a list of cm handle references. Any number of conditions can be applied. To be included in the result a cm handle must fulfill ALL the conditions. An empty collection will be returned in the case that the cm handle does not match a condition. For more on cm handle query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm handle query search Read the Docs</a>.<br/>By supplying a CPS Path it is possible to query on any data related to the cm handle. For more on CPS Path please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html">CPS Path Read the Docs</a>. The cm handle ancestor is automatically returned for this query.
     tags:
       - network-cm-proxy
     summary: Execute cm handle query upon a given set of query parameters
index 6910003..7255743 100644 (file)
@@ -26,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.onap.cps.ncmp.api.data.exceptions.InvalidDatastoreException;
 import org.onap.cps.ncmp.api.data.exceptions.InvalidOperationException;
 import org.onap.cps.ncmp.api.data.exceptions.OperationNotSupportedException;
+import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException;
 import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException;
 import org.onap.cps.ncmp.api.exceptions.DmiRequestException;
 import org.onap.cps.ncmp.api.exceptions.InvalidTopicException;
@@ -90,8 +91,8 @@ public class NetworkCmProxyRestExceptionHandler {
         return buildErrorResponse(HttpStatus.CONFLICT, exception);
     }
 
-    @ExceptionHandler({DataNodeNotFoundException.class})
-    public static ResponseEntity<Object> handleNotFoundExceptions(final Exception exception) {
+    @ExceptionHandler({CmHandleNotFoundException.class, DataNodeNotFoundException.class})
+    public static ResponseEntity<Object> cmHandleNotFoundExceptions(final Exception exception) {
         return buildErrorResponse(HttpStatus.NOT_FOUND, exception);
     }
 
index 8cfad7d..be22752 100644 (file)
@@ -27,14 +27,14 @@ public enum NcmpResponseStatus {
 
     SUCCESS("0", "Successfully applied changes"),
     CM_DATA_SUBSCRIPTION_ACCEPTED("1", "ACCEPTED"),
-    CM_HANDLES_NOT_FOUND("100", "cm handle id(s) not found"),
+    CM_HANDLES_NOT_FOUND("100", "cm handle reference(s) not found"),
     CM_HANDLES_NOT_READY("101", "cm handle(s) not ready"),
     DMI_SERVICE_NOT_RESPONDING("102", "dmi plugin service is not responding"),
     UNABLE_TO_READ_RESOURCE_DATA("103", "dmi plugin service is not able to read resource data"),
     CM_DATA_SUBSCRIPTION_REJECTED("104", "REJECTED"),
     UNKNOWN_ERROR("108", "Unknown error"),
     CM_HANDLE_ALREADY_EXIST("109", "cm-handle already exists"),
-    CM_HANDLE_INVALID_ID("110", "cm-handle has an invalid character(s) in id"),
+    CM_HANDLE_INVALID_ID("110", "cm handle reference has an invalid character(s) in id"),
     ALTERNATE_ID_ALREADY_ASSOCIATED("111", "alternate id already associated"),
     MESSAGE_TOO_LARGE("112", "message too large");
 
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/exceptions/CmHandleNotFoundException.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/exceptions/CmHandleNotFoundException.java
new file mode 100644 (file)
index 0000000..715e1a0
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2024 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.ncmp.api.exceptions;
+
+public class CmHandleNotFoundException extends NcmpException {
+
+    private static final String CM_HANDLE_NOT_FOUND_DETAILS_FORMAT =
+        "No cm handles found with reference %s";
+
+    /**
+     * Constructor.
+     *
+     * @param cmHandleReference cm handle reference either cm handle id or alternate id
+     */
+    public CmHandleNotFoundException(final String cmHandleReference) {
+        super("Cm handle not found", String.format(CM_HANDLE_NOT_FOUND_DETAILS_FORMAT,
+            cmHandleReference));
+    }
+
+}
index a899687..f0547d3 100644 (file)
@@ -78,7 +78,7 @@ public class NetworkCmProxyInventoryFacade {
      * Get all cm handle references by DMI plugin identifier.
      *
      * @param dmiPluginIdentifier DMI plugin identifier
-     * @param outputAlternateId   Boolean for cm handle reference type either
+     * @param outputAlternateId   boolean for cm handle reference type either
      *                            cm handle id (false) or alternate id (true)
      * @return collection of cm handle references
      */
@@ -91,7 +91,7 @@ public class NetworkCmProxyInventoryFacade {
      * Get all cm handle IDs by various properties.
      *
      * @param cmHandleQueryServiceParameters cm handle query parameters
-     * @param outputAlternateId              Boolean for cm handle reference type either
+     * @param outputAlternateId              boolean for cm handle reference type either
      *                                       cm handle id (false) or alternate id (true)
      * @return                               collection of cm handle references
      */
@@ -162,7 +162,7 @@ public class NetworkCmProxyInventoryFacade {
      * Retrieve cm handle ids for the given query parameters.
      *
      * @param cmHandleQueryApiParameters cm handle query parameters
-     * @param outputAlternateId Boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
+     * @param outputAlternateId boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
      * @return cm handle ids
      */
     public Collection<String> executeCmHandleIdSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters,
index 74c0492..415153d 100644 (file)
@@ -103,8 +103,8 @@ public interface CmHandleQueryService {
      * Get collection of all cm handles references by DMI plugin identifier and alternate id output option.
      *
      * @param dmiPluginIdentifier DMI plugin identifier
-     * @param outputAlternateId   Boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
-     * @return collection of cm handle ids
+     * @param outputAlternateId   boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
+     * @return collection of cm handle references
      */
     Collection<String> getCmHandleReferencesByDmiPluginIdentifier(String dmiPluginIdentifier,
                                                                   boolean outputAlternateId);
index 61d7df9..562cb6e 100644 (file)
@@ -157,12 +157,12 @@ public interface InventoryPersistence extends NcmpPersistence {
      * get CM handles that has given module names.
      *
      * @param moduleNamesForQuery module names
-     * @param outputAlternateIds  Boolean for cm handle reference type either
+     * @param outputAlternateId  boolean for cm handle reference type either
      *                            cm handle id (false or null) or alternate id (true)
-     * @return Collection of CM handle Ids
+     * @return Collection of CM handle references
      */
     Collection<String> getCmHandleReferencesWithGivenModules(Collection<String> moduleNamesForQuery,
-                                                             boolean outputAlternateIds);
+                                                             boolean outputAlternateId);
 
     /**
      * Check database if cm handle id exists if not return false.
index c4765ff..e468ed1 100644 (file)
@@ -40,6 +40,7 @@ import org.onap.cps.api.CpsAnchorService;
 import org.onap.cps.api.CpsDataService;
 import org.onap.cps.api.CpsModuleService;
 import org.onap.cps.impl.utils.CpsValidator;
+import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException;
 import org.onap.cps.ncmp.api.inventory.models.CompositeState;
 import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder;
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle;
@@ -193,8 +194,7 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
         final Collection<DataNode> dataNodes = cmHandleQueryService
             .queryNcmpRegistryByCpsPath(cpsPathForCmHandleByAlternateId, OMIT_DESCENDANTS);
         if (dataNodes.isEmpty()) {
-            throw new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
-                cpsPathForCmHandleByAlternateId);
+            throw new CmHandleNotFoundException(alternateId);
         }
         return dataNodes.iterator().next();
     }
@@ -218,8 +218,8 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
 
     @Override
     public Collection<String> getCmHandleReferencesWithGivenModules(final Collection<String> moduleNamesForQuery,
-                                                                    final boolean outputAlternateIds) {
-        if (outputAlternateIds) {
+                                                                    final boolean outputAlternateId) {
+        if (outputAlternateId) {
             final Collection<String> cmHandleIds =
                 cpsAnchorService.queryAnchorNames(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, moduleNamesForQuery);
             return getAlternateIdsFromDataNodes(getCmHandleDataNodes(cmHandleIds));
index 1beab20..6213258 100644 (file)
@@ -162,9 +162,9 @@ class CmHandleRegistrationServicePropertyHandlerSpec extends Specification {
             }
         where:
             scenario                   | cmHandleId               | exception                                                                                           || expectedError        | expectedErrorText
-            'Cm Handle does not exist' | 'cmHandleId'             | new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR)                        || CM_HANDLES_NOT_FOUND | 'cm handle id(s) not found'
+            'Cm Handle does not exist' | 'cmHandleId'             | new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR)                        || CM_HANDLES_NOT_FOUND | 'cm handle reference(s) not found'
             'Unknown'                  | 'cmHandleId'             | new RuntimeException('Failed')                                                                      || UNKNOWN_ERROR        | 'Failed'
-            'Invalid cm handle id'     | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id'
+            'Invalid cm handle id'     | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm handle reference has an invalid character(s) in id'
     }
 
     def 'Multiple update operations in a single request'() {
@@ -193,7 +193,7 @@ class CmHandleRegistrationServicePropertyHandlerSpec extends Specification {
                 assert it.status == Status.FAILURE
                 assert it.cmHandle == cmHandleId
                 assert it.ncmpResponseStatus == CM_HANDLES_NOT_FOUND
-                assert it.errorText == 'cm handle id(s) not found'
+                assert it.errorText == 'cm handle reference(s) not found'
             }
         then: 'the replace list method is called twice'
             2 * mockInventoryPersistence.replaceListContent(cmHandleXpath, _)
index 70e26d9..a69721b 100644 (file)
@@ -399,10 +399,10 @@ class CmHandleRegistrationServiceSpec extends Specification {
         and: 'the cm handle state is not updated to "DELETED"'
             0 * mockLcmEventsCmHandleStateHandler.updateCmHandleStateBatch(_, CmHandleState.DELETED)
         where:
-        scenario                     | cmHandleId             | deleteListElementException                || expectedError        | expectedErrorText
-        'cm-handle does not exist'   | 'cmhandle'             | new DataNodeNotFoundException('', '', '') || CM_HANDLES_NOT_FOUND | 'cm handle id(s) not found'
-        'cm-handle has invalid name' | 'cm handle with space' | new DataValidationException('', '')       || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id'
-        'an unexpected exception'    | 'cmhandle'             | new RuntimeException('Failed')            || UNKNOWN_ERROR        | 'Failed'
+        scenario                     | deleteListElementException                || expectedError        | expectedErrorText
+        'cm-handle does not exist'   | new DataNodeNotFoundException('', '', '') || CM_HANDLES_NOT_FOUND | 'cm handle reference(s) not found'
+        'cm-handle has invalid name' | new DataValidationException('', '')       || CM_HANDLE_INVALID_ID | 'cm handle reference has an invalid character(s) in id'
+        'an unexpected exception'    | new RuntimeException('Failed')            || UNKNOWN_ERROR        | 'Failed'
     }
 
     def 'Set Cm Handle Data Sync Enabled Flag where data sync flag is  #scenario'() {
index 00f092f..ce4a449 100644 (file)
@@ -28,11 +28,11 @@ import org.onap.cps.api.CpsDataService
 import org.onap.cps.api.CpsModuleService
 import org.onap.cps.impl.utils.CpsValidator
 import org.onap.cps.ncmp.api.inventory.models.CompositeState
+import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException
 import org.onap.cps.ncmp.impl.inventory.models.CmHandleState
 import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle
 import org.onap.cps.spi.CascadeDeleteAllowed
 import org.onap.cps.spi.FetchDescendantsOption
-import org.onap.cps.spi.exceptions.DataNodeNotFoundException
 import org.onap.cps.spi.model.DataNode
 import org.onap.cps.spi.model.ModuleDefinition
 import org.onap.cps.spi.model.ModuleReference
@@ -327,8 +327,9 @@ class InventoryPersistenceImplSpec extends Specification {
         when: 'getting the cm handle data node'
             objectUnderTest.getCmHandleDataNodeByAlternateId('alternate id')
         then: 'no data found exception thrown'
-            def thrownException = thrown(DataNodeNotFoundException)
-            assert thrownException.getMessage().contains('DataNode not found')
+            def thrownException = thrown(CmHandleNotFoundException)
+            assert thrownException.getMessage().contains('Cm handle not found')
+            assert thrownException.getDetails().contains('No cm handles found with reference alternate id')
     }
 
     def 'Get multiple cm handle data nodes by alternate ids, passing empty collection'() {
index 611d47d..827250f 100644 (file)
@@ -1 +1 @@
-[{"operationId":"operational-14","ids":["unknown-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"100","statusMessage":"cm handle id(s) not found"},{"operationId":"operational-14","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"},{"operationId":"running-12","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"}]
\ No newline at end of file
+[{"operationId":"operational-14","ids":["unknown-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"100","statusMessage":"cm handle reference(s) not found"},{"operationId":"operational-14","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"},{"operationId":"running-12","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"}]
\ No newline at end of file
index d358719..ab83ed2 100644 (file)
@@ -97,7 +97,7 @@ paths:
           example: my-dmi-plugin
           type: string
       - description: Boolean parameter to determine if returned value(s) will be cm
-          handle Ids or alternate Ids for a given query
+          handle ids or alternate ids for a given query
         in: query
         name: outputAlternateId
         required: false
@@ -145,7 +145,7 @@ paths:
       operationId: searchCmHandleIds
       parameters:
       - description: Boolean parameter to determine if returned value(s) will be cm
-          handle Ids or alternate Ids for a given query
+          handle ids or alternate ids for a given query
         in: query
         name: outputAlternateId
         required: false
@@ -202,7 +202,7 @@ components:
         type: string
     outputAlternateIdOptionInQuery:
       description: Boolean parameter to determine if returned value(s) will be cm
-        handle Ids or alternate Ids for a given query
+        handle ids or alternate ids for a given query
       in: query
       name: outputAlternateId
       required: false
index aa84e43..e7256c0 100644 (file)
@@ -1130,10 +1130,10 @@ paths:
   /v1/ch/id-searches:
     post:
       description: Execute cm handle query search and return a list of cm handle references.
-        Any number of conditions can be applied. To be included in the result a cm-handle
-        must fulfill ALL the conditions. An empty collection will be returned in the
-        case that the cm handle does not match a condition. For more on cm handle
-        query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm
+        Any number of conditions can be applied. To be included in the result a cm
+        handle must fulfill ALL the conditions. An empty collection will be returned
+        in the case that the cm handle does not match a condition. For more on cm
+        handle query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm
         handle query search Read the Docs</a>.<br/>By supplying a CPS Path it is possible
         to query on any data related to the cm handle. For more on CPS Path please
         refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html">CPS
@@ -1142,7 +1142,7 @@ paths:
       operationId: searchCmHandleIds
       parameters:
       - description: Boolean parameter to determine if returned value(s) will be cm
-          handle Ids or alternate Ids for a given query
+          handle ids or alternate ids for a given query
         in: query
         name: outputAlternateId
         required: false
@@ -1619,7 +1619,7 @@ components:
         type: string
     outputAlternateIdOptionInQuery:
       description: Boolean parameter to determine if returned value(s) will be cm
-        handle Ids or alternate Ids for a given query
+        handle ids or alternate ids for a given query
       in: query
       name: outputAlternateId
       required: false