Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / rhel / etc_sysconfig_network-scripts_ifup-ovs
index ae095a0..3ad86ff 100755 (executable)
@@ -34,7 +34,7 @@ if [ ! -x ${OTHERSCRIPT} ]; then
        OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
 fi
 
-check_recursion()
+check_recursion ()
 {
        [ -n "${UPPEDSTACK}" ] && for _r in ${UPPEDSTACK}; do
                [ "$_r" = "$1" ] && return 1
@@ -43,6 +43,13 @@ check_recursion()
        return 0
 }
 
+ifup_ovs_bridge ()
+{
+       if ovs-vsctl br-exists "${OVS_BRIDGE}"; then :; else
+               /sbin/ifup "${OVS_BRIDGE}"
+       fi
+}
+
 if [ -z "${UPPEDSTACK}" ]; then
        UPPEDSTACK="${DEVICE}"
 fi
@@ -53,11 +60,36 @@ fi
        fi
 done
 
-[ -f /var/lock/subsys/openvswitch ] || /sbin/service openvswitch start
+SERVICE_UNIT=/usr/lib/systemd/system/openvswitch-nonetwork.service
+if [ -f $SERVICE_UNIT ] && [ -x /usr/bin/systemctl ]; then
+       if ! systemctl --quiet is-active openvswitch-nonetwork.service; then
+               systemctl start openvswitch-nonetwork.service
+       fi
+else
+       if [ ! -f /var/lock/subsys/openvswitch ]; then
+               /sbin/service openvswitch start
+       fi
+fi
 
 case "$TYPE" in
        OVSBridge)
-               ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
+               # If bridge already exists and is up, it has been configured through
+               # other cases like OVSPort, OVSIntPort and OVSBond. If it is down or
+               # it does not exist, create it. It is possible for a bridge to exist
+               # because it remained in the OVSDB for some reason, but it won't be up.
+               if check_device_down "${DEVICE}"; then
+                       ovs-vsctl -t ${TIMEOUT} -- --may-exist add-br "$DEVICE" $OVS_OPTIONS \
+                       ${OVS_EXTRA+-- $OVS_EXTRA} \
+                       ${STP+-- set bridge "$DEVICE" stp_enable="${STP}"}
+               else
+                       OVSBRIDGECONFIGURED="yes"
+               fi
+
+               # When dhcp is enabled, the assumption is that there will be a port to
+               # attach (otherwise, we can't reach out for dhcp). So, we do not
+               # configure the bridge through rhel's ifup infrastructure unless
+               # it is being configured after the port has been configured.
+               # The "OVSINTF" is set only after the port is configured.
                if [ "${OVSBOOTPROTO}" = "dhcp" ] && [ -n "${OVSINTF}" ]; then
                        case " ${OVSDHCPINTERFACES} " in
                                *" ${OVSINTF} "*)
@@ -65,25 +97,33 @@ case "$TYPE" in
                                ;;
                        esac
                fi
-               if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ]; then
+
+               # When dhcp is not enabled, it is possible that someone may want
+               # a standalone bridge (i.e it may not have any ports). Configure it.
+               if [ "${OVSBOOTPROTO}" != "dhcp" ] && [ -z "${OVSINTF}" ] && \
+                       [ "${OVSBRIDGECONFIGURED}" != "yes" ]; then
                        ${OTHERSCRIPT} ${CONFIG}
                fi
-               [ -n "${STP}" ] && ovs-vsctl --no-wait set bridge "${DEVICE}" stp_enable="${STP}"
                exit 0
                ;;
        OVSPort)
-               /sbin/ifup "$OVS_BRIDGE"
+               ifup_ovs_bridge
                ${OTHERSCRIPT} ${CONFIG} ${2}
                ovs-vsctl -t ${TIMEOUT} -- --may-exist add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
                OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
                ;;
        OVSIntPort)
-               /sbin/ifup "$OVS_BRIDGE"
+               ifup_ovs_bridge
                ovs-vsctl -t ${TIMEOUT} -- --may-exist add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS -- set Interface "$DEVICE" type=internal ${OVS_EXTRA+-- $OVS_EXTRA}
-               ${OTHERSCRIPT} ${CONFIG} ${2}
+               if [ -n "${OVSDHCPINTERFACES}" ]; then
+                       for _iface in ${OVSDHCPINTERFACES}; do
+                               /sbin/ifup ${_iface}
+                       done
+               fi
+               BOOTPROTO="${OVSBOOTPROTO}" ${OTHERSCRIPT} ${CONFIG} ${2}
                ;;
        OVSBond)
-               /sbin/ifup "$OVS_BRIDGE"
+               ifup_ovs_bridge
                for _iface in $BOND_IFACES; do
                        /sbin/ifup ${_iface}
                done
@@ -91,6 +131,15 @@ case "$TYPE" in
                ${OTHERSCRIPT} ${CONFIG} ${2}
                OVSINTF=${DEVICE} /sbin/ifup "$OVS_BRIDGE"
                ;;
+       OVSTunnel)
+               ifup_ovs_bridge
+               ovs-vsctl -t ${TIMEOUT} -- --may-exist add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS -- set Interface "$DEVICE" type=$OVS_TUNNEL_TYPE $OVS_TUNNEL_OPTIONS ${OVS_EXTRA+-- $OVS_EXTRA}
+               ${OTHERSCRIPT} ${CONFIG} ${2}
+               ;;
+       OVSPatchPort)
+               ifup_ovs_bridge
+               ovs-vsctl -t ${TIMEOUT} -- --may-exist add-port "$OVS_BRIDGE" "$DEVICE" $OVS_OPTIONS -- set Interface "$DEVICE" type=patch options:peer="${OVS_PATCH_PEER}" ${OVS_EXTRA+-- $OVS_EXTRA}
+               ;;
        *)
                echo $"Invalid OVS interface type $TYPE"
                exit 1