1 /* Copyright (c) 2015, 2016 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 "openvswitch/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 "ovn/lib/ovn-util.h"
39 #include "vtep/vtep-idl.h"
44 #include "ovn-controller-vtep.h"
46 static unixctl_cb_func ovn_controller_vtep_exit
;
48 static void parse_options(int argc
, char *argv
[]);
49 OVS_NO_RETURN
static void usage(void);
51 static char *vtep_remote
;
52 static char *ovnsb_remote
;
53 static char *default_db_
;
56 main(int argc
, char *argv
[])
58 struct unixctl_server
*unixctl
;
62 ovs_cmdl_proctitle_init(argc
, argv
);
63 set_program_name(argv
[0]);
64 service_start(&argc
, &argv
);
65 parse_options(argc
, argv
);
66 fatal_ignore_sigpipe();
68 daemonize_start(false);
70 retval
= unixctl_server_create(NULL
, &unixctl
);
74 unixctl_command_register("exit", "", 0, 0, ovn_controller_vtep_exit
,
79 /* Connect to VTEP database. */
80 struct ovsdb_idl_loop vtep_idl_loop
= OVSDB_IDL_LOOP_INITIALIZER(
81 ovsdb_idl_create(vtep_remote
, &vteprec_idl_class
, true, true));
82 ovsdb_idl_get_initial_snapshot(vtep_idl_loop
.idl
);
84 /* Connect to OVN SB database. */
85 struct ovsdb_idl_loop ovnsb_idl_loop
= OVSDB_IDL_LOOP_INITIALIZER(
86 ovsdb_idl_create(ovnsb_remote
, &sbrec_idl_class
, true, true));
87 ovsdb_idl_get_initial_snapshot(ovnsb_idl_loop
.idl
);
92 struct controller_vtep_ctx ctx
= {
93 .vtep_idl
= vtep_idl_loop
.idl
,
94 .vtep_idl_txn
= ovsdb_idl_loop_run(&vtep_idl_loop
),
95 .ovnsb_idl
= ovnsb_idl_loop
.idl
,
96 .ovnsb_idl_txn
= ovsdb_idl_loop_run(&ovnsb_idl_loop
),
102 unixctl_server_run(unixctl
);
104 unixctl_server_wait(unixctl
);
106 poll_immediate_wake();
108 ovsdb_idl_loop_commit_and_wait(&vtep_idl_loop
);
109 ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop
);
111 if (should_service_stop()) {
116 /* It's time to exit. Clean up the databases. */
119 struct controller_vtep_ctx ctx
= {
120 .vtep_idl
= vtep_idl_loop
.idl
,
121 .vtep_idl_txn
= ovsdb_idl_loop_run(&vtep_idl_loop
),
122 .ovnsb_idl
= ovnsb_idl_loop
.idl
,
123 .ovnsb_idl_txn
= ovsdb_idl_loop_run(&ovnsb_idl_loop
),
126 /* Run all of the cleanup functions, even if one of them returns false.
127 * We're done if all of them return true. */
128 done
= binding_cleanup(&ctx
);
129 done
= gateway_cleanup(&ctx
) && done
;
130 done
= vtep_cleanup(&ctx
) && done
;
132 poll_immediate_wake();
135 ovsdb_idl_loop_commit_and_wait(&vtep_idl_loop
);
136 ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop
);
140 unixctl_server_destroy(unixctl
);
142 ovsdb_idl_loop_destroy(&vtep_idl_loop
);
143 ovsdb_idl_loop_destroy(&ovnsb_idl_loop
);
157 default_db_
= xasprintf("unix:%s/db.sock", ovs_rundir());
163 parse_options(int argc
, char *argv
[])
166 OPT_PEER_CA_CERT
= UCHAR_MAX
+ 1,
167 OPT_BOOTSTRAP_CA_CERT
,
173 static struct option long_options
[] = {
174 {"ovnsb-db", required_argument
, NULL
, 'd'},
175 {"vtep-db", required_argument
, NULL
, 'D'},
176 {"help", no_argument
, NULL
, 'h'},
177 {"version", no_argument
, NULL
, 'V'},
180 STREAM_SSL_LONG_OPTIONS
,
181 {"peer-ca-cert", required_argument
, NULL
, OPT_PEER_CA_CERT
},
182 {"bootstrap-ca-cert", required_argument
, NULL
, OPT_BOOTSTRAP_CA_CERT
},
185 char *short_options
= ovs_cmdl_long_options_to_short_options(long_options
);
190 c
= getopt_long(argc
, argv
, short_options
, long_options
, NULL
);
197 ovnsb_remote
= xstrdup(optarg
);
201 vtep_remote
= xstrdup(optarg
);
208 ovs_print_version(OFP13_VERSION
, OFP13_VERSION
);
212 DAEMON_OPTION_HANDLERS
213 STREAM_SSL_OPTION_HANDLERS
215 case OPT_PEER_CA_CERT
:
216 stream_ssl_set_peer_ca_cert_file(optarg
);
219 case OPT_BOOTSTRAP_CA_CERT
:
220 stream_ssl_set_ca_cert_file(optarg
, true);
233 ovnsb_remote
= xstrdup(default_sb_db());
237 vtep_remote
= xstrdup(default_db());
245 %s: OVN controller VTEP\n\
246 usage %s [OPTIONS]\n\
249 --vtep-db=DATABASE connect to vtep database at DATABASE\n\
251 --ovnsb-db=DATABASE connect to ovn-sb database at DATABASE\n\
253 -h, --help display this help message\n\
254 -o, --options list available options\n\
255 -V, --version display version information\n\
256 ", program_name
, program_name
, default_db(), default_db());
257 stream_usage("database", true, false, false);
265 ovn_controller_vtep_exit(struct unixctl_conn
*conn
, int argc OVS_UNUSED
,
266 const char *argv
[] OVS_UNUSED
, void *exiting_
)
268 bool *exiting
= exiting_
;
271 unixctl_command_reply(conn
, NULL
);