summaryrefslogtreecommitdiff
path: root/utilities/ovs-ctl.in
diff options
context:
space:
mode:
authorGurucharan Shetty <gshetty@nicira.com>2012-10-18 15:44:37 -0700
committerGurucharan Shetty <gshetty@nicira.com>2012-10-23 14:14:08 -0700
commita41754333f6faad72e0f7b12521de7b7f737f9a6 (patch)
tree23ecaf6472c8379bbc2006270ae5faf7a9c3920e /utilities/ovs-ctl.in
parentde34f9f4916eb3d5f7256057d78c54ee278268a6 (diff)
downloadopenvswitch-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-xutilities/ovs-ctl.in101
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
-