From 7c10d8a27f0f635c185d1b85d6d26120d51c8aa2 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Wed, 23 Sep 2015 17:26:48 -0400 Subject: [PATCH] devicedisk: Tweak driver defaults for xen Following some discussion here: https://bugzilla.redhat.com/show_bug.cgi?id=1171550 jfehlig suggested better defaults for modern xen. End result is: - Drop the blktap check, since it's deprecated (yaay) - If xen + block device, use driver_name=phy - Otherwise if on modern enough libvirt + libxl, do the same thing we do for qemu. --- .../compare/virt-install-xen-default.xml | 1 + .../compare/virt-install-xen-hvm.xml | 6 ++- .../compare/virt-install-xen-pv.xml | 2 + tests/clitest.py | 5 ++- virtinst/devicedisk.py | 44 +++++++------------ virtinst/support.py | 33 +++++++++++--- virtinst/util.py | 24 ---------- 7 files changed, 54 insertions(+), 61 deletions(-) diff --git a/tests/cli-test-xml/compare/virt-install-xen-default.xml b/tests/cli-test-xml/compare/virt-install-xen-default.xml index d60c5b741..a9054a6ab 100644 --- a/tests/cli-test-xml/compare/virt-install-xen-default.xml +++ b/tests/cli-test-xml/compare/virt-install-xen-default.xml @@ -10,6 +10,7 @@ restart + diff --git a/tests/cli-test-xml/compare/virt-install-xen-hvm.xml b/tests/cli-test-xml/compare/virt-install-xen-hvm.xml index 0fe3064e6..41f03c049 100644 --- a/tests/cli-test-xml/compare/virt-install-xen-hvm.xml +++ b/tests/cli-test-xml/compare/virt-install-xen-hvm.xml @@ -20,11 +20,13 @@ restart /usr/lib64/xen/bin/qemu-dm - - + + + + diff --git a/tests/cli-test-xml/compare/virt-install-xen-pv.xml b/tests/cli-test-xml/compare/virt-install-xen-pv.xml index 565091bea..e0b0f0a28 100644 --- a/tests/cli-test-xml/compare/virt-install-xen-pv.xml +++ b/tests/cli-test-xml/compare/virt-install-xen-pv.xml @@ -15,6 +15,7 @@ destroy + @@ -39,6 +40,7 @@ restart + diff --git a/tests/clitest.py b/tests/clitest.py index c8a9dfee9..e17990614 100644 --- a/tests/clitest.py +++ b/tests/clitest.py @@ -95,6 +95,7 @@ test_files = { 'NEWCLONEIMG2' : new_images[1], 'NEWCLONEIMG3' : new_images[2], 'AUTOMANAGEIMG' : "/some/new/pool/dir/new", + 'BLOCKVOL' : '/iscsi-pool/diskvol1', 'EXISTIMG1' : "/dev/default-pool/testvol1.img", 'EXISTIMG2' : "/dev/default-pool/testvol2.img", 'EXISTIMG3' : exist_images[0], @@ -446,7 +447,7 @@ c.add_compare(""" \ --disk %(NEWIMG1)s,sparse=false,size=.001,perms=ro,error_policy=enospace,discard=unmap \ --disk device=cdrom,bus=sata,read_bytes_sec=1,read_iops_sec=2,total_bytes_sec=10,total_iops_sec=20,write_bytes_sec=5,write_iops_sec=6 \ --disk size=1 \ ---disk /iscsi-pool/diskvol1 \ +--disk %(BLOCKVOL)s \ --disk /dev/default-pool/iso-vol \ --disk /dev/default-pool/iso-vol,format=qcow2 \ --disk source_pool=rbd-ceph,source_volume=some-rbd-vol,size=.1 \ @@ -740,7 +741,7 @@ c = vinst.add_category("xen", "--connect %(URI-XEN)s --noautoconsole") c.add_valid("--disk %(EXISTIMG1)s --location %(TREEDIR)s --paravirt --graphics none") # Xen PV install headless c.add_compare("--disk %(EXISTIMG1)s --import", "xen-default") # Xen default c.add_compare("--disk %(EXISTIMG1)s --location %(TREEDIR)s --paravirt", "xen-pv") # Xen PV -c.add_compare("--disk %(EXISTIMG1)s --cdrom %(EXISTIMG1)s --livecd --hvm", "xen-hvm") # Xen HVM +c.add_compare("--disk %(BLOCKVOL)s --cdrom %(EXISTIMG1)s --livecd --hvm", "xen-hvm") # Xen HVM diff --git a/virtinst/devicedisk.py b/virtinst/devicedisk.py index 94f0bbc8d..591c93b96 100644 --- a/virtinst/devicedisk.py +++ b/virtinst/devicedisk.py @@ -41,12 +41,12 @@ def _qemu_sanitize_drvtype(phystype, fmt, manual_format=False): if phystype == VirtualDisk.TYPE_BLOCK: if not fmt: - return VirtualDisk.DRIVER_QEMU_RAW + return VirtualDisk.DRIVER_TYPE_RAW if fmt and not manual_format: - return VirtualDisk.DRIVER_QEMU_RAW + return VirtualDisk.DRIVER_TYPE_RAW if fmt in raw_list: - return VirtualDisk.DRIVER_QEMU_RAW + return VirtualDisk.DRIVER_TYPE_RAW return fmt @@ -94,22 +94,9 @@ def _is_dir_searchable(uid, username, path): class VirtualDisk(VirtualDevice): virtual_device_type = VirtualDevice.VIRTUAL_DEV_DISK - DRIVER_FILE = "file" - DRIVER_PHY = "phy" - DRIVER_TAP = "tap" - DRIVER_QEMU = "qemu" - driver_names = [DRIVER_FILE, DRIVER_PHY, DRIVER_TAP, DRIVER_QEMU] - - DRIVER_QEMU_RAW = "raw" - # No list here, since there are many other valid values - - DRIVER_TAP_RAW = "aio" - DRIVER_TAP_QCOW = "qcow" - DRIVER_TAP_VMDK = "vmdk" - DRIVER_TAP_VDISK = "vdisk" - DRIVER_TAP_QED = "qed" - driver_types = [DRIVER_TAP_RAW, DRIVER_TAP_QCOW, - DRIVER_TAP_VMDK, DRIVER_TAP_VDISK, DRIVER_TAP_QED] + DRIVER_NAME_PHY = "phy" + DRIVER_NAME_QEMU = "qemu" + DRIVER_TYPE_RAW = "raw" CACHE_MODE_NONE = "none" CACHE_MODE_WRITETHROUGH = "writethrough" @@ -548,8 +535,15 @@ class VirtualDisk(VirtualDevice): def _get_default_driver_name(self): if not self.path: return None - if self.conn.is_qemu(): - return self.DRIVER_QEMU + + # Recommended xen defaults from here: + # https://bugzilla.redhat.com/show_bug.cgi?id=1171550#c9 + # If type block, use name=phy. Otherwise do the same as qemu + if self.conn.is_xen() and self.type == self.TYPE_BLOCK: + return self.DRIVER_NAME_PHY + if self.conn.check_support( + self.conn.SUPPORT_CONN_DISK_DRIVER_NAME_QEMU): + return self.DRIVER_NAME_QEMU return None def _get_default_driver_type(self): @@ -562,7 +556,7 @@ class VirtualDisk(VirtualDevice): http://lists.gnu.org/archive/html/qemu-devel/2008-04/msg00675.html """ - if self.driver_name != self.DRIVER_QEMU: + if self.driver_name != self.DRIVER_NAME_QEMU: return None drvtype = self._storage_backend.get_driver_type() @@ -879,12 +873,6 @@ class VirtualDisk(VirtualDevice): if self.is_cdrom() and guest.os.is_s390x(): self.bus = "scsi" - if (guest.os.is_xenpv() and - self.type == VirtualDisk.TYPE_FILE and - self.driver_name is None and - util.is_blktap_capable(self.conn)): - self.driver_name = VirtualDisk.DRIVER_TAP - if not self.conn.is_qemu(): return if not self.is_disk(): diff --git a/virtinst/support.py b/virtinst/support.py index 68c76296a..cf5bd38f6 100644 --- a/virtinst/support.py +++ b/virtinst/support.py @@ -310,8 +310,18 @@ SUPPORT_CONN_SPICE_COMPRESSION = _make(version="0.9.1") SUPPORT_CONN_VMPORT = _make( version="1.2.16", hv_version={"qemu": "2.2.0", "test": 0}) +# This is for disk . xen supports this, but it's +# limited to arbitrary new enough xen, since I know libxl can handle it +# but I don't think the old xend driver does. +SUPPORT_CONN_DISK_DRIVER_NAME_QEMU = _make( + hv_version={"qemu": 0, "xen": "4.2.0"}, + hv_libvirt_version={"qemu": 0, "xen": "1.1.0"}) + + +################# +# Domain checks # +################# -# Domain checks SUPPORT_DOMAIN_GETVCPUS = _make(function="virDomain.vcpus", run_args=()) SUPPORT_DOMAIN_XML_INACTIVE = _make(function="virDomain.XMLDesc", run_args=(), flag="VIR_DOMAIN_XML_INACTIVE") @@ -338,7 +348,10 @@ SUPPORT_DOMAIN_MEMORY_STATS = _make( SUPPORT_DOMAIN_STATE = _make(function="virDomain.state", run_args=()) -# Pool checks +############### +# Pool checks # +############### + SUPPORT_POOL_CREATEVOLFROM = _make( function="virStoragePool.createXMLFrom", version="0.8.0") SUPPORT_POOL_ISACTIVE = _make(function="virStoragePool.isActive", run_args=()) @@ -352,7 +365,10 @@ SUPPORT_POOL_REFLINK = _make( version="1.2.13") -# Interface checks +#################### +# Interface checks # +#################### + SUPPORT_INTERFACE_XML_INACTIVE = _make(function="virInterface.XMLDesc", flag="VIR_INTERFACE_XML_INACTIVE", run_args=()) @@ -360,12 +376,19 @@ SUPPORT_INTERFACE_ISACTIVE = _make( function="virInterface.isActive", run_args=()) -# Stream checks +################# +# Stream checks # +################# + # Latest I tested with, and since we will use it by default # for URL installs, want to be sure it works SUPPORT_STREAM_UPLOAD = _make(version="0.9.4") -# Network checks + +################## +# Network checks # +################## + SUPPORT_NET_ISACTIVE = _make(function="virNetwork.isActive", run_args=()) diff --git a/virtinst/util.py b/virtinst/util.py index df502bfb2..64300db05 100644 --- a/virtinst/util.py +++ b/virtinst/util.py @@ -28,9 +28,6 @@ import sys import libvirt -_host_blktap_capable = None - - def listify(l): if l is None: return [] @@ -288,27 +285,6 @@ def default_network(conn): return ["network", "default"] -def is_blktap_capable(conn): - # Ideally we would get this from libvirt capabilities XML - if conn.is_remote(): - return False - - global _host_blktap_capable - if _host_blktap_capable is not None: - return _host_blktap_capable - - if "VIRTINST_TEST_SUITE" not in os.environ: - lines = file("/proc/modules").readlines() - for line in lines: - if line.startswith("blktap ") or line.startswith("xenblktap "): - _host_blktap_capable = True - break - - if not _host_blktap_capable: - _host_blktap_capable = False - return _host_blktap_capable - - def randomUUID(conn): if conn.fake_conn_predictable(): # Testing hack