X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fovs-ctl.in;h=d770f425f9556fd693a102ca1f56322754f2dd85;hb=b411e5c35132f61cc1fd99dbeb1ed3f859d6f5ac;hp=68853826b55a142516820e4e92ded7e65e2f7eae;hpb=2dc7590de5e0adae1e332ff84c0c8af264f403b9;p=sliver-openvswitch.git diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in index 68853826b..d770f425f 100755 --- a/utilities/ovs-ctl.in +++ b/utilities/ovs-ctl.in @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2009, 2010, 2011, 2012 Nicira Networks, Inc. +# Copyright (C) 2009, 2010, 2011, 2012 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -64,7 +64,12 @@ insert_brcompat_mod_if_required () { insert_mod_if_required () { insert_openvswitch_mod_if_required || return 1 if test X"$BRCOMPAT" = Xyes; then - insert_brcompat_mod_if_required || return 1 + if insert_brcompat_mod_if_required; then + : + else + log_warning_msg "could not load brcompat module, disabling bridge compatibility" + BRCOMPAT=no + fi fi } @@ -73,7 +78,7 @@ ovs_vsctl () { } ovsdb_tool () { - ovsdb-tool -vANY:console:off "$@" + ovsdb-tool -vconsole:off "$@" } create_db () { @@ -167,63 +172,86 @@ set_system_ids () { action "Configuring Open vSwitch system IDs" "$@" $extra_ids } -start () { +check_force_cores () { if test X"$FORCE_COREFILES" = Xyes; then ulimit -Sc 67108864 fi +} - insert_mod_if_required || return 1 +start_ovsdb () { + check_force_cores if daemon_is_running ovsdb-server; then - log_success_msg "ovsdb-server is already running" + log_success_msg "ovsdb-server is already running" else - # Create initial database or upgrade database schema. - upgrade_db || return 1 - - # Start ovsdb-server. - set ovsdb-server "$DB_FILE" - set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO - set "$@" --remote=punix:"$DB_SOCK" - set "$@" --remote=db:Open_vSwitch,manager_options - set "$@" --private-key=db:SSL,private_key - set "$@" --certificate=db:SSL,certificate - set "$@" --bootstrap-ca-cert=db:SSL,ca_cert - start_daemon "$OVSDB_SERVER_PRIORITY" "$@" || return 1 - - # Initialize database settings. - ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \ - || return 1 - set_system_ids || return 1 - if test X"$DELETE_BRIDGES" = Xyes; then + # Create initial database or upgrade database schema. + upgrade_db || return 1 + + # Start ovsdb-server. + set ovsdb-server "$DB_FILE" + for db in $EXTRA_DBS; do + case $db in + /*) ;; + *) db=$dbdir/$db ;; + esac + + if test ! -f "$db"; then + log_warning_msg "$db (from \$EXTRA_DBS) does not exist." + elif ovsdb-tool db-version "$db" >/dev/null; then + set "$@" "$db" + else + log_warning_msg "$db (from \$EXTRA_DBS) cannot be read as a database (see error message above)" + fi + done + set "$@" -vconsole:emer -vsyslog:err -vfile:info + set "$@" --remote=punix:"$DB_SOCK" + set "$@" --remote=db:Open_vSwitch,Open_vSwitch,manager_options + set "$@" --private-key=db:Open_vSwitch,SSL,private_key + set "$@" --certificate=db:Open_vSwitch,SSL,certificate + set "$@" --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert + start_daemon "$OVSDB_SERVER_PRIORITY" "$OVSDB_SERVER_WRAPPER" "$@" \ + || return 1 + + # Initialize database settings. + ovs_vsctl -- init -- set Open_vSwitch . db-version="$schemaver" \ + || return 1 + set_system_ids || return 1 + if test X"$DELETE_BRIDGES" = Xyes; then for bridge in `ovs_vsctl list-br`; do - ovs_vsctl del-br $bridge + ovs_vsctl del-br $bridge done - fi + fi fi +} + +start_forwarding () { + check_force_cores + + insert_mod_if_required || return 1 if daemon_is_running ovs-vswitchd; then - log_success_msg "ovs-vswitchd is already running" + log_success_msg "ovs-vswitchd is already running" else - # Increase the limit on the number of open file descriptors. - # ovs-vswitchd needs 16 per datapath, plus a few extra, so this - # should allow for 256 (or more) bridges. - ulimit -n 5000 - - # Start ovs-vswitchd. - set ovs-vswitchd unix:"$DB_SOCK" - set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO - if test X"$MLOCKALL" != Xno; then - set "$@" --mlockall - fi - start_daemon "$OVS_VSWITCHD_PRIORITY" "$@" + # Increase the limit on the number of open file descriptors. + # ovs-vswitchd needs 16 per datapath, plus a few extra, so this + # should allow for 256 (or more) bridges. + ulimit -n 5000 + + # Start ovs-vswitchd. + set ovs-vswitchd unix:"$DB_SOCK" + set "$@" -vconsole:emer -vsyslog:err -vfile:info + if test X"$MLOCKALL" != Xno; then + set "$@" --mlockall + fi + start_daemon "$OVS_VSWITCHD_PRIORITY" "$OVS_VSWITCHD_WRAPPER" "$@" fi if daemon_is_running ovs-brcompatd; then - log_success_msg "ovs-brcompatd is already running" + log_success_msg "ovs-brcompatd is already running" elif test X"$BRCOMPAT" = Xyes; then set ovs-brcompatd - set "$@" -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO - start_daemon "$OVS_BRCOMPATD_PRIORITY" "$@" + set "$@" -vconsole:emer -vsyslog:err -vfile:info + start_daemon "$OVS_BRCOMPATD_PRIORITY" "$OVS_BRCOMPATD_WRAPPER" "$@" fi } @@ -231,10 +259,13 @@ start () { ## stop ## ## ---- ## -stop () { +stop_ovsdb () { + stop_daemon ovsdb-server +} + +stop_forwarding () { stop_daemon ovs-brcompatd stop_daemon ovs-vswitchd - stop_daemon ovsdb-server } ## ----------------- ## @@ -254,34 +285,61 @@ internal_interfaces () { # But ignore interfaces that don't really exist. for d in `(ovs_vsctl --bare \ -- --columns=name find Interface type=internal \ - -- list-br) | sort -u` + -- list-br) | sort -u` do if test -e "/sys/class/net/$d"; then - printf "%s " "$d" - fi + printf "%s " "$d" + fi done } +save_flows () { + if set X `ovs_vsctl -- --real list-br`; then + shift + if "$datadir/scripts/ovs-save" save-flows "$@" > "$script_flows"; then + chmod +x "$script_flows" + return 0 + fi + fi + script_flows= + return 1 +} + save_interfaces () { - "$datadir/scripts/ovs-save" $ifaces > "$script" + "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \ + > "${script_interfaces}" +} + +restore_flows () { + [ -n "${script_flows}" ] && \ + action "Restoring saved flows" "${script_flows}" } force_reload_kmod () { ifaces=`internal_interfaces` action "Detected internal interfaces: $ifaces" true - stop + script_interfaces=`mktemp` + script_flows=`mktemp` + trap 'rm -f "${script_interfaces}" "${script_flows}" ' 0 1 2 13 15 + + action "Saving flows" save_flows + + # Restart the database first, since a large database may take a + # while to load, and we want to minimize forwarding disruption. + stop_ovsdb + start_ovsdb + + stop_forwarding - script=`mktemp` - trap 'rm -f "$script"' 0 1 2 13 15 if action "Saving interface configuration" save_interfaces; then : else log_warning_msg "Failed to save configuration, not replacing kernel module" - start + start_forwarding exit 1 fi - chmod +x "$script" + chmod +x "$script_interfaces" for dp in `ovs-dpctl dump-dps`; do action "Removing datapath: $dp" ovs-dpctl del-dp "$dp" @@ -299,9 +357,11 @@ force_reload_kmod () { action "Removing openvswitch module" rmmod openvswitch fi - start + start_forwarding - action "Restoring interface configuration" "$script" + restore_flows + + action "Restoring interface configuration" "$script_interfaces" rc=$? if test $rc = 0; then level=debug @@ -310,11 +370,35 @@ force_reload_kmod () { fi log="logger -p daemon.$level -t ovs-save" $log "force-reload-kmod interface restore script exited with status $rc:" - $log -f "$script" + $log -f "$script_interfaces" "$datadir/scripts/ovs-check-dead-ifs" } +## ------- ## +## restart ## +## ------- ## + +restart () { + if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then + script_flows=`mktemp` + trap 'rm -f "${script_flows}"' 0 1 2 13 15 + + action "Saving flows" save_flows + fi + + # Restart the database first, since a large database may take a + # while to load, and we want to minimize forwarding disruption. + stop_ovsdb + start_ovsdb + + stop_forwarding + start_forwarding + + # Restore the saved flows. Do not return error if restore fails. + restore_flows || true +} + ## --------------- ## ## enable-protocol ## ## --------------- ## @@ -377,10 +461,14 @@ set_defaults () { OVSDB_SERVER_PRIORITY=-10 OVS_VSWITCHD_PRIORITY=-10 OVS_BRCOMPATD_PRIORITY=-10 + OVSDB_SERVER_WRAPPER= + OVS_VSWITCHD_WRAPPER= + OVS_BRCOMPATD_WRAPPER= - DB_FILE=$etcdir/conf.db + DB_FILE=$dbdir/conf.db DB_SOCK=$rundir/db.sock DB_SCHEMA=$datadir/vswitch.ovsschema + EXTRA_DBS= PROTOCOL=gre DPORT= @@ -415,6 +503,7 @@ scripts. System administrators should not normally invoke it directly. Commands: start start Open vSwitch daemons stop stop Open vSwitch daemons + restart stop and start Open vSwitch daemons status check whether Open vSwitch daemons are running version print versions of Open vSwitch daemons load-kmod insert modules if not already present @@ -423,18 +512,18 @@ Commands: enable-protocol enable protocol specified in options with iptables help display this help message -One of the following options is required for "start" and "force-reload-kmod": +One of the following options is required for "start", "restart" and "force-reload-kmod": --system-id=UUID set specific ID to uniquely identify this system --system-id=random use a random but persistent UUID to identify this system -Other important options for "start" and "force-reload-kmod": +Other important options for "start", "restart" and "force-reload-kmod": --system-type=TYPE set system type (e.g. "XenServer") --system-version=VERSION set system version (e.g. "5.6.100-39265p") --external-id="key=value" add given key-value pair to Open_vSwitch external-ids --delete-bridges delete all bridges just before starting ovs-vswitchd -Less important options for "start" and "force-reload-kmod": +Less important options for "start", "restart" and "force-reload-kmod": --daemon-cwd=DIR set working dir for OVS daemons (default: $DAEMON_CWD) --no-force-corefiles do not force on core dumps for OVS daemons --no-mlockall do not lock all of ovs-vswitchd into memory @@ -442,7 +531,13 @@ Less important options for "start" and "force-reload-kmod": --ovs-vswitchd-priority=NICE set ovs-vswitchd's niceness (default: $OVS_VSWITCHD_PRIORITY) --ovs-brcompatd-priority=NICE set ovs-brcompatd's niceness (default: $OVS_BRCOMPATD_PRIORITY) -Options for "start", "force-reload-kmod", "load-kmod", "status", and "version": +Debugging options for "start", "restart" and "force-reload-kmod": + --ovsdb-server-wrapper=WRAPPER + --ovs-vswitchd-wrapper=WRAPPER + --ovs-vswitchd-wrapper=WRAPPER + run specified daemon under WRAPPER (either 'valgrind' or 'strace') + +Options for "start", "restart", "force-reload-kmod", "load-kmod", "status", and "version": --brcompat enable Linux bridge compatibility module and daemon File location options: @@ -460,8 +555,9 @@ Other options: -V, --version display version information Default directories with "configure" option and environment variable override: - logs: @LOGDIR@ (--log-dir, OVS_LOGDIR) - pidfiles and sockets: @RUNDIR@ (--run-dir, OVS_RUNDIR) + logs: @LOGDIR@ (--with-logdir, OVS_LOGDIR) + pidfiles and sockets: @RUNDIR@ (--with-rundir, OVS_RUNDIR) + conf.db: @DBDIR@ (--with-dbdir, OVS_DBDIR) system configuration: @sysconfdir@ (--sysconfdir, OVS_SYSCONFDIR) data files: @pkgdatadir@ (--pkgdatadir, OVS_PKGDATADIR) user binaries: @bindir@ (--bindir, OVS_BINDIR) @@ -552,10 +648,15 @@ do done case $command in start) - start + start_ovsdb + start_forwarding ;; stop) - stop + stop_forwarding + stop_ovsdb + ;; + restart) + restart ;; status) rc=0 @@ -570,7 +671,7 @@ case $command in done ;; force-reload-kmod) - force_reload_kmod + force_reload_kmod ;; load-kmod) insert_mod_if_required @@ -590,4 +691,3 @@ case $command in exit 1 ;; esac -