diff options
author | Gurucharan Shetty <gshetty@nicira.com> | 2012-10-18 15:44:37 -0700 |
---|---|---|
committer | Gurucharan Shetty <gshetty@nicira.com> | 2012-10-23 14:14:08 -0700 |
commit | a41754333f6faad72e0f7b12521de7b7f737f9a6 (patch) | |
tree | 23ecaf6472c8379bbc2006270ae5faf7a9c3920e /utilities/ovs-ctl.in | |
parent | de34f9f4916eb3d5f7256057d78c54ee278268a6 (diff) | |
download | openvswitch-a41754333f6faad72e0f7b12521de7b7f737f9a6.tar.gz |
ovs-ctl.in: Ability to save flows and kernel datapath config.
Add a new command - "restart" to ovs-ctl. Calling this command
will save and restore the Openflow flows on each bridge while
stopping and starting the userspace daemons respectively.
Also, during a force-reload-kmod, save the flows and kernel datapath
configuration. Use the saved datapath configuration while readding
the kernel module and the flows while starting the userspace daemons.
Feature #13555.
Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Diffstat (limited to 'utilities/ovs-ctl.in')
-rwxr-xr-x | utilities/ovs-ctl.in | 101 |
1 files changed, 87 insertions, 14 deletions
diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in index 2ead0042d..9ce4973d1 100755 --- a/utilities/ovs-ctl.in +++ b/utilities/ovs-ctl.in @@ -30,13 +30,21 @@ done ## start ## ## ----- ## +restore_datapaths () { + [ -n "${script_datapaths}" ] && \ + action "Restoring datapath configuration" "${script_datapaths}" +} + insert_openvswitch_mod_if_required () { # If openvswitch is already loaded then we're done. test -e /sys/module/openvswitch -o -e /sys/module/openvswitch_mod && \ return 0 # Load openvswitch. If that's successful then we're done. - action "Inserting openvswitch module" modprobe openvswitch && return 0 + if action "Inserting openvswitch module" modprobe openvswitch; then + restore_datapaths + return 0 + fi # If the bridge module is loaded, then that might be blocking # openvswitch. Try to unload it, if there are no bridges. @@ -50,6 +58,7 @@ insert_openvswitch_mod_if_required () { # Try loading openvswitch again. action "Inserting openvswitch module" modprobe openvswitch + restore_datapaths } insert_brcompat_mod_if_required () { @@ -293,14 +302,45 @@ internal_interfaces () { done } +save_flows () { + if set X `ovs_vsctl 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}" +} + +save_datapaths () { + "$datadir/scripts/ovs-save" save-datapaths ${datapaths} \ + > "${script_datapaths}" +} + +restore_flows () { + [ -n "${script_flows}" ] && \ + action "Restoring saved flows" "${script_flows}" } force_reload_kmod () { ifaces=`internal_interfaces` action "Detected internal interfaces: $ifaces" true + script_interfaces=`mktemp` + script_datapaths=`mktemp` + script_flows=`mktemp` + trap 'rm -f "${script_interfaces}" "${script_flows}" \ + "${script_datapaths}"' 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 @@ -308,8 +348,6 @@ force_reload_kmod () { stop_forwarding - script=`mktemp` - trap 'rm -f "$script"' 0 1 2 13 15 if action "Saving interface configuration" save_interfaces; then : else @@ -317,9 +355,18 @@ force_reload_kmod () { start_forwarding exit 1 fi - chmod +x "$script" + chmod +x "$script_interfaces" + + datapaths=`ovs-dpctl dump-dps` + if action "Saving datapath configuration" save_datapaths; then + chmod +x "${script_datapaths}" + else + log_warning_msg "Failed to save datapath configuration. The port\ + numbers may change after the restart" + script_datapaths="" + fi - for dp in `ovs-dpctl dump-dps`; do + for dp in ${datapaths}; do action "Removing datapath: $dp" ovs-dpctl del-dp "$dp" done @@ -337,7 +384,9 @@ force_reload_kmod () { start_forwarding - action "Restoring interface configuration" "$script" + restore_flows + + action "Restoring interface configuration" "$script_interfaces" rc=$? if test $rc = 0; then level=debug @@ -346,11 +395,32 @@ 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 () { + script_flows=`mktemp` + trap 'rm -f "${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 + start_forwarding + + restore_flows +} + ## --------------- ## ## enable-protocol ## ## --------------- ## @@ -455,6 +525,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 @@ -463,18 +534,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 @@ -482,13 +553,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) -Debugging options for "start" and "force-reload-kmod": +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", "force-reload-kmod", "load-kmod", "status", and "version": +Options for "start", "restart", "force-reload-kmod", "load-kmod", "status", and "version": --brcompat enable Linux bridge compatibility module and daemon File location options: @@ -606,6 +677,9 @@ case $command in stop_forwarding stop_ovsdb ;; + restart) + restart + ;; status) rc=0 for daemon in `daemons`; do @@ -639,4 +713,3 @@ case $command in exit 1 ;; esac - |