Blame SOURCES/virt-manager-virtManager-clone-check-which-storage-pools-supports-volume-cloning.patch

3d61c0
From 7004099551885f285f371a8464b08e4d3790d3fa Mon Sep 17 00:00:00 2001
3d61c0
Message-Id: <7004099551885f285f371a8464b08e4d3790d3fa@dist-git>
3d61c0
From: Pavel Hrdina <phrdina@redhat.com>
3d61c0
Date: Thu, 28 Feb 2019 11:47:40 +0100
3d61c0
Subject: [PATCH] virtManager: clone: check which storage pools supports volume
3d61c0
 cloning
3d61c0
3d61c0
When cloning a guest in virt-manager the GUI shows a list of disks and
3d61c0
select default cloning policy for every disk.  For storage pools where
3d61c0
we know that cloning is not possible we should not select that option
3d61c0
as default one.
3d61c0
3d61c0
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1463066
3d61c0
3d61c0
Reviewed-by: Cole Robinson <crobinso@redhat.com>
3d61c0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
3d61c0
(cherry picked from commit 26a433fc421b7c23e02deb8fe84cdedc21fd8f95)
3d61c0
Reviewed-by: Cole Robinson <crobinso@redhat.com>
3d61c0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
3d61c0
---
3d61c0
 virtManager/clone.py       | 10 +++++-----
3d61c0
 virtManager/storagepool.py |  4 ++--
3d61c0
 virtinst/storage.py        | 24 ++++++++++++++++++------
3d61c0
 3 files changed, 25 insertions(+), 13 deletions(-)
3d61c0
3d61c0
diff --git a/virtManager/clone.py b/virtManager/clone.py
3d61c0
index baa4d2e6..eb74be5b 100644
3d61c0
--- a/virtManager/clone.py
3d61c0
+++ b/virtManager/clone.py
3d61c0
@@ -75,6 +75,10 @@ def can_we_clone(conn, vol, path):
3d61c0
                                   vol.get_parent_pool().get_backend()):
3d61c0
             if conn.is_remote() or not os.access(path, os.R_OK):
3d61c0
                 msg = _("Connection does not support managed storage cloning.")
3d61c0
+
3d61c0
+        pool = vol.get_parent_pool()
3d61c0
+        if not pool.supports_volume_creation(clone=True):
3d61c0
+            msg = _("Cannot clone %s storage pool.") % pool.get_type()
3d61c0
     else:
3d61c0
         is_dev = path.startswith("/dev")
3d61c0
         if conn.is_remote():
3d61c0
@@ -118,12 +122,8 @@ def do_we_default(conn, vol, path, ro, shared, devtype):
3d61c0
 
3d61c0
     if vol:
3d61c0
         pool_type = vol.get_parent_pool().get_type()
3d61c0
-        if pool_type == virtinst.StoragePool.TYPE_SCSI:
3d61c0
-            info = append_str(info, _("SCSI device"))
3d61c0
-        elif pool_type == virtinst.StoragePool.TYPE_DISK:
3d61c0
+        if pool_type == virtinst.StoragePool.TYPE_DISK:
3d61c0
             info = append_str(info, _("Disk device"))
3d61c0
-        elif pool_type == virtinst.StoragePool.TYPE_ISCSI:
3d61c0
-            info = append_str(info, _("iSCSI share"))
3d61c0
 
3d61c0
     if shared:
3d61c0
         info = append_str(info, _("Shareable"))
3d61c0
diff --git a/virtManager/storagepool.py b/virtManager/storagepool.py
3d61c0
index 6eaf16f0..e621ff63 100644
3d61c0
--- a/virtManager/storagepool.py
3d61c0
+++ b/virtManager/storagepool.py
3d61c0
@@ -250,8 +250,8 @@ class vmmStoragePool(vmmLibvirtObject):
3d61c0
     def can_change_alloc(self):
3d61c0
         typ = self.get_type()
3d61c0
         return (typ in [StoragePool.TYPE_LOGICAL, StoragePool.TYPE_ZFS])
3d61c0
-    def supports_volume_creation(self):
3d61c0
-        return self.get_xmlobj().supports_volume_creation()
3d61c0
+    def supports_volume_creation(self, clone=False):
3d61c0
+        return self.get_xmlobj().supports_volume_creation(clone=clone)
3d61c0
 
3d61c0
     def get_type(self):
3d61c0
         return self.get_xmlobj().type
3d61c0
diff --git a/virtinst/storage.py b/virtinst/storage.py
3d61c0
index c7c75127..9966401a 100644
3d61c0
--- a/virtinst/storage.py
3d61c0
+++ b/virtinst/storage.py
3d61c0
@@ -467,13 +467,25 @@ class StoragePool(_StorageObject):
3d61c0
             return ["auto", "bsd", "dos", "dvh", "gpt", "mac", "pc98", "sun"]
3d61c0
         return []
3d61c0
 
3d61c0
-    def supports_volume_creation(self):
3d61c0
-        return self.type in [
3d61c0
-            StoragePool.TYPE_DIR, StoragePool.TYPE_FS,
3d61c0
-            StoragePool.TYPE_NETFS, StoragePool.TYPE_LOGICAL,
3d61c0
+    def supports_volume_creation(self, clone=False):
3d61c0
+        """
3d61c0
+        Returns if pool supports volume creation.  If @clone is set to True
3d61c0
+        returns if pool supports volume cloning (virVolCreateXMLFrom).
3d61c0
+        """
3d61c0
+        supported = [
3d61c0
+            StoragePool.TYPE_DIR,
3d61c0
+            StoragePool.TYPE_FS,
3d61c0
+            StoragePool.TYPE_NETFS,
3d61c0
             StoragePool.TYPE_DISK,
3d61c0
-            StoragePool.TYPE_RBD, StoragePool.TYPE_SHEEPDOG,
3d61c0
-            StoragePool.TYPE_ZFS]
3d61c0
+            StoragePool.TYPE_LOGICAL,
3d61c0
+            StoragePool.TYPE_RBD,
3d61c0
+        ]
3d61c0
+        if not clone:
3d61c0
+            supported.extend([
3d61c0
+                StoragePool.TYPE_SHEEPDOG,
3d61c0
+                StoragePool.TYPE_ZFS,
3d61c0
+            ])
3d61c0
+        return self.type in supported
3d61c0
 
3d61c0
     def get_disk_type(self):
3d61c0
         if (self.type == StoragePool.TYPE_DISK or
3d61c0
-- 
3d61c0
2.20.1
3d61c0