From e7313fc9a28d179d601ee66fdb65a6330eca18bc Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Wed, 25 Oct 2023 18:09:40 +0200 Subject: [PATCH] New `clixon-lib@2023-11-01.yang` revision with ignore-compare extension --- CHANGELOG.md | 7 ++ lib/clixon/clixon_xml.h | 5 + lib/src/clixon_xml_map.c | 20 ++++ lib/src/clixon_yang.c | 2 +- lib/src/clixon_yang_module.c | 6 +- lib/src/clixon_yang_parse_lib.c | 4 +- test/config.sh.in | 2 +- test/test_upgrade_checkold.sh | 5 +- yang/clixon/Makefile.in | 2 +- ...-03-01.yang => clixon-lib@2023-11-01.yang} | 103 +++++++++++++----- 10 files changed, 121 insertions(+), 35 deletions(-) rename yang/clixon/{clixon-lib@2023-03-01.yang => clixon-lib@2023-11-01.yang} (79%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a31af71..d52aa9a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,7 +52,14 @@ Developers may need to change their code * clicon_debug() -> clixon_debug() * clicon_debug_init() -> clixon_debug_init() * clicon_debug_get() -> clixon_debug_get() + * clicon_debug_xml() -> clixon_debug_xml() + * There are backward compatible macros during a transition period +### Minor features + +* New `clixon-lib@2023-11-01.yang` revision + * Added ignore-compare extension + ### Corrected Bugs * Fixed: [Does clixon cli support autocompletion for leafrefs pointed to another module?](https://github.com/clicon/clixon/issues/455) diff --git a/lib/clixon/clixon_xml.h b/lib/clixon/clixon_xml.h index 8a972aa2..53f2b007 100644 --- a/lib/clixon/clixon_xml.h +++ b/lib/clixon/clixon_xml.h @@ -316,4 +316,9 @@ cxobj *xml_child_index_each(cxobj *xparent, char *name, cxobj *xprev, enum cx #endif +/* 6.4 backward compatability */ +#if 1 +#define clicon_debug_xml clixon_debug_xml +#endif + #endif /* _CLIXON_XML_H */ diff --git a/lib/src/clixon_xml_map.c b/lib/src/clixon_xml_map.c index b53ba230..9904e988 100644 --- a/lib/src/clixon_xml_map.c +++ b/lib/src/clixon_xml_map.c @@ -476,6 +476,7 @@ xml_tree_equal(cxobj *x0, char *b1; cxobj *x0c = NULL; /* x0 child */ cxobj *x1c = NULL; /* x1 child */ + int extflag = 0; /* Traverse x0 and x1 in lock-step */ x0c = x1c = NULL; @@ -485,11 +486,30 @@ xml_tree_equal(cxobj *x0, if (x0c == NULL && x1c == NULL) goto ok; else if (x0c == NULL){ + /* If cl:gnore-compare extension, return equal */ + if ((yc1 = xml_spec(x1c)) != NULL){ + if (yang_extension_value(yc1, "ignore-compare", CLIXON_LIB_NS, &extflag, NULL) < 0) + goto done; + if (extflag) + goto ok; + } goto done; } else if (x1c == NULL){ + if ((yc0 = xml_spec(x0c)) != NULL){ + if (yang_extension_value(yc0, "ignore-compare", CLIXON_LIB_NS, &extflag, NULL) < 0) + goto done; + if (extflag) + goto ok; + } goto done; } + if ((yc0 = xml_spec(x0c)) != NULL){ + if (yang_extension_value(yc0, "ignore-compare", CLIXON_LIB_NS, &extflag, NULL) < 0) + goto done; + if (extflag) + goto ok; + } /* Both x0c and x1c exists, check if they are yang-equal. */ eq = xml_cmp(x0c, x1c, 0, 0, NULL); if (eq < 0){ diff --git a/lib/src/clixon_yang.c b/lib/src/clixon_yang.c index c8d78f38..ed8b2027 100644 --- a/lib/src/clixon_yang.c +++ b/lib/src/clixon_yang.c @@ -3798,7 +3798,7 @@ yang_anydata_add(yang_stmt *yp, * @param[in] name Name of the extension * @param[in] ns The namespace of the module where the extension is defined * @param[out] exist The extension exists. - * @param[out] value clispec operator (hide/none) - direct pointer into yang, dont free + * @param[out] value Extension value if any * @retval 0 OK: Look in exist and value for return value * @retval -1 Error * This is for extensions with an argument diff --git a/lib/src/clixon_yang_module.c b/lib/src/clixon_yang_module.c index 884a6ad3..52530546 100644 --- a/lib/src/clixon_yang_module.c +++ b/lib/src/clixon_yang_module.c @@ -838,7 +838,7 @@ yang_metadata_init(clicon_handle h) * This function is used where a yang-lib module-set is available to populate * an XML mount-point. * @param[in] h Clixon handle - * @param[in] yanglib XML tree on the form ... + * @param[in] xyanglib XML tree on the form ... * @param[in] yspec Will be populated with YANGs, is consumed * @retval 1 OK * @retval 0 Parse error @@ -848,7 +848,7 @@ yang_metadata_init(clicon_handle h) */ int yang_lib2yspec(clicon_handle h, - cxobj *yanglib, + cxobj *xyanglib, yang_stmt *yspec) { int retval = -1; @@ -863,7 +863,7 @@ yang_lib2yspec(clicon_handle h, yang_stmt *yrev; int modmin = 0; - if (xpath_vec(yanglib, nsc, "module-set/module", &vec, &veclen) < 0) + if (xpath_vec(xyanglib, nsc, "module-set/module", &vec, &veclen) < 0) goto done; for (i=0; i" fi elif $modstate; then - expectxml="Internal error: No yang files found matching \"A@2016-01-01\" in the list of CLICON_YANG_DIRs" + # expectxml="Internal error: No yang files found matching \"A@2016-01-01\" in the list of CLICON_YANG_DIRs" + expectxml="Internal error: Yang \"A@2016-01-01\" not found in the list of CLICON_YANG_DIRs" fi else # xml false xmltag="wrong" expectxml="Failed to find YANG spec of XML node: $xmltag with parent: config in namespace: urn:example:a" if ! $oldyang; then if $modstate; then - expectxml="Internal error: No yang files found matching \"A@2016-01-01\" in the list of CLICON_YANG_DIRs" + expectxml="Internal error: Yang \"A@2016-01-01\" not found in the list of CLICON_YANG_DIRs" fi fi fi diff --git a/yang/clixon/Makefile.in b/yang/clixon/Makefile.in index 0927e8c5..6d9987d8 100644 --- a/yang/clixon/Makefile.in +++ b/yang/clixon/Makefile.in @@ -43,7 +43,7 @@ YANG_INSTALLDIR = @YANG_INSTALLDIR@ # Note: mirror these to test/config.sh.in YANGSPECS = clixon-config@2023-05-01.yang # 6.3 -YANGSPECS += clixon-lib@2023-05-01.yang # 6.3 +YANGSPECS += clixon-lib@2023-11-01.yang # 6.5 YANGSPECS += clixon-rfc5277@2008-07-01.yang YANGSPECS += clixon-xml-changelog@2019-03-21.yang YANGSPECS += clixon-restconf@2022-08-01.yang # 5.9 diff --git a/yang/clixon/clixon-lib@2023-03-01.yang b/yang/clixon/clixon-lib@2023-11-01.yang similarity index 79% rename from yang/clixon/clixon-lib@2023-03-01.yang rename to yang/clixon/clixon-lib@2023-11-01.yang index c5e722f6..cadc51ca 100644 --- a/yang/clixon/clixon-lib@2023-03-01.yang +++ b/yang/clixon/clixon-lib@2023-11-01.yang @@ -5,10 +5,10 @@ module clixon-lib { import ietf-yang-types { prefix yang; - } + } import ietf-netconf-monitoring { prefix ncm; - } + } import ietf-yang-metadata { prefix "md"; } @@ -21,7 +21,7 @@ module clixon-lib { description "***** BEGIN LICENSE BLOCK ***** Copyright (C) 2009-2019 Olof Hagsand - Copyright (C) 2020-2021 Olof Hagsand and Rubicon Communications, LLC(Netgate) + Copyright (C) 2020-2022 Olof Hagsand and Rubicon Communications, LLC(Netgate) This file is part of CLIXON @@ -68,6 +68,18 @@ module clixon-lib { - objectexisted "; + revision 2023-11-01 { + description + "Added ignore-compare extension + Removed obsolete extension autocli-op + Released in 6.5.0"; + } + revision 2023-05-01 { + description + "Restructured and extended stats rpc to schema mountpoints + Moved datastore-format typedef from clixon-config + "; + } revision 2023-03-01 { description "Added creator meta-object"; @@ -138,6 +150,27 @@ module clixon-lib { description "Common operations that can be performed on a service"; } + typedef datastore_format{ + description + "Datastore format (only xml and json implemented in actual data."; + type enumeration{ + enum xml{ + description + "Save and load xmldb as XML + More specifically, such a file looks like: ... provided + DATASTORE_TOP_SYMBOL is 'config'"; + } + enum json{ + description "Save and load xmldb as JSON"; + } + enum text{ + description "'Curly' C-like text format"; + } + enum cli{ + description "CLI format"; + } + } + } identity snmp { description "SNMP"; @@ -160,20 +193,12 @@ module clixon-lib { "A CLI session"; base ncm:transport; } - extension autocli-op { - description - "Takes an argument an operation defing how to modify the clispec at - this point in the YANG tree for the automated generated CLI. - Note that this extension is only used in clixon_cli. - Operations is expected to be extended, but the following operations are defined: - - hide This command is active but not shown by ? or TAB (meaning, it hides the auto-completion of commands) - - hide-database This command hides the database - - hide-database-auto-completion This command hides the database and the auto completion (meaning, this command acts as both commands above) - Obsolete: use clixon-autocli:hide and clixon-autocli:hide-show instead"; - argument cliop; - status obsolete; + extension ignore-compare { + description + "The object should be ignored when comparing device configs for equality. + One example is auto-created objects by the server, such as uid. + Another example is a plain-text password is changed to an encrypted by the server."; } - md:annotation creator { type string; description @@ -182,7 +207,7 @@ module clixon-lib { create the same object. When such a service is deleted (or changed) one needs to keep track of which service created what. Limitations: only objects that are actually added or deleted. - A sub-object wil not be noted"; + A sub-object will not be noted"; } rpc debug { description "Set debug level of backend."; @@ -195,8 +220,15 @@ module clixon-lib { rpc ping { description "Check aliveness of backend daemon."; } - rpc stats { - description "Clixon XML statistics."; + rpc stats { /* Could be moved to state */ + description "Clixon yang and datastore statistics."; + input { + leaf modules { + description "If enabled include per-module statistics"; + type boolean; + mandatory false; + } + } output { container global{ description @@ -216,7 +248,8 @@ module clixon-lib { type uint64; } } - list datastore{ + container datastores{ + list datastore{ description "Per datastore statistics for cxobj"; key "name"; leaf name{ @@ -232,9 +265,11 @@ module clixon-lib { description "Size in bytes of internal datastore cache of datastore tree."; type uint64; } + } } - list module{ - description "Per YANG module statistics"; + container module-sets{ + list module-set{ + description "Statistics per group of module, eg top-level and mount-points"; key "name"; leaf name{ description "Name of YANG module."; @@ -242,14 +277,33 @@ module clixon-lib { } leaf nr{ description - "Number of YANG objects. That is number of residing YANG objects"; + "Total number of YANG objects in set"; type uint64; } leaf size{ description - "Size in bytes of internal YANG object representation."; + "Total size in bytes of internal YANG object representation for module set"; type uint64; } + list module{ + description "Statistics per module (if modules set in input)"; + key "name"; + leaf name{ + description "Name of YANG module."; + type string; + } + leaf nr{ + description + "Number of YANG objects. That is number of residing YANG objects"; + type uint64; + } + leaf size{ + description + "Size in bytes of internal YANG object representation."; + type uint64; + } + } + } } } } @@ -262,7 +316,6 @@ module clixon-lib { } } } - rpc process-control { description "Control a specific process or daemon: start/stop, etc.