Add 'connection-status' command to ovs-appctl utility in order to check
if a given chassis is currently connected to SB db

Co-authored-by: aginwala <aginw...@ebay.com>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
---
 lib/jsonrpc.c                       |  6 ++++++
 lib/jsonrpc.h                       |  1 +
 lib/ovsdb-idl.c                     |  6 ++++++
 lib/ovsdb-idl.h                     |  1 +
 ovn/controller/ovn-controller.8.xml |  5 +++++
 ovn/controller/ovn-controller.c     | 18 ++++++++++++++++++
 6 files changed, 37 insertions(+)

diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c
index 4c2c1ba84..21de06003 100644
--- a/lib/jsonrpc.c
+++ b/lib/jsonrpc.c
@@ -1162,6 +1162,12 @@ jsonrpc_session_is_connected(const struct 
jsonrpc_session *s)
     return s->rpc != NULL;
 }
 
+bool
+jsonrpc_session_is_rconnected(const struct jsonrpc_session *s)
+{
+    return reconnect_is_connected(s->reconnect);
+}
+
 /* Returns a sequence number for 's'.  The sequence number increments every
  * time 's' connects or disconnects.  Thus, a caller can use the change (or
  * lack of change) in the sequence number to figure out whether the underlying
diff --git a/lib/jsonrpc.h b/lib/jsonrpc.h
index a44114e8d..cf8351aaf 100644
--- a/lib/jsonrpc.h
+++ b/lib/jsonrpc.h
@@ -125,6 +125,7 @@ void jsonrpc_session_recv_wait(struct jsonrpc_session *);
 
 bool jsonrpc_session_is_alive(const struct jsonrpc_session *);
 bool jsonrpc_session_is_connected(const struct jsonrpc_session *);
+bool jsonrpc_session_is_rconnected(const struct jsonrpc_session *);
 unsigned int jsonrpc_session_get_seqno(const struct jsonrpc_session *);
 int jsonrpc_session_get_status(const struct jsonrpc_session *);
 int jsonrpc_session_get_last_error(const struct jsonrpc_session *);
diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index 9ab5d6723..2c057a0ba 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -922,6 +922,12 @@ ovsdb_idl_is_alive(const struct ovsdb_idl *idl)
            idl->state != IDL_S_ERROR;
 }
 
+bool
+ovsdb_idl_is_rconnected(const struct ovsdb_idl *idl)
+{
+    return jsonrpc_session_is_rconnected(idl->session);
+}
+
 /* Returns the last error reported on a connection by 'idl'.  The return value
  * is 0 only if no connection made by 'idl' has ever encountered an error and
  * a negative response to a schema request has never been received. See
diff --git a/lib/ovsdb-idl.h b/lib/ovsdb-idl.h
index ea18b22f5..e657829c7 100644
--- a/lib/ovsdb-idl.h
+++ b/lib/ovsdb-idl.h
@@ -80,6 +80,7 @@ void ovsdb_idl_force_reconnect(struct ovsdb_idl *);
 void ovsdb_idl_verify_write_only(struct ovsdb_idl *);
 
 bool ovsdb_idl_is_alive(const struct ovsdb_idl *);
+bool ovsdb_idl_is_rconnected(const struct ovsdb_idl *idl);
 int ovsdb_idl_get_last_error(const struct ovsdb_idl *);
 
 void ovsdb_idl_set_probe_interval(const struct ovsdb_idl *, int 
probe_interval);
diff --git a/ovn/controller/ovn-controller.8.xml 
b/ovn/controller/ovn-controller.8.xml
index 0eff2113f..0861edbc4 100644
--- a/ovn/controller/ovn-controller.8.xml
+++ b/ovn/controller/ovn-controller.8.xml
@@ -388,6 +388,11 @@
         0x800</code>.
       </p>
       </dd>
+
+      <dt><code>connection-status</code></dt>
+      <dd>
+        Show OVN SBDB connection status for the chassis.
+      </dd>
       </dl>
     </p>
 
diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c
index 6ee72a9fa..a05098e9b 100644
--- a/ovn/controller/ovn-controller.c
+++ b/ovn/controller/ovn-controller.c
@@ -60,12 +60,14 @@
 #include "timeval.h"
 #include "timer.h"
 #include "stopwatch.h"
+#include "lib/reconnect.h"
 
 VLOG_DEFINE_THIS_MODULE(main);
 
 static unixctl_cb_func ovn_controller_exit;
 static unixctl_cb_func ct_zone_list;
 static unixctl_cb_func inject_pkt;
+static unixctl_cb_func ovn_controller_rconn_show;
 
 #define DEFAULT_BRIDGE_NAME "br-int"
 #define DEFAULT_PROBE_INTERVAL_MSEC 5000
@@ -588,6 +590,9 @@ main(int argc, char *argv[])
         ovsdb_idl_create(ovnsb_remote, &sbrec_idl_class, true, true));
     ovsdb_idl_set_leader_only(ovnsb_idl_loop.idl, false);
 
+    unixctl_command_register("connection-status", "", 0, 0,
+                             ovn_controller_rconn_show, ovnsb_idl_loop.idl);
+
     struct ovsdb_idl_index *sbrec_chassis_by_name
         = chassis_index_create(ovnsb_idl_loop.idl);
     struct ovsdb_idl_index *sbrec_multicast_group_by_name_datapath
@@ -1061,3 +1066,16 @@ update_probe_interval(const struct 
ovsrec_open_vswitch_table *ovs_table,
 
     ovsdb_idl_set_probe_interval(ovnsb_idl, interval);
 }
+
+static void
+ovn_controller_rconn_show(struct unixctl_conn *conn, int argc OVS_UNUSED,
+                          const char *argv[] OVS_UNUSED, void *idl_)
+{
+    char *result = "not connected";
+    struct ovsdb_idl *idl = idl_;
+
+    if (idl && ovsdb_idl_is_rconnected(idl)) {
+       result = "connected";
+    }
+    unixctl_command_reply(conn, result);
+}
-- 
2.17.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to