示例#1
0
    def update(self):
        if self.project_object_file == None:
            self.project_object_file = ObjectFile(self.inode,
                                                  self.project_object)
            self.inodes.add_entry(self.project_object_file)

        def namefn(i):
            if 'name' in i:
                if i['name'] is None or len(i['name']) == 0:
                    return None
                elif collection_uuid_pattern.match(
                        i['uuid']) or group_uuid_pattern.match(i['uuid']):
                    # collection or subproject
                    return i['name']
                elif link_uuid_pattern.match(
                        i['uuid']) and i['head_kind'] == 'arvados#collection':
                    # name link
                    return i['name']
                elif 'kind' in i and i['kind'].startswith('arvados#'):
                    # something else
                    return "{}.{}".format(i['name'], i['kind'][8:])
            else:
                return None

        def samefn(a, i):
            if isinstance(a, CollectionDirectory) or isinstance(
                    a, ProjectDirectory):
                return a.uuid() == i['uuid']
            elif isinstance(a, ObjectFile):
                return a.uuid() == i['uuid'] and not a.stale()
            return False

        try:
            with llfuse.lock_released:
                self._updating_lock.acquire()
                if not self.stale():
                    return

                if group_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.groups().get(
                        uuid=self.project_uuid).execute(
                            num_retries=self.num_retries)
                elif user_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.users().get(
                        uuid=self.project_uuid).execute(
                            num_retries=self.num_retries)

                contents = arvados.util.list_all(self.api.groups().contents,
                                                 self.num_retries,
                                                 uuid=self.project_uuid)

            # end with llfuse.lock_released, re-acquire lock

            self.merge(contents, namefn, samefn, self.createDirectory)
        finally:
            self._updating_lock.release()
示例#2
0
    def update(self):
        if self.project_object_file == None:
            self.project_object_file = ObjectFile(self.inode,
                                                  self.project_object)
            self.inodes.add_entry(self.project_object_file)

        def namefn(i):
            if 'name' in i:
                if i['name'] is None or len(i['name']) == 0:
                    return None
                elif collection_uuid_pattern.match(
                        i['uuid']) or group_uuid_pattern.match(i['uuid']):
                    # collection or subproject
                    return i['name']
                elif link_uuid_pattern.match(
                        i['uuid']) and i['head_kind'] == 'arvados#collection':
                    # name link
                    return i['name']
                elif 'kind' in i and i['kind'].startswith('arvados#'):
                    # something else
                    return "{}.{}".format(i['name'], i['kind'][8:])
            else:
                return None

        def samefn(a, i):
            if isinstance(a, CollectionDirectory):
                return a.collection_locator == i['uuid']
            elif isinstance(a, ProjectDirectory):
                return a.uuid == i['uuid']
            elif isinstance(a, ObjectFile):
                return a.uuid == i['uuid'] and not a.stale()
            return False

        with llfuse.lock_released:
            if group_uuid_pattern.match(self.uuid):
                self.project_object = self.api.groups().get(
                    uuid=self.uuid).execute(num_retries=self.num_retries)
            elif user_uuid_pattern.match(self.uuid):
                self.project_object = self.api.users().get(
                    uuid=self.uuid).execute(num_retries=self.num_retries)

            contents = arvados.util.list_all(self.api.groups().contents,
                                             self.num_retries,
                                             uuid=self.uuid)
            # Name links will be obsolete soon, take this out when there are no more pre-#3036 in use.
            contents += arvados.util.list_all(
                self.api.links().list,
                self.num_retries,
                filters=[['tail_uuid', '=', self.uuid],
                         ['link_class', '=', 'name']])

        # end with llfuse.lock_released, re-acquire lock

        self.merge(contents, namefn, samefn, self.createDirectory)
示例#3
0
    def update(self):
        if self.project_object_file == None:
            self.project_object_file = ObjectFile(self.inode, self.project_object)
            self.inodes.add_entry(self.project_object_file)

        def namefn(i):
            if 'name' in i:
                if i['name'] is None or len(i['name']) == 0:
                    return None
                elif collection_uuid_pattern.match(i['uuid']) or group_uuid_pattern.match(i['uuid']):
                    # collection or subproject
                    return i['name']
                elif link_uuid_pattern.match(i['uuid']) and i['head_kind'] == 'arvados#collection':
                    # name link
                    return i['name']
                elif 'kind' in i and i['kind'].startswith('arvados#'):
                    # something else
                    return "{}.{}".format(i['name'], i['kind'][8:])
            else:
                return None

        def samefn(a, i):
            if isinstance(a, CollectionDirectory) or isinstance(a, ProjectDirectory):
                return a.uuid() == i['uuid']
            elif isinstance(a, ObjectFile):
                return a.uuid() == i['uuid'] and not a.stale()
            return False

        try:
            with llfuse.lock_released:
                self._updating_lock.acquire()
                if not self.stale():
                    return

                if group_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.groups().get(
                        uuid=self.project_uuid).execute(num_retries=self.num_retries)
                elif user_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.users().get(
                        uuid=self.project_uuid).execute(num_retries=self.num_retries)

                contents = arvados.util.list_all(self.api.groups().contents,
                                                 self.num_retries, uuid=self.project_uuid)

            # end with llfuse.lock_released, re-acquire lock

            self.merge(contents,
                       namefn,
                       samefn,
                       self.createDirectory)
        finally:
            self._updating_lock.release()
示例#4
0
    def update(self):
        if self.project_object_file == None:
            self.project_object_file = ObjectFile(self.inode,
                                                  self.project_object)
            self.inodes.add_entry(self.project_object_file)

        if not self._full_listing:
            return True

        def samefn(a, i):
            if isinstance(a, CollectionDirectory) or isinstance(
                    a, ProjectDirectory):
                return a.uuid() == i['uuid']
            elif isinstance(a, ObjectFile):
                return a.uuid() == i['uuid'] and not a.stale()
            return False

        try:
            with llfuse.lock_released:
                self._updating_lock.acquire()
                if not self.stale():
                    return

                if group_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.groups().get(
                        uuid=self.project_uuid).execute(
                            num_retries=self.num_retries)
                elif user_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.users().get(
                        uuid=self.project_uuid).execute(
                            num_retries=self.num_retries)
                # do this in 2 steps until #17424 is fixed
                contents = arvados.util.list_all(
                    self.api.groups().contents,
                    self.num_retries,
                    uuid=self.project_uuid,
                    filters=[["uuid", "is_a", "arvados#group"],
                             ["group_class", "=", "project"]])
                contents.extend(
                    arvados.util.list_all(
                        self.api.groups().contents,
                        self.num_retries,
                        uuid=self.project_uuid,
                        filters=[["uuid", "is_a", "arvados#collection"]]))

            # end with llfuse.lock_released, re-acquire lock

            self.merge(contents, self.namefn, samefn, self.createDirectory)
            return True
        finally:
            self._updating_lock.release()
示例#5
0
 def createDirectory(self, i):
     if collection_uuid_pattern.match(i['uuid']):
         return CollectionDirectory(self.inode, self.inodes, self.api, self.num_retries, i)
     elif group_uuid_pattern.match(i['uuid']):
         return ProjectDirectory(self.inode, self.inodes, self.api, self.num_retries, i, self._poll, self._poll_time)
     elif link_uuid_pattern.match(i['uuid']):
         if i['head_kind'] == 'arvados#collection' or portable_data_hash_pattern.match(i['head_uuid']):
             return CollectionDirectory(self.inode, self.inodes, self.api, self.num_retries, i['head_uuid'])
         else:
             return None
     elif uuid_pattern.match(i['uuid']):
         return ObjectFile(self.parent_inode, i)
     else:
         return None
示例#6
0
 def createDirectory(self, i):
     if collection_uuid_pattern.match(i['uuid']):
         return CollectionDirectory(self.inode, self.inodes, self.api, self.num_retries, i)
     elif group_uuid_pattern.match(i['uuid']):
         return ProjectDirectory(self.inode, self.inodes, self.api, self.num_retries, i, self._poll, self._poll_time)
     elif link_uuid_pattern.match(i['uuid']):
         if i['head_kind'] == 'arvados#collection' or portable_data_hash_pattern.match(i['head_uuid']):
             return CollectionDirectory(self.inode, self.inodes, self.api, self.num_retries, i['head_uuid'])
         else:
             return None
     elif uuid_pattern.match(i['uuid']):
         return ObjectFile(self.parent_inode, i)
     else:
         return None
示例#7
0
 def namefn(self, i):
     if 'name' in i:
         if i['name'] is None or len(i['name']) == 0:
             return None
         elif "uuid" in i and (collection_uuid_pattern.match(i['uuid']) or group_uuid_pattern.match(i['uuid'])):
             # collection or subproject
             return i['name']
         elif link_uuid_pattern.match(i['uuid']) and i['head_kind'] == 'arvados#collection':
             # name link
             return i['name']
         elif 'kind' in i and i['kind'].startswith('arvados#'):
             # something else
             return "{}.{}".format(i['name'], i['kind'][8:])
     else:
         return None
示例#8
0
 def namefn(i):
     if 'name' in i:
         if i['name'] is None or len(i['name']) == 0:
             return None
         elif collection_uuid_pattern.match(i['uuid']) or group_uuid_pattern.match(i['uuid']):
             # collection or subproject
             return i['name']
         elif link_uuid_pattern.match(i['uuid']) and i['head_kind'] == 'arvados#collection':
             # name link
             return i['name']
         elif 'kind' in i and i['kind'].startswith('arvados#'):
             # something else
             return "{}.{}".format(i['name'], i['kind'][8:])
     else:
         return None
示例#9
0
 def namefn(i):
     if "name" in i:
         if i["name"] is None or len(i["name"]) == 0:
             return None
         elif collection_uuid_pattern.match(i["uuid"]) or group_uuid_pattern.match(i["uuid"]):
             # collection or subproject
             return i["name"]
         elif link_uuid_pattern.match(i["uuid"]) and i["head_kind"] == "arvados#collection":
             # name link
             return i["name"]
         elif "kind" in i and i["kind"].startswith("arvados#"):
             # something else
             return "{}.{}".format(i["name"], i["kind"][8:])
     else:
         return None
示例#10
0
    def update(self):
        if self.project_object_file == None:
            self.project_object_file = ObjectFile(self.inode, self.project_object)
            self.inodes.add_entry(self.project_object_file)

        if not self._full_listing:
            return True

        def samefn(a, i):
            if isinstance(a, CollectionDirectory) or isinstance(a, ProjectDirectory):
                return a.uuid() == i['uuid']
            elif isinstance(a, ObjectFile):
                return a.uuid() == i['uuid'] and not a.stale()
            return False

        try:
            with llfuse.lock_released:
                self._updating_lock.acquire()
                if not self.stale():
                    return

                if group_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.groups().get(
                        uuid=self.project_uuid).execute(num_retries=self.num_retries)
                elif user_uuid_pattern.match(self.project_uuid):
                    self.project_object = self.api.users().get(
                        uuid=self.project_uuid).execute(num_retries=self.num_retries)

                contents = arvados.util.list_all(self.api.groups().list,
                                                 self.num_retries,
                                                 filters=[["owner_uuid", "=", self.project_uuid],
                                                          ["group_class", "=", "project"]])
                contents.extend(arvados.util.list_all(self.api.collections().list,
                                                      self.num_retries,
                                                      filters=[["owner_uuid", "=", self.project_uuid]]))

            # end with llfuse.lock_released, re-acquire lock

            self.merge(contents,
                       self.namefn,
                       samefn,
                       self.createDirectory)
            return True
        finally:
            self._updating_lock.release()
示例#11
0
    def __contains__(self, k):
        if k in self._entries:
            return True

        if not portable_data_hash_pattern.match(k) and (
                self.pdh_only or not uuid_pattern.match(k)):
            return False

        try:
            e = None

            if group_uuid_pattern.match(k):
                project = self.api.groups().list(
                    filters=[['group_class', '=', 'project'], ["uuid", "=", k]
                             ]).execute(num_retries=self.num_retries)
                if project[u'items_available'] == 0:
                    return False
                e = self.inodes.add_entry(
                    ProjectDirectory(self.inode, self.inodes, self.api,
                                     self.num_retries, project[u'items'][0]))
            else:
                import sys
                e = self.inodes.add_entry(
                    CollectionDirectory(self.inode, self.inodes, self.api,
                                        self.num_retries, k))

            if e.update():
                if k not in self._entries:
                    self._entries[k] = e
                else:
                    self.inodes.del_entry(e)
                return True
            else:
                self.inodes.invalidate_entry(self, k)
                self.inodes.del_entry(e)
                return False
        except Exception as ex:
            _logger.exception("arv-mount lookup '%s':", k)
            if e is not None:
                self.inodes.del_entry(e)
            return False
示例#12
0
    def __contains__(self, k):
        if k in self._entries:
            return True

        if not portable_data_hash_pattern.match(k) and (self.pdh_only or not uuid_pattern.match(k)):
            return False

        try:
            e = None

            if group_uuid_pattern.match(k):
                project = self.api.groups().list(
                    filters=[['group_class', '=', 'project'], ["uuid", "=", k]]).execute(num_retries=self.num_retries)
                if project[u'items_available'] == 0:
                    return False
                e = self.inodes.add_entry(ProjectDirectory(
                    self.inode, self.inodes, self.api, self.num_retries, project[u'items'][0]))
            else:
                e = self.inodes.add_entry(CollectionDirectory(
                        self.inode, self.inodes, self.api, self.num_retries, k))

            if e.update():
                if k not in self._entries:
                    self._entries[k] = e
                else:
                    self.inodes.del_entry(e)
                return True
            else:
                self.inodes.invalidate_entry(self, k)
                self.inodes.del_entry(e)
                return False
        except Exception as ex:
            _logger.exception("arv-mount lookup '%s':", k)
            if e is not None:
                self.inodes.del_entry(e)
            return False