Merge branch 'master' into 3198-writable-fuse
[arvados.git] / services / fuse / arvados_fuse / fusefile.py
1 import logging
2 import re
3 import json
4
5 from fresh import FreshBase, convertTime
6
7 _logger = logging.getLogger('arvados.arvados_fuse')
8
9 class File(FreshBase):
10     """Base for file objects."""
11
12     def __init__(self, parent_inode, _mtime=0):
13         super(File, self).__init__()
14         self.inode = None
15         self.parent_inode = parent_inode
16         self._mtime = _mtime
17
18     def size(self):
19         return 0
20
21     def readfrom(self, off, size, num_retries=0):
22         return ''
23
24     def writeto(self, off, size, num_retries=0):
25         raise Exception("Not writable")
26
27     def mtime(self):
28         return self._mtime
29
30     def clear(self, force=False):
31         return True
32
33     def writable(self):
34         return False
35
36     def flush(self):
37         pass
38
39 class FuseArvadosFile(File):
40     """Wraps a ArvadosFile."""
41
42     def __init__(self, parent_inode, arvfile, _mtime):
43         super(FuseArvadosFile, self).__init__(parent_inode, _mtime)
44         self.arvfile = arvfile
45
46     def size(self):
47         return self.arvfile.size()
48
49     def readfrom(self, off, size, num_retries=0):
50         return self.arvfile.readfrom(off, size, num_retries, exact=True)
51
52     def writeto(self, off, buf, num_retries=0):
53         return self.arvfile.writeto(off, buf, num_retries)
54
55     def stale(self):
56         return False
57
58     def writable(self):
59         return self.arvfile.writable()
60
61     def flush(self):
62         if self.writable():
63             self.arvfile.parent.root_collection().save()
64
65
66 class StringFile(File):
67     """Wrap a simple string as a file"""
68     def __init__(self, parent_inode, contents, _mtime):
69         super(StringFile, self).__init__(parent_inode, _mtime)
70         self.contents = contents
71
72     def size(self):
73         return len(self.contents)
74
75     def readfrom(self, off, size, num_retries=0):
76         return self.contents[off:(off+size)]
77
78
79 class ObjectFile(StringFile):
80     """Wrap a dict as a serialized json object."""
81
82     def __init__(self, parent_inode, obj):
83         super(ObjectFile, self).__init__(parent_inode, "", 0)
84         self.uuid = obj['uuid']
85         self.update(obj)
86
87     def update(self, obj):
88         self._mtime = convertTime(obj['modified_at']) if 'modified_at' in obj else 0
89         self.contents = json.dumps(obj, indent=4, sort_keys=True) + "\n"