Create list-node elements (part3): NCMP REST and service layers 53/121153/2
authorRuslan Kashapov <ruslan.kashapov@pantheon.tech>
Fri, 7 May 2021 07:46:27 +0000 (10:46 +0300)
committerRuslan Kashapov <ruslan.kashapov@pantheon.tech>
Tue, 11 May 2021 07:23:56 +0000 (10:23 +0300)
Issue-ID: CPS-360
Change-Id: Id8be89f19750d72bae334491aea4a59f21c7ecd6
Signed-off-by: Ruslan Kashapov <ruslan.kashapov@pantheon.tech>
cps-ncmp-rest/docs/openapi/components.yaml
cps-ncmp-rest/docs/openapi/ncmproxy.yml
cps-ncmp-rest/docs/openapi/openapi.yml
cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java
cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.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/test/groovy/org/onap/cps/api/impl/NetworkCmProxyDataServiceImplSpec.groovy

index 69c37ad..5ff3099 100644 (file)
@@ -1,5 +1,6 @@
 #  ============LICENSE_START=======================================================
 #  Modification (C) 2021 Nordix Foundation
+#  Modifications Copyright (C) 2021 Pantheon.tech
 #  ================================================================================
 #  Licensed under the Apache License, Version 2.0 (the "License");
 #  you may not use this file except in compliance with the License.
@@ -52,6 +53,13 @@ components:
       schema:
         type: string
         default: /
+    requiredXpathInQuery:
+      name: xpath
+      in: query
+      description: xpath
+      required: true
+      schema:
+        type: string
     includeDescendantsOptionInQuery:
       name: include-descendants
       in: query
index d5358cc..00e0cc7 100755 (executable)
@@ -141,5 +141,33 @@ nodesByCmHandleAndXpath:
         $ref: 'components.yaml#/components/responses/Unauthorized'
       403:
         $ref: 'components.yaml#/components/responses/Forbidden'
+      404:
+        $ref: 'components.yaml#/components/responses/NotFound'
+
+listNodeByCmHandleAndXpath:
+  post:
+    description: Add one or more list-node child elements under existing node for the given CM Handle
+    tags:
+      - network-cm-proxy
+    summary: Add list-node child element(s)
+    operationId: addListNodeElements
+    parameters:
+      - $ref: 'components.yaml#/components/parameters/cmHandleInPath'
+      - $ref: 'components.yaml#/components/parameters/requiredXpathInQuery'
+    requestBody:
+      required: true
+      content:
+        application/json:
+          schema:
+            type: string
+    responses:
+      201:
+        $ref: 'components.yaml#/components/responses/Created'
+      400:
+        $ref: 'components.yaml#/components/responses/BadRequest'
+      401:
+        $ref: 'components.yaml#/components/responses/Unauthorized'
+      403:
+        $ref: 'components.yaml#/components/responses/Forbidden'
       404:
         $ref: 'components.yaml#/components/responses/NotFound'
\ No newline at end of file
index 7575022..862837e 100755 (executable)
@@ -1,5 +1,6 @@
 #  ============LICENSE_START=======================================================
 #  Modification (C) 2021 Nordix Foundation
+#  Modifications Copyright (C) 2021 Pantheon.tech
 #  ================================================================================
 #  Licensed under the Apache License, Version 2.0 (the "License");
 #  you may not use this file except in compliance with the License.
@@ -26,6 +27,9 @@ paths:
   /v1/cm-handles/{cm-handle}/node:
     $ref: 'ncmproxy.yml#/nodeByCmHandleAndXpath'
 
+  /v1/cm-handles/{cm-handle}/list-node:
+    $ref: 'ncmproxy.yml#/listNodeByCmHandleAndXpath'
+
   /v1/cm-handles/{cm-handle}/nodes/query:
     $ref: 'ncmproxy.yml#/nodesByCmHandleAndCpsPath'
 
index 3c8a04e..484a21a 100755 (executable)
@@ -53,6 +53,13 @@ public class NetworkCmProxyController implements NetworkCmProxyApi {
         return new ResponseEntity<>(HttpStatus.CREATED);
     }
 
+    @Override
+    public ResponseEntity<String> addListNodeElements(final String jsonData, final String parentNodeXpath,
+        final String cmHandle) {
+        networkCmProxyDataService.addListNodeElements(cmHandle, parentNodeXpath, jsonData);
+        return new ResponseEntity<>(HttpStatus.CREATED);
+    }
+
     @Override
     public ResponseEntity<Object> getNodeByCmHandleAndXpath(final String cmHandle, @Valid final String xpath,
         @Valid final Boolean includeDescendants) {
index ea3c16d..45e8f11 100644 (file)
@@ -105,6 +105,23 @@ class NetworkCmProxyControllerSpec extends Specification {
             'parent node xpath'  | '/xpath' || '/xpath'
     }
 
+    def 'Add list-node elements.'() {
+        given: 'json data and parent node xpath'
+            def jsonData = 'json data'
+            def parentNodeXpath = 'parent node xpath'
+        when: 'post request is performed'
+            def response = mvc.perform(
+                    post("$dataNodeBaseEndpoint/cm-handles/$cmHandle/list-node")
+                            .contentType(MediaType.APPLICATION_JSON)
+                            .content(jsonData)
+                            .param('xpath', parentNodeXpath)
+            ).andReturn().response
+        then: 'the service method is invoked once with expected parameters'
+            1 * mockNetworkCmProxyDataService.addListNodeElements(cmHandle, parentNodeXpath, jsonData)
+        and: 'response status indicates success'
+            response.status == HttpStatus.CREATED.value()
+    }
+
     def 'Update data node leaves.'() {
         given: 'json data'
             def jsonData = 'json data'
index 8176ea5..ccc4e44 100644 (file)
@@ -67,6 +67,16 @@ public interface NetworkCmProxyDataService {
      */
     void createDataNode(@NonNull String cmHandle, @NonNull String parentNodeXpath, @NonNull String jsonData);
 
+    /**
+     * Creates one or more child node elements with descendants under existing node from list-node data fragment.
+     *
+     * @param cmHandle        The identifier for a network function, network element, subnetwork or any other cm
+     *                        object managed by Network CM Proxy
+     * @param parentNodeXpath xpath to parent node
+     * @param jsonData        data as JSON string
+     */
+    void addListNodeElements(@NonNull String cmHandle, @NonNull String parentNodeXpath, @NonNull String jsonData);
+
     /**
      * Updates data node for given cm handle using xpath to parent node.
      *
index 56f4cf8..bdb71bf 100755 (executable)
@@ -67,6 +67,11 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService
         }
     }
 
+    @Override
+    public void addListNodeElements(final String cmHandle, final String parentNodeXpath, final String jsonData) {
+        cpsDataService.saveListNodeData(getDataspaceName(), cmHandle, parentNodeXpath, jsonData);
+    }
+
     @Override
     public void updateNodeLeaves(final String cmHandle, final String parentNodeXpath, final String jsonData) {
         cpsDataService.updateNodeLeaves(getDataspaceName(), cmHandle, parentNodeXpath, jsonData);
index 0a00e34..e67d4ad 100644 (file)
@@ -73,6 +73,16 @@ class NetworkCmProxyDataServiceImplSpec extends Specification {
             1 * mockcpsDataService.saveData(expectedDataspaceName, cmHandle, xpath, jsonData)
     }
 
+    def 'Add list-node elements.'() {
+        given: 'a cm handle and parent node xpath'
+            def jsonData = 'some json'
+            def xpath = '/test-node'
+        when: 'addListNodeElements is invoked'
+            objectUnderTest.addListNodeElements(cmHandle, xpath, jsonData)
+        then: 'the CPS service method is invoked once with the expected parameters'
+            1 * mockcpsDataService.saveListNodeData(expectedDataspaceName, cmHandle, xpath, jsonData)
+    }
+
     def 'Update data node leaves.'() {
         given: 'a cm Handle and a cps path'
             def xpath = '/xpath'