X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=xenserver%2Fetc_init.d_openvswitch;h=b2248b7addbe43c90d13cbbdd177757e6ccc578f;hb=e0edde6fee279cdbbf3c179f5f50adaf0c7c7f1e;hp=a99cc9f89664b6074f0fc964c95e440323748d10;hpb=d650378e743b93ab070ffde978a7557aa522dcb1;p=sliver-openvswitch.git diff --git a/xenserver/etc_init.d_openvswitch b/xenserver/etc_init.d_openvswitch index a99cc9f89..b2248b7ad 100755 --- a/xenserver/etc_init.d_openvswitch +++ b/xenserver/etc_init.d_openvswitch @@ -1,11 +1,11 @@ -#!/bin/bash +#!/bin/sh # # openvswitch # # chkconfig: 2345 09 91 # description: Manage Open vSwitch kernel modules and user-space daemons -# Copyright (C) 2009, 2010, 2011 Nicira Networks, Inc. +# Copyright (C) 2009, 2010, 2011 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -27,43 +27,11 @@ # Short-Description: Open vSwitch switch ### END INIT INFO -# source function library -if [ -f /etc/init.d/functions ]; then - . /etc/init.d/functions -elif [ -f /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -elif [ -f /lib/lsb/init-functions ]; then - . /lib/lsb/init-functions -else - echo "$0: missing LSB shell function library" >&2 - exit 1 -fi - -if type action >/dev/null 2>&1; then - : -else - # SUSE lacks action - action() { - STRING=$1 - shift - "$@" - rc=$? - if [ $rc -eq 0 ] ; then - log_success_msg $"$STRING " - else - log_failure_msg $"$STRING " - fi - return $rc - } -fi - -test -e /etc/xensource-inventory && . /etc/xensource-inventory +. /usr/share/openvswitch/scripts/ovs-lib || exit 1 +. /etc/xensource-inventory test -e /etc/sysconfig/openvswitch && . /etc/sysconfig/openvswitch -if test -e /etc/xensource/network.conf; then - NETWORK_MODE=$(cat /etc/xensource/network.conf) -fi -case ${NETWORK_MODE:=openvswitch} in +case `cat /etc/xensource/network.conf` in vswitch|openvswitch) ;; bridge) @@ -75,377 +43,71 @@ case ${NETWORK_MODE:=openvswitch} in ;; esac -# General config variables in /etc/sysconfig/openvswitch -if [ -f /etc/xensource-inventory ]; then - if test "$PRODUCT_VERSION" = "5.5.0"; then - # XenServer 5.5.0 needs ovs-brcompatd and /proc/net simulation. - : ${ENABLE_BRCOMPAT:=y} - : ${ENABLE_FAKE_PROC_NET:=y} +start_ovs_xapi_sync () { + if daemon_is_running ovs-xapi-sync; then + log_success_msg "ovs-xapi-sync is already running" else - # Later versions don't need them. - : ${ENABLE_BRCOMPAT:=n} - : ${ENABLE_FAKE_PROC_NET:=n} - fi -else - : ${ENABLE_BRCOMPAT:=y} - : ${ENABLE_FAKE_PROC_NET:=y} -fi -: ${ENABLE_MONITOR:=y} -: ${FORCE_COREFILES:=y} - -# Config variables specific to ovsdb-server -: ${OVSDB_SERVER_REMOTES:=punix:/var/run/openvswitch/db.sock db:Open_vSwitch,managers} -: ${OVSDB_SERVER_DB:=/etc/openvswitch/conf.db} -: ${OVSDB_SERVER_PIDFILE:=/var/run/openvswitch/ovsdb-server.pid} -: ${OVSDB_SERVER_RUN_DIR:=/var/xen/openvswitch} -: ${OVSDB_SERVER_PRIORITY:=-10} -: ${OVSDB_SERVER_LOGFILE:=/var/log/openvswitch/ovsdb-server.log} -: ${OVSDB_SERVER_FILE_LOGLEVEL:=INFO} -: ${OVSDB_SERVER_SYSLOG_LOGLEVEL:=ERR} -: ${OVSDB_SERVER_MEMLEAK_LOGFILE:=} -: ${OVSDB_SERVER_STRACE_LOG:=} -: ${OVSDB_SERVER_STRACE_OPT:=} -: ${OVSDB_SERVER_VALGRIND_LOG:=} -: ${OVSDB_SERVER_VALGRIND_OPT:=} - -# Config variables specific to ovs-vswitchd -: ${VSWITCHD_OVSDB_SERVER:=unix:/var/run/openvswitch/db.sock} -: ${VSWITCHD_OVSDB_SCHEMA:=/usr/share/openvswitch/vswitch.ovsschema} -: ${VSWITCHD_PIDFILE:=/var/run/openvswitch/ovs-vswitchd.pid} -: ${VSWITCHD_RUN_DIR:=/var/xen/openvswitch} -: ${VSWITCHD_PRIORITY:=-10} -: ${VSWITCHD_MLOCKALL:=yes} -: ${VSWITCHD_LOGFILE:=/var/log/openvswitch/ovs-vswitchd.log} -: ${VSWITCHD_FILE_LOGLEVEL:=INFO} -: ${VSWITCHD_SYSLOG_LOGLEVEL:=ERR} -: ${VSWITCHD_MEMLEAK_LOGFILE:=} -: ${VSWITCHD_STRACE_LOG:=} -: ${VSWITCHD_STRACE_OPT:=} -: ${VSWITCHD_VALGRIND_LOG:=} -: ${VSWITCHD_VALGRIND_OPT:=} - -# Config variables specific to ovs-brcompatd -: ${BRCOMPATD_PIDFILE:=/var/run/openvswitch/ovs-brcompatd.pid} -: ${BRCOMPATD_RUN_DIR:=/var/xen/openvswitch} -: ${BRCOMPATD_PRIORITY:=-10} -: ${BRCOMPATD_LOGFILE:=/var/log/openvswitch/ovs-brcompatd.log} -: ${BRCOMPATD_FILE_LOGLEVEL:=INFO} -: ${BRCOMPATD_SYSLOG_LOGLEVEL:=ERR} -: ${BRCOMPATD_MEMLEAK_LOGFILE:=} -: ${BRCOMPATD_STRACE_LOG:=} -: ${BRCOMPATD_STRACE_OPT:=} -: ${BRCOMPATD_VALGRIND_LOG:=} -: ${BRCOMPATD_VALGRIND_OPT:=} - -# Full paths to executables & modules -ovsdb_server="/usr/sbin/ovsdb-server" -ovsdb_tool="/usr/bin/ovsdb-tool" -vswitchd="/usr/sbin/ovs-vswitchd" -brcompatd="/usr/sbin/ovs-brcompatd" -dpctl="/usr/bin/ovs-dpctl" -appctl="/usr/bin/ovs-appctl" -ofctl="/usr/bin/ovs-ofctl" -vsctl="/usr/bin/ovs-vsctl" - -if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then - if [ "$ENABLE_BRCOMPAT" != "y" ]; then - warning "FAKE_PROC_NET required BRCOMPAT which was disabled. Force enabling." - ENABLE_BRCOMPAT="y" - fi -fi - -if test "$ENABLE_MONITOR" = "y"; then - monitor_opt="--monitor" -else - monitor_opt= -fi - -function hup_monitor_external_ids { - if [ -e /var/run/openvswitch/ovs-external-ids.pid ]; then - action "Configuring Open vSwitch external IDs" kill -HUP `cat /var/run/openvswitch/ovs-external-ids.pid` + PYTHONPATH=/usr/share/openvswitch/python \ + /usr/share/openvswitch/scripts/ovs-xapi-sync \ + --log-file --pidfile --detach --monitor unix:/var/run/openvswitch/db.sock fi } -function turn_on_corefiles { - ulimit -Sc 67108864 -} - -function remove_all_dp { - for dp in $($dpctl dump-dps); do - action "Removing datapath: $dp" "$dpctl" del-dp "$dp" - done -} - -function insert_modules_if_required { - if test -e /sys/module/bridge; then - bridges=`echo /sys/class/net/*/bridge | sed 's,/sys/class/net/,,g;s,/bridge,,g'` - if test "$bridges" != "*"; then - log_warning_msg "not removing bridge module because bridges exist ($bridges)" - else - action "removing bridge module" rmmod bridge - fi +start () { + set $ovs_ctl ${1-start} + set "$@" --system-id="$INSTALLATION_UUID" + set "$@" --system-type="$PRODUCT_BRAND" + set "$@" --system-version="$PRODUCT_VERSION-$BUILD_NUMBER" + set "$@" --external-id=xs-system-uuid="$INSTALLATION_UUID" + set "$@" --daemon-cwd=/var/xen/openvswitch + if test X"$FORCE_COREFILES" != X; then + set "$@" --force-corefiles="$FORCE_COREFILES" fi - if ! lsmod | grep -q "openvswitch_mod"; then - action "Inserting llc module" modprobe llc - action "Inserting openvswitch module" modprobe openvswitch_mod + if test X"$OVSDB_SERVER_PRIORITY" != X; then + set "$@" --ovsdb-server-priority="$OVSDB_SERVER_PRIORITY" fi - if [ "$ENABLE_BRCOMPAT" = "y" ] && [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then - action "Inserting brcompat module" modprobe brcompat_mod + if test X"$VSWITCHD_PRIORITY" != X; then + set "$@" --ovs-vswitchd-priority="$VSWITCHD_PRIORITY" fi -} - -function remove_modules { - if lsmod | grep -q "brcompat_mod"; then - action "Removing brcompat module" rmmod brcompat_mod.ko - fi - if lsmod | grep -q "openvswitch_mod"; then - action "Removing openvswitch module" rmmod openvswitch_mod.ko - fi -} - -function start_daemon { - local DAEMON=$1 - shift - local BINARY=$1 - - # cd to daemon's run_dir so core files get dumped into a sensible place. - eval local run_dir=\$${DAEMON}_RUN_DIR - if [ ! -d "$run_dir" ]; then - install -d -m 755 -o root -g root "$run_dir" - fi - cd "$run_dir" - - # Configure log levels. - eval local syslog_loglevel=\$${DAEMON}_SYSLOG_LOGLEVEL - eval local file_loglevel=\$${DAEMON}_FILE_LOGLEVEL - eval local logfile=\$${DAEMON}_LOGFILE - set -- "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:"$syslog_loglevel" - if test -n "$file_loglevel" && test -n "$logfile"; then - install -d -m 755 -o root -g root `dirname "$logfile"` - set -- "$@" --log-file="$logfile" -vANY:FILE:"$file_loglevel" - fi - - # Configure leak checker. - eval local memleak_logfile=\$${DAEMON}_MEMLEAK_LOGFILE - if test -n "$memleak_logfile"; then - set -- "$@" --check-leaks="$memleak_logfile" - if test -e "$memleak_logfile"; then - mv "$memleak_logfile" "$memleak_logfile.prev" - fi - fi - - # Configure debugging wrappers. - eval local strace_log=\$${DAEMON}_STRACE_LOG - eval local strace_opt=\$${DAEMON}_STRACE_OPT - eval local valgrind_log=\$${DAEMON}_VALGRIND_LOG - eval local valgrind_opt=\$${DAEMON}_VALGRIND_OPT - if test -n "$strace_log" && test -n "$valgrind_log"; then - printf "Can not start with both VALGRIND and STRACE\n" - exit 1 - elif test -n "$strace_log"; then - local mode=strace - set -- strace -o "$strace_log" $strace_opt "$@" - elif test -n "$valgrind_log"; then - local mode=valgrind - set -- valgrind --log-file="$valgrind_log" $valgrind_opt "$@" - else - local mode=production - eval local pidfile=\$${DAEMON}_PIDFILE - install -d -m 755 -o root -g root `dirname $pidfile` - set -- "$@" --pidfile="$pidfile" --detach $monitor_opt --no-chdir - fi - - # Configure niceness. - eval local priority=\$${DAEMON}_PRIORITY - if test -n "$priority"; then - set -- nice -n $priority "$@" - fi - - if test $mode = production; then - action "Starting `basename $BINARY`" "$@" - else - # Start in background and force a "success" message - action "Starting `basename $BINARY` with $mode debugging" true - ("$@") & - fi -} - -function start_ovsdb_server { - set -- "$ovsdb_server" "$OVSDB_SERVER_DB" - for remote in $OVSDB_SERVER_REMOTES; do - set -- "$@" --remote="$remote" - done - set -- "$@" --private-key=db:SSL,private_key --certificate=db:SSL,certificate --bootstrap-ca-cert=db:SSL,ca_cert - start_daemon OVSDB_SERVER "$@" -} - -function start_vswitchd { - local fake_proc_net_opt= - if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then - fake_proc_net_opt="--fake-proc-net" - fi - - local mlockall_opt= - if [ "$VSWITCHD_MLOCKALL" != "no" ]; then - mlockall_opt="--mlockall" + if test X"$VSWITCHD_MLOCKALL" != X; then + set "$@" --mlockall="$VSWITCHD_MLOCKALL" fi - - start_daemon VSWITCHD "$vswitchd" $fake_proc_net_opt $mlockall_opt \ - "$VSWITCHD_OVSDB_SERVER" - } - -function start_brcompatd { - start_daemon BRCOMPATD "$brcompatd" \ - --appctl-command="$appctl --target=/var/run/openvswitch/ovs-vswitchd.\`cat $VSWITCHD_PIDFILE\`.ctl %s" \ - "$VSWITCHD_OVSDB_SERVER" -} - -function stop_daemon { - local DAEMON=$1 - local BINARY=$2 - eval local pidfile=\$${DAEMON}_PIDFILE - if test -f "$pidfile"; then - local pid=$(cat "$pidfile") - action "Killing `basename $BINARY` ($pid)" kill $pid - for delay in .1 .25 .65 1 1 1 1; do - if kill -0 $pid >/dev/null 2>&1; then - sleep $delay - else - break - fi - done - rm -f "$pidfile" - fi -} - -function restart_approval { - if test ! -t 0; then - # Don't prompt if invoked non-interactively. - return 0 + if test ! -e /var/run/openvswitch.booted; then + touch /var/run/openvswitch.booted + set "$@" --delete-bridges fi - cat < /etc/openvswitch/install_uuid.conf - else - log_failure_msg "missing uuidgen, could not generate system UUID" - return - fi - $vsctl --no-wait --timeout=5 set Open_vSwitch . \ - external-ids:system-id="$INSTALLATION_UUID" - action "Configuring Open vSwitch system IDs" true - fi + touch /var/lock/subsys/openvswitch } -function start { - if [ "$FORCE_COREFILES" = "y" ]; then - turn_on_corefiles - fi - - insert_modules_if_required - - # Increase the limit on the number of open file descriptors since - # ovs-vswitchd needs a few per bridge - ulimit -n 4096 - - # Allow GRE traffic. - iptables -I INPUT -p gre -j ACCEPT - - schemaver=`$ovsdb_tool schema-version "$VSWITCHD_OVSDB_SCHEMA"` - if [ ! -e "$OVSDB_SERVER_DB" ]; then - warning "$OVSDB_SERVER_DB does not exist" - install -d -m 755 -o root -g root `dirname $OVSDB_SERVER_DB` - - action "Creating empty database $OVSDB_SERVER_DB" true - $ovsdb_tool -vANY:console:emer create "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA" - else - # If schema version changed, then back up the old version. - oldver=`$ovsdb_tool db-version "$OVSDB_SERVER_DB"` - if test "X$oldver" != "X$schemaver"; then - backup=$OVSDB_SERVER_DB.backup$oldver - action "Backing up $OVSDB_SERVER_DB in $backup before converting from schema version \"$oldver\" to \"$schemaver\"" true - cp "$OVSDB_SERVER_DB" "$backup" - fi - - # Upgrade or downgrade schema and compact database. - $ovsdb_tool -vANY:console:emer convert "$OVSDB_SERVER_DB" "$VSWITCHD_OVSDB_SCHEMA" - fi +force_reload_kmod () { + start force-reload-kmod - start_ovsdb_server - $vsctl --no-wait --timeout=5 init -- set Open_vSwitch . db-version="$schemaver" - if [ ! -e /var/run/openvswitch.booted ]; then - touch /var/run/openvswitch.booted - for bridge in $($vsctl list-br); do - $vsctl --no-wait --timeout=5 del-br $bridge - done + # Restart the high-availability daemon if it is running. Otherwise + # it loses its heartbeat and reboots the system after a few minutes. + if pidof xhad >/dev/null && test -e /etc/xensource/xhad.conf; then + PATH=$PATH:/opt/xensource/xha + action "Stopping HA daemon" ha_stop_daemon + action "Starting HA daemon" ha_start_daemon fi - set_system_ids - - start_vswitchd - if [ "${ENABLE_BRCOMPAT}" = "y" ] ; then - start_brcompatd - fi - - if [ -f /etc/xensource-inventory ]; then - # Start daemon to monitor external ids - PYTHONPATH=/usr/share/openvswitch/python \ - /usr/share/openvswitch/scripts/ovs-external-ids \ - --pidfile --detach $monitor_opt "$VSWITCHD_OVSDB_SERVER" - fi - - touch /var/lock/subsys/openvswitch + action "Stopping ovs-xapi-sync" stop_daemon ovs-xapi-sync + action "Starting ovs-xapi-sync" start_ovs_xapi_sync } -function stop { - stop_daemon BRCOMPATD "$brcompatd" - stop_daemon VSWITCHD "$vswitchd" - stop_daemon OVSDB_SERVER "$ovsdb_server" - if [ -e /var/run/openvswitch/ovs-external-ids.pid ]; then - kill `cat /var/run/openvswitch/ovs-external-ids.pid` - fi +stop () { + $ovs_ctl stop + stop_daemon ovs-xapi-sync rm -f /var/lock/subsys/openvswitch } -function restart { - if restart_approval; then - stop - start - fi -} - -case "$1" in +ovs_ctl=/usr/share/openvswitch/scripts/ovs-ctl +case $1 in start) start ;; @@ -453,32 +115,24 @@ case "$1" in stop ;; restart) - restart + stop + start ;; reload|force-reload) - # Nothing to do to ovs-vswitchd and ovsdb-server as they keep their - # configuration up-to-date all the time. HUP ovs-external-ids so it - # re-runs. - hup_monitor_external_ids - ;; - strace-vswitchd) - shift - strace -p $(cat "$VSWITCHD_PIDFILE") "$@" - ;; - strace-brcompatd) - shift - strace -p $(cat "$BRCOMPATD_PIDFILE") "$@" + # The main OVS daemons keep up-to-date, but ovs-xapi-sync needs help. + if daemon_is_running ovs-xapi-sync; then + action "Configuring Open vSwitch external IDs" \ + ovs-appctl -t ovs-xapi-sync flush-cache + fi ;; status) - status -p "$OVSDB_SERVER_PIDFILE" ovsdb-server && - status -p "$VSWITCHD_PIDFILE" ovs-vswitchd && - (test "$ENABLE_BRCOMPAT" != "y" || - status -p "$BRCOMPATD_PIDFILE" ovs-brcompatd) + $ovs_ctl status && daemon_status ovs-xapi-sync ;; version) - /usr/sbin/ovsdb-server -V - /usr/sbin/ovs-vswitchd -V - /usr/sbin/ovs-brcompatd -V + $ovs_ctl version + ;; + force-reload-kmod) + force_reload_kmod ;; help) printf "openvswitch [start|stop|restart|reload|force-reload|status|version]\n"