netdev-linux: Cleanup tap netdev.
[openvswitch] / utilities / ovs-vsctl.c
index 852db3aeea61ded61d361699e799a86df6d48f12..f3bb88e2c3f91d25cd62a3c68286f0976c35b0ad 100644 (file)
@@ -153,7 +153,8 @@ parse_options(int argc, char *argv[])
         OPT_ONELINE,
         OPT_NO_SYSLOG,
         OPT_NO_WAIT,
-        OPT_DRY_RUN
+        OPT_DRY_RUN,
+        VLOG_OPTION_ENUMS
     };
     static struct option long_options[] = {
         {"db", required_argument, 0, OPT_DB},
@@ -162,15 +163,14 @@ parse_options(int argc, char *argv[])
         {"dry-run", no_argument, 0, OPT_DRY_RUN},
         {"oneline", no_argument, 0, OPT_ONELINE},
         {"timeout", required_argument, 0, 't'},
-        {"verbose", optional_argument, 0, 'v'},
         {"help", no_argument, 0, 'h'},
         {"version", no_argument, 0, 'V'},
+        VLOG_LONG_OPTIONS,
         {0, 0, 0, 0},
     };
 
 
     for (;;) {
-        unsigned long int timeout;
         int c;
 
         c = getopt_long(argc, argv, "+v::hVt:", long_options, NULL);
@@ -214,9 +214,7 @@ parse_options(int argc, char *argv[])
             }
             break;
 
-        case 'v':
-            vlog_set_verbosity(optarg);
-            break;
+        VLOG_OPTION_HANDLERS
 
         case '?':
             exit(EXIT_FAILURE);
@@ -301,15 +299,23 @@ usage(void)
            "print the controller for BRIDGE\n"
            "  del-controller [BRIDGE]     "
            "delete the controller for BRIDGE\n"
-           "  set-controller [BRIDGE] TARGET "
+           "  set-controller [BRIDGE] TARGET  "
            "set the controller for BRIDGE to TARGET\n"
            "  get-fail-mode [BRIDGE]     "
            "print the fail-mode for BRIDGE\n"
            "  del-fail-mode [BRIDGE]     "
            "delete the fail-mode for BRIDGE\n"
-           "  set-fail-mode [BRIDGE] MODE "
+           "  set-fail-mode [BRIDGE] MODE  "
            "set the fail-mode for BRIDGE to MODE\n"
         );
+    printf("\nSSL commands:\n"
+           "  get-ssl              "
+           "print the SSL configuration\n"
+           "  del-ssl              "
+           "delete the SSL configuration\n"
+           "  set-ssl PRIV-KEY CERT CA-CERT  "
+           "set the SSL configuration\n"
+        );
     printf("\nOptions:\n"
            "  --db=DATABASE               "
            "connect to DATABASE\n"
@@ -386,7 +392,7 @@ add_bridge(struct vsctl_info *b,
     br->name = xstrdup(name);
     br->parent = parent;
     br->vlan = vlan;
-    br->ctrl = br_cfg->controller;
+    br->ctrl = parent ? parent->br_cfg->controller : br_cfg->controller;
     shash_add(&b->bridges, br->name, br);
     return br;
 }
@@ -583,6 +589,16 @@ find_bridge(struct vsctl_info *info, const char *name, bool must_exist)
     return br;
 }
 
+static struct vsctl_bridge *
+find_real_bridge(struct vsctl_info *info, const char *name, bool must_exist)
+{
+    struct vsctl_bridge *br = find_bridge(info, name, must_exist);
+    if (br && br->parent) {
+        vsctl_fatal("%s is a fake bridge", name);
+    }
+    return br;
+}
+
 static struct vsctl_port *
 find_port(struct vsctl_info *info, const char *name, bool must_exist)
 {
@@ -723,7 +739,7 @@ cmd_add_br(struct vsctl_context *ctx)
 
         parent = find_bridge(&info, parent_name, false);
         if (parent && parent->vlan) {
-            vsctl_fatal("cannot create brdige with fake bridge as parent");
+            vsctl_fatal("cannot create bridge with fake bridge as parent");
         }
         if (!parent) {
             vsctl_fatal("parent bridge %s does not exist", parent_name);
@@ -985,7 +1001,7 @@ cmd_list_ports(struct vsctl_context *ctx)
 
 static void
 add_port(const struct ovsrec_open_vswitch *ovs,
-         const char *br_name, const char *port_name,
+         const char *br_name, const char *port_name, bool fake_iface,
          char *iface_names[], int n_ifaces)
 {
     struct vsctl_info info;
@@ -1009,6 +1025,7 @@ add_port(const struct ovsrec_open_vswitch *ovs,
     port = ovsrec_port_insert(txn_from_openvswitch(ovs));
     ovsrec_port_set_name(port, port_name);
     ovsrec_port_set_interfaces(port, ifaces, n_ifaces);
+    ovsrec_port_set_bond_fake_iface(port, fake_iface);
     free(ifaces);
 
     if (bridge->vlan) {
@@ -1025,13 +1042,16 @@ add_port(const struct ovsrec_open_vswitch *ovs,
 static void
 cmd_add_port(struct vsctl_context *ctx)
 {
-    add_port(ctx->ovs, ctx->argv[1], ctx->argv[2], &ctx->argv[2], 1);
+    add_port(ctx->ovs, ctx->argv[1], ctx->argv[2], false, &ctx->argv[2], 1);
 }
 
 static void
 cmd_add_bond(struct vsctl_context *ctx)
 {
-    add_port(ctx->ovs, ctx->argv[1], ctx->argv[2], &ctx->argv[3], ctx->argc - 3);
+    bool fake_iface = shash_find(&ctx->options, "--fake-iface");
+
+    add_port(ctx->ovs, ctx->argv[1], ctx->argv[2], fake_iface,
+             &ctx->argv[3], ctx->argc - 3);
 }
 
 static void
@@ -1258,7 +1278,7 @@ cmd_del_controller(struct vsctl_context *ctx)
             ovsrec_open_vswitch_set_controller(ctx->ovs, NULL);
         }
     } else {
-        struct vsctl_bridge *br = find_bridge(&info, ctx->argv[1], true);
+        struct vsctl_bridge *br = find_real_bridge(&info, ctx->argv[1], true);
 
         if (br->ctrl) {
             ovsrec_controller_delete(br->ctrl);
@@ -1287,7 +1307,7 @@ cmd_set_controller(struct vsctl_context *ctx)
         ovsrec_open_vswitch_set_controller(ctx->ovs, ctrl);
     } else {
         /* Set the controller for a particular bridge. */
-        struct vsctl_bridge *br = find_bridge(&info, ctx->argv[1], true);
+        struct vsctl_bridge *br = find_real_bridge(&info, ctx->argv[1], true);
 
         if (br->ctrl) {
             ovsrec_controller_delete(br->ctrl);
@@ -1328,7 +1348,7 @@ cmd_get_fail_mode(struct vsctl_context *ctx)
     }
 
     if (fail_mode && strlen(fail_mode)) {
-        ds_put_format(&ctx->output, "%s\n", info.ctrl->fail_mode);
+        ds_put_format(&ctx->output, "%s\n", fail_mode);
     }
 
     free_info(&info);
@@ -1346,7 +1366,7 @@ cmd_del_fail_mode(struct vsctl_context *ctx)
             ovsrec_controller_set_fail_mode(info.ctrl, NULL);
         }
     } else {
-        struct vsctl_bridge *br = find_bridge(&info, ctx->argv[1], true);
+        struct vsctl_bridge *br = find_real_bridge(&info, ctx->argv[1], true);
 
         if (br->ctrl && br->ctrl->fail_mode) {
             ovsrec_controller_set_fail_mode(br->ctrl, NULL);
@@ -1377,7 +1397,7 @@ cmd_set_fail_mode(struct vsctl_context *ctx)
         }
         ovsrec_controller_set_fail_mode(info.ctrl, fail_mode);
     } else {
-        struct vsctl_bridge *br = find_bridge(&info, ctx->argv[1], true);
+        struct vsctl_bridge *br = find_real_bridge(&info, ctx->argv[1], true);
 
         if (!br->ctrl) {
             vsctl_fatal("no controller declared for %s", br->name);
@@ -1387,6 +1407,51 @@ cmd_set_fail_mode(struct vsctl_context *ctx)
 
     free_info(&info);
 }
+
+static void
+cmd_get_ssl(struct vsctl_context *ctx)
+{
+    struct ovsrec_ssl *ssl = ctx->ovs->ssl;
+
+    if (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);
+        ds_put_format(&ctx->output, "Bootstrap: %s\n",
+                ssl->bootstrap_ca_cert ? "true" : "false");
+    }
+}
+
+static void
+cmd_del_ssl(struct vsctl_context *ctx)
+{
+    struct ovsrec_ssl *ssl = ctx->ovs->ssl;
+
+    if (ssl) {
+        ovsrec_ssl_delete(ssl);
+        ovsrec_open_vswitch_set_ssl(ctx->ovs, NULL);
+    }
+}
+
+static void
+cmd_set_ssl(struct vsctl_context *ctx)
+{
+    bool bootstrap = shash_find(&ctx->options, "--bootstrap");
+    struct ovsrec_ssl *ssl = ctx->ovs->ssl;
+
+    if (ssl) {
+        ovsrec_ssl_delete(ssl);
+    }
+    ssl = ovsrec_ssl_insert(txn_from_openvswitch(ctx->ovs));
+
+    ovsrec_ssl_set_private_key(ssl, ctx->argv[1]);
+    ovsrec_ssl_set_certificate(ssl, ctx->argv[2]);
+    ovsrec_ssl_set_ca_cert(ssl, ctx->argv[3]);
+
+    ovsrec_ssl_set_bootstrap_ca_cert(ssl, bootstrap);
+
+    ovsrec_open_vswitch_set_ssl(ctx->ovs, ssl);
+}
 \f
 typedef void vsctl_handler_func(struct vsctl_context *);
 
@@ -1568,7 +1633,7 @@ get_vsctl_handler(int argc, char *argv[], struct vsctl_context *ctx)
         /* Port commands. */
         {"list-ports", 1, 1, cmd_list_ports, ""},
         {"add-port", 2, 2, cmd_add_port, ""},
-        {"add-bond", 4, INT_MAX, cmd_add_bond, ""},
+        {"add-bond", 4, INT_MAX, cmd_add_bond, "--fake-iface"},
         {"del-port", 1, 2, cmd_del_port, "--if-exists"},
         {"port-to-br", 1, 1, cmd_port_to_br, ""},
         {"port-set-external-id", 2, 3, cmd_port_set_external_id, ""},
@@ -1587,6 +1652,11 @@ get_vsctl_handler(int argc, char *argv[], struct vsctl_context *ctx)
         {"get-fail-mode", 0, 1, cmd_get_fail_mode, ""},
         {"del-fail-mode", 0, 1, cmd_del_fail_mode, ""},
         {"set-fail-mode", 1, 2, cmd_set_fail_mode, ""},
+
+        /* SSL commands. */
+        {"get-ssl", 0, 0, cmd_get_ssl, ""},
+        {"del-ssl", 0, 0, cmd_del_ssl, ""},
+        {"set-ssl", 3, 3, cmd_set_ssl, "--bootstrap"},
     };
 
     const struct vsctl_command *p;