From: Niamh Core Date: Tue, 7 Dec 2021 11:19:45 +0000 (+0000) Subject: Merge "https://jira.onap.org/browse/CPS-788 Test Disable removing of redundant escape... X-Git-Tag: mr/823/126723/7~24 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=d9104d8b03dff4ccc602c230e02fd9bcfb603b69;hp=126dfc0d99a412816cd0299e539a3b070a08652a;p=cps.git Merge "https://jira.onap.org/browse/CPS-788 Test Disable removing of redundant escape characters" --- diff --git a/cps-ncmp-rest/docs/openapi/components.yaml b/cps-ncmp-rest/docs/openapi/components.yaml index da1878fea..719282b3e 100644 --- a/cps-ncmp-rest/docs/openapi/components.yaml +++ b/cps-ncmp-rest/docs/openapi/components.yaml @@ -37,17 +37,18 @@ components: properties: dmiPlugin: type: string - example: onap-dmi-plugin + example: my-dmi-plugin dmiDataPlugin: type: string - example: onap-dmi-data-plugin + example: my-dmi-data-plugin dmiModelPlugin: type: string - example: onap-dmi-model-plugin + example: my-dmi-model-plugin createdCmHandles: type: array items: $ref: '#/components/schemas/RestCmHandle' + example: [my-cm-handle1, my-cm-handle2, my-cm-handle3] updatedCmHandles: type: array items: @@ -56,6 +57,7 @@ components: type: array items: type: string + example: [my-cm-handle1, my-cm-handle2, my-cm-handle3] RestCmHandle: required: @@ -64,14 +66,14 @@ components: properties: cmHandle: type: string - example: cmHandle123 + example: my-cm-handle cmHandleProperties: $ref: '#/components/schemas/RestCmHandleAdditionalProperties' RestCmHandleAdditionalProperties: type: object additionalProperties: type: string - example: system-001 + example: my-additional-property Conditions: type: object @@ -95,11 +97,12 @@ components: items: type: object $ref: '#/components/schemas/ModuleNameAsJsonObject' + example: [my-module-1, my-module-2, my-module-3] ModuleNameAsJsonObject: properties: moduleName: type: string - example: someModuleName + example: my-module #Response Schemas CmHandles: @@ -116,7 +119,45 @@ components: properties: cmHandleId: type: string - example: someCmHandleId + example: my-cm-handle-id + + examples: + dataSampleRequest: + summary: Sample request + description: Sample request body + value: + test:bookstore: + bookstore-name: Chapters + categories: + - code: '01' + name: SciFi + books: + - authors: + - Iain M. Banks + - authors: + - Ursula K. Le Guin + - code: '02' + name: kids + books: + - authors: + - Philip Pullman + + dataSampleResponse: + summary: Sample response + description: Sample response for selecting 'sample 1'. + value: + bookstore: + categories: + - code: '01' + books: + - {} + - {} + name: SciFi + - code: '02' + books: + - {} + name: kids + bookstore-name: Chapters parameters: cmHandleInPath: @@ -126,6 +167,7 @@ components: required: true schema: type: string + example: my-cm-handle xpathInQuery: name: xpath in: query @@ -166,18 +208,15 @@ components: schema: type: string examples: - sample1: + sample 1: value: - resourceIdentifier: \parent\child - sample2: + resourceIdentifier: \shops\bookstore + sample 2: value: - resourceIdentifier: \parent\listElement[key=value] - sample3: + resourceIdentifier: \shops\bookstore\categories[@code=1] + sample 3: value: - resourceIdentifier: \parent\listElement[key=value]\grandChild - sample4: - value: - resourceIdentifier: parent=1,child=abc + resourceIdentifier: parent=shops,child=bookstore acceptParamInHeader: name: Accept in: header @@ -189,21 +228,21 @@ components: optionsParamInQuery: name: options in: query - description: options parameter in query, it is mandatory to wrap key(s)=value(s) in parenthesis'()'. + description: options parameter in query, it is mandatory to wrap key(s)=value(s) in parenthesis'()'. The format of options parameter depend on the associated DMI Plugin implementation. required: false schema: type: string allowReserved: true examples: - sample1: + sample 1: value: - options: (key1=value1,key2=value2) - sample2: + options: (depth=3) + sample 2: value: - options: (key1=value1,key2=value1/value2) - sample3: + options: (fields=book) + sample 3: value: - options: (key1=10,key2=value2,key3=[val31;val32]) + options: (depth=2,fields=book/authors) contentParamInHeader: name: Content-Type in: header @@ -212,7 +251,7 @@ components: schema: type: string default: application/json - + example: application/yang-data+json responses: NotFound: @@ -221,36 +260,60 @@ components: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 400 + message: Not found error message + details: Not found error details Unauthorized: description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 401 + message: Unauthorized error message + details: Unauthorized error details Forbidden: description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 403 + message: Forbidden error message + details: Forbidden error details BadRequest: description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 400 BAD_REQUEST + message: Bad request error message + details: Bad request error details Conflict: description: Conflict content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 409 CONFLICT + message: Conflict error message + details: Conflict error details NotImplemented: description: The given path has not been implemented content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 501 + message: Not implemented error message + details: Not implemented error details Ok: description: OK content: diff --git a/cps-ncmp-rest/docs/openapi/ncmp.yml b/cps-ncmp-rest/docs/openapi/ncmp.yml index fdad1f56d..6cf975cfe 100755 --- a/cps-ncmp-rest/docs/openapi/ncmp.yml +++ b/cps-ncmp-rest/docs/openapi/ncmp.yml @@ -194,7 +194,14 @@ getResourceDataForPassthroughOperational: - $ref: 'components.yaml#/components/parameters/optionsParamInQuery' responses: 200: - $ref: 'components.yaml#/components/responses/Ok' + description: OK + content: + application/json: + schema: + type: object + examples: + dataSampleResponse: + $ref: 'components.yaml#/components/examples/dataSampleResponse' 400: $ref: 'components.yaml#/components/responses/BadRequest' 401: @@ -218,7 +225,14 @@ resourceDataForPassthroughRunning: - $ref: 'components.yaml#/components/parameters/optionsParamInQuery' responses: 200: - $ref: 'components.yaml#/components/responses/Ok' + description: OK + content: + application/json: + schema: + type: object + examples: + dataSampleResponse: + $ref: 'components.yaml#/components/examples/dataSampleResponse' 400: $ref: 'components.yaml#/components/responses/BadRequest' 401: @@ -243,6 +257,9 @@ resourceDataForPassthroughRunning: application/json: schema: type: string + examples: + dataSampleRequest: + $ref: 'components.yaml#/components/examples/dataSampleRequest' application/yang-data+json: schema: type: string @@ -274,6 +291,9 @@ resourceDataForPassthroughRunning: application/json: schema: type: string + examples: + dataSampleRequest: + $ref: 'components.yaml#/components/examples/dataSampleRequest' application/yang-data+json: schema: type: string @@ -332,9 +352,15 @@ fetchModuleReferencesByCmHandle: content: application/json: schema: - type: string - example: [{"moduleName": "nc-notifications", "revision": "2008-07-14"}] - $ref: 'components.yaml#/components/responses/Ok' + type: object + examples: + moduleReferencesResponse: + summary: Sample response + value: + - moduleName: my-module-name + revision: yyyy-mm-dd + - moduleName: my-module-name-2 + revision: yyyy-mm-dd 400: $ref: 'components.yaml#/components/responses/BadRequest' 401: diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java index 62eca9451..9f3df6b9a 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java @@ -46,21 +46,6 @@ public class DmiRestClient { this.dmiProperties = dmiProperties; } - /** - * Sends a PUT operation to DMI with JSON payload. - * - * @param dmiResourceUrl the DMI resource URL - * @param jsonData the JSON payload - * @param headers the HTTP headers - * @return response entity of type Object - */ - public ResponseEntity putOperationWithJsonData(final String dmiResourceUrl, - final String jsonData, final HttpHeaders headers) { - //TODO Toine Siebelink, should we use POST operation below instead (and return a String-Entity!) - final var httpEntity = new HttpEntity<>(jsonData, configureHttpHeaders(headers)); - return restTemplate.exchange(dmiResourceUrl, HttpMethod.PUT, httpEntity, Object.class); - } - /** * Sends POST operation to DMI with json body containing module references. * @param dmiResourceUrl dmi resource url diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiDataOperations.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiDataOperations.java index b8336455c..eccb9a098 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiDataOperations.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operations/DmiDataOperations.java @@ -62,7 +62,7 @@ public class DmiDataOperations extends DmiOperations { * @param dataStore data store enum * @return {@code ResponseEntity} response entity */ - public ResponseEntity getResourceDataFromDmi(final String cmHandle, + public ResponseEntity getResourceDataFromDmi(final String cmHandle, final String resourceId, final String optionsParamInQuery, final String acceptParamInHeader, @@ -79,7 +79,7 @@ public class DmiDataOperations extends DmiOperations { persistenceCmHandle.resolveDmiServiceName(DATA), cmHandle, resourceId, optionsParamInQuery, dataStore); final var httpHeaders = prepareHeader(acceptParamInHeader); - return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders); + return dmiRestClient.postOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders); } /** diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy index a1779a757..8c46178dd 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/client/DmiRestClientSpec.groovy @@ -43,16 +43,6 @@ class DmiRestClientSpec extends Specification { DmiRestClient objectUnderTest def resourceUrl = 'some url' - def 'DMI PUT operation.'() { - given: 'the rest template returns a valid response entity' - def mockResponseEntity = Mock(ResponseEntity) - mockRestTemplate.exchange(resourceUrl, HttpMethod.PUT, _ as HttpEntity, Object.class) >> mockResponseEntity - when: 'PUT operation is invoked' - def result = objectUnderTest.putOperationWithJsonData(resourceUrl, 'json-data', new HttpHeaders()) - then: 'the output of the method is equal to the output from the test template' - result == mockResponseEntity - } - def 'DMI POST operation'() { given: 'the rest template returns a valid response entity' def mockResponseEntity = Mock(ResponseEntity) diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operations/DmiDataOperationsSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operations/DmiDataOperationsSpec.groovy index 674a44238..b9704b1ea 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operations/DmiDataOperationsSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/operations/DmiDataOperationsSpec.groovy @@ -45,7 +45,7 @@ class DmiDataOperationsSpec extends DmiOperationsBaseSpec { mockPersistenceCmHandleRetrieval(additionalProperties) and: 'a positive response from dmi service when it is called with the expected parameters' def responseFromDmi = new ResponseEntity(HttpStatus.OK) - mockDmiRestClient.putOperationWithJsonData( + mockDmiRestClient.postOperationWithJsonData( "${dmiServiceName}/dmi/v1/ch/${cmHandleId}/data/ds/ncmp-datastore:${expectedDatastoreInUrl}?resourceIdentifier=${resourceIdentifier}${expectedOptionsInUrl}", expectedJson, [Accept:['sample accept header']]) >> responseFromDmi when: 'get resource data is invoked' diff --git a/cps-rest/docs/openapi/components.yml b/cps-rest/docs/openapi/components.yml index 3d2eb57e4..ff2816af6 100644 --- a/cps-rest/docs/openapi/components.yml +++ b/cps-rest/docs/openapi/components.yml @@ -25,13 +25,13 @@ components: properties: name: type: string - example: my_anchor + example: my-anchor dataspaceName: type: string - example: my_dataspace + example: my-dataspace schemaSetName: type: string - example: my_schema_set + example: my-schema-set ErrorMessage: type: object @@ -39,13 +39,10 @@ components: properties: status: type: string - example: 400 message: type: string - example: Dataspace not found details: type: string - example: Dataspace with name D1 does not exist. MultipartFile: type: object @@ -56,7 +53,7 @@ components: type: string description: multipartFile format: binary - example: http://example.com/examples/example.yang + example: 'https://github.com/onap/cps/blob/master/cps-service/src/test/resources/bookstore.yang' ModuleReferences: type: object @@ -64,13 +61,13 @@ components: properties: name: type: string - example: module_reference_name + example: my-module-reference-name namespace: type: string - example: module_reference_namespace + example: my-module-reference-namespace revision: type: string - example: module_reference_revision + example: my-module-reference-revision SchemaSetDetails: type: object @@ -78,14 +75,35 @@ components: properties: dataspaceName: type: string - example: my_dataspace + example: my-dataspace moduleReferences: type: array items: $ref: '#/components/schemas/ModuleReferences' name: type: string - example: my_schema_set + example: my-schema-set + + examples: + dataSampleRequest: + value: + test:bookstore: + bookstore-name: Chapters + categories: + - code: 01 + name: SciFi + - code: 02 + name: kids + + dataSampleResponse: + summary: The data node returned does not include the root node. This is being investigated as a part of CPS-461 + value: + bookstore-name: Chapters + categories: + - code: 01 + name: SciFi + - code: 02 + name: kids parameters: dataspaceNameInQuery: @@ -95,6 +113,7 @@ components: required: true schema: type: string + example: my-dataspace dataspaceNameInPath: name: dataspace-name in: path @@ -102,6 +121,7 @@ components: required: true schema: type: string + example: my-dataspace anchorNameInPath: name: anchor-name in: path @@ -109,6 +129,7 @@ components: required: true schema: type: string + example: my-anchor schemaSetNameInQuery: name: schema-set-name in: query @@ -116,6 +137,7 @@ components: required: true schema: type: string + example: my-schema-set schemaSetNameInPath: name: schema-set-name in: path @@ -123,6 +145,7 @@ components: required: true schema: type: string + example: my-schema-set anchorNameInQuery: name: anchor-name in: query @@ -130,29 +153,45 @@ components: required: true schema: type: string + example: my-anchor xpathInQuery: name: xpath in: query - description: xpath + description: For more details on xpath, please refer https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html required: false schema: type: string default: / + examples: + container xpath: + value: /shops/bookstore + list attributes xpath: + value: /shops/bookstore/categories[@code=1] requiredXpathInQuery: name: xpath in: query - description: xpath + description: For more details on xpath, please refer https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html required: true schema: type: string + examples: + container xpath: + value: /shops/bookstore + list attributes xpath: + value: /shops/bookstore/categories[@code=1] cpsPathInQuery: name: cps-path in: query - description: cps-path + description: For more details on cps path, please refer https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html required: false schema: type: string default: / + examples: + container cps path: + value: //bookstore + list attributes cps path: + value: //categories[@code=1] includeDescendantsOptionInQuery: name: include-descendants in: query @@ -161,6 +200,7 @@ components: schema: type: boolean default: false + example: false observedTimestampInQuery: name: observed-timestamp in: query @@ -177,43 +217,66 @@ components: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 404 + message: Resource Not Found + details: The requested resource is not found Unauthorized: description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 401 + message: Unauthorized request + details: This request is unauthorized Forbidden: description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 403 + message: Request Forbidden + details: This request is forbidden BadRequest: description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 400 + message: Bad Request + details: The provided request is not valid Conflict: description: Conflict content: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + example: + status: 409 + message: Conflicting request + details: The request cannot be processed as the resource is in use. Ok: description: OK content: application/json: schema: type: object - example: { "key": "value" } + examples: + dataSampleResponse: + value: "" Created: description: Created content: text/plain: schema: type: string + example: my-resource NoContent: description: No Content content: {} diff --git a/cps-rest/docs/openapi/cpsData.yml b/cps-rest/docs/openapi/cpsData.yml index 2b65ae440..15f8a1c71 100644 --- a/cps-rest/docs/openapi/cpsData.yml +++ b/cps-rest/docs/openapi/cpsData.yml @@ -35,7 +35,9 @@ nodeByDataspaceAndAnchor: application/json: schema: type: object - example: { "child": my_child,"leafList": "leafListElement1, leafListElement2", "leaf": my_leaf } + examples: + dataSampleResponse: + $ref: 'components.yml#/components/examples/dataSampleResponse' '400': $ref: 'components.yml#/components/responses/BadRequest' '401': @@ -63,7 +65,10 @@ listElementByDataspaceAndAnchor: content: application/json: schema: - type: string + type: object + examples: + dataSampleRequest: + $ref: 'components.yml#/components/examples/dataSampleRequest' responses: '201': $ref: 'components.yml#/components/responses/Created' @@ -90,10 +95,13 @@ listElementByDataspaceAndAnchor: content: application/json: schema: - type: string + type: object + examples: + dataSampleRequest: + $ref: 'components.yml#/components/examples/dataSampleRequest' responses: '200': - $ref: 'components.yml#/components/responses/Created' + $ref: 'components.yml#/components/responses/Ok' '400': $ref: 'components.yml#/components/responses/BadRequest' '401': @@ -140,7 +148,10 @@ nodesByDataspaceAndAnchor: content: application/json: schema: - type: string + type: object + examples: + dataSampleRequest: + $ref: 'components.yml#/components/examples/dataSampleRequest' responses: '201': $ref: 'components.yml#/components/responses/Created' @@ -167,7 +178,10 @@ nodesByDataspaceAndAnchor: content: application/json: schema: - type: string + type: object + examples: + dataSampleRequest: + $ref: 'components.yml#/components/examples/dataSampleRequest' responses: '200': $ref: 'components.yml#/components/responses/Ok' @@ -216,7 +230,10 @@ nodesByDataspaceAndAnchor: content: application/json: schema: - type: string + type: object + examples: + dataSampleRequest: + $ref: 'components.yml#/components/examples/dataSampleRequest' responses: '200': $ref: 'components.yml#/components/responses/Ok' diff --git a/cps-rest/docs/openapi/cpsQuery.yml b/cps-rest/docs/openapi/cpsQuery.yml index f45f3f41a..4f938aa89 100644 --- a/cps-rest/docs/openapi/cpsQuery.yml +++ b/cps-rest/docs/openapi/cpsQuery.yml @@ -30,7 +30,14 @@ nodesByDataspaceAndAnchorAndCpsPath: - $ref: 'components.yml#/components/parameters/includeDescendantsOptionInQuery' responses: '200': - $ref: 'components.yml#/components/responses/Ok' + description: OK + content: + application/json: + schema: + type: object + examples: + dataSampleResponse: + $ref: 'components.yml#/components/examples/dataSampleResponse' '400': $ref: 'components.yml#/components/responses/BadRequest' '401': 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 e57fb3c8c..73c2c27c9 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 @@ -49,11 +49,12 @@ public class DataRestController implements CpsDataApi { @Override public ResponseEntity createNode(final String dataspaceName, final String anchorName, - final String jsonData, final String parentNodeXpath, final String observedTimestamp) { + final Object jsonData, final String parentNodeXpath, final String observedTimestamp) { if (isRootXpath(parentNodeXpath)) { - cpsDataService.saveData(dataspaceName, anchorName, jsonData, toOffsetDateTime(observedTimestamp)); + cpsDataService.saveData(dataspaceName, anchorName, jsonData.toString(), + toOffsetDateTime(observedTimestamp)); } else { - cpsDataService.saveData(dataspaceName, anchorName, parentNodeXpath, jsonData, + cpsDataService.saveData(dataspaceName, anchorName, parentNodeXpath, jsonData.toString(), toOffsetDateTime(observedTimestamp)); } return new ResponseEntity<>(HttpStatus.CREATED); @@ -61,7 +62,7 @@ public class DataRestController implements CpsDataApi { @Override public ResponseEntity deleteDataNode(final String dataspaceName, final String anchorName, - final String xpath, final String observedTimestamp) { + final String xpath, final String observedTimestamp) { cpsDataService.deleteDataNode(dataspaceName, anchorName, xpath, toOffsetDateTime(observedTimestamp)); return new ResponseEntity<>(HttpStatus.NO_CONTENT); @@ -69,8 +70,8 @@ public class DataRestController implements CpsDataApi { @Override public ResponseEntity addListElements(final String parentNodeXpath, - final String dataspaceName, final String anchorName, final String jsonData, final String observedTimestamp) { - cpsDataService.saveListElements(dataspaceName, anchorName, parentNodeXpath, jsonData, + final String dataspaceName, final String anchorName, final Object jsonData, final String observedTimestamp) { + cpsDataService.saveListElements(dataspaceName, anchorName, parentNodeXpath, jsonData.toString(), toOffsetDateTime(observedTimestamp)); return new ResponseEntity<>(HttpStatus.CREATED); } @@ -87,25 +88,26 @@ public class DataRestController implements CpsDataApi { @Override public ResponseEntity updateNodeLeaves(final String dataspaceName, - final String anchorName, final String jsonData, final String parentNodeXpath, final String observedTimestamp) { - cpsDataService.updateNodeLeaves(dataspaceName, anchorName, parentNodeXpath, jsonData, + final String anchorName, final Object jsonData, final String parentNodeXpath, final String observedTimestamp) { + cpsDataService.updateNodeLeaves(dataspaceName, anchorName, parentNodeXpath, jsonData.toString(), toOffsetDateTime(observedTimestamp)); return new ResponseEntity<>(HttpStatus.OK); } @Override public ResponseEntity replaceNode(final String dataspaceName, final String anchorName, - final String jsonData, final String parentNodeXpath, final String observedTimestamp) { + final Object jsonData, final String parentNodeXpath, final String observedTimestamp) { cpsDataService - .replaceNodeTree(dataspaceName, anchorName, parentNodeXpath, jsonData, toOffsetDateTime(observedTimestamp)); + .replaceNodeTree(dataspaceName, anchorName, parentNodeXpath, jsonData.toString(), + toOffsetDateTime(observedTimestamp)); return new ResponseEntity<>(HttpStatus.OK); } @Override - public ResponseEntity replaceListContent(final String parentNodeXpath, - final String dataspaceName, final String anchorName, final String jsonData, + public ResponseEntity replaceListContent(final String parentNodeXpath, + final String dataspaceName, final String anchorName, final Object jsonData, final String observedTimestamp) { - cpsDataService.replaceListContent(dataspaceName, anchorName, parentNodeXpath, jsonData, + cpsDataService.replaceListContent(dataspaceName, anchorName, parentNodeXpath, jsonData.toString(), toOffsetDateTime(observedTimestamp)); return new ResponseEntity<>(HttpStatus.OK); } 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 2c288344c..445b2a2bd 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 @@ -60,6 +60,8 @@ class DataRestControllerSpec extends Specification { def dataspaceName = 'my_dataspace' def anchorName = 'my_anchor' def noTimestamp = null + def jsonString = '{"some-key" : "some-value"}' + def jsonObject @Shared static DataNode dataNodeWithLeavesNoChildren = new DataNodeBuilder().withXpath('/xpath') @@ -71,24 +73,24 @@ class DataRestControllerSpec extends Specification { def setup() { dataNodeBaseEndpoint = "$basePath/v1/dataspaces/$dataspaceName" + jsonObject = groovy.json.JsonOutput.toJson(jsonString); } def 'Create a node: #scenario.'() { - given: 'some json to create a data node' + given: 'endpoint to create a node' def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes" - def json = 'some json (this is not validated)' when: 'post is invoked with datanode endpoint and json' def response = mvc.perform( post(endpoint) .contentType(MediaType.APPLICATION_JSON) .param('xpath', parentNodeXpath) - .content(json) + .content(jsonObject) ).andReturn().response then: 'a created response is returned' response.status == HttpStatus.CREATED.value() then: 'the java API was called with the correct parameters' - 1 * mockCpsDataService.saveData(dataspaceName, anchorName, json, noTimestamp) + 1 * mockCpsDataService.saveData(dataspaceName, anchorName, jsonString, noTimestamp) where: 'following xpath parameters are are used' scenario | parentNodeXpath 'no xpath parameter' | '' @@ -96,9 +98,8 @@ class DataRestControllerSpec extends Specification { } def 'Create a node with observed-timestamp'() { - given: 'some json to create a data node' + given: 'endpoint to create a node' def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes" - def json = 'some json (this is not validated)' when: 'post is invoked with datanode endpoint and json' def response = mvc.perform( @@ -106,12 +107,12 @@ class DataRestControllerSpec extends Specification { .contentType(MediaType.APPLICATION_JSON) .param('xpath', '') .param('observed-timestamp', observedTimestamp) - .content(json) + .content(jsonObject) ).andReturn().response then: 'a created response is returned' response.status == expectedHttpStatus.value() then: 'the java API was called with the correct parameters' - expectedApiCount * mockCpsDataService.saveData(dataspaceName, anchorName, json, + expectedApiCount * mockCpsDataService.saveData(dataspaceName, anchorName, jsonString, { it == DateTimeUtility.toOffsetDateTime(observedTimestamp) }) where: scenario | observedTimestamp || expectedApiCount | expectedHttpStatus @@ -120,16 +121,15 @@ class DataRestControllerSpec extends Specification { } def 'Create a child node'() { - given: 'some json to create a data node' + given: 'endpoint to create a node' def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes" - def json = 'some json (this is not validated)' and: 'parent node xpath' def parentNodeXpath = 'some xpath' when: 'post is invoked with datanode endpoint and json' def postRequestBuilder = post(endpoint) .contentType(MediaType.APPLICATION_JSON) .param('xpath', parentNodeXpath) - .content(json) + .content(jsonObject) if (observedTimestamp != null) postRequestBuilder.param('observed-timestamp', observedTimestamp) def response = @@ -137,7 +137,7 @@ class DataRestControllerSpec extends Specification { then: 'a created response is returned' response.status == HttpStatus.CREATED.value() then: 'the java API was called with the correct parameters' - 1 * mockCpsDataService.saveData(dataspaceName, anchorName, parentNodeXpath, json, + 1 * mockCpsDataService.saveData(dataspaceName, anchorName, parentNodeXpath, jsonString, DateTimeUtility.toOffsetDateTime(observedTimestamp)) where: scenario | observedTimestamp @@ -146,21 +146,20 @@ class DataRestControllerSpec extends Specification { } def 'Save list elements #scenario.'() { - given: 'parent node xpath and json data inputs' + given: 'parent node xpath ' def parentNodeXpath = 'parent node xpath' - def jsonData = 'json data' when: 'list-node endpoint is invoked with post (create) operation' def postRequestBuilder = post("$dataNodeBaseEndpoint/anchors/$anchorName/list-nodes") .contentType(MediaType.APPLICATION_JSON) .param('xpath', parentNodeXpath) - .content(jsonData) + .content(jsonObject) if (observedTimestamp != null) postRequestBuilder.param('observed-timestamp', observedTimestamp) def response = mvc.perform(postRequestBuilder).andReturn().response then: 'a created response is returned' response.status == expectedHttpStatus.value() then: 'the java API was called with the correct parameters' - expectedApiCount * mockCpsDataService.saveListElements(dataspaceName, anchorName, parentNodeXpath, jsonData, + expectedApiCount * mockCpsDataService.saveListElements(dataspaceName, anchorName, parentNodeXpath, jsonString, { it == DateTimeUtility.toOffsetDateTime(observedTimestamp) }) where: scenario | observedTimestamp || expectedApiCount | expectedHttpStatus @@ -210,19 +209,18 @@ class DataRestControllerSpec extends Specification { } def 'Update data node leaves: #scenario.'() { - given: 'json data' - def jsonData = 'json data' + given: 'endpoint to update a node ' def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes" when: 'patch request is performed' def response = mvc.perform( patch(endpoint) .contentType(MediaType.APPLICATION_JSON) - .content(jsonData) + .content(jsonObject) .param('xpath', inputXpath) ).andReturn().response then: 'the service method is invoked with expected parameters' - 1 * mockCpsDataService.updateNodeLeaves(dataspaceName, anchorName, xpathServiceParameter, jsonData, null) + 1 * mockCpsDataService.updateNodeLeaves(dataspaceName, anchorName, xpathServiceParameter, jsonString, null) and: 'response status indicates success' response.status == HttpStatus.OK.value() where: @@ -233,20 +231,19 @@ class DataRestControllerSpec extends Specification { } def 'Update data node leaves with observedTimestamp'() { - given: 'json data' - def jsonData = 'json data' + given: 'endpoint to update a node leaves ' def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes" when: 'patch request is performed' def response = mvc.perform( patch(endpoint) .contentType(MediaType.APPLICATION_JSON) - .content(jsonData) + .content(jsonObject) .param('xpath', '/') .param('observed-timestamp', observedTimestamp) ).andReturn().response then: 'the service method is invoked with expected parameters' - expectedApiCount * mockCpsDataService.updateNodeLeaves(dataspaceName, anchorName, '/', jsonData, + expectedApiCount * mockCpsDataService.updateNodeLeaves(dataspaceName, anchorName, '/', jsonString, { it == DateTimeUtility.toOffsetDateTime(observedTimestamp) }) and: 'response status indicates success' response.status == expectedHttpStatus.value() @@ -257,19 +254,18 @@ class DataRestControllerSpec extends Specification { } def 'Replace data node tree: #scenario.'() { - given: 'json data' - def jsonData = 'json data' + given: 'endpoint to replace node' def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes" when: 'put request is performed' def response = mvc.perform( put(endpoint) .contentType(MediaType.APPLICATION_JSON) - .content(jsonData) + .content(jsonObject) .param('xpath', inputXpath)) .andReturn().response then: 'the service method is invoked with expected parameters' - 1 * mockCpsDataService.replaceNodeTree(dataspaceName, anchorName, xpathServiceParameter, jsonData, noTimestamp) + 1 * mockCpsDataService.replaceNodeTree(dataspaceName, anchorName, xpathServiceParameter, jsonString, noTimestamp) and: 'response status indicates success' response.status == HttpStatus.OK.value() where: @@ -280,20 +276,19 @@ class DataRestControllerSpec extends Specification { } def 'Replace data node tree with observedTimestamp.'() { - given: 'json data' - def jsonData = 'json data' + given: 'endpoint to replace node' def endpoint = "$dataNodeBaseEndpoint/anchors/$anchorName/nodes" when: 'put request is performed' def response = mvc.perform( put(endpoint) .contentType(MediaType.APPLICATION_JSON) - .content(jsonData) + .content(jsonObject) .param('xpath', '') .param('observed-timestamp', observedTimestamp)) .andReturn().response then: 'the service method is invoked with expected parameters' - expectedApiCount * mockCpsDataService.replaceNodeTree(dataspaceName, anchorName, '/', jsonData, + expectedApiCount * mockCpsDataService.replaceNodeTree(dataspaceName, anchorName, '/', jsonString, { it == DateTimeUtility.toOffsetDateTime(observedTimestamp) }) and: 'response status indicates success' response.status == expectedHttpStatus.value() @@ -308,14 +303,14 @@ class DataRestControllerSpec extends Specification { def putRequestBuilder = put("$dataNodeBaseEndpoint/anchors/$anchorName/list-nodes") .contentType(MediaType.APPLICATION_JSON) .param('xpath', 'parent xpath') - .content('json data') + .content(jsonObject) if (observedTimestamp != null) putRequestBuilder.param('observed-timestamp', observedTimestamp) def response = mvc.perform(putRequestBuilder).andReturn().response then: 'a success response is returned' response.status == expectedHttpStatus.value() and: 'the java API was called with the correct parameters' - expectedApiCount * mockCpsDataService.replaceListContent(dataspaceName, anchorName, 'parent xpath', 'json data', + expectedApiCount * mockCpsDataService.replaceListContent(dataspaceName, anchorName, 'parent xpath', jsonString, { it == DateTimeUtility.toOffsetDateTime(observedTimestamp) }) where: scenario | observedTimestamp || expectedApiCount | expectedHttpStatus diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy index f5968442d..658dcaa70 100644 --- a/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy +++ b/cps-rest/src/test/groovy/org/onap/cps/rest/exceptions/CpsRestExceptionHandlerSpec.groovy @@ -163,7 +163,7 @@ class CpsRestExceptionHandlerSpec extends Specification { post("$basePath/v1/dataspaces/dataspace-name/anchors/anchor-name/nodes") .contentType(MediaType.APPLICATION_JSON) .param('xpath', 'parent node xpath') - .content('json data') + .content(groovy.json.JsonOutput.toJson('{"some-key" : "some-value"}')) ).andReturn().response then: 'response code indicates bad input parameters' response.status == BAD_REQUEST.value() diff --git a/csit/plans/cps/setup.sh b/csit/plans/cps/setup.sh index 1e27fb972..5b3fd9649 100755 --- a/csit/plans/cps/setup.sh +++ b/csit/plans/cps/setup.sh @@ -72,6 +72,7 @@ chmod +x docker-compose cd $WORKSPACE/archives git clone "https://gerrit.onap.org/r/cps/ncmp-dmi-plugin" mkdir -p $WORKSPACE/archives/dc-dmi +cat $WORKSPACE/archives/ncmp-dmi-plugin/docker-compose/docker-compose.yml cp $WORKSPACE/archives/ncmp-dmi-plugin/docker-compose/*.yml $WORKSPACE/archives/dc-dmi cd $WORKSPACE/archives/dc-dmi # download docker-compose of a required version (1.25.0 supports configuration of version 3.7) diff --git a/csit/plans/cps/test.properties b/csit/plans/cps/test.properties index 3e546fbec..53b7d40d0 100644 --- a/csit/plans/cps/test.properties +++ b/csit/plans/cps/test.properties @@ -23,4 +23,4 @@ DMI_SERVICE_URL=http://$LOCAL_IP:$DMI_PORT DOCKER_REPO=nexus3.onap.org:10003 CPS_VERSION=latest -DMI_VERSION=latest \ No newline at end of file +DMI_VERSION=1.1.0-SNAPSHOT-latest \ No newline at end of file