printer & parser json BUGFIX anyxml node
Anyxml was processed exactly as anydata,
which is completely wrong and is more
similar to leaf.
Refs #1762
diff --git a/tests/modules/yang/ietf-netconf-nmda@2019-01-07.yang b/tests/modules/yang/ietf-netconf-nmda@2019-01-07.yang
new file mode 100644
index 0000000..31dce50
--- /dev/null
+++ b/tests/modules/yang/ietf-netconf-nmda@2019-01-07.yang
@@ -0,0 +1,385 @@
+ module ietf-netconf-nmda {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-nmda";
+ prefix ncds;
+
+ import ietf-yang-types {
+ prefix yang;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+ import ietf-inet-types {
+ prefix inet;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+ import ietf-datastores {
+ prefix ds;
+ reference
+ "RFC 8342: Network Management Datastore Architecture
+ (NMDA)";
+ }
+ import ietf-origin {
+ prefix or;
+ reference
+ "RFC 8342: Network Management Datastore Architecture
+ (NMDA)";
+ }
+ import ietf-netconf {
+ prefix nc;
+ reference
+ "RFC 6241: Network Configuration Protocol (NETCONF)";
+ }
+ import ietf-netconf-with-defaults {
+ prefix ncwd;
+ reference
+ "RFC 6243: With-defaults Capability for NETCONF";
+ }
+
+ organization
+ "IETF NETCONF Working Group";
+
+ contact
+ "WG Web: <https://datatracker.ietf.org/wg/netconf/>
+
+ WG List: <mailto:netconf@ietf.org>
+
+ Author: Martin Bjorklund
+ <mailto:mbj@tail-f.com>
+
+ Author: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Author: Phil Shafer
+ <mailto:phil@juniper.net>
+
+ Author: Kent Watsen
+ <mailto:kent+ietf@watsen.net>
+
+ Author: Robert Wilton
+ <mailto:rwilton@cisco.com>";
+ description
+ "This YANG module defines a set of NETCONF operations to support
+ the Network Management Datastore Architecture (NMDA).
+
+ The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
+ NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
+ 'MAY', and 'OPTIONAL' in this document are to be interpreted as
+ described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
+ they appear in all capitals, as shown here.
+
+ Copyright (c) 2019 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject to
+ the license terms contained in, the Simplified BSD License set
+ forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (https://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 8526; see
+ the RFC itself for full legal notices.";
+
+ revision 2019-01-07 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8526: NETCONF Extensions to Support the Network Management
+ Datastore Architecture";
+ }
+
+ feature origin {
+ description
+ "Indicates that the server supports the 'origin' annotation.";
+ reference
+ "RFC 8342: Network Management Datastore Architecture (NMDA)";
+ }
+
+ feature with-defaults {
+ description
+ "NETCONF :with-defaults capability. If the server advertises
+ the :with-defaults capability for a session, then this
+ feature must also be enabled for that session. Otherwise,
+ this feature must not be enabled.";
+ reference
+ "RFC 6243: With-defaults Capability for NETCONF, Section 4; and
+ RFC 8526: NETCONF Extensions to Support the Network Management
+ Datastore Architecture, Section 3.1.1.2";
+ }
+
+ rpc get-data {
+ description
+ "Retrieve data from an NMDA datastore. The content returned
+ by get-data must satisfy all filters, i.e., the filter
+ criteria are logically ANDed.
+
+ Any ancestor nodes (including list keys) of nodes selected by
+ the filters are included in the response.
+
+ The 'with-origin' parameter is only valid for an operational
+ datastore. If 'with-origin' is used with an invalid
+ datastore, then the server MUST return an <rpc-error> element
+ with an <error-tag> value of 'invalid-value'.
+
+ The 'with-defaults' parameter only applies to the operational
+ datastore if the NETCONF :with-defaults and
+ :with-operational-defaults capabilities are both advertised.
+ If the 'with-defaults' parameter is present in a request for
+ which it is not supported, then the server MUST return an
+ <rpc-error> element with an <error-tag> value of
+ 'invalid-value'.";
+ input {
+ leaf datastore {
+ type ds:datastore-ref;
+ mandatory true;
+ description
+ "Datastore from which to retrieve data.
+
+ If the datastore is not supported by the server, then the
+ server MUST return an <rpc-error> element with an
+ <error-tag> value of 'invalid-value'.";
+ }
+ choice filter-spec {
+ description
+ "The content filter specification for this request.";
+ anydata subtree-filter {
+ description
+ "This parameter identifies the portions of the
+ target datastore to retrieve.";
+ reference
+ "RFC 6241: Network Configuration Protocol (NETCONF),
+ Section 6";
+ }
+ leaf xpath-filter {
+ if-feature "nc:xpath";
+ type yang:xpath1.0;
+ description
+ "This parameter contains an XPath expression identifying
+ the portions of the target datastore to retrieve.
+
+ If the expression returns a node-set, all nodes in the
+ node-set are selected by the filter. Otherwise, if the
+ expression does not return a node-set, then the
+ <get-data> operation fails.
+
+ The expression is evaluated in the following XPath
+ context:
+
+ o The set of namespace declarations are those in
+ scope on the 'xpath-filter' leaf element.
+
+ o The set of variable bindings is empty.
+
+ o The function library is the core function library,
+ and the XPath functions are defined in Section 10
+ of RFC 7950.
+
+ o The context node is the root node of the target
+ datastore.";
+ }
+ }
+ leaf config-filter {
+ type boolean;
+ description
+ "Filter for nodes with the given value for their 'config'
+ property. When this leaf is set to 'true', only 'config
+ true' nodes are selected, and when set to 'false', only
+ 'config false' nodes are selected. If this leaf is not
+ present, no nodes are filtered.";
+ }
+ choice origin-filters {
+ when 'derived-from-or-self(datastore, "ds:operational")';
+ if-feature "origin";
+ description
+ "Filters configuration nodes based on the 'origin'
+ annotation. Configuration nodes that do not have an
+ 'origin' annotation are treated as if they have the
+ 'origin' annotation 'or:unknown'.
+
+ System state nodes are not affected by origin-filters and
+ thus not filtered. Note that system state nodes can be
+ filtered with the 'config-filter' leaf.";
+
+ leaf-list origin-filter {
+ type or:origin-ref;
+ description
+ "Filter based on the 'origin' annotation. A
+ configuration node matches the filter if its 'origin'
+ annotation is derived from or equal to any of the given
+ filter values.";
+ }
+ leaf-list negated-origin-filter {
+ type or:origin-ref;
+ description
+ "Filter based on the 'origin' annotation. A
+ configuration node matches the filter if its 'origin'
+ annotation is neither derived from nor equal to any of
+ the given filter values.";
+ }
+ }
+ leaf max-depth {
+ type union {
+ type uint16 {
+ range "1..65535";
+ }
+ type enumeration {
+ enum unbounded {
+ description
+ "All descendant nodes are included.";
+ }
+ }
+ }
+ default "unbounded";
+ description
+ "For each node selected by the filters, this parameter
+ selects how many conceptual subtree levels should be
+ returned in the reply. If the depth is 1, the reply
+ includes just the selected nodes but no children. If the
+ depth is 'unbounded', all descendant nodes are included.";
+ }
+ leaf with-origin {
+ when 'derived-from-or-self(../datastore, "ds:operational")';
+ if-feature "origin";
+ type empty;
+ description
+ "If this parameter is present, the server will return
+ the 'origin' annotation for the nodes that have one.";
+ }
+ uses ncwd:with-defaults-parameters {
+ if-feature "with-defaults";
+ }
+ }
+ output {
+ anydata data {
+ description
+ "Copy of the source datastore subset that matched
+ the filter criteria (if any). An empty data
+ container indicates that the request did not
+ produce any results.";
+ }
+ }
+ }
+
+ rpc edit-data {
+ description
+ "Edit data in an NMDA datastore.
+
+ If an error condition occurs such that an error severity
+ <rpc-error> element is generated, the server will stop
+ processing the <edit-data> operation and restore the
+ specified configuration to its complete state at
+ the start of this <edit-data> operation.";
+ input {
+ leaf datastore {
+ type ds:datastore-ref;
+ mandatory true;
+ description
+ "Datastore that is the target of the <edit-data> operation.
+
+ If the target datastore is not writable, or is not
+ supported by the server, then the server MUST return an
+ <rpc-error> element with an <error-tag> value of
+ 'invalid-value'.";
+ }
+ leaf default-operation {
+ type enumeration {
+ enum merge {
+ description
+ "The default operation is merge.";
+ }
+ enum replace {
+ description
+ "The default operation is replace.";
+ }
+ enum none {
+ description
+ "There is no default operation.";
+ }
+ }
+ default "merge";
+ description
+ "The default operation to use.";
+ }
+ choice edit-content {
+ mandatory true;
+ description
+ "The content for the edit operation.";
+ anydata config {
+ description
+ "Inline config content.";
+ }
+ leaf url {
+ if-feature "nc:url";
+ type inet:uri;
+ description
+ "URL-based config content.";
+ }
+ }
+ }
+ }
+
+ /*
+ * Augment the <lock> and <unlock> operations with a
+ * "datastore" parameter.
+ */
+
+ augment "/nc:lock/nc:input/nc:target/nc:config-target" {
+ description
+ "Add NMDA datastore as target.";
+ leaf datastore {
+ type ds:datastore-ref;
+ description
+ "Datastore to lock.
+
+ The <lock> operation is only supported on writable
+ datastores.
+
+ If the <lock> operation is not supported by the server on
+ the specified target datastore, then the server MUST return
+ an <rpc-error> element with an <error-tag> value of
+ 'invalid-value'.";
+ }
+ }
+
+ augment "/nc:unlock/nc:input/nc:target/nc:config-target" {
+ description
+ "Add NMDA datastore as target.";
+ leaf datastore {
+ type ds:datastore-ref;
+ description
+ "Datastore to unlock.
+
+ The <unlock> operation is only supported on writable
+ datastores.
+
+ If the <unlock> operation is not supported by the server on
+ the specified target datastore, then the server MUST return
+ an <rpc-error> element with an <error-tag> value of
+ 'invalid-value'.";
+ }
+ }
+
+ /*
+ * Augment the <validate> operation with a
+ * "datastore" parameter.
+ */
+
+ augment "/nc:validate/nc:input/nc:source/nc:config-source" {
+ description
+ "Add NMDA datastore as source.";
+ leaf datastore {
+ type ds:datastore-ref;
+ description
+ "Datastore to validate.
+
+ The <validate> operation is supported only on configuration
+ datastores.
+
+ If the <validate> operation is not supported by the server
+ on the specified target datastore, then the server MUST
+ return an <rpc-error> element with an <error-tag> value of
+ 'invalid-value'.";
+ }
+ }
+ }
diff --git a/tests/utests/data/test_parser_json.c b/tests/utests/data/test_parser_json.c
index 6a50913..92cbe2c 100644
--- a/tests/utests/data/test_parser_json.c
+++ b/tests/utests/data/test_parser_json.c
@@ -496,15 +496,18 @@
struct ly_in *in;
struct lyd_node *tree, *op;
const struct lyd_node *node;
- const char *dsc = "The <edit-config> operation loads all or part of a specified\n"
- "configuration to the specified target configuration.";
- const char *ref = "RFC 6241, Section 7.2";
- const char *feats[] = {"writable-running", NULL};
+ const char *dsc = "Edit data in an NMDA datastore.\n"
+ "\n"
+ "If an error condition occurs such that an error severity\n"
+ "<rpc-error> element is generated, the server will stop\n"
+ "processing the <edit-data> operation and restore the\n"
+ "specified configuration to its complete state at\n"
+ "the start of this <edit-data> operation.";
- assert_non_null((ly_ctx_load_module(UTEST_LYCTX, "ietf-netconf", "2011-06-01", feats)));
+ assert_non_null((ly_ctx_load_module(UTEST_LYCTX, "ietf-netconf-nmda", "2019-01-07", NULL)));
- data = "{\"ietf-netconf:edit-config\":{"
- "\"target\":{\"running\":[null]},"
+ data = "{\"ietf-netconf-nmda:edit-data\":{"
+ "\"datastore\":\"ietf-datastores:running\","
"\"config\":{\"a:cp\":{\"z\":[null],\"@z\":{\"ietf-netconf:operation\":\"replace\"}},"
"\"a:l1\":[{\"@\":{\"ietf-netconf:operation\":\"replace\"},\"a\":\"val_a\",\"b\":\"val_b\",\"c\":\"val_c\"}]}"
"}}";
@@ -515,16 +518,16 @@
assert_non_null(op);
CHECK_LYSC_ACTION((struct lysc_node_action *)op->schema, dsc, 0, LYS_STATUS_CURR,
- 1, 0, 0, 1, "edit-config", LYS_RPC,
- 0, 0, 0, 0, 0, ref, 0);
+ 1, 0, 0, 1, "edit-data", LYS_RPC,
+ 0, 0, 0, 0, 0, NULL, 0);
node = tree;
CHECK_LYSC_ACTION((struct lysc_node_action *)node->schema, dsc, 0, LYS_STATUS_CURR,
- 1, 0, 0, 1, "edit-config", LYS_RPC,
- 0, 0, 0, 0, 0, ref, 0);
+ 1, 0, 0, 1, "edit-data", LYS_RPC,
+ 0, 0, 0, 0, 0, NULL, 0);
node = lyd_child(node)->next;
- CHECK_LYSC_NODE(node->schema, "Inline Config content.", 0, LYS_STATUS_CURR | LYS_IS_INPUT, 1, "config",
- 0, LYS_ANYXML, 1, 0, NULL, 0);
+ CHECK_LYSC_NODE(node->schema, "Inline config content.", 0, LYS_STATUS_CURR | LYS_IS_INPUT, 1, "config",
+ 0, LYS_ANYDATA, 1, 0, NULL, 0);
node = ((struct lyd_node_any *)node)->value.tree;
CHECK_LYSC_NODE(node->schema, NULL, 0, LYS_CONFIG_W | LYS_STATUS_CURR | LYS_PRESENCE, 1, "cp",