From eeef2ae7d17fcff7fbd33614972ad42f495e7998 Mon Sep 17 00:00:00 2001 From: DylanB95EST Date: Tue, 30 Nov 2021 15:07:35 +0000 Subject: [PATCH] Support Delete operation for ds Passtrough-Running in NCMP 1/3 Add delete operation for passthrough running within cps-ncmp. Issue-ID: CPS-638 Change-Id: I360672adc1f0f5c8eb351391c94f2d4fa913d0b4 Signed-off-by: DylanB95EST --- cps-ncmp-rest/docs/openapi/ncmp.yml | 29 ++++++++++++++++++++++ .../rest/controller/NetworkCmProxyController.java | 26 +++++++++++++++++-- .../controller/NetworkCmProxyControllerSpec.groovy | 27 ++++++++++++++++---- .../ncmp/api/impl/operations/DmiRequestBody.java | 3 ++- .../impl/NetworkCmProxyDataServiceImplSpec.groovy | 16 ++++++------ 5 files changed, 85 insertions(+), 16 deletions(-) diff --git a/cps-ncmp-rest/docs/openapi/ncmp.yml b/cps-ncmp-rest/docs/openapi/ncmp.yml index 6cf975cfe..673eb0b3c 100755 --- a/cps-ncmp-rest/docs/openapi/ncmp.yml +++ b/cps-ncmp-rest/docs/openapi/ncmp.yml @@ -337,6 +337,35 @@ resourceDataForPassthroughRunning: 404: $ref: 'components.yaml#/components/responses/NotFound' + delete: + tags: + - network-cm-proxy + summary: Delete resource data + description: Delete resource data from pass-through running for a given cm handle + operationId: deleteResourceDataRunningForCmHandle + parameters: + - $ref: 'components.yaml#/components/parameters/cmHandleInPath' + - $ref: 'components.yaml#/components/parameters/resourceIdentifierInQuery' + - $ref: 'components.yaml#/components/parameters/contentParamInHeader' + requestBody: + required: true + content: + application/json: + schema: + type: string + responses: + 204: + $ref: 'components.yaml#/components/responses/NoContent' + 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' + + fetchModuleReferencesByCmHandle: get: description: fetch all module references (name and revision) for a given cm handle diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java index f95d4a2f5..3b44b80f6 100755 --- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java @@ -23,6 +23,7 @@ package org.onap.cps.ncmp.rest.controller; import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.CREATE; +import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.DELETE; import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.PATCH; import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.UPDATE; @@ -200,7 +201,7 @@ public class NetworkCmProxyController implements NetworkCmProxyApi { } /** - * Create resource data in datastore pass through running for given cm-handle. + * Create resource data in datastore pass-through running for given cm-handle. * * @param resourceIdentifier resource identifier * @param cmHandle cm handle identifier @@ -219,7 +220,7 @@ public class NetworkCmProxyController implements NetworkCmProxyApi { } /** - * Update resource data in datastore pass through running for given cm-handle. + * Update resource data in datastore pass-through running for given cm-handle. * * @param resourceIdentifier resource identifier * @param cmHandle cm handle identifier @@ -237,6 +238,27 @@ public class NetworkCmProxyController implements NetworkCmProxyApi { return new ResponseEntity<>(HttpStatus.OK); } + + /** + * Delete resource data in datastore pass-through running for a given cm-handle. + * + * @param resourceIdentifier resource identifier + * @param cmHandle cm handle identifier + * @param requestBody the request body + * @param contentType content type of the body + * @return response entity no content if request is successful + */ + @Override + public ResponseEntity deleteResourceDataRunningForCmHandle(final String resourceIdentifier, + final String cmHandle, + final String requestBody, + final String contentType) { + + networkCmProxyDataService.writeResourceDataPassThroughRunningForCmHandle(cmHandle, + resourceIdentifier, DELETE, requestBody, contentType); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + /** * Execute cm handle search. * diff --git a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy index 4186bcd1b..530ce4e3a 100644 --- a/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy +++ b/cps-ncmp-rest/src/test/groovy/org/onap/cps/ncmp/rest/controller/NetworkCmProxyControllerSpec.groovy @@ -28,12 +28,14 @@ import org.onap.cps.spi.model.ModuleReference import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.PATCH 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 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.CREATE import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.UPDATE +import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.DELETE import com.google.gson.Gson import org.onap.cps.ncmp.api.NetworkCmProxyDataService @@ -174,7 +176,7 @@ class NetworkCmProxyControllerSpec extends Specification { response.contentAsString.contains('"leaf":"value"') } - def 'Get Resource Data from passthrough operational.' () { + def 'Get Resource Data from pass-through operational.' () { given: 'resource data url' def getUrl = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-operational" + "?resourceIdentifier=parent/child&options=(a=1,b=2)" @@ -193,7 +195,7 @@ class NetworkCmProxyControllerSpec extends Specification { response.status == HttpStatus.OK.value() } - def 'Get Resource Data from passthrough running with #scenario value in resource identifier param.' () { + def 'Get Resource Data from pass-through running with #scenario value in resource identifier param.' () { given: 'resource data url' def getUrl = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-running" + "?resourceIdentifier=" + resourceIdentifier + "&options=(a=1,b=2)" @@ -222,7 +224,7 @@ class NetworkCmProxyControllerSpec extends Specification { '? needs to be encoded as %3F' | 'idWith%3F' } - def 'Update resource data from passthrough running.' () { + def 'Update resource data from pass-through running.' () { given: 'update resource data url' def updateUrl = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-running" + "?resourceIdentifier=parent/child" @@ -239,7 +241,7 @@ class NetworkCmProxyControllerSpec extends Specification { response.status == HttpStatus.OK.value() } - def 'Create Resource Data from passthrough running with #scenario.' () { + def 'Create Resource Data from pass-through running with #scenario.' () { given: 'resource data url' def url = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-running" + "?resourceIdentifier=parent/child" @@ -302,7 +304,7 @@ class NetworkCmProxyControllerSpec extends Specification { response.contentAsString == '{"cmHandles":[]}' } - def 'Patch resource data in passthrough-running datastore.' () { + def 'Patch resource data in pass-through running datastore.' () { given: 'patch resource data url' def url = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-running" + "?resourceIdentifier=parent/child" @@ -318,5 +320,20 @@ class NetworkCmProxyControllerSpec extends Specification { and: 'the response status is OK' response.status == HttpStatus.OK.value() } + + def 'Delete resource data in pass-through running datastore.' () { + given: 'delete resource data url' + def url = "$ncmpBasePathV1/ch/testCmHandle/data/ds/ncmp-datastore:passthrough-running" + + "?resourceIdentifier=parent/child" + when: 'delete data resource request is performed' + def response = mvc.perform( + delete(url).contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON) + .content('{"some-key" : "some-value"}')).andReturn().response + then: 'the ncmp service method to delete resource is called' + 1 * mockNetworkCmProxyDataService.writeResourceDataPassThroughRunningForCmHandle('testCmHandle', + 'parent/child', DELETE, '{"some-key" : "some-value"}', 'application/json;charset=UTF-8') + and: 'the response is No Content' + response.status == HttpStatus.NO_CONTENT.value() + } } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiRequestBody.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiRequestBody.java index a635f0bc8..26feeeaf4 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiRequestBody.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiRequestBody.java @@ -38,7 +38,8 @@ public class DmiRequestBody { READ("read"), CREATE("create"), UPDATE("update"), - PATCH("patch"); + PATCH("patch"), + DELETE("delete"); private String value; OperationEnum(final String value) { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy index 8bb0ee280..c396a2ef2 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy @@ -97,7 +97,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { 1 * mockCpsDataService.saveListElements(expectedDataspaceName, cmHandle, xpath, jsonData, noTimestamp) } - def 'Write resource data for passthrough running from dmi using POST #scenario cm handle properties.'() { + def 'Write resource data for pass-through running from dmi using POST #scenario cm handle properties.'() { given: 'a data node' def dataNode = getDataNode(includeCmHandleProperties) and: 'cpsDataService returns valid datanode' @@ -117,7 +117,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { 'without' | false || '{}' } - def 'Write resource data for passthrough running from dmi using POST "not found" response (from DMI).'() { + def 'Write resource data for pass-through running from dmi using POST "not found" response (from DMI).'() { given: 'a data node' def dataNode = getDataNode(true) and: 'cpsDataService returns valid dataNode' @@ -147,7 +147,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { fetchDescendantsOption << FetchDescendantsOption.values() } - def 'Get resource data for passthrough operational from dmi.'() { + def 'Get resource data for pass-through operational from dmi.'() { given: 'a data node' def dataNode = getDataNode(true) and: 'get data node is called' @@ -169,7 +169,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { response == 'result-json' } - def 'Get resource data for passthrough operational from dmi with Json Processing Exception.'() { + def 'Get resource data for pass-through operational from dmi with Json Processing Exception.'() { given: 'a data node' def dataNode = getDataNode(true) and: 'cps data service returns valid data node' @@ -192,7 +192,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { exceptionThrown.details == 'DMI status code: 404, DMI response body: NOK-json' } - def 'Get resource data for passthrough operational from dmi return NOK response.'() { + def 'Get resource data for pass-through operational from dmi return NOK response.'() { given: 'a data node' def dataNode = getDataNode(true) and: 'cps data service returns valid data node' @@ -216,7 +216,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { exceptionThrown.details.contains('NOK-json') } - def 'Get resource data for passthrough running from dmi.'() { + def 'Get resource data for pass-through running from dmi.'() { given: 'a data node' def dataNode = getDataNode(true) and: 'cpsDataService returns valid data node' @@ -237,7 +237,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { response == '{result-json}' } - def 'Get resource data for passthrough running from dmi return NOK response.'() { + def 'Get resource data for pass-through running from dmi return NOK response.'() { given: 'a data node' def dataNode = getDataNode(true) and: 'cpsDataService returns valid dataNode' @@ -295,7 +295,7 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { 1 * mockCpsDataService.replaceNodeTree(expectedDataspaceName, cmHandle, xpath, jsonData, noTimestamp) } - def 'Update resource data for passthrough running from dmi using POST #scenario cm handle properties.'() { + def 'Update resource data for pass-through running from dmi using POST #scenario cm handle properties.'() { given: 'a data node' def dataNode = getDataNode(includeCmHandleProperties) and: 'cpsDataService returns valid datanode' -- 2.16.6