VirtualDisk: Add is_disk, is_cdrom, is_floppy helpers

This commit is contained in:
Cole Robinson 2013-08-17 14:21:30 -04:00
parent c2a4ca66e9
commit 3130f64e35
3 changed files with 64 additions and 62 deletions

View File

@ -19,7 +19,7 @@
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type="file" device="floppy">
<driver name="qemu" type="qcow2" cache="none"/>
<driver name="qemu" type="qcow2"/>
<source file="/dev/default-pool/testvol1.img"/>
<target dev="fda" bus="fdc"/>
</disk>

View File

@ -590,10 +590,15 @@ class VirtualDisk(VirtualDevice):
if fmt and self.driver_name == self.DRIVER_QEMU:
self.driver_type = fmt
def is_cdrom(self):
return self.device == self.DEVICE_CDROM
def is_floppy(self):
return self.device == self.DEVICE_FLOPPY
def is_disk(self):
return self.device == self.DEVICE_DISK
def can_be_empty(self):
return (self.device == self.DEVICE_FLOPPY or
self.device == self.DEVICE_CDROM)
return self.is_floppy() or self.is_cdrom()
def _change_backend(self, path, vol_object):
backend, ignore = _distill_storage(
@ -667,8 +672,7 @@ class VirtualDisk(VirtualDevice):
# Make sure we have access to the local path
if not managed_storage:
if (os.path.isdir(self.path) and
not self.device == self.DEVICE_FLOPPY):
if (os.path.isdir(self.path) and not self.is_floppy()):
raise ValueError(_("The path '%s' must be a file or a "
"device, not a directory") % self.path)
@ -704,26 +708,27 @@ class VirtualDisk(VirtualDevice):
if volobj:
self._change_backend(None, volobj)
def set_defaults(self):
if self.device == self.DEVICE_CDROM:
self.read_only = True
if not virtinst.enable_rhel_defaults:
def _set_rhel_defaults(self):
if not self.conn.is_qemu():
return
if not self.is_disk():
return
# Enable cache=none for non-CDROM devs
if (self.conn.is_qemu() and
not self.driver_cache and
self.device != self.DEVICE_CDROM):
# Enable cache=none for disk devs
if not self.driver_cache:
self.driver_cache = self.CACHE_MODE_NONE
# Enable AIO native for block devices
if (self.conn.is_qemu() and
not self.driver_io and
self.device == self.DEVICE_DISK and
self.type == self.TYPE_BLOCK):
if (not self.driver_io and self.type == self.TYPE_BLOCK):
self.driver_io = self.IO_MODE_NATIVE
def set_defaults(self):
if self.is_cdrom():
self.read_only = True
if virtinst.enable_rhel_defaults:
self._set_rhel_defaults()
def is_size_conflict(self):
"""
reports if disk size conflicts with available space
@ -767,16 +772,15 @@ class VirtualDisk(VirtualDevice):
# error as appropriate.
if self.bus == "virtio":
return ("vd", 1024)
elif self.bus in ["sata", "scsi", "usb"]:
return ("sd", 1024)
elif self.bus == "xen":
return ("xvd", 1024)
elif self.bus == "fdc" or self.device == self.DEVICE_FLOPPY:
elif self.bus == "fdc" or self.is_floppy():
return ("fd", 2)
elif self.bus == "ide":
return ("hd", 4)
else:
return (None, None)
# sata, scsi, usb, sd
return ("sd", 1024)
def generate_target(self, skip_targets):
"""
@ -799,7 +803,7 @@ class VirtualDisk(VirtualDevice):
raise ValueError(_("Cannot determine device bus/type."))
# Special case: IDE cdrom should prefer hdc for back compat
if self.device == self.DEVICE_CDROM and prefix == "hd":
if self.is_cdrom() and prefix == "hd":
if "hdc" not in skip_targets:
self.target = "hdc"
return self.target

View File

@ -534,6 +534,24 @@ class Guest(XMLBuilder):
raise e
###################################
# Guest Dictionary Helper methods #
###################################
def _is_rhel6(self):
emulator = self.emulator or ""
return (self.type in ["qemu", "kvm"] and
emulator.startswith("/usr/libexec/qemu"))
def _lookup_osdict_key(self, key, default):
"""
Use self.os_variant to find key in OSTYPES
@returns: dict value, or None if os_type/variant wasn't set
"""
return osdict.lookup_osdict_key(self.conn, self.type,
self.os_variant, key, default)
###################
# Device defaults #
###################
@ -555,24 +573,19 @@ class Guest(XMLBuilder):
# Keep cdrom around, but with no media attached,
# But only if we are a distro that doesn't have a multi
# stage install (aka not Windows)
return (d.virtual_device_type == "disk" and
d.device == VirtualDisk.DEVICE_CDROM
and d.transient
and not install and
return (d.is_cdrom() and
d.transient and
not install and
not self.get_continue_inst())
def do_skip_disk(d):
# Skip transient labeled non-media disks
return (d.virtual_device_type == "disk" and
d.device == VirtualDisk.DEVICE_DISK
and d.transient
and not install)
return (d.is_disk() and d.transient and not install)
for dev in self.get_all_devices():
for dev in self.get_devices("disk"):
if do_skip_disk(dev):
self.remove_device(dev)
continue
if do_remove_media(dev):
elif do_remove_media(dev):
dev.path = None
def _set_defaults(self):
@ -668,20 +681,24 @@ class Guest(XMLBuilder):
os_disk_bus = self._lookup_osdict_key("diskbus", None)
def set_disk_bus(d):
if d.device == d.DEVICE_FLOPPY:
if d.is_floppy():
d.bus = "fdc"
return
if self.os.is_xenpv():
d.bus = "xen"
return
if not self.os.is_hvm():
d.bus = "ide"
if self.os.is_hvm():
if (os_disk_bus and d.device == VirtualDisk.DEVICE_DISK):
return
if os_disk_bus and d.is_disk():
d.bus = os_disk_bus
elif (self.type == "kvm" and
self.os.machine == "pseries"):
d.bus = "scsi"
else:
d.bus = "ide"
used_targets = []
for disk in self.get_devices("disk"):
@ -765,22 +782,3 @@ class Guest(XMLBuilder):
agentdev = virtinst.VirtualChannelDevice(self.conn)
agentdev.type = agentdev.TYPE_SPICEVMC
self.add_device(agentdev)
###################################
# Guest Dictionary Helper methods #
###################################
def _is_rhel6(self):
emulator = self.emulator or ""
return (self.type in ["qemu", "kvm"] and
emulator.startswith("/usr/libexec/qemu"))
def _lookup_osdict_key(self, key, default):
"""
Use self.os_variant to find key in OSTYPES
@returns: dict value, or None if os_type/variant wasn't set
"""
return osdict.lookup_osdict_key(self.conn, self.type,
self.os_variant, key, default)