Merge branch '16265-security-updates' into dependabot/bundler/apps/workbench/loofah...
[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"`
64         Select       []string `json:"select"`
65         IncludeTrash bool     `json:"include_trash"`
66         ForwardedFor string   `json:"forwarded_for"`
67         Remote       string   `json:"remote"`
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              int                    `json:"limit"`
81         Offset             int                    `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 }
88
89 type CreateOptions struct {
90         ClusterID        string                 `json:"cluster_id"`
91         EnsureUniqueName bool                   `json:"ensure_unique_name"`
92         Select           []string               `json:"select"`
93         Attrs            map[string]interface{} `json:"attrs"`
94 }
95
96 type UpdateOptions struct {
97         UUID  string                 `json:"uuid"`
98         Attrs map[string]interface{} `json:"attrs"`
99 }
100
101 type UpdateUUIDOptions struct {
102         UUID    string `json:"uuid"`
103         NewUUID string `json:"new_uuid"`
104 }
105
106 type UserActivateOptions struct {
107         UUID string `json:"uuid"`
108 }
109
110 type UserSetupOptions struct {
111         UUID                  string                 `json:"uuid,omitempty"`
112         Email                 string                 `json:"email,omitempty"`
113         OpenIDPrefix          string                 `json:"openid_prefix,omitempty"`
114         RepoName              string                 `json:"repo_name,omitempty"`
115         VMUUID                string                 `json:"vm_uuid,omitempty"`
116         SendNotificationEmail bool                   `json:"send_notification_email,omitempty"`
117         Attrs                 map[string]interface{} `json:"attrs"`
118 }
119
120 type UserMergeOptions struct {
121         NewUserUUID       string `json:"new_user_uuid,omitempty"`
122         OldUserUUID       string `json:"old_user_uuid,omitempty"`
123         NewOwnerUUID      string `json:"new_owner_uuid,omitempty"`
124         NewUserToken      string `json:"new_user_token,omitempty"`
125         RedirectToNewUser bool   `json:"redirect_to_new_user"`
126 }
127
128 type UserBatchUpdateOptions struct {
129         Updates map[string]map[string]interface{} `json:"updates"`
130 }
131
132 type UserBatchUpdateResponse struct{}
133
134 type DeleteOptions struct {
135         UUID string `json:"uuid"`
136 }
137
138 type LoginOptions struct {
139         ReturnTo string `json:"return_to"`        // On success, redirect to this target with api_token=xxx query param
140         Remote   string `json:"remote,omitempty"` // Salt token for remote Cluster ID
141         Code     string `json:"code,omitempty"`   // OAuth2 callback code
142         State    string `json:"state,omitempty"`  // OAuth2 callback state
143 }
144
145 type LogoutOptions struct {
146         ReturnTo string `json:"return_to"` // Redirect to this URL after logging out
147 }
148
149 type API interface {
150         ConfigGet(ctx context.Context) (json.RawMessage, error)
151         Login(ctx context.Context, options LoginOptions) (LoginResponse, error)
152         Logout(ctx context.Context, options LogoutOptions) (LogoutResponse, error)
153         CollectionCreate(ctx context.Context, options CreateOptions) (Collection, error)
154         CollectionUpdate(ctx context.Context, options UpdateOptions) (Collection, error)
155         CollectionGet(ctx context.Context, options GetOptions) (Collection, error)
156         CollectionList(ctx context.Context, options ListOptions) (CollectionList, error)
157         CollectionProvenance(ctx context.Context, options GetOptions) (map[string]interface{}, error)
158         CollectionUsedBy(ctx context.Context, options GetOptions) (map[string]interface{}, error)
159         CollectionDelete(ctx context.Context, options DeleteOptions) (Collection, error)
160         CollectionTrash(ctx context.Context, options DeleteOptions) (Collection, error)
161         CollectionUntrash(ctx context.Context, options UntrashOptions) (Collection, error)
162         ContainerCreate(ctx context.Context, options CreateOptions) (Container, error)
163         ContainerUpdate(ctx context.Context, options UpdateOptions) (Container, error)
164         ContainerGet(ctx context.Context, options GetOptions) (Container, error)
165         ContainerList(ctx context.Context, options ListOptions) (ContainerList, error)
166         ContainerDelete(ctx context.Context, options DeleteOptions) (Container, error)
167         ContainerLock(ctx context.Context, options GetOptions) (Container, error)
168         ContainerUnlock(ctx context.Context, options GetOptions) (Container, error)
169         SpecimenCreate(ctx context.Context, options CreateOptions) (Specimen, error)
170         SpecimenUpdate(ctx context.Context, options UpdateOptions) (Specimen, error)
171         SpecimenGet(ctx context.Context, options GetOptions) (Specimen, error)
172         SpecimenList(ctx context.Context, options ListOptions) (SpecimenList, error)
173         SpecimenDelete(ctx context.Context, options DeleteOptions) (Specimen, error)
174         UserCreate(ctx context.Context, options CreateOptions) (User, error)
175         UserUpdate(ctx context.Context, options UpdateOptions) (User, error)
176         UserUpdateUUID(ctx context.Context, options UpdateUUIDOptions) (User, error)
177         UserMerge(ctx context.Context, options UserMergeOptions) (User, error)
178         UserActivate(ctx context.Context, options UserActivateOptions) (User, error)
179         UserSetup(ctx context.Context, options UserSetupOptions) (map[string]interface{}, error)
180         UserUnsetup(ctx context.Context, options GetOptions) (User, error)
181         UserGet(ctx context.Context, options GetOptions) (User, error)
182         UserGetCurrent(ctx context.Context, options GetOptions) (User, error)
183         UserGetSystem(ctx context.Context, options GetOptions) (User, error)
184         UserList(ctx context.Context, options ListOptions) (UserList, error)
185         UserDelete(ctx context.Context, options DeleteOptions) (User, error)
186         UserBatchUpdate(context.Context, UserBatchUpdateOptions) (UserList, error)
187         APIClientAuthorizationCurrent(ctx context.Context, options GetOptions) (APIClientAuthorization, error)
188 }