Add bearer token to NCMP async batch data passthrough (CPS-2126 #4) 48/137448/1
authordanielhanrahan <daniel.hanrahan@est.tech>
Thu, 29 Feb 2024 15:52:46 +0000 (15:52 +0000)
committerdanielhanrahan <daniel.hanrahan@est.tech>
Thu, 29 Feb 2024 15:52:46 +0000 (15:52 +0000)
Async processing was not passing bearer token.

Issue-ID: CPS-2128
Signed-off-by: danielhanrahan <daniel.hanrahan@est.tech>
Change-Id: I75da35cce555c49cca638b68f106a9daba79c24a

cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/handlers/NcmpPassthroughResourceRequestHandler.java
cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/handlers/NcmpDatastoreRequestHandlerSpec.groovy
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiDataOperations.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operations/DmiDataOperationsSpec.groovy

index 1c6aaf2..b567ba2 100755 (executable)
@@ -116,7 +116,7 @@ public class NetworkCmProxyController implements NetworkCmProxyApi {
                                                                    final DataOperationRequest dataOperationRequest,
                                                                    final String authorization) {
         return ncmpPassthroughResourceRequestHandler.executeRequest(topicParamInQuery,
-                dataOperationRequestMapper.toDataOperationRequest(dataOperationRequest));
+                dataOperationRequestMapper.toDataOperationRequest(dataOperationRequest), authorization);
     }
 
     /**
index 5da8c91..430b749 100644 (file)
@@ -61,17 +61,19 @@ public class NcmpPassthroughResourceRequestHandler extends NcmpDatastoreRequestH
      *
      * @param topicParamInQuery        the topic param in query
      * @param dataOperationRequest     data operation request details for resource data
+     * @param authorization            contents of Authorization header, or null if not present
      * @return the response entity
      */
     public ResponseEntity<Object> executeRequest(final String topicParamInQuery,
-                                                 final DataOperationRequest
-                                                     dataOperationRequest) {
+                                                 final DataOperationRequest dataOperationRequest,
+                                                 final String authorization) {
         validateDataOperationRequest(topicParamInQuery, dataOperationRequest);
         if (!notificationFeatureEnabled) {
             return ResponseEntity.ok(Map.of("status",
                 "Asynchronous request is unavailable as notification feature is currently disabled."));
         }
-        return getRequestIdAndSendDataOperationRequestToDmiService(topicParamInQuery, dataOperationRequest);
+        return getRequestIdAndSendDataOperationRequestToDmiService(topicParamInQuery, dataOperationRequest,
+                authorization);
     }
 
     @Override
@@ -89,12 +91,13 @@ public class NcmpPassthroughResourceRequestHandler extends NcmpDatastoreRequestH
             authorization);
     }
 
-    private ResponseEntity<Object> getRequestIdAndSendDataOperationRequestToDmiService(final String topicParamInQuery,
-                                                                                       final DataOperationRequest
-                                                                                           dataOperationRequest) {
+    private ResponseEntity<Object> getRequestIdAndSendDataOperationRequestToDmiService(
+            final String topicParamInQuery,
+            final DataOperationRequest dataOperationRequest,
+            final String authorization) {
         final String requestId = UUID.randomUUID().toString();
         cpsNcmpTaskExecutor.executeTask(
-            getTaskSupplierForDataOperationRequest(topicParamInQuery, dataOperationRequest, requestId),
+            getTaskSupplierForDataOperationRequest(topicParamInQuery, dataOperationRequest, requestId, authorization),
             timeOutInMilliSeconds);
         return ResponseEntity.ok(Map.of("requestId", requestId));
     }
@@ -116,11 +119,13 @@ public class NcmpPassthroughResourceRequestHandler extends NcmpDatastoreRequestH
 
     private Supplier<Object> getTaskSupplierForDataOperationRequest(final String topicParamInQuery,
                                                                     final DataOperationRequest dataOperationRequest,
-                                                                    final String requestId) {
+                                                                    final String requestId,
+                                                                    final String authorization) {
         return () -> {
             networkCmProxyDataService.executeDataOperationForCmHandles(topicParamInQuery,
                 dataOperationRequest,
-                requestId);
+                requestId,
+                authorization);
             return noReturn;
         };
     }
index 328a85e..ddeac51 100644 (file)
@@ -74,7 +74,7 @@ class NcmpDatastoreRequestHandlerSpec extends Specification {
         and: 'notification feature is turned on/off'
             objectUnderTest.notificationFeatureEnabled = notificationFeatureEnabled
         when: 'data operation request is executed'
-            objectUnderTest.executeRequest('someTopic', new DataOperationRequest())
+            objectUnderTest.executeRequest('someTopic', new DataOperationRequest(), NO_AUTH_HEADER)
         then: 'the task is executed in an async fashion or not'
             expectedCalls * spiedCpsNcmpTaskExecutor.executeTask(*_)
         where: 'the following parameters are used'
@@ -92,11 +92,11 @@ class NcmpDatastoreRequestHandlerSpec extends Specification {
         and: ' a flag to track the network service call'
             def networkServiceMethodCalled = false
         and: 'the (mocked) service will use the flag to indicate it is called'
-            mockNetworkCmProxyDataService.executeDataOperationForCmHandles('myTopic', dataOperationRequest, _) >> {
+            mockNetworkCmProxyDataService.executeDataOperationForCmHandles('myTopic', dataOperationRequest, _, NO_AUTH_HEADER) >> {
                 networkServiceMethodCalled = true
             }
         when: 'data operation request is executed'
-            objectUnderTest.executeRequest('myTopic', dataOperationRequest)
+            objectUnderTest.executeRequest('myTopic', dataOperationRequest, NO_AUTH_HEADER)
         then: 'the task is executed in an async fashion'
             1 * spiedCpsNcmpTaskExecutor.executeTask(*_)
         and: 'the network service is invoked'
@@ -114,7 +114,7 @@ class NcmpDatastoreRequestHandlerSpec extends Specification {
             def dataOperationDefinition = new DataOperationDefinition(operation: 'read', datastore: datastore)
         when: 'data operation request is executed'
             def dataOperationRequest = new DataOperationRequest(dataOperationDefinitions: [dataOperationDefinition])
-            objectUnderTest.executeRequest('myTopic', dataOperationRequest)
+            objectUnderTest.executeRequest('myTopic', dataOperationRequest, NO_AUTH_HEADER)
         then: 'the correct error is thrown'
             def thrown = thrown(InvalidDatastoreException)
             assert thrown.message.contains(expectedErrorMessage)
@@ -130,7 +130,7 @@ class NcmpDatastoreRequestHandlerSpec extends Specification {
         and: 'a data operation definition with operation: #operation'
             def dataOperationDefinition = new DataOperationDefinition(operation: operation, datastore: 'ncmp-datastore:passthrough-running')
         when: 'bulk request is executed'
-            objectUnderTest.executeRequest('someTopic', new DataOperationRequest(dataOperationDefinitions:[dataOperationDefinition]))
+            objectUnderTest.executeRequest('someTopic', new DataOperationRequest(dataOperationDefinitions:[dataOperationDefinition]), NO_AUTH_HEADER)
         then: 'the expected type of exception is thrown'
             thrown(expectedException)
         where: 'the following operations are used'
index dbfeca1..4230140 100644 (file)
@@ -89,10 +89,13 @@ public interface NetworkCmProxyDataService {
      *
      * @param topicParamInQuery        topic name for (triggering) async responses
      * @param dataOperationRequest     contains a list of operation definitions(multiple operations)
+     * @param requestId                request ID
+     * @param authorization            contents of Authorization header, or null if not present
      */
     void executeDataOperationForCmHandles(String topicParamInQuery,
                                           DataOperationRequest dataOperationRequest,
-                                          String requestId);
+                                          String requestId,
+                                          String authorization);
 
 
     /**
index 3e304a4..8c02106 100755 (executable)
@@ -154,10 +154,11 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
 
     @Override
     public void executeDataOperationForCmHandles(final String topicParamInQuery,
-                                                 final DataOperationRequest
-                                                     dataOperationRequest,
-                                                 final String requestId) {
-        dmiDataOperations.requestResourceDataFromDmi(topicParamInQuery, dataOperationRequest, requestId);
+                                                 final DataOperationRequest dataOperationRequest,
+                                                 final String requestId,
+                                                 final String authorization) {
+        dmiDataOperations.requestResourceDataFromDmi(topicParamInQuery, dataOperationRequest, requestId,
+                authorization);
     }
 
     @Override
index 05b6ec3..a77e78a 100644 (file)
@@ -132,10 +132,12 @@ public class DmiDataOperations extends DmiOperations {
      * @param topicParamInQuery        topic name for (triggering) async responses
      * @param dataOperationRequest     data operation request to execute operations
      * @param requestId                requestId for as a response
+     * @param authorization            contents of Authorization header, or null if not present
      */
     public void requestResourceDataFromDmi(final String topicParamInQuery,
                                            final DataOperationRequest dataOperationRequest,
-                                           final String requestId)  {
+                                           final String requestId,
+                                           final String authorization)  {
 
         final Set<String> cmHandlesIds
                 = getDistinctCmHandleIdsFromDataOperationRequest(dataOperationRequest);
@@ -147,7 +149,8 @@ public class DmiDataOperations extends DmiOperations {
                 = ResourceDataOperationRequestUtils.processPerDefinitionInDataOperationsRequest(topicParamInQuery,
                 requestId, dataOperationRequest, yangModelCmHandles);
 
-        buildDataOperationRequestUrlAndSendToDmiService(topicParamInQuery, requestId, operationsOutPerDmiServiceName);
+        buildDataOperationRequestUrlAndSendToDmiService(topicParamInQuery, requestId, operationsOutPerDmiServiceName,
+                authorization);
     }
 
     /**
@@ -238,23 +241,26 @@ public class DmiDataOperations extends DmiOperations {
     private void buildDataOperationRequestUrlAndSendToDmiService(final String topicParamInQuery,
                                                                  final String requestId,
                                                                  final Map<String, List<DmiDataOperation>>
-                                                                groupsOutPerDmiServiceName) {
+                                                                groupsOutPerDmiServiceName,
+                                                                 final String authorization) {
 
         groupsOutPerDmiServiceName.forEach((dmiServiceName, dmiDataOperationRequestBodies) -> {
             final String dmiDataOperationResourceUrl =
                     getDmiServiceDataOperationRequestUrl(dmiServiceName, topicParamInQuery, requestId);
-            sendDataOperationRequestToDmiService(dmiDataOperationResourceUrl, dmiDataOperationRequestBodies);
+            sendDataOperationRequestToDmiService(dmiDataOperationResourceUrl, dmiDataOperationRequestBodies,
+                    authorization);
         });
     }
 
     private void sendDataOperationRequestToDmiService(final String dataOperationResourceUrl,
-                                                      final List<DmiDataOperation> dmiDataOperationRequestBodies) {
+                                                      final List<DmiDataOperation> dmiDataOperationRequestBodies,
+                                                      final String authorization) {
         final DmiDataOperationRequest dmiDataOperationRequest = DmiDataOperationRequest.builder()
                 .operations(dmiDataOperationRequestBodies).build();
         final String dmiDataOperationRequestAsJsonString =
                 jsonObjectMapper.asJsonString(dmiDataOperationRequest);
         TaskExecutor.executeTask(() -> dmiRestClient.postOperationWithJsonData(dataOperationResourceUrl,
-                                dmiDataOperationRequestAsJsonString, READ, null),
+                                dmiDataOperationRequestAsJsonString, READ, authorization),
                         DEFAULT_ASYNC_TASK_EXECUTOR_TIMEOUT_IN_MILLISECONDS)
                 .whenCompleteAsync((response, throwable) -> handleTaskCompletionException(throwable,
                         dataOperationResourceUrl, dmiDataOperationRequestBodies));
index 71380d4..5e837ac 100644 (file)
@@ -158,9 +158,9 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
         given: 'cpsDataService returns valid data node'
             def dataOperationRequest = getDataOperationRequest(datastoreName)
         when: 'request resource data for data operation is called'
-            objectUnderTest.executeDataOperationForCmHandles('some topic', dataOperationRequest, 'requestId')
+            objectUnderTest.executeDataOperationForCmHandles('some topic', dataOperationRequest, 'requestId', NO_AUTH_HEADER)
         then: 'request resource data for data operation returns expected response'
-            1 * mockDmiDataOperations.requestResourceDataFromDmi('some topic', dataOperationRequest, 'requestId')
+            1 * mockDmiDataOperations.requestResourceDataFromDmi('some topic', dataOperationRequest, 'requestId', NO_AUTH_HEADER)
         where: 'the following data stores are used'
             datastoreName << [PASSTHROUGH_RUNNING.datastoreName, PASSTHROUGH_OPERATIONAL.datastoreName]
     }
index 26d44f2..7d8ac74 100644 (file)
@@ -114,7 +114,7 @@ class DmiDataOperationsSpec extends DmiOperationsBaseSpec {
                 postOperationWithJsonDataMethodCalled = true
             }
         when: 'get resource data for group of cm handles are invoked'
-            objectUnderTest.requestResourceDataFromDmi('my-topic-name', dataOperationRequest, 'requestId')
+            objectUnderTest.requestResourceDataFromDmi('my-topic-name', dataOperationRequest, 'requestId', NO_AUTH_HEADER)
         then: 'validate the post operation was called and ncmp generated dmi request body json args'
             new PollingConditions().within(1) {
                 assert postOperationWithJsonDataMethodCalled == true