def get_disk_bus_for_device_type(virt_type, image_meta, device_type="disk", instance=None): """Determine the best disk bus to use for a device type. Considering the currently configured virtualization type, return the optimal disk_bus to use for a given device type. For example, for a disk on KVM it will return 'virtio', while for a CDROM it will return 'ide' on x86_64 and 'scsi' on ppc64. 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 key = "hw_" + 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.UnsupportedHardware(model=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" elif virt_type == "lxc": return "lxc" elif virt_type == "xen": guest_vm_mode = None if instance: guest_vm_mode = vm_mode.get_from_instance(instance) if guest_vm_mode == vm_mode.HVM: return "ide" else: return "xen" elif virt_type in ("qemu", "kvm"): if device_type == "cdrom": guestarch = libvirt_utils.get_arch(image_meta) if guestarch in (arch.PPC, arch.PPC64, arch.S390, arch.S390X): return "scsi" else: return "ide" elif device_type == "disk": return "virtio" elif device_type == "floppy": return "fdc" elif virt_type == "parallels": if device_type == "cdrom": return "ide" elif device_type == "disk": return "sata" else: # If virt-type not in list then it is unsupported raise exception.UnsupportedVirtType(virt=virt_type) return None
def test_good(self): inst = self._fake_object(dict(vm_mode="hvm")) mode = vm_mode.get_from_instance(inst) self.assertEqual(mode, "hvm")
def test_legacy_pv(self): inst = self._fake_object(dict(vm_mode="pv")) mode = vm_mode.get_from_instance(inst) self.assertEqual(mode, "xen")