[Kimchi-devel] [PATCH] Add OVS bridges recognition support
Abhiram
abhiramk at linux.vnet.ibm.com
Fri Nov 6 13:56:23 UTC 2015
On Thu, 2015-11-05 at 17:40 -0200, Lucio Correia wrote:
> In some distributions, i.e. Fedora, the directories "bridge"
> and "brif" are not created for OVS bridges, and they are the
> method Kimchi uses to detect bridges.
>
> This patch fixes that by recognizing OVS bridges through OVS
> commands, allowing networks to be created using OVS bridges
> in those distributions.
>
> Signed-off-by: Lucio Correia <luciojhc at linux.vnet.ibm.com>
> ---
> src/wok/plugins/kimchi/model/networks.py | 2 +-
> src/wok/plugins/kimchi/netinfo.py | 55 ++++++++++++++++++++++++++++----
> 2 files changed, 50 insertions(+), 7 deletions(-)
>
> diff --git a/src/wok/plugins/kimchi/model/networks.py b/src/wok/plugins/kimchi/model/networks.py
> index 71ea595..d78b88e 100644
> --- a/src/wok/plugins/kimchi/model/networks.py
> +++ b/src/wok/plugins/kimchi/model/networks.py
> @@ -167,7 +167,7 @@ class NetworksModel(object):
> raise MissingParameter("KCHNET0004E", {'name': params['name']})
>
> self._ensure_iface_up(iface)
> - if netinfo.is_bridge(iface):
> + if netinfo.is_bridge(iface) or netinfo.is_ovs_bridge(iface):
> if 'vlan_id' in params:
> raise InvalidParameter('KCHNET0019E', {'name': iface})
> params['bridge'] = iface
> diff --git a/src/wok/plugins/kimchi/netinfo.py b/src/wok/plugins/kimchi/netinfo.py
> index c5746d7..f210da8 100644
> --- a/src/wok/plugins/kimchi/netinfo.py
> +++ b/src/wok/plugins/kimchi/netinfo.py
> @@ -21,6 +21,8 @@ import ethtool
> import glob
> import os
>
> +from distutils.spawn import find_executable
> +from wok.utils import run_command
>
> NET_PATH = '/sys/class/net'
> NIC_PATH = '/sys/class/net/*/device'
> @@ -79,6 +81,39 @@ def bridges():
> def is_bridge(iface):
> return iface in bridges()
>
> +# OVS bridges need special handling because in some distributions, like Fedora,
> +# the files bridge and brif are not created under /sys/class/net/<ovsbridge>.
> +def ovs_bridges():
> + ovs_cmd = find_executable("ovs-vsctl")
> +
> + # OVS not installed: there is no OVS bridge configured
> + if ovs_cmd is None:
> + return []
> +
> + out, error, rc = run_command([ovs_cmd, '--oneline', 'list-br'])
> + if rc != 0 or len(out) == 0:
Do you want to log errors in case of rc!=0 ?
> + return []
> +
> + return list(set(out.split('\n')) - set(['']))
> +
> +
> +def is_ovs_bridge(iface):
> + return iface in ovs_bridges()
> +
> +
> +def ovs_bridge_ports(ovsbr):
> + ovs_cmd = find_executable("ovs-vsctl")
> +
> + # OVS not installed: there is no OVS bridge configured
> + if ovs_cmd is None:
> + return []
> +
> + out, error, rc = run_command([ovs_cmd, '--oneline', 'list-ports', ovsbr])
> + if rc != 0 or len(out) == 0:
Do you want to log errors in case of rc!=0 ?
> + return []
> +
> + return list(set(out.split('\n')) - set(['']))
> +
>
> def all_interfaces():
> return [d.rsplit("/", 1)[-1] for d in glob.glob(NET_PATH + '/*')]
> @@ -91,7 +126,12 @@ def slaves(bonding):
>
>
> def ports(bridge):
> - return os.listdir(BRIDGE_PORTS % bridge)
> + if bridge in bridges():
> + return os.listdir(BRIDGE_PORTS % bridge)
> + elif bridge in ovs_bridges():
> + return ovs_bridge_ports(bridge)
> +
> + raise ValueError('unknown bridge %s' % bridge)
Please add the message to i18 file.
>
>
> def is_brport(nic):
> @@ -136,9 +176,11 @@ def get_vlan_device(vlan):
>
> def get_bridge_port_device(bridge):
> """Return the nics list that belongs to bridge."""
> - # br --- v --- bond --- nic1
> - if bridge not in bridges():
> +
> + if bridge not in bridges() and bridge not in ovs_bridges():
> raise ValueError('unknown bridge %s' % bridge)
Please add the message to i18 file.
> +
> + # br --- v --- bond --- nic1
> nics = []
> for port in ports(bridge):
> if port in vlans():
> @@ -155,9 +197,10 @@ def get_bridge_port_device(bridge):
>
>
> def aggregated_bridges():
> - return [bridge for bridge in bridges() if
> - (set(get_bridge_port_device(bridge)) & set(nics()))]
> + all_bridges = list(set(bridges() + ovs_bridges()))
>
> + return [bridge for bridge in all_bridges if
> + (set(get_bridge_port_device(bridge)) & set(nics()))]
>
> def bare_nics():
> "The nic is not a port of a bridge or a slave of bond."
> @@ -184,7 +227,7 @@ def get_interface_type(iface):
> return "nic"
> if is_bonding(iface):
> return "bonding"
> - if is_bridge(iface):
> + if is_bridge(iface) or is_ovs_bridge(iface):
> return "bridge"
> if is_vlan(iface):
> return "vlan"
More information about the Kimchi-devel
mailing list