Allow the operator to query whether a ovn-northd process is currently active for the standalone and clustered DB use case.
At present this information is only available in the log. Signed-off-by: Frode Nordahl <[email protected]> --- northd/ovn-northd.8.xml | 9 ++++++++- northd/ovn-northd.c | 20 +++++++++++++++++++- tests/ovn-northd.at | 9 +++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml index 78b1e84ad..d7833cda7 100644 --- a/northd/ovn-northd.8.xml +++ b/northd/ovn-northd.8.xml @@ -87,13 +87,20 @@ <dd> Returns "true" if ovn-northd is currently paused, "false" otherwise. </dd> + + <dt><code>status</code></dt> + <dd> + Prints this server's status. Status will be "active" if ovn-northd has + acquired OVSDB lock on NB DB, "standby" otherwise. + </dd> </dl> </p> <h1>Active-Standby for High Availability</h1> <p> You may run <code>ovn-northd</code> more than once in an OVN deployment. - OVN will automatically ensure that only one of them is active at a time. + When connected to a standalone or clustered DB setup, OVN will + automatically ensure that only one of them is active at a time. If multiple instances of <code>ovn-northd</code> are running and the active <code>ovn-northd</code> fails, one of the hot standby instances of <code>ovn-northd</code> will automatically take over. diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c index 41e97f841..83ad6d518 100644 --- a/northd/ovn-northd.c +++ b/northd/ovn-northd.c @@ -55,6 +55,7 @@ static unixctl_cb_func ovn_northd_exit; static unixctl_cb_func ovn_northd_pause; static unixctl_cb_func ovn_northd_resume; static unixctl_cb_func ovn_northd_is_paused; +static unixctl_cb_func ovn_northd_status; struct northd_context { struct ovsdb_idl *ovnnb_idl; @@ -10838,6 +10839,7 @@ main(int argc, char *argv[]) int retval; bool exiting; bool paused; + bool had_lock; fatal_ignore_sigpipe(); ovs_cmdl_proctitle_init(argc, argv); @@ -10863,6 +10865,7 @@ main(int argc, char *argv[]) unixctl_command_register("resume", "", 0, 0, ovn_northd_resume, &paused); unixctl_command_register("is-paused", "", 0, 0, ovn_northd_is_paused, &paused); + unixctl_command_register("status", "", 0, 0, ovn_northd_status, &had_lock); daemonize_complete(); @@ -11068,11 +11071,11 @@ main(int argc, char *argv[]) * acquiring a lock called "ovn_northd" on the southbound database * and then only performing DB transactions if the lock is held. */ ovsdb_idl_set_lock(ovnsb_idl_loop.idl, "ovn_northd"); - bool had_lock = false; /* Main loop. */ exiting = false; paused = false; + had_lock = false; while (!exiting) { if (!paused) { struct northd_context ctx = { @@ -11180,3 +11183,18 @@ ovn_northd_is_paused(struct unixctl_conn *conn, int argc OVS_UNUSED, unixctl_command_reply(conn, "false"); } } + +static void +ovn_northd_status(struct unixctl_conn *conn, int argc OVS_UNUSED, + const char *argv[] OVS_UNUSED, void *had_lock_) +{ + bool *had_lock = had_lock_; + /* + * Use a labelled formatted output so we can add more to the status command + * later without breaking any consuming scripts + */ + struct ds s = DS_EMPTY_INITIALIZER; + ds_put_format(&s, "Status: %s\n", *had_lock ? "active" : "standby"); + unixctl_command_reply(conn, ds_cstr(&s)); + ds_destroy(&s); +} diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at index da566f900..17e60b051 100644 --- a/tests/ovn-northd.at +++ b/tests/ovn-northd.at @@ -899,6 +899,15 @@ OVS_APP_EXIT_AND_WAIT([ovn-northd]) AT_CLEANUP +AT_SETUP([ovn -- ovn-northd status]) +AT_SKIP_IF([test $HAVE_PYTHON = no]) +ovn_start + +AT_CHECK([as northd ovs-appctl -t ovn-northd status], [0], [Status: active +]) + +AT_CLEANUP + AT_SETUP([ovn -- ovn-northd pause and resume]) AT_SKIP_IF([test $HAVE_PYTHON = no]) ovn_start -- 2.24.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
