[NETCONF-1095] Fail to process PATCH with target containing a single forward slash Created: 19/Jul/23  Updated: 30/Aug/23  Resolved: 30/Aug/23

Status: Resolved
Project: netconf
Component/s: restconf-nb
Affects Version/s: 6.0.0, 5.0.6, 4.0.8
Fix Version/s: 7.0.0, 5.0.8, 6.0.2

Type: Bug Priority: Medium
Reporter: Sangwook Ha Assignee: Sangwook Ha
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

Controller fails to process a PATCH request where

  • target is set to a single forward slash (/)
  • Target data node resource of the URI is not a top-level node
  • Data is encoded in JSON

For example, the following PATCH request to update the configuration of NETCONF topology node

PATCH /rests/data/network-topology:network-topology/topology=topology-netconf/node=ncserver
Accept: application/yang-data+json
Content-Type: application/yang-patch+json

{
    "ietf-yang-patch:yang-patch": {
        "edit": [
            {
                "edit-id": "1",
                "operation": "merge",
                "target": "/",
                "value": {
                    "network-topology:node": [
                        {
                            "node-id": "ncserver",
                            "netconf-node-topology:keepalive-delay": 180
                        }
                    ]
                }
            }
        ],
        "patch-id": "1"
    }
}

triggers the following error:

{
    "errors": {
        "error": [
            {
                "error-tag": "malformed-message",
                "error-info": "Schema for node with name node and namespace urn:TBD:params:xml:ns:yang:network-topology does not exist at EffectiveSchemaContext{modules=[ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-app-config}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-cert}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-cert-mdsal}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-cert-rpc}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-encrypt-service-config}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-password-service-config}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=augment-iip-module}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=cluster-admin}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=distributed-datastore-provider}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-crypt-hash}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-encryption-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-key-exchange-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-mac-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-public-key-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-tls-cipher-suite-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-crypto-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-datastores}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-inet-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-keystore}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-acm}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-monitoring}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-nmda}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-notifications}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-with-defaults}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-origin}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-restconf}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-restconf-monitoring}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-ssh-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-ssh-common}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-ssh-server}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tcp-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tcp-common}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tcp-server}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tls-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tls-common}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tls-server}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-truststore}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-library}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-metadata}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-patch}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=instance-identifier-patch-module}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=nc-notifications}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=netconf-keystore}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=netconf-node-optional}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=netconf-node-topology}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=network-topology}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=notifications}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-controller-cds-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-device-notification}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-entity-owners}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-general-entity}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-netconf-device}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=sal-remote}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=sal-remote-augment}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=subscribe-to-notification}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=yang-ext}}]}",
                "error-message": "Error parsing json input: Schema for node with name node and namespace urn:TBD:params:xml:ns:yang:network-topology does not exist at EffectiveSchemaContext{modules=[ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-app-config}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-cert}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-cert-mdsal}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-cert-rpc}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-encrypt-service-config}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=aaa-password-service-config}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=augment-iip-module}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=cluster-admin}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=distributed-datastore-provider}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-crypt-hash}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-encryption-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-key-exchange-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-mac-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-ssh-public-key-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=iana-tls-cipher-suite-algs}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-crypto-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-datastores}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-inet-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-keystore}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-acm}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-monitoring}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-nmda}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-notifications}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-netconf-with-defaults}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-origin}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-restconf}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-restconf-monitoring}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-ssh-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-ssh-common}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-ssh-server}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tcp-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tcp-common}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tcp-server}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tls-client}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tls-common}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-tls-server}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-truststore}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-library}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-metadata}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-patch}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=ietf-yang-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=instance-identifier-patch-module}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=nc-notifications}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=netconf-keystore}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=netconf-node-optional}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=netconf-node-topology}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=network-topology}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=notifications}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-controller-cds-types}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-device-notification}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-entity-owners}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-general-entity}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=odl-netconf-device}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=sal-remote}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=sal-remote-augment}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=subscribe-to-notification}}, ModuleEffectiveStatementImpl{argument=Unqualified{localName=yang-ext}}]}",
                "error-type": "protocol"
            }
        ]
    }
}

Equivalent PATCH request in XML works without any error:

PATCH /rests/data/network-topology:network-topology/topology=topology-netconf/node=ncserver
Accept: application/yang-data+xml
Content-Type: application/yang-patch+xml

<yang-patch xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-patch">
    <patch-id>patch-1</patch-id>
    <edit>
        <edit-id>edit1</edit-id>
        <operation>merge</operation>
        <target>/</target>
        <value>
            <node xmlns="urn:TBD:params:xml:ns:yang:network-topology">
                <node-id>ncserver</node-id>
                <keepalive-delay xmlns="urn:opendaylight:netconf-node-topology">180</keepalive-delay>
            </node>
        </value>
    </edit>
</yang-patch>

RFC 8072 Section 2.4 Target Data Node

If the target resource specified in the request URI identifies a
datastore resource, then the path string in the "target" leaf is
treated as an absolute path expression identifying the target data
node for the corresponding edit. The first node specified in the
"target" leaf is a top-level data node defined within a YANG module.
The "target" leaf MUST NOT contain a single forward slash ("/"),
since this would identify the datastore resource, not a data
resource.

If the target resource specified in the request URI identifies a
configuration data resource, then the path string in the "target"
leaf is treated as a relative path expression. The first node
specified in the "target" leaf is a child configuration data node of
the data node associated with the target resource. If the "target"
leaf contains a single forward slash ("/"), then the target data node
is the target resource data node.



 Comments   
Comment by Sangwook Ha [ 20/Jul/23 ]

Tests to reproduce this issue: https://git.opendaylight.org/gerrit/c/netconf/+/106937/1

16:57:25 [ERROR] org.opendaylight.restconf.nb.rfc8040.jersey.providers.patch.JsonPatchBodyReaderTest.modulePatchTargetSecondLevelListWithFullPathURITest -- Time elapsed: 0.003 s <<< ERROR!
16:57:25 org.opendaylight.restconf.common.errors.RestconfDocumentedException: errors: [RestconfError [error-type: protocol, error-tag: malformed-message, error-message: Error parsing json input: Schema node with name my-list1 was not found under (urn:ietf:params:xml:ns:netconf:base:1.0)data., error-info: Schema node with name my-list1 was not found under (urn:ietf:params:xml:ns:netconf:base:1.0)data.]]
Generated at Wed Feb 07 20:16:39 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.