Autocli optimization feature for generating smaller CLISPECs for large YANGs using treerefs
New `grouping-treeref` option added to clixon-autocli.yang Default is disabled, set to true to generate smaller memory footprint of clixon_cl Add prefix "mtpoint:" to cli api-paths to identify change of yang schemas
This commit is contained in:
parent
d48442960e
commit
f526d5b7a0
14 changed files with 668 additions and 64 deletions
|
|
@ -290,8 +290,8 @@ xml_yang_root(cxobj *x,
|
|||
* @param[in] ys Yang statement
|
||||
* @param[in] inclkey If set include key leaf (eg last leaf d in ex)
|
||||
* @param[out] cb api_path_fmt,
|
||||
* @retval 0 OK
|
||||
* @retval -1 Error
|
||||
* @retval 0 OK
|
||||
* @retval -1 Error
|
||||
* @see RFC8040 3.5.3 where "api-path" is defined as "URI-encoded path expression"
|
||||
*/
|
||||
static int
|
||||
|
|
@ -305,18 +305,26 @@ yang2api_path_fmt_1(yang_stmt *ys,
|
|||
int i;
|
||||
cvec *cvk = NULL; /* vector of index keys */
|
||||
int retval = -1;
|
||||
enum rfc_6020 ypkeyw = -1;
|
||||
|
||||
if ((yp = yang_parent_get(ys)) == NULL){
|
||||
clicon_err(OE_YANG, EINVAL, "yang expected parent %s", yang_argument_get(ys));
|
||||
goto done;
|
||||
}
|
||||
if (yp != NULL && /* XXX rm */
|
||||
yang_keyword_get(yp) != Y_MODULE &&
|
||||
yang_keyword_get(yp) != Y_SUBMODULE){
|
||||
|
||||
if (yp)
|
||||
ypkeyw = yang_keyword_get(yp);
|
||||
switch (ypkeyw){
|
||||
case Y_MODULE:
|
||||
case Y_SUBMODULE:
|
||||
cprintf(cb, "/%s:", yang_argument_get(yp));
|
||||
break;
|
||||
case Y_GROUPING: /* mainly for expand-grouping in clixon-autocli.yang */
|
||||
cprintf(cb, "/");
|
||||
break;
|
||||
default:
|
||||
if (yang2api_path_fmt_1((yang_stmt *)yp, 1, cb) < 0) /* recursive call */
|
||||
goto done;
|
||||
if (yang_keyword_get(yp) != Y_CHOICE && yang_keyword_get(yp) != Y_CASE){
|
||||
if (ypkeyw != Y_CHOICE && ypkeyw != Y_CASE){
|
||||
#if 0
|
||||
/* In some cases, such as cli_show_auto, a trailing '/' should
|
||||
* NOT be present if ys is a key in a list.
|
||||
|
|
@ -324,7 +332,7 @@ yang2api_path_fmt_1(yang_stmt *ys,
|
|||
* so a patch is added in cli_show_auto instead.
|
||||
*/
|
||||
if (yang_keyword_get(ys) == Y_LEAF && yp &&
|
||||
yang_keyword_get(yp) == Y_LIST &&
|
||||
ypkeyw == Y_LIST &&
|
||||
yang_key_match(yp, ys->ys_argument, NULL) == 1)
|
||||
;
|
||||
else
|
||||
|
|
@ -338,17 +346,15 @@ yang2api_path_fmt_1(yang_stmt *ys,
|
|||
goto done;
|
||||
if (ypmod != ymod)
|
||||
cprintf(cb, "%s:", yang_argument_get(ymod));
|
||||
break;
|
||||
}
|
||||
else /* top symbol - mark with name prefix */
|
||||
cprintf(cb, "/%s:", yang_argument_get(yp));
|
||||
|
||||
if (inclkey){
|
||||
if (yang_keyword_get(ys) != Y_CHOICE && yang_keyword_get(ys) != Y_CASE)
|
||||
cprintf(cb, "%s", yang_argument_get(ys));
|
||||
}
|
||||
else{
|
||||
if (yang_keyword_get(ys) == Y_LEAF && yp &&
|
||||
yang_keyword_get(yp) == Y_LIST){
|
||||
ypkeyw == Y_LIST){
|
||||
if (yang_key_match(yp, yang_argument_get(ys), NULL) == 0)
|
||||
cprintf(cb, "%s", yang_argument_get(ys)); /* Not if leaf and key */
|
||||
}
|
||||
|
|
@ -381,6 +387,7 @@ yang2api_path_fmt_1(yang_stmt *ys,
|
|||
}
|
||||
|
||||
/*! Construct an api_path_format from yang statement using wildcards for keys
|
||||
*
|
||||
* Recursively construct it to the top.
|
||||
* Example:
|
||||
* yang: container a -> list b -> key c -> leaf d
|
||||
|
|
@ -389,7 +396,7 @@ yang2api_path_fmt_1(yang_stmt *ys,
|
|||
* @param[in] inclkey If set include key leaf (eg last leaf d in ex)
|
||||
* @param[out] api_path_fmt XML api path. Needs to be freed after use.
|
||||
* @retval 0 OK
|
||||
* @retval -1 Error
|
||||
* @retval -1 Error
|
||||
* "api-path" is "URI-encoded path expression" definition in RFC8040 3.5.3
|
||||
*/
|
||||
int
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ ys_grouping_module_resolve(yang_stmt *ymod,
|
|||
* @retval 0 OK, ygrouping may be NULL
|
||||
* @retval -1 Error, with clicon_err called
|
||||
*/
|
||||
static int
|
||||
int
|
||||
ys_grouping_resolve(yang_stmt *yuses,
|
||||
char *prefix,
|
||||
char *name,
|
||||
|
|
@ -235,7 +235,6 @@ yang_augment_node(clicon_handle h,
|
|||
clicon_err(OE_YANG, 0, "My yang module not found");
|
||||
goto done;
|
||||
}
|
||||
/* */
|
||||
schema_nodeid = yang_argument_get(ys);
|
||||
clicon_debug(CLIXON_DBG_DETAIL, "%s %s", __FUNCTION__, schema_nodeid);
|
||||
/* Find the target */
|
||||
|
|
@ -279,7 +278,11 @@ yang_augment_node(clicon_handle h,
|
|||
while ((yc0 = yn_each(ys, yc0)) != NULL) {
|
||||
childkey = yang_keyword_get(yc0);
|
||||
/* Only shemanodes and extensions */
|
||||
if (!yang_schemanode(yc0) && childkey != Y_UNKNOWN)
|
||||
if (!yang_schemanode(yc0) && childkey != Y_UNKNOWN
|
||||
#ifndef AUTOCLI_GROUPING_AUGMENT_SKIP
|
||||
&& childkey != Y_USES
|
||||
#endif
|
||||
)
|
||||
continue;
|
||||
switch (targetkey){
|
||||
case Y_CONTAINER:
|
||||
|
|
@ -344,9 +347,12 @@ yang_augment_node(clicon_handle h,
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ((yc = ys_dup(yc0)) == NULL)
|
||||
goto done;
|
||||
#ifdef AUTOCLI_GROUPING_AUGMENT_SKIP
|
||||
/* cornercase: always expand uses under augment */
|
||||
yang_flag_reset(yc, YANG_FLAG_GROUPING);
|
||||
#endif
|
||||
yc->ys_mymodule = ymod;
|
||||
|
||||
if (yn_insert(ytarget, yc) < 0)
|
||||
|
|
@ -679,6 +685,7 @@ yang_expand_uses_node(yang_stmt *yn,
|
|||
yang_flag_set(yg, YANG_FLAG_NOKEY);
|
||||
yn->ys_stmt[i+k+1] = yg;
|
||||
yg->ys_parent = yn;
|
||||
yang_flag_set(yg, YANG_FLAG_GROUPING);
|
||||
k++;
|
||||
}
|
||||
/* Remove the grouping copy */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue