[Kimchi-devel] [PATCH V3 2/5] Fix 'disk full' issue: Fix Templates db store/delete error handling

Rodrigo Trujillo rodrigo.trujillo at linux.vnet.ibm.com
Fri Mar 28 16:40:02 UTC 2014


If disk is full and user tries to create a new template, Kimchi is going
to fail with "server unexpected error". The same problem happens if user
tries to delete a template. This patch modifies Templates code in order
to handle errors properly.

Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
---
 src/kimchi/i18n.py            |  2 ++
 src/kimchi/model/templates.py | 27 ++++++++++++++++++++-------
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
index d45f607..b3c3313 100644
--- a/src/kimchi/i18n.py
+++ b/src/kimchi/i18n.py
@@ -107,6 +107,8 @@ messages = {
     "KCHTMPL0017E": _("All networks for the template must be specified in a list."),
     "KCHTMPL0018E": _("Must specify a volume to a template, when storage pool is iscsi or scsi"),
     "KCHTMPL0019E": _("The volume: %(volume)s in not in storage pool %(pool)s"),
+    "KCHTMPL0020E": _("Unable to create template due error: %(err)s"),
+    "KCHTMPL0021E": _("Unable to delete template due error: %(err)s"),
 
     "KCHPOOL0001E": _("Storage pool %(name)s already exists"),
     "KCHPOOL0002E": _("Storage pool %(name)s does not exist"),
diff --git a/src/kimchi/model/templates.py b/src/kimchi/model/templates.py
index 0e5c2b2..60f4de5 100644
--- a/src/kimchi/model/templates.py
+++ b/src/kimchi/model/templates.py
@@ -25,6 +25,7 @@ import libvirt
 
 from kimchi import xmlutils
 from kimchi.exception import InvalidOperation, InvalidParameter
+from kimchi.exception import NotFoundError, OperationFailed
 from kimchi.kvmusertests import UserTests
 from kimchi.utils import pool_name_from_uri
 from kimchi.utils import probe_file_permission_as_user
@@ -73,12 +74,19 @@ class TemplatesModel(object):
             except Exception:
                 raise InvalidParameter("KCHTMPL0003E", {'network': net_name,
                                                         'template': name})
+        # Creates the template class with necessary information
+        # Checkings will be done while creating this class, so any exception
+        # will be raised here
+        t = LibvirtVMTemplate(params, scan=True)
+
+        try:
+            with self.objstore as session:
+                if name in session.get_list('template'):
+                    raise InvalidOperation("KCHTMPL0001E", {'name': name})
+                session.store('template', name, t.info)
+        except Exception as e:
+            raise OperationFailed('KCHTMPL0020E', {'err': e.message})
 
-        with self.objstore as session:
-            if name in session.get_list('template'):
-                raise InvalidOperation("KCHTMPL0001E", {'name': name})
-            t = LibvirtVMTemplate(params, scan=True)
-            session.store('template', name, t.info)
         return name
 
     def get_list(self):
@@ -143,8 +151,13 @@ class TemplateModel(object):
         return ident
 
     def delete(self, name):
-        with self.objstore as session:
-            session.delete('template', name)
+        try:
+            with self.objstore as session:
+                session.delete('template', name)
+        except NotFoundError:
+            raise
+        except Exception as e:
+            raise OperationFailed('KCHTMPL0021E', {'err': e.message})
 
     def update(self, name, params):
         old_t = self.lookup(name)
-- 
1.8.5.3




More information about the Kimchi-devel mailing list