aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToine Siebelink <toine.siebelink@est.tech>2022-01-13 10:05:29 +0000
committerGerrit Code Review <gerrit@onap.org>2022-01-13 10:05:29 +0000
commitfc0ec237b82e0e80685de45c8db5741638e031d7 (patch)
treedd8e8f47eac918425777d573e1d388a3d67115a1
parent38e50f6f932ab170203362ed6513d41f0e2d9b0f (diff)
parentcb23b1771e3fc552090f80791b852ce8ad05f150 (diff)
Merge "Support operation field for CPS Temporal Query Output API"
-rw-r--r--docs/_static/event-schema/cps-data-updated-event-schema.json (renamed from docs/_static/event-schema/cps-data-updated-event-schema-v1.json)14
-rw-r--r--docs/_static/openapi/swagger/openapi.yml19
-rw-r--r--docs/content/deployment.rst13
-rw-r--r--docs/content/modeling.rst28
-rw-r--r--openapi/swagger/openapi.yml8
-rw-r--r--src/test/groovy/org/onap/cps/temporal/controller/rest/QueryControllerSpec.groovy6
-rw-r--r--src/test/groovy/org/onap/cps/temporal/repository/NetworkDataRepositoryImplSpec.groovy5
7 files changed, 79 insertions, 14 deletions
diff --git a/docs/_static/event-schema/cps-data-updated-event-schema-v1.json b/docs/_static/event-schema/cps-data-updated-event-schema.json
index 2057955..94d8db8 100644
--- a/docs/_static/event-schema/cps-data-updated-event-schema-v1.json
+++ b/docs/_static/event-schema/cps-data-updated-event-schema.json
@@ -1,7 +1,7 @@
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
- "$id": "urn:cps:org.onap.cps:data-updated-event-schema:v1",
+ "$id": "urn:cps:org.onap.cps:data-updated-event-schema:v2",
"$ref": "#/definitions/CpsDataUpdatedEvent",
@@ -40,7 +40,7 @@
"type",
"content"
],
- "additionalProperties": false
+ "additionalProperties": true
},
"Content": {
@@ -63,6 +63,11 @@
"description": "The name of CPS Core anchor the data is attached to.",
"type": "string"
},
+ "operation": {
+ "description": "The operation on the data",
+ "type": "string",
+ "enum": ["CREATE", "UPDATE", "DELETE"]
+ },
"data": {
"$ref": "#/definitions/Data"
}
@@ -71,10 +76,9 @@
"observedTimestamp",
"dataspaceName",
"schemaSetName",
- "anchorName",
- "data"
+ "anchorName"
],
- "additionalProperties": false
+ "additionalProperties": true
},
"Data": {
diff --git a/docs/_static/openapi/swagger/openapi.yml b/docs/_static/openapi/swagger/openapi.yml
index 991d807..a96947b 100644
--- a/docs/_static/openapi/swagger/openapi.yml
+++ b/docs/_static/openapi/swagger/openapi.yml
@@ -1,5 +1,5 @@
# ============LICENSE_START=======================================================
-# Copyright (c) 2021 Bell Canada.
+# Copyright (c) 2021-2022 Bell Canada.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -51,6 +51,7 @@ paths:
required: true
schema:
type: string
+ example: my-anchor
- $ref: '#/components/parameters/observedTimestampAfter'
- $ref: '#/components/parameters/simplePayloadFilter'
- $ref: '#/components/parameters/pointInTime'
@@ -192,18 +193,30 @@ components:
application/json:
schema:
$ref: '#/components/schemas/ErrorMessage'
+ example:
+ status: 400
+ message: Bad request error message
+ details: Bad request 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
schemas:
AnchorDetails:
type: object
@@ -212,6 +225,10 @@ components:
observedTimestamp:
type: string
example: '2021-03-21T00:00:00.000-0000'
+ operation:
+ type: string
+ enum: [CREATE, UPDATE, DELETE]
+ example: UPDATE
dataspace:
type: string
example: 'my-dataspace'
diff --git a/docs/content/deployment.rst b/docs/content/deployment.rst
index fd6fd59..0013466 100644
--- a/docs/content/deployment.rst
+++ b/docs/content/deployment.rst
@@ -2,7 +2,7 @@
.. Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
..
-.. Copyright (C) 2021 Bell Canada
+.. Copyright (C) 2021-2022 Bell Canada
.. Modifications Copyright (C) 2021 Nordix Foundation
=======================
@@ -127,3 +127,14 @@ For development purposes, CPS Temporal can be ran on any environment using
Docker. Refer to `README.md <https://github.com/onap/cps-cps-temporal/blob/master/README.md>`_
and `docker-compose.yml <https://github.com/onap/cps-cps-temporal/blob/master/docker-compose.yml>`_
files for more details.
+
+Upgrade
+=======
+
+**Cps data-updated-event schema v2**
+
+Cps data-updated-event schema v2 used in Jakarta is backward compatible with data-updated-event schema v1 used in Istanbul.
+
+It means that consumers using the schema v2 can process events generated by producers using the schema v2 or v1.
+
+This implies that cps temporal (consumer) must be upgraded from Istanbul to Jakarta at the same time or before cps core (producer) is upgraded from Istanbul to Jakarta. \ No newline at end of file
diff --git a/docs/content/modeling.rst b/docs/content/modeling.rst
index 8871a81..e8c5345 100644
--- a/docs/content/modeling.rst
+++ b/docs/content/modeling.rst
@@ -2,7 +2,7 @@
.. Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
..
-.. Copyright (C) 2021 Bell Canada
+.. Copyright (C) 2021-2022 Bell Canada
=====================
CPS Temporal Modeling
@@ -14,19 +14,20 @@ Event Structure
Data manipulated by both CPS Core and CPS Temporal to represent a Data Updated
Event is a JSON structure that is defined by following Json Schema:
-* :download:`cps-data-updated-event-schema.json <../_static/event-schema/cps-data-updated-event-schema-v1.json>`
+* :download:`cps-data-updated-event-schema.json <../_static/event-schema/cps-data-updated-event-schema.json>`
And following is an example of an event compliant with this schema:
.. code:: json
{
- "schema": "urn:cps:org.onap.cps:data-updated-event-schema:v1",
+ "schema": "urn:cps:org.onap.cps:data-updated-event-schema:v2",
"id": "38aa6cc6-264d-4ede-b534-18f5c1f403ea",
"source": "urn:cps:org.onap.cps",
"type": "org.onap.cps.data-updated-event",
"content": {
"observedTimestamp": "2021-06-09T13:00:00.123-0400",
+ "operation": "UPDATE",
"dataspaceName": "my-dataspace",
"schemaSetName": "my-schema-set",
"anchorName": "my-anchor",
@@ -39,3 +40,24 @@ And following is an example of an event compliant with this schema:
}
}
+Event versions
+==============
+
+The following table lists the data-updated-event schema evolution over releases :
+
+ +-----------+------------+-------------------------+---------------------+
+ | Version | Release | Compatibility Type | Upgrade First |
+ | | | (with previous version) | |
+ +===========+============+=========================+=====================+
+ | v1 | Istanbul | n/a | Any order |
+ +-----------+------------+-------------------------+---------------------+
+ | v2 | Jakarta | Backward | Consumer (Temporal) |
+ +-----------+------------+-------------------------+---------------------+
+
+**Compatibility Types**
+
+Several compatibility types exist when an event schema definition is evolving from one release to the next one:
+
+- Backward compatibility means that consumers using the new schema can read data produced with the previous schema.
+- Forward compatibility means that data produced with a new schema can be read by consumers using the previous schema.
+- Full compatibility means that schemas are both backward and forward compatible: old data can be read with the new schema, and new data can also be read with the previous schema. \ No newline at end of file
diff --git a/openapi/swagger/openapi.yml b/openapi/swagger/openapi.yml
index 5b3578a..a96947b 100644
--- a/openapi/swagger/openapi.yml
+++ b/openapi/swagger/openapi.yml
@@ -1,5 +1,5 @@
# ============LICENSE_START=======================================================
-# Copyright (c) 2021 Bell Canada.
+# Copyright (c) 2021-2022 Bell Canada.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -194,7 +194,7 @@ components:
schema:
$ref: '#/components/schemas/ErrorMessage'
example:
- status: 400 BAD_REQUEST
+ status: 400
message: Bad request error message
details: Bad request error details
Unauthorized:
@@ -225,6 +225,10 @@ components:
observedTimestamp:
type: string
example: '2021-03-21T00:00:00.000-0000'
+ operation:
+ type: string
+ enum: [CREATE, UPDATE, DELETE]
+ example: UPDATE
dataspace:
type: string
example: 'my-dataspace'
diff --git a/src/test/groovy/org/onap/cps/temporal/controller/rest/QueryControllerSpec.groovy b/src/test/groovy/org/onap/cps/temporal/controller/rest/QueryControllerSpec.groovy
index 7847b34..305a55b 100644
--- a/src/test/groovy/org/onap/cps/temporal/controller/rest/QueryControllerSpec.groovy
+++ b/src/test/groovy/org/onap/cps/temporal/controller/rest/QueryControllerSpec.groovy
@@ -1,6 +1,6 @@
/*
* ============LICENSE_START=======================================================
- * Copyright (c) 2021 Bell Canada.
+ * Copyright (c) 2021-2022 Bell Canada.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,6 +22,8 @@ package org.onap.cps.temporal.controller.rest
import org.onap.cps.temporal.controller.utils.DateTimeUtility
import com.fasterxml.jackson.databind.ObjectMapper
+import org.onap.cps.temporal.domain.Operation
+
import java.time.OffsetDateTime
import org.onap.cps.temporal.controller.rest.model.AnchorDetails
import org.onap.cps.temporal.controller.rest.model.AnchorDetailsMapperImpl
@@ -239,6 +241,7 @@ class QueryControllerSpec extends Specification {
return NetworkData.builder().dataspace(myDataspace)
.schemaSet(mySchemaset).anchor(myAnchor).payload('{"message" : "Hello World"}')
.observedTimestamp(OffsetDateTime.now())
+ .operation(Operation.CREATE)
.createdTimestamp(OffsetDateTime.now()).build()
}
@@ -248,6 +251,7 @@ class QueryControllerSpec extends Specification {
anchorDetails.setAnchor(networkData.getAnchor())
anchorDetails.setSchemaSet(networkData.getSchemaSet())
anchorDetails.setObservedTimestamp(DateTimeUtility.toString(networkData.getObservedTimestamp()))
+ anchorDetails.setOperation(AnchorDetails.OperationEnum.valueOf(networkData.getOperation().toString()))
anchorDetails.setData(networkData.getPayload())
return anchorDetails
}
diff --git a/src/test/groovy/org/onap/cps/temporal/repository/NetworkDataRepositoryImplSpec.groovy b/src/test/groovy/org/onap/cps/temporal/repository/NetworkDataRepositoryImplSpec.groovy
index d33df75..ad7ea75 100644
--- a/src/test/groovy/org/onap/cps/temporal/repository/NetworkDataRepositoryImplSpec.groovy
+++ b/src/test/groovy/org/onap/cps/temporal/repository/NetworkDataRepositoryImplSpec.groovy
@@ -1,6 +1,6 @@
/*
* ============LICENSE_START=======================================================
- * Copyright (c) 2021 Bell Canada.
+ * Copyright (c) 2021-2022 Bell Canada.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +21,7 @@
package org.onap.cps.temporal.repository
import org.onap.cps.temporal.domain.NetworkData
+import org.onap.cps.temporal.domain.Operation
import org.onap.cps.temporal.domain.SearchCriteria
import org.onap.cps.temporal.repository.containers.TimescaleContainer
import org.springframework.beans.factory.annotation.Autowired
@@ -118,6 +119,7 @@ class NetworkDataRepositoryImplSpec extends Specification {
assert data.getObservedTimestamp().isAfter(observedAfter) || data.getObservedTimestamp().isEqual(observedAfter)
assert data.getAnchor() == queryAnchorName
assert data.getDataspace() == queryDataspaceName
+ assert data.getOperation() != null
}
}
@@ -141,6 +143,7 @@ class NetworkDataRepositoryImplSpec extends Specification {
assert data.getCreatedTimestamp().isBefore(createdBefore) || data.getCreatedTimestamp().isEqual(createdBefore)
assert data.getAnchor() == queryAnchorName
assert data.getDataspace() == queryDataspaceName
+ assert data.getOperation() != null
}
}