[Kimchi-devel] [PATCH v3] [Kimchi] Replace backing image by clone when using template based on existing img

Jose Ricardo Ziviani joserz at linux.vnet.ibm.com
Tue Apr 19 20:44:02 UTC 2016


CANCELLED

This approach didn't work as expected, I'll work on another solution to 
improve the backing image instead.

On 19-04-2016 00:12, Jose Ricardo Ziviani wrote:
>   - This commit replaces the current backing image to a complete clone
>     when using a template based on an existing template.
>
> Signed-off-by: Jose Ricardo Ziviani <joserz at linux.vnet.ibm.com>
> ---
>   model/templates.py | 26 +++++++++++++++++++++++++-
>   tests/test_rest.py | 19 +++++++++++++++----
>   vmtemplate.py      |  8 --------
>   3 files changed, 40 insertions(+), 13 deletions(-)
>
> diff --git a/model/templates.py b/model/templates.py
> index a02099c..1cdb99b 100644
> --- a/model/templates.py
> +++ b/model/templates.py
> @@ -23,6 +23,7 @@ import magic
>   import os
>   import platform
>   import psutil
> +import shutil
>   import stat
>   import urlparse
>
> @@ -378,7 +379,30 @@ class LibvirtVMTemplate(VMTemplate):
>               for v in vol_list:
>                   pool = self._get_storage_pool(v['pool'])
>                   # outgoing text to libvirt, encode('utf-8')
> -                pool.createXML(v['xml'].encode('utf-8'), 0)
> +                if 'base' in v and 'path' in v['base']:
> +                    conn = self.conn.get()
> +                    try:
> +                        volume_base = conn.storageVolLookupByPath(
> +                            v['base']['path'])
> +
> +                    except libvirt.libvirtError as e:
> +                        image_dir = os.path.dirname(v['base']['path'])
> +                        image_name = os.path.basename(v['base']['path'])
> +                        volume_dir = os.path.dirname(v['path'])
> +
> +                        if image_dir != volume_dir:
> +                            shutil.copy(v['base']['path'], volume_dir)
> +
> +                        pool.refresh()
> +
> +                        volume_base = pool.storageVolLookupByName(image_name)
> +
> +                    pool.createXMLFrom(v['xml'].encode('utf-8'),
> +                                       volume_base,
> +                                       0)
> +                else:
> +                    pool.createXML(v['xml'].encode('utf-8'), 0)
> +
>           except libvirt.libvirtError as e:
>               raise OperationFailed("KCHVMSTOR0008E", {'error': e.message})
>           return vol_list
> diff --git a/tests/test_rest.py b/tests/test_rest.py
> index a009ed3..997611e 100644
> --- a/tests/test_rest.py
> +++ b/tests/test_rest.py
> @@ -1030,9 +1030,13 @@ class RestTests(unittest.TestCase):
>           self.assertIn(u"KCHVM0012E", resp['reason'])
>
>       def test_create_vm_with_img_based_template(self):
> +        self._create_pool('pool-imgbs')
> +        self.request('/plugins/kimchi/storagepools/pool-imgbs/activate', '{}',
> +                     'POST')
> +
>           resp = json.loads(
>               self.request(
> -                '/plugins/kimchi/storagepools/default-pool/storagevolumes'
> +                '/plugins/kimchi/storagepools/pool-imgbs/storagevolumes'
>               ).read()
>           )
>           self.assertEquals(0, len(resp))
> @@ -1040,8 +1044,15 @@ class RestTests(unittest.TestCase):
>           # Create a Template
>           mock_base = '/tmp/mock.img'
>           os.system("qemu-img create -f qcow2 %s 10M" % mock_base)
> -        req = json.dumps({'name': 'test', 'source_media': mock_base})
> -        resp = self.request('/plugins/kimchi/templates', req, 'POST')
> +
> +        tmpl_params = {
> +            'name': 'test', 'source_media': mock_base,
> +            'disks': [{'pool':
> +                       {'name': '/plugins/kimchi/storagepools/pool-imgbs'}}]}
> +
> +        resp = self.request('/plugins/kimchi/templates',
> +                            json.dumps(tmpl_params),
> +                            'POST')
>           self.assertEquals(201, resp.status)
>
>           req = json.dumps({'template': '/plugins/kimchi/templates/test'})
> @@ -1053,7 +1064,7 @@ class RestTests(unittest.TestCase):
>           # Test storage volume created with backing store of base file
>           resp = json.loads(
>               self.request(
> -                '/plugins/kimchi/storagepools/default-pool/storagevolumes'
> +                '/plugins/kimchi/storagepools/pool-imgbs/storagevolumes'
>               ).read()
>           )
>           self.assertEquals(1, len(resp))
> diff --git a/vmtemplate.py b/vmtemplate.py
> index a223beb..4ce5d19 100644
> --- a/vmtemplate.py
> +++ b/vmtemplate.py
> @@ -264,14 +264,6 @@ class VMTemplate(object):
>               v_tree.append(E.capacity(str(info['capacity']), unit='G'))
>
>               target_fmt = info['format']
> -            if 'base' in d:
> -                # target must be qcow2 in order to use a backing file
> -                target_fmt = 'qcow2'
> -
> -                v_tree.append(E.backingStore(
> -                    E.path(info['base']['path']),
> -                    E.format(type=info['base']['format'])))
> -
>               target = E.target(
>                   E.format(type=target_fmt), E.path(info['path']))
>               v_tree.append(target)
>

-- 
Jose Ricardo Ziviani
-----------------------------
Software Engineer
Linux Technology Center - IBM




More information about the Kimchi-devel mailing list