Uploaded image for project: 'netconf'
  1. netconf
  2. NETCONF-1095

Fail to process PATCH with target containing a single forward slash

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Medium Medium
    • 7.0.0, 5.0.8, 6.0.2
    • 6.0.0, 5.0.6, 4.0.8
    • restconf-nb
    • None

      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.

            sangwookha Sangwook Ha
            sangwookha Sangwook Ha
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: