Analysis of RFC 9144 and RFC6902 for Delta Report generation
- 1 Overview
- 2 Open Questions/Issues/Decisions
- 3 Intention of RFC 9144
- 4 RFC 9144 Data Model and RFC6902 JSON Patch format
- 5 RFC 9144 example using RESTCONF
- 6 RESTCONF Example
- 6.1 Sample Data
- 6.1.1 Source Data
- 6.1.2 Target Data
- 6.2 Request in RESTCONF
- 6.2.1 POST Request
- 6.3 Response in RESTCONF
- 6.3.1 Response
- 6.1 Sample Data
- 7 Decisions
Overview
The following page discusses about two proposed standards for Delta report:
Open Questions/Issues/Decisions
Questions/Issues | Notes | Decisions |
---|---|---|
| Both RFC have their pros and cons.
| CPS delta report takes inspiration from both RFCs and cherry picks the best of both worlds to achieve its goals.
|
The documentation of RFC 9144 defines a POST operation to find the delta. The reason for this is, according to the approach both source and target data are sent as JSON payload (as seen in source and target fields). | Sample POST request from RFC9144POST /restconf/operations/ietf-nmda-compare:compare HTTP/1.1
Host: example.com
Content-Type: application/yang-data+json
Accept: application/yang-data+json
{ "ietf-nmda-compare:input" : {
"source" : "ietf-datastores:source",
"target" : "ietf-datastores:target",
"report-origin" : null,
"xpath-filter" : "/ietf-interfaces:interfaces"
}
} |
|
| CPS does not require persisting of the delta generated. So, only a few key points from this RFC are taken into consideration. Such as categorization of data as source and target data. |
Intention of RFC 9144
RFC 9144 model defines Remote Procedure Calls (RPCs) intended to be used in conjunction with NETCONF or RESTCONF. These RPCs allow a client to request a server to compare two NMDA datastores and report any differences.
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 returns any differences as output. The output is returned in the format specified in YANG Patch [RFC8072].
The RFC6902 approach of Delta 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 path and the values contain the difference in source and target values.
Brief summary of JSON patch can be found in the following page: CPS Delta: Conventions to be used for Delta Report
Example Delta generated as part of RFC9144 | Example JSON Patch document, transferred in an HTTP PATCH request: |
---|---|
Sample delta as per RFC9144{ "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"
}
}
]
}
}
}
} | Sample JSON Patch document as per RFC6902PATCH /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" }
] |
RFC 9144 example using RESTCONF
The model defines a <compare> operator used in an RPC. The operation takes the following input parameters:
source: the source datastore. This is comparable to source anchor or source data in CPS Delta feature.
target: the datastore to be compared against the source datastore. In CPS this will be the target anchor, or the JSON payload sent as part of delta request.
filter-spec: a path-based filter to specify the data nodes to be compared in a given datastore. This allows a comparison operation to be applied only to a specific part of the datastore that is of interest, such as a particular subtree. This is comparable to xpath in cps.
all: When set, this parameter indicates that all differences should be included, including differences pertaining to schema nodes that exist in only one of the datastores. When this parameter is not included, a prefiltering step is automatically applied to exclude data from the comparison that does not pertain to both datastores.
report-origin: this parameter is used to indicate whether to include origin or source data in delta report or not.
The operation provides the following output parameters:
differences: This parameter contains the list of differences. Those differences are encoded per the YANG Patch data model defined in [RFC8072]. And contain the following details:
edit-id: unique id given to a delta entity
operation: the type of operation, i.e create, remove or replace
target-value: data in target datastore
source-value: data in source datastore
Structure of ietf-nmda-compare. Source: RFC9144
module: ietf-nmda-compare
rpcs:
+---x compare
+---w input
| +---w source identityref
| +---w target identityref
| +---w all? empty
| +---w report-origin? empty
| +---w (filter-spec)?
| +--:(subtree-filter)
| | +---w subtree-filter?
| +--:(xpath-filter)
| +---w xpath-filter? yang:xpath1.0 {nc:xpath}?
+--ro output
+--ro (compare-response)?
+--:(no-matches)
| +--ro no-matches? empty
+--:(differences)
+--ro differences
+--ro yang-patch
+--ro patch-id string
+--ro comment? string
+--ro edit* [edit-id]
+--ro edit-id string
+--ro operation enumeration
+--ro target target-resource-offset
+--ro point? target-resource-offset
+--ro where? enumeration
+--ro value?
+--ro source-value?
RESTCONF Example
Sample Data
Source Data
{
"interfaces": {
"interface": {
"name": "eth0",
"enabled": false,
"description": "ip interface"
}
}
}
Target Data
{
"interfaces": {
"interface": {
"name": "eth0",
"enabled": true
}
}
}
Request in RESTCONF
POST Request
POST /restconf/operations/ietf-nmda-compare:compare HTTP/1.1
Host: example.com
Content-Type: application/yang-data+json
Accept: application/yang-data+json
{ "ietf-nmda-compare:input" : {
"source" : "ietf-datastores:source",
"target" : "ietf-datastores:target",
"report-origin" : null,
"path-filter" : "/ietf-interfaces:interfaces"
}
}
Response in RESTCONF
Response
HTTP/1.1 200 OK
Date: Thu, 24 Jan 2019 20:56:30 GMT
Server: example-server
Content-Type: application/yang-data+json
{ "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"
}
}
]
}
}
}
}
Decisions
The two RFCs used as reference for the delta feature have their own benefits and instead of following either of them as is, we decided to cherry pick the benefits of both the approaches to have the best suited Delta Report format for CPS.
The overall format of delta report closely resembles the format defined in RFC6902, this is because of the simplicity and minimal approach of this RFC while also providing all the necessary information in the delta report.
From RFC 6902 the following features have been chosen:
The fields in delta report will include action, xpath, source-data and target-data.
From RFC 9144 the following features have been chosen:
Instead of grouping the changes under one field named "values" as given in RFC 6902, we categorize then under source and target data.
The first API will be a GET operation as it does not require any payload as part of the request. But the second API will be a POST operation as it needs the user to send a JSON payload.