Very large commit for upcoming 4.4 release

Major New features

* New and updated search functions using xpath, api-path and instance-id
  * New search functions using api-path and instance_id:
    * C search functions: `clixon_find_instance_id()` and `clixon_find_api_path()`
  * Binary search optimization in lists for indexed leafs in all three formats.
    * This improves search performance to O(logN) which is drastical improvements for large lists.
  * You can also register explicit indexes for making binary search (not only list keys)
  * For more info, see docs at [paths](https://clixon-docs.readthedocs.io/en/latest/paths.html) and
[search](https://clixon-docs.readthedocs.io/en/latest/xml.html#searching-in-xml)

API changes on existing features (you may need to change your code)
* On failed validation of leafrefs, error message changed from: `No such leaf` to `No leaf <name> matching path <path>`.
* CLI Error message (clicon_rpc_generate_error()) changed when backend returns netconf error to be more descriptive:
  * Original: `Config error: Validate failed. Edit and try again or discard changes: Invalid argument`
  * New (example): `Netconf error: application operation-failed Identityref validation failed, undefined not derived from acl-base . Validate failed. Edit and try again or discard changes"

Minor changes

* Test framework
  * Added `-- -S <file>` command-line to main example to be able to return any state to main example.
  * Added `test/cicd` test scripts for running on a set of other hosts
* C-code restructuring
  * clixon_yang.c partitioned and moved code into clixon_yang_parse_lib.c and clixon_yang_module.c and move back some code from clixon_yang_type.c.
    * partly to reduce size, but most important to limit code that accesses internal yang structures, only clixon_yang.c does this now.
This commit is contained in:
Olof hagsand 2020-02-02 15:52:30 +01:00
parent e8ae628d06
commit 19e21be0bc
132 changed files with 6241 additions and 2332 deletions

View file

@ -2,7 +2,7 @@
*
***** BEGIN LICENSE BLOCK *****
Copyright (C) 2009-2019 Olof Hagsand and Benny Holmgren
Copyright (C) 2009-2020 Olof Hagsand
This file is part of CLIXON.
@ -68,7 +68,6 @@
#include "clixon_xpath.h"
#include "clixon_xpath_optimize.h"
#ifdef XPATH_LIST_OPTIMIZE
static xpath_tree *_xmtop = NULL; /* pattern match tree top */
static xpath_tree *_xm = NULL;
@ -77,7 +76,6 @@ static int _optimize_enable = 1;
static int _optimize_hits = 0;
#endif /* XPATH_LIST_OPTIMIZE */
/* XXX development in clixon_xpath_eval */
int
xpath_list_optimize_stats(int *hits)
@ -89,6 +87,9 @@ xpath_list_optimize_stats(int *hits)
return 0;
}
/*! Enable xpath optimize
* Cant replace this with optin since there is no handle in xpath functions,...
*/
int
xpath_list_optimize_set(int enable)
{
@ -213,7 +214,8 @@ loop_preds(xpath_tree *xt,
*
* @param[in] xt XPath tree
* @param[in] xv XML base node
* @param[out] xp XML found node (retval == 1)
* @param[out] xvec Array of found nodes
* @param[out] xlen Len of xvec
* @param[out] key
* @param[out] keyval
* @retval -1 Error
@ -225,7 +227,8 @@ loop_preds(xpath_tree *xt,
static int
xpath_list_optimize_fn(xpath_tree *xt,
cxobj *xv,
cxobj **xp)
cxobj ***xvec,
size_t *xlen)
{
int retval = -1;
xpath_tree *xm = NULL;
@ -262,9 +265,9 @@ xpath_list_optimize_fn(xpath_tree *xt,
if (veclen != 2)
goto ok;
name = vec[0]->xs_s1;
/* Extract variables XXX strdups */
/* Extract variables */
if ((yc = yang_find(yp, Y_LIST, name)) == NULL)
#ifdef NOTYET
#ifdef NOTYET /* leaf-list is not detected by xpath optimize detection */
if ((yc = yang_find(yp, Y_LEAF_LIST, name)) == NULL) /* XXX */
#endif
goto ok;
@ -286,14 +289,12 @@ xpath_list_optimize_fn(xpath_tree *xt,
i = 0;
cvi = NULL;
while ((cvi = cvec_each(cvk, cvi)) != NULL) {
if (strcmp(cv_name_get(cvi), cv_string_get(cvec_i(cvv,i)))){
fprintf(stderr, "%s key name mismatch %s vs %s\n",
__FUNCTION__, cv_name_get(cvi), cv_string_get(cvec_i(cvv,i)));
if (strcmp(cv_name_get(cvi), cv_string_get(cvec_i(cvv,i))))
goto ok;
}
i++;
}
if (xml_binsearch(xv, yc, cvk, xp) < 0)
/* Use 2a form since yc allready given to compute cvk */
if (clixon_xml_find_index(xv, yp, NULL, name, cvk, xvec, xlen) < 0)
goto done;
retval = 1; /* match */
done:
@ -316,8 +317,9 @@ xpath_list_optimize_fn(xpath_tree *xt,
*/
int
xpath_optimize_check(xpath_tree *xs,
cxobj *xv,
cxobj **xp)
cxobj *xv,
cxobj ***xvec,
size_t *xlen)
{
#ifdef XPATH_LIST_OPTIMIZE
@ -325,7 +327,7 @@ xpath_optimize_check(xpath_tree *xs,
if (!_optimize_enable)
return 0; /* use regular code */
if ((ret = xpath_list_optimize_fn(xs, xv, xp)) < 0)
if ((ret = xpath_list_optimize_fn(xs, xv, xvec, xlen)) < 0)
return -1;
if (ret == 1){
_optimize_hits++;