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 {
21 func (pn *projectnode) setup() {
22 fs := pn.FS().(*siteFileSystem)
25 pn.err = fs.RequestAndDecode(&resp, "GET", "arvados/v1/users/current", nil, nil)
31 filters := []Filter{{"owner_uuid", "=", pn.uuid}}
32 params := ResourceListParams{
37 var resp CollectionList
38 pn.err = fs.RequestAndDecode(&resp, "GET", "arvados/v1/collections", nil, params)
40 // TODO: retry on next access, instead of returning the same error forever
43 if len(resp.Items) == 0 {
46 for _, i := range resp.Items {
51 pn.inode.Child(coll.Name, func(inode) inode {
52 return deferredCollectionFS(fs, pn, coll)
55 params.Filters = append(filters, Filter{"uuid", ">", resp.Items[len(resp.Items)-1].UUID})
58 filters = append(filters, Filter{"group_class", "=", "project"})
59 params.Filters = filters
62 pn.err = fs.RequestAndDecode(&resp, "GET", "arvados/v1/groups", nil, params)
64 // TODO: retry on next access, instead of returning the same error forever
67 if len(resp.Items) == 0 {
70 for _, group := range resp.Items {
71 if group.Name == "" || group.Name == "." || group.Name == ".." {
74 pn.inode.Child(group.Name, func(inode) inode {
75 return fs.newProjectNode(pn, group.Name, group.UUID)
78 params.Filters = append(filters, Filter{"uuid", ">", resp.Items[len(resp.Items)-1].UUID})
82 func (pn *projectnode) Readdir() []os.FileInfo {
83 pn.setupOnce.Do(pn.setup)
84 return pn.inode.Readdir()
87 func (pn *projectnode) Child(name string, replace func(inode) inode) inode {
88 pn.setupOnce.Do(pn.setup)
90 log.Printf("BUG: not propagating error setting up %T %v: %s", pn, pn, pn.err)
91 // TODO: propagate error, instead of just being empty
96 return pn.inode.Child(name, nil)
98 return pn.inode.Child(name, func(existing inode) inode {
99 if repl := replace(existing); repl == nil {
102 return pn.Child(name, nil) // not implemented
103 } else if repl.FileInfo().IsDir() {
105 // TODO: repl.SetParent(pn, name), etc.
106 return pn.Child(name, nil) // not implemented
109 // TODO: repl.SetParent(pn, name), etc.
110 return pn.Child(name, nil) // not implemented