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[];
#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;
}
abort();
}
}
+ free(short_options);
if (!db) {
db = default_db();
struct ovsdb_idl_txn *txn;
struct ovsdb_symbol_table *symtab;
const struct ovsrec_open_vswitch *ovs;
+ bool verified_ports;
/* A command may set this member to true if some prerequisite is not met
* and the caller should wait for something to change and then retry. */
struct ovsrec_bridge *br_cfg;
char *name;
struct ovsrec_controller **ctrl;
+ char *fail_mode;
size_t n_ctrl;
struct vsctl_bridge *parent;
int vlan;
};
struct vsctl_info {
+ struct vsctl_context *ctx;
struct shash bridges;
struct shash ports;
struct shash ifaces;
return s;
}
+static void
+verify_ports(struct vsctl_context *ctx)
+{
+ if (!ctx->verified_ports) {
+ const struct ovsrec_bridge *bridge;
+ const struct ovsrec_port *port;
+
+ ovsrec_open_vswitch_verify_bridges(ctx->ovs);
+ OVSREC_BRIDGE_FOR_EACH (bridge, ctx->idl) {
+ ovsrec_bridge_verify_ports(bridge);
+ }
+ OVSREC_PORT_FOR_EACH (port, ctx->idl) {
+ ovsrec_port_verify_interfaces(port);
+ }
+
+ ctx->verified_ports = true;
+ }
+}
+
static struct vsctl_bridge *
add_bridge(struct vsctl_info *b,
struct ovsrec_bridge *br_cfg, const char *name,
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;
}
static void
-get_info(const struct ovsrec_open_vswitch *ovs, struct vsctl_info *info)
+get_info(struct vsctl_context *ctx, struct vsctl_info *info)
{
+ const struct ovsrec_open_vswitch *ovs = ctx->ovs;
struct shash bridges, ports;
size_t i;
+ info->ctx = ctx;
shash_init(&info->bridges);
shash_init(&info->ports);
shash_init(&info->ifaces);
struct vsctl_iface *iface;
struct vsctl_port *port;
+ verify_ports(info->ctx);
+
if (shash_find(&info->bridges, name)) {
vsctl_fatal("%s because a bridge named %s already exists",
msg, name);
if (must_exist && !br) {
vsctl_fatal("no bridge named %s", name);
}
+ ovsrec_open_vswitch_verify_bridges(info->ctx->ovs);
return br;
}
if (must_exist && !port) {
vsctl_fatal("no port named %s", name);
}
+ verify_ports(info->ctx);
return port;
}
if (must_exist && !iface) {
vsctl_fatal("no interface named %s", name);
}
+ verify_ports(info->ctx);
return iface;
}
ctx->argv[0]);
}
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
if (may_exist) {
struct vsctl_bridge *br;
struct vsctl_bridge *bridge;
struct vsctl_info info;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
bridge = find_bridge(&info, ctx->argv[1], must_exist);
if (bridge) {
struct shash_node *node;
struct vsctl_info info;
struct svec bridges;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
svec_init(&bridges);
SHASH_FOR_EACH (node, &info.bridges) {
{
struct vsctl_info info;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
if (!find_bridge(&info, ctx->argv[1], false)) {
vsctl_exit(2);
}
char **keys, **values;
size_t n;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
bridge = find_bridge(&info, ctx->argv[1], true);
if (bridge->br_cfg) {
set_external_id(bridge->br_cfg->key_external_ids,
bridge->br_cfg->n_external_ids,
ctx->argv[2], ctx->argc >= 4 ? ctx->argv[3] : NULL,
&keys, &values, &n);
+ ovsrec_bridge_verify_external_ids(bridge->br_cfg);
ovsrec_bridge_set_external_ids(bridge->br_cfg, keys, values, n);
} else {
char *key = xasprintf("fake-bridge-%s", ctx->argv[2]);
port->port_cfg->n_external_ids,
key, ctx->argc >= 4 ? ctx->argv[3] : NULL,
&keys, &values, &n);
+ ovsrec_port_verify_external_ids(port->port_cfg);
ovsrec_port_set_external_ids(port->port_cfg, keys, values, n);
free(key);
}
struct vsctl_info info;
struct vsctl_bridge *bridge;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
bridge = find_bridge(&info, ctx->argv[1], true);
if (bridge->br_cfg) {
+ ovsrec_bridge_verify_external_ids(bridge->br_cfg);
get_external_id(bridge->br_cfg->key_external_ids,
bridge->br_cfg->value_external_ids,
bridge->br_cfg->n_external_ids,
&ctx->output);
} else {
struct vsctl_port *port = shash_find_data(&info.ports, ctx->argv[1]);
+ ovsrec_port_verify_external_ids(port->port_cfg);
get_external_id(port->port_cfg->key_external_ids,
port->port_cfg->value_external_ids,
port->port_cfg->n_external_ids,
struct vsctl_info info;
struct svec ports;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
br = find_bridge(&info, ctx->argv[1], true);
+ ovsrec_bridge_verify_ports(br->br_cfg ? br->br_cfg : br->parent->br_cfg);
svec_init(&ports);
SHASH_FOR_EACH (node, &info.ports) {
struct ovsrec_port *port;
size_t i;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
if (may_exist) {
struct vsctl_port *port;
struct vsctl_port *port;
struct vsctl_info info;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
if (!with_iface) {
port = find_port(&info, ctx->argv[ctx->argc - 1], must_exist);
} else {
struct vsctl_port *port;
struct vsctl_info info;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
port = find_port(&info, ctx->argv[1], true);
ds_put_format(&ctx->output, "%s\n", port->bridge->name);
free_info(&info);
struct vsctl_bridge *bridge;
struct vsctl_info info;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
bridge = find_bridge(&info, ctx->argv[1], true);
ds_put_format(&ctx->output, "%d\n", bridge->vlan);
free_info(&info);
struct vsctl_bridge *bridge;
struct vsctl_info info;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
bridge = find_bridge(&info, ctx->argv[1], true);
if (bridge->parent) {
bridge = bridge->parent;
struct vsctl_info info;
struct svec ifaces;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
br = find_bridge(&info, ctx->argv[1], true);
+ verify_ports(ctx);
svec_init(&ifaces);
SHASH_FOR_EACH (node, &info.ifaces) {
struct vsctl_iface *iface;
struct vsctl_info info;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
iface = find_iface(&info, ctx->argv[1], true);
ds_put_format(&ctx->output, "%s\n", iface->port->bridge->name);
free_info(&info);
}
+static void
+verify_controllers(struct ovsrec_bridge *bridge)
+{
+ if (bridge) {
+ size_t i;
+
+ ovsrec_bridge_verify_controller(bridge);
+ for (i = 0; i < bridge->n_controller; i++) {
+ ovsrec_controller_verify_target(bridge->controller[i]);
+ }
+ }
+}
+
static void
cmd_get_controller(struct vsctl_context *ctx)
{
struct svec targets;
size_t i;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
br = find_bridge(&info, ctx->argv[1], true);
+ verify_controllers(br->br_cfg);
/* Print the targets in sorted order for reproducibility. */
svec_init(&targets);
struct vsctl_info info;
struct vsctl_bridge *br;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
br = find_real_bridge(&info, ctx->argv[1], true);
+ verify_controllers(br->br_cfg);
if (br->ctrl) {
delete_controllers(br->ctrl, br->n_ctrl);
struct ovsrec_controller **controllers;
size_t n;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
br = find_real_bridge(&info, ctx->argv[1], true);
+ verify_controllers(br->br_cfg);
delete_controllers(br->ctrl, br->n_ctrl);
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);
+ get_info(ctx, &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->br_cfg) {
+ ovsrec_bridge_verify_fail_mode(br->br_cfg);
+ }
+ 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)
{
struct vsctl_info info;
struct vsctl_bridge *br;
- get_info(ctx->ovs, &info);
+ get_info(ctx, &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);
}
struct vsctl_bridge *br;
const char *fail_mode = ctx->argv[2];
- get_info(ctx->ovs, &info);
+ get_info(ctx, &info);
br = find_real_bridge(&info, ctx->argv[1], true);
if (strcmp(fail_mode, "standalone") && strcmp(fail_mode, "secure")) {
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);
}
{
struct ovsrec_ssl *ssl = ctx->ovs->ssl;
+ ovsrec_open_vswitch_verify_ssl(ctx->ovs);
if (ssl) {
+ ovsrec_ssl_verify_private_key(ssl);
+ ovsrec_ssl_verify_certificate(ssl);
+ ovsrec_ssl_verify_ca_cert(ssl);
+ ovsrec_ssl_verify_bootstrap_ca_cert(ssl);
+
ds_put_format(&ctx->output, "Private key: %s\n", ssl->private_key);
ds_put_format(&ctx->output, "Certificate: %s\n", ssl->certificate);
ds_put_format(&ctx->output, "CA Certificate: %s\n", ssl->ca_cert);
struct ovsrec_ssl *ssl = ctx->ovs->ssl;
if (ssl) {
+ ovsrec_open_vswitch_verify_ssl(ctx->ovs);
ovsrec_ssl_delete(ssl);
ovsrec_open_vswitch_set_ssl(ctx->ovs, NULL);
}
bool bootstrap = shash_find(&ctx->options, "--bootstrap");
struct ovsrec_ssl *ssl = ctx->ovs->ssl;
+ ovsrec_open_vswitch_verify_ssl(ctx->ovs);
if (ssl) {
ovsrec_ssl_delete(ssl);
}
if (id->uuid_column) {
const struct ovsdb_datum *uuid;
+ ovsdb_idl_txn_verify(referrer, id->uuid_column);
uuid = ovsdb_idl_get(referrer, id->uuid_column,
OVSDB_TYPE_UUID, OVSDB_TYPE_VOID);
if (uuid->n == 1) {
&column, &key_string,
NULL, NULL, 0, NULL));
+ ovsdb_idl_txn_verify(row, column);
datum = ovsdb_idl_read(row, column);
if (key_string) {
union ovsdb_atom key;
type->value.type == OVSDB_TYPE_VOID ? "values" : "pairs",
column->name, table->class->name, type->n_max);
}
+ ovsdb_idl_txn_verify(row, column);
ovsdb_idl_txn_write(row, column, &old);
}
type->value.type == OVSDB_TYPE_VOID ? "values" : "pairs",
column->name, table->class->name, type->n_min);
}
+ ovsdb_idl_txn_verify(row, column);
ovsdb_idl_txn_write(row, column, &old);
}
ctx->txn = txn;
ctx->ovs = ovs;
ctx->symtab = symtab;
+ ctx->verified_ports = false;
ctx->try_again = false;
}