Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Issues & Decisions

#

Issue

Notes 

Decision

1Add or Delete leaves (optional leaves) handle as UPDATE or ADD/DELETE?

The delta report proposed follows the Json Patch format of representing the differences between 2 jsonbetween 2 JSON data. Apart from this the delta is dependent on individual data nodes of the JSON data, this is because the delta report will contain the action, xpath and the source/target data. And since the xpaths are unique to data nodes and not leaf data, every delta entity in delta report will be between 2 data nodes. Going by the general convention , and referring RFC-6902:

  • AddCreate: If a data node exists only in the target location in the source document specifies an object member that does not already exist, and a new member is added to the object, then its an add operation
  • Remove: if the target location in the source document already had a member and the member was removed from the target document then its remove operation
  • Replace/Update: If the target location specifies an object member that does exist, and that member's value is replaced, then its a replace operation
  • Here target location is equivalent to the path of particular leaf
  • So, there it should be Add/Delete.
  • Discussed in detail below
Add/Delete as per notes on the left
  • (target anchor or JSON payload) then it will be considered a 'create' action and all the leaf data under this data node and the child data nodes of the aforementioned data node will be considered as newly added data.
    • The child data nodes will be reported separately in the delta report because these data nodes can be individually identified with their unique xpaths.
  • Remove: If a data node exists only in the source location (source anchor) but is not in the target location (target anchor or JSON payload) then this will be considered as a 'remove' operation. All the leaf data under this data node and the child data nodes of the aforementioned data node will be considered as removed.
    • The child data nodes will be reported separately in the delta report because these data nodes can be individually identified with their unique xpaths.
  • Replace: If a data node exists both, in the source and target location then the individual leaf nodes of this data node are compared to find any changes in the data. If the data is changed then it is reported as a 'replace' action because leaf data of an already existing data node are updated here.
    • only the leaves which are added, deleted or modified are reported in delta report. Any unmodified leaf is not reported.
    • Child data nodes are evaluated individually, if a child node is added it's a 'create' action, if a child node is removed its 'remove' action and if a child node exists in both locations, then the leaves are evaluated for any changes which are reported as 'replace' action.
Updated as per notes.
2How to handle multiple changes at different levels?
Example: 
  • if you compare multiple levels and say a grandchild of a the node you are comparing has been added or deleted is that an UPDATE  or just a ADD/DELETE at that level

There could be Many more complex scenarios....

Replied below

Since the delta report will contain the xpaths of data nodes changed, so for changes at multiple levels i.e., parent and child data nodes, the approach will be to handle each data node individually and report them in the delta report. 

3More scenarios need to be explored and documented in detail. Such as handling arrays within a json, handling child/grandchild changes.
scenarios such as data nodes at multiple levels, arrays and lists are covered.

CPS Delta feature Exceptions

Where ever Wherever possible the Delta Feature will throw the same exceptions as defined in CPS core. If any new exception for the delta feature are is required, the following will be updated here.

HTTP response codes for Delta between 2 Anchors API

The proposed API will be part of the CPS Data Interface. The following response codes will be returned by the API:

#Sub InterfaceMethodScenario

HTTP Response codes

to be implemented

Notes
1Data

Proposed API:

GET-/v2/dataspaces/{dataspace-name}/anchors/{source-anchor-name}/delta?anchor2target-anchor-name={target-anchor-name}?xpath={xpath}&descendants={descendants}

Proposed method name:  getDeltaByDataspaceAndAnchors()

Generate a delta report between 2 anchors in a given dataspace.

  • 200 (OK)
    • success
  • 400
    • dataspace not found
      DataspaceNotFoundException
    • anchor not found
      AnchorNotFoundException
    • Data node not found
      DataNodeNotFoundException
    • invalid xpath
      CpsPathException
  • 500
    • unexpected error
AnchorNotFoundException should provide the name of missing anchor from the given two anchor names.

Request parameters:

Parameter nameInRequiredDescription
dataspace-namePathYesDataspace nameanchor1
source-anchor-namePathYesFirst Anchor Name/Reference Anchor
anchor2target-anchor-nameQueryYesSecond Anchor Name/Comparand Anchor
xpathQueryYesxpath of the node
descendantsQueryNoLevel of descendants for delta comparison. 

Response Body/Delta Report Format

Code Block
titleResponse body should contain anchors delta report (added/deleted/modified configuration) as below.
collapsetrue
[
  {
    "action": "ADDcreate",
    "xpath": "/bookstore/categories/[@code=3]",
    "target-data": {
      "code": 3,
      "name": "kidz"
    }
  },
  {
    "action": "DELETEremove",
    "xpath": "/bookstore/categories/[@code=1]",
    "source-data": {
      "code": 1,
      "name": "Fiction"
    }
  },
  {
    "action": "UPDATEreplace",
    "xpath": "/bookstore/categories/[@code=2]",
    "source-data": {
      "name": "Funny"
    },
    "target-data": {
      "name": "Comic"
    }
  }
]

Mechanism for Delta generation between Anchors

Gliffy
size600
displayNameCPS Delta Flowchart
nameCPS Delta Flowchart
pagePin

...

3

Additional Details

Format/Conventions to be used for Delta Report

There are several ways of representing the differences between JSON but here we discuss the JSON Patch format of representing these differences because the proposed Delta report closely represents JSON patch with a few differences. This approach focuses in producing another JSON document that represents the differences between the two JSON's that have been compared.

The delta report format is based on two RFCs namely RFC 6902 and RFC 9144 . A detailed comparison of the RFCs can be found here.

RFC 6902 JSON Patch

JSON Patch defines a JSON document structure for expressing a sequence a sequence of operations to apply to a JavaScript Object Notation(JSON) document; it is suitable for use with the HTTP PATCH method. The "application/json-patch+json" media type is used to identify such patch documents.

But in it can also be used to get the differences between two JSON as the JSON patch document represents an array of objects. where each object represents a single operation(op), path and value.

Here the The notation of "operation" is used as because the same JSON Patch document can be used to perform HTTP Patch operations. But The the operations field can be used as a reference to decide how the "action" field should function in the implementation of Delta report.

...

OperationDescriptionDelta report equivalent
addAdds the value at the target location; if the value exists in the given location, it’s replacedif the value is not present in the source json, but was found in the comparand target json, then it should be considered an a "addcreate" action.
removeRemoves the value at the target locationif a value was present at the source json, but was not found in the comparand target json, then it should be considered as "deleteremove" action.
replaceReplaces the value at the target locationif a value is present in the source json, but an updated value is present in the comparand target json, then it will be considered as "updatereplace" action.
moveRemoves the value at a specified location and adds it to the target locationN/A
copyCopies the value at a specified location to the target locationN/A
testTests that a value at the target location is equal to a specified valueN/A


Code Block
titleSample JSON Patch
collapsetrue
[
     { "op": "test", "path": "/a/b/c", "value": "foo" },
     { "op": "remove", "path": "/a/b/c" },
     { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] },
     { "op": "replace", "path": "/a/b/c", "value": 42 },
     { "op": "move", "from": "/a/b/c", "path": "/a/b/d" },
     { "op": "copy", "from": "/a/b/d", "path": "/a/b/e" }
   ]

RFC 9144 Data Model

RFC 9144 YANG data model that defines RPCs intended to be used in conjunction with NETCONF [RFC6241] or RESTCONF [RFC8040]. These RFCs allow a client to request a server to compare two NMDA datastores and report any differences.

Comparison of RFC 9144 Data Model and RFC6902 JSON Patch format

  • The core of the RFC 9144 solution is a new operator, <compare>, that compares the data tree contents of two datastores. The operation checks whether there are any differences in values or in data nodes that are contained in either datastore and then returns any differences as output. The output is returned in the format specified below.
  • The RFC6902 approach to Delta report generation follows the JSON patch format. A JSON Patch document represents an array of objects, where each object contains exactly one operation, path and associated values. The operation can have following values: add, remove, replace, move, copy and test. The path represents the JSON patch format and the values contain the difference in source and target values.


Code Block
titleSample delta as per RFC9144
collapsetrue
{ "ietf-nmda-compare:output" : {
    "differences" : {
      "ietf-yang-patch:yang-patch" : {
        "patch-id" : "interface status",
        "comment" : "diff between intended (source) and operational",
        "edit" : [
          {
            "edit-id" : "1",
            "operation" : "replace",
            "target" : "/ietf-interfaces:interface=eth0/enabled",
            "value" : {
               "ietf-interfaces:interface/enabled" : "false"
            },
            "source-value" : {
               "ietf-interfaces:interface/enabled" : "true",
               "@ietf-interfaces:interface/enabled" : {
                 "ietf-origin:origin" : "ietf-origin:learned"
               }
             }
          },
          {
            "edit-id" : "2",
            "operation" : "create",
            "target" : "/ietf-interfaces:interface=eth0/description",
            "value" : {
              "ietf-interface:interface/description" : "ip interface"
            }
          }
        ]
      }
    }
  }
}

 


Code Block
titleSample JSON Patch document as per RFC 6902 
collapsetrue
PATCH /my/data HTTP/1.1
   Host: example.org
   Content-Length: 326
   Content-Type: application/json-patch+json
   If-Match: "abc123"
 
   [
     { "op": "test", "path": "/a/b/c", "value": "foo" },
     { "op": "remove", "path": "/a/b/c" },
     { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] },
     { "op": "replace", "path": "/a/b/c", "value": 42 },
     { "op": "move", "from": "/a/b/c", "path": "/a/b/d" },
     { "op": "copy", "from": "/a/b/d", "path": "/a/b/e" }
   ]


CPS Delta Report Format

Based on the RFC documentations mentioned above, CPS Delta Report is designed in the format specified in the following code block. This Delta Report takes the features from both RFCs that are best suited for CPS and fulfill its requirements.

The format of Delta report has following key take aways from the above-mentioned RFCs:

  • The "op" field from RFC 6902 is replaced with "action" field because in CPS we want to report the action that was performed on the data. And this field can have 3 predefined values: create, remove and replace.
  • The xpath is used in CPS to uniquely identify individual data nodes and is used in place of JSON path as defined in the two RFCs
  • The source-data and target-data fields are used from RFC9144 to report the data that has been added, removed or updated. This approach properly categorizes the data instead of grouping it under the one "value" field as in RFC6902.
Code Block
titleDelta Report Format for CPS
collapsetrue
[
  {
    "action": "create",
    "xpath": "/bookstore/categories/[@code=3]",
    "target-data": {
      "code": "3,",
      "name": "kidz"
    }
  },
  {
    "action": "remove",
    "xpath": "/bookstore/categories/[@code=1]",
    "source-data": {
      "code": "1,",
      "name": "Fiction"
    }
  },
  {
    "action": "replace",
    "xpath": "/bookstore/categories/[@code=2]",
    "source-data": {
      "name": "Funny"
    },
    "target-data": {
      "name": "Comic"
    }
  }
]

Proposed Algorithm

The JSON data stored in CPS can be retrieved as Maps, And using this we can find the delta between two anchors retrieved as two separate Maps. The result can be stored in an JSON array with appropriate notations for action, xpath and payload. The following algorithm can be used to find the difference between the two maps and also recursively finds the difference between the child data nodes. The response is in form of a JSON Array which closely represents the JSON Patch format as described above.

Algorithm:

  1. Create an empty JSON Array, to store the result
    • The JSON array will contain the following: action, xpath, payload as individual JSON objects each object representing a singular operation.
  2. Fetch the data from two anchors and store in two separate Maps
  3. Iterate over the entries of first map
  4. For each entry of first map, check if the key is present in second map.
  5. If the key is not found in second map, it means that the key-value pair has been removed from the second map. Create a JSON Object with DELETE 'remove' action, the xpath to deleted node and payload. Add the Object to the JSON Array.
  6. If the key is present in the second map, compare the values associated with the keys in both maps.
  7. If the values are instance of Map, recursively call the comparision algorithm to compare all nested maps. Add all the necessary fields into a JSON object and put the object into the JSON Array
  8. If the values are not equal, it means the key-value pair was updated. Create a JSON Object with UPDATE 'replace' action, the xpath to updated nodes and payload. Add the Object to the JSON Array.
  9. Iterate over the keys of second map and find the keys not present in first map. These keys were added as new entries. Create a JSON Object with ADD 'create' action, the xpath to added node and payload. Add the Object to the JSON Array.
  10. Return the JSON Array and the updates to Kafka events

References/Future Changes