Some assorted fixes for the SFTP backend.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Tue, 30 Mar 2010 21:59:38 +0000 (14:59 -0700)
committerMichael Vrable <mvrable@cs.ucsd.edu>
Tue, 30 Mar 2010 21:59:38 +0000 (14:59 -0700)
  - Automatically call the close() method of a storage backend when the
    object is garbage collected.
  - Calling stat in the SFTP backend when the file doesn't exist will raise
    a Cumulus NotFoundError instead of a generic IOError.
  - Avoid the use of keyword arguments when calling SFTPClient methods (in
    my testing the first argument might be called 'path' instead of
    'filename', but avoid the problem altogether by just using positional
    arguments).

python/cumulus/store/__init__.py
python/cumulus/store/sftp.py

index 84ca119..6c8c8ee 100644 (file)
@@ -67,5 +67,8 @@ class Store (object):
 
        pass
 
+    def __del__(self):
+        self.close()
+
 def open(url):
     return Store(url)
index 5e6766e..e87c098 100644 (file)
@@ -72,20 +72,20 @@ class SFTPStore(Store):
             key_file = os.path.expanduser(self.config['identityfile'])
             #not really nice but i don't see a cleaner way atm...
             try:
-                self.auth_key = RSAKey (filename = key_file)
+                self.auth_key = RSAKey (key_file)
             except SSHException, e:
                 if e.message == 'Unable to parse file':
-                    self.auth_key = DSAKey (filename = key_file)
+                    self.auth_key = DSAKey (key_file)
                 else:
                     raise
         else:
             filename = os.path.expanduser('~/.ssh/id_rsa')
             if os.path.exists(filename):
-                self.auth_key = RSAKey(filename = filename)
+                self.auth_key = RSAKey(filename)
             else:
                 filename = os.path.expanduser('~/.ssh/id_dsa')
                 if (os.path.exists(filename)):
-                    self.auth_key = DSSKey (filename = filename)
+                    self.auth_key = DSSKey (filename)
 
         self.__connect()
 
@@ -102,10 +102,10 @@ class SFTPStore(Store):
         return filter(type_patterns[type].match, self.client.listdir(self.path))
 
     def get(self, type, name):
-        return self.client.open(filename = self.__build_fn(name), mode = 'rb')
+        return self.client.open(self.__build_fn(name), mode = 'rb')
 
     def put(self, type, name, fp):
-        remote_file = self.client.open(filename = self.__build_fn(name), mode = 'wb')
+        remote_file = self.client.open(self.__build_fn(name), mode = 'wb')
         buf = fp.read(4096)
         while (len(buf) > 0):
             remote_file.write(buf)
@@ -113,11 +113,14 @@ class SFTPStore(Store):
         remote_file.close()
 
     def delete(self, type, name):
-        self.client.remove(filename = self.__build_fn(name))
+        self.client.remove(self.__build_fn(name))
 
     def stat(self, type, name):
-        stat = self.client.stat(filename = self.__build_fn(name))
-        return {'size': stat.st_size}
+        try:
+            stat = self.client.stat(self.__build_fn(name))
+            return {'size': stat.st_size}
+        except IOError:
+            raise NotFoundError
 
     def close(self):
         """connection has to be explicitly closed, otherwise