#! /bin/sh # # Copyright (c) 2013, 2015 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e run() { (cd "$sandbox" && "$@") || exit 1 } run_xterm() { title=$1; shift run xterm -T "$title" -e "$@" & } rungdb() { under_gdb=$1 gdb_run=$2 shift shift # Remove the --detach and to put the process under gdb control. # Also remove --vconsole:off to allow error message to show up # on the console. # Use "DISPLAY" variable to determine out if X is supported if $under_gdb && [ "$DISPLAY" ]; then args=`echo $@ |sed s/--detach//g | sed s/--vconsole:off//g` xterm_title=$1 gdb_cmd="" if $gdb_run; then gdb_cmd="-ex run" fi run_xterm $xterm_title gdb $gdb_cmd --args $args else run $@ fi } gdb_vswitchd=false gdb_ovsdb=false gdb_vswitchd_ex=false gdb_ovsdb_ex=false gdb_ovn_northd=false gdb_ovn_northd_ex=false gdb_ovn_controller=false gdb_ovn_controller_ex=false gdb_ovn_controller_vtep=false gdb_ovn_controller_vtep_ex=false builddir= srcdir= schema= installed=false built=false ovn=false ovnsb_schema= ovnnb_schema= for option; do # This option-parsing mechanism borrowed from a Autoconf-generated # configure script under the following license: # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2009, 2013 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # If the previous option needs an argument, assign it. if test -n "$prev"; then eval $prev=\$option prev= continue fi case $option in *=*) optarg=`expr "X$option" : '[^=]*=\(.*\)'` ;; *) optarg=yes ;; esac case $dashdash$option in --) dashdash=yes ;; -h|--help) cat <&2 exit 1 ;; *) echo "$option: non-option arguments not supported (use --help for help)" >&2 exit 1 ;; esac shift done if $installed && $built; then echo "sorry, conflicting options (use --help for help)" >&2 exit 1 elif $installed || $built; then : elif test -e vswitchd/ovs-vswitchd; then built=: builddir=. elif (ovs-vswitchd --version) >/dev/null 2>&1; then installed=: else echo "can't find an OVS build or install (use --help for help)" >&2 exit 1 fi if $built; then if test ! -e "$builddir"/vswitchd/ovs-vswitchd; then echo "$builddir does not appear to be an OVS build directory" >&2 exit 1 fi builddir=`cd $builddir && pwd` # Find srcdir. case $srcdir in '') srcdir=$builddir if test ! -e "$srcdir"/WHY-OVS.md; then srcdir=`cd $builddir/.. && pwd` fi ;; /*) ;; *) srcdir=`pwd`/$srcdir ;; esac schema=$srcdir/vswitchd/vswitch.ovsschema if test ! -e "$schema"; then echo >&2 'source directory not found, please use --srcdir' exit 1 fi if $ovn; then ovnsb_schema=$srcdir/ovn/ovn-sb.ovsschema if test ! -e "$ovnsb_schema"; then echo >&2 'source directory not found, please use --srcdir' exit 1 fi ovnnb_schema=$srcdir/ovn/ovn-nb.ovsschema if test ! -e "$ovnnb_schema"; then echo >&2 'source directory not found, please use --srcdir' exit 1 fi vtep_schema=$srcdir/vtep/vtep.ovsschema if test ! -e "$vtep_schema"; then echo >&2 'source directory not found, please use --srcdir' exit 1 fi fi # Put built tools early in $PATH. if test ! -e $builddir/vswitchd/ovs-vswitchd; then echo >&2 'build not found, please change set $builddir or change directory' exit 1 fi PATH=$builddir/ovsdb:$builddir/vswitchd:$builddir/utilities:$builddir/vtep:$PATH if $ovn; then PATH=$builddir/ovn/controller:$builddir/ovn/controller-vtep:$builddir/ovn/northd:$builddir/ovn/utilities:$PATH fi export PATH else case $schema in '') for schema in \ /usr/local/share/openvswitch/vswitch.ovsschema \ /usr/share/openvswitch/vswitch.ovsschema \ none; do if test -r $schema; then break fi done ;; /*) ;; *) schema=`pwd`/$schema ;; esac if test ! -r "$schema"; then echo "can't find vswitch.ovsschema, please specify --schema" >&2 exit 1 fi if $ovn; then echo "running with ovn is only supported from the build dir." >&2 exit 1 fi fi # Create sandbox. rm -rf sandbox mkdir sandbox sandbox=`cd sandbox && pwd` # Set up environment for OVS programs to sandbox themselves. OVS_RUNDIR=$sandbox; export OVS_RUNDIR OVS_LOGDIR=$sandbox; export OVS_LOGDIR OVS_DBDIR=$sandbox; export OVS_DBDIR OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR if $built; then # Easy access to OVS manpages. (cd "$builddir" && ${MAKE-make} install-man mandir="$sandbox"/man) MANPATH=$sandbox/man:; export MANPATH fi # Ensure cleanup. trap 'kill `cat "$sandbox"/*.pid`' 0 1 2 3 13 14 15 # Create database and start ovsdb-server. touch "$sandbox"/.conf.db.~lock~ run ovsdb-tool create conf.db "$schema" ovsdb_server_args= if $ovn; then touch "$sandbox"/.ovnsb.db.~lock~ touch "$sandbox"/.ovnnb.db.~lock~ run ovsdb-tool create ovnsb.db "$ovnsb_schema" run ovsdb-tool create ovnnb.db "$ovnnb_schema" run ovsdb-tool create vtep.db "$vtep_schema" ovsdb_server_args="ovnsb.db ovnnb.db vtep.db conf.db" fi rungdb $gdb_ovsdb $gdb_ovsdb_ex ovsdb-server --detach --no-chdir --pidfile -vconsole:off --log-file \ --remote=punix:"$sandbox"/db.sock $ovsdb_server_args #Add a small delay to allow ovsdb-server to launch. sleep 0.1 #Wait for ovsdb-server to finish launching. if test ! -e "$sandbox"/db.sock; then echo -n "Waiting for ovsdb-server to start..." while test ! -e "$sandbox"/db.sock; do sleep 1; done echo " Done" fi # Initialize database. run ovs-vsctl --no-wait -- init # Start ovs-vswitchd. rungdb $gdb_vswitchd $gdb_vswitchd_ex ovs-vswitchd --detach --no-chdir --pidfile -vconsole:off --log-file \ --enable-dummy=override -vvconn -vnetdev_dummy if $ovn; then ovs-vsctl set open . external-ids:system-id=56b18105-5706-46ef-80c4-ff20979ab068 ovs-vsctl set open . external-ids:ovn-remote=unix:"$sandbox"/db.sock ovs-vsctl set open . external-ids:ovn-encap-type=geneve ovs-vsctl set open . external-ids:ovn-encap-ip=127.0.0.1 rungdb $gdb_ovn_northd $gdb_ovn_northd_ex ovn-northd --detach --no-chdir --pidfile -vconsole:off --log-file rungdb $gdb_ovn_controller $gdb_ovn_controller_ex ovn-controller --detach --no-chdir --pidfile -vconsole:off --log-file rungdb $gdb_ovn_controller_vtep $gdb_ovn_controller_vtep_ex ovn-controller-vtep --detach --no-chdir --pidfile -vconsole:off --log-file fi cat <