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

Rodrigo Trujillo rodrigo.trujillo at linux.vnet.ibm.com
Wed Sep 16 16:06:16 UTC 2015


Hi Paulo,

I understood your approach and think that it works and will fix the issue.
However, I would like to make some suggestions/questions:

1- Does ['dos/mbr boot sector', 'data']  work for all types of images 
supported by Kimchi ?
2- Could ['dos/mbr boot sector', 'data'] be defined as global/constant ?
3- Instead of return and check  "isvalid" for each file/image inside the 
pool, I think a possible approach would be
just don't return it in the API. Then the traffic and the UI checking 
are lesser.

What do you think ?

Rodrigo Trujillo


On 09/15/2015 02:30 PM, pvital at linux.vnet.ibm.com wrote:
> 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         | 15 ++++++++++++++-
>   ui/js/src/kimchi.guest_storage_add.main.js |  2 +-
>   5 files changed, 22 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..27d4a4e 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
> @@ -310,13 +311,25 @@ 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
> +        valid_format_content = ['dos/mbr boot sector', 'data']
> +        if fmt == 'raw':
> +            ms = magic.open(magic.NONE)
> +            ms.load()
> +            if ms.file(path).lower() not in valid_format_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




More information about the Kimchi-devel mailing list