From e8648a0c72f89d4ee5abe271ba079df71c4c1418 Mon Sep 17 00:00:00 2001 From: Christian Hopps Date: Mon, 7 Oct 2024 03:23:31 +0000 Subject: [PATCH] lib: add flag to have libyang load internal ietf-yang-library module Mgmtd makes use of libyang's internal ietf-yang-library module to add support for said module to FRR management. Previously, mgmtd was loading this module explicitly; however, that required that libyang's `ietf-yang-library.yang` module definition file be co-located with FRR's yang files so that it (and ietf-datastore.yang) would be found when searched for by libyang using FRRs search path. This isn't always the case depending on how the user compiles and installs libyang so mgmtd was failing to run in some cases. Instead of doing it the above way we simply tell libyang to load it's internal version of ietf-yang-library when we initialize the libyang context. This required adding a boolean to a couple of the init functions which is why so many files are touched (although all the changes are minimal). Signed-off-by: Christian Hopps --- lib/grammar_sandbox_main.c | 2 +- lib/libfrr.c | 3 ++- lib/libfrr.h | 5 +++++ lib/northbound.c | 4 ++-- lib/northbound.h | 8 +++++--- lib/yang.c | 10 ++++++---- lib/yang.h | 10 +++++++--- lib/yang_translator.c | 4 ++-- mgmtd/mgmt.c | 3 --- mgmtd/mgmt_main.c | 2 +- tests/bgpd/test_peer_attr.c | 2 +- tests/helpers/c/main.c | 2 +- tests/isisd/test_isis_spf.c | 2 +- tests/lib/cli/common_cli.c | 2 +- tests/lib/cli/test_commands.c | 2 +- tests/lib/northbound/test_oper_data.c | 2 +- tests/lib/test_grpc.cpp | 3 +-- tools/gen_northbound_callbacks.c | 2 +- tools/gen_yang_deviations.c | 2 +- 19 files changed, 40 insertions(+), 30 deletions(-) diff --git a/lib/grammar_sandbox_main.c b/lib/grammar_sandbox_main.c index abd42f359f..05088d52d1 100644 --- a/lib/grammar_sandbox_main.c +++ b/lib/grammar_sandbox_main.c @@ -40,7 +40,7 @@ int main(int argc, char **argv) vty_init(master, true); lib_cmd_init(); - nb_init(master, NULL, 0, false); + nb_init(master, NULL, 0, false, false); vty_stdio(vty_do_exit); diff --git a/lib/libfrr.c b/lib/libfrr.c index a1982841d3..f2247a48e5 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -820,7 +820,8 @@ struct event_loop *frr_init(void) log_ref_vty_init(); lib_error_init(); - nb_init(master, di->yang_modules, di->n_yang_modules, true); + nb_init(master, di->yang_modules, di->n_yang_modules, true, + (di->flags & FRR_LOAD_YANG_LIBRARY) != 0); if (nb_db_init() != NB_OK) flog_warn(EC_LIB_NB_DATABASE, "%s: failed to initialize northbound database", diff --git a/lib/libfrr.h b/lib/libfrr.h index 7ed7be4d98..df537e2e3b 100644 --- a/lib/libfrr.h +++ b/lib/libfrr.h @@ -46,6 +46,11 @@ extern "C" { * is responsible for calling frr_vty_serv() itself. */ #define FRR_MANUAL_VTY_START (1 << 7) +/* If FRR_LOAD_YANG_LIBRARY is set then libyang will be told to load and + * implement it's internal ietf-yang-library implementation. This should + * normally only be done from mgmtd. + */ +#define FRR_LOAD_YANG_LIBRARY (1 << 8) PREDECL_DLIST(log_args); struct log_arg { diff --git a/lib/northbound.c b/lib/northbound.c index 2dae21341e..a385cc9ece 100644 --- a/lib/northbound.c +++ b/lib/northbound.c @@ -2701,7 +2701,7 @@ void nb_validate_callbacks(void) void nb_init(struct event_loop *tm, const struct frr_yang_module_info *const modules[], - size_t nmodules, bool db_enabled) + size_t nmodules, bool db_enabled, bool load_library) { struct yang_module *loaded[nmodules], **loadedp = loaded; @@ -2717,7 +2717,7 @@ void nb_init(struct event_loop *tm, nb_db_enabled = db_enabled; - yang_init(true, explicit_compile); + yang_init(true, explicit_compile, load_library); /* Load YANG modules and their corresponding northbound callbacks. */ for (size_t i = 0; i < nmodules; i++) { diff --git a/lib/northbound.h b/lib/northbound.h index dd3fbf8f73..97a1d31e57 100644 --- a/lib/northbound.h +++ b/lib/northbound.h @@ -1703,10 +1703,12 @@ void nb_validate_callbacks(void); * * db_enabled * Set this to record the transactions in the transaction log. + * + * load_library + * Set this to have libyang to load/implement the ietf-yang-library. */ -extern void nb_init(struct event_loop *tm, - const struct frr_yang_module_info *const modules[], - size_t nmodules, bool db_enabled); +extern void nb_init(struct event_loop *tm, const struct frr_yang_module_info *const modules[], + size_t nmodules, bool db_enabled, bool load_library); /* * Finish the northbound layer gracefully. Should be called only when the daemon diff --git a/lib/yang.c b/lib/yang.c index 14d5b118c6..b847b8b77b 100644 --- a/lib/yang.c +++ b/lib/yang.c @@ -976,7 +976,7 @@ void yang_debugging_set(bool enable) } } -struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile) +struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile, bool load_library) { struct ly_ctx *ctx = NULL; const char *yang_models_path = YANG_MODELS_PATH; @@ -994,7 +994,9 @@ struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile) YANG_MODELS_PATH); } - options = LY_CTX_NO_YANGLIBRARY | LY_CTX_DISABLE_SEARCHDIR_CWD; + options = LY_CTX_DISABLE_SEARCHDIR_CWD; + if (!load_library) + options |= LY_CTX_NO_YANGLIBRARY; if (explicit_compile) options |= LY_CTX_EXPLICIT_COMPILE; err = ly_ctx_new(yang_models_path, options, &ctx); @@ -1007,7 +1009,7 @@ struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile) return ctx; } -void yang_init(bool embedded_modules, bool defer_compile) +void yang_init(bool embedded_modules, bool defer_compile, bool load_library) { /* Initialize libyang global parameters that affect all containers. */ ly_set_log_clb(ly_zlog_cb @@ -1019,7 +1021,7 @@ void yang_init(bool embedded_modules, bool defer_compile) ly_log_options(LY_LOLOG | LY_LOSTORE); /* Initialize libyang container for native models. */ - ly_native_ctx = yang_ctx_new_setup(embedded_modules, defer_compile); + ly_native_ctx = yang_ctx_new_setup(embedded_modules, defer_compile, load_library); if (!ly_native_ctx) { flog_err(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__); exit(1); diff --git a/lib/yang.h b/lib/yang.h index c4fc78b8ae..52857ecf00 100644 --- a/lib/yang.h +++ b/lib/yang.h @@ -607,9 +607,11 @@ extern struct yang_data *yang_data_list_find(const struct list *list, * explicit_compile * True if the caller will later call ly_ctx_compile to compile all loaded * modules at once. + * load_library + * Set this to have libyang to load/implement the ietf-yang-library. */ -extern struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, - bool explicit_compile); +extern struct ly_ctx *yang_ctx_new_setup(bool embedded_modules, bool explicit_compile, + bool load_library); /* * Enable or disable libyang verbose debugging. @@ -727,8 +729,10 @@ extern const char *yang_print_errors(struct ly_ctx *ly_ctx, char *buf, * Specify whether libyang should attempt to look for embedded YANG modules. * defer_compile * Hold off on compiling modules until yang_init_loading_complete is called. + * load_library + * Set this to have libyang to load/implement the ietf-yang-library. */ -extern void yang_init(bool embedded_modules, bool defer_compile); +extern void yang_init(bool embedded_modules, bool defer_compile, bool load_library); /* * Should be called after yang_init and all yang_module_load()s have been done, diff --git a/lib/yang_translator.c b/lib/yang_translator.c index 005f6422f3..b7599e0a71 100644 --- a/lib/yang_translator.c +++ b/lib/yang_translator.c @@ -166,7 +166,7 @@ struct yang_translator *yang_translator_load(const char *path) RB_INSERT(yang_translators, &yang_translators, translator); /* Initialize the translator libyang context. */ - translator->ly_ctx = yang_ctx_new_setup(false, false); + translator->ly_ctx = yang_ctx_new_setup(false, false, false); if (!translator->ly_ctx) { flog_warn(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__); goto error; @@ -512,7 +512,7 @@ static unsigned int yang_module_nodes_count(const struct lys_module *module) void yang_translator_init(void) { - ly_translator_ctx = yang_ctx_new_setup(true, false); + ly_translator_ctx = yang_ctx_new_setup(true, false, false); if (!ly_translator_ctx) { flog_err(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__); exit(1); diff --git a/mgmtd/mgmt.c b/mgmtd/mgmt.c index 02c54b9215..cfadad4829 100644 --- a/mgmtd/mgmt.c +++ b/mgmtd/mgmt.c @@ -57,9 +57,6 @@ void mgmt_init(void) /* Initialize MGMTD Transaction module */ mgmt_txn_init(mm, mm->master); - /* Add yang-library module */ - yang_module_load("ietf-yang-library", NULL); - /* Initialize the MGMTD Frontend Adapter Module */ mgmt_fe_adapter_init(mm->master); diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c index e181d0da5e..1880d94415 100644 --- a/mgmtd/mgmt_main.c +++ b/mgmtd/mgmt_main.c @@ -214,7 +214,7 @@ FRR_DAEMON_INFO(mgmtd, MGMTD, .n_yang_modules = array_size(mgmt_yang_modules), /* avoid libfrr trying to read our config file for us */ - .flags = FRR_MANUAL_VTY_START | FRR_NO_SPLIT_CONFIG, + .flags = FRR_MANUAL_VTY_START | FRR_NO_SPLIT_CONFIG | FRR_LOAD_YANG_LIBRARY, ); /* clang-format on */ diff --git a/tests/bgpd/test_peer_attr.c b/tests/bgpd/test_peer_attr.c index d5faa33ca8..17002464e1 100644 --- a/tests/bgpd/test_peer_attr.c +++ b/tests/bgpd/test_peer_attr.c @@ -1355,7 +1355,7 @@ static void bgp_startup(void) zprivs_init(&bgpd_privs); master = event_master_create(NULL); - nb_init(master, NULL, 0, false); + nb_init(master, NULL, 0, false, false); bgp_master_init(master, BGP_SOCKET_SNDBUF_SIZE, list_new()); bgp_option_set(BGP_OPT_NO_LISTEN); vrf_init(NULL, NULL, NULL, NULL); diff --git a/tests/helpers/c/main.c b/tests/helpers/c/main.c index 9cb395bb1f..344af82fca 100644 --- a/tests/helpers/c/main.c +++ b/tests/helpers/c/main.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) vty_init(master, false); lib_cmd_init(); debug_init(); - nb_init(master, NULL, 0, false); + nb_init(master, NULL, 0, false, false); /* OSPF vty inits. */ test_vty_init(); diff --git a/tests/isisd/test_isis_spf.c b/tests/isisd/test_isis_spf.c index 93009a1b84..e5a8f7a513 100644 --- a/tests/isisd/test_isis_spf.c +++ b/tests/isisd/test_isis_spf.c @@ -546,7 +546,7 @@ int main(int argc, char **argv) cmd_init(1); cmd_hostname_set("test"); vty_init(master, false); - yang_init(true, false); + yang_init(true, false, false); if (debug) zlog_aux_init("NONE: ", LOG_DEBUG); else diff --git a/tests/lib/cli/common_cli.c b/tests/lib/cli/common_cli.c index 6401971435..342a91cc79 100644 --- a/tests/lib/cli/common_cli.c +++ b/tests/lib/cli/common_cli.c @@ -77,7 +77,7 @@ int main(int argc, char **argv) for (yangcount = 0; test_yang_modules && test_yang_modules[yangcount]; yangcount++) ; - nb_init(master, test_yang_modules, yangcount, false); + nb_init(master, test_yang_modules, yangcount, false, false); test_init(argc, argv); diff --git a/tests/lib/cli/test_commands.c b/tests/lib/cli/test_commands.c index 0034c2af89..9873383fdc 100644 --- a/tests/lib/cli/test_commands.c +++ b/tests/lib/cli/test_commands.c @@ -197,7 +197,7 @@ static void test_init(void) cmd_init(1); debug_init(); - nb_init(master, NULL, 0, false); + nb_init(master, NULL, 0, false, false); install_node(&bgp_node); install_node(&rip_node); diff --git a/tests/lib/northbound/test_oper_data.c b/tests/lib/northbound/test_oper_data.c index 74a0dfe6cc..fdc9e53ca3 100644 --- a/tests/lib/northbound/test_oper_data.c +++ b/tests/lib/northbound/test_oper_data.c @@ -461,7 +461,7 @@ int main(int argc, char **argv) vty_init(master, false); lib_cmd_init(); debug_init(); - nb_init(master, modules, array_size(modules), false); + nb_init(master, modules, array_size(modules), false, false); install_element(ENABLE_NODE, &test_rpc_cmd); diff --git a/tests/lib/test_grpc.cpp b/tests/lib/test_grpc.cpp index 2f0282704e..379a8688a7 100644 --- a/tests/lib/test_grpc.cpp +++ b/tests/lib/test_grpc.cpp @@ -111,8 +111,7 @@ static void static_startup(void) static_debug_init(); master = event_master_create(NULL); - nb_init(master, staticd_yang_modules, array_size(staticd_yang_modules), - false); + nb_init(master, staticd_yang_modules, array_size(staticd_yang_modules), false, false); static_zebra_init(); vty_init(master, true); diff --git a/tools/gen_northbound_callbacks.c b/tools/gen_northbound_callbacks.c index a879811363..046dc9e99e 100644 --- a/tools/gen_northbound_callbacks.c +++ b/tools/gen_northbound_callbacks.c @@ -448,7 +448,7 @@ int main(int argc, char *argv[]) if (argc != 1) usage(EXIT_FAILURE); - yang_init(false, true); + yang_init(false, true, false); if (search_path) ly_ctx_set_searchdir(ly_native_ctx, search_path); diff --git a/tools/gen_yang_deviations.c b/tools/gen_yang_deviations.c index 251643c69e..c2e7fd91c6 100644 --- a/tools/gen_yang_deviations.c +++ b/tools/gen_yang_deviations.c @@ -52,7 +52,7 @@ int main(int argc, char *argv[]) if (argc != 1) usage(EXIT_FAILURE); - yang_init(false, false); + yang_init(false, false, false); /* Load YANG module. */ module = yang_module_load(argv[0], NULL);