Versions Compared

Key

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

...

Questions/IssuesDecisions/Answers
How should the reporting of xPaths of newly added data nodes in JSON payload be done in a schema free approach for delta feature
Should the "descendants" option be provided as part of the API? The JSON payload may or may not contain all the child data nodes. Hence there is always the uncertainty. So, would it be a better approach to fetch all descendants always from the anchor and compare them against the JSON payload?

...

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

Reporting of xpaths in Delta between Anchor and JSON payload

In the first API for delta report generation, we have fetch the data nodes from 2 anchors and perform a comparison between each data node present under both anchors. The advantage of this approach is that we get information about the xpaths from the respective data node and hence we can report the Removed, Updated and Added xpaths in the delta report.


For the second API, we will have one anchor and a JSON payload, and here we need to perform the comparison between the data from an anchor and the json payload.

  • In order to do so we need to first parse the JSON string provided by the user to some Java Object for comparison with objects returned by the anchor.
  • To parse the JSON data we have following options:
    • Parse it to Data Nodes, but doing so requires us to provide the schema of the associated JSON data every time a request is made therefore making the approach schema dependent
    • Parsing to a generic Java object, like a Map, parsing the json data to a Java object would make the approach schema independent but in the process we cannot generate the xpaths of the data nodes present in the JSON payload, as the generation on xpaths is dependent on the Yang data model associated to the JSON
      • By not having the xpaths of all the data nodes of the JSON payload, we can only report the xpaths of Removed and Updated data nodes as those can be fetched from the data nodes present in the anchor. But the xpath of any data node newly added to the JSON payload cannot be generated without proper parsing against the schema model associated to the JSON.

Problems when parsing to a generic Java Object

  • When parsing the JSON string directly to a java objects we cannot generate the xpaths of all the data nodes present in the JSON payload.
  • Doing so brings its own challenges,
    • The comparison is dependent on xpaths, because in the current algorithm we use xpaths to identify the data nodes that have been Removed, Updated or Added, and then check for the changes in data present as leaf node in each data node.
    • So without the xpaths of the data nodes present in the JSON payload, we can only report the xpaths of data nodes that have been Removed or Updated, as those xpaths can be fetched from the data nodes present under the anchor, against which the JSON payload is being compared to.
    • But the xpath of any data node newly added to the JSON payload cannot be generated without proper parsing against the schema model associated to the JSON.
    • Also, we want the approach to be schema free, whereas the xpath building is a schema dependent activity as can be seen from the method in CPS

      Code Block
      public static String buildXpath(final YangInstanceIdentifier.PathArgument nodeIdentifier) {
              final StringBuilder xpathBuilder = new StringBuilder();
              xpathBuilder.append("/").append(nodeIdentifier.getNodeType().getLocalName());
      
              if (nodeIdentifier instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates) {
                  xpathBuilder.append(getKeyAttributesStatement(
                      (YangInstanceIdentifier.NodeIdentifierWithPredicates) nodeIdentifier));
              }
              return xpathBuilder.toString();
          }

    • A few workarounds to this approach can be:
      • Limiting the delta between Anchor and JSON payload to only one DataNode, by doing so we can always know that the xpath is limited to one, as it is also provided as part of the request to fetch the data node from the anchor.
      • using alternative paths for delta between anchor and JSON payload like JSON path
      • Not reporting the xpaths in the delta report between anchor and JSON payload

Pros and Cons of each workaround

WorkaroundProsConsNotes
Limiting the delta between Anchor and JSON payload to only one DataNodeThe DeltaReport will be consistent with the existing API i.e., Delta between 2 anchors
  • Limited to only 1 data node at a time


Using alternative paths, like JSON pathThe delta report will have xpaths replaced by JSON path
  • CPS is dependent and built around xpath, hence this will be a major inconsistency
  • If implemented, we will need to generate JSON paths for both, the data from anchor and the JSON payload,
  • making the operation more expensive

Not reporting the xpaths in the delta report between anchor and JSON payloadCan be implemented for multiple data nodes
  • Delta report will be inconsistent and not as per the RFC standard
  • It is inconsistent with respect to the existing API of delta report.

Mechanism for Delta generation between Anchor and Payload