Add support for using ovn-nbctl to list ports in a port group pg-get-ports: Get logical switch ports of a port group
Reported-at: https://issues.redhat.com/browse/FDP-1463 Signed-off-by: Mairtin O'Loingsigh <moloi...@redhat.com> --- tests/ovn-nbctl.at | 10 +++++++- utilities/ovn-nbctl.c | 56 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at index 447a0666f..b2f0b7df8 100644 --- a/tests/ovn-nbctl.at +++ b/tests/ovn-nbctl.at @@ -2798,15 +2798,23 @@ pg1 AT_CHECK_UNQUOTED([ovn-nbctl --bare --columns=ports list port_group pg1], [0], [dnl $SW1P1 ]) +AT_CHECK([ovn-nbctl pg-get-ports pg1],[0], [dnl +sw1-p1 +]) AT_CHECK([ovn-nbctl pg-set-ports pg1 sw1-p2], [0], [ignore]) AT_CHECK_UNQUOTED([ovn-nbctl --bare --columns=ports list port_group pg1], [0], [dnl $SW1P2 ]) +AT_CHECK([ovn-nbctl pg-get-ports pg1],[0], [dnl +sw1-p2 +]) AT_CHECK([ovn-nbctl pg-del pg1], [0], [ignore]) AT_CHECK([ovn-nbctl list port_group], [0], []) -]) +AT_CHECK([ovn-nbctl pg-get-ports pg1], [1], [], + [ovn-nbctl: pg1: port group name not found +])]) dnl --------------------------------------------------------------------- OVN_NBCTL_TEST([ovn_nbctl_fwd_groups], [fwd groups], [ diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c index 33e789523..b3c9b89fb 100644 --- a/utilities/ovn-nbctl.c +++ b/utilities/ovn-nbctl.c @@ -483,6 +483,7 @@ Port group commands:\n\ pg-add PG [PORTS] Create port group PG with optional PORTS\n\ pg-set-ports PG PORTS Set PORTS on port group PG\n\ pg-del PG Delete port group PG\n\ + pg-get-ports PG List port group PG\n\ HA chassis group commands:\n\ ha-chassis-group-add GRP Create an HA chassis group GRP\n\ ha-chassis-group-del GRP Delete the HA chassis group GRP\n\ @@ -7489,6 +7490,59 @@ cmd_pg_del(struct ctl_context *ctx) nbrec_port_group_delete(pg); } +static void +cmd_pre_pg_get_ports(struct ctl_context *ctx) +{ + ovsdb_idl_add_column(ctx->idl, &nbrec_logical_switch_port_col_name); + ovsdb_idl_add_column(ctx->idl, &nbrec_port_group_col_name); + ovsdb_idl_add_column(ctx->idl, &nbrec_port_group_col_ports); +} + +static int +port_name_cmp(const void *s1_, const void *s2_) +{ + const char *s1 = *(char **) s1_, *s2 = *(char **) s2_; + return strcmp(s1, s2); +} + +static void +cmd_pg_get_ports(struct ctl_context *ctx) +{ + const struct nbrec_port_group *pg; + struct nbrec_logical_switch_port **ports; + size_t i; + char **port_names; + char *error; + + error = pg_by_name_or_uuid(ctx, ctx->argv[1], true, &pg); + if (error) { + ctx->error = error; + return; + } + + ports = pg->ports; + if (pg->n_ports == 0) { + return; + } + + port_names = xmalloc(sizeof(char *) * pg->n_ports); + for (i = 0; i < pg->n_ports; i++) { + port_names[i] = ports[i]->name; + } + + qsort(port_names, pg->n_ports, sizeof(char *), port_name_cmp); + ds_put_format(&ctx->output, "%s", port_names[0]); + for (i = 1; i < pg->n_ports; i++) { + ds_put_format(&ctx->output, " %s", port_names[i]); + } + + if (i > 0) { + ds_put_cstr(&ctx->output, "\n"); + } + + free(port_names); +} + static const struct nbrec_ha_chassis_group* ha_chassis_group_by_name_or_uuid(struct ctl_context *ctx, const char *id, bool must_exist) @@ -8420,6 +8474,8 @@ static const struct ctl_command_syntax nbctl_commands[] = { {"pg-set-ports", 2, INT_MAX, "", cmd_pre_pg_set_ports, cmd_pg_set_ports, NULL, "", RW }, {"pg-del", 1, 1, "", cmd_pre_pg_del, cmd_pg_del, NULL, "", RW }, + {"pg-get-ports", 1, 1, "", cmd_pre_pg_get_ports, cmd_pg_get_ports, + NULL, "", RO }, /* HA chassis group commands. */ {"ha-chassis-group-add", 1, 1, "[CHASSIS GROUP]", -- 2.49.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev