[Kimchi-devel] [PATCH 2/3 V2] Raw volumes validation: back-end and front-end

pvital at linux.vnet.ibm.com pvital at linux.vnet.ibm.com
Wed Sep 16 19:22:52 UTC 2015


From: Paulo Vital <pvital at linux.vnet.ibm.com>

'Raw' volumes can not be valid image disks (e.g. XML, PDF, TXT are
all raw files), so it's necessary check the 'content' of them and
pass the information to front-end to make a better list of volume
options on VM's edition screen.

This solves the issue #731.

Signed-off-by: Paulo Vital <pvital at linux.vnet.ibm.com>
---
 docs/API.md                                |  1 +
 src/kimchi/control/storagevolumes.py       |  3 ++-
 src/kimchi/mockmodel.py                    |  6 ++++--
 src/kimchi/model/storagevolumes.py         | 18 +++++++++++++++++-
 ui/js/src/kimchi.guest_storage_add.main.js |  2 +-
 5 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/docs/API.md b/docs/API.md
index 18d15ac..e94e69a 100644
--- a/docs/API.md
+++ b/docs/API.md
@@ -511,6 +511,7 @@ A interface represents available network interface on VM.
     * os_version *(optional)*: os version of the volume, for iso volume only.
     * bootable *(optional)*: True if iso image is bootable and not corrupted.
     * used_by: Name of vms which use this volume.
+    * isvalid: 1 if it's a valid volume, 0 otherwise.

 * **DELETE**: Remove the Storage Volume
 * **POST**: *See Storage Volume Actions*
diff --git a/src/kimchi/control/storagevolumes.py b/src/kimchi/control/storagevolumes.py
index 8af7abc..d3532f6 100644
--- a/src/kimchi/control/storagevolumes.py
+++ b/src/kimchi/control/storagevolumes.py
@@ -57,7 +57,8 @@ class StorageVolume(Resource):
                'allocation': self.info['allocation'],
                'path': self.info['path'],
                'used_by': self.info['used_by'],
-               'format': self.info['format']}
+               'format': self.info['format'],
+               'isvalid': self.info['isvalid']}

         for key in ('os_version', 'os_distro', 'bootable', 'base'):
             val = self.info.get(key)
diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
index 34bcfc9..33115ef 100644
--- a/src/kimchi/mockmodel.py
+++ b/src/kimchi/mockmodel.py
@@ -471,13 +471,15 @@ class MockStorageVolumes(object):
                                             'allocation': 512,
                                             'type': 'block',
                                             'path': base_path + '1',
-                                            'used_by': []},
+                                            'used_by': [],
+                                            'isvalid': 1},
                              'unit:0:0:2': {'capacity': 2048,
                                             'format': 'unknown',
                                             'allocation': 512,
                                             'type': 'block',
                                             'path': base_path + '2',
-                                            'used_by': []}}
+                                            'used_by': [],
+                                            'isvalid': 1}}


 class MockPartitions(object):
diff --git a/src/kimchi/model/storagevolumes.py b/src/kimchi/model/storagevolumes.py
index 22856ff..a0bc759 100644
--- a/src/kimchi/model/storagevolumes.py
+++ b/src/kimchi/model/storagevolumes.py
@@ -19,6 +19,7 @@

 import contextlib
 import lxml.etree as ET
+import magic
 import os
 import tempfile
 import threading
@@ -48,6 +49,10 @@ VOLUME_TYPE_MAP = {0: 'file',
 READ_CHUNK_SIZE = 1048576  # 1 MiB
 REQUIRE_NAME_PARAMS = ['capacity']

+VALID_RAW_CONTENT = ['dos/mbr boot sector',
+                     'x86 boot sector',
+                     'data']
+
 upload_volumes = dict()


@@ -310,13 +315,24 @@ class StorageVolumeModel(object):
             else:
                 fmt = 'iso'

+        # 'raw' volumes can not be valid image disks (e.g. XML, PDF, TXT are
+        # raw files), so it's necessary check the 'content' of them
+        isvalid = 1
+        if fmt == 'raw':
+            ms = magic.open(magic.NONE)
+            ms.load()
+            if ms.file(path).lower() not in VALID_RAW_CONTENT:
+                isvalid = 0
+            ms.close()
+
         used_by = get_disk_used_by(self.objstore, self.conn, path)
         res = dict(type=VOLUME_TYPE_MAP[info[0]],
                    capacity=info[1],
                    allocation=info[2],
                    path=path,
                    used_by=used_by,
-                   format=fmt)
+                   format=fmt,
+                   isvalid=isvalid)
         if fmt == 'iso':
             if os.path.islink(path):
                 path = os.path.join(os.path.dirname(path), os.readlink(path))
diff --git a/ui/js/src/kimchi.guest_storage_add.main.js b/ui/js/src/kimchi.guest_storage_add.main.js
index 3581c34..9a03656 100644
--- a/ui/js/src/kimchi.guest_storage_add.main.js
+++ b/ui/js/src/kimchi.guest_storage_add.main.js
@@ -81,7 +81,7 @@ kimchi.guest_storage_add_main = function() {
             if (result.length) {
                 $.each(result, function(index, value) {
                     // Only unused volume can be attached
-                    if (value.used_by.length == 0 && (value.type != 'file' || validVolType[selectType].test(value.format))) {
+                    if (value.used_by.length == 0 && value.isvalid == 1 && (value.type != 'file' || validVolType[selectType].test(value.format))) {
                         options.push({
                             label: value.name,
                             value: value.name
--
2.4.3




More information about the Kimchi-devel mailing list