summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-01-06 00:42:41 +0000
committerGerrit Code Review <review@openstack.org>2013-01-06 00:42:41 +0000
commitca91d3c607d82f57e736ef18be815023fd306342 (patch)
tree70682142d876569bc248a8aaf5b1f56f92cb74c5
parent850e5d6bf989b15ca67396dc246e72f7de7524a8 (diff)
parent2ee83a493a91b6dd0ce79a8f6e74ac21638cff0a (diff)
downloadnova-ca91d3c607d82f57e736ef18be815023fd306342.tar.gz
nova-ca91d3c607d82f57e736ef18be815023fd306342.tar.xz
nova-ca91d3c607d82f57e736ef18be815023fd306342.zip
Merge "improve libguestfs exception handling"
-rw-r--r--nova/tests/fakeguestfs.py10
-rw-r--r--nova/virt/disk/vfs/guestfs.py39
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):