ovs-ctl.in: increase the limit of fd
[cascardo/ovs.git] / utilities / ovs-ctl.in
index 674c3c3..3a432b5 100755 (executable)
@@ -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 () {
@@ -189,12 +198,26 @@ start_ovsdb () {
 
         # 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,manager_options
-        set "$@" --private-key=db:SSL,private_key
-        set "$@" --certificate=db:SSL,certificate
-        set "$@" --bootstrap-ca-cert=db:SSL,ca_cert
+        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
 
@@ -221,7 +244,7 @@ start_forwarding () {
         # 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
+        ulimit -n 6000
 
            # Start ovs-vswitchd.
            set ovs-vswitchd unix:"$DB_SOCK"
@@ -279,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
@@ -294,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
@@ -303,9 +355,18 @@ force_reload_kmod () {
         start_forwarding
         exit 1
     fi
-    chmod +x "$script"
+    chmod +x "$script_interfaces"
 
-    for dp in `ovs-dpctl dump-dps`; do
+    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 ${datapaths}; do
         action "Removing datapath: $dp" ovs-dpctl del-dp "$dp"
     done
 
@@ -323,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
@@ -332,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 ##
 ## --------------- ##
@@ -406,6 +490,7 @@ set_defaults () {
     DB_FILE=$dbdir/conf.db
     DB_SOCK=$rundir/db.sock
     DB_SCHEMA=$datadir/vswitch.ovsschema
+    EXTRA_DBS=
 
     PROTOCOL=gre
     DPORT=
@@ -440,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
@@ -448,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
@@ -467,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:
@@ -591,6 +677,9 @@ case $command in
         stop_forwarding
         stop_ovsdb
         ;;
+    restart)
+        restart
+        ;;
     status)
         rc=0
         for daemon in `daemons`; do
@@ -624,4 +713,3 @@ case $command in
         exit 1
         ;;
 esac
-