Skip to content

Commit

Permalink
ovn: Add ovn-ctl to assist with OVN daemon lifecycle.
Browse files Browse the repository at this point in the history
This patch introduces ovn-ctl, which is similar to ovs-ctl.  I opted
for a new script as everything in OVN so far is nicely isolated, so a
new script seemed to make the most sense.

If you'd like to run ovn-controller on a host already running ovs:

    # ovn-ctl start_controller

If you'd like to run ovn-northd:

    # ovn-ctl start_northd

Note that ovn-ctl assumes that ovn-northd is running on the same
server as ovsdb-server hosting the OVN databases.  Based on the
current architecture this seems like a completely reasonable
assumption.  This can be improved later when needed.

There's some additional stuff happening in start_northd to make the
experience nicer and not require additional steps by the
administrator.  It creates the OVN dbs if they don't exist.  If
ovsdb-server hasn't loaded them, it tells it to load them, as well.

ovn-ctl also supports running everything on the same host.  This would
be common in a test environment with a single host or small set of
hosts.  That would simply be:

    # ovs-ctl start --system-id=random
    # ovn-ctl start_northd
    # ovn-ctl start_controller

Signed-off-by: Russell Bryant <rbryant@redhat.com>
CC: Flavio Leitner <fbl@redhat.com>
CC: Ben Pfaff <blp@nicira.com>
[blp@nicira.com added configure.ac code to create ovn/utilities builddir]
Signed-off-by: Ben Pfaff <blp@nicira.com>
  • Loading branch information
russellb authored and blp committed Jun 15, 2015
1 parent 6ad8ce8 commit 43d3e69
Show file tree
Hide file tree
Showing 6 changed files with 317 additions and 0 deletions.
1 change: 1 addition & 0 deletions configure.ac
Expand Up @@ -186,6 +186,7 @@ AC_CONFIG_COMMANDS([include/openflow/openflow.h.stamp])

AC_CONFIG_COMMANDS([utilities/bugtool/dummy], [:])
AC_CONFIG_COMMANDS([ovn/dummy], [:])
AC_CONFIG_COMMANDS([ovn/utilities/dummy], [:])

m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES])

Expand Down
1 change: 1 addition & 0 deletions ovn/automake.mk
Expand Up @@ -86,3 +86,4 @@ ovn_ovn_nbctl_LDADD = ovn/lib/libovn.la ovsdb/libovsdb.la lib/libopenvswitch.la
include ovn/controller/automake.mk
include ovn/lib/automake.mk
include ovn/northd/automake.mk
include ovn/utilities/automake.mk
1 change: 1 addition & 0 deletions ovn/utilities/.gitignore
@@ -0,0 +1 @@
/ovn-ctl.8
9 changes: 9 additions & 0 deletions ovn/utilities/automake.mk
@@ -0,0 +1,9 @@
scripts_SCRIPTS += \
ovn/utilities/ovn-ctl

man_MANS += \
ovn/utilities/ovn-ctl.8

EXTRA_DIST += \
ovn/utilities/ovn-ctl \
ovn/utilities/ovn-ctl.8.xml
255 changes: 255 additions & 0 deletions ovn/utilities/ovn-ctl
@@ -0,0 +1,255 @@
#!/bin/sh
#
# 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.

case $0 in
*/*) dir0=`echo "$0" | sed 's,/[^/]*$,,'` ;;
*) dir0=./ ;;
esac
. "$dir0/ovs-lib" || exit 1

for dir in "$sbindir" "$bindir" /sbin /bin /usr/sbin /usr/bin; do
case :$PATH: in
*:$dir:*) ;;
*) PATH=$PATH:$dir ;;
esac
done


## ----- ##
## start ##
## ----- ##

create_db () {
DB_FILE=$1
DB_SCHEMA=$2
action "Creating empty database $DB_FILE" ovsdb-tool create "$DB_FILE" "$DB_SCHEMA"
}

check_ovn_dbs () {
if test ! -e "$DB_NB_FILE"; then
create_db "$DB_NB_FILE" "$DB_NB_SCHEMA"
fi

if test ! -e "$DB_SB_FILE"; then
create_db "$DB_SB_FILE" "$DB_SB_SCHEMA"
fi

running_ovn_dbs=$(ovs-appctl -t ovsdb-server ovsdb-server/list-dbs | grep OVN | wc -l)
if [ "$running_ovn_dbs" != "2" ] ; then
ovs-appctl -t ovsdb-server ovsdb-server/add-db $DB_NB_FILE
ovs-appctl -t ovsdb-server ovsdb-server/add-db $DB_SB_FILE
running_ovn_dbs=$(ovs-appctl -t ovsdb-server ovsdb-server/list-dbs | grep OVN | wc -l)
if [ "$running_ovn_dbs" != "2" ] ; then
echo >&2 "$0: Failed to add OVN dbs to ovsdb-server"
exit 1
fi
fi
}

start_northd () {
# We expect ovn-northd to be co-located with ovsdb-server handling both the
# OVN_Northbound and OVN_Southbound dbs.
check_ovn_dbs

set ovn-northd
set "$@" -vconsole:emer -vsyslog:err -vfile:info
OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_NORTHD_PRIORITY" "$OVN_NORTHD_WRAPPER" "$@"
}

start_controller () {
set ovn-controller "unix:$DB_SOCK"
set "$@" -vconsole:emer -vsyslog:err -vfile:info
OVS_RUNDIR=${OVN_RUNDIR} start_daemon "$OVN_CONTROLLER_PRIORITY" "$OVN_CONTROLLER_WRAPPER" "$@"
}

## ---- ##
## stop ##
## ---- ##

stop_northd () {
OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-northd
}

stop_controller () {
OVS_RUNDIR=${OVN_RUNDIR} stop_daemon ovn-controller
}

## ------- ##
## restart ##
## ------- ##

restart_northd () {
stop_northd
start_northd
}

restart_controller () {
stop_controller
start_controller
}

## ---- ##
## main ##
## ---- ##

set_defaults () {
DB_SOCK=$rundir/db.sock
DB_NB_FILE=$dbdir/ovnnb.db
DB_SB_FILE=$dbdir/ovnsb.db
DB_NB_SCHEMA=$datadir/ovn-nb.ovsschema
DB_SB_SCHEMA=$datadir/ovn-sb.ovsschema

OVN_NORTHD_PRIORITY=-10
OVN_NORTHD_WRAPPER=
OVN_CONTROLLER_PRIORITY=-10
OVN_CONTROLLER_WRAPPER=

OVS_RUNDIR=${OVS_RUNDIR:-${rundir}}
OVN_RUNDIR=${OVN_RUNDIR:-${OVS_RUNDIR}}
}

set_option () {
var=`echo "$option" | tr abcdefghijklmnopqrstuvwxyz- ABCDEFGHIJKLMNOPQRSTUVWXYZ_`
eval set=\${$var+yes}
eval old_value=\$$var
if test X$set = X || \
(test $type = bool && \
test X"$old_value" != Xno && test X"$old_value" != Xyes); then
echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
return
fi
eval $var=\$value
}

usage () {
set_defaults
cat << EOF
$0: controls Open Virtual Network daemons
usage: $0 [OPTIONS] COMMAND
This program is intended to be invoked internally by Open Virtual Network
startup scripts. System administrators should not normally invoke it directly.
Commands:
start_northd start ovn-northd
start_controller start ovn-controller
stop_northd stop ovn-northd
stop_controller stop ovn-controller
restart_northd restart ovn-northd
restart_controller restart ovn-controller
Options:
--ovn-northd-priority=NICE set ovn-northd's niceness (default: $OVN_NORTHD_PRIORITY)
--ovn-northd-wrapper=WRAPPER run with a wrapper like valgrind for debugging
--ovn-controller-priority=NICE set ovn-northd's niceness (default: $OVN_CONTROLLER_PRIORITY)
--ovn-controller-wrapper=WRAPPER run with a wrapper like valgrind for debugging
-h, --help display this help message
File location options:
--db-sock=SOCKET JSON-RPC socket name (default: $DB_SOCK)
--db-nb-file=FILE OVN_Northbound db file (default: $DB_NB_FILE)
--db-sb-file=FILE OVN_Southbound db file (default: $DB_SB_FILE)
--db-nb-schema=FILE OVN_Northbound db file (default: $DB_NB_SCHEMA)
--db-sb-schema=FILE OVN_Southbound db file (default: $DB_SB_SCHEMA)
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)
EOF
}

set_defaults
command=
for arg
do
case $arg in
-h | --help)
usage
;;
--[a-z]*=*)
option=`expr X"$arg" : 'X--\([^=]*\)'`
value=`expr X"$arg" : 'X[^=]*=\(.*\)'`
type=string
set_option
;;
--no-[a-z]*)
option=`expr X"$arg" : 'X--no-\(.*\)'`
value=no
type=bool
set_option
;;
--[a-z]*)
option=`expr X"$arg" : 'X--\(.*\)'`
value=yes
type=bool
set_option
;;
-*)
echo >&2 "$0: unknown option \"$arg\" (use --help for help)"
exit 1
;;
*)
if test X"$command" = X; then
command=$arg
else
echo >&2 "$0: exactly one non-option argument required (use --help for help)"
exit 1
fi
;;
esac
done
case $command in
start_northd)
start_northd
;;
start_controller)
start_controller
;;
stop_northd)
stop_northd
;;
stop_controller)
stop_controller
;;
restart_northd)
restart_northda
;;
restart_controller)
restart_controller
;;
create_ovn_dbs)
create_ovn_dbs
;;
help)
usage
;;
preheat)
echo >&2 "$0: preheating ovn to 350 degrees F."
exit 1
;;
'')
echo >&2 "$0: missing command name (use --help for help)"
exit 1
;;
*)
echo >&2 "$0: unknown command \"$command\" (use --help for help)"
exit 1
;;
esac
50 changes: 50 additions & 0 deletions ovn/utilities/ovn-ctl.8.xml
@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<manpage program="ovn-ctl" section="8" title="ovn-ctl">
<h1>Name</h1>
<p>ovn-ctl -- Open Virtual Network northbound daemon lifecycle utility</p>

<h1>Synopsys</h1>
<p><code>ovn-ctl</code> [<var>options</var>] <var>command</var></p>

<h1>Description</h1>
<p>This program is intended to be invoked internally by Open Virtual Network
startup scripts. System administrators should not normally invoke it directly.</p>

<h1>Commands</h1>

<dl>
<dt><code>start_northd</code></dt>
<dt><code>start_controller</code></dt>
<dt><code>stop_northd</code></dt>
<dt><code>stop_controller</code></dt>
<dt><code>restart_northd</code></dt>
<dt><code>restart_controller</code></dt>
</dl>

<h1>Options</h1>
<p><code>--ovn-northd-priority=<var>NICE</var></code></p>
<p><code>--ovn-northd-wrapper=<var>WRAPPER</var></code></p>
<p><code>--ovn-controller-priority=<var>NICE</var></code></p>
<p><code>--ovn-controller-wrapper=<var>WRAPPER</var></code></p>
<p><code>-h</code> | <code>--help</code></p>

<h1>File location options</h1>
<p><code>--db-sock==<var>SOCKET</var></code></p>
<p><code>--db-nb-file==<var>FILE</var></code></p>
<p><code>--db-sb-file==<var>FILE</var></code></p>
<p><code>--db-nb-schema==<var>FILE</var></code></p>
<p><code>--db-sb-schema==<var>FILE</var></code></p>

<h1>Example Usage</h1>
<h2>Run ovn-controller on a host already running OVS</h2>
<p><code># ovn-ctl start_controller</code></p>

<h2>Run ovn-northd on a host already running OVS</h2>
<p><code># ovn-ctl start_northd</code></p>

<h2>All-in-one OVS+OVN for testing</h2>
<p><code># ovs-ctl start --system-id="random"</code></p>
<p><code># ovn-ctl start_northd</code></p>
<p><code># ovn-ctl start_controller</code></p>

</manpage>

0 comments on commit 43d3e69

Please sign in to comment.