Support operation field for CPS Temporal Query Output API 29/126529/6
authorputhuparambil.aditya <aditya.puthuparambil@bell.ca>
Mon, 10 Jan 2022 12:58:37 +0000 (12:58 +0000)
committerputhuparambil.aditya <aditya.puthuparambil@bell.ca>
Wed, 12 Jan 2022 09:45:47 +0000 (09:45 +0000)
 - Update in openapi.yaml to support operation field
 - Repository test updated to test the operation field
 - Rest api test updated
 - Updates in documentation to include the operation field

Issue-ID: CPS-844
Signed-off-by: puthuparambil.aditya <aditya.puthuparambil@bell.ca>
Change-Id: If424c273b84b1f415ba706d0956f0841ce9c4196

docs/_static/event-schema/cps-data-updated-event-schema.json [moved from docs/_static/event-schema/cps-data-updated-event-schema-v1.json with 87% similarity]
docs/_static/openapi/swagger/openapi.yml
docs/content/deployment.rst
docs/content/modeling.rst
openapi/swagger/openapi.yml
src/test/groovy/org/onap/cps/temporal/controller/rest/QueryControllerSpec.groovy
src/test/groovy/org/onap/cps/temporal/repository/NetworkDataRepositoryImplSpec.groovy

@@ -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": {
           "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"
         }
         "observedTimestamp",
         "dataspaceName",
         "schemaSetName",
-        "anchorName",
-        "data"
+        "anchorName"
       ],
-      "additionalProperties": false
+      "additionalProperties": true
     },
 
     "Data": {
index 991d807..a96947b 100644 (file)
@@ -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'
index fd6fd59..0013466 100644 (file)
@@ -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
index 8871a81..e8c5345 100644 (file)
@@ -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
index 5b3578a..a96947b 100644 (file)
@@ -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'
index 7847b34..305a55b 100644 (file)
@@ -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
     }
index d33df75..ad7ea75 100644 (file)
@@ -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
             }
     }