1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: Apache-2.0
13 // projectnode exposes an Arvados project as a filesystem directory.
14 type projectnode struct {
23 func (pn *projectnode) load() {
24 fs := pn.FS().(*siteFileSystem)
27 defer pn.loadLock.Unlock()
28 if !fs.Stale(pn.loadStart) {
31 pn.loadStart = time.Now()
35 pn.err = fs.RequestAndDecode(&resp, "GET", "arvados/v1/users/current", nil, nil)
41 filters := []Filter{{"owner_uuid", "=", pn.uuid}}
42 params := ResourceListParams{
47 var resp CollectionList
48 pn.err = fs.RequestAndDecode(&resp, "GET", "arvados/v1/collections", nil, params)
52 if len(resp.Items) == 0 {
55 for _, i := range resp.Items {
60 pn.inode.Child(coll.Name, func(inode) (inode, error) {
61 return deferredCollectionFS(fs, pn, coll), nil
64 params.Filters = append(filters, Filter{"uuid", ">", resp.Items[len(resp.Items)-1].UUID})
67 filters = append(filters, Filter{"group_class", "=", "project"})
68 params.Filters = filters
71 pn.err = fs.RequestAndDecode(&resp, "GET", "arvados/v1/groups", nil, params)
75 if len(resp.Items) == 0 {
78 for _, group := range resp.Items {
79 if group.Name == "" || group.Name == "." || group.Name == ".." {
82 pn.inode.Child(group.Name, func(inode) (inode, error) {
83 return fs.newProjectNode(pn, group.Name, group.UUID), nil
86 params.Filters = append(filters, Filter{"uuid", ">", resp.Items[len(resp.Items)-1].UUID})
91 func (pn *projectnode) Readdir() ([]os.FileInfo, error) {
96 return pn.inode.Readdir()
99 func (pn *projectnode) Child(name string, replace func(inode) (inode, error)) (inode, error) {
106 return pn.inode.Child(name, nil)
108 return pn.inode.Child(name, func(existing inode) (inode, error) {
109 if repl, err := replace(existing); err != nil {
111 } else if repl == nil {
117 return existing, ErrInvalidArgument
118 } else if existing != nil {
120 return existing, ErrInvalidArgument
121 } else if repl.FileInfo().IsDir() {
123 // TODO: repl.SetParent(pn, name), etc.
124 return existing, ErrInvalidArgument
127 return existing, ErrInvalidArgument