pangea-sdk 6.0.0__py3-none-any.whl → 6.2.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pangea/__init__.py +1 -1
- pangea/asyncio/request.py +153 -19
- pangea/asyncio/services/__init__.py +1 -0
- pangea/asyncio/services/audit.py +300 -1
- pangea/asyncio/services/authn.py +171 -14
- pangea/asyncio/services/authz.py +28 -28
- pangea/asyncio/services/management.py +576 -0
- pangea/asyncio/services/redact.py +265 -4
- pangea/request.py +155 -19
- pangea/services/__init__.py +1 -0
- pangea/services/audit/audit.py +301 -1
- pangea/services/audit/models.py +275 -0
- pangea/services/authn/authn.py +177 -18
- pangea/services/authn/models.py +94 -0
- pangea/services/authz.py +65 -30
- pangea/services/management.py +720 -0
- pangea/services/redact.py +473 -7
- {pangea_sdk-6.0.0.dist-info → pangea_sdk-6.2.0b1.dist-info}/METADATA +3 -3
- {pangea_sdk-6.0.0.dist-info → pangea_sdk-6.2.0b1.dist-info}/RECORD +20 -18
- {pangea_sdk-6.0.0.dist-info → pangea_sdk-6.2.0b1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,720 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from collections.abc import Sequence
|
4
|
+
from typing import List, Literal, Optional, Union, overload
|
5
|
+
|
6
|
+
from pydantic import Field
|
7
|
+
|
8
|
+
from pangea.config import PangeaConfig
|
9
|
+
from pangea.response import APIRequestModel, PangeaResponse, PangeaResponseResult
|
10
|
+
from pangea.services.base import ServiceBase
|
11
|
+
|
12
|
+
__all__ = (
|
13
|
+
"AccessClientCreateInfo",
|
14
|
+
"AccessClientCreateInfo",
|
15
|
+
"AccessClientInfo",
|
16
|
+
"AccessClientInfo",
|
17
|
+
"AccessClientListResult",
|
18
|
+
"AccessClientSecretInfo",
|
19
|
+
"AccessClientSecretInfoListResult",
|
20
|
+
"AccessRole",
|
21
|
+
"AccessRolesListResult",
|
22
|
+
"ListProjectsFilter",
|
23
|
+
"ListProjectsResult",
|
24
|
+
"Management",
|
25
|
+
"Organization",
|
26
|
+
"Project",
|
27
|
+
)
|
28
|
+
|
29
|
+
|
30
|
+
class Organization(PangeaResponseResult):
|
31
|
+
id: str
|
32
|
+
name: str
|
33
|
+
owner: str
|
34
|
+
owner_email: Optional[str] = None
|
35
|
+
created_at: str
|
36
|
+
updated_at: str
|
37
|
+
csp: str
|
38
|
+
|
39
|
+
|
40
|
+
class Project(PangeaResponseResult):
|
41
|
+
id: str
|
42
|
+
name: str
|
43
|
+
org: str
|
44
|
+
created_at: str
|
45
|
+
updated_at: str
|
46
|
+
geo: Literal["us", "eu"]
|
47
|
+
"""The geographical region for the project."""
|
48
|
+
|
49
|
+
region: Literal["us-west-1", "us-east-1", "eu-central-1"]
|
50
|
+
"""The region for the project."""
|
51
|
+
|
52
|
+
|
53
|
+
class ListProjectsFilter(APIRequestModel):
|
54
|
+
search: Optional[str] = None
|
55
|
+
geo: Optional[str] = None
|
56
|
+
region: Optional[str] = None
|
57
|
+
|
58
|
+
|
59
|
+
class ListProjectsResult(PangeaResponseResult):
|
60
|
+
results: List[Project]
|
61
|
+
"""A list of projects"""
|
62
|
+
|
63
|
+
count: int
|
64
|
+
offset: Optional[int] = None
|
65
|
+
|
66
|
+
|
67
|
+
AccessClientTokenAuth = Literal["client_secret_basic", "client_secret_post"]
|
68
|
+
"""The authentication method for the token endpoint."""
|
69
|
+
|
70
|
+
|
71
|
+
class AccessClientInfo(PangeaResponseResult):
|
72
|
+
"""API Client information"""
|
73
|
+
|
74
|
+
client_id: str
|
75
|
+
"""An ID for a service account"""
|
76
|
+
created_at: str
|
77
|
+
"""A time in ISO-8601 format"""
|
78
|
+
updated_at: str
|
79
|
+
"""A time in ISO-8601 format"""
|
80
|
+
client_name: str
|
81
|
+
scope: str
|
82
|
+
"""A list of space separated scope"""
|
83
|
+
token_endpoint_auth_method: AccessClientTokenAuth
|
84
|
+
"""The authentication method for the token endpoint."""
|
85
|
+
redirect_uris: List[str]
|
86
|
+
"""A list of allowed redirect URIs for the client."""
|
87
|
+
grant_types: List[str]
|
88
|
+
"""A list of OAuth grant types that the client can use."""
|
89
|
+
response_types: List[Optional[str]]
|
90
|
+
"""A list of OAuth response types that the client can use."""
|
91
|
+
client_token_expires_in: Optional[int] = None
|
92
|
+
"""A positive time duration in seconds or null"""
|
93
|
+
owner_id: str
|
94
|
+
owner_username: str
|
95
|
+
creator_id: str
|
96
|
+
client_class: str
|
97
|
+
|
98
|
+
|
99
|
+
class AccessClientCreateInfo(AccessClientInfo):
|
100
|
+
"""API Client information with initial secret"""
|
101
|
+
|
102
|
+
client_secret: str
|
103
|
+
"""An secret for an API Client"""
|
104
|
+
client_secret_expires_at: str
|
105
|
+
"""A time in ISO-8601 format"""
|
106
|
+
client_secret_name: str
|
107
|
+
client_secret_description: str
|
108
|
+
|
109
|
+
|
110
|
+
AccessRegistryGroup = Literal["ai-guard-edge", "redact-edge", "private-cloud"]
|
111
|
+
"""A Pangea Registry Group"""
|
112
|
+
|
113
|
+
|
114
|
+
class AccessRole(PangeaResponseResult):
|
115
|
+
"""Service token information"""
|
116
|
+
|
117
|
+
role: str
|
118
|
+
type: str
|
119
|
+
id: Union[str, AccessRegistryGroup]
|
120
|
+
|
121
|
+
service: Optional[str] = None
|
122
|
+
service_config_id: Optional[str] = None
|
123
|
+
"""An ID for a service config"""
|
124
|
+
|
125
|
+
|
126
|
+
class AccessClientListResult(PangeaResponseResult):
|
127
|
+
clients: List[AccessClientInfo]
|
128
|
+
count: int
|
129
|
+
last: Optional[str] = None
|
130
|
+
|
131
|
+
|
132
|
+
class AccessClientSecretInfo(PangeaResponseResult):
|
133
|
+
client_id: str
|
134
|
+
"""An ID for a service account"""
|
135
|
+
client_secret_id: str
|
136
|
+
"""An ID for an API Client secret"""
|
137
|
+
client_secret: str
|
138
|
+
"""An secret for an API Client"""
|
139
|
+
client_secret_expires_at: str
|
140
|
+
"""A time in ISO-8601 format"""
|
141
|
+
|
142
|
+
client_secret_name: Optional[str] = None
|
143
|
+
client_secret_description: Optional[str] = None
|
144
|
+
|
145
|
+
|
146
|
+
class AccessClientSecretMetadata(PangeaResponseResult):
|
147
|
+
source_ip: str
|
148
|
+
user_agent: str
|
149
|
+
creator: str
|
150
|
+
creator_id: str
|
151
|
+
creator_type: str
|
152
|
+
|
153
|
+
|
154
|
+
class AccessClientSecretInfoWithMetadata(PangeaResponseResult):
|
155
|
+
client_id: str
|
156
|
+
client_secret_id: str
|
157
|
+
client_secret_expires_at: str
|
158
|
+
client_secret_name: str
|
159
|
+
client_secret_description: str
|
160
|
+
created_at: str
|
161
|
+
updated_at: str
|
162
|
+
client_secret_metadata: AccessClientSecretMetadata
|
163
|
+
|
164
|
+
|
165
|
+
class AccessClientSecretInfoListResult(PangeaResponseResult):
|
166
|
+
client_secrets: List[AccessClientSecretInfoWithMetadata] = Field(alias="client-secrets")
|
167
|
+
count: int
|
168
|
+
last: Optional[str] = None
|
169
|
+
|
170
|
+
|
171
|
+
class AccessRolesListResult(PangeaResponseResult):
|
172
|
+
roles: List[AccessRole]
|
173
|
+
count: int
|
174
|
+
last: Optional[str] = None
|
175
|
+
|
176
|
+
|
177
|
+
class _Authorization(ServiceBase):
|
178
|
+
service_name = "authorization.access"
|
179
|
+
|
180
|
+
|
181
|
+
class _Console(ServiceBase):
|
182
|
+
service_name = "api.console"
|
183
|
+
|
184
|
+
|
185
|
+
class Management:
|
186
|
+
"""Management service client."""
|
187
|
+
|
188
|
+
_authorization: _Authorization
|
189
|
+
_console: _Console
|
190
|
+
|
191
|
+
def __init__(
|
192
|
+
self, token: str, config: PangeaConfig | None = None, logger_name: str = "pangea", config_id: str | None = None
|
193
|
+
) -> None:
|
194
|
+
"""
|
195
|
+
Management client
|
196
|
+
|
197
|
+
Initializes a new Management client.
|
198
|
+
|
199
|
+
Args:
|
200
|
+
token: Pangea API token.
|
201
|
+
config: Configuration.
|
202
|
+
logger_name: Logger name.
|
203
|
+
config_id: Configuration ID.
|
204
|
+
|
205
|
+
Examples:
|
206
|
+
config = PangeaConfig(domain="pangea_domain")
|
207
|
+
management = Management(token="pangea_token", config=config)
|
208
|
+
"""
|
209
|
+
|
210
|
+
self._authorization = _Authorization(token, config, logger_name, config_id=config_id)
|
211
|
+
self._console = _Console(token, config, logger_name, config_id=config_id)
|
212
|
+
|
213
|
+
def get_org(self, org_id: str) -> PangeaResponse[Organization]:
|
214
|
+
"""
|
215
|
+
Retrieve an organization
|
216
|
+
|
217
|
+
OperationId: api.console_post_v1beta_platform_org_get
|
218
|
+
|
219
|
+
Args:
|
220
|
+
org_id: An Organization Pangea ID
|
221
|
+
"""
|
222
|
+
|
223
|
+
return self._console.request.post("v1beta/platform/org/get", Organization, data={"id": org_id})
|
224
|
+
|
225
|
+
def update_org(self, org_id: str, *, name: str) -> PangeaResponse[Organization]:
|
226
|
+
"""
|
227
|
+
Update an organization
|
228
|
+
|
229
|
+
OperationId: api.console_post_v1beta_platform_org_update
|
230
|
+
|
231
|
+
Args:
|
232
|
+
org_id: An Organization Pangea ID
|
233
|
+
"""
|
234
|
+
|
235
|
+
return self._console.request.post("v1beta/platform/org/update", Organization, data={"id": org_id, "name": name})
|
236
|
+
|
237
|
+
def get_project(self, project_id: str) -> PangeaResponse[Project]:
|
238
|
+
"""
|
239
|
+
Retrieve a project
|
240
|
+
|
241
|
+
OperationId: api.console_post_v1beta_platform_project_get
|
242
|
+
|
243
|
+
Args:
|
244
|
+
project_id: A Project Pangea ID
|
245
|
+
"""
|
246
|
+
|
247
|
+
return self._console.request.post("v1beta/platform/project/get", Project, data={"id": project_id})
|
248
|
+
|
249
|
+
def list_projects(
|
250
|
+
self,
|
251
|
+
org_id: str,
|
252
|
+
*,
|
253
|
+
filter: ListProjectsFilter | None = None,
|
254
|
+
offset: int | None = None,
|
255
|
+
limit: int | None = None,
|
256
|
+
) -> PangeaResponse[ListProjectsResult]:
|
257
|
+
"""
|
258
|
+
List projects
|
259
|
+
|
260
|
+
OperationId: api.console_post_v1beta_platform_project_list
|
261
|
+
|
262
|
+
Args:
|
263
|
+
org_id: An Organization Pangea ID
|
264
|
+
"""
|
265
|
+
|
266
|
+
return self._console.request.post(
|
267
|
+
"v1beta/platform/project/list",
|
268
|
+
ListProjectsResult,
|
269
|
+
data={"org_id": org_id, "filter": filter, "offset": offset, "limit": limit},
|
270
|
+
)
|
271
|
+
|
272
|
+
def create_project(
|
273
|
+
self,
|
274
|
+
org_id: str,
|
275
|
+
name: str,
|
276
|
+
geo: Literal["us", "eu"],
|
277
|
+
*,
|
278
|
+
region: Literal["us-west-1", "us-east-1", "eu-central-1"] | None = None,
|
279
|
+
) -> PangeaResponse[Project]:
|
280
|
+
"""
|
281
|
+
Create a project
|
282
|
+
|
283
|
+
OperationId: api.console_post_v1beta_platform_project_create
|
284
|
+
|
285
|
+
Args:
|
286
|
+
org_id: An Organization Pangea ID
|
287
|
+
geo: The geographical region for the project
|
288
|
+
region: The region for the project
|
289
|
+
"""
|
290
|
+
|
291
|
+
return self._console.request.post(
|
292
|
+
"v1beta/platform/project/create",
|
293
|
+
Project,
|
294
|
+
data={"org_id": org_id, "name": name, "geo": geo, "region": region},
|
295
|
+
)
|
296
|
+
|
297
|
+
def update_project(self, project_id: str, name: str) -> PangeaResponse[Project]:
|
298
|
+
"""
|
299
|
+
Update a project
|
300
|
+
|
301
|
+
OperationId: api.console_post_v1beta_platform_project_update
|
302
|
+
|
303
|
+
Args:
|
304
|
+
project_id: A Project Pangea ID
|
305
|
+
"""
|
306
|
+
|
307
|
+
return self._console.request.post(
|
308
|
+
"v1beta/platform/project/update", Project, data={"id": project_id, "name": name}
|
309
|
+
)
|
310
|
+
|
311
|
+
def delete_project(self, project_id: str) -> PangeaResponse[PangeaResponseResult]:
|
312
|
+
"""
|
313
|
+
Delete a project
|
314
|
+
|
315
|
+
OperationId: api.console_post_v1beta_platform_project_delete
|
316
|
+
|
317
|
+
Args:
|
318
|
+
project_id: A Project Pangea ID
|
319
|
+
"""
|
320
|
+
|
321
|
+
return self._console.request.post(
|
322
|
+
"v1beta/platform/project/delete", PangeaResponseResult, data={"id": project_id}
|
323
|
+
)
|
324
|
+
|
325
|
+
def create_client(
|
326
|
+
self,
|
327
|
+
client_name: str,
|
328
|
+
scope: str,
|
329
|
+
*,
|
330
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
331
|
+
redirect_uris: Sequence[str] | None = None,
|
332
|
+
grant_types: Sequence[str] | None = None,
|
333
|
+
response_types: Sequence[str | None] | None = None,
|
334
|
+
client_secret_expires_in: int | None = None,
|
335
|
+
client_token_expires_in: int | None = None,
|
336
|
+
client_secret_name: str | None = None,
|
337
|
+
client_secret_description: str | None = None,
|
338
|
+
roles: Sequence[AccessRole] | None = None,
|
339
|
+
) -> AccessClientCreateInfo:
|
340
|
+
"""
|
341
|
+
Create Platform Client
|
342
|
+
|
343
|
+
OperationId: createPlatformClient
|
344
|
+
|
345
|
+
Args:
|
346
|
+
scope: A list of space separated scope
|
347
|
+
token_endpoint_auth_method: The authentication method for the token endpoint.
|
348
|
+
redirect_uris: A list of allowed redirect URIs for the client.
|
349
|
+
grant_types: A list of OAuth grant types that the client can use.
|
350
|
+
response_types: A list of OAuth response types that the client can use.
|
351
|
+
client_secret_expires_in: A positive time duration in seconds or null
|
352
|
+
client_token_expires_in: A positive time duration in seconds or null
|
353
|
+
roles: A list of roles
|
354
|
+
"""
|
355
|
+
|
356
|
+
return self._authorization.request.post(
|
357
|
+
"v1beta/oauth/clients/register",
|
358
|
+
data={
|
359
|
+
"client_name": client_name,
|
360
|
+
"scope": scope,
|
361
|
+
"token_endpoint_auth_method": token_endpoint_auth_method,
|
362
|
+
"redirect_uris": redirect_uris,
|
363
|
+
"grant_types": grant_types,
|
364
|
+
"response_types": response_types,
|
365
|
+
"client_secret_expires_in": client_secret_expires_in,
|
366
|
+
"client_token_expires_in": client_token_expires_in,
|
367
|
+
"client_secret_name": client_secret_name,
|
368
|
+
"client_secret_description": client_secret_description,
|
369
|
+
"roles": roles,
|
370
|
+
},
|
371
|
+
result_class=AccessClientCreateInfo,
|
372
|
+
pangea_response=False,
|
373
|
+
)
|
374
|
+
|
375
|
+
def list_clients(
|
376
|
+
self,
|
377
|
+
*,
|
378
|
+
created_at: str | None = None,
|
379
|
+
created_at__gt: str | None = None,
|
380
|
+
created_at__gte: str | None = None,
|
381
|
+
created_at__lt: str | None = None,
|
382
|
+
created_at__lte: str | None = None,
|
383
|
+
client_id: str | None = None,
|
384
|
+
client_id__contains: Sequence[str] | None = None,
|
385
|
+
client_id__in: Sequence[str] | None = None,
|
386
|
+
client_name: str | None = None,
|
387
|
+
client_name__contains: Sequence[str] | None = None,
|
388
|
+
client_name__in: Sequence[str] | None = None,
|
389
|
+
scopes: Sequence[str] | None = None,
|
390
|
+
updated_at: str | None = None,
|
391
|
+
updated_at__gt: str | None = None,
|
392
|
+
updated_at__gte: str | None = None,
|
393
|
+
updated_at__lt: str | None = None,
|
394
|
+
updated_at__lte: str | None = None,
|
395
|
+
last: str | None = None,
|
396
|
+
order: Literal["asc", "desc"] | None = None,
|
397
|
+
order_by: Literal["id", "created_at", "updated_at", "name", "token_type"] | None = None,
|
398
|
+
size: int | None = None,
|
399
|
+
) -> AccessClientListResult:
|
400
|
+
"""
|
401
|
+
List platform clients
|
402
|
+
|
403
|
+
OperationId: listPlatformClients
|
404
|
+
|
405
|
+
Args:
|
406
|
+
created_at: Only records where created_at equals this value.
|
407
|
+
created_at__gt: Only records where created_at is greater than this value.
|
408
|
+
created_at__gte: Only records where created_at is greater than or equal to this value.
|
409
|
+
created_at__lt: Only records where created_at is less than this value.
|
410
|
+
created_at__lte: Only records where created_at is less than or equal to this value.
|
411
|
+
client_id: Only records where id equals this value.
|
412
|
+
client_id__contains: Only records where id includes each substring.
|
413
|
+
client_id__in: Only records where id equals one of the provided substrings.
|
414
|
+
client_name: Only records where name equals this value.
|
415
|
+
client_name__contains: Only records where name includes each substring.
|
416
|
+
client_name__in: Only records where name equals one of the provided substrings.
|
417
|
+
scopes: A list of tags that all must be present.
|
418
|
+
updated_at: Only records where updated_at equals this value.
|
419
|
+
updated_at__gt: Only records where updated_at is greater than this value.
|
420
|
+
updated_at__gte: Only records where updated_at is greater than or equal to this value.
|
421
|
+
updated_at__lt: Only records where updated_at is less than this value.
|
422
|
+
updated_at__lte: Only records where updated_at is less than or equal to this value.
|
423
|
+
last: Reflected value from a previous response to obtain the next page of results.
|
424
|
+
order: Order results asc(ending) or desc(ending).
|
425
|
+
order_by: Which field to order results by.
|
426
|
+
size: Maximum results to include in the response.
|
427
|
+
"""
|
428
|
+
|
429
|
+
return self._authorization.request.get(
|
430
|
+
"v1beta/oauth/clients",
|
431
|
+
params={
|
432
|
+
"created_at": created_at,
|
433
|
+
"created_at__gt": created_at__gt,
|
434
|
+
"created_at__gte": created_at__gte,
|
435
|
+
"created_at__lt": created_at__lt,
|
436
|
+
"created_at__lte": created_at__lte,
|
437
|
+
"client_id": client_id,
|
438
|
+
"client_id__contains": client_id__contains,
|
439
|
+
"client_id__in": client_id__in,
|
440
|
+
"client_name": client_name,
|
441
|
+
"client_name__contains": client_name__contains,
|
442
|
+
"client_name__in": client_name__in,
|
443
|
+
"scopes": scopes,
|
444
|
+
"updated_at": updated_at,
|
445
|
+
"updated_at__gt": updated_at__gt,
|
446
|
+
"updated_at__gte": updated_at__gte,
|
447
|
+
"updated_at__lt": updated_at__lt,
|
448
|
+
"updated_at__lte": updated_at__lte,
|
449
|
+
"last": last,
|
450
|
+
"order": order,
|
451
|
+
"order_by": order_by,
|
452
|
+
"size": size,
|
453
|
+
},
|
454
|
+
result_class=AccessClientListResult,
|
455
|
+
pangea_response=False,
|
456
|
+
)
|
457
|
+
|
458
|
+
def get_client(self, client_id: str) -> AccessClientInfo:
|
459
|
+
"""
|
460
|
+
Get a platform client
|
461
|
+
|
462
|
+
OperationId: getPlatformClient
|
463
|
+
"""
|
464
|
+
|
465
|
+
return self._authorization.request.get(
|
466
|
+
f"v1beta/oauth/clients/{client_id}", result_class=AccessClientInfo, pangea_response=False
|
467
|
+
)
|
468
|
+
|
469
|
+
@overload
|
470
|
+
def update_client(
|
471
|
+
self,
|
472
|
+
client_id: str,
|
473
|
+
*,
|
474
|
+
scope: str,
|
475
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
476
|
+
redirect_uris: Sequence[str] | None = None,
|
477
|
+
response_types: Sequence[str | None] | None = None,
|
478
|
+
grant_types: Sequence[str] | None = None,
|
479
|
+
) -> AccessClientInfo:
|
480
|
+
"""
|
481
|
+
Update platform client's scope
|
482
|
+
"""
|
483
|
+
|
484
|
+
@overload
|
485
|
+
def update_client(
|
486
|
+
self,
|
487
|
+
client_id: str,
|
488
|
+
*,
|
489
|
+
client_name: str,
|
490
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
491
|
+
redirect_uris: Sequence[str] | None = None,
|
492
|
+
response_types: Sequence[str | None] | None = None,
|
493
|
+
grant_types: Sequence[str] | None = None,
|
494
|
+
) -> AccessClientInfo:
|
495
|
+
"""
|
496
|
+
Update platform client's name
|
497
|
+
"""
|
498
|
+
|
499
|
+
def update_client(
|
500
|
+
self,
|
501
|
+
client_id: str,
|
502
|
+
*,
|
503
|
+
scope: str | None = None,
|
504
|
+
client_name: str | None = None,
|
505
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
506
|
+
redirect_uris: Sequence[str] | None = None,
|
507
|
+
response_types: Sequence[str | None] | None = None,
|
508
|
+
grant_types: Sequence[str] | None = None,
|
509
|
+
) -> AccessClientInfo:
|
510
|
+
"""
|
511
|
+
Update platform client
|
512
|
+
"""
|
513
|
+
|
514
|
+
return self._authorization.request.post(
|
515
|
+
f"v1beta/oauth/clients/{client_id}",
|
516
|
+
data={
|
517
|
+
"client_id": client_id,
|
518
|
+
"scope": scope,
|
519
|
+
"client_name": client_name,
|
520
|
+
"token_endpoint_auth_method": token_endpoint_auth_method,
|
521
|
+
"redirect_uris": redirect_uris,
|
522
|
+
"response_types": response_types,
|
523
|
+
"grant_types": grant_types,
|
524
|
+
},
|
525
|
+
result_class=AccessClientInfo,
|
526
|
+
pangea_response=False,
|
527
|
+
)
|
528
|
+
|
529
|
+
def delete_client(self, client_id: str) -> None:
|
530
|
+
"""
|
531
|
+
Delete platform client
|
532
|
+
|
533
|
+
OperationId: deletePlatformClient
|
534
|
+
"""
|
535
|
+
|
536
|
+
return self._authorization.request.delete(f"v1beta/oauth/clients/{client_id}")
|
537
|
+
|
538
|
+
def create_client_secret(
|
539
|
+
self,
|
540
|
+
client_id: str,
|
541
|
+
client_secret_id: str,
|
542
|
+
*,
|
543
|
+
client_secret_expires_in: int | None = None,
|
544
|
+
client_secret_name: str | None = None,
|
545
|
+
client_secret_description: str | None = None,
|
546
|
+
) -> AccessClientSecretInfo:
|
547
|
+
"""
|
548
|
+
Create client secret
|
549
|
+
|
550
|
+
OperationId: createClientSecret
|
551
|
+
|
552
|
+
Args:
|
553
|
+
client_secret_expires_in: A positive time duration in seconds
|
554
|
+
"""
|
555
|
+
|
556
|
+
return self._authorization.request.post(
|
557
|
+
f"v1beta/oauth/clients/{client_id}/secrets",
|
558
|
+
data={
|
559
|
+
"client_id": client_id,
|
560
|
+
"client_secret_id": client_secret_id,
|
561
|
+
"client_secret_expires_in": client_secret_expires_in,
|
562
|
+
"client_secret_name": client_secret_name,
|
563
|
+
"client_secret_description": client_secret_description,
|
564
|
+
},
|
565
|
+
result_class=AccessClientSecretInfo,
|
566
|
+
pangea_response=False,
|
567
|
+
)
|
568
|
+
|
569
|
+
def list_client_secret_metadata(
|
570
|
+
self,
|
571
|
+
client_id: str,
|
572
|
+
*,
|
573
|
+
created_at: str | None = None,
|
574
|
+
created_at__gt: str | None = None,
|
575
|
+
created_at__gte: str | None = None,
|
576
|
+
created_at__lt: str | None = None,
|
577
|
+
created_at__lte: str | None = None,
|
578
|
+
client_secret_name: str | None = None,
|
579
|
+
client_secret_name__contains: Sequence[str] | None = None,
|
580
|
+
client_secret_name__in: Sequence[str] | None = None,
|
581
|
+
last: str | None = None,
|
582
|
+
order: Literal["asc", "desc"] | None = None,
|
583
|
+
order_by: Literal["id", "created_at", "updated_at", "client_secret_id"] | None = None,
|
584
|
+
size: int | None = None,
|
585
|
+
) -> AccessClientSecretInfoListResult:
|
586
|
+
"""
|
587
|
+
List client secret metadata
|
588
|
+
|
589
|
+
OperationId: listClientSecretMetadata
|
590
|
+
|
591
|
+
Args:
|
592
|
+
client_id: The client ID to list secrets for
|
593
|
+
created_at: Only records where created_at equals this value.
|
594
|
+
created_at__gt: Only records where created_at is greater than this value.
|
595
|
+
created_at__gte: Only records where created_at is greater than or equal to this value.
|
596
|
+
created_at__lt: Only records where created_at is less than this value.
|
597
|
+
created_at__lte: Only records where created_at is less than or equal to this value.
|
598
|
+
client_secret_name: Only records where name equals this value.
|
599
|
+
client_secret_name__contains: Only records where name includes each substring.
|
600
|
+
client_secret_name__in: Only records where name equals one of the provided substrings.
|
601
|
+
last: Reflected value from a previous response to obtain the next page of results.
|
602
|
+
order: Order results asc(ending) or desc(ending).
|
603
|
+
order_by: Which field to order results by.
|
604
|
+
size: Maximum results to include in the response.
|
605
|
+
"""
|
606
|
+
|
607
|
+
return self._authorization.request.get(
|
608
|
+
f"v1beta/oauth/clients/{client_id}/secrets/metadata",
|
609
|
+
params={
|
610
|
+
"created_at": created_at,
|
611
|
+
"created_at__gt": created_at__gt,
|
612
|
+
"created_at__gte": created_at__gte,
|
613
|
+
"created_at__lt": created_at__lt,
|
614
|
+
"created_at__lte": created_at__lte,
|
615
|
+
"client_secret_name": client_secret_name,
|
616
|
+
"client_secret_name__contains": client_secret_name__contains,
|
617
|
+
"client_secret_name__in": client_secret_name__in,
|
618
|
+
"last": last,
|
619
|
+
"order": order,
|
620
|
+
"order_by": order_by,
|
621
|
+
"size": size,
|
622
|
+
},
|
623
|
+
result_class=AccessClientSecretInfoListResult,
|
624
|
+
pangea_response=False,
|
625
|
+
)
|
626
|
+
|
627
|
+
def revoke_client_secret(self, client_id: str, client_secret_id: str) -> None:
|
628
|
+
"""
|
629
|
+
Revoke client secret
|
630
|
+
|
631
|
+
OperationId: revokeClientSecret
|
632
|
+
"""
|
633
|
+
|
634
|
+
return self._authorization.request.delete(f"v1beta/oauth/clients/{client_id}/secrets/{client_secret_id}")
|
635
|
+
|
636
|
+
def update_client_secret(
|
637
|
+
self,
|
638
|
+
client_id: str,
|
639
|
+
client_secret_id: str,
|
640
|
+
*,
|
641
|
+
client_secret_expires_in: int | None = None,
|
642
|
+
client_secret_name: str | None = None,
|
643
|
+
client_secret_description: str | None = None,
|
644
|
+
) -> AccessClientSecretInfo:
|
645
|
+
"""
|
646
|
+
Update client secret
|
647
|
+
|
648
|
+
OperationId: updateClientSecret
|
649
|
+
|
650
|
+
Args:
|
651
|
+
client_secret_expires_in: A positive time duration in seconds
|
652
|
+
"""
|
653
|
+
|
654
|
+
return self._authorization.request.post(
|
655
|
+
f"v1beta/oauth/clients/{client_id}/secrets/{client_secret_id}",
|
656
|
+
data={
|
657
|
+
"client_secret_expires_in": client_secret_expires_in,
|
658
|
+
"client_secret_name": client_secret_name,
|
659
|
+
"client_secret_description": client_secret_description,
|
660
|
+
},
|
661
|
+
result_class=AccessClientSecretInfo,
|
662
|
+
pangea_response=False,
|
663
|
+
)
|
664
|
+
|
665
|
+
def list_client_roles(
|
666
|
+
self,
|
667
|
+
client_id: str,
|
668
|
+
*,
|
669
|
+
resource_type: str | None = None,
|
670
|
+
resource_id: str | None = None,
|
671
|
+
role: str | None = None,
|
672
|
+
) -> AccessRolesListResult:
|
673
|
+
"""
|
674
|
+
List client roles
|
675
|
+
|
676
|
+
OperationId: listClientRoles
|
677
|
+
"""
|
678
|
+
|
679
|
+
return self._authorization.request.get(
|
680
|
+
f"v1beta/oauth/clients/{client_id}/roles",
|
681
|
+
params={"resource_type": resource_type, "resource_id": resource_id, "role": role},
|
682
|
+
result_class=AccessRolesListResult,
|
683
|
+
pangea_response=False,
|
684
|
+
)
|
685
|
+
|
686
|
+
def grant_client_access(self, client_id: str, roles: Sequence[AccessRole], scope: str) -> PangeaResponseResult:
|
687
|
+
"""
|
688
|
+
Grant client access
|
689
|
+
|
690
|
+
OperationId: grantClientRoles
|
691
|
+
|
692
|
+
Args:
|
693
|
+
roles: A list of roles
|
694
|
+
scope: A list of space separated scope
|
695
|
+
"""
|
696
|
+
|
697
|
+
return self._authorization.request.post(
|
698
|
+
f"v1beta/oauth/clients/{client_id}/grant",
|
699
|
+
data={"roles": roles, "scope": scope},
|
700
|
+
result_class=PangeaResponseResult,
|
701
|
+
pangea_response=False,
|
702
|
+
)
|
703
|
+
|
704
|
+
def revoke_client_access(self, client_id: str, roles: Sequence[AccessRole], scope: str) -> PangeaResponseResult:
|
705
|
+
"""
|
706
|
+
Revoke client access
|
707
|
+
|
708
|
+
OperationId: revokeClientRoles
|
709
|
+
|
710
|
+
Args:
|
711
|
+
roles: A list of roles
|
712
|
+
scope: A list of space separated scope
|
713
|
+
"""
|
714
|
+
|
715
|
+
return self._authorization.request.post(
|
716
|
+
f"v1beta/oauth/clients/{client_id}/revoke",
|
717
|
+
data={"roles": roles, "scope": scope},
|
718
|
+
result_class=PangeaResponseResult,
|
719
|
+
pangea_response=False,
|
720
|
+
)
|