Message ID | 20190813162726.16262-1-nusiddiq@redhat.com |
---|---|
State | Superseded |
Headers | show |
Series | External OVS source support and separate run dir for OVN | expand |
Bleep bloop. Greetings Numan Siddique, I am a robot and I have tried out your patch. Thanks for your contribution. I encountered some error that I wasn't expecting. See the details below. checkpatch: WARNING: Line is 99 characters long (recommended limit is 79) #650 FILE: utilities/ovn-ctl:340: OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" WARNING: Line is 103 characters long (recommended limit is 79) #659 FILE: utilities/ovn-ctl:362: OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" WARNING: Line is 103 characters long (recommended limit is 79) #668 FILE: utilities/ovn-ctl:389: OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" Lines checked: 1002, Warnings: 3, Errors: 0 Please check this out. If you feel there has been an error, please email aconole@redhat.com Thanks, 0-day Robot
On 8/13/19 12:27 PM, nusiddiq@redhat.com wrote: > From: Numan Siddique <nusiddiq@redhat.com> > > Until now, OVN uses the openvswitch rundirs (rundir, logdir, etcdir). > The commit [1] changed the package name from openvswitch to ovn, but > it didn't take into the account the effects of it. When "make install" > is run ovn-ctl utility is copied to /usr/local/share/ovn/scripts folder. > ovn-ctl depends on 'ovs-lib' and it is not present in this scripts foler. > Because of which we cannot start OVN services using ovn-ctl. > > This patch addresses all these issues. It changes the rundir to > ovn specific ones. (i.e /usr/local/var/run/ovn, /usr/local/var/log/ovn, > /usr/local/etc/ovn with default configuration). > > [1] - 7795e0e28dce("Change the package name from openvswitch to ovn in AC_INIT()") > > Tested:by: Dumitru Ceara <dceara@redhat.com> > Signed-off-by: Numan Siddique <nusiddiq@redhat.com> > --- > Documentation/intro/install/general.rst | 30 ++-- > Makefile.am | 5 + > configure.ac | 1 + > controller/ovn-controller.c | 4 +- > lib/.gitignore | 1 + > lib/automake.mk | 22 ++- > lib/ovn-dirs.c.in | 112 +++++++++++++ > lib/ovn-dirs.h | 35 ++++ > lib/ovn-util.c | 24 ++- > lib/ovn-util.h | 1 + > m4/openvswitch.m4 | 11 ++ > northd/ovn-northd.c | 9 +- > tests/ovs-macros.at | 1 + > tutorial/ovs-sandbox | 1 + > utilities/automake.mk | 5 + > utilities/ovn-ctl | 71 +++++---- > utilities/ovn-ctl.8.xml | 12 +- > utilities/ovn-lib.in | 204 ++++++++++++++++++++++++ > 18 files changed, 494 insertions(+), 55 deletions(-) > create mode 100644 lib/ovn-dirs.c.in > create mode 100644 lib/ovn-dirs.h > create mode 100644 utilities/ovn-lib.in > > diff --git a/Documentation/intro/install/general.rst b/Documentation/intro/install/general.rst > index 99d8fec04..4cc9c4c3a 100644 > --- a/Documentation/intro/install/general.rst > +++ b/Documentation/intro/install/general.rst > @@ -153,17 +153,17 @@ invoke configure without any arguments. For example:: > > $ ./configure > > -By default all files are installed under ``/usr/local``. OVN and Open vSwitch > -also expects to find its database in ``/usr/local/etc/openvswitch`` by default. > +By default all files are installed under ``/usr/local``. OVN expects to find > +its database in ``/usr/local/etc/ovn`` by default. > If you want to install all files into, e.g., ``/usr`` and ``/var`` instead of > -``/usr/local`` and ``/usr/local/var`` and expect to use ``/etc/openvswitch`` as > +``/usr/local`` and ``/usr/local/var`` and expect to use ``/etc/ovn`` as > the default database directory, add options as shown here:: > > $ ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc > > .. note:: > > - Open vSwitch and OVN installed with packages like .rpm (e.g. via > + OVN installed with packages like .rpm (e.g. via > ``yum install`` or ``rpm -ivh``) and .deb (e.g. via > ``apt-get install`` or ``dpkg -i``) use the above configure options. > > @@ -319,9 +319,13 @@ and stopping ovn-northd, ovn-controller and ovsdb-servers. After installation, > the daemons can be started by using the ovn-ctl utility. This will take care > to setup initial conditions, and start the daemons in the correct order. > The ovn-ctl utility is located in '$(pkgdatadir)/scripts', and defaults to > -'/usr/local/share/openvswitch/scripts'. An example after install might be:: > +'/usr/local/share/ovn/scripts'. ovn-ctl utility requires the 'ovs-lib' > +helper shell script which is present in '/usr/local/share/openvswitch/scripts'. > +So invoking ovn-ctl as "./ovn-ctl" will fail. > > - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts > +An example after install might be:: > + > + $ export PATH=$PATH:/usr/local/share/ovn/scripts > $ ovn-ctl start_northd > $ ovn-ctl start_controller > > @@ -331,7 +335,7 @@ Starting OVN Central services > OVN central services includes ovn-northd, Northbound and > Southbound ovsdb-server. > > - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts > + $ export PATH=$PATH:/usr/local/share/ovn/scripts > $ ovn-ctl start_northd > > Refer to ovn-ctl(8) for more information and the supported options. > @@ -341,23 +345,23 @@ Before starting ovn-northd you need to start OVN Northbound and Southbound > ovsdb-servers. Before ovsdb-servers can be started, > configure the Northbound and Southbound databases:: > > - $ mkdir -p /usr/local/etc/openvswitch > - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnnb_db.db \ > + $ mkdir -p /usr/local/etc/ovn > + $ ovsdb-tool create /usr/local/etc/ovn/ovnnb_db.db \ > ovn-nb.ovsschema > - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnsb_db.db \ > + $ ovsdb-tool create /usr/local/etc/ovn/ovnsb_db.db \ > ovn-sb.ovsschema > > Configure ovsdb-servers to use databases created above, to listen on a Unix > domain socket and to use the SSL configuration in the database:: > > - $ mkdir -p /usr/local/var/run/openvswitch > - $ ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/ovnnb_db.sock \ > + $ mkdir -p /usr/local/var/run/ovn > + $ ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnnb_db.sock \ > --remote=db:OVN_Northbound,NB_Global,connections \ > --private-key=db:OVN_Northbound,SSL,private_key \ > --certificate=db:OVN_Northbound,SSL,certificate \ > --bootstrap-ca-cert=db:OVN_Northbound,SSL,ca_cert \ > --pidfile --detach --log-file > - $ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/ovnsb_db.sock \ > + $ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnsb_db.sock \ > --remote=db:OVN_Southbound,SB_Global,connections \ > --private-key=db:OVN_Southbound,SSL,private_key \ > --certificate=db:OVN_Southbound,SSL,certificate \ > diff --git a/Makefile.am b/Makefile.am > index f886a8e63..6447e348b 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -177,6 +177,7 @@ SUFFIXES += .in > -e 's,[@]DBDIR[@],$(DBDIR),g' \ > -e 's,[@]PYTHON[@],$(PYTHON),g' \ > -e 's,[@]RUNDIR[@],$(RUNDIR),g' \ > + -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \ Same here. > -e 's,[@]VERSION[@],$(VERSION),g' \ > -e 's,[@]localstatedir[@],$(localstatedir),g' \ > -e 's,[@]pkgdatadir[@],$(pkgdatadir),g' \ > @@ -202,6 +203,7 @@ SUFFIXES += .xml > DBDIR='$(DBDIR)' \ > PYTHON='$(PYTHON)' \ > RUNDIR='$(RUNDIR)' \ > + OVN_RUNDIR='$(OVN_RUNDIR)' \ > VERSION='$(VERSION)' \ > localstatedir='$(localstatedir)' \ > pkgdatadir='$(pkgdatadir)' \ > @@ -502,6 +504,9 @@ ALL_LOCAL += ovn-sb.ovsschema.stamp > ovn-sb.ovsschema.stamp: ovn-sb.ovsschema > $(srcdir)/build-aux/cksum-schema-check $? $@ > > +pkgdata_DATA += ovn-nb.ovsschema > +pkgdata_DATA += ovn-sb.ovsschema > + > CLEANFILES += ovn-sb.ovsschema.stamp > > include Documentation/automake.mk > diff --git a/configure.ac b/configure.ac > index 8a32d3a18..c74b17a1d 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -123,6 +123,7 @@ AC_CHECK_HEADERS([net/if_mib.h], [], [], [[#include <sys/types.h> > > OVS_CHECK_PKIDIR > OVS_CHECK_RUNDIR > +OVN_CHECK_RUNDIR > OVS_CHECK_DBDIR > OVS_CHECK_BACKTRACE > OVS_CHECK_PERF_EVENT > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c > index 86f29accf..e27b56b2b 100644 > --- a/controller/ovn-controller.c > +++ b/controller/ovn-controller.c > @@ -1715,7 +1715,9 @@ main(int argc, char *argv[]) > > daemonize_start(false); > > - retval = unixctl_server_create(NULL, &unixctl); > + char *abs_unixctl_path = get_abs_unix_ctl_path(); > + retval = unixctl_server_create(abs_unixctl_path, &unixctl); > + free(abs_unixctl_path); > if (retval) { > exit(EXIT_FAILURE); > } > diff --git a/lib/.gitignore b/lib/.gitignore > index a80a1bce1..3eed4588b 100644 > --- a/lib/.gitignore > +++ b/lib/.gitignore > @@ -5,3 +5,4 @@ > /ovn-sb-idl.c > /ovn-sb-idl.h > /ovn-sb-idl.ovsidl > +/ovn-dirs.c > diff --git a/lib/automake.mk b/lib/automake.mk > index 8e7a1a937..2ee14a261 100644 > --- a/lib/automake.mk > +++ b/lib/automake.mk > @@ -9,6 +9,7 @@ lib_libovn_la_SOURCES = \ > lib/actions.c \ > lib/chassis-index.c \ > lib/chassis-index.h \ > + lib/ovn-dirs.h \ > lib/expr.c \ > lib/extend-table.h \ > lib/extend-table.c \ > @@ -24,17 +25,36 @@ lib_libovn_la_SOURCES = \ > lib/inc-proc-eng.c \ > lib/inc-proc-eng.h > nodist_lib_libovn_la_SOURCES = \ > + lib/ovn-dirs.c \ > lib/ovn-nb-idl.c \ > lib/ovn-nb-idl.h \ > lib/ovn-sb-idl.c \ > lib/ovn-sb-idl.h > > +CLEANFILES += $(nodist_lib_libovn_la_SOURCES) > + > # ovn-sb IDL > OVSIDL_BUILT += \ > lib/ovn-sb-idl.c \ > lib/ovn-sb-idl.h \ > lib/ovn-sb-idl.ovsidl > -EXTRA_DIST += lib/ovn-sb-idl.ann > +EXTRA_DIST += \ > + lib/ovn-sb-idl.ann \ > + lib/ovn-dirs.c.in > + > +lib/ovn-dirs.c: lib/ovn-dirs.c.in Makefile > + $(AM_V_GEN)($(ro_c) && sed < $(srcdir)/lib/ovn-dirs.c.in \ > + -e 's,[@]srcdir[@],$(srcdir),g' \ > + -e 's,[@]LOGDIR[@],"$(LOGDIR)",g' \ > + -e 's,[@]RUNDIR[@],"$(RUNDIR)",g' \ > + -e 's,[@]OVN_RUNDIR[@],"$(OVN_RUNDIR)",g' \ > + -e 's,[@]DBDIR[@],"$(DBDIR)",g' \ > + -e 's,[@]bindir[@],"$(bindir)",g' \ > + -e 's,[@]sysconfdir[@],"$(sysconfdir)",g' \ > + -e 's,[@]pkgdatadir[@],"$(pkgdatadir)",g') \ > + > lib/ovn-dirs.c.tmp && \ > + mv lib/ovn-dirs.c.tmp lib/ovn-dirs.c > + > OVN_SB_IDL_FILES = \ > $(srcdir)/ovn-sb.ovsschema \ > $(srcdir)/lib/ovn-sb-idl.ann > diff --git a/lib/ovn-dirs.c.in b/lib/ovn-dirs.c.in > new file mode 100644 > index 000000000..7ed1e3018 > --- /dev/null > +++ b/lib/ovn-dirs.c.in > @@ -0,0 +1,112 @@ > +#line 2 "@srcdir@/lib/dirs.c.in" > +/* > + * Copyright (c) 2019 > + * > + * 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 <config.h> > +#include "ovn-dirs.h" > +#include <stdlib.h> > +#include "lib/ovs-thread.h" > +#include "lib/util.h" > + > +struct directory { > + const char *value; /* Actual value; NULL if not yet determined. */ > + const char *default_value; /* Default value. */ > + const char *var_name; /* Environment variable to override default. */ > + struct ovsthread_once once; /* Ensures 'value' gets initialized once. */ > +}; > + > +static const char * > +get_dir(struct directory *d) > +{ > + if (ovsthread_once_start(&d->once)) { > + d->value = getenv(d->var_name); > + if (!d->value || !d->value[0]) { > + d->value = d->default_value; > + } > + ovsthread_once_done(&d->once); > + } > + return d->value; > +} > + > +const char * > +ovn_sysconfdir(void) > +{ > + static struct directory d = { > + NULL, @sysconfdir@, "OVN_SYSCONFDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_pkgdatadir(void) > +{ > + static struct directory d = { > + NULL, @pkgdatadir@, "OVN_PKGDATADIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_rundir(void) > +{ > + static struct directory d = { > + NULL, @OVN_RUNDIR@, "OVN_RUNDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_logdir(void) > +{ > + static struct directory d = { > + NULL, @LOGDIR@, "OVN_LOGDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_dbdir(void) > +{ > + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; > + static const char *dbdir; > + > + if (ovsthread_once_start(&once)) { > + dbdir = getenv("OVN_DBDIR"); > + if (!dbdir || !dbdir[0]) { > + char *sysconfdir = getenv("OVN_SYSCONFDIR"); > + > + dbdir = (sysconfdir > + ? xasprintf("%s/ovn", sysconfdir) > + : @DBDIR@); > + } > + ovsthread_once_done(&once); > + } > + return dbdir; > +} > + > +const char * > +ovn_bindir(void) > +{ > + static struct directory d = { > + NULL, @bindir@, "OVN_BINDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > diff --git a/lib/ovn-dirs.h b/lib/ovn-dirs.h > new file mode 100644 > index 000000000..22ff7a1ee > --- /dev/null > +++ b/lib/ovn-dirs.h > @@ -0,0 +1,35 @@ > +/* > + * Copyright (c) 2019. > + * > + * 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_DIRS_H > +#define OVN_DIRS_H 1 > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +const char *ovn_sysconfdir(void); /* /usr/local/etc */ > +const char *ovn_pkgdatadir(void); /* /usr/local/share/ovn */ > +const char *ovn_rundir(void); /* /usr/local/var/run/ovn */ > +const char *ovn_logdir(void); /* /usr/local/var/log/ovn */ > +const char *ovn_dbdir(void); /* /usr/local/etc/ovn */ > +const char *ovn_bindir(void); /* /usr/local/bin */ > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif /* OVN_DIRS_H */ > diff --git a/lib/ovn-util.c b/lib/ovn-util.c > index 085498fd1..b425f3f2d 100644 > --- a/lib/ovn-util.c > +++ b/lib/ovn-util.c > @@ -13,8 +13,10 @@ > */ > > #include <config.h> > +#include <unistd.h> > + > #include "ovn-util.h" > -#include "dirs.h" > +#include "ovn-dirs.h" > #include "openvswitch/vlog.h" > #include "ovn-nb-idl.h" > #include "ovn-sb-idl.h" > @@ -296,7 +298,7 @@ default_nb_db(void) > if (!def) { > def = getenv("OVN_NB_DB"); > if (!def) { > - def = xasprintf("unix:%s/ovnnb_db.sock", ovs_rundir()); > + def = xasprintf("unix:%s/ovnnb_db.sock", ovn_rundir()); > } > } > return def; > @@ -309,12 +311,28 @@ default_sb_db(void) > if (!def) { > def = getenv("OVN_SB_DB"); > if (!def) { > - def = xasprintf("unix:%s/ovnsb_db.sock", ovs_rundir()); > + def = xasprintf("unix:%s/ovnsb_db.sock", ovn_rundir()); > } > } > return def; > } > > +char * > +get_abs_unix_ctl_path(void) > +{ > +#ifdef _WIN32 > + enum { WINDOWS = 1 }; > +#else > + enum { WINDOWS = 0 }; > +#endif > + > + long int pid = getpid(); > + char *abs_path = > + WINDOWS ? xasprintf("%s/%s.ctl", ovn_rundir(), program_name) > + : xasprintf("%s/%s.%ld.ctl", ovn_rundir(), program_name, pid); > + return abs_path; > +} > + > /* l3gateway, chassisredirect, and patch > * are not in this list since they are > * only set in the SB DB by northd > diff --git a/lib/ovn-util.h b/lib/ovn-util.h > index 6d5e1dfb5..fcd93cd82 100644 > --- a/lib/ovn-util.h > +++ b/lib/ovn-util.h > @@ -67,6 +67,7 @@ char *alloc_nat_zone_key(const struct uuid *key, const char *type); > > const char *default_nb_db(void); > const char *default_sb_db(void); > +char *get_abs_unix_ctl_path(void); > > struct ovsdb_idl_table_class; > const char *db_table_usage(struct ds *tables, > diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4 > index b599f17d7..964512795 100644 > --- a/m4/openvswitch.m4 > +++ b/m4/openvswitch.m4 > @@ -330,6 +330,17 @@ AC_DEFUN([OVS_CHECK_RUNDIR], > [RUNDIR='${localstatedir}/run/openvswitch']) > AC_SUBST([RUNDIR])]) > > +dnl Checks for the directory in which to store pidfiles. > +AC_DEFUN([OVN_CHECK_RUNDIR], > + [AC_ARG_WITH( > + [rundir], > + AC_HELP_STRING([--with-ovn-rundir=DIR], > + [directory used for pidfiles > + [[LOCALSTATEDIR/run/ovn]]]), > + [OVN_RUNDIR=$withval], > + [OVN_RUNDIR='${localstatedir}/run/ovn']) > + AC_SUBST([OVN_RUNDIR])]) > + It feels odd to me that we have --with-rundir and --with-ovn-rundir as configure options. It seems more natural to have --with-rundir (set the OVN runtime directory) and --with-ovs-rundir (inform the build where the OVS runtime directory is). To me, --with-rundir sounds like an option to configure the rundir for the project that is being built, not the rundir for a different project. > dnl Checks for the directory in which to store logs. > AC_DEFUN([OVS_CHECK_LOGDIR], > [AC_ARG_WITH( > diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c > index e86134414..b527f2172 100644 > --- a/northd/ovn-northd.c > +++ b/northd/ovn-northd.c > @@ -9351,7 +9351,14 @@ main(int argc, char *argv[]) > > daemonize_start(false); > > - retval = unixctl_server_create(unixctl_path, &unixctl); > + if (!unixctl_path) { > + char *abs_unixctl_path = get_abs_unix_ctl_path(); > + retval = unixctl_server_create(abs_unixctl_path, &unixctl); > + free(abs_unixctl_path); > + } else { > + retval = unixctl_server_create(unixctl_path, &unixctl); > + } > + > if (retval) { > exit(EXIT_FAILURE); > } > diff --git a/tests/ovs-macros.at b/tests/ovs-macros.at > index 10593429d..b2e619f76 100644 > --- a/tests/ovs-macros.at > +++ b/tests/ovs-macros.at > @@ -49,6 +49,7 @@ ovs_setenv() { > sandbox=$1 > ovs_dir=$ovs_base${1:+/$1} > OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR > + OVN_RUNDIR=$ovs_dir; export OVN_RUNDIR > OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR > OVS_DBDIR=$ovs_dir; export OVS_DBDIR > OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR > diff --git a/tutorial/ovs-sandbox b/tutorial/ovs-sandbox > index 47032b499..7546d27ca 100755 > --- a/tutorial/ovs-sandbox > +++ b/tutorial/ovs-sandbox > @@ -360,6 +360,7 @@ sandbox=`cd sandbox && pwd` > > # Set up environment for OVS programs to sandbox themselves. > OVS_RUNDIR=$sandbox; export OVS_RUNDIR > +OVN_RUNDIR=$sandbox; export OVN_RUNDIR > OVS_LOGDIR=$sandbox; export OVS_LOGDIR > OVS_DBDIR=$sandbox; export OVS_DBDIR > OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR > diff --git a/utilities/automake.mk b/utilities/automake.mk > index d666b9661..db0b0e051 100644 > --- a/utilities/automake.mk > +++ b/utilities/automake.mk > @@ -1,6 +1,7 @@ > scripts_SCRIPTS += \ > utilities/ovn-ctl \ > utilities/ovndb-servers.ocf > +scripts_DATA += utilities/ovn-lib > > man_MANS += \ > utilities/ovn-ctl.8 \ > @@ -21,6 +22,7 @@ bin_SCRIPTS += \ > > EXTRA_DIST += \ > utilities/ovn-ctl \ > + utilities/ovn-lib.in \ > utilities/ovn-ctl.8.xml \ > utilities/ovn-docker-overlay-driver.in \ > utilities/ovn-docker-underlay-driver.in \ > @@ -31,6 +33,7 @@ EXTRA_DIST += \ > > CLEANFILES += \ > utilities/ovn-ctl.8 \ > + utilities/ovn-lib \ > utilities/ovn-docker-overlay-driver \ > utilities/ovn-docker-underlay-driver \ > utilities/ovn-nbctl.8 \ > @@ -39,6 +42,8 @@ CLEANFILES += \ > utilities/ovn-detrace.1 \ > utilities/ovn-detrace > > +utilities/ovn-lib: $(top_builddir)/config.status > + > # ovn-nbctl > bin_PROGRAMS += utilities/ovn-nbctl > utilities_ovn_nbctl_SOURCES = utilities/ovn-nbctl.c > diff --git a/utilities/ovn-ctl b/utilities/ovn-ctl > index 7e5cd469c..a973b09a2 100755 > --- a/utilities/ovn-ctl > +++ b/utilities/ovn-ctl > @@ -13,12 +13,16 @@ > # limitations under the License. > > case $0 in > - */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;; > + */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` > + ovsdir=`echo "$dir0" | sed 's,/ovn/scripts,,'` > + ovsdir=$ovsdir/openvswitch/scripts > + ;; > *) dir0=./ ;; > esac > -. "$dir0/ovs-lib" || exit 1 > +. "$dir0/ovn-lib" || exit 1 > +. "$ovsdir/ovs-lib" || exit 1 > > -for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do > +for dir in "$sbindir" "$ovn_bindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do > case :$PATH: in > *:$dir:*) ;; > *) PATH=$PATH:$dir ;; > @@ -26,9 +30,9 @@ for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do > done > > > -ovnnb_active_conf_file="$etcdir/ovnnb-active.conf" > -ovnsb_active_conf_file="$etcdir/ovnsb-active.conf" > -ovn_northd_db_conf_file="$etcdir/ovn-northd-db-params.conf" > +ovnnb_active_conf_file="$ovn_etcdir/ovnnb-active.conf" > +ovnsb_active_conf_file="$ovn_etcdir/ovnsb-active.conf" > +ovn_northd_db_conf_file="$ovn_etcdir/ovn-northd-db-params.conf" > ## ----- ## > ## start ## > ## ----- ## > @@ -110,6 +114,7 @@ start_ovsdb__() { > local logfile > local log > local sock > + local ctrl_sock > local detach > local create_insecure_remote > local port > @@ -134,6 +139,7 @@ start_ovsdb__() { > eval logfile=\$OVN_${DB}_LOGFILE > eval log=\$OVN_${DB}_LOG > eval sock=\$DB_${DB}_SOCK > + eval ctrl_sock=\$DB_${DB}_CTRL_SOCK > eval detach=\$DB_${DB}_DETACH > eval create_insecure_remote=\$DB_${DB}_CREATE_INSECURE_REMOTE > eval port=\$DB_${DB}_PORT > @@ -144,7 +150,10 @@ start_ovsdb__() { > eval ovn_db_ssl_cert=\$OVN_${DB}_DB_SSL_CERT > eval ovn_db_ssl_cacert=\$OVN_${DB}_DB_SSL_CA_CERT > > - install_dir "$OVN_RUNDIR" > + ovn_install_dir "$OVN_RUNDIR" > + ovn_install_dir "$ovn_logdir" > + ovn_install_dir "$ovn_dbdir" > + > # Check and eventually start ovsdb-server for DB > if pidfile_is_running $db_pid_file; then > return > @@ -177,7 +186,7 @@ $cluster_remote_port > set ovsdb-server > set "$@" $log --log-file=$logfile > set "$@" --remote=punix:$sock --pidfile=$db_pid_file > - set "$@" --unixctl=ovn${db}_db.ctl > + set "$@" --unixctl=$ctrl_sock > > [ "$OVS_USER" != "" ] && set "$@" --user "$OVS_USER" > > @@ -328,7 +337,7 @@ start_northd () { > > set "$@" $OVN_NORTHD_LOG $ovn_northd_params > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" > fi > } > > @@ -350,7 +359,7 @@ start_controller () { > > [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > } > > start_controller_vtep () { > @@ -377,7 +386,7 @@ start_controller_vtep () { > > [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > } > > ## ---- ## > @@ -385,7 +394,7 @@ start_controller_vtep () { > ## ---- ## > > stop_northd () { > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-northd > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-northd > > if [ ! -e $ovn_northd_db_conf_file ]; then > if test X"$OVN_MANAGE_OVSDB" = Xyes; then > @@ -395,11 +404,11 @@ stop_northd () { > } > > stop_controller () { > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller "$@" > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller "$@" > } > > stop_controller_vtep () { > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller-vtep > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller-vtep > } > > ## ------- ## > @@ -444,11 +453,12 @@ set_defaults () { > OVN_MANAGE_OVSDB=yes > > OVS_RUNDIR=${OVS_RUNDIR:-${rundir}} > - OVN_RUNDIR=${OVN_RUNDIR:-${OVS_RUNDIR}} > + OVN_RUNDIR=${OVN_RUNDIR:-${ovn_rundir}} > > DB_NB_SOCK=$OVN_RUNDIR/ovnnb_db.sock > DB_NB_PID=$OVN_RUNDIR/ovnnb_db.pid > - DB_NB_FILE=$dbdir/ovnnb_db.db > + DB_NB_CTRL_SOCK=$OVN_RUNDIR/ovnnb_db.ctl > + DB_NB_FILE=$ovn_dbdir/ovnnb_db.db > DB_NB_ADDR=0.0.0.0 > DB_NB_PORT=6641 > DB_NB_SYNC_FROM_PROTO=tcp > @@ -457,17 +467,18 @@ set_defaults () { > > DB_SB_SOCK=$OVN_RUNDIR/ovnsb_db.sock > DB_SB_PID=$OVN_RUNDIR/ovnsb_db.pid > - DB_SB_FILE=$dbdir/ovnsb_db.db > + DB_SB_CTRL_SOCK=$OVN_RUNDIR/ovnsb_db.ctl > + DB_SB_FILE=$ovn_dbdir/ovnsb_db.db > DB_SB_ADDR=0.0.0.0 > DB_SB_PORT=6642 > DB_SB_SYNC_FROM_PROTO=tcp > DB_SB_SYNC_FROM_ADDR= > DB_SB_SYNC_FROM_PORT=6642 > > - DB_NB_SCHEMA=$datadir/ovn-nb.ovsschema > - DB_SB_SCHEMA=$datadir/ovn-sb.ovsschema > + DB_NB_SCHEMA=$ovn_datadir/ovn-nb.ovsschema > + DB_SB_SCHEMA=$ovn_datadir/ovn-sb.ovsschema > > - DB_SOCK=$OVN_RUNDIR/db.sock > + DB_SOCK=$OVS_RUNDIR/db.sock > DB_CONF_FILE=$dbdir/conf.db > > OVN_NORTHD_PRIORITY=-10 > @@ -483,8 +494,8 @@ set_defaults () { > OVN_NORTHD_LOGFILE="" > OVN_NB_LOG="-vconsole:off -vfile:info" > OVN_SB_LOG="-vconsole:off -vfile:info" > - OVN_NB_LOGFILE="$logdir/ovsdb-server-nb.log" > - OVN_SB_LOGFILE="$logdir/ovsdb-server-sb.log" > + OVN_NB_LOGFILE="$ovn_logdir/ovsdb-server-nb.log" > + OVN_SB_LOGFILE="$ovn_logdir/ovsdb-server-sb.log" > > OVN_CONTROLLER_SSL_KEY="" > OVN_CONTROLLER_SSL_CERT="" > @@ -662,14 +673,14 @@ File location options: > --db-sb-use-remote-in-db=yes|no OVN_Southbound db listen on target connection table (default: $DB_SB_USE_REMOTE_IN_DB) > > Default directories with "configure" option and environment variable override: > - logs: /usr/local/var/log/openvswitch (--with-logdir, OVS_LOGDIR) > - pidfiles and sockets: /usr/local/var/run/openvswitch (--with-rundir, OVS_RUNDIR) > - ovn-nb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) > - ovn-sb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) > - system configuration: /usr/local/etc (--sysconfdir, OVS_SYSCONFDIR) > - data files: /usr/local/share/openvswitch (--pkgdatadir, OVS_PKGDATADIR) > - user binaries: /usr/local/bin (--bindir, OVS_BINDIR) > - system binaries: /usr/local/sbin (--sbindir, OVS_SBINDIR) > + logs: /usr/local/var/log/ovn (--with-logdir, OVN_LOGDIR) > + pidfiles and sockets: /usr/local/var/run/ovn (--with-rundir, OVN_RUNDIR) > + ovn-nb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) > + ovn-sb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) > + system configuration: /usr/local/etc (--sysconfdir, OVN_SYSCONFDIR) > + data files: /usr/local/share/ovn (--pkgdatadir, OVN_PKGDATADIR) > + user binaries: /usr/local/bin (--bindir, OVN_BINDIR) > + system binaries: /usr/local/sbin (--sbindir, OVN_SBINDIR) > EOF > } > > diff --git a/utilities/ovn-ctl.8.xml b/utilities/ovn-ctl.8.xml > index c5294d794..f70bd6f0f 100644 > --- a/utilities/ovn-ctl.8.xml > +++ b/utilities/ovn-ctl.8.xml > @@ -203,12 +203,12 @@ > <h3>Starting standalone ovn db server passing SSL certificates</h3> > <p> > <code> > - # ovn-ctl --ovn-nb-db-ssl-key=/etc/openvswitch/ovnnb-privkey.pem > - --ovn-nb-db-ssl-cert=/etc/openvswitch/ovnnb-cert.pem > - --ovn-nb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem > - --ovn-sb-db-ssl-key=/etc/openvswitch/ovnsb-privkey.pem > - --ovn-sb-db-ssl-cert=/etc/openvswitch/ovnsb-cert.pem > - --ovn-sb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem > + # ovn-ctl --ovn-nb-db-ssl-key=/etc/ovn/ovnnb-privkey.pem > + --ovn-nb-db-ssl-cert=/etc/ovn/ovnnb-cert.pem > + --ovn-nb-db-ssl-ca-cert=/etc/ovn/cacert.pem > + --ovn-sb-db-ssl-key=/etc/ovn/ovnsb-privkey.pem > + --ovn-sb-db-ssl-cert=/etc/ovn/ovnsb-cert.pem > + --ovn-sb-db-ssl-ca-cert=/etc/ovn/cacert.pem > start_northd > </code> > </p> > diff --git a/utilities/ovn-lib.in b/utilities/ovn-lib.in > new file mode 100644 > index 000000000..50111a76b > --- /dev/null > +++ b/utilities/ovn-lib.in > @@ -0,0 +1,204 @@ > +# -*- sh -*- > +# vi:syntax=sh > +# This is a shell function library sourced by some OVN scripts. > +# It is not intended to be invoked on its own. > +# The code copied from ovs/utilities/ovs-lib.in > + > +# > +# 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. > + > +## ----------------- ## > +## configure options ## > +## ----------------- ## > + > +# All of these should be substituted by the Makefile at build time. > +ovn_logdir=${OVN_LOGDIR-'@LOGDIR@'} # /var/log/ovn > +ovn_rundir=${OVN_RUNDIR-'@OVN_RUNDIR@'} # /var/run/ovn > +ovn_sysconfdir=${OVN_SYSCONFDIR-'@sysconfdir@'} # /etc > +ovn_etcdir=$sysconfdir/ovn # /etc/ovn > +ovn_datadir=${OVN_PKGDATADIR-'@pkgdatadir@'} # /usr/share/ovn > +ovn_bindir=${OVN_BINDIR-'@bindir@'} # /usr/bin > +ovn_sbindir=${OVN_SBINDIR-'@sbindir@'} # /usr/sbin > + > +# /etc/ovn or /var/lib/ovn > +if test X"$OVN_DBDIR" != X; then > + ovn_dbdir=$OVN_DBDIR > +elif test X"$OVN_SYSCONFDIR" != X; then > + ovn_dbdir=$OVN_SYSCONFDIR/ovn > +else > + ovn_dbdir='@DBDIR@' > +fi > + > +VERSION='@VERSION@' > + > +DAEMON_CWD=/ > + > +LC_ALL=C; export LC_ALL > + > +ovn_install_dir () { > + DIR="$1" > + INSTALL_MODE="${2:-755}" > + INSTALL_USER="root" > + INSTALL_GROUP="root" > + [ "$OVN_USER" != "" ] && INSTALL_USER="${OVN_USER%:*}" > + [ "${OVN_USER##*:}" != "" ] && INSTALL_GROUP="${OVN_USER##*:}" > + > + if test ! -d "$DIR"; then > + install -d -m "$INSTALL_MODE" -o "$INSTALL_USER" -g "$INSTALL_GROUP" "$DIR" > + restorecon "$DIR" >/dev/null 2>&1 > + fi > +} > + > +start_ovn_daemon () { > + priority=$1 > + wrapper=$2 > + shift; shift > + daemon=$1 > + strace="" > + > + # drop core files in a sensible place > + ovn_install_dir "$DAEMON_CWD" > + set "$@" --no-chdir > + cd "$DAEMON_CWD" > + > + # log file > + ovn_install_dir "$ovn_logdir" "750" > + set "$@" --log-file="$ovn_logdir/$daemon.log" > + > + # pidfile and monitoring > + ovn_install_dir "$ovn_rundir" > + set "$@" --pidfile="$ovn_rundir/$daemon.pid" > + set "$@" --detach > + test X"$MONITOR" = Xno || set "$@" --monitor > + > + # wrapper > + case $wrapper in > + valgrind) > + if (valgrind --version) > /dev/null 2>&1; then > + set valgrind -q --leak-check=full --time-stamp=yes \ > + --log-file="$ovn_logdir/$daemon.valgrind.log.%p" "$@" > + else > + log_failure_msg "valgrind not installed, running $daemon without it" > + fi > + ;; > + strace) > + if (strace -V) > /dev/null 2>&1; then > + strace="strace -tt -T -s 256 -ff" > + if (strace -DV) > /dev/null 2>&1; then > + # Has the -D option. > + set $strace -D -o "$ovn_logdir/$daemon.strace.log" "$@" > + strace="" > + fi > + else > + log_failure_msg "strace not installed, running $daemon without it" > + fi > + ;; > + glibc) > + set env MALLOC_CHECK_=2 MALLOC_PERTURB_=165 "$@" > + ;; > + '') > + ;; > + *) > + log_failure_msg "unknown wrapper $wrapper, running $daemon without it" > + ;; > + esac > + > + # priority > + if test X"$priority" != X; then > + set nice -n "$priority" "$@" > + fi > + > + action "Starting $daemon" "$@" || return 1 > + > + if test X"$strace" != X; then > + # Strace doesn't have the -D option so we attach after the fact. > + setsid $strace -o "$ovn_logdir/$daemon.strace.log" \ > + -p `cat $ovn_rundir/$daemon.pid` > /dev/null 2>&1 & > + fi > +} > + > +stop_ovn_daemon () { > + if test -e "$ovn_rundir/$1.pid"; then > + if pid=`cat "$ovn_rundir/$1.pid"`; then > + if pid_exists "$pid" >/dev/null 2>&1; then :; else > + rm -f $ovn_rundir/$1.$pid.ctl $ovn_rundir/$1.$pid > + return 0 > + fi > + > + graceful="EXIT .1 .25 .65 1" > + actions="TERM .1 .25 .65 1 1 1 1 \ > + KILL 1 1 1 2 10 15 30 \ > + FAIL" > + version=`ovs-appctl -T 1 -t $ovn_rundir/$1.$pid.ctl version \ > + | awk 'NR==1{print $NF}'` > + > + # Use `ovs-appctl exit` only if the running daemon version > + # is >= 2.5.90. This script might be used during upgrade to > + # stop older versions of daemons which do not behave correctly > + # with `ovs-appctl exit` (e.g. ovs-vswitchd <= 2.5.0 deletes > + # internal ports). > + if version_geq "$version" "2.5.90"; then > + actions="$graceful $actions" > + fi > + for action in $actions; do > + if pid_exists "$pid" >/dev/null 2>&1; then :; else > + return 0 > + fi > + case $action in > + EXIT) > + action "Exiting $1 ($pid)" \ > + ${bindir}/ovs-appctl -T 1 -t $ovn_rundir/$1.$pid.ctl exit $2 > + ;; > + TERM) > + action "Killing $1 ($pid)" kill $pid > + ;; > + KILL) > + action "Killing $1 ($pid) with SIGKILL" kill -9 $pid > + ;; > + FAIL) > + log_failure_msg "Killing $1 ($pid) failed" > + return 1 > + ;; > + *) > + sleep $action > + ;; > + esac > + done > + fi > + fi > + log_success_msg "$1 is not running" > +} > + > +ovn_daemon_status () { > + pidfile=$ovn_rundir/$1.pid > + if test -e "$pidfile"; then > + if pid=`cat "$pidfile"`; then > + if pid_exists "$pid"; then > + echo "$1 is running with pid $pid" > + return 0 > + else > + echo "Pidfile for $1 ($pidfile) is stale" > + fi > + else > + echo "Pidfile for $1 ($pidfile) exists but cannot be read" > + fi > + else > + echo "$1 is not running" > + fi > + return 1 > +} > + > +daemon_is_running () { > + pidfile=$ovn_rundir/$1.pid > + test -e "$pidfile" && pid=`cat "$pidfile"` && pid_exists "$pid" && pid_comm_check $1 $pid > +} >/dev/null 2>&1 >
On Tue, Aug 13, 2019 at 6:28 PM <nusiddiq@redhat.com> wrote: > > From: Numan Siddique <nusiddiq@redhat.com> > > Until now, OVN uses the openvswitch rundirs (rundir, logdir, etcdir). > The commit [1] changed the package name from openvswitch to ovn, but > it didn't take into the account the effects of it. When "make install" > is run ovn-ctl utility is copied to /usr/local/share/ovn/scripts folder. > ovn-ctl depends on 'ovs-lib' and it is not present in this scripts foler. > Because of which we cannot start OVN services using ovn-ctl. > > This patch addresses all these issues. It changes the rundir to > ovn specific ones. (i.e /usr/local/var/run/ovn, /usr/local/var/log/ovn, > /usr/local/etc/ovn with default configuration). > > [1] - 7795e0e28dce("Change the package name from openvswitch to ovn in AC_INIT()") > > Tested:by: Dumitru Ceara <dceara@redhat.com> > Signed-off-by: Numan Siddique <nusiddiq@redhat.com> > --- > Documentation/intro/install/general.rst | 30 ++-- > Makefile.am | 5 + > configure.ac | 1 + > controller/ovn-controller.c | 4 +- > lib/.gitignore | 1 + > lib/automake.mk | 22 ++- > lib/ovn-dirs.c.in | 112 +++++++++++++ > lib/ovn-dirs.h | 35 ++++ > lib/ovn-util.c | 24 ++- > lib/ovn-util.h | 1 + > m4/openvswitch.m4 | 11 ++ > northd/ovn-northd.c | 9 +- > tests/ovs-macros.at | 1 + > tutorial/ovs-sandbox | 1 + > utilities/automake.mk | 5 + > utilities/ovn-ctl | 71 +++++---- > utilities/ovn-ctl.8.xml | 12 +- > utilities/ovn-lib.in | 204 ++++++++++++++++++++++++ > 18 files changed, 494 insertions(+), 55 deletions(-) > create mode 100644 lib/ovn-dirs.c.in > create mode 100644 lib/ovn-dirs.h > create mode 100644 utilities/ovn-lib.in > > diff --git a/Documentation/intro/install/general.rst b/Documentation/intro/install/general.rst > index 99d8fec04..4cc9c4c3a 100644 > --- a/Documentation/intro/install/general.rst > +++ b/Documentation/intro/install/general.rst > @@ -153,17 +153,17 @@ invoke configure without any arguments. For example:: > > $ ./configure > > -By default all files are installed under ``/usr/local``. OVN and Open vSwitch > -also expects to find its database in ``/usr/local/etc/openvswitch`` by default. > +By default all files are installed under ``/usr/local``. OVN expects to find > +its database in ``/usr/local/etc/ovn`` by default. > If you want to install all files into, e.g., ``/usr`` and ``/var`` instead of > -``/usr/local`` and ``/usr/local/var`` and expect to use ``/etc/openvswitch`` as > +``/usr/local`` and ``/usr/local/var`` and expect to use ``/etc/ovn`` as > the default database directory, add options as shown here:: > > $ ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc > > .. note:: > > - Open vSwitch and OVN installed with packages like .rpm (e.g. via > + OVN installed with packages like .rpm (e.g. via > ``yum install`` or ``rpm -ivh``) and .deb (e.g. via > ``apt-get install`` or ``dpkg -i``) use the above configure options. > > @@ -319,9 +319,13 @@ and stopping ovn-northd, ovn-controller and ovsdb-servers. After installation, > the daemons can be started by using the ovn-ctl utility. This will take care > to setup initial conditions, and start the daemons in the correct order. > The ovn-ctl utility is located in '$(pkgdatadir)/scripts', and defaults to > -'/usr/local/share/openvswitch/scripts'. An example after install might be:: > +'/usr/local/share/ovn/scripts'. ovn-ctl utility requires the 'ovs-lib' > +helper shell script which is present in '/usr/local/share/openvswitch/scripts'. > +So invoking ovn-ctl as "./ovn-ctl" will fail. > > - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts > +An example after install might be:: > + > + $ export PATH=$PATH:/usr/local/share/ovn/scripts > $ ovn-ctl start_northd > $ ovn-ctl start_controller > > @@ -331,7 +335,7 @@ Starting OVN Central services > OVN central services includes ovn-northd, Northbound and > Southbound ovsdb-server. > > - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts > + $ export PATH=$PATH:/usr/local/share/ovn/scripts > $ ovn-ctl start_northd > > Refer to ovn-ctl(8) for more information and the supported options. > @@ -341,23 +345,23 @@ Before starting ovn-northd you need to start OVN Northbound and Southbound > ovsdb-servers. Before ovsdb-servers can be started, > configure the Northbound and Southbound databases:: > > - $ mkdir -p /usr/local/etc/openvswitch > - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnnb_db.db \ > + $ mkdir -p /usr/local/etc/ovn > + $ ovsdb-tool create /usr/local/etc/ovn/ovnnb_db.db \ > ovn-nb.ovsschema > - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnsb_db.db \ > + $ ovsdb-tool create /usr/local/etc/ovn/ovnsb_db.db \ > ovn-sb.ovsschema > > Configure ovsdb-servers to use databases created above, to listen on a Unix > domain socket and to use the SSL configuration in the database:: > > - $ mkdir -p /usr/local/var/run/openvswitch > - $ ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/ovnnb_db.sock \ > + $ mkdir -p /usr/local/var/run/ovn > + $ ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnnb_db.sock \ > --remote=db:OVN_Northbound,NB_Global,connections \ > --private-key=db:OVN_Northbound,SSL,private_key \ > --certificate=db:OVN_Northbound,SSL,certificate \ > --bootstrap-ca-cert=db:OVN_Northbound,SSL,ca_cert \ > --pidfile --detach --log-file > - $ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/ovnsb_db.sock \ > + $ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnsb_db.sock \ > --remote=db:OVN_Southbound,SB_Global,connections \ > --private-key=db:OVN_Southbound,SSL,private_key \ > --certificate=db:OVN_Southbound,SSL,certificate \ > diff --git a/Makefile.am b/Makefile.am > index f886a8e63..6447e348b 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -177,6 +177,7 @@ SUFFIXES += .in > -e 's,[@]DBDIR[@],$(DBDIR),g' \ > -e 's,[@]PYTHON[@],$(PYTHON),g' \ > -e 's,[@]RUNDIR[@],$(RUNDIR),g' \ > + -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \ > -e 's,[@]VERSION[@],$(VERSION),g' \ > -e 's,[@]localstatedir[@],$(localstatedir),g' \ > -e 's,[@]pkgdatadir[@],$(pkgdatadir),g' \ > @@ -202,6 +203,7 @@ SUFFIXES += .xml > DBDIR='$(DBDIR)' \ > PYTHON='$(PYTHON)' \ > RUNDIR='$(RUNDIR)' \ > + OVN_RUNDIR='$(OVN_RUNDIR)' \ > VERSION='$(VERSION)' \ > localstatedir='$(localstatedir)' \ > pkgdatadir='$(pkgdatadir)' \ > @@ -502,6 +504,9 @@ ALL_LOCAL += ovn-sb.ovsschema.stamp > ovn-sb.ovsschema.stamp: ovn-sb.ovsschema > $(srcdir)/build-aux/cksum-schema-check $? $@ > > +pkgdata_DATA += ovn-nb.ovsschema > +pkgdata_DATA += ovn-sb.ovsschema > + > CLEANFILES += ovn-sb.ovsschema.stamp > > include Documentation/automake.mk > diff --git a/configure.ac b/configure.ac > index 8a32d3a18..c74b17a1d 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -123,6 +123,7 @@ AC_CHECK_HEADERS([net/if_mib.h], [], [], [[#include <sys/types.h> > > OVS_CHECK_PKIDIR > OVS_CHECK_RUNDIR > +OVN_CHECK_RUNDIR > OVS_CHECK_DBDIR > OVS_CHECK_BACKTRACE > OVS_CHECK_PERF_EVENT > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c > index 86f29accf..e27b56b2b 100644 > --- a/controller/ovn-controller.c > +++ b/controller/ovn-controller.c > @@ -1715,7 +1715,9 @@ main(int argc, char *argv[]) > > daemonize_start(false); > > - retval = unixctl_server_create(NULL, &unixctl); > + char *abs_unixctl_path = get_abs_unix_ctl_path(); > + retval = unixctl_server_create(abs_unixctl_path, &unixctl); > + free(abs_unixctl_path); > if (retval) { > exit(EXIT_FAILURE); > } > diff --git a/lib/.gitignore b/lib/.gitignore > index a80a1bce1..3eed4588b 100644 > --- a/lib/.gitignore > +++ b/lib/.gitignore > @@ -5,3 +5,4 @@ > /ovn-sb-idl.c > /ovn-sb-idl.h > /ovn-sb-idl.ovsidl > +/ovn-dirs.c > diff --git a/lib/automake.mk b/lib/automake.mk > index 8e7a1a937..2ee14a261 100644 > --- a/lib/automake.mk > +++ b/lib/automake.mk > @@ -9,6 +9,7 @@ lib_libovn_la_SOURCES = \ > lib/actions.c \ > lib/chassis-index.c \ > lib/chassis-index.h \ > + lib/ovn-dirs.h \ > lib/expr.c \ > lib/extend-table.h \ > lib/extend-table.c \ > @@ -24,17 +25,36 @@ lib_libovn_la_SOURCES = \ > lib/inc-proc-eng.c \ > lib/inc-proc-eng.h > nodist_lib_libovn_la_SOURCES = \ > + lib/ovn-dirs.c \ > lib/ovn-nb-idl.c \ > lib/ovn-nb-idl.h \ > lib/ovn-sb-idl.c \ > lib/ovn-sb-idl.h > > +CLEANFILES += $(nodist_lib_libovn_la_SOURCES) > + > # ovn-sb IDL > OVSIDL_BUILT += \ > lib/ovn-sb-idl.c \ > lib/ovn-sb-idl.h \ > lib/ovn-sb-idl.ovsidl > -EXTRA_DIST += lib/ovn-sb-idl.ann > +EXTRA_DIST += \ > + lib/ovn-sb-idl.ann \ > + lib/ovn-dirs.c.in > + > +lib/ovn-dirs.c: lib/ovn-dirs.c.in Makefile > + $(AM_V_GEN)($(ro_c) && sed < $(srcdir)/lib/ovn-dirs.c.in \ > + -e 's,[@]srcdir[@],$(srcdir),g' \ > + -e 's,[@]LOGDIR[@],"$(LOGDIR)",g' \ > + -e 's,[@]RUNDIR[@],"$(RUNDIR)",g' \ > + -e 's,[@]OVN_RUNDIR[@],"$(OVN_RUNDIR)",g' \ > + -e 's,[@]DBDIR[@],"$(DBDIR)",g' \ > + -e 's,[@]bindir[@],"$(bindir)",g' \ > + -e 's,[@]sysconfdir[@],"$(sysconfdir)",g' \ > + -e 's,[@]pkgdatadir[@],"$(pkgdatadir)",g') \ > + > lib/ovn-dirs.c.tmp && \ > + mv lib/ovn-dirs.c.tmp lib/ovn-dirs.c > + > OVN_SB_IDL_FILES = \ > $(srcdir)/ovn-sb.ovsschema \ > $(srcdir)/lib/ovn-sb-idl.ann > diff --git a/lib/ovn-dirs.c.in b/lib/ovn-dirs.c.in > new file mode 100644 > index 000000000..7ed1e3018 > --- /dev/null > +++ b/lib/ovn-dirs.c.in > @@ -0,0 +1,112 @@ > +#line 2 "@srcdir@/lib/dirs.c.in" > +/* > + * Copyright (c) 2019 > + * > + * 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 <config.h> > +#include "ovn-dirs.h" > +#include <stdlib.h> > +#include "lib/ovs-thread.h" > +#include "lib/util.h" > + > +struct directory { > + const char *value; /* Actual value; NULL if not yet determined. */ > + const char *default_value; /* Default value. */ > + const char *var_name; /* Environment variable to override default. */ > + struct ovsthread_once once; /* Ensures 'value' gets initialized once. */ > +}; > + > +static const char * > +get_dir(struct directory *d) > +{ > + if (ovsthread_once_start(&d->once)) { > + d->value = getenv(d->var_name); > + if (!d->value || !d->value[0]) { > + d->value = d->default_value; > + } > + ovsthread_once_done(&d->once); > + } > + return d->value; > +} > + > +const char * > +ovn_sysconfdir(void) > +{ > + static struct directory d = { > + NULL, @sysconfdir@, "OVN_SYSCONFDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_pkgdatadir(void) > +{ > + static struct directory d = { > + NULL, @pkgdatadir@, "OVN_PKGDATADIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_rundir(void) > +{ > + static struct directory d = { > + NULL, @OVN_RUNDIR@, "OVN_RUNDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_logdir(void) > +{ > + static struct directory d = { > + NULL, @LOGDIR@, "OVN_LOGDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > + > +const char * > +ovn_dbdir(void) > +{ > + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; > + static const char *dbdir; > + > + if (ovsthread_once_start(&once)) { > + dbdir = getenv("OVN_DBDIR"); > + if (!dbdir || !dbdir[0]) { > + char *sysconfdir = getenv("OVN_SYSCONFDIR"); > + > + dbdir = (sysconfdir > + ? xasprintf("%s/ovn", sysconfdir) > + : @DBDIR@); > + } > + ovsthread_once_done(&once); > + } > + return dbdir; > +} > + > +const char * > +ovn_bindir(void) > +{ > + static struct directory d = { > + NULL, @bindir@, "OVN_BINDIR", OVSTHREAD_ONCE_INITIALIZER > + }; > + > + return get_dir(&d); > +} > diff --git a/lib/ovn-dirs.h b/lib/ovn-dirs.h > new file mode 100644 > index 000000000..22ff7a1ee > --- /dev/null > +++ b/lib/ovn-dirs.h > @@ -0,0 +1,35 @@ > +/* > + * Copyright (c) 2019. > + * > + * 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_DIRS_H > +#define OVN_DIRS_H 1 > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +const char *ovn_sysconfdir(void); /* /usr/local/etc */ > +const char *ovn_pkgdatadir(void); /* /usr/local/share/ovn */ > +const char *ovn_rundir(void); /* /usr/local/var/run/ovn */ > +const char *ovn_logdir(void); /* /usr/local/var/log/ovn */ > +const char *ovn_dbdir(void); /* /usr/local/etc/ovn */ > +const char *ovn_bindir(void); /* /usr/local/bin */ > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif /* OVN_DIRS_H */ > diff --git a/lib/ovn-util.c b/lib/ovn-util.c > index 085498fd1..b425f3f2d 100644 > --- a/lib/ovn-util.c > +++ b/lib/ovn-util.c > @@ -13,8 +13,10 @@ > */ > > #include <config.h> > +#include <unistd.h> > + > #include "ovn-util.h" > -#include "dirs.h" > +#include "ovn-dirs.h" > #include "openvswitch/vlog.h" > #include "ovn-nb-idl.h" > #include "ovn-sb-idl.h" > @@ -296,7 +298,7 @@ default_nb_db(void) > if (!def) { > def = getenv("OVN_NB_DB"); > if (!def) { > - def = xasprintf("unix:%s/ovnnb_db.sock", ovs_rundir()); > + def = xasprintf("unix:%s/ovnnb_db.sock", ovn_rundir()); > } > } > return def; > @@ -309,12 +311,28 @@ default_sb_db(void) > if (!def) { > def = getenv("OVN_SB_DB"); > if (!def) { > - def = xasprintf("unix:%s/ovnsb_db.sock", ovs_rundir()); > + def = xasprintf("unix:%s/ovnsb_db.sock", ovn_rundir()); > } > } > return def; > } > > +char * > +get_abs_unix_ctl_path(void) > +{ > +#ifdef _WIN32 > + enum { WINDOWS = 1 }; > +#else > + enum { WINDOWS = 0 }; > +#endif > + > + long int pid = getpid(); > + char *abs_path = > + WINDOWS ? xasprintf("%s/%s.ctl", ovn_rundir(), program_name) > + : xasprintf("%s/%s.%ld.ctl", ovn_rundir(), program_name, pid); > + return abs_path; > +} > + > /* l3gateway, chassisredirect, and patch > * are not in this list since they are > * only set in the SB DB by northd > diff --git a/lib/ovn-util.h b/lib/ovn-util.h > index 6d5e1dfb5..fcd93cd82 100644 > --- a/lib/ovn-util.h > +++ b/lib/ovn-util.h > @@ -67,6 +67,7 @@ char *alloc_nat_zone_key(const struct uuid *key, const char *type); > > const char *default_nb_db(void); > const char *default_sb_db(void); > +char *get_abs_unix_ctl_path(void); > > struct ovsdb_idl_table_class; > const char *db_table_usage(struct ds *tables, > diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4 > index b599f17d7..964512795 100644 > --- a/m4/openvswitch.m4 > +++ b/m4/openvswitch.m4 > @@ -330,6 +330,17 @@ AC_DEFUN([OVS_CHECK_RUNDIR], > [RUNDIR='${localstatedir}/run/openvswitch']) > AC_SUBST([RUNDIR])]) > > +dnl Checks for the directory in which to store pidfiles. > +AC_DEFUN([OVN_CHECK_RUNDIR], > + [AC_ARG_WITH( > + [rundir], > + AC_HELP_STRING([--with-ovn-rundir=DIR], > + [directory used for pidfiles > + [[LOCALSTATEDIR/run/ovn]]]), > + [OVN_RUNDIR=$withval], > + [OVN_RUNDIR='${localstatedir}/run/ovn']) > + AC_SUBST([OVN_RUNDIR])]) > + > dnl Checks for the directory in which to store logs. > AC_DEFUN([OVS_CHECK_LOGDIR], > [AC_ARG_WITH( > diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c > index e86134414..b527f2172 100644 > --- a/northd/ovn-northd.c > +++ b/northd/ovn-northd.c > @@ -9351,7 +9351,14 @@ main(int argc, char *argv[]) > > daemonize_start(false); > > - retval = unixctl_server_create(unixctl_path, &unixctl); > + if (!unixctl_path) { > + char *abs_unixctl_path = get_abs_unix_ctl_path(); > + retval = unixctl_server_create(abs_unixctl_path, &unixctl); > + free(abs_unixctl_path); > + } else { > + retval = unixctl_server_create(unixctl_path, &unixctl); > + } > + > if (retval) { > exit(EXIT_FAILURE); > } > diff --git a/tests/ovs-macros.at b/tests/ovs-macros.at > index 10593429d..b2e619f76 100644 > --- a/tests/ovs-macros.at > +++ b/tests/ovs-macros.at > @@ -49,6 +49,7 @@ ovs_setenv() { > sandbox=$1 > ovs_dir=$ovs_base${1:+/$1} > OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR > + OVN_RUNDIR=$ovs_dir; export OVN_RUNDIR > OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR > OVS_DBDIR=$ovs_dir; export OVS_DBDIR > OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR > diff --git a/tutorial/ovs-sandbox b/tutorial/ovs-sandbox > index 47032b499..7546d27ca 100755 > --- a/tutorial/ovs-sandbox > +++ b/tutorial/ovs-sandbox > @@ -360,6 +360,7 @@ sandbox=`cd sandbox && pwd` > > # Set up environment for OVS programs to sandbox themselves. > OVS_RUNDIR=$sandbox; export OVS_RUNDIR > +OVN_RUNDIR=$sandbox; export OVN_RUNDIR > OVS_LOGDIR=$sandbox; export OVS_LOGDIR > OVS_DBDIR=$sandbox; export OVS_DBDIR > OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR > diff --git a/utilities/automake.mk b/utilities/automake.mk > index d666b9661..db0b0e051 100644 > --- a/utilities/automake.mk > +++ b/utilities/automake.mk > @@ -1,6 +1,7 @@ > scripts_SCRIPTS += \ > utilities/ovn-ctl \ > utilities/ovndb-servers.ocf > +scripts_DATA += utilities/ovn-lib > > man_MANS += \ > utilities/ovn-ctl.8 \ > @@ -21,6 +22,7 @@ bin_SCRIPTS += \ > > EXTRA_DIST += \ > utilities/ovn-ctl \ > + utilities/ovn-lib.in \ > utilities/ovn-ctl.8.xml \ > utilities/ovn-docker-overlay-driver.in \ > utilities/ovn-docker-underlay-driver.in \ > @@ -31,6 +33,7 @@ EXTRA_DIST += \ > > CLEANFILES += \ > utilities/ovn-ctl.8 \ > + utilities/ovn-lib \ > utilities/ovn-docker-overlay-driver \ > utilities/ovn-docker-underlay-driver \ > utilities/ovn-nbctl.8 \ > @@ -39,6 +42,8 @@ CLEANFILES += \ > utilities/ovn-detrace.1 \ > utilities/ovn-detrace > > +utilities/ovn-lib: $(top_builddir)/config.status > + > # ovn-nbctl > bin_PROGRAMS += utilities/ovn-nbctl > utilities_ovn_nbctl_SOURCES = utilities/ovn-nbctl.c > diff --git a/utilities/ovn-ctl b/utilities/ovn-ctl > index 7e5cd469c..a973b09a2 100755 > --- a/utilities/ovn-ctl > +++ b/utilities/ovn-ctl > @@ -13,12 +13,16 @@ > # limitations under the License. > > case $0 in > - */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;; > + */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` > + ovsdir=`echo "$dir0" | sed 's,/ovn/scripts,,'` > + ovsdir=$ovsdir/openvswitch/scripts Hi Numan, While this patch works fine on its own, when applied together with the whole series the following use case breaks due to the change above: # Configure and install OVS in the default path: cd ovs && ./boot.sh && ./configure && make install # Configure and install OVN in a custom path: cd ovn && ./boot.sh && ./configure --with-ovs-source=/home/ovn/ovs/ --prefix=/home/ovn/local-builds/ --localstatedir=/home/ovn/local-builds/var --sysconfdir=/home/ovn/local-builds/etc && make install # Try to start ovn daemons: sudo /home/ovn/local-builds/share/ovn/scripts/ovn-ctl start_northd /home/ovn/local-builds/share/ovn/scripts/ovn-ctl: line 23: /home/ovn/local-builds/share/openvswitch/scripts/ovs-lib: No such file or directory I guess this is not a common use case but should we document that OVS and OVS should be installed in "similar" locations? Thanks, Dumitru > + ;; > *) dir0=./ ;; > esac > -. "$dir0/ovs-lib" || exit 1 > +. "$dir0/ovn-lib" || exit 1 > +. "$ovsdir/ovs-lib" || exit 1 > > -for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do > +for dir in "$sbindir" "$ovn_bindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do > case :$PATH: in > *:$dir:*) ;; > *) PATH=$PATH:$dir ;; > @@ -26,9 +30,9 @@ for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do > done > > > -ovnnb_active_conf_file="$etcdir/ovnnb-active.conf" > -ovnsb_active_conf_file="$etcdir/ovnsb-active.conf" > -ovn_northd_db_conf_file="$etcdir/ovn-northd-db-params.conf" > +ovnnb_active_conf_file="$ovn_etcdir/ovnnb-active.conf" > +ovnsb_active_conf_file="$ovn_etcdir/ovnsb-active.conf" > +ovn_northd_db_conf_file="$ovn_etcdir/ovn-northd-db-params.conf" > ## ----- ## > ## start ## > ## ----- ## > @@ -110,6 +114,7 @@ start_ovsdb__() { > local logfile > local log > local sock > + local ctrl_sock > local detach > local create_insecure_remote > local port > @@ -134,6 +139,7 @@ start_ovsdb__() { > eval logfile=\$OVN_${DB}_LOGFILE > eval log=\$OVN_${DB}_LOG > eval sock=\$DB_${DB}_SOCK > + eval ctrl_sock=\$DB_${DB}_CTRL_SOCK > eval detach=\$DB_${DB}_DETACH > eval create_insecure_remote=\$DB_${DB}_CREATE_INSECURE_REMOTE > eval port=\$DB_${DB}_PORT > @@ -144,7 +150,10 @@ start_ovsdb__() { > eval ovn_db_ssl_cert=\$OVN_${DB}_DB_SSL_CERT > eval ovn_db_ssl_cacert=\$OVN_${DB}_DB_SSL_CA_CERT > > - install_dir "$OVN_RUNDIR" > + ovn_install_dir "$OVN_RUNDIR" > + ovn_install_dir "$ovn_logdir" > + ovn_install_dir "$ovn_dbdir" > + > # Check and eventually start ovsdb-server for DB > if pidfile_is_running $db_pid_file; then > return > @@ -177,7 +186,7 @@ $cluster_remote_port > set ovsdb-server > set "$@" $log --log-file=$logfile > set "$@" --remote=punix:$sock --pidfile=$db_pid_file > - set "$@" --unixctl=ovn${db}_db.ctl > + set "$@" --unixctl=$ctrl_sock > > [ "$OVS_USER" != "" ] && set "$@" --user "$OVS_USER" > > @@ -328,7 +337,7 @@ start_northd () { > > set "$@" $OVN_NORTHD_LOG $ovn_northd_params > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" > fi > } > > @@ -350,7 +359,7 @@ start_controller () { > > [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > } > > start_controller_vtep () { > @@ -377,7 +386,7 @@ start_controller_vtep () { > > [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > } > > ## ---- ## > @@ -385,7 +394,7 @@ start_controller_vtep () { > ## ---- ## > > stop_northd () { > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-northd > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-northd > > if [ ! -e $ovn_northd_db_conf_file ]; then > if test X"$OVN_MANAGE_OVSDB" = Xyes; then > @@ -395,11 +404,11 @@ stop_northd () { > } > > stop_controller () { > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller "$@" > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller "$@" > } > > stop_controller_vtep () { > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller-vtep > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller-vtep > } > > ## ------- ## > @@ -444,11 +453,12 @@ set_defaults () { > OVN_MANAGE_OVSDB=yes > > OVS_RUNDIR=${OVS_RUNDIR:-${rundir}} > - OVN_RUNDIR=${OVN_RUNDIR:-${OVS_RUNDIR}} > + OVN_RUNDIR=${OVN_RUNDIR:-${ovn_rundir}} > > DB_NB_SOCK=$OVN_RUNDIR/ovnnb_db.sock > DB_NB_PID=$OVN_RUNDIR/ovnnb_db.pid > - DB_NB_FILE=$dbdir/ovnnb_db.db > + DB_NB_CTRL_SOCK=$OVN_RUNDIR/ovnnb_db.ctl > + DB_NB_FILE=$ovn_dbdir/ovnnb_db.db > DB_NB_ADDR=0.0.0.0 > DB_NB_PORT=6641 > DB_NB_SYNC_FROM_PROTO=tcp > @@ -457,17 +467,18 @@ set_defaults () { > > DB_SB_SOCK=$OVN_RUNDIR/ovnsb_db.sock > DB_SB_PID=$OVN_RUNDIR/ovnsb_db.pid > - DB_SB_FILE=$dbdir/ovnsb_db.db > + DB_SB_CTRL_SOCK=$OVN_RUNDIR/ovnsb_db.ctl > + DB_SB_FILE=$ovn_dbdir/ovnsb_db.db > DB_SB_ADDR=0.0.0.0 > DB_SB_PORT=6642 > DB_SB_SYNC_FROM_PROTO=tcp > DB_SB_SYNC_FROM_ADDR= > DB_SB_SYNC_FROM_PORT=6642 > > - DB_NB_SCHEMA=$datadir/ovn-nb.ovsschema > - DB_SB_SCHEMA=$datadir/ovn-sb.ovsschema > + DB_NB_SCHEMA=$ovn_datadir/ovn-nb.ovsschema > + DB_SB_SCHEMA=$ovn_datadir/ovn-sb.ovsschema > > - DB_SOCK=$OVN_RUNDIR/db.sock > + DB_SOCK=$OVS_RUNDIR/db.sock > DB_CONF_FILE=$dbdir/conf.db > > OVN_NORTHD_PRIORITY=-10 > @@ -483,8 +494,8 @@ set_defaults () { > OVN_NORTHD_LOGFILE="" > OVN_NB_LOG="-vconsole:off -vfile:info" > OVN_SB_LOG="-vconsole:off -vfile:info" > - OVN_NB_LOGFILE="$logdir/ovsdb-server-nb.log" > - OVN_SB_LOGFILE="$logdir/ovsdb-server-sb.log" > + OVN_NB_LOGFILE="$ovn_logdir/ovsdb-server-nb.log" > + OVN_SB_LOGFILE="$ovn_logdir/ovsdb-server-sb.log" > > OVN_CONTROLLER_SSL_KEY="" > OVN_CONTROLLER_SSL_CERT="" > @@ -662,14 +673,14 @@ File location options: > --db-sb-use-remote-in-db=yes|no OVN_Southbound db listen on target connection table (default: $DB_SB_USE_REMOTE_IN_DB) > > Default directories with "configure" option and environment variable override: > - logs: /usr/local/var/log/openvswitch (--with-logdir, OVS_LOGDIR) > - pidfiles and sockets: /usr/local/var/run/openvswitch (--with-rundir, OVS_RUNDIR) > - ovn-nb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) > - ovn-sb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) > - system configuration: /usr/local/etc (--sysconfdir, OVS_SYSCONFDIR) > - data files: /usr/local/share/openvswitch (--pkgdatadir, OVS_PKGDATADIR) > - user binaries: /usr/local/bin (--bindir, OVS_BINDIR) > - system binaries: /usr/local/sbin (--sbindir, OVS_SBINDIR) > + logs: /usr/local/var/log/ovn (--with-logdir, OVN_LOGDIR) > + pidfiles and sockets: /usr/local/var/run/ovn (--with-rundir, OVN_RUNDIR) > + ovn-nb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) > + ovn-sb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) > + system configuration: /usr/local/etc (--sysconfdir, OVN_SYSCONFDIR) > + data files: /usr/local/share/ovn (--pkgdatadir, OVN_PKGDATADIR) > + user binaries: /usr/local/bin (--bindir, OVN_BINDIR) > + system binaries: /usr/local/sbin (--sbindir, OVN_SBINDIR) > EOF > } > > diff --git a/utilities/ovn-ctl.8.xml b/utilities/ovn-ctl.8.xml > index c5294d794..f70bd6f0f 100644 > --- a/utilities/ovn-ctl.8.xml > +++ b/utilities/ovn-ctl.8.xml > @@ -203,12 +203,12 @@ > <h3>Starting standalone ovn db server passing SSL certificates</h3> > <p> > <code> > - # ovn-ctl --ovn-nb-db-ssl-key=/etc/openvswitch/ovnnb-privkey.pem > - --ovn-nb-db-ssl-cert=/etc/openvswitch/ovnnb-cert.pem > - --ovn-nb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem > - --ovn-sb-db-ssl-key=/etc/openvswitch/ovnsb-privkey.pem > - --ovn-sb-db-ssl-cert=/etc/openvswitch/ovnsb-cert.pem > - --ovn-sb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem > + # ovn-ctl --ovn-nb-db-ssl-key=/etc/ovn/ovnnb-privkey.pem > + --ovn-nb-db-ssl-cert=/etc/ovn/ovnnb-cert.pem > + --ovn-nb-db-ssl-ca-cert=/etc/ovn/cacert.pem > + --ovn-sb-db-ssl-key=/etc/ovn/ovnsb-privkey.pem > + --ovn-sb-db-ssl-cert=/etc/ovn/ovnsb-cert.pem > + --ovn-sb-db-ssl-ca-cert=/etc/ovn/cacert.pem > start_northd > </code> > </p> > diff --git a/utilities/ovn-lib.in b/utilities/ovn-lib.in > new file mode 100644 > index 000000000..50111a76b > --- /dev/null > +++ b/utilities/ovn-lib.in > @@ -0,0 +1,204 @@ > +# -*- sh -*- > +# vi:syntax=sh > +# This is a shell function library sourced by some OVN scripts. > +# It is not intended to be invoked on its own. > +# The code copied from ovs/utilities/ovs-lib.in > + > +# > +# 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. > + > +## ----------------- ## > +## configure options ## > +## ----------------- ## > + > +# All of these should be substituted by the Makefile at build time. > +ovn_logdir=${OVN_LOGDIR-'@LOGDIR@'} # /var/log/ovn > +ovn_rundir=${OVN_RUNDIR-'@OVN_RUNDIR@'} # /var/run/ovn > +ovn_sysconfdir=${OVN_SYSCONFDIR-'@sysconfdir@'} # /etc > +ovn_etcdir=$sysconfdir/ovn # /etc/ovn > +ovn_datadir=${OVN_PKGDATADIR-'@pkgdatadir@'} # /usr/share/ovn > +ovn_bindir=${OVN_BINDIR-'@bindir@'} # /usr/bin > +ovn_sbindir=${OVN_SBINDIR-'@sbindir@'} # /usr/sbin > + > +# /etc/ovn or /var/lib/ovn > +if test X"$OVN_DBDIR" != X; then > + ovn_dbdir=$OVN_DBDIR > +elif test X"$OVN_SYSCONFDIR" != X; then > + ovn_dbdir=$OVN_SYSCONFDIR/ovn > +else > + ovn_dbdir='@DBDIR@' > +fi > + > +VERSION='@VERSION@' > + > +DAEMON_CWD=/ > + > +LC_ALL=C; export LC_ALL > + > +ovn_install_dir () { > + DIR="$1" > + INSTALL_MODE="${2:-755}" > + INSTALL_USER="root" > + INSTALL_GROUP="root" > + [ "$OVN_USER" != "" ] && INSTALL_USER="${OVN_USER%:*}" > + [ "${OVN_USER##*:}" != "" ] && INSTALL_GROUP="${OVN_USER##*:}" > + > + if test ! -d "$DIR"; then > + install -d -m "$INSTALL_MODE" -o "$INSTALL_USER" -g "$INSTALL_GROUP" "$DIR" > + restorecon "$DIR" >/dev/null 2>&1 > + fi > +} > + > +start_ovn_daemon () { > + priority=$1 > + wrapper=$2 > + shift; shift > + daemon=$1 > + strace="" > + > + # drop core files in a sensible place > + ovn_install_dir "$DAEMON_CWD" > + set "$@" --no-chdir > + cd "$DAEMON_CWD" > + > + # log file > + ovn_install_dir "$ovn_logdir" "750" > + set "$@" --log-file="$ovn_logdir/$daemon.log" > + > + # pidfile and monitoring > + ovn_install_dir "$ovn_rundir" > + set "$@" --pidfile="$ovn_rundir/$daemon.pid" > + set "$@" --detach > + test X"$MONITOR" = Xno || set "$@" --monitor > + > + # wrapper > + case $wrapper in > + valgrind) > + if (valgrind --version) > /dev/null 2>&1; then > + set valgrind -q --leak-check=full --time-stamp=yes \ > + --log-file="$ovn_logdir/$daemon.valgrind.log.%p" "$@" > + else > + log_failure_msg "valgrind not installed, running $daemon without it" > + fi > + ;; > + strace) > + if (strace -V) > /dev/null 2>&1; then > + strace="strace -tt -T -s 256 -ff" > + if (strace -DV) > /dev/null 2>&1; then > + # Has the -D option. > + set $strace -D -o "$ovn_logdir/$daemon.strace.log" "$@" > + strace="" > + fi > + else > + log_failure_msg "strace not installed, running $daemon without it" > + fi > + ;; > + glibc) > + set env MALLOC_CHECK_=2 MALLOC_PERTURB_=165 "$@" > + ;; > + '') > + ;; > + *) > + log_failure_msg "unknown wrapper $wrapper, running $daemon without it" > + ;; > + esac > + > + # priority > + if test X"$priority" != X; then > + set nice -n "$priority" "$@" > + fi > + > + action "Starting $daemon" "$@" || return 1 > + > + if test X"$strace" != X; then > + # Strace doesn't have the -D option so we attach after the fact. > + setsid $strace -o "$ovn_logdir/$daemon.strace.log" \ > + -p `cat $ovn_rundir/$daemon.pid` > /dev/null 2>&1 & > + fi > +} > + > +stop_ovn_daemon () { > + if test -e "$ovn_rundir/$1.pid"; then > + if pid=`cat "$ovn_rundir/$1.pid"`; then > + if pid_exists "$pid" >/dev/null 2>&1; then :; else > + rm -f $ovn_rundir/$1.$pid.ctl $ovn_rundir/$1.$pid > + return 0 > + fi > + > + graceful="EXIT .1 .25 .65 1" > + actions="TERM .1 .25 .65 1 1 1 1 \ > + KILL 1 1 1 2 10 15 30 \ > + FAIL" > + version=`ovs-appctl -T 1 -t $ovn_rundir/$1.$pid.ctl version \ > + | awk 'NR==1{print $NF}'` > + > + # Use `ovs-appctl exit` only if the running daemon version > + # is >= 2.5.90. This script might be used during upgrade to > + # stop older versions of daemons which do not behave correctly > + # with `ovs-appctl exit` (e.g. ovs-vswitchd <= 2.5.0 deletes > + # internal ports). > + if version_geq "$version" "2.5.90"; then > + actions="$graceful $actions" > + fi > + for action in $actions; do > + if pid_exists "$pid" >/dev/null 2>&1; then :; else > + return 0 > + fi > + case $action in > + EXIT) > + action "Exiting $1 ($pid)" \ > + ${bindir}/ovs-appctl -T 1 -t $ovn_rundir/$1.$pid.ctl exit $2 > + ;; > + TERM) > + action "Killing $1 ($pid)" kill $pid > + ;; > + KILL) > + action "Killing $1 ($pid) with SIGKILL" kill -9 $pid > + ;; > + FAIL) > + log_failure_msg "Killing $1 ($pid) failed" > + return 1 > + ;; > + *) > + sleep $action > + ;; > + esac > + done > + fi > + fi > + log_success_msg "$1 is not running" > +} > + > +ovn_daemon_status () { > + pidfile=$ovn_rundir/$1.pid > + if test -e "$pidfile"; then > + if pid=`cat "$pidfile"`; then > + if pid_exists "$pid"; then > + echo "$1 is running with pid $pid" > + return 0 > + else > + echo "Pidfile for $1 ($pidfile) is stale" > + fi > + else > + echo "Pidfile for $1 ($pidfile) exists but cannot be read" > + fi > + else > + echo "$1 is not running" > + fi > + return 1 > +} > + > +daemon_is_running () { > + pidfile=$ovn_rundir/$1.pid > + test -e "$pidfile" && pid=`cat "$pidfile"` && pid_exists "$pid" && pid_comm_check $1 $pid > +} >/dev/null 2>&1 > -- > 2.20.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
On Fri, Aug 16, 2019 at 10:45 PM Mark Michelson <mmichels@redhat.com> wrote: > On 8/13/19 12:27 PM, nusiddiq@redhat.com wrote: > > From: Numan Siddique <nusiddiq@redhat.com> > > > > Until now, OVN uses the openvswitch rundirs (rundir, logdir, etcdir). > > The commit [1] changed the package name from openvswitch to ovn, but > > it didn't take into the account the effects of it. When "make install" > > is run ovn-ctl utility is copied to /usr/local/share/ovn/scripts folder. > > ovn-ctl depends on 'ovs-lib' and it is not present in this scripts foler. > > Because of which we cannot start OVN services using ovn-ctl. > > > > This patch addresses all these issues. It changes the rundir to > > ovn specific ones. (i.e /usr/local/var/run/ovn, /usr/local/var/log/ovn, > > /usr/local/etc/ovn with default configuration). > > > > [1] - 7795e0e28dce("Change the package name from openvswitch to ovn in > AC_INIT()") > > > > Tested:by: Dumitru Ceara <dceara@redhat.com> > > Signed-off-by: Numan Siddique <nusiddiq@redhat.com> > > --- > > Documentation/intro/install/general.rst | 30 ++-- > > Makefile.am | 5 + > > configure.ac | 1 + > > controller/ovn-controller.c | 4 +- > > lib/.gitignore | 1 + > > lib/automake.mk | 22 ++- > > lib/ovn-dirs.c.in | 112 +++++++++++++ > > lib/ovn-dirs.h | 35 ++++ > > lib/ovn-util.c | 24 ++- > > lib/ovn-util.h | 1 + > > m4/openvswitch.m4 | 11 ++ > > northd/ovn-northd.c | 9 +- > > tests/ovs-macros.at | 1 + > > tutorial/ovs-sandbox | 1 + > > utilities/automake.mk | 5 + > > utilities/ovn-ctl | 71 +++++---- > > utilities/ovn-ctl.8.xml | 12 +- > > utilities/ovn-lib.in | 204 ++++++++++++++++++++++++ > > 18 files changed, 494 insertions(+), 55 deletions(-) > > create mode 100644 lib/ovn-dirs.c.in > > create mode 100644 lib/ovn-dirs.h > > create mode 100644 utilities/ovn-lib.in > > > > diff --git a/Documentation/intro/install/general.rst > b/Documentation/intro/install/general.rst > > index 99d8fec04..4cc9c4c3a 100644 > > --- a/Documentation/intro/install/general.rst > > +++ b/Documentation/intro/install/general.rst > > @@ -153,17 +153,17 @@ invoke configure without any arguments. For > example:: > > > > $ ./configure > > > > -By default all files are installed under ``/usr/local``. OVN and Open > vSwitch > > -also expects to find its database in ``/usr/local/etc/openvswitch`` by > default. > > +By default all files are installed under ``/usr/local``. OVN expects to > find > > +its database in ``/usr/local/etc/ovn`` by default. > > If you want to install all files into, e.g., ``/usr`` and ``/var`` > instead of > > -``/usr/local`` and ``/usr/local/var`` and expect to use > ``/etc/openvswitch`` as > > +``/usr/local`` and ``/usr/local/var`` and expect to use ``/etc/ovn`` as > > the default database directory, add options as shown here:: > > > > $ ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc > > > > .. note:: > > > > - Open vSwitch and OVN installed with packages like .rpm (e.g. via > > + OVN installed with packages like .rpm (e.g. via > > ``yum install`` or ``rpm -ivh``) and .deb (e.g. via > > ``apt-get install`` or ``dpkg -i``) use the above configure options. > > > > @@ -319,9 +319,13 @@ and stopping ovn-northd, ovn-controller and > ovsdb-servers. After installation, > > the daemons can be started by using the ovn-ctl utility. This will > take care > > to setup initial conditions, and start the daemons in the correct > order. > > The ovn-ctl utility is located in '$(pkgdatadir)/scripts', and > defaults to > > -'/usr/local/share/openvswitch/scripts'. An example after install might > be:: > > +'/usr/local/share/ovn/scripts'. ovn-ctl utility requires the 'ovs-lib' > > +helper shell script which is present in > '/usr/local/share/openvswitch/scripts'. > > +So invoking ovn-ctl as "./ovn-ctl" will fail. > > > > - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts > > +An example after install might be:: > > + > > + $ export PATH=$PATH:/usr/local/share/ovn/scripts > > $ ovn-ctl start_northd > > $ ovn-ctl start_controller > > > > @@ -331,7 +335,7 @@ Starting OVN Central services > > OVN central services includes ovn-northd, Northbound and > > Southbound ovsdb-server. > > > > - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts > > + $ export PATH=$PATH:/usr/local/share/ovn/scripts > > $ ovn-ctl start_northd > > > > Refer to ovn-ctl(8) for more information and the supported options. > > @@ -341,23 +345,23 @@ Before starting ovn-northd you need to start OVN > Northbound and Southbound > > ovsdb-servers. Before ovsdb-servers can be started, > > configure the Northbound and Southbound databases:: > > > > - $ mkdir -p /usr/local/etc/openvswitch > > - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnnb_db.db \ > > + $ mkdir -p /usr/local/etc/ovn > > + $ ovsdb-tool create /usr/local/etc/ovn/ovnnb_db.db \ > > ovn-nb.ovsschema > > - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnsb_db.db \ > > + $ ovsdb-tool create /usr/local/etc/ovn/ovnsb_db.db \ > > ovn-sb.ovsschema > > > > Configure ovsdb-servers to use databases created above, to listen on a > Unix > > domain socket and to use the SSL configuration in the database:: > > > > - $ mkdir -p /usr/local/var/run/openvswitch > > - $ ovsdb-server > --remote=punix:/usr/local/var/run/openvswitch/ovnnb_db.sock \ > > + $ mkdir -p /usr/local/var/run/ovn > > + $ ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnnb_db.sock \ > > --remote=db:OVN_Northbound,NB_Global,connections \ > > --private-key=db:OVN_Northbound,SSL,private_key \ > > --certificate=db:OVN_Northbound,SSL,certificate \ > > --bootstrap-ca-cert=db:OVN_Northbound,SSL,ca_cert \ > > --pidfile --detach --log-file > > - $ovsdb-server > --remote=punix:/usr/local/var/run/openvswitch/ovnsb_db.sock \ > > + $ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnsb_db.sock \ > > --remote=db:OVN_Southbound,SB_Global,connections \ > > --private-key=db:OVN_Southbound,SSL,private_key \ > > --certificate=db:OVN_Southbound,SSL,certificate \ > > diff --git a/Makefile.am b/Makefile.am > > index f886a8e63..6447e348b 100644 > > --- a/Makefile.am > > +++ b/Makefile.am > > @@ -177,6 +177,7 @@ SUFFIXES += .in > > -e 's,[@]DBDIR[@],$(DBDIR),g' \ > > -e 's,[@]PYTHON[@],$(PYTHON),g' \ > > -e 's,[@]RUNDIR[@],$(RUNDIR),g' \ > > + -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \ > > Same here. > > > -e 's,[@]VERSION[@],$(VERSION),g' \ > > -e 's,[@]localstatedir[@],$(localstatedir),g' \ > > -e 's,[@]pkgdatadir[@],$(pkgdatadir),g' \ > > @@ -202,6 +203,7 @@ SUFFIXES += .xml > > DBDIR='$(DBDIR)' \ > > PYTHON='$(PYTHON)' \ > > RUNDIR='$(RUNDIR)' \ > > + OVN_RUNDIR='$(OVN_RUNDIR)' \ > > VERSION='$(VERSION)' \ > > localstatedir='$(localstatedir)' \ > > pkgdatadir='$(pkgdatadir)' \ > > @@ -502,6 +504,9 @@ ALL_LOCAL += ovn-sb.ovsschema.stamp > > ovn-sb.ovsschema.stamp: ovn-sb.ovsschema > > $(srcdir)/build-aux/cksum-schema-check $? $@ > > > > +pkgdata_DATA += ovn-nb.ovsschema > > +pkgdata_DATA += ovn-sb.ovsschema > > + > > CLEANFILES += ovn-sb.ovsschema.stamp > > > > include Documentation/automake.mk > > diff --git a/configure.ac b/configure.ac > > index 8a32d3a18..c74b17a1d 100644 > > --- a/configure.ac > > +++ b/configure.ac > > @@ -123,6 +123,7 @@ AC_CHECK_HEADERS([net/if_mib.h], [], [], [[#include > <sys/types.h> > > > > OVS_CHECK_PKIDIR > > OVS_CHECK_RUNDIR > > +OVN_CHECK_RUNDIR > > OVS_CHECK_DBDIR > > OVS_CHECK_BACKTRACE > > OVS_CHECK_PERF_EVENT > > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c > > index 86f29accf..e27b56b2b 100644 > > --- a/controller/ovn-controller.c > > +++ b/controller/ovn-controller.c > > @@ -1715,7 +1715,9 @@ main(int argc, char *argv[]) > > > > daemonize_start(false); > > > > - retval = unixctl_server_create(NULL, &unixctl); > > + char *abs_unixctl_path = get_abs_unix_ctl_path(); > > + retval = unixctl_server_create(abs_unixctl_path, &unixctl); > > + free(abs_unixctl_path); > > if (retval) { > > exit(EXIT_FAILURE); > > } > > diff --git a/lib/.gitignore b/lib/.gitignore > > index a80a1bce1..3eed4588b 100644 > > --- a/lib/.gitignore > > +++ b/lib/.gitignore > > @@ -5,3 +5,4 @@ > > /ovn-sb-idl.c > > /ovn-sb-idl.h > > /ovn-sb-idl.ovsidl > > +/ovn-dirs.c > > diff --git a/lib/automake.mk b/lib/automake.mk > > index 8e7a1a937..2ee14a261 100644 > > --- a/lib/automake.mk > > +++ b/lib/automake.mk > > @@ -9,6 +9,7 @@ lib_libovn_la_SOURCES = \ > > lib/actions.c \ > > lib/chassis-index.c \ > > lib/chassis-index.h \ > > + lib/ovn-dirs.h \ > > lib/expr.c \ > > lib/extend-table.h \ > > lib/extend-table.c \ > > @@ -24,17 +25,36 @@ lib_libovn_la_SOURCES = \ > > lib/inc-proc-eng.c \ > > lib/inc-proc-eng.h > > nodist_lib_libovn_la_SOURCES = \ > > + lib/ovn-dirs.c \ > > lib/ovn-nb-idl.c \ > > lib/ovn-nb-idl.h \ > > lib/ovn-sb-idl.c \ > > lib/ovn-sb-idl.h > > > > +CLEANFILES += $(nodist_lib_libovn_la_SOURCES) > > + > > # ovn-sb IDL > > OVSIDL_BUILT += \ > > lib/ovn-sb-idl.c \ > > lib/ovn-sb-idl.h \ > > lib/ovn-sb-idl.ovsidl > > -EXTRA_DIST += lib/ovn-sb-idl.ann > > +EXTRA_DIST += \ > > + lib/ovn-sb-idl.ann \ > > + lib/ovn-dirs.c.in > > + > > +lib/ovn-dirs.c: lib/ovn-dirs.c.in Makefile > > + $(AM_V_GEN)($(ro_c) && sed < $(srcdir)/lib/ovn-dirs.c.in \ > > + -e 's,[@]srcdir[@],$(srcdir),g' \ > > + -e 's,[@]LOGDIR[@],"$(LOGDIR)",g' \ > > + -e 's,[@]RUNDIR[@],"$(RUNDIR)",g' \ > > + -e 's,[@]OVN_RUNDIR[@],"$(OVN_RUNDIR)",g' \ > > + -e 's,[@]DBDIR[@],"$(DBDIR)",g' \ > > + -e 's,[@]bindir[@],"$(bindir)",g' \ > > + -e 's,[@]sysconfdir[@],"$(sysconfdir)",g' \ > > + -e 's,[@]pkgdatadir[@],"$(pkgdatadir)",g') \ > > + > lib/ovn-dirs.c.tmp && \ > > + mv lib/ovn-dirs.c.tmp lib/ovn-dirs.c > > + > > OVN_SB_IDL_FILES = \ > > $(srcdir)/ovn-sb.ovsschema \ > > $(srcdir)/lib/ovn-sb-idl.ann > > diff --git a/lib/ovn-dirs.c.in b/lib/ovn-dirs.c.in > > new file mode 100644 > > index 000000000..7ed1e3018 > > --- /dev/null > > +++ b/lib/ovn-dirs.c.in > > @@ -0,0 +1,112 @@ > > +#line 2 "@srcdir@/lib/dirs.c.in" > > +/* > > + * Copyright (c) 2019 > > + * > > + * 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 <config.h> > > +#include "ovn-dirs.h" > > +#include <stdlib.h> > > +#include "lib/ovs-thread.h" > > +#include "lib/util.h" > > + > > +struct directory { > > + const char *value; /* Actual value; NULL if not yet > determined. */ > > + const char *default_value; /* Default value. */ > > + const char *var_name; /* Environment variable to override > default. */ > > + struct ovsthread_once once; /* Ensures 'value' gets initialized > once. */ > > +}; > > + > > +static const char * > > +get_dir(struct directory *d) > > +{ > > + if (ovsthread_once_start(&d->once)) { > > + d->value = getenv(d->var_name); > > + if (!d->value || !d->value[0]) { > > + d->value = d->default_value; > > + } > > + ovsthread_once_done(&d->once); > > + } > > + return d->value; > > +} > > + > > +const char * > > +ovn_sysconfdir(void) > > +{ > > + static struct directory d = { > > + NULL, @sysconfdir@, "OVN_SYSCONFDIR", > OVSTHREAD_ONCE_INITIALIZER > > + }; > > + > > + return get_dir(&d); > > +} > > + > > +const char * > > +ovn_pkgdatadir(void) > > +{ > > + static struct directory d = { > > + NULL, @pkgdatadir@, "OVN_PKGDATADIR", > OVSTHREAD_ONCE_INITIALIZER > > + }; > > + > > + return get_dir(&d); > > +} > > + > > +const char * > > +ovn_rundir(void) > > +{ > > + static struct directory d = { > > + NULL, @OVN_RUNDIR@, "OVN_RUNDIR", OVSTHREAD_ONCE_INITIALIZER > > + }; > > + > > + return get_dir(&d); > > +} > > + > > +const char * > > +ovn_logdir(void) > > +{ > > + static struct directory d = { > > + NULL, @LOGDIR@, "OVN_LOGDIR", OVSTHREAD_ONCE_INITIALIZER > > + }; > > + > > + return get_dir(&d); > > +} > > + > > +const char * > > +ovn_dbdir(void) > > +{ > > + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; > > + static const char *dbdir; > > + > > + if (ovsthread_once_start(&once)) { > > + dbdir = getenv("OVN_DBDIR"); > > + if (!dbdir || !dbdir[0]) { > > + char *sysconfdir = getenv("OVN_SYSCONFDIR"); > > + > > + dbdir = (sysconfdir > > + ? xasprintf("%s/ovn", sysconfdir) > > + : @DBDIR@); > > + } > > + ovsthread_once_done(&once); > > + } > > + return dbdir; > > +} > > + > > +const char * > > +ovn_bindir(void) > > +{ > > + static struct directory d = { > > + NULL, @bindir@, "OVN_BINDIR", OVSTHREAD_ONCE_INITIALIZER > > + }; > > + > > + return get_dir(&d); > > +} > > diff --git a/lib/ovn-dirs.h b/lib/ovn-dirs.h > > new file mode 100644 > > index 000000000..22ff7a1ee > > --- /dev/null > > +++ b/lib/ovn-dirs.h > > @@ -0,0 +1,35 @@ > > +/* > > + * Copyright (c) 2019. > > + * > > + * 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_DIRS_H > > +#define OVN_DIRS_H 1 > > + > > +#ifdef __cplusplus > > +extern "C" { > > +#endif > > + > > +const char *ovn_sysconfdir(void); /* /usr/local/etc */ > > +const char *ovn_pkgdatadir(void); /* /usr/local/share/ovn */ > > +const char *ovn_rundir(void); /* /usr/local/var/run/ovn */ > > +const char *ovn_logdir(void); /* /usr/local/var/log/ovn */ > > +const char *ovn_dbdir(void); /* /usr/local/etc/ovn */ > > +const char *ovn_bindir(void); /* /usr/local/bin */ > > + > > +#ifdef __cplusplus > > +} > > +#endif > > + > > +#endif /* OVN_DIRS_H */ > > diff --git a/lib/ovn-util.c b/lib/ovn-util.c > > index 085498fd1..b425f3f2d 100644 > > --- a/lib/ovn-util.c > > +++ b/lib/ovn-util.c > > @@ -13,8 +13,10 @@ > > */ > > > > #include <config.h> > > +#include <unistd.h> > > + > > #include "ovn-util.h" > > -#include "dirs.h" > > +#include "ovn-dirs.h" > > #include "openvswitch/vlog.h" > > #include "ovn-nb-idl.h" > > #include "ovn-sb-idl.h" > > @@ -296,7 +298,7 @@ default_nb_db(void) > > if (!def) { > > def = getenv("OVN_NB_DB"); > > if (!def) { > > - def = xasprintf("unix:%s/ovnnb_db.sock", ovs_rundir()); > > + def = xasprintf("unix:%s/ovnnb_db.sock", ovn_rundir()); > > } > > } > > return def; > > @@ -309,12 +311,28 @@ default_sb_db(void) > > if (!def) { > > def = getenv("OVN_SB_DB"); > > if (!def) { > > - def = xasprintf("unix:%s/ovnsb_db.sock", ovs_rundir()); > > + def = xasprintf("unix:%s/ovnsb_db.sock", ovn_rundir()); > > } > > } > > return def; > > } > > > > +char * > > +get_abs_unix_ctl_path(void) > > +{ > > +#ifdef _WIN32 > > + enum { WINDOWS = 1 }; > > +#else > > + enum { WINDOWS = 0 }; > > +#endif > > + > > + long int pid = getpid(); > > + char *abs_path = > > + WINDOWS ? xasprintf("%s/%s.ctl", ovn_rundir(), program_name) > > + : xasprintf("%s/%s.%ld.ctl", ovn_rundir(), > program_name, pid); > > + return abs_path; > > +} > > + > > /* l3gateway, chassisredirect, and patch > > * are not in this list since they are > > * only set in the SB DB by northd > > diff --git a/lib/ovn-util.h b/lib/ovn-util.h > > index 6d5e1dfb5..fcd93cd82 100644 > > --- a/lib/ovn-util.h > > +++ b/lib/ovn-util.h > > @@ -67,6 +67,7 @@ char *alloc_nat_zone_key(const struct uuid *key, const > char *type); > > > > const char *default_nb_db(void); > > const char *default_sb_db(void); > > +char *get_abs_unix_ctl_path(void); > > > > struct ovsdb_idl_table_class; > > const char *db_table_usage(struct ds *tables, > > diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4 > > index b599f17d7..964512795 100644 > > --- a/m4/openvswitch.m4 > > +++ b/m4/openvswitch.m4 > > @@ -330,6 +330,17 @@ AC_DEFUN([OVS_CHECK_RUNDIR], > > [RUNDIR='${localstatedir}/run/openvswitch']) > > AC_SUBST([RUNDIR])]) > > > > +dnl Checks for the directory in which to store pidfiles. > > +AC_DEFUN([OVN_CHECK_RUNDIR], > > + [AC_ARG_WITH( > > + [rundir], > > + AC_HELP_STRING([--with-ovn-rundir=DIR], > > + [directory used for pidfiles > > + [[LOCALSTATEDIR/run/ovn]]]), > > + [OVN_RUNDIR=$withval], > > + [OVN_RUNDIR='${localstatedir}/run/ovn']) > > + AC_SUBST([OVN_RUNDIR])]) > > + > > It feels odd to me that we have --with-rundir and --with-ovn-rundir as > configure options. It seems more natural to have --with-rundir (set the > OVN runtime directory) and --with-ovs-rundir (inform the build where the > OVS runtime directory is). > > To me, --with-rundir sounds like an option to configure the rundir for > the project that is being built, not the rundir for a different project. > Hi Mark. Thanks for the reviews. That's true. I agree. I swapped p1 and p2 of this series to address your issues relatively easier as after p1, we will be using ovs frome external directory. Please take a look at v2 of the series - https://patchwork.ozlabs.org/project/openvswitch/list/?series=126020 Thanks Numan > > dnl Checks for the directory in which to store logs. > > AC_DEFUN([OVS_CHECK_LOGDIR], > > [AC_ARG_WITH( > > diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c > > index e86134414..b527f2172 100644 > > --- a/northd/ovn-northd.c > > +++ b/northd/ovn-northd.c > > @@ -9351,7 +9351,14 @@ main(int argc, char *argv[]) > > > > daemonize_start(false); > > > > - retval = unixctl_server_create(unixctl_path, &unixctl); > > + if (!unixctl_path) { > > + char *abs_unixctl_path = get_abs_unix_ctl_path(); > > + retval = unixctl_server_create(abs_unixctl_path, &unixctl); > > + free(abs_unixctl_path); > > + } else { > > + retval = unixctl_server_create(unixctl_path, &unixctl); > > + } > > + > > if (retval) { > > exit(EXIT_FAILURE); > > } > > diff --git a/tests/ovs-macros.at b/tests/ovs-macros.at > > index 10593429d..b2e619f76 100644 > > --- a/tests/ovs-macros.at > > +++ b/tests/ovs-macros.at > > @@ -49,6 +49,7 @@ ovs_setenv() { > > sandbox=$1 > > ovs_dir=$ovs_base${1:+/$1} > > OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR > > + OVN_RUNDIR=$ovs_dir; export OVN_RUNDIR > > OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR > > OVS_DBDIR=$ovs_dir; export OVS_DBDIR > > OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR > > diff --git a/tutorial/ovs-sandbox b/tutorial/ovs-sandbox > > index 47032b499..7546d27ca 100755 > > --- a/tutorial/ovs-sandbox > > +++ b/tutorial/ovs-sandbox > > @@ -360,6 +360,7 @@ sandbox=`cd sandbox && pwd` > > > > # Set up environment for OVS programs to sandbox themselves. > > OVS_RUNDIR=$sandbox; export OVS_RUNDIR > > +OVN_RUNDIR=$sandbox; export OVN_RUNDIR > > OVS_LOGDIR=$sandbox; export OVS_LOGDIR > > OVS_DBDIR=$sandbox; export OVS_DBDIR > > OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR > > diff --git a/utilities/automake.mk b/utilities/automake.mk > > index d666b9661..db0b0e051 100644 > > --- a/utilities/automake.mk > > +++ b/utilities/automake.mk > > @@ -1,6 +1,7 @@ > > scripts_SCRIPTS += \ > > utilities/ovn-ctl \ > > utilities/ovndb-servers.ocf > > +scripts_DATA += utilities/ovn-lib > > > > man_MANS += \ > > utilities/ovn-ctl.8 \ > > @@ -21,6 +22,7 @@ bin_SCRIPTS += \ > > > > EXTRA_DIST += \ > > utilities/ovn-ctl \ > > + utilities/ovn-lib.in \ > > utilities/ovn-ctl.8.xml \ > > utilities/ovn-docker-overlay-driver.in \ > > utilities/ovn-docker-underlay-driver.in \ > > @@ -31,6 +33,7 @@ EXTRA_DIST += \ > > > > CLEANFILES += \ > > utilities/ovn-ctl.8 \ > > + utilities/ovn-lib \ > > utilities/ovn-docker-overlay-driver \ > > utilities/ovn-docker-underlay-driver \ > > utilities/ovn-nbctl.8 \ > > @@ -39,6 +42,8 @@ CLEANFILES += \ > > utilities/ovn-detrace.1 \ > > utilities/ovn-detrace > > > > +utilities/ovn-lib: $(top_builddir)/config.status > > + > > # ovn-nbctl > > bin_PROGRAMS += utilities/ovn-nbctl > > utilities_ovn_nbctl_SOURCES = utilities/ovn-nbctl.c > > diff --git a/utilities/ovn-ctl b/utilities/ovn-ctl > > index 7e5cd469c..a973b09a2 100755 > > --- a/utilities/ovn-ctl > > +++ b/utilities/ovn-ctl > > @@ -13,12 +13,16 @@ > > # limitations under the License. > > > > case $0 in > > - */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;; > > + */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` > > + ovsdir=`echo "$dir0" | sed 's,/ovn/scripts,,'` > > + ovsdir=$ovsdir/openvswitch/scripts > > + ;; > > *) dir0=./ ;; > > esac > > -. "$dir0/ovs-lib" || exit 1 > > +. "$dir0/ovn-lib" || exit 1 > > +. "$ovsdir/ovs-lib" || exit 1 > > > > -for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do > > +for dir in "$sbindir" "$ovn_bindir" "$bindir" /sbin /bin /usr/sbin > /usr/bin; do > > case :$PATH: in > > *:$dir:*) ;; > > *) PATH=$PATH:$dir ;; > > @@ -26,9 +30,9 @@ for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin > /usr/bin; do > > done > > > > > > -ovnnb_active_conf_file="$etcdir/ovnnb-active.conf" > > -ovnsb_active_conf_file="$etcdir/ovnsb-active.conf" > > -ovn_northd_db_conf_file="$etcdir/ovn-northd-db-params.conf" > > +ovnnb_active_conf_file="$ovn_etcdir/ovnnb-active.conf" > > +ovnsb_active_conf_file="$ovn_etcdir/ovnsb-active.conf" > > +ovn_northd_db_conf_file="$ovn_etcdir/ovn-northd-db-params.conf" > > ## ----- ## > > ## start ## > > ## ----- ## > > @@ -110,6 +114,7 @@ start_ovsdb__() { > > local logfile > > local log > > local sock > > + local ctrl_sock > > local detach > > local create_insecure_remote > > local port > > @@ -134,6 +139,7 @@ start_ovsdb__() { > > eval logfile=\$OVN_${DB}_LOGFILE > > eval log=\$OVN_${DB}_LOG > > eval sock=\$DB_${DB}_SOCK > > + eval ctrl_sock=\$DB_${DB}_CTRL_SOCK > > eval detach=\$DB_${DB}_DETACH > > eval create_insecure_remote=\$DB_${DB}_CREATE_INSECURE_REMOTE > > eval port=\$DB_${DB}_PORT > > @@ -144,7 +150,10 @@ start_ovsdb__() { > > eval ovn_db_ssl_cert=\$OVN_${DB}_DB_SSL_CERT > > eval ovn_db_ssl_cacert=\$OVN_${DB}_DB_SSL_CA_CERT > > > > - install_dir "$OVN_RUNDIR" > > + ovn_install_dir "$OVN_RUNDIR" > > + ovn_install_dir "$ovn_logdir" > > + ovn_install_dir "$ovn_dbdir" > > + > > # Check and eventually start ovsdb-server for DB > > if pidfile_is_running $db_pid_file; then > > return > > @@ -177,7 +186,7 @@ $cluster_remote_port > > set ovsdb-server > > set "$@" $log --log-file=$logfile > > set "$@" --remote=punix:$sock --pidfile=$db_pid_file > > - set "$@" --unixctl=ovn${db}_db.ctl > > + set "$@" --unixctl=$ctrl_sock > > > > [ "$OVS_USER" != "" ] && set "$@" --user "$OVS_USER" > > > > @@ -328,7 +337,7 @@ start_northd () { > > > > set "$@" $OVN_NORTHD_LOG $ovn_northd_params > > > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_NORTHD_PRIORITY" > "$OVN_NORTHD_WRAPPER" "$@" > > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon > "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" > > fi > > } > > > > @@ -350,7 +359,7 @@ start_controller () { > > > > [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" > > > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" > "$OVN_CONTROLLER_WRAPPER" "$@" > > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon > "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > > } > > > > start_controller_vtep () { > > @@ -377,7 +386,7 @@ start_controller_vtep () { > > > > [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" > > > > - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" > "$OVN_CONTROLLER_WRAPPER" "$@" > > + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon > "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" > > } > > > > ## ---- ## > > @@ -385,7 +394,7 @@ start_controller_vtep () { > > ## ---- ## > > > > stop_northd () { > > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-northd > > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-northd > > > > if [ ! -e $ovn_northd_db_conf_file ]; then > > if test X"$OVN_MANAGE_OVSDB" = Xyes; then > > @@ -395,11 +404,11 @@ stop_northd () { > > } > > > > stop_controller () { > > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller "$@" > > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller "$@" > > } > > > > stop_controller_vtep () { > > - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller-vtep > > + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller-vtep > > } > > > > ## ------- ## > > @@ -444,11 +453,12 @@ set_defaults () { > > OVN_MANAGE_OVSDB=yes > > > > OVS_RUNDIR=${OVS_RUNDIR:-${rundir}} > > - OVN_RUNDIR=${OVN_RUNDIR:-${OVS_RUNDIR}} > > + OVN_RUNDIR=${OVN_RUNDIR:-${ovn_rundir}} > > > > DB_NB_SOCK=$OVN_RUNDIR/ovnnb_db.sock > > DB_NB_PID=$OVN_RUNDIR/ovnnb_db.pid > > - DB_NB_FILE=$dbdir/ovnnb_db.db > > + DB_NB_CTRL_SOCK=$OVN_RUNDIR/ovnnb_db.ctl > > + DB_NB_FILE=$ovn_dbdir/ovnnb_db.db > > DB_NB_ADDR=0.0.0.0 > > DB_NB_PORT=6641 > > DB_NB_SYNC_FROM_PROTO=tcp > > @@ -457,17 +467,18 @@ set_defaults () { > > > > DB_SB_SOCK=$OVN_RUNDIR/ovnsb_db.sock > > DB_SB_PID=$OVN_RUNDIR/ovnsb_db.pid > > - DB_SB_FILE=$dbdir/ovnsb_db.db > > + DB_SB_CTRL_SOCK=$OVN_RUNDIR/ovnsb_db.ctl > > + DB_SB_FILE=$ovn_dbdir/ovnsb_db.db > > DB_SB_ADDR=0.0.0.0 > > DB_SB_PORT=6642 > > DB_SB_SYNC_FROM_PROTO=tcp > > DB_SB_SYNC_FROM_ADDR= > > DB_SB_SYNC_FROM_PORT=6642 > > > > - DB_NB_SCHEMA=$datadir/ovn-nb.ovsschema > > - DB_SB_SCHEMA=$datadir/ovn-sb.ovsschema > > + DB_NB_SCHEMA=$ovn_datadir/ovn-nb.ovsschema > > + DB_SB_SCHEMA=$ovn_datadir/ovn-sb.ovsschema > > > > - DB_SOCK=$OVN_RUNDIR/db.sock > > + DB_SOCK=$OVS_RUNDIR/db.sock > > DB_CONF_FILE=$dbdir/conf.db > > > > OVN_NORTHD_PRIORITY=-10 > > @@ -483,8 +494,8 @@ set_defaults () { > > OVN_NORTHD_LOGFILE="" > > OVN_NB_LOG="-vconsole:off -vfile:info" > > OVN_SB_LOG="-vconsole:off -vfile:info" > > - OVN_NB_LOGFILE="$logdir/ovsdb-server-nb.log" > > - OVN_SB_LOGFILE="$logdir/ovsdb-server-sb.log" > > + OVN_NB_LOGFILE="$ovn_logdir/ovsdb-server-nb.log" > > + OVN_SB_LOGFILE="$ovn_logdir/ovsdb-server-sb.log" > > > > OVN_CONTROLLER_SSL_KEY="" > > OVN_CONTROLLER_SSL_CERT="" > > @@ -662,14 +673,14 @@ File location options: > > --db-sb-use-remote-in-db=yes|no OVN_Southbound db listen on target > connection table (default: $DB_SB_USE_REMOTE_IN_DB) > > > > Default directories with "configure" option and environment variable > override: > > - logs: /usr/local/var/log/openvswitch (--with-logdir, OVS_LOGDIR) > > - pidfiles and sockets: /usr/local/var/run/openvswitch (--with-rundir, > OVS_RUNDIR) > > - ovn-nb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) > > - ovn-sb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) > > - system configuration: /usr/local/etc (--sysconfdir, OVS_SYSCONFDIR) > > - data files: /usr/local/share/openvswitch (--pkgdatadir, > OVS_PKGDATADIR) > > - user binaries: /usr/local/bin (--bindir, OVS_BINDIR) > > - system binaries: /usr/local/sbin (--sbindir, OVS_SBINDIR) > > + logs: /usr/local/var/log/ovn (--with-logdir, OVN_LOGDIR) > > + pidfiles and sockets: /usr/local/var/run/ovn (--with-rundir, > OVN_RUNDIR) > > + ovn-nb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) > > + ovn-sb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) > > + system configuration: /usr/local/etc (--sysconfdir, OVN_SYSCONFDIR) > > + data files: /usr/local/share/ovn (--pkgdatadir, OVN_PKGDATADIR) > > + user binaries: /usr/local/bin (--bindir, OVN_BINDIR) > > + system binaries: /usr/local/sbin (--sbindir, OVN_SBINDIR) > > EOF > > } > > > > diff --git a/utilities/ovn-ctl.8.xml b/utilities/ovn-ctl.8.xml > > index c5294d794..f70bd6f0f 100644 > > --- a/utilities/ovn-ctl.8.xml > > +++ b/utilities/ovn-ctl.8.xml > > @@ -203,12 +203,12 @@ > > <h3>Starting standalone ovn db server passing SSL certificates</h3> > > <p> > > <code> > > - # ovn-ctl --ovn-nb-db-ssl-key=/etc/openvswitch/ovnnb-privkey.pem > > - --ovn-nb-db-ssl-cert=/etc/openvswitch/ovnnb-cert.pem > > - --ovn-nb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem > > - --ovn-sb-db-ssl-key=/etc/openvswitch/ovnsb-privkey.pem > > - --ovn-sb-db-ssl-cert=/etc/openvswitch/ovnsb-cert.pem > > - --ovn-sb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem > > + # ovn-ctl --ovn-nb-db-ssl-key=/etc/ovn/ovnnb-privkey.pem > > + --ovn-nb-db-ssl-cert=/etc/ovn/ovnnb-cert.pem > > + --ovn-nb-db-ssl-ca-cert=/etc/ovn/cacert.pem > > + --ovn-sb-db-ssl-key=/etc/ovn/ovnsb-privkey.pem > > + --ovn-sb-db-ssl-cert=/etc/ovn/ovnsb-cert.pem > > + --ovn-sb-db-ssl-ca-cert=/etc/ovn/cacert.pem > > start_northd > > </code> > > </p> > > diff --git a/utilities/ovn-lib.in b/utilities/ovn-lib.in > > new file mode 100644 > > index 000000000..50111a76b > > --- /dev/null > > +++ b/utilities/ovn-lib.in > > @@ -0,0 +1,204 @@ > > +# -*- sh -*- > > +# vi:syntax=sh > > +# This is a shell function library sourced by some OVN scripts. > > +# It is not intended to be invoked on its own. > > +# The code copied from ovs/utilities/ovs-lib.in > > + > > +# > > +# 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. > > + > > +## ----------------- ## > > +## configure options ## > > +## ----------------- ## > > + > > +# All of these should be substituted by the Makefile at build time. > > +ovn_logdir=${OVN_LOGDIR-'@LOGDIR@'} # /var/log/ovn > > +ovn_rundir=${OVN_RUNDIR-'@OVN_RUNDIR@'} # /var/run/ovn > > +ovn_sysconfdir=${OVN_SYSCONFDIR-'@sysconfdir@'} # /etc > > +ovn_etcdir=$sysconfdir/ovn # /etc/ovn > > +ovn_datadir=${OVN_PKGDATADIR-'@pkgdatadir@'} # /usr/share/ovn > > +ovn_bindir=${OVN_BINDIR-'@bindir@'} # /usr/bin > > +ovn_sbindir=${OVN_SBINDIR-'@sbindir@'} # /usr/sbin > > + > > +# /etc/ovn or /var/lib/ovn > > +if test X"$OVN_DBDIR" != X; then > > + ovn_dbdir=$OVN_DBDIR > > +elif test X"$OVN_SYSCONFDIR" != X; then > > + ovn_dbdir=$OVN_SYSCONFDIR/ovn > > +else > > + ovn_dbdir='@DBDIR@' > > +fi > > + > > +VERSION='@VERSION@' > > + > > +DAEMON_CWD=/ > > + > > +LC_ALL=C; export LC_ALL > > + > > +ovn_install_dir () { > > + DIR="$1" > > + INSTALL_MODE="${2:-755}" > > + INSTALL_USER="root" > > + INSTALL_GROUP="root" > > + [ "$OVN_USER" != "" ] && INSTALL_USER="${OVN_USER%:*}" > > + [ "${OVN_USER##*:}" != "" ] && INSTALL_GROUP="${OVN_USER##*:}" > > + > > + if test ! -d "$DIR"; then > > + install -d -m "$INSTALL_MODE" -o "$INSTALL_USER" -g > "$INSTALL_GROUP" "$DIR" > > + restorecon "$DIR" >/dev/null 2>&1 > > + fi > > +} > > + > > +start_ovn_daemon () { > > + priority=$1 > > + wrapper=$2 > > + shift; shift > > + daemon=$1 > > + strace="" > > + > > + # drop core files in a sensible place > > + ovn_install_dir "$DAEMON_CWD" > > + set "$@" --no-chdir > > + cd "$DAEMON_CWD" > > + > > + # log file > > + ovn_install_dir "$ovn_logdir" "750" > > + set "$@" --log-file="$ovn_logdir/$daemon.log" > > + > > + # pidfile and monitoring > > + ovn_install_dir "$ovn_rundir" > > + set "$@" --pidfile="$ovn_rundir/$daemon.pid" > > + set "$@" --detach > > + test X"$MONITOR" = Xno || set "$@" --monitor > > + > > + # wrapper > > + case $wrapper in > > + valgrind) > > + if (valgrind --version) > /dev/null 2>&1; then > > + set valgrind -q --leak-check=full --time-stamp=yes \ > > + --log-file="$ovn_logdir/$daemon.valgrind.log.%p" > "$@" > > + else > > + log_failure_msg "valgrind not installed, running > $daemon without it" > > + fi > > + ;; > > + strace) > > + if (strace -V) > /dev/null 2>&1; then > > + strace="strace -tt -T -s 256 -ff" > > + if (strace -DV) > /dev/null 2>&1; then > > + # Has the -D option. > > + set $strace -D -o "$ovn_logdir/$daemon.strace.log" > "$@" > > + strace="" > > + fi > > + else > > + log_failure_msg "strace not installed, running $daemon > without it" > > + fi > > + ;; > > + glibc) > > + set env MALLOC_CHECK_=2 MALLOC_PERTURB_=165 "$@" > > + ;; > > + '') > > + ;; > > + *) > > + log_failure_msg "unknown wrapper $wrapper, running $daemon > without it" > > + ;; > > + esac > > + > > + # priority > > + if test X"$priority" != X; then > > + set nice -n "$priority" "$@" > > + fi > > + > > + action "Starting $daemon" "$@" || return 1 > > + > > + if test X"$strace" != X; then > > + # Strace doesn't have the -D option so we attach after the fact. > > + setsid $strace -o "$ovn_logdir/$daemon.strace.log" \ > > + -p `cat $ovn_rundir/$daemon.pid` > /dev/null 2>&1 & > > + fi > > +} > > + > > +stop_ovn_daemon () { > > + if test -e "$ovn_rundir/$1.pid"; then > > + if pid=`cat "$ovn_rundir/$1.pid"`; then > > + if pid_exists "$pid" >/dev/null 2>&1; then :; else > > + rm -f $ovn_rundir/$1.$pid.ctl $ovn_rundir/$1.$pid > > + return 0 > > + fi > > + > > + graceful="EXIT .1 .25 .65 1" > > + actions="TERM .1 .25 .65 1 1 1 1 \ > > + KILL 1 1 1 2 10 15 30 \ > > + FAIL" > > + version=`ovs-appctl -T 1 -t $ovn_rundir/$1.$pid.ctl version > \ > > + | awk 'NR==1{print $NF}'` > > + > > + # Use `ovs-appctl exit` only if the running daemon version > > + # is >= 2.5.90. This script might be used during upgrade to > > + # stop older versions of daemons which do not behave > correctly > > + # with `ovs-appctl exit` (e.g. ovs-vswitchd <= 2.5.0 deletes > > + # internal ports). > > + if version_geq "$version" "2.5.90"; then > > + actions="$graceful $actions" > > + fi > > + for action in $actions; do > > + if pid_exists "$pid" >/dev/null 2>&1; then :; else > > + return 0 > > + fi > > + case $action in > > + EXIT) > > + action "Exiting $1 ($pid)" \ > > + ${bindir}/ovs-appctl -T 1 -t > $ovn_rundir/$1.$pid.ctl exit $2 > > + ;; > > + TERM) > > + action "Killing $1 ($pid)" kill $pid > > + ;; > > + KILL) > > + action "Killing $1 ($pid) with SIGKILL" kill -9 > $pid > > + ;; > > + FAIL) > > + log_failure_msg "Killing $1 ($pid) failed" > > + return 1 > > + ;; > > + *) > > + sleep $action > > + ;; > > + esac > > + done > > + fi > > + fi > > + log_success_msg "$1 is not running" > > +} > > + > > +ovn_daemon_status () { > > + pidfile=$ovn_rundir/$1.pid > > + if test -e "$pidfile"; then > > + if pid=`cat "$pidfile"`; then > > + if pid_exists "$pid"; then > > + echo "$1 is running with pid $pid" > > + return 0 > > + else > > + echo "Pidfile for $1 ($pidfile) is stale" > > + fi > > + else > > + echo "Pidfile for $1 ($pidfile) exists but cannot be read" > > + fi > > + else > > + echo "$1 is not running" > > + fi > > + return 1 > > +} > > + > > +daemon_is_running () { > > + pidfile=$ovn_rundir/$1.pid > > + test -e "$pidfile" && pid=`cat "$pidfile"` && pid_exists "$pid" && > pid_comm_check $1 $pid > > +} >/dev/null 2>&1 > > > > _______________________________________________ > dev mailing list > dev@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev >
diff --git a/Documentation/intro/install/general.rst b/Documentation/intro/install/general.rst index 99d8fec04..4cc9c4c3a 100644 --- a/Documentation/intro/install/general.rst +++ b/Documentation/intro/install/general.rst @@ -153,17 +153,17 @@ invoke configure without any arguments. For example:: $ ./configure -By default all files are installed under ``/usr/local``. OVN and Open vSwitch -also expects to find its database in ``/usr/local/etc/openvswitch`` by default. +By default all files are installed under ``/usr/local``. OVN expects to find +its database in ``/usr/local/etc/ovn`` by default. If you want to install all files into, e.g., ``/usr`` and ``/var`` instead of -``/usr/local`` and ``/usr/local/var`` and expect to use ``/etc/openvswitch`` as +``/usr/local`` and ``/usr/local/var`` and expect to use ``/etc/ovn`` as the default database directory, add options as shown here:: $ ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc .. note:: - Open vSwitch and OVN installed with packages like .rpm (e.g. via + OVN installed with packages like .rpm (e.g. via ``yum install`` or ``rpm -ivh``) and .deb (e.g. via ``apt-get install`` or ``dpkg -i``) use the above configure options. @@ -319,9 +319,13 @@ and stopping ovn-northd, ovn-controller and ovsdb-servers. After installation, the daemons can be started by using the ovn-ctl utility. This will take care to setup initial conditions, and start the daemons in the correct order. The ovn-ctl utility is located in '$(pkgdatadir)/scripts', and defaults to -'/usr/local/share/openvswitch/scripts'. An example after install might be:: +'/usr/local/share/ovn/scripts'. ovn-ctl utility requires the 'ovs-lib' +helper shell script which is present in '/usr/local/share/openvswitch/scripts'. +So invoking ovn-ctl as "./ovn-ctl" will fail. - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts +An example after install might be:: + + $ export PATH=$PATH:/usr/local/share/ovn/scripts $ ovn-ctl start_northd $ ovn-ctl start_controller @@ -331,7 +335,7 @@ Starting OVN Central services OVN central services includes ovn-northd, Northbound and Southbound ovsdb-server. - $ export PATH=$PATH:/usr/local/share/openvswitch/scripts + $ export PATH=$PATH:/usr/local/share/ovn/scripts $ ovn-ctl start_northd Refer to ovn-ctl(8) for more information and the supported options. @@ -341,23 +345,23 @@ Before starting ovn-northd you need to start OVN Northbound and Southbound ovsdb-servers. Before ovsdb-servers can be started, configure the Northbound and Southbound databases:: - $ mkdir -p /usr/local/etc/openvswitch - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnnb_db.db \ + $ mkdir -p /usr/local/etc/ovn + $ ovsdb-tool create /usr/local/etc/ovn/ovnnb_db.db \ ovn-nb.ovsschema - $ ovsdb-tool create /usr/local/etc/openvswitch/ovnsb_db.db \ + $ ovsdb-tool create /usr/local/etc/ovn/ovnsb_db.db \ ovn-sb.ovsschema Configure ovsdb-servers to use databases created above, to listen on a Unix domain socket and to use the SSL configuration in the database:: - $ mkdir -p /usr/local/var/run/openvswitch - $ ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/ovnnb_db.sock \ + $ mkdir -p /usr/local/var/run/ovn + $ ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnnb_db.sock \ --remote=db:OVN_Northbound,NB_Global,connections \ --private-key=db:OVN_Northbound,SSL,private_key \ --certificate=db:OVN_Northbound,SSL,certificate \ --bootstrap-ca-cert=db:OVN_Northbound,SSL,ca_cert \ --pidfile --detach --log-file - $ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/ovnsb_db.sock \ + $ovsdb-server --remote=punix:/usr/local/var/run/ovn/ovnsb_db.sock \ --remote=db:OVN_Southbound,SB_Global,connections \ --private-key=db:OVN_Southbound,SSL,private_key \ --certificate=db:OVN_Southbound,SSL,certificate \ diff --git a/Makefile.am b/Makefile.am index f886a8e63..6447e348b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -177,6 +177,7 @@ SUFFIXES += .in -e 's,[@]DBDIR[@],$(DBDIR),g' \ -e 's,[@]PYTHON[@],$(PYTHON),g' \ -e 's,[@]RUNDIR[@],$(RUNDIR),g' \ + -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \ -e 's,[@]VERSION[@],$(VERSION),g' \ -e 's,[@]localstatedir[@],$(localstatedir),g' \ -e 's,[@]pkgdatadir[@],$(pkgdatadir),g' \ @@ -202,6 +203,7 @@ SUFFIXES += .xml DBDIR='$(DBDIR)' \ PYTHON='$(PYTHON)' \ RUNDIR='$(RUNDIR)' \ + OVN_RUNDIR='$(OVN_RUNDIR)' \ VERSION='$(VERSION)' \ localstatedir='$(localstatedir)' \ pkgdatadir='$(pkgdatadir)' \ @@ -502,6 +504,9 @@ ALL_LOCAL += ovn-sb.ovsschema.stamp ovn-sb.ovsschema.stamp: ovn-sb.ovsschema $(srcdir)/build-aux/cksum-schema-check $? $@ +pkgdata_DATA += ovn-nb.ovsschema +pkgdata_DATA += ovn-sb.ovsschema + CLEANFILES += ovn-sb.ovsschema.stamp include Documentation/automake.mk diff --git a/configure.ac b/configure.ac index 8a32d3a18..c74b17a1d 100644 --- a/configure.ac +++ b/configure.ac @@ -123,6 +123,7 @@ AC_CHECK_HEADERS([net/if_mib.h], [], [], [[#include <sys/types.h> OVS_CHECK_PKIDIR OVS_CHECK_RUNDIR +OVN_CHECK_RUNDIR OVS_CHECK_DBDIR OVS_CHECK_BACKTRACE OVS_CHECK_PERF_EVENT diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index 86f29accf..e27b56b2b 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -1715,7 +1715,9 @@ main(int argc, char *argv[]) daemonize_start(false); - retval = unixctl_server_create(NULL, &unixctl); + char *abs_unixctl_path = get_abs_unix_ctl_path(); + retval = unixctl_server_create(abs_unixctl_path, &unixctl); + free(abs_unixctl_path); if (retval) { exit(EXIT_FAILURE); } diff --git a/lib/.gitignore b/lib/.gitignore index a80a1bce1..3eed4588b 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -5,3 +5,4 @@ /ovn-sb-idl.c /ovn-sb-idl.h /ovn-sb-idl.ovsidl +/ovn-dirs.c diff --git a/lib/automake.mk b/lib/automake.mk index 8e7a1a937..2ee14a261 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -9,6 +9,7 @@ lib_libovn_la_SOURCES = \ lib/actions.c \ lib/chassis-index.c \ lib/chassis-index.h \ + lib/ovn-dirs.h \ lib/expr.c \ lib/extend-table.h \ lib/extend-table.c \ @@ -24,17 +25,36 @@ lib_libovn_la_SOURCES = \ lib/inc-proc-eng.c \ lib/inc-proc-eng.h nodist_lib_libovn_la_SOURCES = \ + lib/ovn-dirs.c \ lib/ovn-nb-idl.c \ lib/ovn-nb-idl.h \ lib/ovn-sb-idl.c \ lib/ovn-sb-idl.h +CLEANFILES += $(nodist_lib_libovn_la_SOURCES) + # ovn-sb IDL OVSIDL_BUILT += \ lib/ovn-sb-idl.c \ lib/ovn-sb-idl.h \ lib/ovn-sb-idl.ovsidl -EXTRA_DIST += lib/ovn-sb-idl.ann +EXTRA_DIST += \ + lib/ovn-sb-idl.ann \ + lib/ovn-dirs.c.in + +lib/ovn-dirs.c: lib/ovn-dirs.c.in Makefile + $(AM_V_GEN)($(ro_c) && sed < $(srcdir)/lib/ovn-dirs.c.in \ + -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]LOGDIR[@],"$(LOGDIR)",g' \ + -e 's,[@]RUNDIR[@],"$(RUNDIR)",g' \ + -e 's,[@]OVN_RUNDIR[@],"$(OVN_RUNDIR)",g' \ + -e 's,[@]DBDIR[@],"$(DBDIR)",g' \ + -e 's,[@]bindir[@],"$(bindir)",g' \ + -e 's,[@]sysconfdir[@],"$(sysconfdir)",g' \ + -e 's,[@]pkgdatadir[@],"$(pkgdatadir)",g') \ + > lib/ovn-dirs.c.tmp && \ + mv lib/ovn-dirs.c.tmp lib/ovn-dirs.c + OVN_SB_IDL_FILES = \ $(srcdir)/ovn-sb.ovsschema \ $(srcdir)/lib/ovn-sb-idl.ann diff --git a/lib/ovn-dirs.c.in b/lib/ovn-dirs.c.in new file mode 100644 index 000000000..7ed1e3018 --- /dev/null +++ b/lib/ovn-dirs.c.in @@ -0,0 +1,112 @@ +#line 2 "@srcdir@/lib/dirs.c.in" +/* + * Copyright (c) 2019 + * + * 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 <config.h> +#include "ovn-dirs.h" +#include <stdlib.h> +#include "lib/ovs-thread.h" +#include "lib/util.h" + +struct directory { + const char *value; /* Actual value; NULL if not yet determined. */ + const char *default_value; /* Default value. */ + const char *var_name; /* Environment variable to override default. */ + struct ovsthread_once once; /* Ensures 'value' gets initialized once. */ +}; + +static const char * +get_dir(struct directory *d) +{ + if (ovsthread_once_start(&d->once)) { + d->value = getenv(d->var_name); + if (!d->value || !d->value[0]) { + d->value = d->default_value; + } + ovsthread_once_done(&d->once); + } + return d->value; +} + +const char * +ovn_sysconfdir(void) +{ + static struct directory d = { + NULL, @sysconfdir@, "OVN_SYSCONFDIR", OVSTHREAD_ONCE_INITIALIZER + }; + + return get_dir(&d); +} + +const char * +ovn_pkgdatadir(void) +{ + static struct directory d = { + NULL, @pkgdatadir@, "OVN_PKGDATADIR", OVSTHREAD_ONCE_INITIALIZER + }; + + return get_dir(&d); +} + +const char * +ovn_rundir(void) +{ + static struct directory d = { + NULL, @OVN_RUNDIR@, "OVN_RUNDIR", OVSTHREAD_ONCE_INITIALIZER + }; + + return get_dir(&d); +} + +const char * +ovn_logdir(void) +{ + static struct directory d = { + NULL, @LOGDIR@, "OVN_LOGDIR", OVSTHREAD_ONCE_INITIALIZER + }; + + return get_dir(&d); +} + +const char * +ovn_dbdir(void) +{ + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; + static const char *dbdir; + + if (ovsthread_once_start(&once)) { + dbdir = getenv("OVN_DBDIR"); + if (!dbdir || !dbdir[0]) { + char *sysconfdir = getenv("OVN_SYSCONFDIR"); + + dbdir = (sysconfdir + ? xasprintf("%s/ovn", sysconfdir) + : @DBDIR@); + } + ovsthread_once_done(&once); + } + return dbdir; +} + +const char * +ovn_bindir(void) +{ + static struct directory d = { + NULL, @bindir@, "OVN_BINDIR", OVSTHREAD_ONCE_INITIALIZER + }; + + return get_dir(&d); +} diff --git a/lib/ovn-dirs.h b/lib/ovn-dirs.h new file mode 100644 index 000000000..22ff7a1ee --- /dev/null +++ b/lib/ovn-dirs.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2019. + * + * 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_DIRS_H +#define OVN_DIRS_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +const char *ovn_sysconfdir(void); /* /usr/local/etc */ +const char *ovn_pkgdatadir(void); /* /usr/local/share/ovn */ +const char *ovn_rundir(void); /* /usr/local/var/run/ovn */ +const char *ovn_logdir(void); /* /usr/local/var/log/ovn */ +const char *ovn_dbdir(void); /* /usr/local/etc/ovn */ +const char *ovn_bindir(void); /* /usr/local/bin */ + +#ifdef __cplusplus +} +#endif + +#endif /* OVN_DIRS_H */ diff --git a/lib/ovn-util.c b/lib/ovn-util.c index 085498fd1..b425f3f2d 100644 --- a/lib/ovn-util.c +++ b/lib/ovn-util.c @@ -13,8 +13,10 @@ */ #include <config.h> +#include <unistd.h> + #include "ovn-util.h" -#include "dirs.h" +#include "ovn-dirs.h" #include "openvswitch/vlog.h" #include "ovn-nb-idl.h" #include "ovn-sb-idl.h" @@ -296,7 +298,7 @@ default_nb_db(void) if (!def) { def = getenv("OVN_NB_DB"); if (!def) { - def = xasprintf("unix:%s/ovnnb_db.sock", ovs_rundir()); + def = xasprintf("unix:%s/ovnnb_db.sock", ovn_rundir()); } } return def; @@ -309,12 +311,28 @@ default_sb_db(void) if (!def) { def = getenv("OVN_SB_DB"); if (!def) { - def = xasprintf("unix:%s/ovnsb_db.sock", ovs_rundir()); + def = xasprintf("unix:%s/ovnsb_db.sock", ovn_rundir()); } } return def; } +char * +get_abs_unix_ctl_path(void) +{ +#ifdef _WIN32 + enum { WINDOWS = 1 }; +#else + enum { WINDOWS = 0 }; +#endif + + long int pid = getpid(); + char *abs_path = + WINDOWS ? xasprintf("%s/%s.ctl", ovn_rundir(), program_name) + : xasprintf("%s/%s.%ld.ctl", ovn_rundir(), program_name, pid); + return abs_path; +} + /* l3gateway, chassisredirect, and patch * are not in this list since they are * only set in the SB DB by northd diff --git a/lib/ovn-util.h b/lib/ovn-util.h index 6d5e1dfb5..fcd93cd82 100644 --- a/lib/ovn-util.h +++ b/lib/ovn-util.h @@ -67,6 +67,7 @@ char *alloc_nat_zone_key(const struct uuid *key, const char *type); const char *default_nb_db(void); const char *default_sb_db(void); +char *get_abs_unix_ctl_path(void); struct ovsdb_idl_table_class; const char *db_table_usage(struct ds *tables, diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4 index b599f17d7..964512795 100644 --- a/m4/openvswitch.m4 +++ b/m4/openvswitch.m4 @@ -330,6 +330,17 @@ AC_DEFUN([OVS_CHECK_RUNDIR], [RUNDIR='${localstatedir}/run/openvswitch']) AC_SUBST([RUNDIR])]) +dnl Checks for the directory in which to store pidfiles. +AC_DEFUN([OVN_CHECK_RUNDIR], + [AC_ARG_WITH( + [rundir], + AC_HELP_STRING([--with-ovn-rundir=DIR], + [directory used for pidfiles + [[LOCALSTATEDIR/run/ovn]]]), + [OVN_RUNDIR=$withval], + [OVN_RUNDIR='${localstatedir}/run/ovn']) + AC_SUBST([OVN_RUNDIR])]) + dnl Checks for the directory in which to store logs. AC_DEFUN([OVS_CHECK_LOGDIR], [AC_ARG_WITH( diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c index e86134414..b527f2172 100644 --- a/northd/ovn-northd.c +++ b/northd/ovn-northd.c @@ -9351,7 +9351,14 @@ main(int argc, char *argv[]) daemonize_start(false); - retval = unixctl_server_create(unixctl_path, &unixctl); + if (!unixctl_path) { + char *abs_unixctl_path = get_abs_unix_ctl_path(); + retval = unixctl_server_create(abs_unixctl_path, &unixctl); + free(abs_unixctl_path); + } else { + retval = unixctl_server_create(unixctl_path, &unixctl); + } + if (retval) { exit(EXIT_FAILURE); } diff --git a/tests/ovs-macros.at b/tests/ovs-macros.at index 10593429d..b2e619f76 100644 --- a/tests/ovs-macros.at +++ b/tests/ovs-macros.at @@ -49,6 +49,7 @@ ovs_setenv() { sandbox=$1 ovs_dir=$ovs_base${1:+/$1} OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR + OVN_RUNDIR=$ovs_dir; export OVN_RUNDIR OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR OVS_DBDIR=$ovs_dir; export OVS_DBDIR OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR diff --git a/tutorial/ovs-sandbox b/tutorial/ovs-sandbox index 47032b499..7546d27ca 100755 --- a/tutorial/ovs-sandbox +++ b/tutorial/ovs-sandbox @@ -360,6 +360,7 @@ sandbox=`cd sandbox && pwd` # Set up environment for OVS programs to sandbox themselves. OVS_RUNDIR=$sandbox; export OVS_RUNDIR +OVN_RUNDIR=$sandbox; export OVN_RUNDIR OVS_LOGDIR=$sandbox; export OVS_LOGDIR OVS_DBDIR=$sandbox; export OVS_DBDIR OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR diff --git a/utilities/automake.mk b/utilities/automake.mk index d666b9661..db0b0e051 100644 --- a/utilities/automake.mk +++ b/utilities/automake.mk @@ -1,6 +1,7 @@ scripts_SCRIPTS += \ utilities/ovn-ctl \ utilities/ovndb-servers.ocf +scripts_DATA += utilities/ovn-lib man_MANS += \ utilities/ovn-ctl.8 \ @@ -21,6 +22,7 @@ bin_SCRIPTS += \ EXTRA_DIST += \ utilities/ovn-ctl \ + utilities/ovn-lib.in \ utilities/ovn-ctl.8.xml \ utilities/ovn-docker-overlay-driver.in \ utilities/ovn-docker-underlay-driver.in \ @@ -31,6 +33,7 @@ EXTRA_DIST += \ CLEANFILES += \ utilities/ovn-ctl.8 \ + utilities/ovn-lib \ utilities/ovn-docker-overlay-driver \ utilities/ovn-docker-underlay-driver \ utilities/ovn-nbctl.8 \ @@ -39,6 +42,8 @@ CLEANFILES += \ utilities/ovn-detrace.1 \ utilities/ovn-detrace +utilities/ovn-lib: $(top_builddir)/config.status + # ovn-nbctl bin_PROGRAMS += utilities/ovn-nbctl utilities_ovn_nbctl_SOURCES = utilities/ovn-nbctl.c diff --git a/utilities/ovn-ctl b/utilities/ovn-ctl index 7e5cd469c..a973b09a2 100755 --- a/utilities/ovn-ctl +++ b/utilities/ovn-ctl @@ -13,12 +13,16 @@ # limitations under the License. case $0 in - */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;; + */*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` + ovsdir=`echo "$dir0" | sed 's,/ovn/scripts,,'` + ovsdir=$ovsdir/openvswitch/scripts + ;; *) dir0=./ ;; esac -. "$dir0/ovs-lib" || exit 1 +. "$dir0/ovn-lib" || exit 1 +. "$ovsdir/ovs-lib" || exit 1 -for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do +for dir in "$sbindir" "$ovn_bindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do case :$PATH: in *:$dir:*) ;; *) PATH=$PATH:$dir ;; @@ -26,9 +30,9 @@ for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do done -ovnnb_active_conf_file="$etcdir/ovnnb-active.conf" -ovnsb_active_conf_file="$etcdir/ovnsb-active.conf" -ovn_northd_db_conf_file="$etcdir/ovn-northd-db-params.conf" +ovnnb_active_conf_file="$ovn_etcdir/ovnnb-active.conf" +ovnsb_active_conf_file="$ovn_etcdir/ovnsb-active.conf" +ovn_northd_db_conf_file="$ovn_etcdir/ovn-northd-db-params.conf" ## ----- ## ## start ## ## ----- ## @@ -110,6 +114,7 @@ start_ovsdb__() { local logfile local log local sock + local ctrl_sock local detach local create_insecure_remote local port @@ -134,6 +139,7 @@ start_ovsdb__() { eval logfile=\$OVN_${DB}_LOGFILE eval log=\$OVN_${DB}_LOG eval sock=\$DB_${DB}_SOCK + eval ctrl_sock=\$DB_${DB}_CTRL_SOCK eval detach=\$DB_${DB}_DETACH eval create_insecure_remote=\$DB_${DB}_CREATE_INSECURE_REMOTE eval port=\$DB_${DB}_PORT @@ -144,7 +150,10 @@ start_ovsdb__() { eval ovn_db_ssl_cert=\$OVN_${DB}_DB_SSL_CERT eval ovn_db_ssl_cacert=\$OVN_${DB}_DB_SSL_CA_CERT - install_dir "$OVN_RUNDIR" + ovn_install_dir "$OVN_RUNDIR" + ovn_install_dir "$ovn_logdir" + ovn_install_dir "$ovn_dbdir" + # Check and eventually start ovsdb-server for DB if pidfile_is_running $db_pid_file; then return @@ -177,7 +186,7 @@ $cluster_remote_port set ovsdb-server set "$@" $log --log-file=$logfile set "$@" --remote=punix:$sock --pidfile=$db_pid_file - set "$@" --unixctl=ovn${db}_db.ctl + set "$@" --unixctl=$ctrl_sock [ "$OVS_USER" != "" ] && set "$@" --user "$OVS_USER" @@ -328,7 +337,7 @@ start_northd () { set "$@" $OVN_NORTHD_LOG $ovn_northd_params - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@" fi } @@ -350,7 +359,7 @@ start_controller () { [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" } start_controller_vtep () { @@ -377,7 +386,7 @@ start_controller_vtep () { [ "$OVN_USER" != "" ] && set "$@" --user "$OVN_USER" - OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" + OVS_RUNDIR=${OVS_RUNDIR} start_ovn_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@" } ## ---- ## @@ -385,7 +394,7 @@ start_controller_vtep () { ## ---- ## stop_northd () { - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-northd + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-northd if [ ! -e $ovn_northd_db_conf_file ]; then if test X"$OVN_MANAGE_OVSDB" = Xyes; then @@ -395,11 +404,11 @@ stop_northd () { } stop_controller () { - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller "$@" + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller "$@" } stop_controller_vtep () { - OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller-vtep + OVS_RUNDIR=${OVS_RUNDIR} stop_ovn_daemon ovn-controller-vtep } ## ------- ## @@ -444,11 +453,12 @@ set_defaults () { OVN_MANAGE_OVSDB=yes OVS_RUNDIR=${OVS_RUNDIR:-${rundir}} - OVN_RUNDIR=${OVN_RUNDIR:-${OVS_RUNDIR}} + OVN_RUNDIR=${OVN_RUNDIR:-${ovn_rundir}} DB_NB_SOCK=$OVN_RUNDIR/ovnnb_db.sock DB_NB_PID=$OVN_RUNDIR/ovnnb_db.pid - DB_NB_FILE=$dbdir/ovnnb_db.db + DB_NB_CTRL_SOCK=$OVN_RUNDIR/ovnnb_db.ctl + DB_NB_FILE=$ovn_dbdir/ovnnb_db.db DB_NB_ADDR=0.0.0.0 DB_NB_PORT=6641 DB_NB_SYNC_FROM_PROTO=tcp @@ -457,17 +467,18 @@ set_defaults () { DB_SB_SOCK=$OVN_RUNDIR/ovnsb_db.sock DB_SB_PID=$OVN_RUNDIR/ovnsb_db.pid - DB_SB_FILE=$dbdir/ovnsb_db.db + DB_SB_CTRL_SOCK=$OVN_RUNDIR/ovnsb_db.ctl + DB_SB_FILE=$ovn_dbdir/ovnsb_db.db DB_SB_ADDR=0.0.0.0 DB_SB_PORT=6642 DB_SB_SYNC_FROM_PROTO=tcp DB_SB_SYNC_FROM_ADDR= DB_SB_SYNC_FROM_PORT=6642 - DB_NB_SCHEMA=$datadir/ovn-nb.ovsschema - DB_SB_SCHEMA=$datadir/ovn-sb.ovsschema + DB_NB_SCHEMA=$ovn_datadir/ovn-nb.ovsschema + DB_SB_SCHEMA=$ovn_datadir/ovn-sb.ovsschema - DB_SOCK=$OVN_RUNDIR/db.sock + DB_SOCK=$OVS_RUNDIR/db.sock DB_CONF_FILE=$dbdir/conf.db OVN_NORTHD_PRIORITY=-10 @@ -483,8 +494,8 @@ set_defaults () { OVN_NORTHD_LOGFILE="" OVN_NB_LOG="-vconsole:off -vfile:info" OVN_SB_LOG="-vconsole:off -vfile:info" - OVN_NB_LOGFILE="$logdir/ovsdb-server-nb.log" - OVN_SB_LOGFILE="$logdir/ovsdb-server-sb.log" + OVN_NB_LOGFILE="$ovn_logdir/ovsdb-server-nb.log" + OVN_SB_LOGFILE="$ovn_logdir/ovsdb-server-sb.log" OVN_CONTROLLER_SSL_KEY="" OVN_CONTROLLER_SSL_CERT="" @@ -662,14 +673,14 @@ File location options: --db-sb-use-remote-in-db=yes|no OVN_Southbound db listen on target connection table (default: $DB_SB_USE_REMOTE_IN_DB) Default directories with "configure" option and environment variable override: - logs: /usr/local/var/log/openvswitch (--with-logdir, OVS_LOGDIR) - pidfiles and sockets: /usr/local/var/run/openvswitch (--with-rundir, OVS_RUNDIR) - ovn-nb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) - ovn-sb.db: /usr/local/etc/openvswitch (--with-dbdir, OVS_DBDIR) - system configuration: /usr/local/etc (--sysconfdir, OVS_SYSCONFDIR) - data files: /usr/local/share/openvswitch (--pkgdatadir, OVS_PKGDATADIR) - user binaries: /usr/local/bin (--bindir, OVS_BINDIR) - system binaries: /usr/local/sbin (--sbindir, OVS_SBINDIR) + logs: /usr/local/var/log/ovn (--with-logdir, OVN_LOGDIR) + pidfiles and sockets: /usr/local/var/run/ovn (--with-rundir, OVN_RUNDIR) + ovn-nb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) + ovn-sb.db: /usr/local/etc/ovn (--with-dbdir, OVN_DBDIR) + system configuration: /usr/local/etc (--sysconfdir, OVN_SYSCONFDIR) + data files: /usr/local/share/ovn (--pkgdatadir, OVN_PKGDATADIR) + user binaries: /usr/local/bin (--bindir, OVN_BINDIR) + system binaries: /usr/local/sbin (--sbindir, OVN_SBINDIR) EOF } diff --git a/utilities/ovn-ctl.8.xml b/utilities/ovn-ctl.8.xml index c5294d794..f70bd6f0f 100644 --- a/utilities/ovn-ctl.8.xml +++ b/utilities/ovn-ctl.8.xml @@ -203,12 +203,12 @@ <h3>Starting standalone ovn db server passing SSL certificates</h3> <p> <code> - # ovn-ctl --ovn-nb-db-ssl-key=/etc/openvswitch/ovnnb-privkey.pem - --ovn-nb-db-ssl-cert=/etc/openvswitch/ovnnb-cert.pem - --ovn-nb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem - --ovn-sb-db-ssl-key=/etc/openvswitch/ovnsb-privkey.pem - --ovn-sb-db-ssl-cert=/etc/openvswitch/ovnsb-cert.pem - --ovn-sb-db-ssl-ca-cert=/etc/openvswitch/cacert.pem + # ovn-ctl --ovn-nb-db-ssl-key=/etc/ovn/ovnnb-privkey.pem + --ovn-nb-db-ssl-cert=/etc/ovn/ovnnb-cert.pem + --ovn-nb-db-ssl-ca-cert=/etc/ovn/cacert.pem + --ovn-sb-db-ssl-key=/etc/ovn/ovnsb-privkey.pem + --ovn-sb-db-ssl-cert=/etc/ovn/ovnsb-cert.pem + --ovn-sb-db-ssl-ca-cert=/etc/ovn/cacert.pem start_northd </code> </p> diff --git a/utilities/ovn-lib.in b/utilities/ovn-lib.in new file mode 100644 index 000000000..50111a76b --- /dev/null +++ b/utilities/ovn-lib.in @@ -0,0 +1,204 @@ +# -*- sh -*- +# vi:syntax=sh +# This is a shell function library sourced by some OVN scripts. +# It is not intended to be invoked on its own. +# The code copied from ovs/utilities/ovs-lib.in + +# +# 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. + +## ----------------- ## +## configure options ## +## ----------------- ## + +# All of these should be substituted by the Makefile at build time. +ovn_logdir=${OVN_LOGDIR-'@LOGDIR@'} # /var/log/ovn +ovn_rundir=${OVN_RUNDIR-'@OVN_RUNDIR@'} # /var/run/ovn +ovn_sysconfdir=${OVN_SYSCONFDIR-'@sysconfdir@'} # /etc +ovn_etcdir=$sysconfdir/ovn # /etc/ovn +ovn_datadir=${OVN_PKGDATADIR-'@pkgdatadir@'} # /usr/share/ovn +ovn_bindir=${OVN_BINDIR-'@bindir@'} # /usr/bin +ovn_sbindir=${OVN_SBINDIR-'@sbindir@'} # /usr/sbin + +# /etc/ovn or /var/lib/ovn +if test X"$OVN_DBDIR" != X; then + ovn_dbdir=$OVN_DBDIR +elif test X"$OVN_SYSCONFDIR" != X; then + ovn_dbdir=$OVN_SYSCONFDIR/ovn +else + ovn_dbdir='@DBDIR@' +fi + +VERSION='@VERSION@' + +DAEMON_CWD=/ + +LC_ALL=C; export LC_ALL + +ovn_install_dir () { + DIR="$1" + INSTALL_MODE="${2:-755}" + INSTALL_USER="root" + INSTALL_GROUP="root" + [ "$OVN_USER" != "" ] && INSTALL_USER="${OVN_USER%:*}" + [ "${OVN_USER##*:}" != "" ] && INSTALL_GROUP="${OVN_USER##*:}" + + if test ! -d "$DIR"; then + install -d -m "$INSTALL_MODE" -o "$INSTALL_USER" -g "$INSTALL_GROUP" "$DIR" + restorecon "$DIR" >/dev/null 2>&1 + fi +} + +start_ovn_daemon () { + priority=$1 + wrapper=$2 + shift; shift + daemon=$1 + strace="" + + # drop core files in a sensible place + ovn_install_dir "$DAEMON_CWD" + set "$@" --no-chdir + cd "$DAEMON_CWD" + + # log file + ovn_install_dir "$ovn_logdir" "750" + set "$@" --log-file="$ovn_logdir/$daemon.log" + + # pidfile and monitoring + ovn_install_dir "$ovn_rundir" + set "$@" --pidfile="$ovn_rundir/$daemon.pid" + set "$@" --detach + test X"$MONITOR" = Xno || set "$@" --monitor + + # wrapper + case $wrapper in + valgrind) + if (valgrind --version) > /dev/null 2>&1; then + set valgrind -q --leak-check=full --time-stamp=yes \ + --log-file="$ovn_logdir/$daemon.valgrind.log.%p" "$@" + else + log_failure_msg "valgrind not installed, running $daemon without it" + fi + ;; + strace) + if (strace -V) > /dev/null 2>&1; then + strace="strace -tt -T -s 256 -ff" + if (strace -DV) > /dev/null 2>&1; then + # Has the -D option. + set $strace -D -o "$ovn_logdir/$daemon.strace.log" "$@" + strace="" + fi + else + log_failure_msg "strace not installed, running $daemon without it" + fi + ;; + glibc) + set env MALLOC_CHECK_=2 MALLOC_PERTURB_=165 "$@" + ;; + '') + ;; + *) + log_failure_msg "unknown wrapper $wrapper, running $daemon without it" + ;; + esac + + # priority + if test X"$priority" != X; then + set nice -n "$priority" "$@" + fi + + action "Starting $daemon" "$@" || return 1 + + if test X"$strace" != X; then + # Strace doesn't have the -D option so we attach after the fact. + setsid $strace -o "$ovn_logdir/$daemon.strace.log" \ + -p `cat $ovn_rundir/$daemon.pid` > /dev/null 2>&1 & + fi +} + +stop_ovn_daemon () { + if test -e "$ovn_rundir/$1.pid"; then + if pid=`cat "$ovn_rundir/$1.pid"`; then + if pid_exists "$pid" >/dev/null 2>&1; then :; else + rm -f $ovn_rundir/$1.$pid.ctl $ovn_rundir/$1.$pid + return 0 + fi + + graceful="EXIT .1 .25 .65 1" + actions="TERM .1 .25 .65 1 1 1 1 \ + KILL 1 1 1 2 10 15 30 \ + FAIL" + version=`ovs-appctl -T 1 -t $ovn_rundir/$1.$pid.ctl version \ + | awk 'NR==1{print $NF}'` + + # Use `ovs-appctl exit` only if the running daemon version + # is >= 2.5.90. This script might be used during upgrade to + # stop older versions of daemons which do not behave correctly + # with `ovs-appctl exit` (e.g. ovs-vswitchd <= 2.5.0 deletes + # internal ports). + if version_geq "$version" "2.5.90"; then + actions="$graceful $actions" + fi + for action in $actions; do + if pid_exists "$pid" >/dev/null 2>&1; then :; else + return 0 + fi + case $action in + EXIT) + action "Exiting $1 ($pid)" \ + ${bindir}/ovs-appctl -T 1 -t $ovn_rundir/$1.$pid.ctl exit $2 + ;; + TERM) + action "Killing $1 ($pid)" kill $pid + ;; + KILL) + action "Killing $1 ($pid) with SIGKILL" kill -9 $pid + ;; + FAIL) + log_failure_msg "Killing $1 ($pid) failed" + return 1 + ;; + *) + sleep $action + ;; + esac + done + fi + fi + log_success_msg "$1 is not running" +} + +ovn_daemon_status () { + pidfile=$ovn_rundir/$1.pid + if test -e "$pidfile"; then + if pid=`cat "$pidfile"`; then + if pid_exists "$pid"; then + echo "$1 is running with pid $pid" + return 0 + else + echo "Pidfile for $1 ($pidfile) is stale" + fi + else + echo "Pidfile for $1 ($pidfile) exists but cannot be read" + fi + else + echo "$1 is not running" + fi + return 1 +} + +daemon_is_running () { + pidfile=$ovn_rundir/$1.pid + test -e "$pidfile" && pid=`cat "$pidfile"` && pid_exists "$pid" && pid_comm_check $1 $pid +} >/dev/null 2>&1