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,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
+ )