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.
@@ -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
+ )