6 from fresh import FreshBase, convertTime
8 _logger = logging.getLogger('arvados.arvados_fuse')
10 class File(FreshBase):
11 """Base for file objects."""
13 def __init__(self, parent_inode, _mtime=0):
14 super(File, self).__init__()
16 self.parent_inode = parent_inode
22 def readfrom(self, off, size, num_retries=0):
25 def writeto(self, off, size, num_retries=0):
26 raise Exception("Not writable")
31 def clear(self, force=False):
41 class FuseArvadosFile(File):
42 """Wraps a ArvadosFile."""
44 def __init__(self, parent_inode, arvfile, _mtime):
45 super(FuseArvadosFile, self).__init__(parent_inode, _mtime)
46 self.arvfile = arvfile
49 _logger.debug("started calling self.arvfile.size()")
50 with llfuse.lock_released:
51 _logger.debug("locked_released and calling self.arvfile.size()")
52 return self.arvfile.size()
54 def readfrom(self, off, size, num_retries=0):
55 with llfuse.lock_released:
56 return self.arvfile.readfrom(off, size, num_retries, exact=True)
58 def writeto(self, off, buf, num_retries=0):
59 with llfuse.lock_released:
60 return self.arvfile.writeto(off, buf, num_retries)
66 return self.arvfile.writable()
69 with llfuse.lock_released:
71 self.arvfile.parent.root_collection().save()
74 class StringFile(File):
75 """Wrap a simple string as a file"""
76 def __init__(self, parent_inode, contents, _mtime):
77 super(StringFile, self).__init__(parent_inode, _mtime)
78 self.contents = contents
81 return len(self.contents)
83 def readfrom(self, off, size, num_retries=0):
84 return self.contents[off:(off+size)]
87 class ObjectFile(StringFile):
88 """Wrap a dict as a serialized json object."""
90 def __init__(self, parent_inode, obj):
91 super(ObjectFile, self).__init__(parent_inode, "", 0)
92 self.object_uuid = obj['uuid']
96 return self.object_uuid
98 def update(self, obj=None):
99 self._mtime = convertTime(obj['modified_at']) if 'modified_at' in obj else 0
100 self.contents = json.dumps(obj, indent=4, sort_keys=True) + "\n"