[Kimchi-devel] [PATCHv2 1/3] Fix vm creation storage rollback clean

Aline Manera alinefm at linux.vnet.ibm.com
Tue Feb 25 14:38:31 UTC 2014


On 02/25/2014 04:07 AM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at linux.vnet.ibm.com>
>
> For pools which not allowed create and delete volume,
> if create vm fails, vm storage volume should not be destoryed.
> Put the constant in config.py to avoid circular import.
> For storage volume deletion, work around it by delete vol clear part,
> in the future, this will be fixed by volume reference information tracking.
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
>   src/kimchi/config.py.in |  3 +++
>   src/kimchi/model/vms.py | 14 ++++++--------
>   tests/test_model.py     |  2 +-
>   3 files changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/src/kimchi/config.py.in b/src/kimchi/config.py.in
> index 32d61c6..00aab27 100644
> --- a/src/kimchi/config.py.in
> +++ b/src/kimchi/config.py.in
> @@ -35,6 +35,9 @@ from kimchi.xmlutils import xpath_get_text
>
>   DEFAULT_LOG_LEVEL = "debug"
>
> +# Storage pool constant for read-only pool types
> +READONLY_POOL_TYPE = ['iscsi', 'scsi', 'mpath']
> +
>
>   def get_session_path():
>       return os.path.join(paths.state_dir, 'sessions')
> diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
> index b482e80..4744bb6 100644
> --- a/src/kimchi/model/vms.py
> +++ b/src/kimchi/model/vms.py
> @@ -30,6 +30,7 @@ from cherrypy.process.plugins import BackgroundTask
>
>   from kimchi import vnc
>   from kimchi import xmlutils
> +from kimchi.config import READONLY_POOL_TYPE
>   from kimchi.exception import InvalidOperation, InvalidParameter
>   from kimchi.exception import MissingParameter, NotFoundError, OperationFailed
>   from kimchi.model.config import CapabilitiesModel
> @@ -186,7 +187,7 @@ class VMsModel(object):
>           # If storagepool is SCSI, volumes will be LUNs and must be passed by
>           # the user from UI or manually.
>           vol_list = []
> -        if t._get_storage_type() == 'scsi':
> +        if t._get_storage_type() in READONLY_POOL_TYPE:
>               if not params.get('volumes'):
>                   raise MissingParameter('KCHVM0017E')
>               else:
> @@ -218,9 +219,10 @@ class VMsModel(object):
>           try:
>               conn.defineXML(xml.encode('utf-8'))
>           except libvirt.libvirtError as e:
> -            for v in vol_list:
> -                vol = conn.storageVolLookupByPath(v['path'])
> -                vol.delete(0)
> +            if t._get_storage_type() not in READONLY_POOL_TYPE:
> +                for v in vol_list:
> +                    vol = conn.storageVolLookupByPath(v['path'])
> +                    vol.delete(0)
>               raise OperationFailed("KCHVM0007E", {'name': name,
>                                                    'err': e.get_error_message()})
>
> @@ -357,10 +359,6 @@ class VMModel(object):
>
>               dom.undefine()
>
> -            for path in paths:
> -                vol = conn.storageVolLookupByPath(path)
> -                vol.delete(0)
> -
>               with self.objstore as session:
>                   session.delete('vm', dom.UUIDString(), ignore_missing=True)
>
> diff --git a/tests/test_model.py b/tests/test_model.py
> index 0dbc279..b0039a3 100644
> --- a/tests/test_model.py
> +++ b/tests/test_model.py
> @@ -245,7 +245,7 @@ class ModelTests(unittest.TestCase):
>               vm_info = inst.vm_lookup(params['name'])
>               disk_path = '/var/lib/libvirt/images/%s-0.img' % vm_info['uuid']
>               self.assertTrue(os.access(disk_path, os.F_OK))
> -        self.assertFalse(os.access(disk_path, os.F_OK))
> +        self.assertTrue(os.access(disk_path, os.F_OK))

I don't understand this change.
After the rollback block the vm will be deleted and the disk_path should 
not exist anymore.

>
>       @unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
>       def test_storagepool(self):




More information about the Kimchi-devel mailing list