3198: Implement cache management for directory objects.
[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):
22         return ''
23
24     def mtime(self):
25         return self._mtime
26
27     def clear(self):
28         pass
29
30     def inc_use(self):
31         pass
32
33     def dec_use(self):
34         pass
35
36 class StreamReaderFile(File):
37     """Wraps a StreamFileReader as a file."""
38
39     def __init__(self, parent_inode, reader, _mtime):
40         super(StreamReaderFile, self).__init__(parent_inode, _mtime)
41         self.reader = reader
42
43     def size(self):
44         return self.reader.size()
45
46     def readfrom(self, off, size):
47         return self.reader.readfrom(off, size)
48
49     def stale(self):
50         return False
51
52
53 class StringFile(File):
54     """Wrap a simple string as a file"""
55     def __init__(self, parent_inode, contents, _mtime):
56         super(StringFile, self).__init__(parent_inode, _mtime)
57         self.contents = contents
58
59     def size(self):
60         return len(self.contents)
61
62     def readfrom(self, off, size):
63         return self.contents[off:(off+size)]
64
65
66 class ObjectFile(StringFile):
67     """Wrap a dict as a serialized json object."""
68
69     def __init__(self, parent_inode, obj):
70         super(ObjectFile, self).__init__(parent_inode, "", 0)
71         self.uuid = obj['uuid']
72         self.update(obj)
73
74     def update(self, obj):
75         self._mtime = convertTime(obj['modified_at']) if 'modified_at' in obj else 0
76         self.contents = json.dumps(obj, indent=4, sort_keys=True) + "\n"