[Kimchi-devel] [PATCH] Bug fix: Allow creating a pool using an existing path

Daniel Henrique Barboza dhbarboza82 at gmail.com
Mon Jun 29 13:31:50 UTC 2015


Reviewed-by: Daniel Barboza <dhbarboza82 at gmail.com>
Tested-by: Daniel Barboza <dhbarboza82 at gmail.com>

On 06/26/2015 05:15 PM, Aline Manera wrote:
> In the newer libvirt version, virStoragePool.build() raises an error when the
> target path already exists.
> To avoid errors related to that, make sure that exception is properly handled.
> Also add a test case to cover this scenario.
>
> Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
> ---
>   src/kimchi/model/storagepools.py | 33 +++++++++++++++++++++++----------
>   tests/test_model_storagepool.py  | 12 +++++++++++-
>   2 files changed, 34 insertions(+), 11 deletions(-)
>
> diff --git a/src/kimchi/model/storagepools.py b/src/kimchi/model/storagepools.py
> index f022deb..aa075cd 100644
> --- a/src/kimchi/model/storagepools.py
> +++ b/src/kimchi/model/storagepools.py
> @@ -101,9 +101,6 @@ class StoragePoolsModel(object):
>                   xml = ET.tostring(pool)
>                   try:
>                       pool = conn.storagePoolDefineXML(xml, 0)
> -                    # Add build step to make sure target directory created
> -                    pool.build(libvirt.VIR_STORAGE_POOL_BUILD_NEW)
> -                    pool.setAutostart(1)
>                   except libvirt.libvirtError, e:
>                       msg = "Fatal: Unable to create storage pool %s. "
>                       msg += error_msg
> @@ -111,6 +108,17 @@ class StoragePoolsModel(object):
>                       kimchi_log.error("Details: %s", e.message)
>                       sys.exit(1)
>   
> +                # Build and set autostart value to pool
> +                # Ignore error as the pool was already successfully created
> +                try:
> +                    # Add build step to make sure target directory created
> +                    # The build process may fail when the pool directory
> +                    # already exists on system
> +                    pool.build(libvirt.VIR_STORAGE_POOL_BUILD_NEW)
> +                    pool.setAutostart(1)
> +                except:
> +                    pass
> +
>               if pool.isActive() == 0:
>                   try:
>                       pool.create(0)
> @@ -182,18 +190,23 @@ class StoragePoolsModel(object):
>                   return name
>   
>               pool = conn.storagePoolDefineXML(xml, 0)
> +        except libvirt.libvirtError as e:
> +            kimchi_log.error("Problem creating Storage Pool: %s", e)
> +            raise OperationFailed("KCHPOOL0007E",
> +                                  {'name': name, 'err': e.get_error_message()})
> +
> +        # Build and set autostart value to pool
> +        # Ignore error as the pool was already successfully created
> +        # The build process fails when the pool directory already exists
> +        try:
>               if params['type'] in ['logical', 'dir', 'netfs', 'scsi']:
>                   pool.build(libvirt.VIR_STORAGE_POOL_BUILD_NEW)
> -                # autostart dir, logical, netfs and scsi storage pools created
> -                # from kimchi
>                   pool.setAutostart(1)
>               else:
> -                # disable autostart for others
>                   pool.setAutostart(0)
> -        except libvirt.libvirtError as e:
> -            kimchi_log.error("Problem creating Storage Pool: %s", e)
> -            raise OperationFailed("KCHPOOL0007E",
> -                                  {'name': name, 'err': e.get_error_message()})
> +        except:
> +            pass
> +
>           if params['type'] == 'netfs':
>               output, error, returncode = run_command(['setsebool', '-P',
>                                                       'virt_use_nfs=1'])
> diff --git a/tests/test_model_storagepool.py b/tests/test_model_storagepool.py
> index eabf875..70f3c7b 100644
> --- a/tests/test_model_storagepool.py
> +++ b/tests/test_model_storagepool.py
> @@ -20,6 +20,7 @@
>   
>   import json
>   import os
> +import tempfile
>   import unittest
>   
>   from functools import partial
> @@ -65,7 +66,7 @@ class StoragepoolTests(unittest.TestCase):
>           self.assertIn('default', [pool['name'] for pool in storagepools])
>   
>           with RollbackContext() as rollback:
> -            # Now add a couple of StoragePools to the mock model
> +            # Now add a couple of storage pools
>               for i in xrange(3):
>                   name = u'kīмсhī-storagepool-%i' % i
>                   req = json.dumps({'name': name, 'type': 'dir',
> @@ -97,6 +98,15 @@ class StoragepoolTests(unittest.TestCase):
>               pools = json.loads(self.request('/storagepools').read())
>               self.assertEquals(len(storagepools) + 3, len(pools))
>   
> +            # Create a pool with an existing path
> +            tmp_path = tempfile.mkdtemp(dir='/var/lib/kimchi')
> +            rollback.prependDefer(os.rmdir, tmp_path)
> +            req = json.dumps({'name': 'existing_path', 'type': 'dir',
> +                              'path': tmp_path})
> +            resp = self.request('/storagepools', req, 'POST')
> +            rollback.prependDefer(model.storagepool_delete, 'existing_path')
> +            self.assertEquals(201, resp.status)
> +
>               # Reserved pool return 400
>               req = json.dumps({'name': 'kimchi_isos', 'type': 'dir',
>                                 'path': '/var/lib/libvirt/images/%i' % i})




More information about the Kimchi-devel mailing list