From d3ffe252f9d7cbbad9a7bf61ccf5d26129720f43 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Fri, 12 Nov 2021 17:21:52 -0500 Subject: [PATCH] 18316: Add test & record enable_write on FuseArvadosFile Arvados-DCO-1.1-Signed-off-by: Peter Amstutz --- services/fuse/arvados_fuse/fusedir.py | 2 +- services/fuse/arvados_fuse/fusefile.py | 7 ++++--- services/fuse/tests/mount_test_base.py | 7 +++++-- services/fuse/tests/test_mount.py | 22 ++++++++++++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/services/fuse/arvados_fuse/fusedir.py b/services/fuse/arvados_fuse/fusedir.py index d3d575e148..a2e33c7b3b 100644 --- a/services/fuse/arvados_fuse/fusedir.py +++ b/services/fuse/arvados_fuse/fusedir.py @@ -288,7 +288,7 @@ class CollectionDirectoryBase(Directory): self._entries[name] = self.inodes.add_entry(CollectionDirectoryBase(self.inode, self.inodes, self.apiconfig, self._enable_write, item)) self._entries[name].populate(mtime) else: - self._entries[name] = self.inodes.add_entry(FuseArvadosFile(self.inode, item, mtime)) + self._entries[name] = self.inodes.add_entry(FuseArvadosFile(self.inode, item, mtime, self._enable_write)) item.fuse_entry = self._entries[name] def on_event(self, event, collection, name, item): diff --git a/services/fuse/arvados_fuse/fusefile.py b/services/fuse/arvados_fuse/fusefile.py index 116b5462b6..45d3db16fe 100644 --- a/services/fuse/arvados_fuse/fusefile.py +++ b/services/fuse/arvados_fuse/fusefile.py @@ -50,11 +50,12 @@ class File(FreshBase): class FuseArvadosFile(File): """Wraps a ArvadosFile.""" - __slots__ = ('arvfile',) + __slots__ = ('arvfile', '_enable_write') - def __init__(self, parent_inode, arvfile, _mtime): + def __init__(self, parent_inode, arvfile, _mtime, enable_write): super(FuseArvadosFile, self).__init__(parent_inode, _mtime) self.arvfile = arvfile + self._enable_write = enable_write def size(self): with llfuse.lock_released: @@ -72,7 +73,7 @@ class FuseArvadosFile(File): return False def writable(self): - return self.arvfile.writable() + return self._enable_write and self.arvfile.writable() def flush(self): with llfuse.lock_released: diff --git a/services/fuse/tests/mount_test_base.py b/services/fuse/tests/mount_test_base.py index 5379aa79dc..7cf8aa373a 100644 --- a/services/fuse/tests/mount_test_base.py +++ b/services/fuse/tests/mount_test_base.py @@ -57,12 +57,15 @@ class MountTestBase(unittest.TestCase): llfuse.close() def make_mount(self, root_class, **root_kwargs): + enable_write = True + if 'enable_write' in root_kwargs: + enable_write = root_kwargs.pop('enable_write') self.operations = fuse.Operations( os.getuid(), os.getgid(), api_client=self.api, - enable_write=True) + enable_write=enable_write) self.operations.inodes.add_entry(root_class( - llfuse.ROOT_INODE, self.operations.inodes, self.api, 0, True, **root_kwargs)) + llfuse.ROOT_INODE, self.operations.inodes, self.api, 0, enable_write, **root_kwargs)) llfuse.init(self.operations, self.mounttmp, []) self.llfuse_thread = threading.Thread(None, lambda: self._llfuse_main()) self.llfuse_thread.daemon = True diff --git a/services/fuse/tests/test_mount.py b/services/fuse/tests/test_mount.py index 5bb03ecdb6..ece316193d 100644 --- a/services/fuse/tests/test_mount.py +++ b/services/fuse/tests/test_mount.py @@ -1293,3 +1293,25 @@ class StorageClassesTest(IntegrationTest): @staticmethod def _test_collection_custom_storage_classes(self, coll): self.assertEqual(storage_classes_desired(coll), ['foo']) + +def _readonlyCollectionTestHelper(mounttmp): + f = open(os.path.join(mounttmp, 'thing1.txt'), 'rt') + # Testing that close() doesn't raise an error. + f.close() + +class ReadonlyCollectionTest(MountTestBase): + def setUp(self): + super(ReadonlyCollectionTest, self).setUp() + cw = arvados.collection.Collection() + with cw.open('thing1.txt', 'wt') as f: + f.write("data 1") + cw.save_new(owner_uuid=run_test_server.fixture("groups")["aproject"]["uuid"]) + self.testcollection = cw.api_response() + + def runTest(self): + settings = arvados.config.settings().copy() + settings["ARVADOS_API_TOKEN"] = run_test_server.fixture("api_client_authorizations")["project_viewer"]["api_token"] + self.api = arvados.safeapi.ThreadSafeApiCache(settings) + self.make_mount(fuse.CollectionDirectory, collection_record=self.testcollection, enable_write=False) + + self.pool.apply(_readonlyCollectionTestHelper, (self.mounttmp,)) -- 2.30.2