diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-02-06 18:58:25 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-02-06 18:58:25 +0000 |
commit | ab987734228f00afb34d7a1cb22f693d29a520fe (patch) | |
tree | 8e91903333b8718119cf46a0d0149e93b4b7dab0 | |
parent | 72dab7821ed4fba67eb24dca0d8ed60689f6200a (diff) | |
parent | 66a7f044f5143feaf7046cebafea3df3ea95e04b (diff) | |
download | nova-ab987734228f00afb34d7a1cb22f693d29a520fe.tar.gz nova-ab987734228f00afb34d7a1cb22f693d29a520fe.tar.xz nova-ab987734228f00afb34d7a1cb22f693d29a520fe.zip |
Merge "Allow disk driver to be chosen per image"
-rw-r--r-- | nova/tests/test_libvirt_blockinfo.py | 31 | ||||
-rw-r--r-- | nova/virt/libvirt/blockinfo.py | 35 |
2 files changed, 63 insertions, 3 deletions
diff --git a/nova/tests/test_libvirt_blockinfo.py b/nova/tests/test_libvirt_blockinfo.py index 23f846324..e8d548399 100644 --- a/nova/tests/test_libvirt_blockinfo.py +++ b/nova/tests/test_libvirt_blockinfo.py @@ -18,6 +18,7 @@ from nova import block_device from nova import context from nova import db +from nova import exception from nova import test import nova.tests.image.fake from nova.virt.libvirt import blockinfo @@ -394,3 +395,33 @@ class LibvirtBlockInfoTest(test.TestCase): 'root': {'bus': 'virtio', 'dev': 'vdf', 'type': 'disk'} } self.assertEqual(mapping, expect) + + def test_get_disk_bus(self): + bus = blockinfo.get_disk_bus_for_device_type('kvm') + self.assertEqual(bus, 'virtio') + + bus = blockinfo.get_disk_bus_for_device_type('kvm', + device_type='cdrom') + self.assertEqual(bus, 'ide') + + image_meta = {'properties': {'disk_bus': 'scsi'}} + bus = blockinfo.get_disk_bus_for_device_type('kvm', + image_meta) + self.assertEqual(bus, 'scsi') + + image_meta = {'properties': {'disk_bus': 'usb', + 'cdrom_bus': 'scsi'}} + bus = blockinfo.get_disk_bus_for_device_type('kvm', + image_meta, + device_type='cdrom') + self.assertEqual(bus, 'scsi') + + bus = blockinfo.get_disk_bus_for_device_type('kvm', + image_meta) + self.assertEqual(bus, 'usb') + + image_meta = {'properties': {'disk_bus': 'xen'}} + self.assertRaises(exception.NovaException, + blockinfo.get_disk_bus_for_device_type, + 'kvm', + image_meta) diff --git a/nova/virt/libvirt/blockinfo.py b/nova/virt/libvirt/blockinfo.py index 844ae4a1b..fc4a7dbfb 100644 --- a/nova/virt/libvirt/blockinfo.py +++ b/nova/virt/libvirt/blockinfo.py @@ -166,7 +166,24 @@ def find_disk_dev_for_disk_bus(mapping, bus, last_device=False): dev_prefix) -def get_disk_bus_for_device_type(virt_type, device_type="disk"): +def is_disk_bus_valid_for_virt(virt_type, disk_bus): + valid_bus = { + 'qemu': ['virtio', 'scsi', 'ide', 'usb'], + 'kvm': ['virtio', 'scsi', 'ide', 'usb'], + 'xen': ['xen', 'ide'], + 'uml': ['uml'], + } + + if virt_type not in valid_bus: + raise exception.NovaException( + _("Unsupported virt type %s") % virt_type) + + return disk_bus in valid_bus[virt_type] + + +def get_disk_bus_for_device_type(virt_type, + image_meta=None, + device_type="disk"): """Determine the best disk bus to use for a device type. Considering the currently configured virtualization @@ -177,6 +194,18 @@ def get_disk_bus_for_device_type(virt_type, device_type="disk"): Returns the disk_bus, or returns None if the device type is not supported for this virtualization""" + # Prefer a disk bus set against the image first of all + if image_meta: + key = device_type + "_bus" + disk_bus = image_meta.get('properties', {}).get(key) + if disk_bus is not None: + if not is_disk_bus_valid_for_virt(virt_type, disk_bus): + raise exception.NovaException( + _("Disk bus %(disk_bus)s is not valid for %(virt)s") % + {'disk_bus': disk_bus, 'virt': virt_type}) + return disk_bus + + # Otherwise pick a hypervisor default disk bus if virt_type == "uml": if device_type == "disk": return "uml" @@ -375,8 +404,8 @@ def get_disk_info(virt_type, instance, block_device_info=None, Returns the disk mapping disk.""" - disk_bus = get_disk_bus_for_device_type(virt_type, "disk") - cdrom_bus = get_disk_bus_for_device_type(virt_type, "cdrom") + disk_bus = get_disk_bus_for_device_type(virt_type, image_meta, "disk") + cdrom_bus = get_disk_bus_for_device_type(virt_type, image_meta, "cdrom") mapping = get_disk_mapping(virt_type, instance, disk_bus, cdrom_bus, block_device_info, |