X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=utilities%2Fovs-vsctl.c;h=d09cf7460b0f645f8cd94e50f644962d34ae7fb9;hb=9a3f4a496f9772b65562044f722536cd6270f698;hp=88ddd9968602cd711543c4a8ecfb9e5da9ec0049;hpb=1a048029a0902439c3f17c49a7f71e4d09fecf70;p=openvswitch diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c index 88ddd996..d09cf746 100644 --- a/utilities/ovs-vsctl.c +++ b/utilities/ovs-vsctl.c @@ -85,7 +85,7 @@ static bool dry_run; static bool wait_for_reload = true; /* --timeout: Time to wait for a connection to 'db'. */ -static int timeout = 5; +static int timeout; /* All supported commands. */ static const struct vsctl_command_syntax all_commands[]; @@ -182,12 +182,16 @@ parse_options(int argc, char *argv[]) #endif {0, 0, 0, 0}, }; + char *tmp, *short_options; + tmp = long_options_to_short_options(long_options); + short_options = xasprintf("+%s", tmp); + free(tmp); for (;;) { int c; - c = getopt_long(argc, argv, "+v::hVt:", long_options, NULL); + c = getopt_long(argc, argv, short_options, long_options, NULL); if (c == -1) { break; } @@ -245,6 +249,7 @@ parse_options(int argc, char *argv[]) abort(); } } + free(short_options); if (!db) { db = default_db(); @@ -512,6 +517,7 @@ struct vsctl_bridge { struct ovsrec_bridge *br_cfg; char *name; struct ovsrec_controller **ctrl; + char *fail_mode; size_t n_ctrl; struct vsctl_bridge *parent; int vlan; @@ -570,9 +576,11 @@ add_bridge(struct vsctl_info *b, if (parent) { br->ctrl = parent->br_cfg->controller; br->n_ctrl = parent->br_cfg->n_controller; + br->fail_mode = parent->br_cfg->fail_mode; } else { br->ctrl = br_cfg->controller; br->n_ctrl = br_cfg->n_controller; + br->fail_mode = br_cfg->fail_mode; } shash_add(&b->bridges, br->name, br); return br; @@ -1297,12 +1305,11 @@ add_port(struct vsctl_context *ctx, get_info(ctx->ovs, &info); if (may_exist) { - struct vsctl_port *port; + struct vsctl_port *vsctl_port; - port = find_port(&info, port_name, false); - if (port) { + vsctl_port = find_port(&info, port_name, false); + if (vsctl_port) { struct svec want_names, have_names; - size_t i; svec_init(&want_names); for (i = 0; i < n_ifaces; i++) { @@ -1311,15 +1318,16 @@ add_port(struct vsctl_context *ctx, svec_sort(&want_names); svec_init(&have_names); - for (i = 0; i < port->port_cfg->n_interfaces; i++) { - svec_add(&have_names, port->port_cfg->interfaces[i]->name); + for (i = 0; i < vsctl_port->port_cfg->n_interfaces; i++) { + svec_add(&have_names, + vsctl_port->port_cfg->interfaces[i]->name); } svec_sort(&have_names); - if (strcmp(port->bridge->name, br_name)) { + if (strcmp(vsctl_port->bridge->name, br_name)) { char *command = vsctl_context_to_string(ctx); vsctl_fatal("\"%s\" but %s is actually attached to bridge %s", - command, port_name, port->bridge->name); + command, port_name, vsctl_port->bridge->name); } if (!svec_equal(&want_names, &have_names)) { @@ -1625,57 +1633,22 @@ cmd_set_controller(struct vsctl_context *ctx) free_info(&info); } -static const char * -get_fail_mode(struct ovsrec_controller **controllers, size_t n_controllers) -{ - const char *fail_mode; - size_t i; - - fail_mode = NULL; - for (i = 0; i < n_controllers; i++) { - const char *s = controllers[i]->fail_mode; - if (s) { - if (!strcmp(s, "secure")) { - return s; - } else { - fail_mode = s; - } - } - } - - return fail_mode; -} - static void cmd_get_fail_mode(struct vsctl_context *ctx) { struct vsctl_info info; struct vsctl_bridge *br; - const char *fail_mode = NULL; get_info(ctx->ovs, &info); br = find_bridge(&info, ctx->argv[1], true); - fail_mode = get_fail_mode(br->ctrl, br->n_ctrl); - - if (fail_mode && strlen(fail_mode)) { - ds_put_format(&ctx->output, "%s\n", fail_mode); + if (br->fail_mode && strlen(br->fail_mode)) { + ds_put_format(&ctx->output, "%s\n", br->fail_mode); } free_info(&info); } -static void -set_fail_mode(struct ovsrec_controller **controllers, size_t n_controllers, - const char *fail_mode) -{ - size_t i; - - for (i = 0; i < n_controllers; i++) { - ovsrec_controller_set_fail_mode(controllers[i], fail_mode); - } -} - static void cmd_del_fail_mode(struct vsctl_context *ctx) { @@ -1685,7 +1658,7 @@ cmd_del_fail_mode(struct vsctl_context *ctx) get_info(ctx->ovs, &info); br = find_real_bridge(&info, ctx->argv[1], true); - set_fail_mode(br->ctrl, br->n_ctrl, NULL); + ovsrec_bridge_set_fail_mode(br->br_cfg, NULL); free_info(&info); } @@ -1704,10 +1677,7 @@ cmd_set_fail_mode(struct vsctl_context *ctx) vsctl_fatal("fail-mode must be \"standalone\" or \"secure\""); } - if (!br->ctrl) { - vsctl_fatal("no controller declared for %s", br->name); - } - set_fail_mode(br->ctrl, br->n_ctrl, fail_mode); + ovsrec_bridge_set_fail_mode(br->br_cfg, fail_mode); free_info(&info); } @@ -2005,6 +1975,28 @@ get_column(const struct vsctl_table_class *table, const char *column_name, } } +static struct uuid * +create_symbol(struct ovsdb_symbol_table *symtab, const char *id, bool *newp) +{ + struct ovsdb_symbol *symbol; + + if (id[0] != '@') { + vsctl_fatal("row id \"%s\" does not begin with \"@\"", id); + } + + if (newp) { + *newp = ovsdb_symbol_table_get(symtab, id) == NULL; + } + + symbol = ovsdb_symbol_table_insert(symtab, id); + if (symbol->used) { + vsctl_fatal("row id \"%s\" may only be specified on one --id option", + id); + } + symbol->used = true; + return &symbol->uuid; +} + static char * missing_operator_error(const char *arg, const char **allowed_operators, size_t n_allowed) @@ -2172,6 +2164,7 @@ error: static void cmd_get(struct vsctl_context *ctx) { + const char *id = shash_find_data(&ctx->options, "--id"); bool if_exists = shash_find(&ctx->options, "--if-exists"); const char *table_name = ctx->argv[1]; const char *record_id = ctx->argv[2]; @@ -2182,6 +2175,15 @@ cmd_get(struct vsctl_context *ctx) table = get_table(table_name); row = must_get_row(ctx, table, record_id); + if (id) { + bool new; + + *create_symbol(ctx->symtab, id, &new) = row->uuid; + if (!new) { + vsctl_fatal("row id \"%s\" specified on \"get\" command was used " + "before it was defined", id); + } + } for (i = 3; i < ctx->argc; i++) { const struct ovsdb_idl_column *column; const struct ovsdb_datum *datum; @@ -2483,24 +2485,7 @@ cmd_create(struct vsctl_context *ctx) const struct uuid *uuid; int i; - if (id) { - struct ovsdb_symbol *symbol; - - if (id[0] != '@') { - vsctl_fatal("row id \"%s\" does not begin with \"@\"", id); - } - - symbol = ovsdb_symbol_table_insert(ctx->symtab, id); - if (symbol->used) { - vsctl_fatal("row id \"%s\" may only be used to insert a single " - "row", id); - } - symbol->used = true; - - uuid = &symbol->uuid; - } else { - uuid = NULL; - } + uuid = id ? create_symbol(ctx->symtab, id, NULL) : NULL; table = get_table(table_name); row = ovsdb_idl_txn_insert(ctx->txn, table->class, uuid); @@ -2797,8 +2782,8 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, ds_chomp(ds, '\n'); for (j = 0; j < ds->length; j++) { - int c = ds->string[j]; - switch (c) { + int ch = ds->string[j]; + switch (ch) { case '\n': fputs("\\n", stdout); break; @@ -2808,7 +2793,7 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, break; default: - putchar(c); + putchar(ch); } } putchar('\n'); @@ -2826,8 +2811,6 @@ do_vsctl(const char *args, struct vsctl_command *commands, size_t n_commands, if (wait_for_reload && status != TXN_UNCHANGED) { for (;;) { - const struct ovsrec_open_vswitch *ovs; - ovsdb_idl_run(idl); OVSREC_OPEN_VSWITCH_FOR_EACH (ovs, idl) { if (ovs->cur_cfg >= next_cfg) { @@ -2897,7 +2880,7 @@ static const struct vsctl_command_syntax all_commands[] = { {"emer-reset", 0, 0, cmd_emer_reset, NULL, ""}, /* Parameter commands. */ - {"get", 3, INT_MAX, cmd_get, NULL, "--if-exists"}, + {"get", 2, INT_MAX, cmd_get, NULL, "--if-exists,--id="}, {"list", 1, INT_MAX, cmd_list, NULL, ""}, {"set", 3, INT_MAX, cmd_set, NULL, ""}, {"add", 4, INT_MAX, cmd_add, NULL, ""},