Re-added shared yang mounts
YANG: de-dperecated CLICON_YANG_SCHEMA_MOUNT_SHARE
This commit is contained in:
parent
f0bd103e79
commit
5ebc5a2219
5 changed files with 101 additions and 28 deletions
|
|
@ -887,10 +887,11 @@ yspec_new1(clixon_handle h,
|
|||
/*! Create or add a shared yspec
|
||||
*
|
||||
* @param[in] h Clixon handle
|
||||
* @param[in] tag Typically an xpath
|
||||
* @param[in] tag Typically an xpath, saved in cvec
|
||||
* @param[in] yspec0 Input NULL if no previous shared exist, otherwise a shared yspec but new name
|
||||
* @retval yspec1 New or (previously shared)
|
||||
* @retval NULL Error
|
||||
* @note yspec name used by concatenating domain and a unique number.
|
||||
*/
|
||||
yang_stmt *
|
||||
yspec_new_shared(clixon_handle h,
|
||||
|
|
@ -899,13 +900,19 @@ yspec_new_shared(clixon_handle h,
|
|||
yang_stmt *yspec0)
|
||||
{
|
||||
yang_stmt *yspec1 = NULL;
|
||||
cbuf *cb = NULL;
|
||||
static int nr = 0;
|
||||
|
||||
if (yspec0 != NULL){ /* shared */
|
||||
yspec1 = yspec0;
|
||||
}
|
||||
else {
|
||||
// XXX domain used as name
|
||||
if ((yspec1 = yspec_new1(h, domain, domain)) == NULL)
|
||||
if ((cb = cbuf_new()) == NULL){
|
||||
clixon_err(OE_YANG, errno, "cbuf_new");
|
||||
goto done;
|
||||
}
|
||||
cprintf(cb, "%s%d", domain, nr++);
|
||||
if ((yspec1 = yspec_new1(h, domain, cbuf_get(cb))) == NULL)
|
||||
goto done;
|
||||
yang_flag_set(yspec1, YANG_FLAG_SPEC_MOUNT);
|
||||
clixon_debug(CLIXON_DBG_YANG, "new yang-spec: %p", yspec1);
|
||||
|
|
@ -915,6 +922,8 @@ yspec_new_shared(clixon_handle h,
|
|||
goto done;
|
||||
}
|
||||
done:
|
||||
if (cb)
|
||||
cbuf_free(cb);
|
||||
return yspec1;
|
||||
}
|
||||
|
||||
|
|
@ -2313,10 +2322,10 @@ yang_print_cb(FILE *f,
|
|||
if (yang_print_cbuf(cb, yn, 0, 1) < 0)
|
||||
goto done;
|
||||
(*fn)(f, "%s", cbuf_get(cb));
|
||||
if (cb)
|
||||
cbuf_free(cb);
|
||||
retval = 0;
|
||||
done:
|
||||
if (cb)
|
||||
cbuf_free(cb);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -703,6 +703,65 @@ yang_schema_mount_statedata(clixon_handle h,
|
|||
goto done;
|
||||
}
|
||||
|
||||
/*! Given xml mount-point and yanglib, find existing yspec
|
||||
*
|
||||
* Get and loop through all XML from xt mount-points.
|
||||
* Get xyanglib and if equal to xt, find and return yspec
|
||||
* @param[in] h Clixon handle
|
||||
* @param[in] xt XML tree node
|
||||
* @param[in] xyanglib yanglib in XML
|
||||
* @param[out] yspecp Yang spec
|
||||
* @retval 0 OK
|
||||
* @retval -1 Error
|
||||
*/
|
||||
static int
|
||||
yang_schema_find_share(clixon_handle h,
|
||||
cxobj *xt,
|
||||
cxobj *xyanglib,
|
||||
yang_stmt **yspecp)
|
||||
{
|
||||
int retval = -1;
|
||||
cvec *cvv = NULL;
|
||||
cg_var *cv;
|
||||
cxobj *xroot;
|
||||
cxobj *xmnt;
|
||||
cxobj *xylib;
|
||||
int config = 1;
|
||||
int ret;
|
||||
|
||||
xroot = xml_root(xt);
|
||||
/* Get all XML mtpoints */
|
||||
if (yang_mount_xtop2xmnt(xroot, &cvv) < 0)
|
||||
goto done;
|
||||
/* Loop through XML mount-points */
|
||||
cv = NULL;
|
||||
while ((cv = cvec_each(cvv, cv)) != NULL) {
|
||||
xmnt = cv_void_get(cv);
|
||||
if (xmnt == xt)
|
||||
continue;
|
||||
xylib = NULL;
|
||||
/* Get xyanglib */
|
||||
if (clixon_plugin_yang_mount_all(h, xmnt, &config, NULL, &xylib) < 0)
|
||||
goto done;
|
||||
if (xylib == NULL)
|
||||
continue;
|
||||
/* Check if equal */
|
||||
if (xml_tree_equal(xyanglib, xylib) == 1)
|
||||
continue;
|
||||
/* Find and return yspec */
|
||||
*yspecp = NULL;
|
||||
if ((ret = xml_yang_mount_get(h, xmnt, NULL, NULL, yspecp)) < 0)
|
||||
goto done;
|
||||
if (ret == 1 && *yspecp != NULL)
|
||||
break;
|
||||
}
|
||||
retval = 0;
|
||||
done:
|
||||
if (cvv)
|
||||
cvec_free(cvv);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*! Get yanglib from user plugin callback, parse it and mount it
|
||||
*
|
||||
* Optionally check for shared yspec
|
||||
|
|
@ -755,7 +814,11 @@ yang_schema_yanglib_parse_mount(clixon_handle h,
|
|||
if ((ydomain = ydomain_new(h, domain)) == NULL)
|
||||
goto done;
|
||||
}
|
||||
yspec0 = yang_find(ydomain, Y_SPEC, domain); // XXX name?
|
||||
/* Optimization: find equal yspec from other mount-point */
|
||||
if (clicon_option_bool(h, "CLICON_YANG_SCHEMA_MOUNT_SHARE")) {
|
||||
if (yang_schema_find_share(h, xt, xyanglib, &yspec0) < 0)
|
||||
goto done;
|
||||
}
|
||||
if ((yspec1 = yspec_new_shared(h, xpath, domain, yspec0)) < 0)
|
||||
goto done;
|
||||
/* Either yspec0 = NULL and yspec1 is new, or yspec0 == yspec1 != NULL (shared) */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue