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