12167: Merge branch 'master'
[arvados.git] / sdk / go / arvados / fs_site.go
index e9c83870d1ae3869c5b6c615514cf4ea1e5a3df8..82114e2ea9ed54ac89cc94dd387d73711efae561 100644 (file)
@@ -6,6 +6,7 @@ package arvados
 
 import (
        "os"
+       "strings"
        "sync"
        "time"
 )
@@ -60,7 +61,7 @@ func (fs *customFileSystem) MountByID(mount string) {
                                        mode:    0755 | os.ModeDir,
                                },
                        },
-                       create: fs.mountCollection,
+                       create: fs.mountByID,
                }, nil
        })
 }
@@ -73,7 +74,10 @@ func (fs *customFileSystem) MountProject(mount, uuid string) {
 
 func (fs *customFileSystem) MountUsers(mount string) {
        fs.root.inode.Child(mount, func(inode) (inode, error) {
-               return &usersnode{
+               return &lookupnode{
+                       stale:   fs.Stale,
+                       loadOne: fs.usersLoadOne,
+                       loadAll: fs.usersLoadAll,
                        inode: &treenode{
                                fs:     fs,
                                parent: fs.root,
@@ -120,6 +124,16 @@ func (fs *customFileSystem) newNode(name string, perm os.FileMode, modTime time.
        return nil, ErrInvalidOperation
 }
 
+func (fs *customFileSystem) mountByID(parent inode, id string) inode {
+       if strings.Contains(id, "-4zz18-") || pdhRegexp.MatchString(id) {
+               return fs.mountCollection(parent, id)
+       } else if strings.Contains(id, "-j7d0g-") {
+               return fs.newProjectNode(fs.root, id, id)
+       } else {
+               return nil
+       }
+}
+
 func (fs *customFileSystem) mountCollection(parent inode, id string) inode {
        var coll Collection
        err := fs.RequestAndDecode(&coll, "GET", "arvados/v1/collections/"+id, nil, nil)
@@ -136,24 +150,10 @@ func (fs *customFileSystem) mountCollection(parent inode, id string) inode {
 }
 
 func (fs *customFileSystem) newProjectNode(root inode, name, uuid string) inode {
-       return &projectnode{
-               uuid: uuid,
-               inode: &treenode{
-                       fs:     fs,
-                       parent: root,
-                       inodes: make(map[string]inode),
-                       fileinfo: fileinfo{
-                               name:    name,
-                               modTime: time.Now(),
-                               mode:    0755 | os.ModeDir,
-                       },
-               },
-       }
-}
-
-func (fs *customFileSystem) newUserNode(root inode, name, uuid string) inode {
-       return &projectnode{
-               uuid: uuid,
+       return &lookupnode{
+               stale:   fs.Stale,
+               loadOne: func(parent inode, name string) (inode, error) { return fs.projectsLoadOne(parent, uuid, name) },
+               loadAll: func(parent inode) ([]inode, error) { return fs.projectsLoadAll(parent, uuid) },
                inode: &treenode{
                        fs:     fs,
                        parent: root,