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.
This commit is contained in:
Cole Robinson 2015-09-23 17:26:48 -04:00
parent 117cad551d
commit 7c10d8a27f
7 changed files with 54 additions and 61 deletions

View File

@ -10,6 +10,7 @@
<on_crash>restart</on_crash>
<devices>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/dev/default-pool/testvol1.img"/>
<target dev="xvda" bus="xen"/>
</disk>

View File

@ -20,11 +20,13 @@
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/lib64/xen/bin/qemu-dm</emulator>
<disk type="file" device="disk">
<source file="/dev/default-pool/testvol1.img"/>
<disk type="block" device="disk">
<driver name="phy"/>
<source dev="/iscsi-pool/diskvol1"/>
<target dev="hda" bus="ide"/>
</disk>
<disk type="file" device="cdrom">
<driver name="qemu" type="qcow2"/>
<source file="/dev/default-pool/testvol1.img"/>
<target dev="hdb" bus="ide"/>
<readonly/>

View File

@ -15,6 +15,7 @@
<on_crash>destroy</on_crash>
<devices>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/dev/default-pool/testvol1.img"/>
<target dev="xvda" bus="xen"/>
</disk>
@ -39,6 +40,7 @@
<on_crash>restart</on_crash>
<devices>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/dev/default-pool/testvol1.img"/>
<target dev="xvda" bus="xen"/>
</disk>

View File

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

View File

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

View File

@ -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 <driver name=qemu>. 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=())

View File

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