From: Royce Lv <lvroyce(a)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(a)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))
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_storagepool(self):
--
1.8.1.2