mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-28 16:06:20 +00:00
Merge pull request #7103 from opensourcerouting/sysrepo-fixes
lib: sysrepo plugin fixes
This commit is contained in:
commit
32e3ca2bcc
@ -45,6 +45,7 @@
|
|||||||
#include "defaults.h"
|
#include "defaults.h"
|
||||||
|
|
||||||
DEFINE_HOOK(frr_late_init, (struct thread_master * tm), (tm))
|
DEFINE_HOOK(frr_late_init, (struct thread_master * tm), (tm))
|
||||||
|
DEFINE_HOOK(frr_very_late_init, (struct thread_master * tm), (tm))
|
||||||
DEFINE_KOOH(frr_early_fini, (), ())
|
DEFINE_KOOH(frr_early_fini, (), ())
|
||||||
DEFINE_KOOH(frr_fini, (), ())
|
DEFINE_KOOH(frr_fini, (), ())
|
||||||
|
|
||||||
@ -913,6 +914,8 @@ static int frr_config_read_in(struct thread *t)
|
|||||||
__func__, nb_err_name(ret), errmsg);
|
__func__, nb_err_name(ret), errmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hook_call(frr_very_late_init, master);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,6 +136,7 @@ extern const char *frr_get_progname(void);
|
|||||||
extern enum frr_cli_mode frr_get_cli_mode(void);
|
extern enum frr_cli_mode frr_get_cli_mode(void);
|
||||||
|
|
||||||
DECLARE_HOOK(frr_late_init, (struct thread_master * tm), (tm))
|
DECLARE_HOOK(frr_late_init, (struct thread_master * tm), (tm))
|
||||||
|
DECLARE_HOOK(frr_very_late_init, (struct thread_master * tm), (tm))
|
||||||
extern void frr_config_fork(void);
|
extern void frr_config_fork(void);
|
||||||
|
|
||||||
extern void frr_run(struct thread_master *master);
|
extern void frr_run(struct thread_master *master);
|
||||||
|
@ -174,6 +174,9 @@ static int frr_sr_process_change(struct nb_config *candidate,
|
|||||||
|
|
||||||
xpath = sr_data->xpath;
|
xpath = sr_data->xpath;
|
||||||
|
|
||||||
|
DEBUGD(&nb_dbg_client_sysrepo, "sysrepo: processing change [xpath %s]",
|
||||||
|
xpath);
|
||||||
|
|
||||||
/* Non-presence container - nothing to do. */
|
/* Non-presence container - nothing to do. */
|
||||||
if (sr_data->type == SR_CONTAINER_T)
|
if (sr_data->type == SR_CONTAINER_T)
|
||||||
return NB_OK;
|
return NB_OK;
|
||||||
@ -223,7 +226,7 @@ static int frr_sr_process_change(struct nb_config *candidate,
|
|||||||
|
|
||||||
ret = nb_candidate_edit(candidate, nb_node, nb_op, xpath, NULL, data);
|
ret = nb_candidate_edit(candidate, nb_node, nb_op, xpath, NULL, data);
|
||||||
yang_data_free(data);
|
yang_data_free(data);
|
||||||
if (ret != NB_OK) {
|
if (ret != NB_OK && ret != NB_ERR_NOT_FOUND) {
|
||||||
flog_warn(
|
flog_warn(
|
||||||
EC_LIB_NB_CANDIDATE_EDIT_ERROR,
|
EC_LIB_NB_CANDIDATE_EDIT_ERROR,
|
||||||
"%s: failed to edit candidate configuration: operation [%s] xpath [%s]",
|
"%s: failed to edit candidate configuration: operation [%s] xpath [%s]",
|
||||||
@ -235,8 +238,7 @@ static int frr_sr_process_change(struct nb_config *candidate,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int frr_sr_config_change_cb_prepare(sr_session_ctx_t *session,
|
static int frr_sr_config_change_cb_prepare(sr_session_ctx_t *session,
|
||||||
const char *module_name,
|
const char *module_name)
|
||||||
bool startup_config)
|
|
||||||
{
|
{
|
||||||
sr_change_iter_t *it;
|
sr_change_iter_t *it;
|
||||||
int ret;
|
int ret;
|
||||||
@ -275,33 +277,17 @@ static int frr_sr_config_change_cb_prepare(sr_session_ctx_t *session,
|
|||||||
|
|
||||||
transaction = NULL;
|
transaction = NULL;
|
||||||
context.client = NB_CLIENT_SYSREPO;
|
context.client = NB_CLIENT_SYSREPO;
|
||||||
if (startup_config) {
|
|
||||||
/*
|
|
||||||
* sysrepod sends the entire startup configuration using a
|
|
||||||
* single event (SR_EV_ENABLED). This means we need to perform
|
|
||||||
* the full two-phase commit protocol in one go here.
|
|
||||||
*/
|
|
||||||
ret = nb_candidate_commit(&context, candidate, true, NULL, NULL,
|
|
||||||
errmsg, sizeof(errmsg));
|
|
||||||
if (ret != NB_OK && ret != NB_ERR_NO_CHANGES)
|
|
||||||
flog_warn(
|
|
||||||
EC_LIB_LIBSYSREPO,
|
|
||||||
"%s: failed to apply startup configuration: %s (%s)",
|
|
||||||
__func__, nb_err_name(ret), errmsg);
|
|
||||||
} else {
|
|
||||||
/*
|
/*
|
||||||
* Validate the configuration changes and allocate all resources
|
* Validate the configuration changes and allocate all resources
|
||||||
* required to apply them.
|
* required to apply them.
|
||||||
*/
|
*/
|
||||||
ret = nb_candidate_commit_prepare(&context, candidate, NULL,
|
ret = nb_candidate_commit_prepare(&context, candidate, NULL,
|
||||||
&transaction, errmsg,
|
&transaction, errmsg, sizeof(errmsg));
|
||||||
sizeof(errmsg));
|
|
||||||
if (ret != NB_OK && ret != NB_ERR_NO_CHANGES)
|
if (ret != NB_OK && ret != NB_ERR_NO_CHANGES)
|
||||||
flog_warn(
|
flog_warn(
|
||||||
EC_LIB_LIBSYSREPO,
|
EC_LIB_LIBSYSREPO,
|
||||||
"%s: failed to prepare configuration transaction: %s (%s)",
|
"%s: failed to prepare configuration transaction: %s (%s)",
|
||||||
__func__, nb_err_name(ret), errmsg);
|
__func__, nb_err_name(ret), errmsg);
|
||||||
}
|
|
||||||
|
|
||||||
if (!transaction)
|
if (!transaction)
|
||||||
nb_config_free(candidate);
|
nb_config_free(candidate);
|
||||||
@ -360,11 +346,8 @@ static int frr_sr_config_change_cb(sr_session_ctx_t *session,
|
|||||||
{
|
{
|
||||||
switch (sr_ev) {
|
switch (sr_ev) {
|
||||||
case SR_EV_ENABLED:
|
case SR_EV_ENABLED:
|
||||||
return frr_sr_config_change_cb_prepare(session, module_name,
|
|
||||||
true);
|
|
||||||
case SR_EV_CHANGE:
|
case SR_EV_CHANGE:
|
||||||
return frr_sr_config_change_cb_prepare(session, module_name,
|
return frr_sr_config_change_cb_prepare(session, module_name);
|
||||||
false);
|
|
||||||
case SR_EV_DONE:
|
case SR_EV_DONE:
|
||||||
return frr_sr_config_change_cb_apply(session, module_name);
|
return frr_sr_config_change_cb_apply(session, module_name);
|
||||||
case SR_EV_ABORT:
|
case SR_EV_ABORT:
|
||||||
@ -563,6 +546,10 @@ static void frr_sr_subscribe_config(struct yang_module *module)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
DEBUGD(&nb_dbg_client_sysrepo,
|
||||||
|
"sysrepo: subscribing for configuration changes made in the '%s' module",
|
||||||
|
module->name);
|
||||||
|
|
||||||
ret = sr_module_change_subscribe(
|
ret = sr_module_change_subscribe(
|
||||||
session, module->name, NULL, frr_sr_config_change_cb, NULL, 0,
|
session, module->name, NULL, frr_sr_config_change_cb, NULL, 0,
|
||||||
SR_SUBSCR_DEFAULT | SR_SUBSCR_ENABLED | SR_SUBSCR_NO_THREAD,
|
SR_SUBSCR_DEFAULT | SR_SUBSCR_ENABLED | SR_SUBSCR_NO_THREAD,
|
||||||
@ -586,7 +573,7 @@ static int frr_sr_subscribe_state(const struct lys_node *snode, void *arg)
|
|||||||
|
|
||||||
nb_node = snode->priv;
|
nb_node = snode->priv;
|
||||||
|
|
||||||
DEBUGD(&nb_dbg_client_sysrepo, "%s: providing data to '%s'", __func__,
|
DEBUGD(&nb_dbg_client_sysrepo, "sysrepo: providing data to '%s'",
|
||||||
nb_node->xpath);
|
nb_node->xpath);
|
||||||
|
|
||||||
ret = sr_oper_get_items_subscribe(
|
ret = sr_oper_get_items_subscribe(
|
||||||
@ -610,7 +597,7 @@ static int frr_sr_subscribe_rpc(const struct lys_node *snode, void *arg)
|
|||||||
|
|
||||||
nb_node = snode->priv;
|
nb_node = snode->priv;
|
||||||
|
|
||||||
DEBUGD(&nb_dbg_client_sysrepo, "%s: providing RPC to '%s'", __func__,
|
DEBUGD(&nb_dbg_client_sysrepo, "sysrepo: providing RPC to '%s'",
|
||||||
nb_node->xpath);
|
nb_node->xpath);
|
||||||
|
|
||||||
ret = sr_rpc_subscribe(session, nb_node->xpath, frr_sr_config_rpc_cb,
|
ret = sr_rpc_subscribe(session, nb_node->xpath, frr_sr_config_rpc_cb,
|
||||||
@ -742,7 +729,7 @@ static int frr_sr_finish(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int frr_sr_module_late_init(struct thread_master *tm)
|
static int frr_sr_module_very_late_init(struct thread_master *tm)
|
||||||
{
|
{
|
||||||
master = tm;
|
master = tm;
|
||||||
|
|
||||||
@ -753,6 +740,12 @@ static int frr_sr_module_late_init(struct thread_master *tm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
hook_register(frr_fini, frr_sr_finish);
|
hook_register(frr_fini, frr_sr_finish);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int frr_sr_module_late_init(struct thread_master *tm)
|
||||||
|
{
|
||||||
frr_sr_cli_init();
|
frr_sr_cli_init();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -761,6 +754,7 @@ static int frr_sr_module_late_init(struct thread_master *tm)
|
|||||||
static int frr_sr_module_init(void)
|
static int frr_sr_module_init(void)
|
||||||
{
|
{
|
||||||
hook_register(frr_late_init, frr_sr_module_late_init);
|
hook_register(frr_late_init, frr_sr_module_late_init);
|
||||||
|
hook_register(frr_very_late_init, frr_sr_module_very_late_init);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user