From ef9107221d53f19bf848d3dca0b570f468519550 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Wed, 13 Nov 2019 14:47:38 -0500 Subject: [PATCH] 15720: Add /users/* endpoints to internal API. --- lib/controller/federation/conn.go | 60 +++++++++++++++++ lib/controller/federation/generate.go | 4 +- lib/controller/federation/generated.go | 29 ++++++++- lib/controller/federation/list.go | 2 +- lib/controller/handler.go | 2 + lib/controller/router/router.go | 89 ++++++++++++++++++++++++++ lib/controller/rpc/conn.go | 73 +++++++++++++++++++++ sdk/go/arvados/api.go | 51 +++++++++++++++ sdk/go/arvadostest/api.go | 48 ++++++++++++++ 9 files changed, 353 insertions(+), 5 deletions(-) diff --git a/lib/controller/federation/conn.go b/lib/controller/federation/conn.go index 3829d0a40a..9d01f1f7c5 100644 --- a/lib/controller/federation/conn.go +++ b/lib/controller/federation/conn.go @@ -251,6 +251,10 @@ func (conn *Conn) CollectionGet(ctx context.Context, options arvados.GetOptions) } } +func (conn *Conn) CollectionList(ctx context.Context, options arvados.ListOptions) (arvados.CollectionList, error) { + return conn.generated_CollectionList(ctx, options) +} + func (conn *Conn) CollectionProvenance(ctx context.Context, options arvados.GetOptions) (map[string]interface{}, error) { return conn.chooseBackend(options.UUID).CollectionProvenance(ctx, options) } @@ -271,6 +275,10 @@ func (conn *Conn) CollectionUntrash(ctx context.Context, options arvados.Untrash return conn.chooseBackend(options.UUID).CollectionUntrash(ctx, options) } +func (conn *Conn) ContainerList(ctx context.Context, options arvados.ListOptions) (arvados.ContainerList, error) { + return conn.generated_ContainerList(ctx, options) +} + func (conn *Conn) ContainerCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Container, error) { return conn.chooseBackend(options.ClusterID).ContainerCreate(ctx, options) } @@ -295,6 +303,10 @@ func (conn *Conn) ContainerUnlock(ctx context.Context, options arvados.GetOption return conn.chooseBackend(options.UUID).ContainerUnlock(ctx, options) } +func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions) (arvados.SpecimenList, error) { + return conn.generated_SpecimenList(ctx, options) +} + func (conn *Conn) SpecimenCreate(ctx context.Context, options arvados.CreateOptions) (arvados.Specimen, error) { return conn.chooseBackend(options.ClusterID).SpecimenCreate(ctx, options) } @@ -311,6 +323,54 @@ func (conn *Conn) SpecimenDelete(ctx context.Context, options arvados.DeleteOpti return conn.chooseBackend(options.UUID).SpecimenDelete(ctx, options) } +func (conn *Conn) UserList(ctx context.Context, options arvados.ListOptions) (arvados.UserList, error) { + return conn.generated_UserList(ctx, options) +} + +func (conn *Conn) UserCreate(ctx context.Context, options arvados.CreateOptions) (arvados.User, error) { + return conn.chooseBackend(options.ClusterID).UserCreate(ctx, options) +} + +func (conn *Conn) UserUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserUpdate(ctx, options) +} + +func (conn *Conn) UserUpdateUUID(ctx context.Context, options arvados.UpdateUUIDOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserUpdateUUID(ctx, options) +} + +func (conn *Conn) UserMerge(ctx context.Context, options arvados.UserMergeOptions) (arvados.User, error) { + return conn.chooseBackend(options.OldUserUUID).UserMerge(ctx, options) +} + +func (conn *Conn) UserActivate(ctx context.Context, options arvados.UserActivateOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserActivate(ctx, options) +} + +func (conn *Conn) UserSetup(ctx context.Context, options arvados.UserSetupOptions) (map[string]interface{}, error) { + return conn.chooseBackend(options.UUID).UserSetup(ctx, options) +} + +func (conn *Conn) UserUnsetup(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserUnsetup(ctx, options) +} + +func (conn *Conn) UserGet(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserGet(ctx, options) +} + +func (conn *Conn) UserGetCurrent(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserGetCurrent(ctx, options) +} + +func (conn *Conn) UserGetSystem(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserGetSystem(ctx, options) +} + +func (conn *Conn) UserDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.User, error) { + return conn.chooseBackend(options.UUID).UserDelete(ctx, options) +} + func (conn *Conn) APIClientAuthorizationCurrent(ctx context.Context, options arvados.GetOptions) (arvados.APIClientAuthorization, error) { return conn.chooseBackend(options.UUID).APIClientAuthorizationCurrent(ctx, options) } diff --git a/lib/controller/federation/generate.go b/lib/controller/federation/generate.go index 11f021e518..ab5d9966a4 100644 --- a/lib/controller/federation/generate.go +++ b/lib/controller/federation/generate.go @@ -31,7 +31,7 @@ func main() { if err != nil { panic(err) } - orig := regexp.MustCompile(`(?ms)\nfunc [^\n]*CollectionList\(.*?\n}\n`).Find(buf) + orig := regexp.MustCompile(`(?ms)\nfunc [^\n]*generated_CollectionList\(.*?\n}\n`).Find(buf) if len(orig) == 0 { panic("can't find CollectionList func") } @@ -52,7 +52,7 @@ func main() { defer out.Close() out.Write(regexp.MustCompile(`(?ms)^.*package .*?import.*?\n\)\n`).Find(buf)) io.WriteString(out, "//\n// -- this file is auto-generated -- do not edit -- edit list.go and run \"go generate\" instead --\n//\n\n") - for _, t := range []string{"Container", "Specimen"} { + for _, t := range []string{"Container", "Specimen", "User"} { _, err := out.Write(bytes.ReplaceAll(orig, []byte("Collection"), []byte(t))) if err != nil { panic(err) diff --git a/lib/controller/federation/generated.go b/lib/controller/federation/generated.go index b34b9b165a..961cd5a401 100755 --- a/lib/controller/federation/generated.go +++ b/lib/controller/federation/generated.go @@ -16,7 +16,7 @@ import ( // -- this file is auto-generated -- do not edit -- edit list.go and run "go generate" instead -- // -func (conn *Conn) ContainerList(ctx context.Context, options arvados.ListOptions) (arvados.ContainerList, error) { +func (conn *Conn) generated_ContainerList(ctx context.Context, options arvados.ListOptions) (arvados.ContainerList, error) { var mtx sync.Mutex var merged arvados.ContainerList err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) { @@ -41,7 +41,7 @@ func (conn *Conn) ContainerList(ctx context.Context, options arvados.ListOptions return merged, err } -func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions) (arvados.SpecimenList, error) { +func (conn *Conn) generated_SpecimenList(ctx context.Context, options arvados.ListOptions) (arvados.SpecimenList, error) { var mtx sync.Mutex var merged arvados.SpecimenList err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) { @@ -65,3 +65,28 @@ func (conn *Conn) SpecimenList(ctx context.Context, options arvados.ListOptions) sort.Slice(merged.Items, func(i, j int) bool { return merged.Items[i].UUID < merged.Items[j].UUID }) return merged, err } + +func (conn *Conn) generated_UserList(ctx context.Context, options arvados.ListOptions) (arvados.UserList, error) { + var mtx sync.Mutex + var merged arvados.UserList + err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) { + cl, err := backend.UserList(ctx, options) + if err != nil { + return nil, err + } + mtx.Lock() + defer mtx.Unlock() + if len(merged.Items) == 0 { + merged = cl + } else { + merged.Items = append(merged.Items, cl.Items...) + } + uuids := make([]string, 0, len(cl.Items)) + for _, item := range cl.Items { + uuids = append(uuids, item.UUID) + } + return uuids, nil + }) + sort.Slice(merged.Items, func(i, j int) bool { return merged.Items[i].UUID < merged.Items[j].UUID }) + return merged, err +} diff --git a/lib/controller/federation/list.go b/lib/controller/federation/list.go index 6ba184c471..7178d7b0af 100644 --- a/lib/controller/federation/list.go +++ b/lib/controller/federation/list.go @@ -20,7 +20,7 @@ import ( // CollectionList is used as a template to auto-generate List() // methods for other types; see generate.go. -func (conn *Conn) CollectionList(ctx context.Context, options arvados.ListOptions) (arvados.CollectionList, error) { +func (conn *Conn) generated_CollectionList(ctx context.Context, options arvados.ListOptions) (arvados.CollectionList, error) { var mtx sync.Mutex var merged arvados.CollectionList err := conn.splitListRequest(ctx, options, func(ctx context.Context, _ string, backend arvados.API, options arvados.ListOptions) ([]string, error) { diff --git a/lib/controller/handler.go b/lib/controller/handler.go index f925233ba3..a0c2450096 100644 --- a/lib/controller/handler.go +++ b/lib/controller/handler.go @@ -83,6 +83,8 @@ func (h *Handler) setup() { if h.Cluster.EnableBetaController14287 { mux.Handle("/arvados/v1/collections", rtr) mux.Handle("/arvados/v1/collections/", rtr) + mux.Handle("/arvados/v1/users", rtr) + mux.Handle("/arvados/v1/users/", rtr) mux.Handle("/login", rtr) } diff --git a/lib/controller/router/router.go b/lib/controller/router/router.go index 709ddfb82e..250f3cb45b 100644 --- a/lib/controller/router/router.go +++ b/lib/controller/router/router.go @@ -205,6 +205,90 @@ func (rtr *router) addRoutes() { return rtr.fed.SpecimenDelete(ctx, *opts.(*arvados.DeleteOptions)) }, }, + { + arvados.EndpointUserCreate, + func() interface{} { return &arvados.CreateOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserCreate(ctx, *opts.(*arvados.CreateOptions)) + }, + }, + { + arvados.EndpointUserMerge, + func() interface{} { return &arvados.UserMergeOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserMerge(ctx, *opts.(*arvados.UserMergeOptions)) + }, + }, + { + arvados.EndpointUserActivate, + func() interface{} { return &arvados.UserActivateOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserActivate(ctx, *opts.(*arvados.UserActivateOptions)) + }, + }, + { + arvados.EndpointUserSetup, + func() interface{} { return &arvados.UserSetupOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserSetup(ctx, *opts.(*arvados.UserSetupOptions)) + }, + }, + { + arvados.EndpointUserUnsetup, + func() interface{} { return &arvados.GetOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserUnsetup(ctx, *opts.(*arvados.GetOptions)) + }, + }, + { + arvados.EndpointUserGetCurrent, + func() interface{} { return &arvados.GetOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserGetCurrent(ctx, *opts.(*arvados.GetOptions)) + }, + }, + { + arvados.EndpointUserGetSystem, + func() interface{} { return &arvados.GetOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserGetSystem(ctx, *opts.(*arvados.GetOptions)) + }, + }, + { + arvados.EndpointUserGet, + func() interface{} { return &arvados.GetOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserGet(ctx, *opts.(*arvados.GetOptions)) + }, + }, + { + arvados.EndpointUserUpdateUUID, + func() interface{} { return &arvados.UpdateUUIDOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserUpdateUUID(ctx, *opts.(*arvados.UpdateUUIDOptions)) + }, + }, + { + arvados.EndpointUserUpdate, + func() interface{} { return &arvados.UpdateOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserUpdate(ctx, *opts.(*arvados.UpdateOptions)) + }, + }, + { + arvados.EndpointUserList, + func() interface{} { return &arvados.ListOptions{Limit: -1} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserList(ctx, *opts.(*arvados.ListOptions)) + }, + }, + { + arvados.EndpointUserDelete, + func() interface{} { return &arvados.DeleteOptions{} }, + func(ctx context.Context, opts interface{}) (interface{}, error) { + return rtr.fed.UserDelete(ctx, *opts.(*arvados.DeleteOptions)) + }, + }, } { rtr.addRoute(route.endpoint, route.defaultOpts, route.exec) if route.endpoint.Method == "PATCH" { @@ -250,6 +334,11 @@ func (rtr *router) addRoute(endpoint arvados.APIEndpoint, defaultOpts func() int } creds := auth.CredentialsFromRequest(req) + err = creds.LoadTokensFromHTTPRequestBody(req) + if err != nil { + rtr.sendError(w, fmt.Errorf("error loading tokens from request body: %s", err)) + return + } if rt, _ := params["reader_tokens"].([]interface{}); len(rt) > 0 { for _, t := range rt { if t, ok := t.(string); ok { diff --git a/lib/controller/rpc/conn.go b/lib/controller/rpc/conn.go index afe749fb0d..25efcfd439 100644 --- a/lib/controller/rpc/conn.go +++ b/lib/controller/rpc/conn.go @@ -308,6 +308,79 @@ func (conn *Conn) SpecimenDelete(ctx context.Context, options arvados.DeleteOpti return resp, err } +func (conn *Conn) UserCreate(ctx context.Context, options arvados.CreateOptions) (arvados.User, error) { + ep := arvados.EndpointUserCreate + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.User, error) { + ep := arvados.EndpointUserUpdate + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserUpdateUUID(ctx context.Context, options arvados.UpdateUUIDOptions) (arvados.User, error) { + ep := arvados.EndpointUserUpdateUUID + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserMerge(ctx context.Context, options arvados.UserMergeOptions) (arvados.User, error) { + ep := arvados.EndpointUserUpdateUUID + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserActivate(ctx context.Context, options arvados.UserActivateOptions) (arvados.User, error) { + ep := arvados.EndpointUserUpdateUUID + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserSetup(ctx context.Context, options arvados.UserSetupOptions) (map[string]interface{}, error) { + ep := arvados.EndpointUserUpdateUUID + var resp map[string]interface{} + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserUnsetup(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + ep := arvados.EndpointUserUpdateUUID + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserGet(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + ep := arvados.EndpointUserGet + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserGetCurrent(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + ep := arvados.EndpointUserGetCurrent + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserGetSystem(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + ep := arvados.EndpointUserGetSystem + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserList(ctx context.Context, options arvados.ListOptions) (arvados.UserList, error) { + ep := arvados.EndpointUserList + var resp arvados.UserList + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} +func (conn *Conn) UserDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.User, error) { + ep := arvados.EndpointUserDelete + var resp arvados.User + err := conn.requestAndDecode(ctx, &resp, ep, nil, options) + return resp, err +} + func (conn *Conn) APIClientAuthorizationCurrent(ctx context.Context, options arvados.GetOptions) (arvados.APIClientAuthorization, error) { ep := arvados.EndpointAPIClientAuthorizationCurrent var resp arvados.APIClientAuthorization diff --git a/sdk/go/arvados/api.go b/sdk/go/arvados/api.go index 5de94d73e4..d86df9ef33 100644 --- a/sdk/go/arvados/api.go +++ b/sdk/go/arvados/api.go @@ -40,6 +40,20 @@ var ( EndpointContainerDelete = APIEndpoint{"DELETE", "arvados/v1/containers/{uuid}", ""} EndpointContainerLock = APIEndpoint{"POST", "arvados/v1/containers/{uuid}/lock", ""} EndpointContainerUnlock = APIEndpoint{"POST", "arvados/v1/containers/{uuid}/unlock", ""} + EndpointUserActivate = APIEndpoint{"POST", "arvados/v1/users/{uuid}/activate", ""} + EndpointUserCreate = APIEndpoint{"POST", "arvados/v1/users", "user"} + EndpointUserCurrent = APIEndpoint{"GET", "arvados/v1/users/current", ""} + EndpointUserDelete = APIEndpoint{"DELETE", "arvados/v1/users/{uuid}", ""} + EndpointUserGet = APIEndpoint{"GET", "arvados/v1/users/{uuid}", ""} + EndpointUserGetCurrent = APIEndpoint{"GET", "arvados/v1/users/current", ""} + EndpointUserGetSystem = APIEndpoint{"GET", "arvados/v1/users/system", ""} + EndpointUserList = APIEndpoint{"GET", "arvados/v1/users", ""} + EndpointUserMerge = APIEndpoint{"POST", "arvados/v1/users/merge", ""} + EndpointUserSetup = APIEndpoint{"POST", "arvados/v1/users/setup", ""} + EndpointUserSystem = APIEndpoint{"GET", "arvados/v1/users/system", ""} + EndpointUserUnsetup = APIEndpoint{"POST", "arvados/v1/users/{uuid}/unsetup", ""} + EndpointUserUpdate = APIEndpoint{"PATCH", "arvados/v1/users/{uuid}", "user"} + EndpointUserUpdateUUID = APIEndpoint{"POST", "arvados/v1/users/{uuid}/update_uuid", ""} EndpointAPIClientAuthorizationCurrent = APIEndpoint{"GET", "arvados/v1/api_client_authorizations/current", ""} ) @@ -80,6 +94,31 @@ type UpdateOptions struct { Attrs map[string]interface{} `json:"attrs"` } +type UpdateUUIDOptions struct { + UUID string `json:"uuid"` + NewUUID string `json:"new_uuid"` +} + +type UserActivateOptions struct { + UUID string `json:"uuid"` +} + +type UserSetupOptions struct { + UUID string `json:"uuid"` + Email string `json:"email"` + OpenIDPrefix string `json:"openid_prefix"` + RepoName string `json:"repo_name"` + VMUUID string `json:"vm_uuid"` + SendNotificationEmail bool `json:"send_notification_email"` + Attrs map[string]interface{} `json:"attrs"` +} + +type UserMergeOptions struct { + NewUserUUID string `json:"new_user_uuid,omitempty"` + OldUserUUID string `json:"old_user_uuid,omitempty"` + NewUserToken string `json:"new_user_token,omitempty"` +} + type DeleteOptions struct { UUID string `json:"uuid"` } @@ -115,5 +154,17 @@ type API interface { SpecimenGet(ctx context.Context, options GetOptions) (Specimen, error) SpecimenList(ctx context.Context, options ListOptions) (SpecimenList, error) SpecimenDelete(ctx context.Context, options DeleteOptions) (Specimen, error) + UserCreate(ctx context.Context, options CreateOptions) (User, error) + UserUpdate(ctx context.Context, options UpdateOptions) (User, error) + UserUpdateUUID(ctx context.Context, options UpdateUUIDOptions) (User, error) + UserMerge(ctx context.Context, options UserMergeOptions) (User, error) + UserActivate(ctx context.Context, options UserActivateOptions) (User, error) + UserSetup(ctx context.Context, options UserSetupOptions) (map[string]interface{}, error) + UserUnsetup(ctx context.Context, options GetOptions) (User, error) + UserGet(ctx context.Context, options GetOptions) (User, error) + UserGetCurrent(ctx context.Context, options GetOptions) (User, error) + UserGetSystem(ctx context.Context, options GetOptions) (User, error) + UserList(ctx context.Context, options ListOptions) (UserList, error) + UserDelete(ctx context.Context, options DeleteOptions) (User, error) APIClientAuthorizationCurrent(ctx context.Context, options GetOptions) (APIClientAuthorization, error) } diff --git a/sdk/go/arvadostest/api.go b/sdk/go/arvadostest/api.go index 24e9f19086..96b7c75f1a 100644 --- a/sdk/go/arvadostest/api.go +++ b/sdk/go/arvadostest/api.go @@ -121,6 +121,54 @@ func (as *APIStub) SpecimenDelete(ctx context.Context, options arvados.DeleteOpt as.appendCall(as.SpecimenDelete, ctx, options) return arvados.Specimen{}, as.Error } +func (as *APIStub) UserCreate(ctx context.Context, options arvados.CreateOptions) (arvados.User, error) { + as.appendCall(as.UserCreate, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserUpdate(ctx context.Context, options arvados.UpdateOptions) (arvados.User, error) { + as.appendCall(as.UserUpdate, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserUpdateUUID(ctx context.Context, options arvados.UpdateUUIDOptions) (arvados.User, error) { + as.appendCall(as.UserUpdateUUID, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserActivate(ctx context.Context, options arvados.UserActivateOptions) (arvados.User, error) { + as.appendCall(as.UserActivate, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserSetup(ctx context.Context, options arvados.UserSetupOptions) (map[string]interface{}, error) { + as.appendCall(as.UserSetup, ctx, options) + return nil, as.Error +} +func (as *APIStub) UserUnsetup(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + as.appendCall(as.UserUnsetup, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserGet(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + as.appendCall(as.UserGet, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserGetCurrent(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + as.appendCall(as.UserGetCurrent, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserGetSystem(ctx context.Context, options arvados.GetOptions) (arvados.User, error) { + as.appendCall(as.UserGetSystem, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserList(ctx context.Context, options arvados.ListOptions) (arvados.UserList, error) { + as.appendCall(as.UserList, ctx, options) + return arvados.UserList{}, as.Error +} +func (as *APIStub) UserDelete(ctx context.Context, options arvados.DeleteOptions) (arvados.User, error) { + as.appendCall(as.UserDelete, ctx, options) + return arvados.User{}, as.Error +} +func (as *APIStub) UserMerge(ctx context.Context, options arvados.UserMergeOptions) (arvados.User, error) { + as.appendCall(as.UserMerge, ctx, options) + return arvados.User{}, as.Error +} func (as *APIStub) APIClientAuthorizationCurrent(ctx context.Context, options arvados.GetOptions) (arvados.APIClientAuthorization, error) { as.appendCall(as.APIClientAuthorizationCurrent, ctx, options) return arvados.APIClientAuthorization{}, as.Error -- 2.30.2