impl patch operation in dmi 28/126528/5
authortragait <rahul.tyagi@est.tech>
Mon, 10 Jan 2022 12:16:25 +0000 (12:16 +0000)
committertragait <rahul.tyagi@est.tech>
Wed, 19 Jan 2022 13:48:30 +0000 (13:48 +0000)
Change-Id: Ie87216fa6cb120bea685286b7f0dacd8e22f603b
Signed-off-by: tragait <rahul.tyagi@est.tech>
Issue-ID: CPS-641

openapi/components.yml
pom.xml
src/main/java/org/onap/cps/ncmp/dmi/config/DmiConfiguration.java
src/main/java/org/onap/cps/ncmp/dmi/rest/controller/DmiRestController.java
src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java
src/test/groovy/org/onap/cps/ncmp/dmi/config/DmiConfigurationSpec.groovy
src/test/groovy/org/onap/cps/ncmp/dmi/rest/controller/DmiRestControllerSpec.groovy
src/test/groovy/org/onap/cps/ncmp/dmi/service/operation/SdncOperationsSpec.groovy
src/test/resources/patchData.json [new file with mode: 0644]

index aa0827a..bf271bb 100644 (file)
@@ -87,7 +87,7 @@ components:
       properties:
         operation:
           type: string
-          enum: [ read, create, update, delete ]
+          enum: [ read, create, update, patch, delete ]
           example: read
         dataType:
           type: string
diff --git a/pom.xml b/pom.xml
index 0a42d24..cc11e34 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -45,6 +45,7 @@
         <jacoco.minimum.coverage>0.98</jacoco.minimum.coverage>
         <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <httpclient.version>4.4.1</httpclient.version>
     </properties>
     <dependencyManagement>
         <dependencies>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>${httpclient.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <resources>
index 9b8b05b..18b22db 100644 (file)
@@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.web.client.RestTemplateBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
 
@@ -34,6 +35,8 @@ import org.springframework.web.client.RestTemplate;
 @Configuration
 public class DmiConfiguration {
 
+    private static final int TIMEOUT = 5000;
+
     @Getter
     @Component
     public static class CpsProperties {
@@ -62,8 +65,23 @@ public class DmiConfiguration {
         public String topologyId;
     }
 
+    /**
+     * Returns restTemplate bean for the spring context.
+     *
+     * @param restTemplateBuilder   restTemplate builder
+     * @return {@code RestTemplate} rest template
+     */
     @Bean
     public RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) {
-        return restTemplateBuilder.build();
+        final RestTemplate restTemplate =  restTemplateBuilder.build();
+        setCustomRequestFactoryToSupportPatch(restTemplate);
+        return restTemplate;
+    }
+
+    private void setCustomRequestFactoryToSupportPatch(final RestTemplate restTemplate) {
+        final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
+        requestFactory.setConnectTimeout(TIMEOUT);
+        requestFactory.setReadTimeout(TIMEOUT);
+        restTemplate.setRequestFactory(requestFactory);
     }
 }
\ No newline at end of file
index 97848c3..077c4ab 100644 (file)
@@ -36,7 +36,6 @@ import org.onap.cps.ncmp.dmi.rest.api.DmiPluginInternalApi;
 import org.onap.cps.ncmp.dmi.service.DmiService;
 import org.onap.cps.ncmp.dmi.service.model.ModuleReference;
 import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -135,7 +134,7 @@ public class DmiRestController implements DmiPluginApi, DmiPluginInternalApi {
                 dataAccessRequest.getOperation(),
                 cmHandle,
                 resourceIdentifier,
-                MediaType.APPLICATION_JSON_VALUE,
+                dataAccessRequest.getDataType(),
                 dataAccessRequest.getData());
         }
         return new ResponseEntity<>(sdncResponse, getHttpStatus(dataAccessRequest));
@@ -157,6 +156,7 @@ public class DmiRestController implements DmiPluginApi, DmiPluginInternalApi {
                     break;
                 case READ:
                 case UPDATE:
+                case PATCH:
                     httpStatus = HttpStatus.OK;
                     break;
                 case DELETE:
index ced9b06..5903eac 100644 (file)
@@ -248,6 +248,9 @@ public class SdncOperations {
             case CREATE:
                 httpMethod = HttpMethod.POST;
                 break;
+            case PATCH:
+                httpMethod = HttpMethod.PATCH;
+                break;
             case UPDATE:
                 httpMethod = HttpMethod.PUT;
                 break;
index 1798c9f..9d80b71 100644 (file)
@@ -56,7 +56,7 @@ class DmiConfigurationSpec extends Specification {
         given: 'a DMI configuration'
             DmiConfiguration objectUnderTest = new DmiConfiguration()
         and: 'a rest template builder'
-            RestTemplateBuilder mockRestTemplateBuilder = Mock(RestTemplateBuilder)
+            RestTemplateBuilder mockRestTemplateBuilder = Spy(RestTemplateBuilder)
         when: 'rest template method is invoked'
             objectUnderTest.restTemplate(mockRestTemplateBuilder)
         then: 'DMI configuration uses the build method on the template builder'
index 221603c..ac632bb 100644 (file)
@@ -44,6 +44,7 @@ import org.springframework.test.web.servlet.MockMvc
 import spock.lang.Specification
 
 import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.DELETE
+import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.PATCH
 import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.READ
 import static org.springframework.http.HttpStatus.BAD_REQUEST
 import static org.springframework.http.HttpStatus.NO_CONTENT
@@ -211,14 +212,14 @@ class DmiRestControllerSpec extends Specification {
             0 * mockDmiService.getResourceData(*_)
     }
 
-    def 'write data with #scenario operation using passthrough running.'() {
+    def 'data with #scenario operation using passthrough running.'() {
         given: 'write data for passthrough running url and jsonData'
             def writeDataForPassthroughRunning = "${basePathV1}/ch/some-cmHandle/data/ds/ncmp-datastore:passthrough-running" +
                     "?resourceIdentifier=some-resourceIdentifier"
             def jsonData = TestUtils.getResourceFileContent(requestBodyFile)
         and: 'dmi service is called'
             mockDmiService.writeData(operationEnum, 'some-cmHandle',
-                    'some-resourceIdentifier', 'application/json',
+                    'some-resourceIdentifier', dataType,
                     'normal request body' ) >> '{some-json}'
         when: 'write data for passthrough running post api is invoked with json data'
             def response = mvc.perform(
@@ -230,11 +231,12 @@ class DmiRestControllerSpec extends Specification {
         and: 'the data in the request body is as expected'
             response.getContentAsString() == expectedJsonResponse
         where: 'given request body and data'
-            scenario   | requestBodyFile                 | operationEnum                                  || expectedResponseStatus | expectedJsonResponse
-            'Create'   | 'createDataWithNormalChar.json' | CREATE                                         || CREATED.value()        | '{some-json}'
-            'Update'   | 'updateData.json'               | UPDATE                                         || OK.value()             | '{some-json}'
-            'Delete'   | 'deleteData.json'               | DELETE                                         || NO_CONTENT.value()     | '{some-json}'
-            'Read'     | 'readData.json'                 | READ                                           || OK.value()             | ''
+            scenario   | requestBodyFile                 | operationEnum     | dataType                      || expectedResponseStatus | expectedJsonResponse
+            'Create'   | 'createDataWithNormalChar.json' | CREATE            | 'application/json'            || CREATED.value()        | '{some-json}'
+            'Update'   | 'updateData.json'               | UPDATE            | 'application/json'            || OK.value()             | '{some-json}'
+            'Delete'   | 'deleteData.json'               | DELETE            | 'application/json'            || NO_CONTENT.value()     | '{some-json}'
+            'Read'     | 'readData.json'                 | READ              | 'application/json'            || OK.value()             | ''
+            'Patch'    | 'patchData.json'                | PATCH             | 'application/yang.patch+json' || OK.value()             | '{some-json}'
     }
 
     def 'Create data using passthrough for special characters.'(){
index 5079ada..49cdc20 100644 (file)
@@ -37,6 +37,7 @@ import spock.lang.Specification
 
 import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.CREATE
 import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.DELETE
+import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.PATCH
 import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.UPDATE
 import static org.onap.cps.ncmp.dmi.model.DataAccessRequest.OperationEnum.READ
 
@@ -138,6 +139,7 @@ class SdncOperationsSpec extends Specification {
             'Update'  | UPDATE         || HttpMethod.PUT
             'Read'    | READ           || HttpMethod.GET
             'Delete'  | DELETE         || HttpMethod.DELETE
+            'Patch'   | PATCH          || HttpMethod.PATCH
     }
 
     def 'build query param list for SDNC where options contains a #scenario'() {
diff --git a/src/test/resources/patchData.json b/src/test/resources/patchData.json
new file mode 100644 (file)
index 0000000..e5466ea
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "operation": "patch",
+  "dataType": "application/yang.patch+json",
+  "data": "normal request body",
+  "cmHandleProperties": {
+    "some-property": "some-property-value"
+  }
+}
\ No newline at end of file