* Fixed: [RESTConf GET for a specific list instance retrieves data from other submodules that have same list name and key value #244](https://github.com/clicon/clixon/issues/244)
* Fixed: Double clixon error messages in yang2cli code * Sanity checks for submodule belongs-to
This commit is contained in:
parent
fe0541959f
commit
1925ac68cd
7 changed files with 126 additions and 19 deletions
|
|
@ -731,7 +731,8 @@ api_path2xpath_cvv(cvec *api_path,
|
|||
cvk = yang_cvec_get(y); /* Use Y_LIST cache, see ys_populate_list() */
|
||||
cvi = NULL;
|
||||
/* Iterate over individual yang keys */
|
||||
cprintf(xpath, "/");
|
||||
if (i != offset)
|
||||
cprintf(xpath, "/");
|
||||
if (xprefix)
|
||||
cprintf(xpath, "%s:", xprefix);
|
||||
cprintf(xpath, "%s", name);
|
||||
|
|
@ -752,7 +753,8 @@ api_path2xpath_cvv(cvec *api_path,
|
|||
}
|
||||
break;
|
||||
case Y_LEAF_LIST: /* XXX: LOOP? */
|
||||
cprintf(xpath, "/");
|
||||
if (i != offset)
|
||||
cprintf(xpath, "/");
|
||||
if (xprefix)
|
||||
cprintf(xpath, "%s:", xprefix);
|
||||
cprintf(xpath, "%s", name);
|
||||
|
|
@ -1129,6 +1131,9 @@ api_path2xml_vec(char **vec,
|
|||
}
|
||||
|
||||
/*! Create xml tree from api-path
|
||||
*
|
||||
* Create an XML tree from "scratch" using api-path, ie no other input than the api-path itself,
|
||||
* ie not from an existing datastore for example.
|
||||
* @param[in] api_path (Absolute) API-path as defined in RFC 8040
|
||||
* @param[in] yspec Yang spec
|
||||
* @param[in,out] xtop Incoming XML tree
|
||||
|
|
|
|||
|
|
@ -1414,6 +1414,7 @@ ys_real_module(yang_stmt *ys,
|
|||
{
|
||||
int retval = -1;
|
||||
yang_stmt *ym = NULL;
|
||||
yang_stmt *ysubm;
|
||||
yang_stmt *yb;
|
||||
char *name;
|
||||
yang_stmt *yspec;
|
||||
|
|
@ -1433,8 +1434,12 @@ ys_real_module(yang_stmt *ys,
|
|||
clicon_err(OE_YANG, ENOENT, "Belongs-to statement of submodule %s has no argument", yang_argument_get(ym)); /* shouldnt happen */
|
||||
goto done;
|
||||
}
|
||||
if ((ym = yang_find_module_by_name(yspec, name)) == NULL)
|
||||
if ((ysubm = yang_find_module_by_name(yspec, name)) == NULL){
|
||||
clicon_err(OE_YANG, ENOENT, "submodule %s references non-existent module %s in its belongs-to statement",
|
||||
yang_argument_get(ym), name);
|
||||
goto done;
|
||||
}
|
||||
ym = ysubm;
|
||||
}
|
||||
}
|
||||
*ymod = ym;
|
||||
|
|
|
|||
|
|
@ -1032,6 +1032,10 @@ yang_parse_module(clicon_handle h,
|
|||
ymod = NULL;
|
||||
goto done;
|
||||
}
|
||||
/* Sanity check that requested module name matches loaded module
|
||||
* If this does not match, the filename and containing module do not match
|
||||
* RFC 7950 Sec 5.2
|
||||
*/
|
||||
if ((yrev = yang_find(ymod, Y_REVISION, NULL)) != NULL)
|
||||
revm = cv_uint32_get(yang_cv_get(yrev));
|
||||
if (filename2revision(filename, NULL, &revf) < 0)
|
||||
|
|
@ -1064,14 +1068,18 @@ yang_parse_recurse(clicon_handle h,
|
|||
yang_stmt *ymod,
|
||||
yang_stmt *ysp)
|
||||
{
|
||||
int retval = -1;
|
||||
yang_stmt *yi = NULL; /* import */
|
||||
yang_stmt *yrev;
|
||||
char *submodule;
|
||||
char *subrevision;
|
||||
yang_stmt *subymod;
|
||||
int retval = -1;
|
||||
yang_stmt *yi = NULL; /* import */
|
||||
yang_stmt *yrev;
|
||||
yang_stmt *ybelongto;
|
||||
yang_stmt *yrealmod;
|
||||
char *submodule;
|
||||
char *subrevision;
|
||||
yang_stmt *subymod;
|
||||
enum rfc_6020 keyw;
|
||||
|
||||
if (ys_real_module(ymod, &yrealmod) < 0)
|
||||
goto done;
|
||||
/* go through all import (modules) and include(submodules) of ysp */
|
||||
while ((yi = yn_each(ymod, yi)) != NULL){
|
||||
keyw = yang_keyword_get(yi);
|
||||
|
|
@ -1091,6 +1099,21 @@ yang_parse_recurse(clicon_handle h,
|
|||
/* recursive call */
|
||||
if ((subymod = yang_parse_module(h, submodule, subrevision, ysp)) == NULL)
|
||||
goto done;
|
||||
/* Sanity check: if submodule, its belongs-to statement shall point to the module */
|
||||
if (keyw == Y_INCLUDE){
|
||||
ybelongto = yang_find(subymod, Y_BELONGS_TO, NULL);
|
||||
if (ybelongto == NULL){
|
||||
clicon_err(OE_YANG, ENOENT, "Sub-module \"%s\" does not have a belongs-to statement", submodule); /* shouldnt happen */
|
||||
goto done;
|
||||
}
|
||||
if (strcmp(yang_argument_get(ybelongto), yang_argument_get(yrealmod)) != 0){
|
||||
clicon_err(OE_YANG, ENOENT, "Sub-module \"%s\" references module \"%s\" in its belongs-to statement but should reference %s",
|
||||
submodule,
|
||||
yang_argument_get(ybelongto),
|
||||
yang_argument_get(yrealmod));
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
/* Go through its sub-modules recursively */
|
||||
if (yang_parse_recurse(h, subymod, ysp) < 0){
|
||||
ymod = NULL;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue