On Mon, Oct 7, 2024 at 6:04 PM Alexandra Rukomoinikova <[email protected]> wrote:
> Transferred all logic of the show command from ovs/lib/db-ctl-base.c > to ovn-sbctl.c. This is necessary in the future for the implementation > show of separate chassis. These functions cannot be imported, due to > the fact that in ovs/lib/db-ctl-base.c in these functions the global > for the module structure cmd_show_tabeles is used, which is imported > from ovn-sbctl, for filtering individual chassis I consider it > necessary to take this block separately to ovn. > > Signed-off-by: Alexandra Rukomoinikova <[email protected]> > Tested-by: Ivan Burnin <[email protected]> > --- > utilities/ovn-sbctl.c | 172 +++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 171 insertions(+), 1 deletion(-) > > diff --git a/utilities/ovn-sbctl.c b/utilities/ovn-sbctl.c > index f1f8c2b42..7a88b62a3 100644 > --- a/utilities/ovn-sbctl.c > +++ b/utilities/ovn-sbctl.c > @@ -424,6 +424,174 @@ static struct cmd_show_table cmd_show_tables[] = { > {NULL, NULL, {NULL, NULL, NULL}, {NULL, NULL, NULL}}, > }; > > +static const struct cmd_show_table * > +cmd_show_find_table_by_name(const char *name) > +{ > + const struct cmd_show_table *show; > + > + for (show = cmd_show_tables; show->table; show++) { > + if (!strcmp(show->table->name, name)) { > + return show; > + } > + } > + return NULL; > +} > + > +static const struct cmd_show_table * > +cmd_show_find_table_by_row(const struct ovsdb_idl_row *row) > +{ > + const struct cmd_show_table *show; > + > + for (show = cmd_show_tables; show->table; show++) { > + if (show->table == row->table->class_) { > + return show; > + } > + } > + return NULL; > +} > + > +static void > +cmd_show_weak_ref(struct ctl_context *ctx, const struct cmd_show_table > *show, > + const struct ovsdb_idl_row *cur_row, int level) > +{ > + const struct ovsdb_idl_row *row_wref; > + const struct ovsdb_idl_table_class *table = show->wref_table.table; > + const struct ovsdb_idl_column *name_column > + = show->wref_table.name_column; > + const struct ovsdb_idl_column *wref_column > + = show->wref_table.wref_column; > + > + if (!table || !name_column || !wref_column) { > + return; > + } > + > + for (row_wref = ovsdb_idl_first_row(ctx->idl, table); row_wref; > + row_wref = ovsdb_idl_next_row(row_wref)) { > + const struct ovsdb_datum *wref_datum > + = ovsdb_idl_read(row_wref, wref_column); > + /* If weak reference refers to the 'cur_row', prints it. */ > + if (wref_datum->n > + && uuid_equals(&cur_row->uuid, &wref_datum->keys[0].uuid)) { > + const struct ovsdb_datum *name_datum > + = ovsdb_idl_read(row_wref, name_column); > + ds_put_char_multiple(&ctx->output, ' ', (level + 1) * 4); > + ds_put_format(&ctx->output, "%s ", table->name); > + ovsdb_datum_to_string(name_datum, > + &name_column->type, &ctx->output); > + ds_put_char(&ctx->output, '\n'); > + } > + } > +} > + > +static void > +cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row, > + int level, struct sset *shown) > +{ > + const struct cmd_show_table *show = cmd_show_find_table_by_row(row); > + size_t i; > + > + ds_put_char_multiple(&ctx->output, ' ', level * 4); > + if (show && show->name_column) { > + const struct ovsdb_datum *datum; > + > + ds_put_format(&ctx->output, "%s ", show->table->name); > + datum = ovsdb_idl_read(row, show->name_column); > + ovsdb_datum_to_string(datum, &show->name_column->type, > &ctx->output); > + } else { > + ds_put_format(&ctx->output, UUID_FMT, UUID_ARGS(&row->uuid)); > + } > + ds_put_char(&ctx->output, '\n'); > + > + if (!show || sset_find(shown, show->table->name)) { > + return; > + } > + > + sset_add(shown, show->table->name); > + for (i = 0; i < ARRAY_SIZE(show->columns); i++) { > + const struct ovsdb_idl_column *column = show->columns[i]; > + const struct ovsdb_datum *datum; > + > + if (!column) { > + break; > + } > + > + datum = ovsdb_idl_read(row, column); > + if (column->type.key.type == OVSDB_TYPE_UUID && > + column->type.key.uuid.refTableName) { > + const struct cmd_show_table *ref_show; > + size_t j; > + > + ref_show = cmd_show_find_table_by_name( > + column->type.key.uuid.refTableName); > + if (ref_show) { > + for (j = 0; j < datum->n; j++) { > + const struct ovsdb_idl_row *ref_row; > + > + ref_row = ovsdb_idl_get_row_for_uuid(ctx->idl, > + ref_show->table, > + > &datum->keys[j].uuid); > + if (ref_row) { > + cmd_show_row(ctx, ref_row, level + 1, shown); > + } > + } > + continue; > + } > + } > + if (!ovsdb_datum_is_default(datum, &column->type)) { > + ds_put_char_multiple(&ctx->output, ' ', (level + 1) * 4); > + ds_put_format(&ctx->output, "%s: ", column->name); > + ovsdb_datum_to_string(datum, &column->type, &ctx->output); > + ds_put_char(&ctx->output, '\n'); > + } > + } > + cmd_show_weak_ref(ctx, show, row, level); > + sset_find_and_delete_assert(shown, show->table->name); > +} > + > +static void > +cmd_show(struct ctl_context *ctx) > +{ > + const struct ovsdb_idl_row *row; > + struct sset shown = SSET_INITIALIZER(&shown); > + > + for (row = ovsdb_idl_first_row(ctx->idl, cmd_show_tables[0].table); > + row; row = ovsdb_idl_next_row(row)) { > + cmd_show_row(ctx, row, 0, &shown); > + } > + > + ovs_assert(sset_is_empty(&shown)); > + sset_destroy(&shown); > +} > + > +static void > +pre_cmd_show(struct ctl_context *ctx) > +{ > + const struct cmd_show_table *show; > + for (show = cmd_show_tables; show->table; show++) { > + size_t i; > + > + ovsdb_idl_add_table(ctx->idl, show->table); > + if (show->name_column) { > + ovsdb_idl_add_column(ctx->idl, show->name_column); > + } > + for (i = 0; i < ARRAY_SIZE(show->columns); i++) { > + const struct ovsdb_idl_column *column = show->columns[i]; > + if (column) { > + ovsdb_idl_add_column(ctx->idl, column); > + } > + } > + if (show->wref_table.table) { > + ovsdb_idl_add_table(ctx->idl, show->wref_table.table); > + } > + if (show->wref_table.name_column) { > + ovsdb_idl_add_column(ctx->idl, show->wref_table.name_column); > + } > + if (show->wref_table.wref_column) { > + ovsdb_idl_add_column(ctx->idl, show->wref_table.wref_column); > + } > + } > +} > + > static void > sbctl_init(struct ctl_context *ctx OVS_UNUSED) > { > @@ -1554,6 +1722,8 @@ 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, 0, "", pre_cmd_show, 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 +1780,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 > > Hi Alexandra, sorry for the late reply. Could you please elaborate why the ovs code for this couldn't be extended to support filtering options? I don't think that duplication is the way to go. Thanks, Ales -- Ales Musil Senior Software Engineer - OVN Core Red Hat EMEA <https://www.redhat.com> [email protected] <https://red.ht/sig> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
