[Kimchi-devel] [PATCHv3 1/3] Fix vm creation storage rollback clean
Sheldon
shaohef at linux.vnet.ibm.com
Thu Feb 27 08:44:21 UTC 2014
Reviewed-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
On 02/27/2014 04:25 PM, 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, its storage volume should not be destoryed.
> Put the constant in single file to prevent circular import.
> For storage volume deletion, fix deleting vol clear part for readonly pool.
>
> Signed-off-by: Royce Lv <lvroyce at linux.vnet.ibm.com>
> ---
> src/kimchi/config.py.in | 3 +++
> src/kimchi/model/vms.py | 16 +++++++++++-----
> 2 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/src/kimchi/config.py.in b/src/kimchi/config.py.in
> index 2747164..d1affea 100644
> --- a/src/kimchi/config.py.in
> +++ b/src/kimchi/config.py.in
> @@ -31,6 +31,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_object_store():
> return os.path.join(paths.state_dir, 'objectstore')
> diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
> index a3b6c31..6267d03 100644
> --- a/src/kimchi/model/vms.py
> +++ b/src/kimchi/model/vms.py
> @@ -27,6 +27,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
> @@ -183,7 +184,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:
> @@ -215,9 +216,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()})
>
> @@ -356,7 +358,11 @@ class VMModel(object):
>
> for path in paths:
> vol = conn.storageVolLookupByPath(path)
> - vol.delete(0)
> + pool = vol.storagePoolLookupByVolume()
> + xml = pool.XMLDesc(0)
> + pool_type = xmlutils.xpath_get_text(xml, "/pool/@type")[0]
> + if pool_type not in READONLY_POOL_TYPE:
> + vol.delete(0)
>
> with self.objstore as session:
> session.delete('vm', dom.UUIDString(), ignore_missing=True)
--
Thanks and best regards!
Sheldon Feng(冯少合)<shaohef at linux.vnet.ibm.com>
IBM Linux Technology Center
More information about the Kimchi-devel
mailing list