From 2ee83a493a91b6dd0ce79a8f6e74ac21638cff0a Mon Sep 17 00:00:00 2001 From: Pádraig Brady Date: Thu, 3 Jan 2013 14:25:06 +0000 Subject: improve libguestfs exception handling * nova/virt/disk/vfs/guestfs.py (teardown): Handle specific exceptions when tearing down so that (future) nova bugs aren't masked. Also handle AttributeError so that the relatively new handle() and close() don't cause erroneous debug logs on older versions of libguestfs. (has_file): remove the last use of generic exception catching and use the more specific RuntimeError. Change-Id: Ia7345675d75c1c6727e9254791d44475c0ed9295 --- nova/tests/fakeguestfs.py | 10 +++++----- nova/virt/disk/vfs/guestfs.py | 39 ++++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/nova/tests/fakeguestfs.py b/nova/tests/fakeguestfs.py index c7ac01c64..33ca49c33 100644 --- a/nova/tests/fakeguestfs.py +++ b/nova/tests/fakeguestfs.py @@ -96,13 +96,13 @@ class GuestFS(object): def stat(self, path): if not path in self.files: - raise Exception("No such file: " + path) + raise RuntimeError("No such file: " + path) return self.files[path]["mode"] def chown(self, uid, gid, path): if not path in self.files: - raise Exception("No such file: " + path) + raise RuntimeError("No such file: " + path) if uid != -1: self.files[path]["uid"] = uid @@ -111,7 +111,7 @@ class GuestFS(object): def chmod(self, mode, path): if not path in self.files: - raise Exception("No such file: " + path) + raise RuntimeError("No such file: " + path) self.files[path]["mode"] = mode @@ -123,7 +123,7 @@ class GuestFS(object): def aug_get(self, cfgpath): if not self.auginit: - raise Exception("Augeus not initialized") + raise RuntimeError("Augeus not initialized") if cfgpath == "/files/etc/passwd/root/uid": return 0 @@ -137,4 +137,4 @@ class GuestFS(object): return 500 elif cfgpath == "/files/etc/group/admins/gid": return 600 - raise Exception("Unknown path %s", cfgpath) + raise RuntimeError("Unknown path %s", cfgpath) diff --git a/nova/virt/disk/vfs/guestfs.py b/nova/virt/disk/vfs/guestfs.py index 66c6849d4..acea8afdf 100644 --- a/nova/virt/disk/vfs/guestfs.py +++ b/nova/virt/disk/vfs/guestfs.py @@ -101,6 +101,7 @@ class VFSGuestFS(vfs.VFS): self.handle.aug_init("/", 0) except RuntimeError, e: + # dereference object and implicitly close() self.handle = None raise exception.NovaException( _("Error mounting %(imgfile)s with libguestfs (%(e)s)") % @@ -111,19 +112,31 @@ class VFSGuestFS(vfs.VFS): def teardown(self): LOG.debug(_("Tearing down appliance")) + try: - self.handle.aug_close() - except Exception, e: - LOG.debug(_("Failed to close augeas %s"), e) - try: - self.handle.shutdown() - except Exception, e: - LOG.debug(_("Failed to shutdown appliance %s"), e) - try: - self.handle.close() - except Exception, e: - LOG.debug(_("Failed to close guest handle %s"), e) - self.handle = None + try: + self.handle.aug_close() + except RuntimeError, e: + LOG.warn(_("Failed to close augeas %s"), e) + + try: + self.handle.shutdown() + except AttributeError: + # Older libguestfs versions haven't an explicit shutdown + pass + except RuntimeError, e: + LOG.warn(_("Failed to shutdown appliance %s"), e) + + try: + self.handle.close() + except AttributeError: + # Older libguestfs versions haven't an explicit close + pass + except RuntimeError, e: + LOG.warn(_("Failed to close guest handle %s"), e) + finally: + # dereference object and implicitly close() + self.handle = None @staticmethod def _canonicalize_path(path): @@ -157,7 +170,7 @@ class VFSGuestFS(vfs.VFS): try: self.handle.stat(path) return True - except Exception, e: + except RuntimeError: return False def set_permissions(self, path, mode): -- cgit