Get data job result from DMI 82/138582/13
authorleventecsanyi <levente.csanyi@est.tech>
Fri, 26 Jul 2024 09:24:13 +0000 (11:24 +0200)
committerleventecsanyi <levente.csanyi@est.tech>
Fri, 16 Aug 2024 11:46:20 +0000 (13:46 +0200)
- added DataJobResult interface
- extended the DmiRestClient to retrieve status
- added mock response to DmiDispatcher

Issue-ID: CPS-2296
Change-Id: I551afd827cccd91c5f9837bd4923b30320865d55
Signed-off-by: leventecsanyi <levente.csanyi@est.tech>
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/datajobs/DataJobResultService.java [new file with mode: 0644]
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImpl.java [new file with mode: 0644]
cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/dmi/DmiRestClient.java
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImplSpec.groovy [new file with mode: 0644]
cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/dmi/DmiRestClientSpec.groovy
integration-test/src/test/groovy/org/onap/cps/integration/base/DmiDispatcher.groovy
integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/DataJobResultServiceSpec.groovy [new file with mode: 0644]

diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/datajobs/DataJobResultService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/datajobs/DataJobResultService.java
new file mode 100644 (file)
index 0000000..c6b7a8b
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *  ============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.datajobs;
+
+/**
+ * Service interface to retrieve the result of a data job.
+ * The operations interact with a DMI Plugin to retrieve data job results.
+ */
+public interface DataJobResultService {
+
+    /**
+     * Retrieves the result of a specific data job.
+     *
+     * @param authorization     The authorization header from the REST request.
+     * @param dmiServiceName    The name of the DMI Service relevant to the data job.
+     * @param dataProducerId    The ID of the producer registered by DMI, used for operations related to this request.
+     *                          This could include alternate IDs or specific identifiers.
+     * @param dataProducerJobId The identifier of the data producer job within the DMI system.
+     * @param destination       The destination of the results: Kafka topic name or S3 bucket name.
+     * @return The result of the data job.
+     */
+    String getDataJobResult(final String authorization,
+                            final String dmiServiceName,
+                            final String dataProducerId,
+                            final String dataProducerJobId,
+                            final String destination);
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImpl.java
new file mode 100644 (file)
index 0000000..031cedc
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *  ============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.impl.datajobs;
+
+import lombok.RequiredArgsConstructor;
+import org.onap.cps.ncmp.api.datajobs.DataJobResultService;
+import org.onap.cps.ncmp.impl.dmi.DmiProperties;
+import org.onap.cps.ncmp.impl.dmi.DmiRestClient;
+import org.onap.cps.ncmp.impl.dmi.DmiServiceUrlTemplateBuilder;
+import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class DataJobResultServiceImpl implements DataJobResultService {
+
+    private final DmiRestClient dmiRestClient;
+    private final DmiProperties dmiProperties;
+
+    @Override
+    public String getDataJobResult(final String authorization,
+                                   final String dmiServiceName,
+                                   final String dataProducerId,
+                                   final String dataProducerJobId,
+                                   final String destination) {
+        final UrlTemplateParameters urlTemplateParameters = DmiServiceUrlTemplateBuilder.newInstance()
+                                           .fixedPathSegment("cmwriteJob")
+                                           .fixedPathSegment("dataProducer")
+                                           .variablePathSegment("dataProducerId", dataProducerId)
+                                           .fixedPathSegment("dataProducerJob")
+                                           .variablePathSegment("dataProducerJobId", dataProducerJobId)
+                                           .fixedPathSegment("result")
+                                           .queryParameter("destination", destination)
+                                           .createUrlTemplateParameters(dmiServiceName, dmiProperties.getDmiBasePath());
+        return dmiRestClient.getDataJobResult(urlTemplateParameters, authorization).block();
+    }
+}
index 177b4b0..c101320 100644 (file)
@@ -164,6 +164,24 @@ public class DmiRestClient {
                 .onErrorMap(throwable -> handleDmiClientException(throwable, OperationType.READ.getOperationName()));
     }
 
+    /**
+     * Retrieves the result of a data job from the DMI service.
+     *
+     * @param urlTemplateParameters   The URL template parameters for the DMI data job status endpoint.
+     * @param authorization           The authorization token to be added to the request headers.
+     * @return A Mono emitting the result of the data job as a String.
+     * @throws DmiClientRequestException If there is an error during the DMI request.
+     */
+    public Mono<String> getDataJobResult(final UrlTemplateParameters urlTemplateParameters,
+                                         final String authorization) {
+        return dataServicesWebClient.get()
+                                        .uri(urlTemplateParameters.urlTemplate(), urlTemplateParameters.urlVariables())
+                                        .headers(httpHeaders -> configureHttpHeaders(httpHeaders, authorization))
+                                        .retrieve().bodyToMono(String.class)
+                                        .onErrorMap(throwable -> handleDmiClientException(throwable,
+                                                                 OperationType.READ.getOperationName()));
+    }
+
     private WebClient getWebClient(final RequiredDmiService requiredDmiService) {
         return requiredDmiService.equals(RequiredDmiService.DATA) ? dataServicesWebClient : modelServicesWebClient;
     }
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/datajobs/DataJobResultServiceImplSpec.groovy
new file mode 100644 (file)
index 0000000..3af4740
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *  ============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.impl.datajobs
+
+import org.onap.cps.ncmp.impl.dmi.DmiProperties
+import org.onap.cps.ncmp.impl.dmi.DmiRestClient
+import org.onap.cps.ncmp.impl.dmi.UrlTemplateParameters
+import reactor.core.publisher.Mono
+import spock.lang.Specification
+
+class DataJobResultServiceImplSpec extends Specification {
+
+    def mockDmiRestClient = Mock(DmiRestClient)
+    def mockDmiProperties = Mock(DmiProperties)
+    def objectUnderTest = new DataJobResultServiceImpl(mockDmiRestClient, mockDmiProperties)
+
+    def setup() {
+        mockDmiProperties.dmiBasePath >> 'dmi'
+    }
+
+    def 'Retrieve data job result.'() {
+        given: 'the required parameters for querying'
+            def dmiServiceName = 'some-dmi-service'
+            def dataProducerJobId = 'some-data-producer-job-id'
+            def dataProducerId = 'some-data-producer-id'
+            def authorization = 'my authorization header'
+            def destination = 'some-destination'
+            def urlParams = new UrlTemplateParameters('some-dmi-service/dmi/v1/cmwriteJob/dataProducer/{dataProducerId}/dataProducerJob/{dataProducerJobId}/result?destination={destination}', ['dataProducerJobId':'some-data-producer-job-id', 'dataProducerId':'some-data-producer-id', 'destination': 'some-destination'])
+        and: 'the rest client returns the result for the given parameters'
+            mockDmiRestClient.getDataJobResult(urlParams, authorization) >> Mono.just('some result')
+        when: 'the job status is queried'
+            def result = objectUnderTest.getDataJobResult(authorization, dmiServiceName,dataProducerId,  dataProducerJobId, destination)
+        then: 'the result from the rest client is returned'
+            assert result != null
+            assert  result == 'some result'
+    }
+}
index 3444d7b..d92e69a 100644 (file)
@@ -175,4 +175,16 @@ class DmiRestClientSpec extends Specification {
         then: 'the response equals to the expected value'
             assert response == 'some status'
     }
+
+    def 'Get data job result from DMI.'() {
+        given: 'the Data web client returns a valid response entity for the expected parameters'
+            mockDataServicesWebClient.get() >> mockRequestBody
+            def result = 'some result'
+            mockResponse.bodyToMono(String.class) >> Mono.just(result)
+        when: 'GET operation is invoked for Data Service'
+            def response = objectUnderTest.getDataJobResult(urlTemplateParameters, NO_AUTH_HEADER).block()
+        then: 'the response has some value'
+            assert response != null
+            assert  result == 'some result'
+    }
 }
index 56d8f19..fcc23db 100644 (file)
@@ -20,8 +20,6 @@
 
 package org.onap.cps.integration.base
 
-import org.onap.cps.ncmp.api.datajobs.models.SubJobWriteRequest
-
 import static org.onap.cps.integration.base.CpsIntegrationSpecBase.readResourceDataFile
 
 import groovy.json.JsonSlurper
@@ -29,6 +27,7 @@ import java.util.regex.Matcher
 import okhttp3.mockwebserver.Dispatcher
 import okhttp3.mockwebserver.MockResponse
 import okhttp3.mockwebserver.RecordedRequest
+import org.onap.cps.ncmp.api.datajobs.models.SubJobWriteRequest
 import org.springframework.http.HttpHeaders
 import org.springframework.http.HttpStatus
 import org.springframework.http.MediaType
@@ -97,6 +96,10 @@ class DmiDispatcher extends Dispatcher {
             case ~'^/dmi/v1/cmwriteJob/dataProducer/(.*)/dataProducerJob/(.*)/status$':
                 return mockResponseWithBody(HttpStatus.OK, '{"status":"status details from mock service"}')
 
+            // get data job result
+            case ~'^/dmi/v1/cmwriteJob/dataProducer/(.*)/dataProducerJob/(.*)/result(.*)$':
+                return mockResponseWithBody(HttpStatus.OK, '{ "result": "some result"}')
+
             // get write sub job response
             case ~'^/dmi/v1/cmwriteJob(.*)$':
                 return mockWriteJobResponse(request)
diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/DataJobResultServiceSpec.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/functional/ncmp/DataJobResultServiceSpec.groovy
new file mode 100644 (file)
index 0000000..241d31a
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *  ============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.integration.functional.ncmp
+
+import org.onap.cps.integration.base.CpsIntegrationSpecBase
+import org.onap.cps.ncmp.api.datajobs.DataJobResultService
+import org.springframework.beans.factory.annotation.Autowired
+
+class DataJobResultServiceSpec extends CpsIntegrationSpecBase {
+
+    @Autowired
+    DataJobResultService dataJobResultService;
+
+    def 'Get the status of a data job from DMI.'() {
+        given: 'the required data about the data job'
+            def authorization = 'my authorization header'
+            def dmiServiceName = DMI1_URL
+            def dataProducerId = 'some-data-producer-id'
+            def dataProducerJobId = 'some-data-producer-job-id'
+            def destination = 'some-destination'
+        when: 'the data job status checked'
+            def result = dataJobResultService.getDataJobResult(authorization, dmiServiceName, dataProducerId, dataProducerJobId, destination)
+        then: 'the status is that defined in the mock service.'
+            assert result != null
+            assert result == '{ "result": "some result"}'
+    }
+}