3354: Merge branch 'master' into 3354-render-textile
[arvados.git] / services / fuse / arvados_fuse / __init__.py
index 2e7f4c7e02ef0d4cb61843ab20292b8718e43c1f..cf14a3b67e74dd8da0347b99c03d3672f220d9c0 100644 (file)
@@ -2,7 +2,6 @@
 # FUSE driver for Arvados Keep
 #
 
-from __future__ import print_function
 import os
 import sys
 
@@ -16,12 +15,13 @@ import arvados.events
 import re
 import apiclient
 import json
+import logging
+
+_logger = logging.getLogger('arvados.arvados_fuse')
 
 from time import time
 from llfuse import FUSEError
 
-DEBUG = False
-
 class FreshBase(object):
     '''Base class for maintaining fresh/stale state to determine when to update.'''
     def __init__(self):
@@ -126,8 +126,7 @@ class Directory(FreshBase):
             try:
                 self.update()
             except apiclient.errors.HttpError as e:
-                if DEBUG:
-                    print(e, file=sys.stderr)
+                _logger.debug(e)
 
     def __getitem__(self, item):
         self.checkupdate()
@@ -183,7 +182,7 @@ class CollectionDirectory(Directory):
         self.collection_locator = collection_locator
 
     def same(self, i):
-        return i['uuid'] == self.collection_locator
+        return i['uuid'] == self.collection_locator or i['portable_data_hash'] == self.collection_locator
 
     def update(self):
         try:
@@ -200,8 +199,8 @@ class CollectionDirectory(Directory):
             self.fresh()
             return True
         except Exception as detail:
-            if DEBUG:
-                print("arv-mount %s: error: %s" % (self.collection_locator,detail), file=sys.stderr)
+            _logger.debug("arv-mount %s: error: %s",
+                          self.collection_locator, detail)
             return False
 
 class MagicDirectory(Directory):
@@ -229,15 +228,14 @@ class MagicDirectory(Directory):
             else:
                 return False
         except Exception as e:
-            if DEBUG:
-                print('arv-mount exception keep', e, file=sys.stderr)
+            _logger.debug('arv-mount exception keep %s', e)
             return False
 
     def __getitem__(self, item):
-        if self.__contains__(item):
+        if item in self:
             return self._entries[item]
         else:
-            raise KeyError()
+            raise KeyError("No collection with id " + item)
 
 class TagsDirectory(Directory):
     '''A special directory that contains as subdirectories all tags visible to the user.'''
@@ -260,10 +258,11 @@ class TagsDirectory(Directory):
 
     def update(self):
         tags = self.api.links().list(filters=[['link_class', '=', 'tag']], select=['name'], distinct = True).execute()
-        self.merge(tags['items'],
-                   lambda i: i['name'],
-                   lambda a, i: a.tag == i,
-                   lambda i: TagDirectory(self.inode, self.inodes, self.api, i['name'], poll=self._poll, poll_time=self._poll_time))
+        if "items" in tags:
+            self.merge(tags['items'],
+                       lambda i: i['name'],
+                       lambda a, i: a.tag == i,
+                       lambda i: TagDirectory(self.inode, self.inodes, self.api, i['name'], poll=self._poll, poll_time=self._poll_time))
 
 class TagDirectory(Directory):
     '''A special directory that contains as subdirectories all collections visible
@@ -309,7 +308,8 @@ class GroupsDirectory(Directory):
                 self._entries[a].invalidate()
 
     def update(self):
-        groups = self.api.groups().list().execute()
+        groups = self.api.groups().list(
+            filters=[['group_class','=','project']]).execute()
         self.merge(groups['items'],
                    lambda i: i['uuid'],
                    lambda a, i: a.uuid == i['uuid'],
@@ -420,14 +420,9 @@ class Operations(llfuse.Operations):
     so request handlers do not run concurrently unless the lock is explicitly released
     with llfuse.lock_released.'''
 
-    def __init__(self, uid, gid, debug):
+    def __init__(self, uid, gid):
         super(Operations, self).__init__()
 
-        if debug:
-            global DEBUG
-            DEBUG = True
-            print("arv-mount debug enabled", file=sys.stderr)
-
         self.inodes = Inodes()
         self.uid = uid
         self.gid = gid
@@ -484,8 +479,8 @@ class Operations(llfuse.Operations):
         return entry
 
     def lookup(self, parent_inode, name):
-        if DEBUG:
-            print("arv-mount lookup: parent_inode", parent_inode, "name", name, file=sys.stderr)
+        _logger.debug("arv-mount lookup: parent_inode %i name %s",
+                      parent_inode, name)
         inode = None
 
         if name == '.':
@@ -521,8 +516,7 @@ class Operations(llfuse.Operations):
         return fh
 
     def read(self, fh, off, size):
-        if DEBUG:
-            print("arv-mount read", fh, off, size, file=sys.stderr)
+        _logger.debug("arv-mount read %i %i %i", fh, off, size)
         if fh in self._filehandles:
             handle = self._filehandles[fh]
         else:
@@ -539,8 +533,7 @@ class Operations(llfuse.Operations):
             del self._filehandles[fh]
 
     def opendir(self, inode):
-        if DEBUG:
-            print("arv-mount opendir: inode", inode, file=sys.stderr)
+        _logger.debug("arv-mount opendir: inode %i", inode)
 
         if inode in self.inodes:
             p = self.inodes[inode]
@@ -561,16 +554,14 @@ class Operations(llfuse.Operations):
         return fh
 
     def readdir(self, fh, off):
-        if DEBUG:
-            print("arv-mount readdir: fh", fh, "off", off, file=sys.stderr)
+        _logger.debug("arv-mount readdir: fh %i off %i", fh, off)
 
         if fh in self._filehandles:
             handle = self._filehandles[fh]
         else:
             raise llfuse.FUSEError(errno.EBADF)
 
-        if DEBUG:
-            print("arv-mount handle.entry", handle.entry, file=sys.stderr)
+        _logger.debug("arv-mount handle.entry %s", handle.entry)
 
         e = off
         while e < len(handle.entry):