[Kimchi-devel] [PATCH] Add OVS bridges recognition support

Lucio Correia luciojhc at linux.vnet.ibm.com
Mon Nov 9 13:33:40 UTC 2015


Hi Abhiram, thanks for the review. I will send a V2 because there is a 
piece missing on my patch. My replies below.

On 06-11-2015 11:56, Abhiram wrote:
> 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 ?
I think it's a good idea. I will also remove the len(out)==0 
verification since it's already done by return command below.

>> +        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 ?

Same as above.

>> +        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.
Good catch, I will fix that. I've reused an existing message and was not 
concerning about that, but that message is not in i18n 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.
Yes, this is the already existing message.

>> +
>> +    #   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"
>
>


-- 
Lucio Correia
Software Engineer
IBM LTC Brazil




More information about the Kimchi-devel mailing list