summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2013-01-04 13:03:38 +0000
committerDaniel P. Berrange <berrange@redhat.com>2013-01-30 14:33:13 +0000
commit11aec7eccbbd786afb919c914404d33fbd690f36 (patch)
treec009465797c1e16b0f2179e0af26606bfda1b04b
parente0333fa56a0f998a5d44ebeade5b754875c3c7d3 (diff)
downloadnova-11aec7eccbbd786afb919c914404d33fbd690f36.tar.gz
nova-11aec7eccbbd786afb919c914404d33fbd690f36.tar.xz
nova-11aec7eccbbd786afb919c914404d33fbd690f36.zip
Merge QuantumLinuxBridgeVIFDriver into LibvirtGenericVIFDriver
The only difference between the Quantum bridge driver and the new generic VIF driver bridge support is the name of the bridge. This is now provided via the VIF mapping parameter, so there is no need for the dedicated Quantum VIF driver for bridging. This This has the advantage that libvirt firewall filter parameters are correctly configured. The QuantumLinuxBridgeVIFDriver class functionality is merged into LibvirtGenericVIFDriver. For backwards compatibility with the Folsom release, the existing QuantumLinuxBridgeVIFDriver class is made to inherit from LibvirtGenericVIFDriver and directly call the bridge specific setup APIs. This eases migration to the new VIF impl during the Grizzly deployment lifecycle, with an expectation that the QuantumLinuxBridgeVIFDriver stub will be deleted after the Havana release. Blueprint: libvirt-vif-driver Change-Id: I19664f20e5137f495513999214f66279292bda58 Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
-rw-r--r--nova/tests/test_libvirt_vif.py68
-rw-r--r--nova/virt/libvirt/vif.py27
2 files changed, 50 insertions, 45 deletions
diff --git a/nova/tests/test_libvirt_vif.py b/nova/tests/test_libvirt_vif.py
index 7ce81cc09..58504dcd8 100644
--- a/nova/tests/test_libvirt_vif.py
+++ b/nova/tests/test_libvirt_vif.py
@@ -44,6 +44,20 @@ class LibvirtVifTestCase(test.TestCase):
'id': 'network-id-xxx-yyy-zzz'
}
+ net_bridge_quantum = {
+ 'cidr': '101.168.1.0/24',
+ 'cidr_v6': '101:1db9::/64',
+ 'gateway_v6': '101:1db9::1',
+ 'netmask_v6': '64',
+ 'netmask': '255.255.255.0',
+ 'bridge_interface': 'eth0',
+ 'vlan': 99,
+ 'gateway': '101.168.1.1',
+ 'broadcast': '101.168.1.255',
+ 'dns1': '8.8.8.8',
+ 'id': 'network-id-xxx-yyy-zzz'
+ }
+
mapping_bridge = {
'mac': 'ca:fe:de:ad:be:ef',
'gateway_v6': net_bridge['gateway_v6'],
@@ -54,6 +68,15 @@ class LibvirtVifTestCase(test.TestCase):
'vif_type': network_model.VIF_TYPE_BRIDGE,
}
+ mapping_bridge_quantum = {
+ 'mac': 'ca:fe:de:ad:be:ef',
+ 'gateway_v6': net_bridge['gateway_v6'],
+ 'ips': [{'ip': '101.168.1.9'}],
+ 'dhcp_server': '191.168.1.1',
+ 'vif_uuid': 'vif-xxx-yyy-zzz',
+ 'vif_devname': 'tap-xxx-yyy-zzz',
+ }
+
net_ovs = {
'cidr': '101.168.1.0/24',
'cidr_v6': '101:1db9::/64',
@@ -241,10 +264,8 @@ class LibvirtVifTestCase(test.TestCase):
self.net_bridge,
self.mapping_none)
- def _check_bridge_driver(self, d):
- xml = self._get_instance_xml(d,
- self.net_bridge,
- self.mapping_bridge)
+ def _check_bridge_driver(self, d, net, mapping, br_want):
+ xml = self._get_instance_xml(d, net, mapping)
doc = etree.fromstring(xml)
ret = doc.findall('./devices/interface')
@@ -252,17 +273,32 @@ class LibvirtVifTestCase(test.TestCase):
node = ret[0]
self.assertEqual(node.get("type"), "bridge")
br_name = node.find("source").get("bridge")
- self.assertEqual(br_name, self.net_bridge['bridge'])
+ self.assertEqual(br_name, br_want)
mac = node.find("mac").get("address")
self.assertEqual(mac, self.mapping_bridge['mac'])
def test_bridge_driver(self):
d = vif.LibvirtBridgeDriver()
- self._check_bridge_driver(d)
+ self._check_bridge_driver(d,
+ self.net_bridge,
+ self.mapping_bridge,
+ self.net_bridge['bridge'])
def test_generic_driver_bridge(self):
d = vif.LibvirtGenericVIFDriver()
- self._check_bridge_driver(d)
+ self._check_bridge_driver(d,
+ self.net_bridge,
+ self.mapping_bridge,
+ self.net_bridge['bridge'])
+
+ def test_quantum_bridge_driver(self):
+ br_want = 'brq' + self.net_bridge_quantum['id']
+ br_want = br_want[:network_model.NIC_NAME_LEN]
+ d = vif.QuantumLinuxBridgeVIFDriver()
+ self._check_bridge_driver(d,
+ self.net_bridge_quantum,
+ self.mapping_bridge_quantum,
+ br_want)
def test_ovs_ethernet_driver(self):
d = vif.LibvirtOpenVswitchDriver()
@@ -310,24 +346,6 @@ class LibvirtVifTestCase(test.TestCase):
self.assertTrue(iface_id_found)
- def test_quantum_bridge_ethernet_driver(self):
- d = vif.QuantumLinuxBridgeVIFDriver()
- xml = self._get_instance_xml(d,
- self.net_bridge,
- self.mapping_bridge)
-
- doc = etree.fromstring(xml)
- ret = doc.findall('./devices/interface')
- self.assertEqual(len(ret), 1)
- node = ret[0]
- self.assertEqual(node.get("type"), "bridge")
- dev_name = node.find("target").get("dev")
- self.assertTrue(dev_name.startswith("tap"))
- mac = node.find("mac").get("address")
- self.assertEqual(mac, self.mapping_ovs['mac'])
- br_name = node.find("source").get("bridge")
- self.assertEqual(br_name, "br0")
-
def test_quantum_hybrid_driver(self):
d = vif.LibvirtHybridOVSBridgeDriver()
xml = self._get_instance_xml(d,
diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py
index 78ed848a2..3ffdfd0ac 100644
--- a/nova/virt/libvirt/vif.py
+++ b/nova/virt/libvirt/vif.py
@@ -372,33 +372,20 @@ class LibvirtOpenVswitchVirtualPortDriver(LibvirtBaseVIFDriver):
pass
-class QuantumLinuxBridgeVIFDriver(LibvirtBaseVIFDriver):
- """VIF driver for Linux Bridge when running Quantum."""
+class QuantumLinuxBridgeVIFDriver(LibvirtGenericVIFDriver):
+ """Retained in Grizzly for compatibility with Quantum
+ drivers which do not yet report 'vif_type' port binding.
+ Will be deprecated in Havana, and removed in Ixxxx."""
def get_bridge_name(self, network):
def_bridge = ("brq" + network['id'])[:network_model.NIC_NAME_LEN]
return network.get('bridge') or def_bridge
def get_config(self, instance, network, mapping):
- linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(
- self.get_bridge_name(network),
- None,
- filtering=False)
-
- conf = super(QuantumLinuxBridgeVIFDriver,
- self).get_config(instance,
- network,
- mapping)
-
- designer.set_vif_host_backend_bridge_config(
- conf, self.get_bridge_name(network),
- self.get_vif_devname(mapping))
-
- return conf
+ return self.get_config_bridge(instance, network, mapping)
def plug(self, instance, vif):
- pass
+ self.plug_bridge(instance, vif)
def unplug(self, instance, vif):
- """No action needed. Libvirt takes care of cleanup."""
- pass
+ self.unplug_bridge(instance, vif)