Configure start up scripts for OVS on Centos and Red Hat

The RPM packages for Open vSwitch provide some integration with Red
Hat’s network scripts. Using this integration is optional.

To use the integration for a Open vSwitch bridge or interface named
<name>, create or edit /etc/sysconfig/network-scripts/ifcfg-<name>.
This is a shell script that consists of a series of VARIABLE=VALUE
assignments. The following OVS-specific variable names are supported:

    - DEVICETYPE: Always set to "ovs".

    - TYPE: If this is "OVSBridge", then this file represents an OVS
      bridge named <name>.  Otherwise, it represents a port on an OVS
      bridge and TYPE must have one of the following values:

        * "OVSPort", if <name> is a physical port (e.g. eth0) or
          virtual port (e.g. vif1.0).

        * "OVSIntPort", if <name> is an internal port (e.g. a tagged
          VLAN).

        * "OVSBond", if <name> is an OVS bond.

        * "OVSTunnel", if <name> is an OVS tunnel.

        * "OVSPatchPort", if <name> is a patch port

    - OVS_BRIDGE: If TYPE is anything other than "OVSBridge", set to
      the name of the OVS bridge to which the port should be attached.

    - OVS_OPTIONS: Optionally, extra options to set in the "Port"
      table when adding the port to the bridge, as a sequence of
      column[:key]=value options.  For example, "tag=100" to make the
      port an access port for VLAN 100.  See the documentation of
      "add-port" in ovs-vsctl(8) for syntax and the section on the
      Port table in ovs-vswitchd.conf.db(5) for available options.

    - OVS_EXTRA: Optionally, additional ovs-vsctl commands, separated
      by "--" (double dash).

    - BOND_IFACES: For "OVSBond" interfaces, a list of physical
      interfaces to bond together.

    - OVS_TUNNEL_TYPE: For "OVSTunnel" interfaces, the type of the tunnel.
      For example, "gre", "vxlan", etc.

    - OVS_TUNNEL_OPTIONS: For "OVSTunnel" interfaces, this field should be
      used to specify the tunnel options like remote_ip, key, etc.

    - OVS_PATCH_PEER: For "OVSPatchPort" devices, this field specifies
      the patch's peer on the other bridge.

Note
----

* "ifdown" on a bridge will not bring individual ports on the bridge
down.  "ifup" on a bridge will not add ports to the bridge.  This
behavior should be compatible with standard bridges (with
TYPE=Bridge).

* If 'ifup' on an interface is called multiple times, one can see
"RTNETLINK answers: File exists" printed on the console. This comes from
ifup-eth trying to add zeroconf route multiple times and is harmless.

Examples
--------

Standalone bridge:

==> ifcfg-ovsbridge0 <==
DEVICE=ovsbridge0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=A.B.C.D
NETMASK=X.Y.Z.0
HOTPLUG=no

Enable DHCP on the bridge:
* Needs OVSBOOTPROTO instead of BOOTPROTO.
* All the interfaces that can reach the DHCP server
as a space separated list in OVSDHCPINTERFACES.

DEVICE=ovsbridge0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBridge
OVSBOOTPROTO="dhcp"
OVSDHCPINTERFACES="eth0"
HOTPLUG=no


Adding Internal Port to ovsbridge0:

==> ifcfg-intbr0 <==
DEVICE=intbr0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
OVS_BRIDGE=ovsbridge0
HOTPLUG=no


Internal Port with fixed IP address:

DEVICE=intbr0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
OVS_BRIDGE=ovsbridge0
BOOTPROTO=static
IPADDR=A.B.C.D
NETMASK=X.Y.Z.0
HOTPLUG=no

Internal Port with DHCP:
* Needs OVSBOOTPROTO or BOOTPROTO.
* All the interfaces that can reach the DHCP server
as a space separated list in OVSDHCPINTERFACES.

DEVICE=intbr0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
OVS_BRIDGE=ovsbridge0
OVSBOOTPROTO="dhcp"
OVSDHCPINTERFACES="eth0"
HOTPLUG=no

Adding physical eth0 to ovsbridge0 described above:

==> ifcfg-eth0 <==
DEVICE=eth0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=ovsbridge0
BOOTPROTO=none
HOTPLUG=no


Tagged VLAN interface on top of ovsbridge0:

==> ifcfg-vlan100 <==
DEVICE=vlan100
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
BOOTPROTO=static
IPADDR=A.B.C.D
NETMASK=X.Y.Z.0
OVS_BRIDGE=ovsbridge0
OVS_OPTIONS="tag=100"
OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif"
HOTPLUG=no


Bonding:

==> ifcfg-bond0 <==
DEVICE=bond0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBond
OVS_BRIDGE=ovsbridge0
BOOTPROTO=none
BOND_IFACES="gige-1b-0 gige-1b-1 gige-21-0 gige-21-1"
OVS_OPTIONS="bond_mode=balance-tcp lacp=active"
HOTPLUG=no

==> ifcfg-gige-* <==
DEVICE=gige-*
ONBOOT=yes
HOTPLUG=no

An Open vSwitch Tunnel:

==> ifcfg-gre0 <==
DEVICE=ovs-gre0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSTunnel
OVS_BRIDGE=ovsbridge0
OVS_TUNNEL_TYPE=gre
OVS_TUNNEL_OPTIONS="options:remote_ip=A.B.C.D"


Patch Ports:

==> ifcfg-patch-ovs-0 <==
DEVICE=patch-ovs-0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=ovsbridge0
OVS_PATCH_PEER=patch-ovs-1

==> ifcfg-patch-ovs-1 <==
DEVICE=patch-ovs-1
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPatchPort
OVS_BRIDGE=ovsbridge1
OVS_PATCH_PEER=patch-ovs-0

------fake bridge configuration--------------

DEVICE=vlan65
DEVICETYPE=ovs
TYPE=OVSBridge
ONBOOT=yes
BOOTPROTO=static
STP=off
NM_CONTROLLED=no
HOTPLUG=no
OVS_EXTRA="br-set-external-id $DEVICE bridge-id $DEVICE"
OVS_OPTIONS="br0 65"
Variation of fake bridge 

==> ifcfg-vlan100 <==
DEVICE=vlan12
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
BOOTPROTO=static
IPADDR=A.B.C.D
NETMASK=X.Y.Z.0
OVS_BRIDGE=ovsbr
OVS_OPTIONS="tag=12"
OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif"
HOTPLUG=no