[Kimchi-devel] [PATCH v2 2/3] Support creating vlan tagged virtual network
Aline Manera
alinefm at linux.vnet.ibm.com
Mon Jan 6 17:41:24 UTC 2014
Reviewed-by: Aline Manera <alinefm at linux.vnet.ibm.com>
On 01/03/2014 05:15 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..82d9e43 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
> }
> }
> },
> diff --git a/src/kimchi/model.py b/src/kimchi/model.py
> index a6790b8..a8bcbef 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_vlan_tagged_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_vlan_tagged_bridge(network)
> network.undefine()
>
> + def _get_vlan_tagged_bridge_name(self, interface, vlan_id):
> + return '-'.join(('kimchi', interface, vlan_id))
> +
> + def _is_vlan_tagged_bridge(self, bridge):
> + return bridge.startswith('kimchi-')
> +
> + def _create_vlan_tagged_bridge(self, interface, vlan_id):
> + br_name = self._get_vlan_tagged_bridge_name(interface, vlan_id)
> + br_xml = networkxml.create_vlan_tagged_bridge_xml(br_name, interface,
> + vlan_id)
> + conn = self.conn.get()
> + conn.changeBegin()
> + try:
> + vlan_tagged_br = conn.interfaceDefineXML(br_xml)
> + vlan_tagged_br.create()
> + except libvirt.libvirtError as e:
> + conn.changeRollback()
> + raise OperationFailed(e.message)
> + else:
> + conn.changeCommit()
> + return br_name
> +
> + def _remove_vlan_tagged_bridge(self, network):
> + try:
> + bridge = network.bridgeName()
> + except libvirt.libvirtError:
> + pass
> + else:
> + if self._is_vlan_tagged_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