[Kimchi-devel] [PATCH 3/3] issue #564: Parse logical volumes to find out their actual formats

Crístian Viana vianac at linux.vnet.ibm.com
Thu Mar 19 02:51:50 UTC 2015


All storage volumes belonging to a logical storage pool are reported by
libvirt as 'raw', even when they are ISO images. When creating a
template, only the volumes listed as 'iso' are displayed, so it's currently
not possible to create a template using a volume from a logical storage
pool.

Instead of relying only on the volume format reported by libvirt, open
and inspect the storage volumes which belong to a logical storage pool
in order to find out whether they're ISO images.

Fix issue #564 (List volumes other than "format=iso" when creating
a template).

Signed-off-by: Crístian Viana <vianac at linux.vnet.ibm.com>
---
 src/kimchi/model/storagevolumes.py | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/kimchi/model/storagevolumes.py b/src/kimchi/model/storagevolumes.py
index 0480496..f02efca 100644
--- a/src/kimchi/model/storagevolumes.py
+++ b/src/kimchi/model/storagevolumes.py
@@ -294,6 +294,7 @@ class StorageVolumeModel(object):
         self.objstore = kargs['objstore']
         self.task = TaskModel(**kargs)
         self.storagevolumes = StorageVolumesModel(**kargs)
+        self.storagepool = StoragePoolModel(**kargs)
 
     @staticmethod
     def get_storagevolume(poolname, name, conn):
@@ -321,6 +322,21 @@ class StorageVolumeModel(object):
             # infomation. When there is no format information, we assume
             # it's 'raw'.
             fmt = 'raw'
+
+        iso_img = None
+
+        # 'raw' volumes from 'logical' pools may actually be 'iso';
+        # libvirt always reports them as 'raw'
+        pool_info = self.storagepool.lookup(pool)
+        if pool_info['type'] == 'logical' and fmt == 'raw':
+            try:
+                iso_img = IsoImage(path)
+            except IsoFormatError:
+                # not 'iso' afterall
+                pass
+            else:
+                fmt = 'iso'
+
         ref_cnt = get_disk_ref_cnt(self.objstore, self.conn, path)
         res = dict(type=VOLUME_TYPE_MAP[info[0]],
                    capacity=info[1],
@@ -333,7 +349,8 @@ class StorageVolumeModel(object):
                 path = os.path.join(os.path.dirname(path), os.readlink(path))
             os_distro = os_version = 'unknown'
             try:
-                iso_img = IsoImage(path)
+                if iso_img is None:
+                    iso_img = IsoImage(path)
                 os_distro, os_version = iso_img.probe()
                 bootable = True
             except IsoFormatError:
-- 
2.1.0




More information about the Kimchi-devel mailing list