def test_get_machine_type_from_image(self): image_meta = objects.ImageMeta.from_dict({ "disk_format": "raw", "properties": { "hw_machine_type": "q35" } }) os_mach_type = libvirt_utils.get_machine_type(image_meta) self.assertEqual('q35', os_mach_type)
def test_get_machine_type_from_fallbacks(self, mock_get_arch): """Test hardcoded arch-specific fallbacks for default machine type""" image_meta = objects.ImageMeta.from_dict({"disk_format": "raw"}) host_cpu_archs = { obj_fields.Architecture.ARMV7: "virt", obj_fields.Architecture.AARCH64: "virt", obj_fields.Architecture.S390: "s390-ccw-virtio", obj_fields.Architecture.S390X: "s390-ccw-virtio", obj_fields.Architecture.I686: "pc", obj_fields.Architecture.X86_64: "pc", } for arch, expected_mtype in host_cpu_archs.items(): mock_get_arch.return_value = arch mtype = libvirt_utils.get_machine_type(image_meta) self.assertEqual(expected_mtype, mtype)
def get_disk_bus_for_device_type(instance, virt_type, image_meta, device_type="disk"): """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' for the 'pc' machine type on x86_64, 'sata' for the 'q35' machine type 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 if device_type == "disk": disk_bus = osinfo.HardwareProperties(image_meta).disk_model else: key = "hw_" + device_type + "_bus" disk_bus = image_meta.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 = obj_fields.VMMode.get_from_instance(instance) if guest_vm_mode == obj_fields.VMMode.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 ( obj_fields.Architecture.PPC, obj_fields.Architecture.PPC64, obj_fields.Architecture.PPCLE, obj_fields.Architecture.PPC64LE, obj_fields.Architecture.S390, obj_fields.Architecture.S390X, obj_fields.Architecture.AARCH64): return "scsi" machine_type = libvirt_utils.get_machine_type(image_meta) # NOTE(lyarwood): We can't be any more explicit here as QEMU # provides a version of the Q35 machine type per release. # Additionally downstream distributions can also provide their own. if machine_type and 'q35' in machine_type: # NOTE(lyarwood): The Q35 machine type does not provide an IDE # bus and as such we must use a SATA bus for cdroms. return "sata" 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 "scsi" else: # If virt-type not in list then it is unsupported raise exception.UnsupportedVirtType(virt=virt_type) return None
def get_machine_type(image_meta): return libvirt_utils.get_machine_type(image_meta)