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>
This commit is contained in:
Daniel P. Berrange 2012-12-17 15:04:18 +00:00
parent e84dc26035
commit 40f3724bec
2 changed files with 84 additions and 3 deletions

View File

@ -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)

View File

@ -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