16212: Support username/password authentication via PAM.
[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         Username string `json:"username,omitempty"` // PAM username
144         Password string `json:"password,omitempty"` // PAM password
145 }
146
147 type LogoutOptions struct {
148         ReturnTo string `json:"return_to"` // Redirect to this URL after logging out
149 }
150
151 type API interface {
152         ConfigGet(ctx context.Context) (json.RawMessage, error)
153         Login(ctx context.Context, options LoginOptions) (LoginResponse, error)
154         Logout(ctx context.Context, options LogoutOptions) (LogoutResponse, error)
155         CollectionCreate(ctx context.Context, options CreateOptions) (Collection, error)
156         CollectionUpdate(ctx context.Context, options UpdateOptions) (Collection, error)
157         CollectionGet(ctx context.Context, options GetOptions) (Collection, error)
158         CollectionList(ctx context.Context, options ListOptions) (CollectionList, error)
159         CollectionProvenance(ctx context.Context, options GetOptions) (map[string]interface{}, error)
160         CollectionUsedBy(ctx context.Context, options GetOptions) (map[string]interface{}, error)
161         CollectionDelete(ctx context.Context, options DeleteOptions) (Collection, error)
162         CollectionTrash(ctx context.Context, options DeleteOptions) (Collection, error)
163         CollectionUntrash(ctx context.Context, options UntrashOptions) (Collection, error)
164         ContainerCreate(ctx context.Context, options CreateOptions) (Container, error)
165         ContainerUpdate(ctx context.Context, options UpdateOptions) (Container, error)
166         ContainerGet(ctx context.Context, options GetOptions) (Container, error)
167         ContainerList(ctx context.Context, options ListOptions) (ContainerList, error)
168         ContainerDelete(ctx context.Context, options DeleteOptions) (Container, error)
169         ContainerLock(ctx context.Context, options GetOptions) (Container, error)
170         ContainerUnlock(ctx context.Context, options GetOptions) (Container, error)
171         SpecimenCreate(ctx context.Context, options CreateOptions) (Specimen, error)
172         SpecimenUpdate(ctx context.Context, options UpdateOptions) (Specimen, error)
173         SpecimenGet(ctx context.Context, options GetOptions) (Specimen, error)
174         SpecimenList(ctx context.Context, options ListOptions) (SpecimenList, error)
175         SpecimenDelete(ctx context.Context, options DeleteOptions) (Specimen, error)
176         UserCreate(ctx context.Context, options CreateOptions) (User, error)
177         UserUpdate(ctx context.Context, options UpdateOptions) (User, error)
178         UserUpdateUUID(ctx context.Context, options UpdateUUIDOptions) (User, error)
179         UserMerge(ctx context.Context, options UserMergeOptions) (User, error)
180         UserActivate(ctx context.Context, options UserActivateOptions) (User, error)
181         UserSetup(ctx context.Context, options UserSetupOptions) (map[string]interface{}, error)
182         UserUnsetup(ctx context.Context, options GetOptions) (User, error)
183         UserGet(ctx context.Context, options GetOptions) (User, error)
184         UserGetCurrent(ctx context.Context, options GetOptions) (User, error)
185         UserGetSystem(ctx context.Context, options GetOptions) (User, error)
186         UserList(ctx context.Context, options ListOptions) (UserList, error)
187         UserDelete(ctx context.Context, options DeleteOptions) (User, error)
188         UserBatchUpdate(context.Context, UserBatchUpdateOptions) (UserList, error)
189         APIClientAuthorizationCurrent(ctx context.Context, options GetOptions) (APIClientAuthorization, error)
190 }