On Thu, Dec 5, 2013 at 1:41 PM, Thomas Thrainer <[email protected]> wrote:
> True, there you get a fobj with which you are doing something. IMHO, this
> makes it more obvious to the reader that the with actually did something and
> returned something to you.
> Also, the more prominent example is 'with open(...) as f', where it's
> immediately obvious that an 'open' call is issued. In fact, the 'with
> file(...) as fobj' form is even discouraged to use in the Python docs
> (http://docs.python.org/2/library/functions.html?highlight=file#file).
>
> 'with self.volume' doesn't tell the reader, who doesn't know the internals
> of the GlusterVolume class, what's happening. That's why I proposed to
> change it to 'with self.volume.Mount()', which reads much better IMHO (and
> it's not so hard to return a small context object in Mount which unmounts
> once going out of the context).
Okay. I've already merged the changes in my local branch but these
should be the relevant interdiffs:
diff --git a/lib/storage/gluster.py b/lib/storage/gluster.py
index 4e253de..8e588de 100644
--- a/lib/storage/gluster.py
+++ b/lib/storage/gluster.py
@@ -202,10 +202,32 @@ class GlusterVolume(object):
"""Try and mount the volume. No-op if the volume is already mounted.
@raises BlockDeviceError: if the mount was unsuccessful
+
+ @rtype: context manager
+ @return: A simple context monager that lets you use this volume for
+ short lived operations like so::
+
+ with volume.mount():
+ # Do operations on volume
+ # Volume is now unmounted
+
"""
+ class _GlusterVolumeContextManager(object):
+
+ def __init__(self, volume):
+ self.volume = volume
+
+ def __enter__(self):
+ # We're already mounted.
+ return self
+
+ def __exit__(self, *exception_information):
+ self.volume.Unmount()
+ return False # do not swallow exceptions.
+
if self._IsMounted():
- return
+ return _GlusterVolumeContextManager(self)
command = ["mount",
"-t", "glusterfs",
@@ -233,6 +255,8 @@ class GlusterVolume(object):
self.mount_point,
reasons)
+ return _GlusterVolumeContextManager(self)
+
def Unmount(self):
"""Try and unmount the volume.
@@ -251,13 +275,6 @@ class GlusterVolume(object):
logging.warning("Failed to unmount %r from %r: %s",
self, self.mount_point, result.fail_reason)
- def __enter__(self):
- self.Mount()
- return self
-
- def __exit__(self, *exception_information):
- self.Unmount()
-
class GlusterStorage(base.BlockDev):
"""File device using the Gluster backend.
@@ -335,7 +352,7 @@ class GlusterStorage(base.BlockDev):
@return: True if the removal was successful
"""
- with self.volume:
+ with self.volume.Mount():
self.file = FileDeviceHelper(self.full_path)
if self.file.Remove():
self.file = None
@@ -427,7 +444,7 @@ class GlusterStorage(base.BlockDev):
# Possible optimization: defer actual creation to first Attach, rather
# than mounting and unmounting here, then remounting immediately after.
- with volume_obj:
+ with volume_obj.Mount():
FileDeviceHelper.CreateFile(full_path, size, create_folders=True)
return GlusterStorage(unique_id, children, size, params, dyn_params)
--
Raffa Santi
Google Germany GmbH
Dienerstr. 12
80331 München
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Christine Elizabeth Flores