13111: Merge branch 'master' into 13111-webdav-projects
[arvados.git] / sdk / go / arvados / fs_users.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package arvados
6
7 import (
8         "os"
9 )
10
11 // usersnode is a virtual directory with an entry for each visible
12 // Arvados username, each showing the respective user's "home
13 // projects".
14 type usersnode struct {
15         inode
16         staleChecker
17         err error
18 }
19
20 func (un *usersnode) load() {
21         fs := un.FS().(*customFileSystem)
22
23         params := ResourceListParams{
24                 Order: "uuid",
25         }
26         for {
27                 var resp UserList
28                 un.err = fs.RequestAndDecode(&resp, "GET", "arvados/v1/users", nil, params)
29                 if un.err != nil {
30                         return
31                 }
32                 if len(resp.Items) == 0 {
33                         break
34                 }
35                 for _, user := range resp.Items {
36                         if user.Username == "" {
37                                 continue
38                         }
39                         un.inode.Child(user.Username, func(inode) (inode, error) {
40                                 return fs.newProjectNode(un, user.Username, user.UUID), nil
41                         })
42                 }
43                 params.Filters = []Filter{{"uuid", ">", resp.Items[len(resp.Items)-1].UUID}}
44         }
45         un.err = nil
46 }
47
48 func (un *usersnode) Readdir() ([]os.FileInfo, error) {
49         un.staleChecker.DoIfStale(un.load, un.FS().(*customFileSystem).Stale)
50         if un.err != nil {
51                 return nil, un.err
52         }
53         return un.inode.Readdir()
54 }
55
56 func (un *usersnode) Child(name string, _ func(inode) (inode, error)) (inode, error) {
57         un.staleChecker.DoIfStale(un.load, un.FS().(*customFileSystem).Stale)
58         if un.err != nil {
59                 return nil, un.err
60         }
61         return un.inode.Child(name, nil)
62 }