Delete list-node p2 rest layer

Issue-ID: CPS-361
Signed-off-by: lukegleeson <luke.gleeson@est.tech>
Change-Id: I5fb8d202fc0a65679d10377cc2959a7f8f854ca7
diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java
index bad66dd..5c79472 100755
--- a/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java
+++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/DataRestController.java
@@ -96,6 +96,13 @@
         return new ResponseEntity<>(HttpStatus.OK);
     }
 
+    @Override
+    public ResponseEntity<Void> deleteListNodeElements(final String dataspaceName, final String anchorName,
+                                                         final String listNodeXpath) {
+        cpsDataService.deleteListNodeData(dataspaceName, anchorName, listNodeXpath);
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
     private static boolean isRootXpath(final String xpath) {
         return ROOT_XPATH.equals(xpath);
     }
diff --git a/cps-rest/src/main/resources/static/cpsData.yml b/cps-rest/src/main/resources/static/cpsData.yml
index 7e9f71d..9c4f333 100644
--- a/cps-rest/src/main/resources/static/cpsData.yml
+++ b/cps-rest/src/main/resources/static/cpsData.yml
@@ -97,6 +97,26 @@
       '403':
         $ref: 'components.yml#/components/responses/Forbidden'
 
+  delete:
+    description: Delete list-node child elements under existing node for a given anchor and dataspace
+    tags:
+      - cps-data
+    summary: Delete list-node child element(s) under existing parent node
+    operationId: deleteListNodeElements
+    parameters:
+      - $ref: 'components.yml#/components/parameters/dataspaceNameInPath'
+      - $ref: 'components.yml#/components/parameters/anchorNameInPath'
+      - $ref: 'components.yml#/components/parameters/requiredXpathInQuery'
+    responses:
+      '204':
+        $ref: 'components.yml#/components/responses/NoContent'
+      '400':
+        $ref: 'components.yml#/components/responses/BadRequest'
+      '401':
+        $ref: 'components.yml#/components/responses/Unauthorized'
+      '403':
+        $ref: 'components.yml#/components/responses/Forbidden'
+
 nodesByDataspaceAndAnchor:
   post:
     description: Create a node for a given anchor and dataspace
diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy
index 8675f42..d3d42e3 100755
--- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy
+++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/DataRestControllerSpec.groovy
@@ -24,6 +24,7 @@
 
 import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS
 import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
@@ -235,4 +236,18 @@
         then: 'the java API was called with the correct parameters'
             1 * mockCpsDataService.replaceListNodeData(dataspaceName, anchorName, parentNodeXpath, jsonData)
     }
+
+    def 'Delete list node child elements.'() {
+        given: 'list node xpath'
+            def listNodeXpath = 'list node xpath'
+        when: 'delete is invoked list-node endpoint'
+            def response = mvc.perform(
+                    delete("$dataNodeBaseEndpoint/anchors/$anchorName/list-node")
+                        .param('xpath', listNodeXpath)
+            ).andReturn().response
+        then: 'a success response is returned'
+            response.status == HttpStatus.NO_CONTENT.value()
+        then: 'the java API was called with the correct parameters'
+            1 * mockCpsDataService.deleteListNodeData(dataspaceName, anchorName, listNodeXpath)
+    }
 }