Merge branch '16683-fed-sharing' refs #16683
[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_update", ""}
59         EndpointUserAuthenticate              = APIEndpoint{"POST", "arvados/v1/users/authenticate", ""}
60         EndpointAPIClientAuthorizationCurrent = APIEndpoint{"GET", "arvados/v1/api_client_authorizations/current", ""}
61 )
62
63 type GetOptions struct {
64         UUID         string   `json:"uuid,omitempty"`
65         Select       []string `json:"select"`
66         IncludeTrash bool     `json:"include_trash"`
67         ForwardedFor string   `json:"forwarded_for,omitempty"`
68         Remote       string   `json:"remote,omitempty"`
69 }
70
71 type UntrashOptions struct {
72         UUID             string `json:"uuid"`
73         EnsureUniqueName bool   `json:"ensure_unique_name"`
74 }
75
76 type ListOptions struct {
77         ClusterID          string                 `json:"cluster_id"`
78         Select             []string               `json:"select"`
79         Filters            []Filter               `json:"filters"`
80         Where              map[string]interface{} `json:"where"`
81         Limit              int64                  `json:"limit"`
82         Offset             int64                  `json:"offset"`
83         Order              []string               `json:"order"`
84         Distinct           bool                   `json:"distinct"`
85         Count              string                 `json:"count"`
86         IncludeTrash       bool                   `json:"include_trash"`
87         IncludeOldVersions bool                   `json:"include_old_versions"`
88         BypassFederation   bool                   `json:"bypass_federation"`
89         ForwardedFor       string                 `json:"forwarded_for,omitempty"`
90 }
91
92 type CreateOptions struct {
93         ClusterID        string                 `json:"cluster_id"`
94         EnsureUniqueName bool                   `json:"ensure_unique_name"`
95         Select           []string               `json:"select"`
96         Attrs            map[string]interface{} `json:"attrs"`
97 }
98
99 type UpdateOptions struct {
100         UUID             string                 `json:"uuid"`
101         Attrs            map[string]interface{} `json:"attrs"`
102         BypassFederation bool                   `json:"bypass_federation"`
103 }
104
105 type UpdateUUIDOptions struct {
106         UUID    string `json:"uuid"`
107         NewUUID string `json:"new_uuid"`
108 }
109
110 type UserActivateOptions struct {
111         UUID string `json:"uuid"`
112 }
113
114 type UserSetupOptions struct {
115         UUID                  string                 `json:"uuid,omitempty"`
116         Email                 string                 `json:"email,omitempty"`
117         OpenIDPrefix          string                 `json:"openid_prefix,omitempty"`
118         RepoName              string                 `json:"repo_name,omitempty"`
119         VMUUID                string                 `json:"vm_uuid,omitempty"`
120         SendNotificationEmail bool                   `json:"send_notification_email,omitempty"`
121         Attrs                 map[string]interface{} `json:"attrs"`
122 }
123
124 type UserMergeOptions struct {
125         NewUserUUID       string `json:"new_user_uuid,omitempty"`
126         OldUserUUID       string `json:"old_user_uuid,omitempty"`
127         NewOwnerUUID      string `json:"new_owner_uuid,omitempty"`
128         NewUserToken      string `json:"new_user_token,omitempty"`
129         RedirectToNewUser bool   `json:"redirect_to_new_user"`
130 }
131
132 type UserBatchUpdateOptions struct {
133         Updates map[string]map[string]interface{} `json:"updates"`
134 }
135
136 type UserBatchUpdateResponse struct{}
137
138 type DeleteOptions struct {
139         UUID string `json:"uuid"`
140 }
141
142 type LoginOptions struct {
143         ReturnTo string `json:"return_to"`        // On success, redirect to this target with api_token=xxx query param
144         Remote   string `json:"remote,omitempty"` // Salt token for remote Cluster ID
145         Code     string `json:"code,omitempty"`   // OAuth2 callback code
146         State    string `json:"state,omitempty"`  // OAuth2 callback state
147 }
148
149 type UserAuthenticateOptions struct {
150         Username string `json:"username,omitempty"` // PAM username
151         Password string `json:"password,omitempty"` // PAM password
152 }
153
154 type LogoutOptions struct {
155         ReturnTo string `json:"return_to"` // Redirect to this URL after logging out
156 }
157
158 type API interface {
159         ConfigGet(ctx context.Context) (json.RawMessage, error)
160         Login(ctx context.Context, options LoginOptions) (LoginResponse, error)
161         Logout(ctx context.Context, options LogoutOptions) (LogoutResponse, error)
162         CollectionCreate(ctx context.Context, options CreateOptions) (Collection, error)
163         CollectionUpdate(ctx context.Context, options UpdateOptions) (Collection, error)
164         CollectionGet(ctx context.Context, options GetOptions) (Collection, error)
165         CollectionList(ctx context.Context, options ListOptions) (CollectionList, error)
166         CollectionProvenance(ctx context.Context, options GetOptions) (map[string]interface{}, error)
167         CollectionUsedBy(ctx context.Context, options GetOptions) (map[string]interface{}, error)
168         CollectionDelete(ctx context.Context, options DeleteOptions) (Collection, error)
169         CollectionTrash(ctx context.Context, options DeleteOptions) (Collection, error)
170         CollectionUntrash(ctx context.Context, options UntrashOptions) (Collection, error)
171         ContainerCreate(ctx context.Context, options CreateOptions) (Container, error)
172         ContainerUpdate(ctx context.Context, options UpdateOptions) (Container, error)
173         ContainerGet(ctx context.Context, options GetOptions) (Container, error)
174         ContainerList(ctx context.Context, options ListOptions) (ContainerList, error)
175         ContainerDelete(ctx context.Context, options DeleteOptions) (Container, error)
176         ContainerLock(ctx context.Context, options GetOptions) (Container, error)
177         ContainerUnlock(ctx context.Context, options GetOptions) (Container, error)
178         SpecimenCreate(ctx context.Context, options CreateOptions) (Specimen, error)
179         SpecimenUpdate(ctx context.Context, options UpdateOptions) (Specimen, error)
180         SpecimenGet(ctx context.Context, options GetOptions) (Specimen, error)
181         SpecimenList(ctx context.Context, options ListOptions) (SpecimenList, error)
182         SpecimenDelete(ctx context.Context, options DeleteOptions) (Specimen, error)
183         UserCreate(ctx context.Context, options CreateOptions) (User, error)
184         UserUpdate(ctx context.Context, options UpdateOptions) (User, error)
185         UserUpdateUUID(ctx context.Context, options UpdateUUIDOptions) (User, error)
186         UserMerge(ctx context.Context, options UserMergeOptions) (User, error)
187         UserActivate(ctx context.Context, options UserActivateOptions) (User, error)
188         UserSetup(ctx context.Context, options UserSetupOptions) (map[string]interface{}, error)
189         UserUnsetup(ctx context.Context, options GetOptions) (User, error)
190         UserGet(ctx context.Context, options GetOptions) (User, error)
191         UserGetCurrent(ctx context.Context, options GetOptions) (User, error)
192         UserGetSystem(ctx context.Context, options GetOptions) (User, error)
193         UserList(ctx context.Context, options ListOptions) (UserList, error)
194         UserDelete(ctx context.Context, options DeleteOptions) (User, error)
195         UserBatchUpdate(context.Context, UserBatchUpdateOptions) (UserList, error)
196         UserAuthenticate(ctx context.Context, options UserAuthenticateOptions) (APIClientAuthorization, error)
197         APIClientAuthorizationCurrent(ctx context.Context, options GetOptions) (APIClientAuthorization, error)
198 }