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