- collection = arvados.CollectionReader(arvados.Keep.get(self.collection_locator))
- for s in collection.all_streams():
- cwd = self
- for part in s.name().split('/'):
- if part != '' and part != '.':
- if part not in cwd._entries:
- cwd._entries[part] = self.inodes.add_entry(Directory(cwd.inode))
- cwd = cwd._entries[part]
- for k, v in s.files().items():
- cwd._entries[k] = self.inodes.add_entry(StreamReaderFile(cwd.inode, v))
- self.fresh()
+ try:
+ if self.collection_object is not None and re.match(r'^[a-f0-9]{32}', self.collection_locator):
+ return True
+ #with llfuse.lock_released:
+ new_collection_object = self.api.collections().get(uuid=self.collection_locator).execute()
+ if "portable_data_hash" not in new_collection_object:
+ new_collection_object["portable_data_hash"] = new_collection_object["uuid"]
+
+ if self.collection_object is None or self.collection_object["portable_data_hash"] != new_collection_object["portable_data_hash"]:
+ self.collection_object = new_collection_object
+
+ if self.manifest_text_file is not None:
+ self.manifest_text_file.contents = self.collection_object["manifest_text"]
+ self.manifest_text_file._ctime = self.ctime()
+ self.manifest_text_file._mtime = self.mtime()
+ if self.pdh_file is not None:
+ self.pdh_file.contents = self.collection_object["portable_data_hash"]
+ self.pdh_file._ctime = self.ctime()
+ self.pdh_file._mtime = self.mtime()
+
+ self.clear()
+ collection = arvados.CollectionReader(self.collection_object["manifest_text"], self.api)
+ for s in collection.all_streams():
+ cwd = self
+ for part in s.name().split('/'):
+ if part != '' and part != '.':
+ partname = sanitize_filename(part)
+ if partname not in cwd._entries:
+ cwd._entries[partname] = self.inodes.add_entry(Directory(cwd.inode))
+ cwd = cwd._entries[partname]
+ for k, v in s.files().items():
+ cwd._entries[sanitize_filename(k)] = self.inodes.add_entry(StreamReaderFile(cwd.inode, v, self.ctime(), self.mtime()))
+ self.fresh()
+ return True
+ except Exception as detail:
+ _logger.error("arv-mount %s: error", self.collection_locator)
+ _logger.exception(detail)
+ return False
+
+ def __getitem__(self, item):
+ self.checkupdate()
+ if item == '.manifest_text':
+ if self.manifest_text_file is None:
+ self.manifest_text_file = StringFile(self.inode, self.collection_object["manifest_text"], self.ctime(), self.mtime())
+ self.inodes.add_entry(self.manifest_text_file)
+ return self.manifest_text_file
+ elif item == '.portable_data_hash':
+ if self.pdh_file is None:
+ self.pdh_file = StringFile(self.inode, self.collection_object["portable_data_hash"], self.ctime(), self.mtime())
+ self.inodes.add_entry(self.pdh_file)
+ return self.pdh_file
+ else:
+ return super(CollectionDirectory, self).__getitem__(item)