[Kimchi-devel] [PATCH v2] Support Linux Bridge creation

Lucio Correia luciojhc at linux.vnet.ibm.com
Wed Nov 4 11:24:59 UTC 2015


On 30-10-2015 15:41, Aline Manera wrote:
>
>
> On 30/10/2015 14:29, Ramon Medeiros wrote:
>> Create linux-bridge with libvirt API. Kimchi was only creating macvtap
>> devices, with has some limitation. For further information, take a look
>> at Kimchi wiki discuss:
>> https://github.com/kimchi-project/kimchi/wiki/Create-guest-network
>>
>> Signed-off-by: Ramon Medeiros <ramonn at linux.vnet.ibm.com>
>>
>> Changes:
>>
>> v2:
>>
>> Remove unused imports and constants
>> Fix pep8 issues
>>
>>
>> Testing:
>>
>> In my case, i create a new bridge over the interface enp0s25 with name
>> ramon
>>
>> curl -u root  -H "Content-Type: application/json" -H "Accept:
>> application/json" "http://localhost:8010/plugins/kimchi/networks" -X
>> POST -d '{"name": "ramon", "connection":"bridge",
>> "interface":"enp0s25", "mode":"linux-bridge"}'
>
>  From what I remembered from the RFC, we have agreed to do not add a new
> parameter "mode" and instead of that use "connection" equal to "macvtap"
> for macvtap bridge or "bridge" for Linux bridge.
>
> Any special reason to do not follow the RFC discussion?
>

Aline, could you point me to that discussion? I'm out of context here.


>> To delete, you can remove by UI or:
>>
>> curl -u root  -H "Content-Type: application/json" -H "Accept:
>> application/json"
>> "http://localhost:8010/plugins/kimchi/networks/ramon" -X DELETE -d ''
>>
>> ---
>>   src/wok/plugins/kimchi/model/networks.py   | 35
>> ++++++++++++++++++++++++++++--
>>   src/wok/plugins/kimchi/network.py          | 19 ++++++++++++++++
>>   src/wok/plugins/kimchi/xmlutils/network.py | 12 ++++++++++
>>   3 files changed, 64 insertions(+), 2 deletions(-)
>
> Please, update API.json, docs/API.md and add test cases to cover the new
> API.
>

Will do.

>> diff --git a/src/wok/plugins/kimchi/model/networks.py
>> b/src/wok/plugins/kimchi/model/networks.py
>> index 71ea595..c17a3bf 100644
>> --- a/src/wok/plugins/kimchi/model/networks.py
>> +++ b/src/wok/plugins/kimchi/model/networks.py
>> @@ -30,12 +30,13 @@ from wok.rollbackcontext import RollbackContext
>>   from wok.utils import run_command, wok_log
>>   from wok.xmlutils.utils import xpath_get_text
>>
>> +
>
> Just one line to separated import blocks.
>

ok

>>   from wok.plugins.kimchi import netinfo
>>   from wok.plugins.kimchi import network as knetwork
>>   from wok.plugins.kimchi.osinfo import defaults as tmpl_defaults
>>   from wok.plugins.kimchi.xmlutils.network import
>> create_vlan_tagged_bridge_xml
>>   from wok.plugins.kimchi.xmlutils.network import to_network_xml
>> -
>> +from wok.plugins.kimchi.xmlutils.network import create_linux_bridge
>>
>>   KIMCHI_BRIDGE_PREFIX = 'kb'
>>
>> @@ -160,7 +161,10 @@ class NetworksModel(object):
>>       def _set_network_bridge(self, params):
>>           try:
>>               iface = params['interface']
>
>> -            if iface in self.get_all_networks_interfaces():
>> +
>> +            if params["mode"] == "linux-bridge":
>> +                iface = self._create_linux_bridge(iface)
>
> Don't you need to verify the interface is not in use by any other network?
>

better to verify. Will change the elif below to an if.

>> +            elif iface in self.get_all_networks_interfaces():
>>                   msg_args = {'iface': iface, 'network': params['name']}
>>                   raise InvalidParameter("KCHNET0006E", msg_args)
>>           except KeyError:
>> @@ -196,6 +200,33 @@ class NetworksModel(object):
>>               net_dict['bridge'] and
>> interfaces.append(net_dict['bridge'])
>>           return interfaces
>>
>> +    def _create_linux_bridge(self, interface):
>> +        newBridge = KIMCHI_BRIDGE_PREFIX + interface[-8:]
>
>> +        bridges_list = knetwork.list_bridges()
>> +
>> +        bridges = []
>> +        for bridge in bridges_list:
>> +            bridges.append(bridge["bridge"])
>> +
>
>
>
>> +        # bridge already exists: create new name
>> +        if newBridge in bridges:
>> +            for i in range(0, 10):
>> +                newBridge = KIMCHI_BRIDGE_PREFIX + interface[-7:] +
>> str(i)
>> +                if newBridge not in bridges:
>> +                        break
>> +
>
> What happen when you are not able to get a bridge name?
>

I will raise a failure for that case.


>> +        # create linux bridge by libvirt
>> +        try:
>> +            conn = self.conn.get()
>> +            iface =
>> conn.interfaceDefineXML(create_linux_bridge(newBridge,
>> +
>> interface))
>> +            iface.create()
>> +        except libvirt.libvirtError as e:
>> +            raise OperationFailed("KCHNET0008E",
>> +                                  {'name': newBridge,
>> +                                   'err': e.get_error_message()})
>> +        return newBridge
>> +
>>       def _create_vlan_tagged_bridge(self, interface, vlan_id):
>>           # Truncate the interface name if it exceeds 8 characters to
>> make sure
>>           # the length of bridge name is less than 15 (its maximum
>> value).
>> diff --git a/src/wok/plugins/kimchi/network.py
>> b/src/wok/plugins/kimchi/network.py
>> index 1433b8a..18df281 100644
>> --- a/src/wok/plugins/kimchi/network.py
>> +++ b/src/wok/plugins/kimchi/network.py
>> @@ -21,6 +21,7 @@
>>   import ethtool
>>   import ipaddr
>>
>> +from wok.utils import run_command
>>
>>   APrivateNets = ipaddr.IPNetwork("10.0.0.0/8")
>>   BPrivateNets = ipaddr.IPNetwork("172.16.0.0/12")
>> @@ -60,3 +61,21 @@ def get_one_free_network(used_nets,
>> nets_pool=PrivateNets):
>>           if net:
>>               return net
>>       return None
>> +
>> +def list_bridges():
>> +    # get all bridges
>> +    _, err, rc = run_command(['brctl', 'show'])
>> +    output = _.splitlines()
>> +
>> +    # iterate over output
>> +    i = 1
>> +    bridges = []
>> +    while (i < len(output)):
>> +
>> +        # get bridge name
>> +        bridges.append({"bridge": output[i].split('\t')[0],
>> +                        "interface": output[i].split('\t')[5]})
>> +        i += 1
>> +
>> +    return bridges
>> +
>> diff --git a/src/wok/plugins/kimchi/xmlutils/network.py
>> b/src/wok/plugins/kimchi/xmlutils/network.py
>> index c73aad9..2fdf8d4 100644
>> --- a/src/wok/plugins/kimchi/xmlutils/network.py
>> +++ b/src/wok/plugins/kimchi/xmlutils/network.py
>> @@ -120,3 +120,15 @@ def create_vlan_tagged_bridge_xml(bridge,
>> interface, vlan_id):
>>           type='bridge',
>>           name=bridge)
>>       return ET.tostring(m)
>> +
>> +def create_linux_bridge(bridge, interface):
>
> create_linux_bridge_xml is more meaningful for this function
>

ok

>> +    m = E.interface(
>> +        E.start(mode='onboot'),
>> +        E.bridge(
>> +            E.interface(
>> +                type='ethernet',
>> +                name=interface)),
>> +        type='bridge',
>> +        name=bridge)
>> +    return ET.tostring(m)
>> +
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>


-- 
Lucio Correia
Software Engineer
IBM LTC Brazil




More information about the Kimchi-devel mailing list