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,576 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from collections.abc import Sequence
|
4
|
+
from typing import Literal, overload
|
5
|
+
|
6
|
+
from pangea.asyncio.services.base import ServiceBaseAsync
|
7
|
+
from pangea.config import PangeaConfig
|
8
|
+
from pangea.response import PangeaResponse, PangeaResponseResult
|
9
|
+
from pangea.services.management import (
|
10
|
+
AccessClientCreateInfo,
|
11
|
+
AccessClientInfo,
|
12
|
+
AccessClientListResult,
|
13
|
+
AccessClientSecretInfo,
|
14
|
+
AccessClientSecretInfoListResult,
|
15
|
+
AccessClientTokenAuth,
|
16
|
+
AccessRole,
|
17
|
+
AccessRolesListResult,
|
18
|
+
ListProjectsFilter,
|
19
|
+
ListProjectsResult,
|
20
|
+
Organization,
|
21
|
+
Project,
|
22
|
+
)
|
23
|
+
|
24
|
+
__all__ = ("ManagementAsync",)
|
25
|
+
|
26
|
+
|
27
|
+
class _AuthorizationAsync(ServiceBaseAsync):
|
28
|
+
service_name = "authorization.access"
|
29
|
+
|
30
|
+
|
31
|
+
class _ConsoleAsync(ServiceBaseAsync):
|
32
|
+
service_name = "api.console"
|
33
|
+
|
34
|
+
|
35
|
+
class ManagementAsync:
|
36
|
+
"""Management service client."""
|
37
|
+
|
38
|
+
_authorization: _AuthorizationAsync
|
39
|
+
_console: _ConsoleAsync
|
40
|
+
|
41
|
+
def __init__(
|
42
|
+
self, token: str, config: PangeaConfig | None = None, logger_name: str = "pangea", config_id: str | None = None
|
43
|
+
) -> None:
|
44
|
+
"""
|
45
|
+
Management client
|
46
|
+
|
47
|
+
Initializes a new Management client.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
token: Pangea API token.
|
51
|
+
config: Configuration.
|
52
|
+
logger_name: Logger name.
|
53
|
+
config_id: Configuration ID.
|
54
|
+
|
55
|
+
Examples:
|
56
|
+
config = PangeaConfig(domain="pangea_domain")
|
57
|
+
management = Management(token="pangea_token", config=config)
|
58
|
+
"""
|
59
|
+
|
60
|
+
self._authorization = _AuthorizationAsync(token, config, logger_name, config_id=config_id)
|
61
|
+
self._console = _ConsoleAsync(token, config, logger_name, config_id=config_id)
|
62
|
+
|
63
|
+
async def get_org(self, org_id: str) -> PangeaResponse[Organization]:
|
64
|
+
"""
|
65
|
+
Retrieve an organization
|
66
|
+
|
67
|
+
OperationId: api.console_post_v1beta_platform_org_get
|
68
|
+
|
69
|
+
Args:
|
70
|
+
org_id: An Organization Pangea ID
|
71
|
+
"""
|
72
|
+
|
73
|
+
return await self._console.request.post("v1beta/platform/org/get", Organization, data={"id": org_id})
|
74
|
+
|
75
|
+
async def update_org(self, org_id: str, *, name: str) -> PangeaResponse[Organization]:
|
76
|
+
"""
|
77
|
+
Update an organization
|
78
|
+
|
79
|
+
OperationId: api.console_post_v1beta_platform_org_update
|
80
|
+
|
81
|
+
Args:
|
82
|
+
org_id: An Organization Pangea ID
|
83
|
+
"""
|
84
|
+
|
85
|
+
return await self._console.request.post(
|
86
|
+
"v1beta/platform/org/update", Organization, data={"id": org_id, "name": name}
|
87
|
+
)
|
88
|
+
|
89
|
+
async def get_project(self, project_id: str) -> PangeaResponse[Project]:
|
90
|
+
"""
|
91
|
+
Retrieve a project
|
92
|
+
|
93
|
+
OperationId: api.console_post_v1beta_platform_project_get
|
94
|
+
|
95
|
+
Args:
|
96
|
+
project_id: A Project Pangea ID
|
97
|
+
"""
|
98
|
+
|
99
|
+
return await self._console.request.post("v1beta/platform/project/get", Project, data={"id": project_id})
|
100
|
+
|
101
|
+
async def list_projects(
|
102
|
+
self,
|
103
|
+
org_id: str,
|
104
|
+
*,
|
105
|
+
filter: ListProjectsFilter | None = None,
|
106
|
+
offset: int | None = None,
|
107
|
+
limit: int | None = None,
|
108
|
+
) -> PangeaResponse[ListProjectsResult]:
|
109
|
+
"""
|
110
|
+
List projects
|
111
|
+
|
112
|
+
OperationId: api.console_post_v1beta_platform_project_list
|
113
|
+
|
114
|
+
Args:
|
115
|
+
org_id: An Organization Pangea ID
|
116
|
+
"""
|
117
|
+
|
118
|
+
return await self._console.request.post(
|
119
|
+
"v1beta/platform/project/list",
|
120
|
+
ListProjectsResult,
|
121
|
+
data={"org_id": org_id, "filter": filter, "offset": offset, "limit": limit},
|
122
|
+
)
|
123
|
+
|
124
|
+
async def create_project(
|
125
|
+
self,
|
126
|
+
org_id: str,
|
127
|
+
name: str,
|
128
|
+
geo: Literal["us", "eu"],
|
129
|
+
*,
|
130
|
+
region: Literal["us-west-1", "us-east-1", "eu-central-1"] | None = None,
|
131
|
+
) -> PangeaResponse[Project]:
|
132
|
+
"""
|
133
|
+
Create a project
|
134
|
+
|
135
|
+
OperationId: api.console_post_v1beta_platform_project_create
|
136
|
+
|
137
|
+
Args:
|
138
|
+
org_id: An Organization Pangea ID
|
139
|
+
geo: The geographical region for the project
|
140
|
+
region: The region for the project
|
141
|
+
"""
|
142
|
+
|
143
|
+
return await self._console.request.post(
|
144
|
+
"v1beta/platform/project/create",
|
145
|
+
Project,
|
146
|
+
data={"org_id": org_id, "name": name, "geo": geo, "region": region},
|
147
|
+
)
|
148
|
+
|
149
|
+
async def update_project(self, project_id: str, name: str) -> PangeaResponse[Project]:
|
150
|
+
"""
|
151
|
+
Update a project
|
152
|
+
|
153
|
+
OperationId: api.console_post_v1beta_platform_project_update
|
154
|
+
|
155
|
+
Args:
|
156
|
+
project_id: A Project Pangea ID
|
157
|
+
"""
|
158
|
+
|
159
|
+
return await self._console.request.post(
|
160
|
+
"v1beta/platform/project/update", Project, data={"id": project_id, "name": name}
|
161
|
+
)
|
162
|
+
|
163
|
+
async def delete_project(self, project_id: str) -> PangeaResponse[PangeaResponseResult]:
|
164
|
+
"""
|
165
|
+
Delete a project
|
166
|
+
|
167
|
+
OperationId: api.console_post_v1beta_platform_project_delete
|
168
|
+
|
169
|
+
Args:
|
170
|
+
project_id: A Project Pangea ID
|
171
|
+
"""
|
172
|
+
|
173
|
+
return await self._console.request.post(
|
174
|
+
"v1beta/platform/project/delete", PangeaResponseResult, data={"id": project_id}
|
175
|
+
)
|
176
|
+
|
177
|
+
async def create_client(
|
178
|
+
self,
|
179
|
+
client_name: str,
|
180
|
+
scope: str,
|
181
|
+
*,
|
182
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
183
|
+
redirect_uris: Sequence[str] | None = None,
|
184
|
+
grant_types: Sequence[str] | None = None,
|
185
|
+
response_types: Sequence[str | None] | None = None,
|
186
|
+
client_secret_expires_in: int | None = None,
|
187
|
+
client_token_expires_in: int | None = None,
|
188
|
+
client_secret_name: str | None = None,
|
189
|
+
client_secret_description: str | None = None,
|
190
|
+
roles: Sequence[AccessRole] | None = None,
|
191
|
+
) -> AccessClientCreateInfo:
|
192
|
+
"""
|
193
|
+
Create Platform Client
|
194
|
+
|
195
|
+
OperationId: createPlatformClient
|
196
|
+
|
197
|
+
Args:
|
198
|
+
scope: A list of space separated scope
|
199
|
+
token_endpoint_auth_method: The authentication method for the token endpoint.
|
200
|
+
redirect_uris: A list of allowed redirect URIs for the client.
|
201
|
+
grant_types: A list of OAuth grant types that the client can use.
|
202
|
+
response_types: A list of OAuth response types that the client can use.
|
203
|
+
client_secret_expires_in: A positive time duration in seconds or null
|
204
|
+
client_token_expires_in: A positive time duration in seconds or null
|
205
|
+
roles: A list of roles
|
206
|
+
"""
|
207
|
+
|
208
|
+
return await self._authorization.request.post(
|
209
|
+
"v1beta/oauth/clients/register",
|
210
|
+
data={
|
211
|
+
"client_name": client_name,
|
212
|
+
"scope": scope,
|
213
|
+
"token_endpoint_auth_method": token_endpoint_auth_method,
|
214
|
+
"redirect_uris": redirect_uris,
|
215
|
+
"grant_types": grant_types,
|
216
|
+
"response_types": response_types,
|
217
|
+
"client_secret_expires_in": client_secret_expires_in,
|
218
|
+
"client_token_expires_in": client_token_expires_in,
|
219
|
+
"client_secret_name": client_secret_name,
|
220
|
+
"client_secret_description": client_secret_description,
|
221
|
+
"roles": roles,
|
222
|
+
},
|
223
|
+
result_class=AccessClientCreateInfo,
|
224
|
+
pangea_response=False,
|
225
|
+
)
|
226
|
+
|
227
|
+
async def list_clients(
|
228
|
+
self,
|
229
|
+
*,
|
230
|
+
created_at: str | None = None,
|
231
|
+
created_at__gt: str | None = None,
|
232
|
+
created_at__gte: str | None = None,
|
233
|
+
created_at__lt: str | None = None,
|
234
|
+
created_at__lte: str | None = None,
|
235
|
+
client_id: str | None = None,
|
236
|
+
client_id__contains: Sequence[str] | None = None,
|
237
|
+
client_id__in: Sequence[str] | None = None,
|
238
|
+
client_name: str | None = None,
|
239
|
+
client_name__contains: Sequence[str] | None = None,
|
240
|
+
client_name__in: Sequence[str] | None = None,
|
241
|
+
scopes: Sequence[str] | None = None,
|
242
|
+
updated_at: str | None = None,
|
243
|
+
updated_at__gt: str | None = None,
|
244
|
+
updated_at__gte: str | None = None,
|
245
|
+
updated_at__lt: str | None = None,
|
246
|
+
updated_at__lte: str | None = None,
|
247
|
+
last: str | None = None,
|
248
|
+
order: Literal["asc", "desc"] | None = None,
|
249
|
+
order_by: Literal["id", "created_at", "updated_at", "name", "token_type"] | None = None,
|
250
|
+
size: int | None = None,
|
251
|
+
) -> AccessClientListResult:
|
252
|
+
"""
|
253
|
+
List platform clients
|
254
|
+
|
255
|
+
OperationId: listPlatformClients
|
256
|
+
|
257
|
+
Args:
|
258
|
+
created_at: Only records where created_at equals this value.
|
259
|
+
created_at__gt: Only records where created_at is greater than this value.
|
260
|
+
created_at__gte: Only records where created_at is greater than or equal to this value.
|
261
|
+
created_at__lt: Only records where created_at is less than this value.
|
262
|
+
created_at__lte: Only records where created_at is less than or equal to this value.
|
263
|
+
client_id: Only records where id equals this value.
|
264
|
+
client_id__contains: Only records where id includes each substring.
|
265
|
+
client_id__in: Only records where id equals one of the provided substrings.
|
266
|
+
client_name: Only records where name equals this value.
|
267
|
+
client_name__contains: Only records where name includes each substring.
|
268
|
+
client_name__in: Only records where name equals one of the provided substrings.
|
269
|
+
scopes: A list of tags that all must be present.
|
270
|
+
updated_at: Only records where updated_at equals this value.
|
271
|
+
updated_at__gt: Only records where updated_at is greater than this value.
|
272
|
+
updated_at__gte: Only records where updated_at is greater than or equal to this value.
|
273
|
+
updated_at__lt: Only records where updated_at is less than this value.
|
274
|
+
updated_at__lte: Only records where updated_at is less than or equal to this value.
|
275
|
+
last: Reflected value from a previous response to obtain the next page of results.
|
276
|
+
order: Order results asc(ending) or desc(ending).
|
277
|
+
order_by: Which field to order results by.
|
278
|
+
size: Maximum results to include in the response.
|
279
|
+
"""
|
280
|
+
|
281
|
+
return await self._authorization.request.get(
|
282
|
+
"v1beta/oauth/clients",
|
283
|
+
params={
|
284
|
+
"created_at": created_at,
|
285
|
+
"created_at__gt": created_at__gt,
|
286
|
+
"created_at__gte": created_at__gte,
|
287
|
+
"created_at__lt": created_at__lt,
|
288
|
+
"created_at__lte": created_at__lte,
|
289
|
+
"client_id": client_id,
|
290
|
+
"client_id__contains": client_id__contains,
|
291
|
+
"client_id__in": client_id__in,
|
292
|
+
"client_name": client_name,
|
293
|
+
"client_name__contains": client_name__contains,
|
294
|
+
"client_name__in": client_name__in,
|
295
|
+
"scopes": scopes,
|
296
|
+
"updated_at": updated_at,
|
297
|
+
"updated_at__gt": updated_at__gt,
|
298
|
+
"updated_at__gte": updated_at__gte,
|
299
|
+
"updated_at__lt": updated_at__lt,
|
300
|
+
"updated_at__lte": updated_at__lte,
|
301
|
+
"last": last,
|
302
|
+
"order": order,
|
303
|
+
"order_by": order_by,
|
304
|
+
"size": size,
|
305
|
+
},
|
306
|
+
result_class=AccessClientListResult,
|
307
|
+
pangea_response=False,
|
308
|
+
)
|
309
|
+
|
310
|
+
async def get_client(self, client_id: str) -> AccessClientInfo:
|
311
|
+
"""
|
312
|
+
Get a platform client
|
313
|
+
|
314
|
+
OperationId: getPlatformClient
|
315
|
+
"""
|
316
|
+
|
317
|
+
return await self._authorization.request.get(
|
318
|
+
f"v1beta/oauth/clients/{client_id}", result_class=AccessClientInfo, pangea_response=False
|
319
|
+
)
|
320
|
+
|
321
|
+
@overload
|
322
|
+
async def update_client(
|
323
|
+
self,
|
324
|
+
client_id: str,
|
325
|
+
*,
|
326
|
+
scope: str,
|
327
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
328
|
+
redirect_uris: Sequence[str] | None = None,
|
329
|
+
response_types: Sequence[str | None] | None = None,
|
330
|
+
grant_types: Sequence[str] | None = None,
|
331
|
+
) -> AccessClientInfo:
|
332
|
+
"""
|
333
|
+
Update platform client's scope
|
334
|
+
"""
|
335
|
+
|
336
|
+
@overload
|
337
|
+
async def update_client(
|
338
|
+
self,
|
339
|
+
client_id: str,
|
340
|
+
*,
|
341
|
+
client_name: str,
|
342
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
343
|
+
redirect_uris: Sequence[str] | None = None,
|
344
|
+
response_types: Sequence[str | None] | None = None,
|
345
|
+
grant_types: Sequence[str] | None = None,
|
346
|
+
) -> AccessClientInfo:
|
347
|
+
"""
|
348
|
+
Update platform client's name
|
349
|
+
"""
|
350
|
+
|
351
|
+
async def update_client(
|
352
|
+
self,
|
353
|
+
client_id: str,
|
354
|
+
*,
|
355
|
+
scope: str | None = None,
|
356
|
+
client_name: str | None = None,
|
357
|
+
token_endpoint_auth_method: AccessClientTokenAuth | None = None,
|
358
|
+
redirect_uris: Sequence[str] | None = None,
|
359
|
+
response_types: Sequence[str | None] | None = None,
|
360
|
+
grant_types: Sequence[str] | None = None,
|
361
|
+
) -> AccessClientInfo:
|
362
|
+
"""
|
363
|
+
Update platform client
|
364
|
+
"""
|
365
|
+
|
366
|
+
return await self._authorization.request.post(
|
367
|
+
f"v1beta/oauth/clients/{client_id}",
|
368
|
+
data={
|
369
|
+
"client_id": client_id,
|
370
|
+
"scope": scope,
|
371
|
+
"client_name": client_name,
|
372
|
+
"token_endpoint_auth_method": token_endpoint_auth_method,
|
373
|
+
"redirect_uris": redirect_uris,
|
374
|
+
"response_types": response_types,
|
375
|
+
"grant_types": grant_types,
|
376
|
+
},
|
377
|
+
result_class=AccessClientInfo,
|
378
|
+
pangea_response=False,
|
379
|
+
)
|
380
|
+
|
381
|
+
async def delete_client(self, client_id: str) -> None:
|
382
|
+
"""
|
383
|
+
Delete platform client
|
384
|
+
|
385
|
+
OperationId: deletePlatformClient
|
386
|
+
"""
|
387
|
+
|
388
|
+
return await self._authorization.request.delete(f"v1beta/oauth/clients/{client_id}")
|
389
|
+
|
390
|
+
async def create_client_secret(
|
391
|
+
self,
|
392
|
+
client_id: str,
|
393
|
+
client_secret_id: str,
|
394
|
+
*,
|
395
|
+
client_secret_expires_in: int | None = None,
|
396
|
+
client_secret_name: str | None = None,
|
397
|
+
client_secret_description: str | None = None,
|
398
|
+
) -> AccessClientSecretInfo:
|
399
|
+
"""
|
400
|
+
Create client secret
|
401
|
+
|
402
|
+
OperationId: createClientSecret
|
403
|
+
|
404
|
+
Args:
|
405
|
+
client_secret_expires_in: A positive time duration in seconds
|
406
|
+
"""
|
407
|
+
|
408
|
+
return await self._authorization.request.post(
|
409
|
+
f"v1beta/oauth/clients/{client_id}/secrets",
|
410
|
+
data={
|
411
|
+
"client_id": client_id,
|
412
|
+
"client_secret_id": client_secret_id,
|
413
|
+
"client_secret_expires_in": client_secret_expires_in,
|
414
|
+
"client_secret_name": client_secret_name,
|
415
|
+
"client_secret_description": client_secret_description,
|
416
|
+
},
|
417
|
+
result_class=AccessClientSecretInfo,
|
418
|
+
pangea_response=False,
|
419
|
+
)
|
420
|
+
|
421
|
+
async def list_client_secret_metadata(
|
422
|
+
self,
|
423
|
+
client_id: str,
|
424
|
+
*,
|
425
|
+
created_at: str | None = None,
|
426
|
+
created_at__gt: str | None = None,
|
427
|
+
created_at__gte: str | None = None,
|
428
|
+
created_at__lt: str | None = None,
|
429
|
+
created_at__lte: str | None = None,
|
430
|
+
client_secret_name: str | None = None,
|
431
|
+
client_secret_name__contains: Sequence[str] | None = None,
|
432
|
+
client_secret_name__in: Sequence[str] | None = None,
|
433
|
+
last: str | None = None,
|
434
|
+
order: Literal["asc", "desc"] | None = None,
|
435
|
+
order_by: Literal["id", "created_at", "updated_at", "client_secret_id"] | None = None,
|
436
|
+
size: int | None = None,
|
437
|
+
) -> AccessClientSecretInfoListResult:
|
438
|
+
"""
|
439
|
+
List client secret metadata
|
440
|
+
|
441
|
+
OperationId: listClientSecretMetadata
|
442
|
+
|
443
|
+
Args:
|
444
|
+
client_id: The client ID to list secrets for
|
445
|
+
created_at: Only records where created_at equals this value.
|
446
|
+
created_at__gt: Only records where created_at is greater than this value.
|
447
|
+
created_at__gte: Only records where created_at is greater than or equal to this value.
|
448
|
+
created_at__lt: Only records where created_at is less than this value.
|
449
|
+
created_at__lte: Only records where created_at is less than or equal to this value.
|
450
|
+
client_secret_name: Only records where name equals this value.
|
451
|
+
client_secret_name__contains: Only records where name includes each substring.
|
452
|
+
client_secret_name__in: Only records where name equals one of the provided substrings.
|
453
|
+
last: Reflected value from a previous response to obtain the next page of results.
|
454
|
+
order: Order results asc(ending) or desc(ending).
|
455
|
+
order_by: Which field to order results by.
|
456
|
+
size: Maximum results to include in the response.
|
457
|
+
"""
|
458
|
+
|
459
|
+
return await self._authorization.request.get(
|
460
|
+
f"v1beta/oauth/clients/{client_id}/secrets/metadata",
|
461
|
+
params={
|
462
|
+
"created_at": created_at,
|
463
|
+
"created_at__gt": created_at__gt,
|
464
|
+
"created_at__gte": created_at__gte,
|
465
|
+
"created_at__lt": created_at__lt,
|
466
|
+
"created_at__lte": created_at__lte,
|
467
|
+
"client_secret_name": client_secret_name,
|
468
|
+
"client_secret_name__contains": client_secret_name__contains,
|
469
|
+
"client_secret_name__in": client_secret_name__in,
|
470
|
+
"last": last,
|
471
|
+
"order": order,
|
472
|
+
"order_by": order_by,
|
473
|
+
"size": size,
|
474
|
+
},
|
475
|
+
result_class=AccessClientSecretInfoListResult,
|
476
|
+
pangea_response=False,
|
477
|
+
)
|
478
|
+
|
479
|
+
async def revoke_client_secret(self, client_id: str, client_secret_id: str) -> None:
|
480
|
+
"""
|
481
|
+
Revoke client secret
|
482
|
+
|
483
|
+
OperationId: revokeClientSecret
|
484
|
+
"""
|
485
|
+
|
486
|
+
return await self._authorization.request.delete(f"v1beta/oauth/clients/{client_id}/secrets/{client_secret_id}")
|
487
|
+
|
488
|
+
async def update_client_secret(
|
489
|
+
self,
|
490
|
+
client_id: str,
|
491
|
+
client_secret_id: str,
|
492
|
+
*,
|
493
|
+
client_secret_expires_in: int | None = None,
|
494
|
+
client_secret_name: str | None = None,
|
495
|
+
client_secret_description: str | None = None,
|
496
|
+
) -> AccessClientSecretInfo:
|
497
|
+
"""
|
498
|
+
Update client secret
|
499
|
+
|
500
|
+
OperationId: updateClientSecret
|
501
|
+
|
502
|
+
Args:
|
503
|
+
client_secret_expires_in: A positive time duration in seconds
|
504
|
+
"""
|
505
|
+
|
506
|
+
return await self._authorization.request.post(
|
507
|
+
f"v1beta/oauth/clients/{client_id}/secrets/{client_secret_id}",
|
508
|
+
data={
|
509
|
+
"client_secret_expires_in": client_secret_expires_in,
|
510
|
+
"client_secret_name": client_secret_name,
|
511
|
+
"client_secret_description": client_secret_description,
|
512
|
+
},
|
513
|
+
result_class=AccessClientSecretInfo,
|
514
|
+
pangea_response=False,
|
515
|
+
)
|
516
|
+
|
517
|
+
async def list_client_roles(
|
518
|
+
self,
|
519
|
+
client_id: str,
|
520
|
+
*,
|
521
|
+
resource_type: str | None = None,
|
522
|
+
resource_id: str | None = None,
|
523
|
+
role: str | None = None,
|
524
|
+
) -> AccessRolesListResult:
|
525
|
+
"""
|
526
|
+
List client roles
|
527
|
+
|
528
|
+
OperationId: listClientRoles
|
529
|
+
"""
|
530
|
+
|
531
|
+
return await self._authorization.request.get(
|
532
|
+
f"v1beta/oauth/clients/{client_id}/roles",
|
533
|
+
params={"resource_type": resource_type, "resource_id": resource_id, "role": role},
|
534
|
+
result_class=AccessRolesListResult,
|
535
|
+
pangea_response=False,
|
536
|
+
)
|
537
|
+
|
538
|
+
async def grant_client_access(
|
539
|
+
self, client_id: str, roles: Sequence[AccessRole], scope: str
|
540
|
+
) -> PangeaResponseResult:
|
541
|
+
"""
|
542
|
+
Grant client access
|
543
|
+
|
544
|
+
OperationId: grantClientRoles
|
545
|
+
|
546
|
+
Args:
|
547
|
+
roles: A list of roles
|
548
|
+
scope: A list of space separated scope
|
549
|
+
"""
|
550
|
+
|
551
|
+
return await self._authorization.request.post(
|
552
|
+
f"v1beta/oauth/clients/{client_id}/grant",
|
553
|
+
data={"roles": roles, "scope": scope},
|
554
|
+
result_class=PangeaResponseResult,
|
555
|
+
pangea_response=False,
|
556
|
+
)
|
557
|
+
|
558
|
+
async def revoke_client_access(
|
559
|
+
self, client_id: str, roles: Sequence[AccessRole], scope: str
|
560
|
+
) -> PangeaResponseResult:
|
561
|
+
"""
|
562
|
+
Revoke client access
|
563
|
+
|
564
|
+
OperationId: revokeClientRoles
|
565
|
+
|
566
|
+
Args:
|
567
|
+
roles: A list of roles
|
568
|
+
scope: A list of space separated scope
|
569
|
+
"""
|
570
|
+
|
571
|
+
return await self._authorization.request.post(
|
572
|
+
f"v1beta/oauth/clients/{client_id}/revoke",
|
573
|
+
data={"roles": roles, "scope": scope},
|
574
|
+
result_class=PangeaResponseResult,
|
575
|
+
pangea_response=False,
|
576
|
+
)
|