virt-manager/26a433fc-virtManager-clone-check-which-storage-pools-supports-volume-cloning.patch
Charles Arnold 2d558399a0 - Upstream bug fixes (bsc#1027942)
57db4185-virt-clone-fix-force-copy-of-empty-cdrom-or-floppy-disk.patch
  26a433fc-virtManager-clone-check-which-storage-pools-supports-volume-cloning.patch
  4f66c423-cloner-Handle-nonsparse-for-qcow2-images.patch
  a02fc0d0-virtManager-clone-build-default-clone-path-if-we-know-how.patch
  1856c1fa-support-Fix-minimum-version-check.patch
  74bbc3db-urldetect-Check-also-for-treeinfo.patch
  708af01c-osdict-Add-supports_virtioinput.patch
  f23b01be-guest-Add-VirtIO-input-devices-to-s390x-guests-with-graphics.patch
  7afbb90b-virt-xml-Handle-VM-names-that-look-like-id-uuid.patch
  a0ca387a-cli-Fix-pool-default-when-path-belongs-to-another-pool.patch

OBS-URL: https://build.opensuse.org/package/show/Virtualization/virt-manager?expand=0&rev=465
2019-04-03 17:16:11 +00:00

97 lines
3.6 KiB
Diff

Subject: virtManager: clone: check which storage pools supports volume cloning
From: Pavel Hrdina phrdina@redhat.com Thu Feb 28 11:47:40 2019 +0100
Date: Mon Mar 4 13:23:45 2019 +0100:
Git: 26a433fc421b7c23e02deb8fe84cdedc21fd8f95
When cloning a guest in virt-manager the GUI shows a list of disks and
select default cloning policy for every disk. For storage pools where
we know that cloning is not possible we should not select that option
as default one.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1463066
Reviewed-by: Cole Robinson <crobinso@redhat.com>
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
diff --git a/virtManager/clone.py b/virtManager/clone.py
index 895d258a..4148fca0 100644
--- a/virtManager/clone.py
+++ b/virtManager/clone.py
@@ -64,6 +64,11 @@ def can_we_clone(conn, vol, path):
elif not os.path.exists(path):
msg = _("Path does not exist.")
+ else:
+ pool = vol.get_parent_pool()
+ if not pool.supports_volume_creation(clone=True):
+ msg = _("Cannot clone %s storage pool.") % pool.get_type()
+
if msg:
ret = False
@@ -94,12 +99,8 @@ def do_we_default(conn, vol, path, ro, shared, devtype):
if vol:
pool_type = vol.get_parent_pool().get_type()
- if pool_type == virtinst.StoragePool.TYPE_SCSI:
- info = append_str(info, _("SCSI device"))
- elif pool_type == virtinst.StoragePool.TYPE_DISK:
+ if pool_type == virtinst.StoragePool.TYPE_DISK:
info = append_str(info, _("Disk device"))
- elif pool_type == virtinst.StoragePool.TYPE_ISCSI:
- info = append_str(info, _("iSCSI share"))
if shared:
info = append_str(info, _("Shareable"))
diff --git a/virtManager/storagepool.py b/virtManager/storagepool.py
index bf79b161..d0d26cc2 100644
--- a/virtManager/storagepool.py
+++ b/virtManager/storagepool.py
@@ -238,8 +238,8 @@ class vmmStoragePool(vmmLibvirtObject):
def can_change_alloc(self):
typ = self.get_type()
return (typ in [StoragePool.TYPE_LOGICAL, StoragePool.TYPE_ZFS])
- def supports_volume_creation(self):
- return self.get_xmlobj().supports_volume_creation()
+ def supports_volume_creation(self, clone=False):
+ return self.get_xmlobj().supports_volume_creation(clone=clone)
def get_type(self):
return self.get_xmlobj().type
diff --git a/virtinst/storage.py b/virtinst/storage.py
index 5781e4a7..3249c454 100644
--- a/virtinst/storage.py
+++ b/virtinst/storage.py
@@ -395,13 +395,25 @@ class StoragePool(_StorageObject):
return self.type in users[propname]
return hasattr(self, propname)
- def supports_volume_creation(self):
- return self.type in [
- StoragePool.TYPE_DIR, StoragePool.TYPE_FS,
- StoragePool.TYPE_NETFS, StoragePool.TYPE_LOGICAL,
+ def supports_volume_creation(self, clone=False):
+ """
+ Returns if pool supports volume creation. If @clone is set to True
+ returns if pool supports volume cloning (virVolCreateXMLFrom).
+ """
+ supported = [
+ StoragePool.TYPE_DIR,
+ StoragePool.TYPE_FS,
+ StoragePool.TYPE_NETFS,
StoragePool.TYPE_DISK,
- StoragePool.TYPE_RBD, StoragePool.TYPE_SHEEPDOG,
- StoragePool.TYPE_ZFS]
+ StoragePool.TYPE_LOGICAL,
+ StoragePool.TYPE_RBD,
+ ]
+ if not clone:
+ supported.extend([
+ StoragePool.TYPE_SHEEPDOG,
+ StoragePool.TYPE_ZFS,
+ ])
+ return self.type in supported
def get_disk_type(self):
if (self.type == StoragePool.TYPE_DISK or