lib: Add support to load submodules in embedded modules framework

BGP Yang is using sub modules and at present FRR is not processing
submodules in embedded framework yang

Signed-off-by: VishalDhingra <vdhingra@vmware.com>
This commit is contained in:
vdhingra 2020-06-05 00:10:41 -07:00
parent 5677e93f8f
commit 65de8bc8d0
3 changed files with 38 additions and 13 deletions

View file

@ -53,22 +53,30 @@ static const char *yang_module_imp_clb(const char *mod_name,
{
struct yang_module_embed *e;
if (submod_name || submod_rev)
return NULL;
for (e = embeds; e; e = e->next) {
if (e->sub_mod_name && submod_name) {
if (strcmp(e->sub_mod_name, submod_name))
continue;
if (submod_rev && strcmp(e->sub_mod_rev, submod_rev))
continue;
} else {
if (strcmp(e->mod_name, mod_name))
continue;
if (mod_rev && strcmp(e->mod_rev, mod_rev))
continue;
}
*format = e->format;
return e->data;
}
flog_warn(EC_LIB_YANG_MODULE_LOAD,
"YANG model \"%s@%s\" not embedded, trying external file",
mod_name, mod_rev ? mod_rev : "*");
flog_warn(
EC_LIB_YANG_MODULE_LOAD,
"YANG model \"%s@%s\" \"%s@%s\"not embedded, trying external file",
mod_name, mod_rev ? mod_rev : "*",
submod_name ? submod_name : "*", submod_rev ? submod_rev : "*");
return NULL;
}

View file

@ -48,6 +48,8 @@ extern "C" {
struct yang_module_embed {
struct yang_module_embed *next;
const char *mod_name, *mod_rev;
const char *sub_mod_name;
const char *sub_mod_rev;
const char *data;
LYS_INFORMAT format;
};

View file

@ -20,6 +20,8 @@ if not os.path.isdir(outdir):
# to make it even harder.
re_name = re.compile(r'\bmodule\s+([^\s]+)\s+\{')
re_subname = re.compile(r'\bsubmodule\s+([^\s]+)\s+\{')
re_mainname = re.compile(r'\bbelongs-to\s+([^\s]+)\s+\{')
re_rev = re.compile(r'\brevision\s+([\d-]+)\s+\{')
@ -34,6 +36,8 @@ static const char model[] =
static struct yang_module_embed embed = {
\t.mod_name = "%s",
\t.mod_rev = "%s",
\t.sub_mod_name = "%s",
\t.sub_mod_rev = "%s",
\t.data = model,
\t.format = %s,
};
@ -62,6 +66,10 @@ def escape(line):
with open(inname, 'r') as fd:
data = fd.read()
sub_name = ""
rev = ""
sub_rev = ""
# XML support isn't actively used currently, but it's here in case the need
# arises. It does avoid the regex'ing.
if '<?xml' in data:
@ -71,8 +79,15 @@ if '<?xml' in data:
rev = xml.find('{urn:ietf:params:xml:ns:yang:yin:1}revision').get('date')
fmt = 'LYS_YIN'
else:
name = re_name.search(data).group(1)
search_name = re_name.search(data)
if search_name :
name = search_name.group(1)
rev = re_rev.search(data).group(1)
else :
search_name = re_subname.search(data)
sub_name = search_name.group(1)
name = re_mainname.search(data).group(1)
sub_rev = re_rev.search(data).group(1)
fmt = 'LYS_YANG'
if name is None or rev is None:
@ -82,4 +97,4 @@ lines = [escape(row) for row in data.split('\n')]
text = '\\n"\n\t"'.join(lines)
with open(outname, 'w') as fd:
fd.write(template % (text, escape(name), escape(rev), fmt))
fd.write(template % (text, escape(name), escape(rev), escape(sub_name), escape(sub_rev), fmt))