Added ability to output multiple individual chassis by their
name, hostname and encap-ip.

Signed-off-by: Alexandra Rukomoinikova <[email protected]>
Tested-by: Ivan Burnin <[email protected]>
---
v2: - removed all copy from ovs function
    - removed hash for hostnames
---
 tests/ovn-sbctl.at    |   9 ++++
 utilities/ovn-sbctl.c | 109 +++++++++++++++++++++++++++++++++---------
 2 files changed, 96 insertions(+), 22 deletions(-)

diff --git a/tests/ovn-sbctl.at b/tests/ovn-sbctl.at
index 19ac55c80..9743dacb8 100644
--- a/tests/ovn-sbctl.at
+++ b/tests/ovn-sbctl.at
@@ -164,6 +164,15 @@ Chassis ch0
     Port_Binding vif0
 ])
 
+AT_CHECK([ovn-sbctl set Chassis ch0 hostname="ch0_host"])
+AT_CHECK([ovn-sbctl chassis-add ch1 geneve 1.2.3.6])
+AT_CHECK([ovn-sbctl chassis-add ch2 geneve 1.2.3.7])
+AT_CHECK([ovn-sbctl show ch0_host ch1 1.2.3.7 | grep Chassis], [0], [dnl
+Chassis ch0
+Chassis ch1
+Chassis ch2
+])
+
 uuid=$(ovn-sbctl --columns=_uuid list Chassis ch0 | cut -d ':' -f2 | tr -d ' ')
 AT_CHECK_UNQUOTED([ovn-sbctl --columns=logical_port,mac,chassis list 
Port_Binding], [0], [dnl
 logical_port        : vif0
diff --git a/utilities/ovn-sbctl.c b/utilities/ovn-sbctl.c
index f1f8c2b42..e2ef37fa3 100644
--- a/utilities/ovn-sbctl.c
+++ b/utilities/ovn-sbctl.c
@@ -91,7 +91,7 @@ sbctl_usage(void)
 usage: %s [OPTIONS] COMMAND [ARG...]\n\
 \n\
 General commands:\n\
-  show                        print overview of database contents\n\
+  show [CHASSIS | HOSTNAME | ENCAP-IP ...] print overview of database 
contents\n\
 \n\
 Chassis commands:\n\
   chassis-add CHASSIS ENCAP-TYPE ENCAP-IP  create a new chassis named\n\
@@ -355,12 +355,14 @@ static void
 pre_get_info(struct ctl_context *ctx)
 {
     ovsdb_idl_add_column(ctx->idl, &sbrec_chassis_col_name);
+    ovsdb_idl_add_column(ctx->idl, &sbrec_chassis_col_hostname);
     ovsdb_idl_add_column(ctx->idl, &sbrec_chassis_col_encaps);
 
     ovsdb_idl_add_column(ctx->idl, &sbrec_chassis_private_col_name);
 
     ovsdb_idl_add_column(ctx->idl, &sbrec_encap_col_type);
     ovsdb_idl_add_column(ctx->idl, &sbrec_encap_col_ip);
+    ovsdb_idl_add_column(ctx->idl, &sbrec_encap_col_options);
 
     ovsdb_idl_add_column(ctx->idl, &sbrec_port_binding_col_logical_port);
     ovsdb_idl_add_column(ctx->idl, &sbrec_port_binding_col_tunnel_key);
@@ -404,26 +406,6 @@ pre_get_info(struct ctl_context *ctx)
     ovsdb_idl_add_column(ctx->idl, &sbrec_load_balancer_col_protocol);
 }
 
-static struct cmd_show_table cmd_show_tables[] = {
-    {&sbrec_table_chassis,
-     &sbrec_chassis_col_name,
-     {&sbrec_chassis_col_hostname,
-      &sbrec_chassis_col_encaps,
-      NULL},
-     {&sbrec_table_port_binding,
-      &sbrec_port_binding_col_logical_port,
-      &sbrec_port_binding_col_chassis}},
-
-    {&sbrec_table_encap,
-     &sbrec_encap_col_type,
-     {&sbrec_encap_col_ip,
-      &sbrec_encap_col_options,
-      NULL},
-     {NULL, NULL, NULL}},
-
-    {NULL, NULL, {NULL, NULL, NULL}, {NULL, NULL, NULL}},
-};
-
 static void
 sbctl_init(struct ctl_context *ctx OVS_UNUSED)
 {
@@ -564,6 +546,86 @@ cmd_lsp_unbind(struct ctl_context *ctx)
     }
 }
 
+static void
+show_encap(struct ctl_context *ctx,
+           const struct sbrec_encap *encap)
+{
+    ds_put_format(&ctx->output, "    Encap %s\n", encap->type);
+    ds_put_format(&ctx->output, "        ip: \"%s\"\n", encap->ip);
+    ds_put_format(&ctx->output, "        options: {csum=\"%s\"}\n",
+                  smap_get_def(&encap->options, "csum", " "));
+};
+
+static void
+show_chassis(struct ctl_context *ctx,
+             const struct sbrec_chassis *chassis)
+{
+    const struct sbrec_port_binding *pb;
+
+    ds_put_format(&ctx->output, "Chassis %s\n", chassis->name);
+
+    if (chassis->hostname && strlen(chassis->hostname)) {
+        ds_put_format(&ctx->output, "    hostname: %s\n", chassis->hostname);
+    }
+
+    for (size_t i = 0; i < chassis->n_encaps; i++) {
+        show_encap(ctx, chassis->encaps[i]);
+    }
+
+    SBREC_PORT_BINDING_FOR_EACH (pb, ctx->idl) {
+        if (pb->chassis == chassis) {
+            ds_put_format(&ctx->output, "    Port_Binding %s\n",
+                          pb->logical_port);
+        }
+    }
+}
+
+static const struct sbrec_chassis *
+sbctl_find_chassis(struct ctl_context *ctx, const char *name)
+{
+    const struct sbctl_chassis *chassis = NULL;
+    const struct sbrec_chassis *chassis_rec = NULL;
+
+    /* Find chassis by his name. */
+    chassis = find_chassis(ctx, name, false);
+    if (chassis) {
+        return chassis->ch_cfg;
+    }
+
+    /* Find chassis by his hostname or encap ip. */
+    SBREC_CHASSIS_FOR_EACH (chassis_rec, ctx->idl) {
+        if (chassis_rec->hostname && !strcmp(chassis_rec->hostname, name)) {
+            return chassis_rec;
+        }
+        for (size_t i = 0; i < chassis_rec->n_encaps; i++) {
+            if (!strcmp(chassis_rec->encaps[i]->ip, name)) {
+                return chassis_rec;
+            }
+        }
+    }
+
+    return NULL;
+}
+
+static void
+cmd_show(struct ctl_context *ctx)
+{
+    const struct sbrec_chassis *chassis;
+
+    if (ctx->argc > 1) {
+        for (int i = 1; i <= ctx->argc - 1; i++) {
+            chassis = sbctl_find_chassis(ctx, ctx->argv[i]);
+            if (chassis) {
+                show_chassis(ctx, chassis);
+            }
+        }
+    } else {
+        SBREC_CHASSIS_FOR_EACH (chassis, ctx->idl) {
+            show_chassis(ctx, chassis);
+        }
+    }
+}
+
 enum {
     PL_INGRESS,
     PL_EGRESS,
@@ -1554,6 +1616,9 @@ static const struct ctl_table_class 
tables[SBREC_N_TABLES] = {
 static const struct ctl_command_syntax sbctl_commands[] = {
     { "init", 0, 0, "", NULL, sbctl_init, NULL, "", RW },
 
+    { "show", 0, INT_MAX, "[CHASSIS | HOSTNAME | ENCAP-IP ...]",
+     pre_get_info, cmd_show, NULL,  "", RO },
+
     /* Chassis commands. */
     {"chassis-add", 3, 3, "CHASSIS ENCAP-TYPE ENCAP-IP", pre_get_info,
      cmd_chassis_add, NULL, "--may-exist", RW},
@@ -1610,7 +1675,7 @@ main(int argc, char *argv[])
 
         .idl_class = &sbrec_idl_class,
         .tables = tables,
-        .cmd_show_table = cmd_show_tables,
+        .cmd_show_table = NULL,
         .commands = sbctl_commands,
 
         .usage = sbctl_usage,
-- 
2.34.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to