diff --git a/ovn/automake.mk b/ovn/automake.mk index 901e71083..33bbd05c2 100644 --- a/ovn/automake.mk +++ b/ovn/automake.mk @@ -76,6 +76,7 @@ EXTRA_DIST += \ ovn/OVN-GW-HA.md include ovn/controller/automake.mk +include ovn/controller-vtep/automake.mk include ovn/lib/automake.mk include ovn/northd/automake.mk include ovn/utilities/automake.mk diff --git a/ovn/controller-vtep/.gitignore b/ovn/controller-vtep/.gitignore new file mode 100644 index 000000000..3ec8072c7 --- /dev/null +++ b/ovn/controller-vtep/.gitignore @@ -0,0 +1,2 @@ +/ovn-controller-vtep +/ovn-controller-vtep.8 diff --git a/ovn/controller-vtep/automake.mk b/ovn/controller-vtep/automake.mk new file mode 100644 index 000000000..7adda15ff --- /dev/null +++ b/ovn/controller-vtep/automake.mk @@ -0,0 +1,8 @@ +bin_PROGRAMS += ovn/controller-vtep/ovn-controller-vtep +ovn_controller_vtep_ovn_controller_vtep_SOURCES = \ + ovn/controller-vtep/ovn-controller-vtep.c \ + ovn/controller-vtep/ovn-controller-vtep.h +ovn_controller_vtep_ovn_controller_vtep_LDADD = ovn/lib/libovn.la lib/libopenvswitch.la vtep/libvtep.la +man_MANS += ovn/controller-vtep/ovn-controller-vtep.8 +EXTRA_DIST += ovn/controller-vtep/ovn-controller-vtep.8.xml +DISTCLEANFILES += ovn/controller-vtep/ovn-controller-vtep.8 diff --git a/ovn/controller-vtep/ovn-controller-vtep.8.xml b/ovn/controller-vtep/ovn-controller-vtep.8.xml new file mode 100644 index 000000000..c924f9fc0 --- /dev/null +++ b/ovn/controller-vtep/ovn-controller-vtep.8.xml @@ -0,0 +1,70 @@ + + +

Name

+

ovn-controller-vtep -- Open Virtual Network local controller for + vtep enabled physical switches. +

+ +

Synopsis

+

ovn-controller-vtep [options] + [--vtep-db=vtep-database] [--ovnsb-db=ovnsb-database] +

+ +

Description

+

+ ovn-controller-vtep is the local controller daemon in + OVN, the Open Virtual Network, for VTEP enabled physical switches. + It connects up to the OVN Southbound database (see + ovn-sb(5)) over the OVSDB protocol, and down to the VTEP + database (see vtep(5)) over the OVSDB protocol. +

+ +

Configuration

+

+ ovn-controller-vtep retrieves its configuration + information from both the ovnsb and the vtep database. If the + database locations are not given from command line, the default + is the db.sock in local OVSDB's 'run' directory. + The datapath location must take one of the following forms: +

+ +
diff --git a/ovn/controller-vtep/ovn-controller-vtep.c b/ovn/controller-vtep/ovn-controller-vtep.c new file mode 100644 index 000000000..c83218ff7 --- /dev/null +++ b/ovn/controller-vtep/ovn-controller-vtep.c @@ -0,0 +1,247 @@ +/* Copyright (c) 2015 Nicira, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include +#include +#include +#include + +#include "ovn-controller-vtep.h" + +#include "command-line.h" +#include "compiler.h" +#include "daemon.h" +#include "dirs.h" +#include "dynamic-string.h" +#include "fatal-signal.h" +#include "poll-loop.h" +#include "stream.h" +#include "stream-ssl.h" +#include "unixctl.h" +#include "util.h" +#include "openvswitch/vconn.h" +#include "openvswitch/vlog.h" +#include "ovn/lib/ovn-sb-idl.h" +#include "vtep/vtep-idl.h" + +static unixctl_cb_func ovn_controller_vtep_exit; + +static void parse_options(int argc, char *argv[]); +OVS_NO_RETURN static void usage(void); + +static char *vtep_remote; +static char *ovnsb_remote; + +static void +get_initial_snapshot(struct ovsdb_idl *idl) +{ + while (1) { + ovsdb_idl_run(idl); + if (ovsdb_idl_has_ever_connected(idl)) { + return; + } + ovsdb_idl_wait(idl); + poll_block(); + } +} + +int +main(int argc, char *argv[]) +{ + struct unixctl_server *unixctl; + bool exiting; + int retval; + + ovs_cmdl_proctitle_init(argc, argv); + set_program_name(argv[0]); + parse_options(argc, argv); + fatal_ignore_sigpipe(); + + daemonize_start(); + + retval = unixctl_server_create(NULL, &unixctl); + if (retval) { + exit(EXIT_FAILURE); + } + unixctl_command_register("exit", "", 0, 0, ovn_controller_vtep_exit, + &exiting); + + daemonize_complete(); + + vteprec_init(); + sbrec_init(); + + /* Connect to VTEP database. */ + struct ovsdb_idl_loop vtep_idl_loop = OVSDB_IDL_LOOP_INITIALIZER( + ovsdb_idl_create(vtep_remote, &vteprec_idl_class, true, true)); + get_initial_snapshot(vtep_idl_loop.idl); + + /* Connect to OVN SB database. */ + struct ovsdb_idl_loop ovnsb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER( + ovsdb_idl_create(ovnsb_remote, &sbrec_idl_class, true, true)); + get_initial_snapshot(ovnsb_idl_loop.idl); + + /* Main loop. */ + exiting = false; + while (!exiting) { + struct controller_vtep_ctx OVS_UNUSED ctx = { + .vtep_idl = vtep_idl_loop.idl, + .vtep_idl_txn = ovsdb_idl_loop_run(&vtep_idl_loop), + .ovnsb_idl = ovnsb_idl_loop.idl, + .ovnsb_idl_txn = ovsdb_idl_loop_run(&ovnsb_idl_loop), + }; + + unixctl_server_run(unixctl); + + unixctl_server_wait(unixctl); + if (exiting) { + poll_immediate_wake(); + } + ovsdb_idl_loop_commit_and_wait(&vtep_idl_loop); + ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop); + poll_block(); + } + + unixctl_server_destroy(unixctl); + + ovsdb_idl_loop_destroy(&vtep_idl_loop); + ovsdb_idl_loop_destroy(&ovnsb_idl_loop); + + free(ovnsb_remote); + free(vtep_remote); + + exit(retval); +} + +static char * +default_db(void) +{ + static char *def; + if (!def) { + def = xasprintf("unix:%s/db.sock", ovs_rundir()); + } + return def; +} + +static void +parse_options(int argc, char *argv[]) +{ + enum { + OPT_PEER_CA_CERT = UCHAR_MAX + 1, + VLOG_OPTION_ENUMS, + DAEMON_OPTION_ENUMS + }; + + static struct option long_options[] = { + {"ovnsb-db", required_argument, NULL, 'd'}, + {"vtep-db", required_argument, NULL, 'D'}, + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'V'}, + VLOG_LONG_OPTIONS, + DAEMON_LONG_OPTIONS, + STREAM_SSL_LONG_OPTIONS, + {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT}, + {NULL, 0, NULL, 0} + }; + char *short_options = ovs_cmdl_long_options_to_short_options(long_options); + + for (;;) { + int c; + + c = getopt_long(argc, argv, short_options, long_options, NULL); + if (c == -1) { + break; + } + + switch (c) { + case 'd': + ovnsb_remote = optarg; + break; + + case 'D': + vtep_remote = optarg; + break; + + case 'h': + usage(); + + case 'V': + ovs_print_version(OFP13_VERSION, OFP13_VERSION); + exit(EXIT_SUCCESS); + + VLOG_OPTION_HANDLERS + DAEMON_OPTION_HANDLERS + STREAM_SSL_OPTION_HANDLERS + + case OPT_PEER_CA_CERT: + stream_ssl_set_peer_ca_cert_file(optarg); + break; + + case '?': + exit(EXIT_FAILURE); + + default: + abort(); + } + } + free(short_options); + + argc -= optind; + argv += optind; + + if (!ovnsb_remote) { + ovnsb_remote = default_db(); + } + + if (!vtep_remote) { + vtep_remote = default_db(); + } +} + +static void +usage(void) +{ + printf("\ +%s: OVN controller VTEP\n\ +usage %s [OPTIONS]\n\ +\n\ +Options:\n\ + --vtep-db=DATABASE connect to vtep database at DATABASE\n\ + (default: %s)\n\ + --ovnsb-db=DATABASE connect to ovn-sb database at DATABASE\n\ + (default: %s)\n\ + -h, --help display this help message\n\ + -o, --options list available options\n\ + -V, --version display version information\n\ +", program_name, program_name, default_db(), default_db()); + stream_usage("database", true, false, false); + daemon_usage(); + vlog_usage(); + exit(EXIT_SUCCESS); +} + + +static void +ovn_controller_vtep_exit(struct unixctl_conn *conn, int argc OVS_UNUSED, + const char *argv[] OVS_UNUSED, void *exiting_) +{ + bool *exiting = exiting_; + *exiting = true; + + unixctl_command_reply(conn, NULL); +} diff --git a/ovn/controller-vtep/ovn-controller-vtep.h b/ovn/controller-vtep/ovn-controller-vtep.h new file mode 100644 index 000000000..bb01eb918 --- /dev/null +++ b/ovn/controller-vtep/ovn-controller-vtep.h @@ -0,0 +1,31 @@ +/* Copyright (c) 2015 Nicira, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef OVN_CONTROLLER_VTEP_H +#define OVN_CONTROLLER_VTEP_H 1 + +struct ovsdb_idl; +struct ovsdb_idl_txn; + +struct controller_vtep_ctx { + struct ovsdb_idl *ovnsb_idl; + struct ovsdb_idl_txn *ovnsb_idl_txn; + + struct ovsdb_idl *vtep_idl; + struct ovsdb_idl_txn *vtep_idl_txn; +}; + +#endif /* ovn/ovn-controller-vtep.h */ diff --git a/tests/automake.mk b/tests/automake.mk index bbcc7922f..32f757b9b 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -87,7 +87,8 @@ TESTSUITE_AT = \ tests/vtep-ctl.at \ tests/auto-attach.at \ tests/ovn.at \ - tests/ovn-sbctl.at + tests/ovn-sbctl.at \ + tests/ovn-controller-vtep.at SYSTEM_KMOD_TESTSUITE_AT = \ tests/system-common-macros.at \ @@ -108,7 +109,7 @@ SYSTEM_KMOD_TESTSUITE = $(srcdir)/tests/system-kmod-testsuite SYSTEM_USERSPACE_TESTSUITE = $(srcdir)/tests/system-userspace-testsuite DISTCLEANFILES += tests/atconfig tests/atlocal -AUTOTEST_PATH = utilities:vswitchd:ovsdb:vtep:tests:$(PTHREAD_WIN32_DIR_DLL):ovn:ovn/northd:ovn/utilities +AUTOTEST_PATH = utilities:vswitchd:ovsdb:vtep:tests:$(PTHREAD_WIN32_DIR_DLL):ovn:ovn/controller-vtep:ovn/northd:ovn/utilities check-local: tests/atconfig tests/atlocal $(TESTSUITE) $(SHELL) '$(TESTSUITE)' -C tests AUTOTEST_PATH=$(AUTOTEST_PATH) $(TESTSUITEFLAGS) diff --git a/tests/ovn-controller-vtep.at b/tests/ovn-controller-vtep.at new file mode 100644 index 000000000..bcae89cf4 --- /dev/null +++ b/tests/ovn-controller-vtep.at @@ -0,0 +1 @@ +AT_BANNER([ovn_controller_vtep]) diff --git a/tests/testsuite.at b/tests/testsuite.at index f706f6760..384efdfa6 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -18,6 +18,7 @@ m4_include([tests/ovs-macros.at]) m4_include([tests/ovsdb-macros.at]) m4_include([tests/ofproto-macros.at]) +m4_include([tests/ovn-controller-vtep.at]) m4_include([tests/completion.at]) m4_include([tests/bfd.at]) m4_include([tests/cfm.at])