diff --git a/CHANGELOG.md b/CHANGELOG.md index 7581d1ca..8d85e4ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,21 +35,27 @@ Expected: May 2020 * ca_trans_commit_done: Called when all plugin commits have been done. * Note: If you have used "end" callback and usign transaction data, you should probably use this instead. -### API changes on existing protocol/config features (You may have have to change how you use Clixon) +### API changes on existing protocol/config features (For users, you may have have to change how you use Clixon) * Stricter validation detecting duplicate container or leaf in XML. - * Eg `` is invalid if `a` is anything else than leaf or leaf-list + * Eg `` is invalid if `a` is a leaf or container. * New clixon-lib@2020-04-23.yang revision - * Added: stats RPC for clixon XML and memory statistics. - * Added: restart-plugin RPC for restarting individual plugins without restarting backend. -* xml-stats moved from clixon-config.yang as state data to an rpc `datastats` in clixon-lib.yang + * New RPC: `stats` for clixon XML and memory statistics. + * New RPC: `restart-plugin` for restarting individual plugins without restarting backend. +* New clixon-config@2020-04-23.yang revision + * Removed xml-stats non-config data (replaced by rpc `stats` in clixon-lib.yang) + * Added option `CLICON_YANG_UNKNOWN_ANYDATA` to treat unknown XML (wrt YANG) as anydata. + * This is a way to loosen sanity checks if you need to accept eg unsynchronized YANG and XML * Stricter incoming RPC sanity checking, error messages may have changed. * Changed output of `clixon_cli -G` option to show generated CLI spec original text instead of resulting parse-tree, which gives better detail from a debugging perspective. -### C-API changes on existing features (you may need to change your plugin C-code) +### C-API changes on existing features (For developers: you may need to change your plugin C-code) -* Length of xml vector in many structs changed from `size_t` to `int`since it is a vector size, not byte size. This includes `transaction_data_t` +* Length of xml vector in many structs changed from `size_t` to `int`since it is a vector size, not byte size. + * Example: `transaction_data_t` * `xml_merge()` changed to use 3-value return: 1:OK, 0:Yang failed, -1: Error +* Some function changed to use 3-value return: 1:OK, 0:Yang failed, -1: Error. + * Example: `xml_merge()` * `clixon_netconf_error(category, xerr, msg, arg)` removed first argument -> `clixon_netconf_error(xerr, msg, arg)` * CLI * `clicon_parse()`: Changed signature due to new cligen error and result handling: @@ -59,22 +65,23 @@ Expected: May 2020 * Added decriptive error message when plugins produce invalid state XML. * Example: `operation-failedmystateNo such yang module. Internal error, state callback returned invalid XML: example_backend` -* Added option `CLICON_YANG_UNKNOWN_ANYDATA` to treat unknown XML (wrt YANG) as anydata. - * This is a way to loosen sanity checks if you need to accept eg unsynchronized YANG and XML + * Such a message means there is something wrong in the internal plugins or elsewehere, ie it is not a proper end-user error. * Compile-time option: `USE_CLIGEN44` for running clixon-45 with cligen-44. * Temporary fix since cligen-45 have some non-backward compatible behaviour. -* Optimizations - * Reduced memory for attribute and body objects, see `XML_NEW_DIFFERENTIATE` compile-time option. - * Optimized prefix checks at xml parse time: using many prefixes slowed down parsing considerably - * Optimized cbuf handling in parsing and xml2cbuf functions. +* Cycle optimizations + * Optimized namespace prefix checks at xml parse time: using many prefixes slowed down parsing considerably + * Optimized cbuf handling in parsing and xml2cbuf functions: use of new `cbuf_append()` function. * Optimized xml scanner to read strings rather than single chars - * Optimized xml_merge for the case of disjunct trees. - * Cleared startup-db cache after restart - * Experimental optimzations of yang-bind and sort for large lists - * Enabled by compile-time options: `OPTIMIZE_45_BIND` and `OPTIMIZE_45_SORT` + * Identify early that trees are disjunct instead of recursively merge in `xml_merge` + * Optimizations of `yang_bind` for large lists: use a "sibling/template" to use same binding as previous element. +* Memory optimizations + * Reduced memory for attribute and body objects, by allocating less memory in `xml_new()` than for elements, reducing XML storage with ca 25% + * Cleared startup-db cache after restart, slashing datastore cache with (best-case) a third. + * Removed nameserver binding cache for leaf/leaf-list objects. + * Remove xml value cache after sorting (just use cligen value cache at sorting, remove after use) * Adapted to CLIgen 4.5 API changes, eg: `cliread()` and `cliread_parse()` * Renamed utility function `clixon_util_insert()` to `clixon_util_xml_mod()` and added merge functionality. -* Sanity check of duplicates prefixes in Yang modules and submodules as defined in RFC 7950 Sec 7.1.4 +* Sanity check of duplicate prefixes in Yang modules and submodules as defined in RFC 7950 Sec 7.1.4 ### Corrected Bugs diff --git a/apps/backend/backend_client.c b/apps/backend/backend_client.c index 5bcc0e14..98474914 100644 --- a/apps/backend/backend_client.c +++ b/apps/backend/backend_client.c @@ -1425,7 +1425,6 @@ from_client_stats(clicon_handle h, return retval; } -#ifdef RESTART_PLUGIN_RPC /*! Request restart of specific plugins * @param[in] h Clicon handle * @param[in] xe Request: @@ -1472,7 +1471,6 @@ from_client_restart_plugin(clicon_handle h, free(vec); return retval; } -#endif /* RESTART_PLUGIN_RPC */ /*! Verify nacm user with peer uid credentials * @param[in] mode Peer credential mode: none, exact or except @@ -1838,11 +1836,9 @@ backend_rpc_init(clicon_handle h) if (rpc_callback_register(h, from_client_stats, NULL, CLIXON_LIB_NS, "stats") < 0) goto done; -#ifdef RESTART_PLUGIN_RPC if (rpc_callback_register(h, from_client_restart_plugin, NULL, CLIXON_LIB_NS, "restart-plugin") < 0) goto done; -#endif retval =0; done: return retval; diff --git a/apps/backend/backend_commit.c b/apps/backend/backend_commit.c index 7f917fad..c020dc90 100644 --- a/apps/backend/backend_commit.c +++ b/apps/backend/backend_commit.c @@ -810,7 +810,6 @@ from_client_validate(clicon_handle h, return retval; } /* from_client_validate */ -#ifdef RESTART_PLUGIN_RPC /*! Restart specific backend plugins without full backend restart * Note, depending on plugin callbacks, there may be other dependencies which may make this * difficult in the general case. @@ -928,4 +927,4 @@ from_client_restart_one(clicon_handle h, retval = 0; goto done; } -#endif /* RESTART_PLUGIN_RPC */ + diff --git a/apps/backend/backend_commit.h b/apps/backend/backend_commit.h index 8ee85a7b..8601bfce 100644 --- a/apps/backend/backend_commit.h +++ b/apps/backend/backend_commit.h @@ -48,8 +48,6 @@ int from_client_commit(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void int from_client_discard_changes(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); int from_client_cancel_commit(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); int from_client_validate(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); -#ifdef RESTART_PLUGIN_RPC int from_client_restart_one(clicon_handle h, clixon_plugin *cp, cbuf *cbret); -#endif #endif /* _BACKEND_COMMIT_H_ */ diff --git a/include/clixon_custom.h b/include/clixon_custom.h index e49f8850..57913560 100644 --- a/include/clixon_custom.h +++ b/include/clixon_custom.h @@ -101,26 +101,6 @@ */ #define STATE_ORDERED_BY_SYSTEM -/*! Restart specific backend plugins - * Note, depending on plugin callbacks, there may be other dependencies which may make this - * difficult in the general case. - */ -#define RESTART_PLUGIN_RPC - -/*! Differentiate creating XML object body/element vs elenmet to reduce space - */ -#define XML_NEW_DIFFERENTIATE - -/*! Clixon 4.5 optimizing experiments for yang bind - * Primarily for large lists - */ -#define OPTIMIZE_45_BIND - -/*! Clixon 4.5 optimizing experiments for sorting yang-bound XML trees - * Primarily for large lists - */ -#define OPTIMIZE_45_SORT - /*! Use cligen 4.4 instead of master / cligen 4.5.pre * Temporary fix */ diff --git a/lib/clixon/clixon_xml_bind.h b/lib/clixon/clixon_xml_bind.h index 55818d81..06a3b762 100644 --- a/lib/clixon/clixon_xml_bind.h +++ b/lib/clixon/clixon_xml_bind.h @@ -43,7 +43,7 @@ /* * Prototypes */ -int xml_bind_yang_unknown_anydata(int bool); +int xml_bind_yang_unknown_anydata(int val); int xml_bind_yang_rpc(cxobj *xrpc, yang_stmt *yspec, cxobj **xerr); int xml_bind_yang_rpc_reply(cxobj *xrpc, char *name, yang_stmt *yspec, cxobj **xerr); int xml_bind_yang0(cxobj *xt, yang_bind yb, yang_stmt *yspec, cxobj **xerr); diff --git a/lib/src/clixon_err.c b/lib/src/clixon_err.c index f2c97f64..a99bdc0a 100644 --- a/lib/src/clixon_err.c +++ b/lib/src/clixon_err.c @@ -141,7 +141,7 @@ clicon_err_reset(void) * @param[in] fn Inline function name (when called from clicon_err() macro) * @param[in] line Inline file line number (when called from clicon_err() macro) * @param[in] category Clixon error category, See enum clicon_err - * @param[in] errno Error number, typically errno + * @param[in] suberr Error number, typically errno * @param[in] reason Error string, format with argv * @see clicon_err_reser Resetting the global error variables. */ diff --git a/lib/src/clixon_xml.c b/lib/src/clixon_xml.c index feed862d..02baef8c 100644 --- a/lib/src/clixon_xml.c +++ b/lib/src/clixon_xml.c @@ -158,6 +158,7 @@ struct search_index{ * - Local name: In either case the "local name" is N (also "prefix") * It is this combination of the universally managed URI namespace with the * vocabulary's local names that is effective in avoiding name clashes. + * @see struct xmlbody For XML body and attributes */ struct xml{ enum cxobj_type x_type; /* type of node: element, attribute, body */ @@ -186,9 +187,8 @@ struct xml{ #endif }; - -#ifdef XML_NEW_DIFFERENTIATE -/* This is experimental variant of struct xml for use by non-elements to save space +/* Variant of struct xml for use by non-elements to save space + * @see struct xml For XML elements */ struct xmlbody{ enum cxobj_type xb_type; /* type of node: element, attribute, body */ @@ -201,7 +201,6 @@ struct xmlbody{ see xml_enumerate and xml_cmp */ cbuf *xb_value_cb; /* attribute and body nodes have values */ }; -#endif /* XML_NEW_DIFFERENTIATE */ /* * Variables @@ -277,11 +276,7 @@ xml_stats_one(cxobj *x, break; case CX_BODY: case CX_ATTR: -#ifdef XML_NEW_DIFFERENTIATE sz += sizeof(struct xmlbody); -#else - sz += sizeof(struct xml); -#endif if (x->x_value_cb) sz += cbuf_buflen(x->x_value_cb); break; @@ -1042,10 +1037,9 @@ xml_childvec_get(cxobj *x) * ... * xml_free(x); * @endcode + * @note Differentiates between body/attribute vs element to reduce mem allocation * @see xml_sort_insert */ -#ifdef XML_NEW_DIFFERENTIATE -/* Differentiate creating XML object body/element vs elenmet to reduce space */ cxobj * xml_new(char *name, cxobj *xp, @@ -1085,35 +1079,6 @@ xml_new(char *name, return x; } -#else /* XML_NEW_DIFFERENTIATE */ - -cxobj * -xml_new(char *name, - cxobj *xp, - enum cxobj_type type) -{ - cxobj *x; - - if ((x = malloc(sizeof(cxobj))) == NULL){ - clicon_err(OE_XML, errno, "malloc"); - return NULL; - } - memset(x, 0, sizeof(cxobj)); - xml_type_set(x, type); - if (name != NULL && - xml_name_set(x, name) < 0) - return NULL; - if (xp){ - xml_parent_set(x, xp); - if (xml_child_append(xp, x) < 0) - return NULL; - x->_x_i = xml_child_nr(xp)-1; - } - _stats_nr++; - return x; -} -#endif /* XML_NEW_DIFFERENTIATE */ - /*! Create a new XML node and set it's body to a value * * @param[in] name The name of the new node diff --git a/lib/src/clixon_xml_bind.c b/lib/src/clixon_xml_bind.c index 98cd10c7..be691797 100644 --- a/lib/src/clixon_xml_bind.c +++ b/lib/src/clixon_xml_bind.c @@ -88,9 +88,9 @@ static int _yang_unknown_anydata = 0; * The problem with this is that its global and shuld be bound to a handle */ int -xml_bind_yang_unknown_anydata(int bool) +xml_bind_yang_unknown_anydata(int val) { - _yang_unknown_anydata = bool; + _yang_unknown_anydata = val; return 0; } @@ -128,9 +128,7 @@ strip_whitespace(cxobj *xt) */ static int populate_self_parent(cxobj *xt, -#ifdef OPTIMIZE_45_BIND cxobj *xsibling, -#endif cxobj **xerr) { int retval = -1; @@ -143,14 +141,12 @@ populate_self_parent(cxobj *xt, cbuf *cb = NULL; name = xml_name(xt); -#ifdef OPTIMIZE_45_BIND /* optimization for massive lists - use the first element as role model */ if (xsibling && xml_child_nr_type(xt, CX_ATTR) == 0){ y = xml_spec(xsibling); goto set; } -#endif xp = xml_parent(xt); if (xp == NULL){ if (xerr && @@ -202,9 +198,7 @@ populate_self_parent(cxobj *xt, goto done; goto fail; } -#ifdef OPTIMIZE_45_BIND set: -#endif xml_spec_set(xt, y); #ifdef XML_EXPLICIT_INDEX if (xml_search_index_p(xt)) @@ -354,7 +348,6 @@ xml_bind_yang(cxobj *xt, goto done; } -#ifdef OPTIMIZE_45_BIND int xml_bind_yang0_opt(cxobj *xt, yang_bind yb, @@ -424,8 +417,6 @@ xml_bind_yang0_opt(cxobj *xt, retval = 0; goto done; } -#endif /* OPTIMIZE_45_BIND */ - /*! Find yang spec association of tree of XML nodes * @@ -455,11 +446,7 @@ xml_bind_yang0(cxobj *xt, goto done; break; case YB_PARENT: - if ((ret = populate_self_parent(xt, -#ifdef OPTIMIZE_45_BIND - NULL, -#endif - xerr)) < 0) + if ((ret = populate_self_parent(xt, NULL, xerr)) < 0) goto done; break; case YB_NONE: @@ -477,13 +464,8 @@ xml_bind_yang0(cxobj *xt, strip_whitespace(xt); xc = NULL; /* Apply on children */ while ((xc = xml_child_each(xt, xc, CX_ELMNT)) != NULL) { -#ifdef OPTIMIZE_45_BIND if ((ret = xml_bind_yang0_opt(xc, YB_PARENT, NULL, xerr)) < 0) goto done; -#else - if ((ret = xml_bind_yang0(xc, YB_PARENT, NULL, xerr)) < 0) - goto done; -#endif if (ret == 0) failed++; } diff --git a/lib/src/clixon_xml_nsctx.c b/lib/src/clixon_xml_nsctx.c index 61fd863b..fadd1e58 100644 --- a/lib/src/clixon_xml_nsctx.c +++ b/lib/src/clixon_xml_nsctx.c @@ -464,9 +464,7 @@ xml2ns(cxobj *x, * If not, this is devastating when populating deep yang structures */ if (ns && -#ifdef OPTIMIZE_45_BIND /* Dont set cache if few children: if 1 child typically a body */ - xml_child_nr(x) > 1 && -#endif + xml_child_nr(x) > 1 && /* Dont set cache if few children: if 1 child typically a body */ nscache_set(x, prefix, ns) < 0) goto done; ok: diff --git a/lib/src/clixon_xml_sort.c b/lib/src/clixon_xml_sort.c index 6ded7f9a..ca91b503 100644 --- a/lib/src/clixon_xml_sort.c +++ b/lib/src/clixon_xml_sort.c @@ -143,7 +143,6 @@ xml_cv_cache(cxobj *x, return retval; } -#ifdef OPTIMIZE_45_SORT static int xml_cv_cache_clear(cxobj *xt) { @@ -157,7 +156,6 @@ xml_cv_cache_clear(cxobj *xt) done: return retval; } -#endif /* OPTIMIZE_45_SORT */ /*! Help function to qsort for sorting entries in xml child vector same parent * @param[in] x1 object 1 @@ -433,7 +431,6 @@ xml_sort_recurse(cxobj *xn) cxobj *x; int ret; -#ifdef OPTIMIZE_45_SORT ret = xml_sort_verify(xn, NULL); if (ret == 1) /* This node is not sortable */ goto ok; @@ -445,12 +442,6 @@ xml_sort_recurse(cxobj *xn) } if (xml_cv_cache_clear(xn) < 0) goto done; -#else - if ((ret = xml_sort(xn)) < 0) - goto done; - if (ret == 1) /* This node is not sortable */ - goto ok; -#endif x = NULL; while ((x = xml_child_each(xn, x, CX_ELMNT)) != NULL) { if (xml_sort_recurse(x) < 0) diff --git a/test/test_cli.sh b/test/test_cli.sh index eec5a924..6a088e15 100755 --- a/test/test_cli.sh +++ b/test/test_cli.sh @@ -80,6 +80,7 @@ expectfn "$clixon_cli -1 -f $cfg set interfaces interface eth/0/0 ipv4 address 1 new "cli configure ip descr" expectfn "$clixon_cli -1 -f $cfg set interfaces interface eth/0/0 description mydesc" 0 "^$" + new "cli configure ip type" expectfn "$clixon_cli -1 -f $cfg set interfaces interface eth/0/0 type ex:eth" 0 "^$" diff --git a/yang/clixon/Makefile.in b/yang/clixon/Makefile.in index 188e22f8..513c2642 100644 --- a/yang/clixon/Makefile.in +++ b/yang/clixon/Makefile.in @@ -3,7 +3,7 @@ # # Copyright (C) 2009-2016 Olof Hagsand and Benny Holmgren # Copyright (C) 2017-2019 Olof Hagsand -# Copyright (C) 2020 Olof Hagsand and Rubicon Communications, LLC(Netgate)# +# Copyright (C) 2020 Olof Hagsand and Rubicon Communications, LLC(Netgate) # This file is part of CLIXON # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -42,7 +42,7 @@ datarootdir = @datarootdir@ # See also OPT_YANG_INSTALLDIR for the standard yang files YANG_INSTALLDIR = @YANG_INSTALLDIR@ -YANGSPECS = clixon-config@2020-02-22.yang +YANGSPECS = clixon-config@2020-04-23.yang YANGSPECS += clixon-lib@2020-04-23.yang YANGSPECS += clixon-rfc5277@2008-07-01.yang YANGSPECS += clixon-xml-changelog@2019-03-21.yang diff --git a/yang/clixon/clixon-config@2020-02-22.yang b/yang/clixon/clixon-config@2020-02-22.yang index 22103e74..aa08151f 100644 --- a/yang/clixon/clixon-config@2020-02-22.yang +++ b/yang/clixon/clixon-config@2020-02-22.yang @@ -40,8 +40,6 @@ module clixon-config { ***** END LICENSE BLOCK *****"; - /* Deleted: clixon-stats state for clixon XML and memory statistics. (moved to clixon-lib) - */ revision 2020-02-22 { description "Added: search index extension, @@ -314,14 +312,6 @@ module clixon-config { Some yang specs seem not to fulfil this. However, if you reset this, there may be follow-up errors due to code that assumes a configuration list has keys"; } - leaf CLICON_YANG_UNKNOWN_ANYDATA{ - type boolean; - default false; - description - "Treat unknown XML/JSON nodes as anydata. - This does not apply to namespaces, which means a top-level node: xxx:yyy - is accepted only if yyy is unknown, not xxx"; - } leaf CLICON_BACKEND_DIR { type string; description @@ -728,4 +718,33 @@ module clixon-config { } } + container clixon-stats{ + config false; + description "Clixon backend statistics."; + container global{ + description "Clixon global statistics"; + leaf xmlnr{ + description "Number of XML objects. That is number of residing xml/json objects + in the internal 'cxobj' representation."; + type uint64; + } + } + list datastore{ + description "Datastore statistics"; + key "name"; + leaf name{ + description "name of datastore (eg running)."; + type string; + } + leaf nr{ + description "Number of XML objects. That is number of residing xml/json objects + in the internal 'cxobj' representation."; + type uint64; + } + leaf size{ + description "Size in bytes of internal datastore cache of datastore tree."; + type uint64; + } + } + } } diff --git a/yang/clixon/clixon-config@2019-09-11.yang b/yang/clixon/clixon-config@2020-04-23.yang similarity index 87% rename from yang/clixon/clixon-config@2019-09-11.yang rename to yang/clixon/clixon-config@2020-04-23.yang index 1a9ed51e..aa75bc91 100644 --- a/yang/clixon/clixon-config@2019-09-11.yang +++ b/yang/clixon/clixon-config@2020-04-23.yang @@ -13,6 +13,7 @@ module clixon-config { "Clixon configuration file ***** BEGIN LICENSE BLOCK ***** Copyright (C) 2009-2019 Olof Hagsand + Copyright (C) 2020 Olof Hagsand and Rubicon Communications, LLC(Netgate) This file is part of CLIXON @@ -39,6 +40,22 @@ module clixon-config { ***** END LICENSE BLOCK *****"; + /* Deleted: clixon-stats state for clixon XML and memory statistics. (moved to clixon-lib) + */ + revision 2020-04-23 { + description + "Added: CLICON_YANG_UNKNOWN_ANYDATA to treat unknown XML (wrt YANG) as anydata. + Deleted: xml-stats non-config data (replaced by rpc stats in clixon-lib.yang)"; + } + revision 2020-02-22 { + description + "Added: search index extension, + Added: clixon-stats state for clixon XML and memory statistics. + Added: CLICON_CLI_BUF_START and CLICON_CLI_BUF_THRESHOLD for quadratic and linear + growth of CLIgen buffers (cbuf:s) + Added: CLICON_VALIDATE_STATE_XML for controling validation of user state XML + Added: CLICON_CLICON_YANG_LIST_CHECK to skip list key checks"; + } revision 2019-09-11 { description "Added: CLICON_BACKEND_USER: drop of privileges to user, @@ -67,6 +84,10 @@ module clixon-config { description "Released in Clixon 3.8"; } + extension search_index { + description "This list argument acts as a search index using optimized binary search. + "; + } typedef startup_mode{ description "Which method to boot/start clicon backend. @@ -289,6 +310,23 @@ module clixon-config { There is a 'good-enough' posix translation mode and a complete libxml2 mode"; } + leaf CLICON_YANG_LIST_CHECK { + type boolean; + default true; + description + "If false, skip Yang list check sanity checks from RFC 7950, Sec 7.8.2: + The 'key' statement, which MUST be present if the list represents configuration. + Some yang specs seem not to fulfil this. However, if you reset this, there may + be follow-up errors due to code that assumes a configuration list has keys"; + } + leaf CLICON_YANG_UNKNOWN_ANYDATA{ + type boolean; + default false; + description + "Treat unknown XML/JSON nodes as anydata. + This does not apply to namespaces, which means a top-level node: xxx:yyy + is accepted only if yyy is unknown, not xxx"; + } leaf CLICON_BACKEND_DIR { type string; description @@ -440,6 +478,25 @@ module clixon-config { Also, if CLICON_CLI_HIST_FILE is set, also the size in lines of the saved history."; } + leaf CLICON_CLI_BUF_START { + type uint32; + default 256; + description + "CLIgen buffer (cbuf) initial size. + When the buffer needs to grow, the allocation grows quadratic up to a threshold + after which linear growth continues. + See CLICON_CLI_BUF_THRESHOLD"; + } + leaf CLICON_CLI_BUF_THRESHOLD { + type uint32; + default 65536; + description + "CLIgen buffer (cbuf) threshold size. + When the buffer exceeds the threshold, the allocation grows by adding the threshold + value to the buffer length. + If 0, the growth continues with quadratic growth. + See CLICON_CLI_BUF_THRESHOLD"; + } leaf CLICON_SOCK_FAMILY { type string; default "UNIX"; @@ -552,6 +609,20 @@ module clixon-config { If CLICON_XML_CHANGELOG is true, Clixon reads the module changelog from this file."; } + leaf CLICON_VALIDATE_STATE_XML { + type boolean; + default false; + description + "Validate user state callback content. + Users may register state callbacks using ca_statedata callback + When set, the XML returned from the callback is validated after merging with + the running db. If it fails, an internal error is returned to the originating + user. + If the option is not set, the XML returned by the user is not validated. + Note that enabling currently causes a large performance overhead for large + lists, therefore it is recommended to enable it during development and debugging + but disable it in production, until this has been resolved."; + } leaf CLICON_STARTUP_MODE { type startup_mode; description "Which method to boot/start clicon backend"; @@ -560,7 +631,9 @@ module clixon-config { type boolean; default false; description "If set, modifications in validation and commit - callbacks are written back into the datastore"; + callbacks are written back into the datastore. + This is a bad idea and therefore obsoleted."; + status obsolete; } leaf CLICON_NACM_MODE { type nacm_mode; @@ -659,6 +732,5 @@ module clixon-config { data to store before dropping. 0 means no retention"; } - } } diff --git a/yang/clixon/clixon-lib@2019-08-13.yang b/yang/clixon/clixon-lib@2019-08-13.yang deleted file mode 100644 index 20cbc9e3..00000000 --- a/yang/clixon/clixon-lib@2019-08-13.yang +++ /dev/null @@ -1,66 +0,0 @@ -module clixon-lib { - yang-version 1.1; - namespace "http://clicon.org/lib"; - prefix cl; - - organization - "Clicon / Clixon"; - - contact - "Olof Hagsand "; - - description - "Clixon Netconf extensions for communication between clients and backend. - - ***** BEGIN LICENSE BLOCK ***** - Copyright (C) 2009-2019 Olof Hagsand and Benny Holmgren - - This file is part of CLIXON - - Licensed under the Apache License, Version 2.0 (the \"License\"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an \"AS IS\" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - Alternatively, the contents of this file may be used under the terms of - the GNU General Public License Version 3 or later (the \"GPL\"), - in which case the provisions of the GPL are applicable instead - of those above. If you wish to allow use of your version of this file only - under the terms of the GPL, and not to allow others to - use your version of this file under the terms of Apache License version 2, - indicate your decision by deleting the provisions above and replace them with - the notice and other provisions required by the GPL. If you do not delete - the provisions above, a recipient may use your version of this file under - the terms of any one of the Apache License version 2 or the GPL. - - ***** END LICENSE BLOCK *****"; - - revision 2019-08-13 { - description - "No changes (reverted change)"; - } - revision 2019-06-05 { - description - "ping rpc added for liveness"; - } - revision 2019-01-02 { - description - "Released in Clixon 3.9"; - } - rpc debug { - description "Set debug level of backend."; - input { - leaf level { - type uint32; - } - } - } - rpc ping { - description "Check aliveness of backend daemon."; - } -}