16683: Permit granting permissions to remote users
[arvados.git] / sdk / go / arvados / api.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         "context"
9         "encoding/json"
10 )
11
12 type APIEndpoint struct {
13         Method string
14         Path   string
15         // "new attributes" key for create/update requests
16         AttrsKey string
17 }
18
19 var (
20         EndpointConfigGet                     = APIEndpoint{"GET", "arvados/v1/config", ""}
21         EndpointLogin                         = APIEndpoint{"GET", "login", ""}
22         EndpointLogout                        = APIEndpoint{"GET", "logout", ""}
23         EndpointCollectionCreate              = APIEndpoint{"POST", "arvados/v1/collections", "collection"}
24         EndpointCollectionUpdate              = APIEndpoint{"PATCH", "arvados/v1/collections/{uuid}", "collection"}
25         EndpointCollectionGet                 = APIEndpoint{"GET", "arvados/v1/collections/{uuid}", ""}
26         EndpointCollectionList                = APIEndpoint{"GET", "arvados/v1/collections", ""}
27         EndpointCollectionProvenance          = APIEndpoint{"GET", "arvados/v1/collections/{uuid}/provenance", ""}
28         EndpointCollectionUsedBy              = APIEndpoint{"GET", "arvados/v1/collections/{uuid}/used_by", ""}
29         EndpointCollectionDelete              = APIEndpoint{"DELETE", "arvados/v1/collections/{uuid}", ""}
30         EndpointCollectionTrash               = APIEndpoint{"POST", "arvados/v1/collections/{uuid}/trash", ""}
31         EndpointCollectionUntrash             = APIEndpoint{"POST", "arvados/v1/collections/{uuid}/untrash", ""}
32         EndpointSpecimenCreate                = APIEndpoint{"POST", "arvados/v1/specimens", "specimen"}
33         EndpointSpecimenUpdate                = APIEndpoint{"PATCH", "arvados/v1/specimens/{uuid}", "specimen"}
34         EndpointSpecimenGet                   = APIEndpoint{"GET", "arvados/v1/specimens/{uuid}", ""}
35         EndpointSpecimenList                  = APIEndpoint{"GET", "arvados/v1/specimens", ""}
36         EndpointSpecimenDelete                = APIEndpoint{"DELETE", "arvados/v1/specimens/{uuid}", ""}
37         EndpointContainerCreate               = APIEndpoint{"POST", "arvados/v1/containers", "container"}
38         EndpointContainerUpdate               = APIEndpoint{"PATCH", "arvados/v1/containers/{uuid}", "container"}
39         EndpointContainerGet                  = APIEndpoint{"GET", "arvados/v1/containers/{uuid}", ""}
40         EndpointContainerList                 = APIEndpoint{"GET", "arvados/v1/containers", ""}
41         EndpointContainerDelete               = APIEndpoint{"DELETE", "arvados/v1/containers/{uuid}", ""}
42         EndpointContainerLock                 = APIEndpoint{"POST", "arvados/v1/containers/{uuid}/lock", ""}
43         EndpointContainerUnlock               = APIEndpoint{"POST", "arvados/v1/containers/{uuid}/unlock", ""}
44         EndpointUserActivate                  = APIEndpoint{"POST", "arvados/v1/users/{uuid}/activate", ""}
45         EndpointUserCreate                    = APIEndpoint{"POST", "arvados/v1/users", "user"}
46         EndpointUserCurrent                   = APIEndpoint{"GET", "arvados/v1/users/current", ""}
47         EndpointUserDelete                    = APIEndpoint{"DELETE", "arvados/v1/users/{uuid}", ""}
48         EndpointUserGet                       = APIEndpoint{"GET", "arvados/v1/users/{uuid}", ""}
49         EndpointUserGetCurrent                = APIEndpoint{"GET", "arvados/v1/users/current", ""}
50         EndpointUserGetSystem                 = APIEndpoint{"GET", "arvados/v1/users/system", ""}
51         EndpointUserList                      = APIEndpoint{"GET", "arvados/v1/users", ""}
52         EndpointUserMerge                     = APIEndpoint{"POST", "arvados/v1/users/merge", ""}
53         EndpointUserSetup                     = APIEndpoint{"POST", "arvados/v1/users/setup", "user"}
54         EndpointUserSystem                    = APIEndpoint{"GET", "arvados/v1/users/system", ""}
55         EndpointUserUnsetup                   = APIEndpoint{"POST", "arvados/v1/users/{uuid}/unsetup", ""}
56         EndpointUserUpdate                    = APIEndpoint{"PATCH", "arvados/v1/users/{uuid}", "user"}
57         EndpointUserUpdateUUID                = APIEndpoint{"POST", "arvados/v1/users/{uuid}/update_uuid", ""}
58         EndpointUserBatchUpdate               = APIEndpoint{"PATCH", "arvados/v1/users/batch", ""}
59         EndpointAPIClientAuthorizationCurrent = APIEndpoint{"GET", "arvados/v1/api_client_authorizations/current", ""}
60 )
61
62 type GetOptions struct {
63         UUID         string   `json:"uuid,omitempty"`
64         Select       []string `json:"select"`
65         IncludeTrash bool     `json:"include_trash"`
66         ForwardedFor string   `json:"forwarded_for,omitempty"`
67         Remote       string   `json:"remote,omitempty"`
68 }
69
70 type UntrashOptions struct {
71         UUID             string `json:"uuid"`
72         EnsureUniqueName bool   `json:"ensure_unique_name"`
73 }
74
75 type ListOptions struct {
76         ClusterID          string                 `json:"cluster_id"`
77         Select             []string               `json:"select"`
78         Filters            []Filter               `json:"filters"`
79         Where              map[string]interface{} `json:"where"`
80         Limit              int64                  `json:"limit"`
81         Offset             int64                  `json:"offset"`
82         Order              []string               `json:"order"`
83         Distinct           bool                   `json:"distinct"`
84         Count              string                 `json:"count"`
85         IncludeTrash       bool                   `json:"include_trash"`
86         IncludeOldVersions bool                   `json:"include_old_versions"`
87         BypassFederation   bool                   `json:"bypass_federation"`
88         ForwardedFor       string                 `json:"forwarded_for,omitempty"`
89 }
90
91 type CreateOptions struct {
92         ClusterID        string                 `json:"cluster_id"`
93         EnsureUniqueName bool                   `json:"ensure_unique_name"`
94         Select           []string               `json:"select"`
95         Attrs            map[string]interface{} `json:"attrs"`
96 }
97
98 type UpdateOptions struct {
99         UUID             string                 `json:"uuid"`
100         Attrs            map[string]interface{} `json:"attrs"`
101         BypassFederation bool                   `json:"bypass_federation"`
102 }
103
104 type UpdateUUIDOptions struct {
105         UUID    string `json:"uuid"`
106         NewUUID string `json:"new_uuid"`
107 }
108
109 type UserActivateOptions struct {
110         UUID string `json:"uuid"`
111 }
112
113 type UserSetupOptions struct {
114         UUID                  string                 `json:"uuid,omitempty"`
115         Email                 string                 `json:"email,omitempty"`
116         OpenIDPrefix          string                 `json:"openid_prefix,omitempty"`
117         RepoName              string                 `json:"repo_name,omitempty"`
118         VMUUID                string                 `json:"vm_uuid,omitempty"`
119         SendNotificationEmail bool                   `json:"send_notification_email,omitempty"`
120         Attrs                 map[string]interface{} `json:"attrs"`
121 }
122
123 type UserMergeOptions struct {
124         NewUserUUID       string `json:"new_user_uuid,omitempty"`
125         OldUserUUID       string `json:"old_user_uuid,omitempty"`
126         NewOwnerUUID      string `json:"new_owner_uuid,omitempty"`
127         NewUserToken      string `json:"new_user_token,omitempty"`
128         RedirectToNewUser bool   `json:"redirect_to_new_user"`
129 }
130
131 type UserBatchUpdateOptions struct {
132         Updates map[string]map[string]interface{} `json:"updates"`
133 }
134
135 type UserBatchUpdateResponse struct{}
136
137 type DeleteOptions struct {
138         UUID string `json:"uuid"`
139 }
140
141 type LoginOptions struct {
142         ReturnTo string `json:"return_to"`        // On success, redirect to this target with api_token=xxx query param
143         Remote   string `json:"remote,omitempty"` // Salt token for remote Cluster ID
144         Code     string `json:"code,omitempty"`   // OAuth2 callback code
145         State    string `json:"state,omitempty"`  // OAuth2 callback state
146 }
147
148 type LogoutOptions struct {
149         ReturnTo string `json:"return_to"` // Redirect to this URL after logging out
150 }
151
152 type API interface {
153         ConfigGet(ctx context.Context) (json.RawMessage, error)
154         Login(ctx context.Context, options LoginOptions) (LoginResponse, error)
155         Logout(ctx context.Context, options LogoutOptions) (LogoutResponse, error)
156         CollectionCreate(ctx context.Context, options CreateOptions) (Collection, error)
157         CollectionUpdate(ctx context.Context, options UpdateOptions) (Collection, error)
158         CollectionGet(ctx context.Context, options GetOptions) (Collection, error)
159         CollectionList(ctx context.Context, options ListOptions) (CollectionList, error)
160         CollectionProvenance(ctx context.Context, options GetOptions) (map[string]interface{}, error)
161         CollectionUsedBy(ctx context.Context, options GetOptions) (map[string]interface{}, error)
162         CollectionDelete(ctx context.Context, options DeleteOptions) (Collection, error)
163         CollectionTrash(ctx context.Context, options DeleteOptions) (Collection, error)
164         CollectionUntrash(ctx context.Context, options UntrashOptions) (Collection, error)
165         ContainerCreate(ctx context.Context, options CreateOptions) (Container, error)
166         ContainerUpdate(ctx context.Context, options UpdateOptions) (Container, error)
167         ContainerGet(ctx context.Context, options GetOptions) (Container, error)
168         ContainerList(ctx context.Context, options ListOptions) (ContainerList, error)
169         ContainerDelete(ctx context.Context, options DeleteOptions) (Container, error)
170         ContainerLock(ctx context.Context, options GetOptions) (Container, error)
171         ContainerUnlock(ctx context.Context, options GetOptions) (Container, error)
172         SpecimenCreate(ctx context.Context, options CreateOptions) (Specimen, error)
173         SpecimenUpdate(ctx context.Context, options UpdateOptions) (Specimen, error)
174         SpecimenGet(ctx context.Context, options GetOptions) (Specimen, error)
175         SpecimenList(ctx context.Context, options ListOptions) (SpecimenList, error)
176         SpecimenDelete(ctx context.Context, options DeleteOptions) (Specimen, error)
177         UserCreate(ctx context.Context, options CreateOptions) (User, error)
178         UserUpdate(ctx context.Context, options UpdateOptions) (User, error)
179         UserUpdateUUID(ctx context.Context, options UpdateUUIDOptions) (User, error)
180         UserMerge(ctx context.Context, options UserMergeOptions) (User, error)
181         UserActivate(ctx context.Context, options UserActivateOptions) (User, error)
182         UserSetup(ctx context.Context, options UserSetupOptions) (map[string]interface{}, error)
183         UserUnsetup(ctx context.Context, options GetOptions) (User, error)
184         UserGet(ctx context.Context, options GetOptions) (User, error)
185         UserGetCurrent(ctx context.Context, options GetOptions) (User, error)
186         UserGetSystem(ctx context.Context, options GetOptions) (User, error)
187         UserList(ctx context.Context, options ListOptions) (UserList, error)
188         UserDelete(ctx context.Context, options DeleteOptions) (User, error)
189         UserBatchUpdate(context.Context, UserBatchUpdateOptions) (UserList, error)
190         APIClientAuthorizationCurrent(ctx context.Context, options GetOptions) (APIClientAuthorization, error)
191 }