diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-01-06 00:42:41 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-01-06 00:42:41 +0000 |
| commit | ca91d3c607d82f57e736ef18be815023fd306342 (patch) | |
| tree | 70682142d876569bc248a8aaf5b1f56f92cb74c5 | |
| parent | 850e5d6bf989b15ca67396dc246e72f7de7524a8 (diff) | |
| parent | 2ee83a493a91b6dd0ce79a8f6e74ac21638cff0a (diff) | |
| download | nova-ca91d3c607d82f57e736ef18be815023fd306342.tar.gz nova-ca91d3c607d82f57e736ef18be815023fd306342.tar.xz nova-ca91d3c607d82f57e736ef18be815023fd306342.zip | |
Merge "improve libguestfs exception handling"
| -rw-r--r-- | nova/tests/fakeguestfs.py | 10 | ||||
| -rw-r--r-- | 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): |
