1 /* Copyright (c) 2015 Nicira, Inc.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
24 #include "command-line.h"
28 #include "dynamic-string.h"
29 #include "fatal-signal.h"
30 #include "poll-loop.h"
32 #include "stream-ssl.h"
35 #include "openvswitch/vconn.h"
36 #include "openvswitch/vlog.h"
37 #include "ovn/lib/ovn-sb-idl.h"
38 #include "vtep/vtep-idl.h"
43 #include "ovn-controller-vtep.h"
45 static unixctl_cb_func ovn_controller_vtep_exit;
47 static void parse_options(int argc, char *argv[]);
48 OVS_NO_RETURN static void usage(void);
50 static char *vtep_remote;
51 static char *ovnsb_remote;
52 static char *default_db_;
55 main(int argc, char *argv[])
57 struct unixctl_server *unixctl;
61 ovs_cmdl_proctitle_init(argc, argv);
62 set_program_name(argv[0]);
63 service_start(&argc, &argv);
64 parse_options(argc, argv);
65 fatal_ignore_sigpipe();
67 daemonize_start(false);
69 retval = unixctl_server_create(NULL, &unixctl);
73 unixctl_command_register("exit", "", 0, 0, ovn_controller_vtep_exit,
81 /* Connect to VTEP database. */
82 struct ovsdb_idl_loop vtep_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
83 ovsdb_idl_create(vtep_remote, &vteprec_idl_class, true, true));
84 ovsdb_idl_get_initial_snapshot(vtep_idl_loop.idl);
86 /* Connect to OVN SB database. */
87 struct ovsdb_idl_loop ovnsb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
88 ovsdb_idl_create(ovnsb_remote, &sbrec_idl_class, true, true));
89 ovsdb_idl_get_initial_snapshot(ovnsb_idl_loop.idl);
94 struct controller_vtep_ctx ctx = {
95 .vtep_idl = vtep_idl_loop.idl,
96 .vtep_idl_txn = ovsdb_idl_loop_run(&vtep_idl_loop),
97 .ovnsb_idl = ovnsb_idl_loop.idl,
98 .ovnsb_idl_txn = ovsdb_idl_loop_run(&ovnsb_idl_loop),
104 unixctl_server_run(unixctl);
106 unixctl_server_wait(unixctl);
108 poll_immediate_wake();
110 ovsdb_idl_loop_commit_and_wait(&vtep_idl_loop);
111 ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop);
113 if (should_service_stop()) {
118 /* It's time to exit. Clean up the databases. */
121 struct controller_vtep_ctx ctx = {
122 .vtep_idl = vtep_idl_loop.idl,
123 .vtep_idl_txn = ovsdb_idl_loop_run(&vtep_idl_loop),
124 .ovnsb_idl = ovnsb_idl_loop.idl,
125 .ovnsb_idl_txn = ovsdb_idl_loop_run(&ovnsb_idl_loop),
128 /* Run all of the cleanup functions, even if one of them returns false.
129 * We're done if all of them return true. */
130 done = binding_cleanup(&ctx);
131 done = gateway_cleanup(&ctx) && done;
132 done = vtep_cleanup(&ctx) && done;
134 poll_immediate_wake();
137 ovsdb_idl_loop_commit_and_wait(&vtep_idl_loop);
138 ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop);
142 unixctl_server_destroy(unixctl);
144 ovsdb_idl_loop_destroy(&vtep_idl_loop);
145 ovsdb_idl_loop_destroy(&ovnsb_idl_loop);
159 default_db_ = xasprintf("unix:%s/db.sock", ovs_rundir());
165 parse_options(int argc, char *argv[])
168 OPT_PEER_CA_CERT = UCHAR_MAX + 1,
169 OPT_BOOTSTRAP_CA_CERT,
174 static struct option long_options[] = {
175 {"ovnsb-db", required_argument, NULL, 'd'},
176 {"vtep-db", required_argument, NULL, 'D'},
177 {"help", no_argument, NULL, 'h'},
178 {"version", no_argument, NULL, 'V'},
181 STREAM_SSL_LONG_OPTIONS,
182 {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT},
183 {"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
186 char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
191 c = getopt_long(argc, argv, short_options, long_options, NULL);
198 ovnsb_remote = xstrdup(optarg);
202 vtep_remote = xstrdup(optarg);
209 ovs_print_version(OFP13_VERSION, OFP13_VERSION);
213 DAEMON_OPTION_HANDLERS
214 STREAM_SSL_OPTION_HANDLERS
216 case OPT_PEER_CA_CERT:
217 stream_ssl_set_peer_ca_cert_file(optarg);
220 case OPT_BOOTSTRAP_CA_CERT:
221 stream_ssl_set_ca_cert_file(optarg, true);
237 ovnsb_remote = xstrdup(default_db());
241 vtep_remote = xstrdup(default_db());
249 %s: OVN controller VTEP\n\
250 usage %s [OPTIONS]\n\
253 --vtep-db=DATABASE connect to vtep database at DATABASE\n\
255 --ovnsb-db=DATABASE connect to ovn-sb database at DATABASE\n\
257 -h, --help display this help message\n\
258 -o, --options list available options\n\
259 -V, --version display version information\n\
260 ", program_name, program_name, default_db(), default_db());
261 stream_usage("database", true, false, false);
269 ovn_controller_vtep_exit(struct unixctl_conn *conn, int argc OVS_UNUSED,
270 const char *argv[] OVS_UNUSED, void *exiting_)
272 bool *exiting = exiting_;
275 unixctl_command_reply(conn, NULL);