Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / rhel / etc_sysconfig_network-scripts_ifup-ovs
index c427879..3ad86ff 100755 (executable)
@@ -34,9 +34,62 @@ if [ ! -x ${OTHERSCRIPT} ]; then
        OTHERSCRIPT="/etc/sysconfig/network-scripts/ifup-eth"
 fi
 
+check_recursion ()
+{
+       [ -n "${UPPEDSTACK}" ] && for _r in ${UPPEDSTACK}; do
+               [ "$_r" = "$1" ] && return 1
+       done
+
+       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
+
+[ -n "${OVSREQUIRES}" ] && for _i in ${OVSREQUIRES}; do
+       if ( check_recursion "$_i" ); then
+               UPPEDSTACK="${UPPEDSTACK} $_i" /sbin/ifup "$_i"
+       fi
+done
+
+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} "*)
@@ -44,23 +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
+               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
@@ -68,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