summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2012-12-17 15:04:18 +0000
committerDaniel P. Berrange <berrange@redhat.com>2012-12-21 10:16:08 +0000
commit40f3724bec5cc9883af7597af6c33c480b7d3c97 (patch)
treef8afaf5c9900c8335dc5665e9aede7024f246735
parente84dc2603532f4577bd42846191a530f3abd2e48 (diff)
Make libvirt driver default to virtio for KVM/QEMU NICs
Currently users of KVM/QEMU must set libvirt_use_virtio_for_bridges to true to get a virtio based NIC, instead of the awful rtl8139 that QEMU defaults to. Switch libvirt_use_virtio_for_bridges to default to enabled, but ensure it only takes effect if libvirt_type is 'kvm' or 'qemu'. Although it is possible that some guest OS do not support virtio drivers, currently Nova hardcodes use of 'virtio' for disks, so this change doesn't make the current guest OS support situation worse. Obviously in the future, both NIC & disk models will have to be made fully configurable Change-Id: I7c0d306921f554ac2d06b5bdb1f9017ab7f9c643 Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
-rw-r--r--nova/tests/test_libvirt_vif.py76
-rw-r--r--nova/virt/libvirt/vif.py11
2 files changed, 84 insertions, 3 deletions
diff --git a/nova/tests/test_libvirt_vif.py b/nova/tests/test_libvirt_vif.py
index 5cd2ea83c..c8b766f39 100644
--- a/nova/tests/test_libvirt_vif.py
+++ b/nova/tests/test_libvirt_vif.py
@@ -120,6 +120,82 @@ class LibvirtVifTestCase(test.TestCase):
self.assertEqual(nic['target_dev'],
node.find("target").get("dev"))
+ def test_model_novirtio(self):
+ self.flags(libvirt_use_virtio_for_bridges=False,
+ libvirt_type='kvm')
+
+ d = vif.LibvirtBridgeDriver()
+ xml = self._get_instance_xml(d)
+
+ doc = etree.fromstring(xml)
+ ret = doc.findall('./devices/interface')
+ self.assertEqual(len(ret), 1)
+ node = ret[0]
+
+ ret = node.findall("model")
+ self.assertEqual(len(ret), 0)
+ ret = node.findall("driver")
+ self.assertEqual(len(ret), 0)
+
+ d.unplug(None, (self.net, self.mapping))
+
+ def test_model_kvm(self):
+ self.flags(libvirt_use_virtio_for_bridges=True,
+ libvirt_type='kvm')
+
+ d = vif.LibvirtBridgeDriver()
+ xml = self._get_instance_xml(d)
+
+ doc = etree.fromstring(xml)
+ ret = doc.findall('./devices/interface')
+ self.assertEqual(len(ret), 1)
+ node = ret[0]
+
+ model = node.find("model").get("type")
+ self.assertEqual(model, "virtio")
+ ret = node.findall("driver")
+ self.assertEqual(len(ret), 0)
+
+ d.unplug(None, (self.net, self.mapping))
+
+ def test_model_qemu(self):
+ self.flags(libvirt_use_virtio_for_bridges=True,
+ libvirt_type='qemu')
+
+ d = vif.LibvirtBridgeDriver()
+ xml = self._get_instance_xml(d)
+
+ doc = etree.fromstring(xml)
+ ret = doc.findall('./devices/interface')
+ self.assertEqual(len(ret), 1)
+ node = ret[0]
+
+ model = node.find("model").get("type")
+ self.assertEqual(model, "virtio")
+ driver = node.find("driver").get("name")
+ self.assertEqual(driver, "qemu")
+
+ d.unplug(None, (self.net, self.mapping))
+
+ def test_model_xen(self):
+ self.flags(libvirt_use_virtio_for_bridges=True,
+ libvirt_type='xen')
+
+ d = vif.LibvirtBridgeDriver()
+ xml = self._get_instance_xml(d)
+
+ doc = etree.fromstring(xml)
+ ret = doc.findall('./devices/interface')
+ self.assertEqual(len(ret), 1)
+ node = ret[0]
+
+ ret = node.findall("model")
+ self.assertEqual(len(ret), 0)
+ ret = node.findall("driver")
+ self.assertEqual(len(ret), 0)
+
+ d.unplug(None, (self.net, self.mapping))
+
def test_bridge_driver(self):
d = vif.LibvirtBridgeDriver()
xml = self._get_instance_xml(d)
diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py
index 16a80b937..ef9f9e6af 100644
--- a/nova/virt/libvirt/vif.py
+++ b/nova/virt/libvirt/vif.py
@@ -36,8 +36,8 @@ libvirt_vif_opts = [
default='br-int',
help='Name of Integration Bridge used by Open vSwitch'),
cfg.BoolOpt('libvirt_use_virtio_for_bridges',
- default=False,
- help='Use virtio for bridge interfaces'),
+ default=True,
+ help='Use virtio for bridge interfaces with KVM/QEMU'),
]
CONF = cfg.CONF
@@ -53,8 +53,13 @@ class LibvirtBaseVIFDriver(vif.VIFDriver):
def get_config(self, instance, network, mapping):
conf = vconfig.LibvirtConfigGuestInterface()
conf.mac_addr = mapping['mac']
- if CONF.libvirt_use_virtio_for_bridges:
+ if CONF.libvirt_type in ('kvm', 'qemu') and \
+ CONF.libvirt_use_virtio_for_bridges:
conf.model = "virtio"
+ # Workaround libvirt bug, where it mistakenly
+ # enables vhost mode, even for non-KVM guests
+ if CONF.libvirt_type == "qemu":
+ conf.driver_name = "qemu"
return conf