[Kimchi-devel] [PATCH 2/3] Support creating vlan tagged virtual network
Mark Wu
wudxw at linux.vnet.ibm.com
Fri Jan 3 02:32:41 UTC 2014
On 01/03/2014 02:11 AM, Aline Manera wrote:
> On 01/02/2014 07:50 AM, Mark Wu wrote:
>> It creates a vlan interface on top of the given nic or bond interface,
>> and bridge the vlan interface to a new created bridge, which is used to
>> forward VM's traffic. So all packets transmitted from VM will be tagged
>> before it departs from the physical network interface.
>>
>> Signed-off-by: Mark Wu <wudxw at linux.vnet.ibm.com>
>> ---
>> src/kimchi/API.json | 6 ++++++
>> src/kimchi/model.py | 47
>> ++++++++++++++++++++++++++++++++++++++++++++---
>> 2 files changed, 50 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/kimchi/API.json b/src/kimchi/API.json
>> index 7b90826..07bf41e 100644
>> --- a/src/kimchi/API.json
>> +++ b/src/kimchi/API.json
>> @@ -56,6 +56,12 @@
>> "interface": {
>> "description": "The name of a network interface
>> on the host",
>> "type": "string"
>> + },
>> + "vlan_id": {
>> + "description": "Network's VLAN ID",
>> + "type": "integer",
>> + "maximum": 4094,
>> + "minimum": 1
>> }
>
> Please, use 4 spaces to indentation
ACK. thanks!
>
>> }
>> },
>> diff --git a/src/kimchi/model.py b/src/kimchi/model.py
>> index a6790b8..b3589e9 100644
>> --- a/src/kimchi/model.py
>> +++ b/src/kimchi/model.py
>> @@ -58,6 +58,7 @@ from kimchi import config
>> from kimchi import isoinfo
>> from kimchi import netinfo
>> from kimchi import network as knetwork
>> +from kimchi import networkxml
>> from kimchi import vnc
>> from kimchi import xmlutils
>> from kimchi.asynctask import AsyncTask
>> @@ -65,7 +66,6 @@ from kimchi.distroloader import DistroLoader
>> from kimchi.exception import InvalidOperation, InvalidParameter,
>> MissingParameter
>> from kimchi.exception import NotFoundError, OperationFailed
>> from kimchi.featuretests import FeatureTests
>> -from kimchi.networkxml import to_network_xml
>> from kimchi.objectstore import ObjectStore
>> from kimchi.scan import Scanner
>> from kimchi.screenshot import VMScreenshot
>> @@ -806,7 +806,12 @@ class Model(object):
>> if netinfo.is_bridge(iface):
>> params['bridge'] = iface
>> elif netinfo.is_bare_nic(iface) or netinfo.is_bonding(iface):
>> - params['forward']['dev'] = iface
>> + if params.get('vlan_id') is None:
>> + params['forward']['dev'] = iface
>> + else:
>> + params['bridge'] = \
>> + self._create_vlanned_bridge(str(iface),
>> + str(params['vlan_id']))
>> else:
>> raise InvalidParameter("the interface should be bare
>> nic, "
>> "bonding or bridge device.")
>> @@ -830,7 +835,7 @@ class Model(object):
>> if connection == 'bridge':
>> self._set_network_bridge(params)
>>
>> - xml = to_network_xml(**params)
>> + xml = networkxml.to_network_xml(**params)
>>
>> try:
>> network = conn.networkDefineXML(xml)
>> @@ -888,8 +893,44 @@ class Model(object):
>> if network.isActive():
>> raise InvalidOperation(
>> "Unable to delete the active network %s" % name)
>> + self._remove_vlanned_bridge(network)
>> network.undefine()
>>
>> + def _get_vlanned_bridge_name(self, interface, vlan_id):
>> + return '-'.join(('kimchi', interface, vlan_id))
>> +
>> + def _is_vlanned_bridge(self, bridge):
>> + return bridge.startswith('kimchi-')
>> +
>> + def _create_vlanned_bridge(self, interface, vlan_id):
>> + bridge = self._get_vlanned_bridge_name(interface, vlan_id)
>> + bridge_xml = networkxml.create_vlanned_bridge_xml(bridge,
>> interface,
>> + vlan_id)
>> + conn = self.conn.get()
>> + conn.changeBegin()
>> + try:
>> + vlanned_bridge = conn.interfaceDefineXML(bridge_xml)
>> + vlanned_bridge.create()
>> + except:
>> + conn.changeRollback()
>> + raise OperationFailed('Failed to create vlanned bridge')
>> + else:
>> + conn.changeCommit()
>> + return bridge
>> +
>> + def _remove_vlanned_bridge(self, network):
>> + try:
>> + bridge = network.bridgeName()
>> + except libvirt.libvirtError:
>> + pass
>> + else:
>> + if self._is_vlanned_bridge(bridge):
>> + conn = self.conn.get()
>> + iface = conn.interfaceLookupByName(bridge)
>> + if iface.isActive():
>> + iface.destroy()
>> + iface.undefine()
>> +
>> def add_task(self, target_uri, fn, opaque=None):
>> id = self.next_taskid
>> self.next_taskid = self.next_taskid + 1
>
More information about the Kimchi-devel
mailing list