From: Ben Pfaff Date: Wed, 9 Feb 2011 00:10:34 +0000 (-0800) Subject: ovs-vsctl: Add formatting options for the "list" and "find" commands. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e051b42c418e0c0e6627ae78d2e86d2d8b24cfb2;p=openvswitch ovs-vsctl: Add formatting options for the "list" and "find" commands. The default format is the same as before (which the testsuite verifies). The most important use for the new formatting options is --bare, which outputs a format that is easy to parse from a shell script. An upcoming patch will start using that. --- diff --git a/lib/table.man b/lib/table.man index 41e039c1..8c1469d6 100644 --- a/lib/table.man +++ b/lib/table.man @@ -3,9 +3,11 @@ Sets the type of table formatting. The following types of \fIformat\fR are available: .RS -.IP "\fBtable\fR" +.ie '\*(PN'ovs\-vsctl' .IP "\fBtable\fR" +.el .IP "\fBtable\fR (default)" 2-D text tables with aligned columns. -.IP "\fBlist\fR" +.ie '\*(PN'ovs\-vsctl' .IP "\fBlist\fR (default)" +.el .IP "\fBlist\fR" A list with one column per line and rows separated by a blank line. .IP "\fBhtml\fR" HTML tables. @@ -38,7 +40,9 @@ Sets the formatting for cells within output tables. The following types of \fIformat\fR are available: .RS .IP "\fBstring\fR (default)" -The simple format described in \fBovs\-vsctl\fR(8). +The simple format described in the \fBDatabase Values\fR +.ie '\*(PN'ovs\-vsctl' section below. +.el section of \fBovs\-vsctl\fR(8). .IP "\fBbare\fR" The simple format with punctuation stripped off: \fB[]\fR and \fB{}\fR are omitted around sets, maps, and empty columns, items within sets diff --git a/utilities/ovs-vsctl.8.in b/utilities/ovs-vsctl.8.in index 553985bc..0c6fc2f6 100644 --- a/utilities/ovs-vsctl.8.in +++ b/utilities/ovs-vsctl.8.in @@ -112,6 +112,9 @@ on a single line. New-line characters that would otherwise separate lines are printed as \fB\\n\fR, and any instances of \fB\\\fR that would otherwise appear in the output are doubled. Prints a blank line for each command that has no output. +This option does not affect the formatting of output from the +\fBlist\fR or \fBfind\fR commands; see \fBTable Formatting Options\fR +below. . .IP "\fB\-\-dry\-run\fR" Prevents \fBovs\-vsctl\fR from actually modifying the database. @@ -125,6 +128,11 @@ to approximately \fIsecs\fR seconds. If the timeout expires, would normally happen only if the database cannot be contacted, or if the system is overloaded.) . +.SS "Table Formatting Options" +These options control the format of output from the \fBlist\fR and +\fBfind\fR commands. +.so lib/table.man +. .SS "Public Key Infrastructure Options" .so lib/ssl.man .so lib/ssl-bootstrap.man diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c index 66ba4181..61ff5bbd 100644 --- a/utilities/ovs-vsctl.c +++ b/utilities/ovs-vsctl.c @@ -39,6 +39,7 @@ #include "stream-ssl.h" #include "svec.h" #include "vswitchd/vswitch-idl.h" +#include "table.h" #include "timeval.h" #include "util.h" #include "vlog.h" @@ -61,7 +62,7 @@ struct vsctl_command_syntax { void (*prerequisites)(struct vsctl_context *ctx); /* Does the actual work of the command and puts the command's output, if - * any, in ctx->output. + * any, in ctx->output or ctx->table. * * Alternatively, if some prerequisite of the command is not met and the * caller should wait for something to change and then retry, it may set @@ -90,6 +91,7 @@ struct vsctl_command { /* Data modified by commands. */ struct ds output; + struct table *table; }; /* --db: The database server to contact. */ @@ -107,6 +109,9 @@ static bool wait_for_reload = true; /* --timeout: Time to wait for a connection to 'db'. */ static int timeout; +/* Format for table output. */ +static struct table_style table_style = TABLE_STYLE_DEFAULT; + /* All supported commands. */ static const struct vsctl_command_syntax all_commands[]; @@ -195,7 +200,8 @@ parse_options(int argc, char *argv[]) OPT_NO_WAIT, OPT_DRY_RUN, OPT_PEER_CA_CERT, - VLOG_OPTION_ENUMS + VLOG_OPTION_ENUMS, + TABLE_OPTION_ENUMS }; static struct option long_options[] = { {"db", required_argument, 0, OPT_DB}, @@ -207,6 +213,7 @@ parse_options(int argc, char *argv[]) {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, VLOG_LONG_OPTIONS, + TABLE_LONG_OPTIONS, #ifdef HAVE_OPENSSL STREAM_SSL_LONG_OPTIONS {"peer-ca-cert", required_argument, 0, OPT_PEER_CA_CERT}, @@ -219,6 +226,8 @@ parse_options(int argc, char *argv[]) short_options = xasprintf("+%s", tmp); free(tmp); + table_style.format = TF_LIST; + for (;;) { int c; @@ -264,6 +273,7 @@ parse_options(int argc, char *argv[]) break; VLOG_OPTION_HANDLERS + TABLE_OPTION_HANDLERS(&table_style) #ifdef HAVE_OPENSSL STREAM_SSL_OPTION_HANDLERS @@ -570,6 +580,7 @@ struct vsctl_context { /* Modifiable state. */ struct ds output; + struct table *table; struct ovsdb_idl *idl; struct ovsdb_idl_txn *txn; struct ovsdb_symbol_table *symtab; @@ -2737,24 +2748,54 @@ pre_cmd_list(struct vsctl_context *ctx) pre_list_columns(ctx, table, column_names); } +static struct table * +list_make_table(const struct ovsdb_idl_column **columns, size_t n_columns) +{ + struct table *out; + size_t i; + + out = xmalloc(sizeof *out); + table_init(out); + + for (i = 0; i < n_columns; i++) { + const struct ovsdb_idl_column *column = columns[i]; + const char *column_name = column ? column->name : "_uuid"; + + table_add_column(out, "%s", column_name); + } + + return out; +} + static void list_record(const struct ovsdb_idl_row *row, const struct ovsdb_idl_column **columns, size_t n_columns, - struct ds *out) + struct table *out) { size_t i; + table_add_row(out); for (i = 0; i < n_columns; i++) { const struct ovsdb_idl_column *column = columns[i]; + struct cell *cell = table_add_cell(out); if (!column) { - ds_put_format(out, "%-20s: "UUID_FMT"\n", "_uuid", - UUID_ARGS(&row->uuid)); + struct ovsdb_datum datum; + union ovsdb_atom atom; + + atom.uuid = row->uuid; + + datum.keys = &atom; + datum.values = NULL; + datum.n = 1; + + cell->json = ovsdb_datum_to_json(&datum, &ovsdb_type_uuid); + cell->type = &ovsdb_type_uuid; } else { const struct ovsdb_datum *datum = ovsdb_idl_read(row, column); - ds_put_format(out, "%-20s: ", column->name); - ovsdb_datum_to_string(datum, &column->type, out); - ds_put_char(out, '\n'); + + cell->json = ovsdb_datum_to_json(datum, &column->type); + cell->type = &column->type; } } } @@ -2766,17 +2807,15 @@ cmd_list(struct vsctl_context *ctx) const struct ovsdb_idl_column **columns; const char *table_name = ctx->argv[1]; const struct vsctl_table_class *table; - struct ds *out = &ctx->output; + struct table *out; size_t n_columns; int i; table = get_table(table_name); parse_column_names(column_names, table, &columns, &n_columns); + out = ctx->table = list_make_table(columns, n_columns); if (ctx->argc > 2) { for (i = 2; i < ctx->argc; i++) { - if (i > 2) { - ds_put_char(out, '\n'); - } list_record(must_get_row(ctx, table, ctx->argv[i]), columns, n_columns, out); } @@ -2787,9 +2826,6 @@ cmd_list(struct vsctl_context *ctx) for (row = ovsdb_idl_first_row(ctx->idl, table->class), first = true; row != NULL; row = ovsdb_idl_next_row(row), first = false) { - if (!first) { - ds_put_char(out, '\n'); - } list_record(row, columns, n_columns, out); } } @@ -2819,12 +2855,12 @@ cmd_find(struct vsctl_context *ctx) const char *table_name = ctx->argv[1]; const struct vsctl_table_class *table; const struct ovsdb_idl_row *row; - struct ds *out = &ctx->output; + struct table *out; size_t n_columns; table = get_table(table_name); parse_column_names(column_names, table, &columns, &n_columns); - + out = ctx->table = list_make_table(columns, n_columns); for (row = ovsdb_idl_first_row(ctx->idl, table->class); row; row = ovsdb_idl_next_row(row)) { int i; @@ -2835,9 +2871,6 @@ cmd_find(struct vsctl_context *ctx) goto next_row; } } - if (out->length) { - ds_put_char(out, '\n'); - } list_record(row, columns, n_columns, out); next_row: ; @@ -3292,6 +3325,7 @@ vsctl_context_init(struct vsctl_context *ctx, struct vsctl_command *command, ctx->options = command->options; ds_swap(&ctx->output, &command->output); + ctx->table = command->table; ctx->idl = idl; ctx->txn = txn; ctx->ovs = ovs; @@ -3305,6 +3339,7 @@ static void vsctl_context_done(struct vsctl_context *ctx, struct vsctl_command *command) { ds_swap(&ctx->output, &command->output); + command->table = ctx->table; } static void @@ -3322,12 +3357,14 @@ run_prerequisites(struct vsctl_command *commands, size_t n_commands, struct vsctl_context ctx; ds_init(&c->output); + c->table = NULL; vsctl_context_init(&ctx, c, idl, NULL, NULL, NULL); (c->syntax->prerequisites)(&ctx); vsctl_context_done(&ctx, c); assert(!c->output.string); + assert(!c->table); } } } @@ -3367,6 +3404,7 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, symtab = ovsdb_symbol_table_create(); for (c = commands; c < &commands[n_commands]; c++) { ds_init(&c->output); + c->table = NULL; } for (c = commands; c < &commands[n_commands]; c++) { struct vsctl_context ctx; @@ -3433,7 +3471,9 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, for (c = commands; c < &commands[n_commands]; c++) { struct ds *ds = &c->output; - if (oneline) { + if (c->table) { + table_print(c->table, &table_style); + } else if (oneline) { size_t j; ds_chomp(ds, '\n'); @@ -3457,6 +3497,8 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, fputs(ds_cstr(ds), stdout); } ds_destroy(&c->output); + table_destroy(c->table); + free(c->table); smap_destroy(&c->options); } @@ -3489,6 +3531,8 @@ try_again: ovsdb_symbol_table_destroy(symtab); for (c = commands; c < &commands[n_commands]; c++) { ds_destroy(&c->output); + table_destroy(c->table); + free(c->table); } free(error); }