dryRunInQuery:
name: dry-run
in: query
- description: Boolean flag to validate data, without persisting it. Default value is set to false.
+ description: Boolean flag to validate data, without persisting it. Default value is false.
required: false
schema:
type: boolean
- $ref: 'components.yml#/components/parameters/dataspaceNameInPath'
- $ref: 'components.yml#/components/parameters/anchorNameInPath'
- $ref: 'components.yml#/components/parameters/requiredXpathInQuery'
+ - $ref: 'components.yml#/components/parameters/dryRunInQuery'
- $ref: 'components.yml#/components/parameters/observedTimestampInQuery'
- $ref: 'components.yml#/components/parameters/contentTypeInHeader'
requestBody:
- $ref: 'components.yml#/components/parameters/dataspaceNameInPath'
- $ref: 'components.yml#/components/parameters/anchorNameInPath'
- $ref: 'components.yml#/components/parameters/requiredXpathInQuery'
+ - $ref: 'components.yml#/components/parameters/dryRunInQuery'
- $ref: 'components.yml#/components/parameters/observedTimestampInQuery'
- $ref: 'components.yml#/components/parameters/contentTypeInHeader'
requestBody:
- $ref: 'components.yml#/components/parameters/dataspaceNameInPath'
- $ref: 'components.yml#/components/parameters/anchorNameInPath'
- $ref: 'components.yml#/components/parameters/xpathInQuery'
+ - $ref: 'components.yml#/components/parameters/dryRunInQuery'
- $ref: 'components.yml#/components/parameters/observedTimestampInQuery'
- $ref: 'components.yml#/components/parameters/contentTypeInHeader'
requestBody:
- $ref: 'components.yml#/components/parameters/dataspaceNameInPath'
- $ref: 'components.yml#/components/parameters/anchorNameInPath'
- $ref: 'components.yml#/components/parameters/xpathInQuery'
+ - $ref: 'components.yml#/components/parameters/dryRunInQuery'
- $ref: 'components.yml#/components/parameters/observedTimestampInQuery'
- $ref: 'components.yml#/components/parameters/contentTypeInHeader'
requestBody:
@Override
public ResponseEntity<String> addListElements(final String apiVersion, final String dataspaceName,
final String anchorName, final String parentNodeXpath,
- final String nodeData, final String observedTimestamp,
- final String contentTypeInHeader) {
+ final String nodeData, final Boolean dryRunEnabled,
+ final String observedTimestamp, final String contentTypeInHeader) {
final ContentType contentType = ContentType.fromString(contentTypeInHeader);
- cpsDataService.saveListElements(dataspaceName, anchorName, parentNodeXpath,
- nodeData, toOffsetDateTime(observedTimestamp), contentType);
- return new ResponseEntity<>(HttpStatus.CREATED);
+ if (Boolean.TRUE.equals(dryRunEnabled)) {
+ cpsDataService.validateData(dataspaceName, anchorName, parentNodeXpath, nodeData, contentType);
+ return ResponseEntity.ok().build();
+ } else {
+ cpsDataService.saveListElements(dataspaceName, anchorName, parentNodeXpath,
+ nodeData, toOffsetDateTime(observedTimestamp), contentType);
+ }
+ return ResponseEntity.status(HttpStatus.CREATED).build();
}
@Override
@Override
public ResponseEntity<Object> updateNodeLeaves(final String apiVersion, final String dataspaceName,
final String anchorName, final String nodeData,
- final String parentNodeXpath, final String observedTimestamp,
- final String contentTypeInHeader) {
+ final String parentNodeXpath, final Boolean dryRunEnabled,
+ final String observedTimestamp, final String contentTypeInHeader) {
final ContentType contentType = ContentType.fromString(contentTypeInHeader);
- cpsDataService.updateNodeLeaves(dataspaceName, anchorName, parentNodeXpath,
- nodeData, toOffsetDateTime(observedTimestamp), contentType);
- return new ResponseEntity<>(HttpStatus.OK);
+ if (Boolean.TRUE.equals(dryRunEnabled)) {
+ cpsDataService.validateData(dataspaceName, anchorName, parentNodeXpath, nodeData, contentType);
+ return ResponseEntity.ok().build();
+ } else {
+ cpsDataService.updateNodeLeaves(dataspaceName, anchorName, parentNodeXpath,
+ nodeData, toOffsetDateTime(observedTimestamp), contentType);
+ }
+ return ResponseEntity.status(HttpStatus.OK).build();
}
@Override
public ResponseEntity<Object> replaceNode(final String apiVersion, final String dataspaceName,
final String anchorName, final String nodeData,
- final String parentNodeXpath, final String observedTimestamp,
- final String contentTypeInHeader) {
+ final String parentNodeXpath, final Boolean dryRunEnabled,
+ final String observedTimestamp, final String contentTypeInHeader) {
final ContentType contentType = ContentType.fromString(contentTypeInHeader);
- cpsDataService.updateDataNodeAndDescendants(dataspaceName, anchorName, parentNodeXpath,
- nodeData, toOffsetDateTime(observedTimestamp), contentType);
- return new ResponseEntity<>(HttpStatus.OK);
+ if (Boolean.TRUE.equals(dryRunEnabled)) {
+ cpsDataService.validateData(dataspaceName, anchorName, parentNodeXpath, nodeData, contentType);
+ return ResponseEntity.ok().build();
+ } else {
+ cpsDataService.updateDataNodeAndDescendants(dataspaceName, anchorName, parentNodeXpath,
+ nodeData, toOffsetDateTime(observedTimestamp), contentType);
+ }
+ return ResponseEntity.status(HttpStatus.OK).build();
}
@Override
public ResponseEntity<Object> replaceListContent(final String apiVersion, final String dataspaceName,
final String anchorName, final String parentNodeXpath,
- final String nodeData, final String observedTimestamp,
- final String contentTypeInHeader) {
+ final String nodeData, final Boolean dryRunEnabled,
+ final String observedTimestamp, final String contentTypeInHeader) {
final ContentType contentType = ContentType.fromString(contentTypeInHeader);
- cpsDataService.replaceListContent(dataspaceName, anchorName, parentNodeXpath,
- nodeData, toOffsetDateTime(observedTimestamp), contentType);
- return new ResponseEntity<>(HttpStatus.OK);
+ if (Boolean.TRUE.equals(dryRunEnabled)) {
+ cpsDataService.validateData(dataspaceName, anchorName, parentNodeXpath, nodeData,
+ ContentType.JSON);
+ return ResponseEntity.ok().build();
+ } else {
+ cpsDataService.replaceListContent(dataspaceName, anchorName, parentNodeXpath,
+ nodeData, toOffsetDateTime(observedTimestamp), contentType);
+ }
+ return ResponseEntity.status(HttpStatus.OK).build();
}
@Override
given: 'an endpoint to create a node'
def endpoint = "$dataNodeBaseEndpointV1/anchors/$anchorName/nodes"
def parentNodeXpath = '/'
+ and: 'dryRunEnabled flag is set to true'
def dryRunEnabled = 'true'
when: 'post is invoked with json data and dry-run flag enabled'
def response =
- mvc.perform(
- post(endpoint)
- .contentType(MediaType.APPLICATION_JSON)
- .param('xpath', parentNodeXpath)
- .param('dry-run', dryRunEnabled)
- .content(requestBodyJson)
- ).andReturn().response
+ mvc.perform(
+ post(endpoint)
+ .contentType(MediaType.APPLICATION_JSON)
+ .param('xpath', parentNodeXpath)
+ .param('dry-run', dryRunEnabled)
+ .content(requestBodyJson)
+ ).andReturn().response
then: 'a 200 OK response is returned'
response.status == HttpStatus.OK.value()
then: 'the service was called with correct parameters'
'Content type XML with invalid observed-timestamp' | 'invalid' | MediaType.APPLICATION_XML | requestBodyXml || 0 | HttpStatus.BAD_REQUEST | expectedXmlData | ContentType.XML
}
+ def 'Validate data using Save list elements API'() {
+ given: 'endpoint to save list elements'
+ def endpoint = "$dataNodeBaseEndpointV1/anchors/$anchorName/list-nodes"
+ and: 'dryRunEnabled flag is set to true'
+ def dryRunEnabled = 'true'
+ when: 'post request is performed'
+ def response =
+ mvc.perform(
+ post(endpoint)
+ .contentType(MediaType.APPLICATION_JSON)
+ .param('xpath', '/')
+ .content(requestBodyJson)
+ .param('dry-run', dryRunEnabled)
+ ).andReturn().response
+ then: 'a 200 OK response is returned'
+ response.status == HttpStatus.OK.value()
+ then: 'the service was called with correct parameters'
+ 1 * mockCpsDataService.validateData(dataspaceName, anchorName, '/', requestBodyJson, ContentType.JSON)
+ }
+
def 'Get data node with leaves'() {
given: 'the service returns data node leaves'
def xpath = 'parent-1'
'with invalid observed-timestamp' | 'invalid' || 0 | HttpStatus.BAD_REQUEST
}
+ def 'Validate data using Update a node API'() {
+ given: 'endpoint to update a node leaves'
+ def endpoint = "$dataNodeBaseEndpointV1/anchors/$anchorName/nodes"
+ and: 'dryRunEnabled flag is set to true'
+ def dryRunEnabled = 'true'
+ when: 'patch request is performed'
+ def response =
+ mvc.perform(
+ patch(endpoint)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBodyJson)
+ .param('xpath', '/')
+ .param('dry-run', dryRunEnabled)
+ ).andReturn().response
+ then: 'a 200 OK response is returned'
+ response.status == HttpStatus.OK.value()
+ then: 'the service was called with correct parameters'
+ 1 * mockCpsDataService.validateData(dataspaceName, anchorName, '/', requestBodyJson, ContentType.JSON)
+ }
+
def 'Replace data node tree: #scenario.'() {
given: 'endpoint to replace node'
def endpoint = "$dataNodeBaseEndpointV1/anchors/$anchorName/nodes"
'XML content: some xpath by parent' | '/some/xpath' | MediaType.APPLICATION_XML || '/some/xpath' | requestBodyXml | expectedXmlData | ContentType.XML
}
+ def 'Validate data using Replace data node API'() {
+ given: 'endpoint to replace node'
+ def endpoint = "$dataNodeBaseEndpointV1/anchors/$anchorName/nodes"
+ and: 'dryRunEnabled flag is set to true'
+ def dryRunEnabled = 'true'
+ when: 'put request is performed'
+ def response =
+ mvc.perform(
+ put(endpoint)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(requestBodyJson)
+ .param('xpath', '/')
+ .param('dry-run', dryRunEnabled)
+ ).andReturn().response
+ then: 'a 200 OK response is returned'
+ response.status == HttpStatus.OK.value()
+ then: 'the service was called with correct parameters'
+ 1 * mockCpsDataService.validateData(dataspaceName, anchorName, '/', requestBodyJson, ContentType.JSON)
+ }
+
def 'Update data node and descendants with observedTimestamp.'() {
given: 'endpoint to replace node'
def endpoint = "$dataNodeBaseEndpointV1/anchors/$anchorName/nodes"
'with invalid observed-timestamp' | 'invalid' || 0 | HttpStatus.BAD_REQUEST
}
+ def 'Validate data using Replace list content API'() {
+ given: 'endpoint to replace list-nodes'
+ def endpoint = "$dataNodeBaseEndpointV1/anchors/$anchorName/list-nodes"
+ and: 'dryRunEnabled flag is set to true'
+ def dryRunEnabled = 'true'
+ when: 'put request is performed'
+ def response =
+ mvc.perform(
+ put(endpoint)
+ .contentType(MediaType.APPLICATION_JSON)
+ .param('xpath', '/')
+ .content(requestBodyJson)
+ .param('dry-run', dryRunEnabled)
+ ).andReturn().response
+ then: 'a 200 OK response is returned'
+ response.status == HttpStatus.OK.value()
+ then: 'the service was called with correct parameters'
+ 1 * mockCpsDataService.validateData(dataspaceName, anchorName, '/', requestBodyJson, ContentType.JSON)
+ }
+
def 'Delete list element #scenario.'() {
when: 'list-nodes endpoint is invoked with delete operation'
def deleteRequestBuilder = delete("$dataNodeBaseEndpointV1/anchors/$anchorName/list-nodes")
schema:
default: /
type: string
+ - description: "Boolean flag to validate data, without persisting it. Default\
+ \ value is false."
+ in: query
+ name: dry-run
+ required: false
+ schema:
+ default: false
+ example: false
+ type: boolean
- description: observed-timestamp
in: query
name: observed-timestamp
default: /
type: string
- description: "Boolean flag to validate data, without persisting it. Default\
- \ value is set to false."
+ \ value is false."
in: query
name: dry-run
required: false
schema:
default: /
type: string
+ - description: "Boolean flag to validate data, without persisting it. Default\
+ \ value is false."
+ in: query
+ name: dry-run
+ required: false
+ schema:
+ default: false
+ example: false
+ type: boolean
- description: observed-timestamp
in: query
name: observed-timestamp
required: true
schema:
type: string
+ - description: "Boolean flag to validate data, without persisting it. Default\
+ \ value is false."
+ in: query
+ name: dry-run
+ required: false
+ schema:
+ default: false
+ example: false
+ type: boolean
- description: observed-timestamp
in: query
name: observed-timestamp
required: true
schema:
type: string
+ - description: "Boolean flag to validate data, without persisting it. Default\
+ \ value is false."
+ in: query
+ name: dry-run
+ required: false
+ schema:
+ default: false
+ example: false
+ type: boolean
- description: observed-timestamp
in: query
name: observed-timestamp
- application/json
- application/xml
type: string
- observedTimestampInQuery:
- description: observed-timestamp
- in: query
- name: observed-timestamp
- required: false
- schema:
- example: 2021-03-21T00:10:34.030-0100
- type: string
dryRunInQuery:
description: "Boolean flag to validate data, without persisting it. Default\
- \ value is set to false."
+ \ value is false."
in: query
name: dry-run
required: false
default: false
example: false
type: boolean
+ observedTimestampInQuery:
+ description: observed-timestamp
+ in: query
+ name: observed-timestamp
+ required: false
+ schema:
+ example: 2021-03-21T00:10:34.030-0100
+ type: string
requiredXpathInQuery:
description: "For more details on xpath, please refer https://docs.onap.org/projects/onap-cps/en/latest/xpath.html"
examples: