[Kimchi-devel] [PATCHv2 5/5] Create volume based on backing store image

Aline Manera alinefm at linux.vnet.ibm.com
Thu Jul 17 00:23:52 UTC 2014


Just a minor comment below

On 07/15/2014 06:11 AM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>
> Creating volume base on backing store so that we can create
> vm from this cow volume. Also change volume xml generation method
> to lxml.
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
>   src/kimchi/i18n.py       |  1 +
>   src/kimchi/model/vms.py  |  1 +
>   src/kimchi/utils.py      | 16 ++++++++++++++++
>   src/kimchi/vmtemplate.py | 33 ++++++++++++++++++++-------------
>   4 files changed, 38 insertions(+), 13 deletions(-)
>
> diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
> index 3ba1e23..b427c5d 100644
> --- a/src/kimchi/i18n.py
> +++ b/src/kimchi/i18n.py
> @@ -126,6 +126,7 @@ messages = {
>       "KCHTMPL0021E": _("Unable to delete template due error: %(err)s"),
>       "KCHTMPL0022E": _("Disk size must be greater than 1GB."),
>       "KCHTMPL0023E": _("Template base image must be a valid local image file"),
> +    "KCHTMPL0024E": _("Cannot identify base image %(path)s format"),
>
>       "KCHPOOL0001E": _("Storage pool %(name)s already exists"),
>       "KCHPOOL0002E": _("Storage pool %(name)s does not exist"),
> diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
> index 17bda04..55699d0 100644
> --- a/src/kimchi/model/vms.py
> +++ b/src/kimchi/model/vms.py
> @@ -201,6 +201,7 @@ class VMsModel(object):
>           # the user from UI or manually.
>           vol_list = []
>           if t._get_storage_type() in ["iscsi", "scsi"]:
> +        # FIXME: iscsi and scsi storage work with base image needs to be fixed.
>               vol_list = []
>           else:
>               vol_list = t.fork_vm_storage(vm_uuid)
> diff --git a/src/kimchi/utils.py b/src/kimchi/utils.py
> index 97adbf8..0fd59ff 100644
> --- a/src/kimchi/utils.py
> +++ b/src/kimchi/utils.py
> @@ -20,6 +20,7 @@
>
>   import cherrypy
>   import grp
> +import json
>   import os
>   import psutil
>   import pwd
> @@ -213,6 +214,21 @@ def parse_cmd_output(output, output_items):
>       return res
>

> +def probe_img_info(path):
> +    cmd = ["qemu-img", "info", "--output=json", path]
> +    info = dict()
> +    try:
> +        out = run_command(cmd, 10)[0]
> +    except TimeoutExpired:
> +        kimchi_log.warning("Cannot decide format of base img %s", path)
> +        return None
> +
> +    info = json.loads(out)
> +    info['virtual-size'] = info['virtual-size'] >> 30
> +    info['actual-size'] = info['actual-size'] >> 30
> +    return info
> +

Maybe imageinfo.py is a better location for this code.

> +
>   def patch_find_nfs_target(nfs_server):
>       cmd = ["showmount", "--no-headers", "--exports", nfs_server]
>       try:
> diff --git a/src/kimchi/vmtemplate.py b/src/kimchi/vmtemplate.py
> index d531406..883455c 100644
> --- a/src/kimchi/vmtemplate.py
> +++ b/src/kimchi/vmtemplate.py
> @@ -27,7 +27,7 @@ from kimchi import osinfo
>   from kimchi.exception import InvalidParameter, IsoFormatError, ImageFormatError
>   from kimchi.imageinfo import probe_image
>   from kimchi.isoinfo import IsoImage
> -from kimchi.utils import check_url_path, pool_name_from_uri
> +from kimchi.utils import check_url_path, pool_name_from_uri, probe_img_info
>   from lxml import etree
>   from lxml.builder import E
>
> @@ -65,6 +65,8 @@ class VMTemplate(object):
>                       except ImageFormatError:
>                           pass
>                       args['cdrom'] = ''
> +                    if 'size' not in d:
> +                        d['size'] = probe_img_info(d['base'])['virtual-size']
>                       break
>
>           if scan and len(iso) > 0:
> @@ -254,6 +256,13 @@ drive=drive-%(bus)s0-1-0,id=%(bus)s0-1-0'/>
>           fmt = 'raw' if self._get_storage_type() in ['logical'] else 'qcow2'
>           ret = []
>           for i, d in enumerate(self.info['disks']):
> +            if 'base' in d:
> +                base_fmt = probe_img_info(d['base'])['format']
> +                if base_fmt is None:
> +                    raise InvalidParameter("KCHTMPL0024E", {'path': d['base']})
> +                base_path = d['base']
> +            else:
> +                base_path = None
>               index = d.get('index', i)
>               volume = "%s-%s.img" % (vm_uuid, index)
>
> @@ -262,19 +271,17 @@ drive=drive-%(bus)s0-1-0,id=%(bus)s0-1-0'/>
>                       'type': 'disk',
>                       'format': fmt,
>                       'path': '%s/%s' % (storage_path, volume)}
> -
>               info['allocation'] = 0 if fmt == 'qcow2' else info['capacity']
> -            info['xml'] = """
> -            <volume>
> -              <name>%(name)s</name>
> -              <allocation unit="G">%(allocation)s</allocation>
> -              <capacity unit="G">%(capacity)s</capacity>
> -              <target>
> -                <format type='%(format)s'/>
> -                <path>%(path)s</path>
> -              </target>
> -            </volume>
> -            """ % info
> +            v_tree = E.volume(E.name(info['name']))
> +            v_tree.append(E.allocation(str(info['allocation']), unit='G'))
> +            v_tree.append(E.capacity(str(info['capacity']), unit='G'))
> +            target = E.target(
> +                E.format(type=info['format']), E.path(info['path']))
> +            if base_path:
> +                v_tree.append(E.backingStore(
> +                    E.path(base_path), E.format(type=base_fmt)))
> +            v_tree.append(target)
> +            info['xml'] = etree.tostring(v_tree)
>               ret.append(info)
>           return ret
>




More information about the Kimchi-devel mailing list