Skip to content

Commit 9e23e57

Browse files
feat(agent): add group-based SCM tools access control
1 parent d235f9b commit 9e23e57

File tree

12 files changed

+305
-7
lines changed

12 files changed

+305
-7
lines changed

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 159
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-d62ef4b9187c1f3d36f428abc4b31d8a09ffd36e93d39b8136c60c8f463c838e.yml
3-
openapi_spec_hash: d7f01b6f24e88eb46d744ecd28061f26
4-
config_hash: 26e4a10dfc6ec809322e60d889d15414
1+
configured_endpoints: 160
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/gitpod%2Fgitpod-a19818e87979929d5484f97ec50318899c659c73733b4a700a41f28687ee2632.yml
3+
openapi_spec_hash: f2d83905d1ed19d50c2f4641ecf29204
4+
config_hash: e84bdcd3fab4b185dd3dd79f70ea527d

api.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,17 @@ Methods:
281281
Types:
282282

283283
```python
284-
from gitpod.types.groups import GroupMembership, MembershipCreateResponse
284+
from gitpod.types.groups import (
285+
GroupMembership,
286+
MembershipCreateResponse,
287+
MembershipRetrieveResponse,
288+
)
285289
```
286290

287291
Methods:
288292

289293
- <code title="post /gitpod.v1.GroupService/CreateMembership">client.groups.memberships.<a href="./src/gitpod/resources/groups/memberships.py">create</a>(\*\*<a href="src/gitpod/types/groups/membership_create_params.py">params</a>) -> <a href="./src/gitpod/types/groups/membership_create_response.py">MembershipCreateResponse</a></code>
294+
- <code title="post /gitpod.v1.GroupService/GetMembership">client.groups.memberships.<a href="./src/gitpod/resources/groups/memberships.py">retrieve</a>(\*\*<a href="src/gitpod/types/groups/membership_retrieve_params.py">params</a>) -> <a href="./src/gitpod/types/groups/membership_retrieve_response.py">MembershipRetrieveResponse</a></code>
290295
- <code title="post /gitpod.v1.GroupService/ListMemberships">client.groups.memberships.<a href="./src/gitpod/resources/groups/memberships.py">list</a>(\*\*<a href="src/gitpod/types/groups/membership_list_params.py">params</a>) -> <a href="./src/gitpod/types/groups/group_membership.py">SyncMembersPage[GroupMembership]</a></code>
291296
- <code title="post /gitpod.v1.GroupService/DeleteMembership">client.groups.memberships.<a href="./src/gitpod/resources/groups/memberships.py">delete</a>(\*\*<a href="src/gitpod/types/groups/membership_delete_params.py">params</a>) -> object</code>
292297

src/gitpod/resources/groups/memberships.py

Lines changed: 145 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,16 @@
1616
)
1717
from ...pagination import SyncMembersPage, AsyncMembersPage
1818
from ..._base_client import AsyncPaginator, make_request_options
19-
from ...types.groups import membership_list_params, membership_create_params, membership_delete_params
19+
from ...types.groups import (
20+
membership_list_params,
21+
membership_create_params,
22+
membership_delete_params,
23+
membership_retrieve_params,
24+
)
2025
from ...types.shared_params.subject import Subject
2126
from ...types.groups.group_membership import GroupMembership
2227
from ...types.groups.membership_create_response import MembershipCreateResponse
28+
from ...types.groups.membership_retrieve_response import MembershipRetrieveResponse
2329

2430
__all__ = ["MembershipsResource", "AsyncMembershipsResource"]
2531

@@ -108,6 +114,69 @@ def create(
108114
cast_to=MembershipCreateResponse,
109115
)
110116

117+
def retrieve(
118+
self,
119+
*,
120+
subject: Subject,
121+
group_id: str | Omit = omit,
122+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
123+
# The extra values given here take precedence over values defined on the client or passed to this method.
124+
extra_headers: Headers | None = None,
125+
extra_query: Query | None = None,
126+
extra_body: Body | None = None,
127+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
128+
) -> MembershipRetrieveResponse:
129+
"""
130+
Gets a specific membership by group ID and subject.
131+
132+
Use this method to:
133+
134+
- Check if a user or service account is a member of a group
135+
- Verify group membership for access control
136+
137+
### Examples
138+
139+
- Check user membership:
140+
141+
Checks if a user is a member of a specific group.
142+
143+
```yaml
144+
groupId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
145+
subject:
146+
id: "f53d2330-3795-4c5d-a1f3-453121af9c60"
147+
principal: PRINCIPAL_USER
148+
```
149+
150+
### Authorization
151+
152+
All organization members can check group membership (transparency model).
153+
154+
Args:
155+
subject: Subject to check membership for
156+
157+
extra_headers: Send extra headers
158+
159+
extra_query: Add additional query parameters to the request
160+
161+
extra_body: Add additional JSON properties to the request
162+
163+
timeout: Override the client-level default timeout for this request, in seconds
164+
"""
165+
return self._post(
166+
"/gitpod.v1.GroupService/GetMembership",
167+
body=maybe_transform(
168+
{
169+
"subject": subject,
170+
"group_id": group_id,
171+
},
172+
membership_retrieve_params.MembershipRetrieveParams,
173+
),
174+
options=make_request_options(
175+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
176+
),
177+
cast_to=MembershipRetrieveResponse,
178+
)
179+
111180
def list(
112181
self,
113182
*,
@@ -323,6 +392,69 @@ async def create(
323392
cast_to=MembershipCreateResponse,
324393
)
325394

395+
async def retrieve(
396+
self,
397+
*,
398+
subject: Subject,
399+
group_id: str | Omit = omit,
400+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
401+
# The extra values given here take precedence over values defined on the client or passed to this method.
402+
extra_headers: Headers | None = None,
403+
extra_query: Query | None = None,
404+
extra_body: Body | None = None,
405+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
406+
) -> MembershipRetrieveResponse:
407+
"""
408+
Gets a specific membership by group ID and subject.
409+
410+
Use this method to:
411+
412+
- Check if a user or service account is a member of a group
413+
- Verify group membership for access control
414+
415+
### Examples
416+
417+
- Check user membership:
418+
419+
Checks if a user is a member of a specific group.
420+
421+
```yaml
422+
groupId: "d2c94c27-3b76-4a42-b88c-95a85e392c68"
423+
subject:
424+
id: "f53d2330-3795-4c5d-a1f3-453121af9c60"
425+
principal: PRINCIPAL_USER
426+
```
427+
428+
### Authorization
429+
430+
All organization members can check group membership (transparency model).
431+
432+
Args:
433+
subject: Subject to check membership for
434+
435+
extra_headers: Send extra headers
436+
437+
extra_query: Add additional query parameters to the request
438+
439+
extra_body: Add additional JSON properties to the request
440+
441+
timeout: Override the client-level default timeout for this request, in seconds
442+
"""
443+
return await self._post(
444+
"/gitpod.v1.GroupService/GetMembership",
445+
body=await async_maybe_transform(
446+
{
447+
"subject": subject,
448+
"group_id": group_id,
449+
},
450+
membership_retrieve_params.MembershipRetrieveParams,
451+
),
452+
options=make_request_options(
453+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
454+
),
455+
cast_to=MembershipRetrieveResponse,
456+
)
457+
326458
def list(
327459
self,
328460
*,
@@ -463,6 +595,9 @@ def __init__(self, memberships: MembershipsResource) -> None:
463595
self.create = to_raw_response_wrapper(
464596
memberships.create,
465597
)
598+
self.retrieve = to_raw_response_wrapper(
599+
memberships.retrieve,
600+
)
466601
self.list = to_raw_response_wrapper(
467602
memberships.list,
468603
)
@@ -478,6 +613,9 @@ def __init__(self, memberships: AsyncMembershipsResource) -> None:
478613
self.create = async_to_raw_response_wrapper(
479614
memberships.create,
480615
)
616+
self.retrieve = async_to_raw_response_wrapper(
617+
memberships.retrieve,
618+
)
481619
self.list = async_to_raw_response_wrapper(
482620
memberships.list,
483621
)
@@ -493,6 +631,9 @@ def __init__(self, memberships: MembershipsResource) -> None:
493631
self.create = to_streamed_response_wrapper(
494632
memberships.create,
495633
)
634+
self.retrieve = to_streamed_response_wrapper(
635+
memberships.retrieve,
636+
)
496637
self.list = to_streamed_response_wrapper(
497638
memberships.list,
498639
)
@@ -508,6 +649,9 @@ def __init__(self, memberships: AsyncMembershipsResource) -> None:
508649
self.create = async_to_streamed_response_wrapper(
509650
memberships.create,
510651
)
652+
self.retrieve = async_to_streamed_response_wrapper(
653+
memberships.retrieve,
654+
)
511655
self.list = async_to_streamed_response_wrapper(
512656
memberships.list,
513657
)

src/gitpod/types/groups/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
from .membership_create_params import MembershipCreateParams as MembershipCreateParams
1010
from .membership_delete_params import MembershipDeleteParams as MembershipDeleteParams
1111
from .membership_create_response import MembershipCreateResponse as MembershipCreateResponse
12+
from .membership_retrieve_params import MembershipRetrieveParams as MembershipRetrieveParams
1213
from .role_assignment_list_params import RoleAssignmentListParams as RoleAssignmentListParams
14+
from .membership_retrieve_response import MembershipRetrieveResponse as MembershipRetrieveResponse
1315
from .role_assignment_create_params import RoleAssignmentCreateParams as RoleAssignmentCreateParams
1416
from .role_assignment_delete_params import RoleAssignmentDeleteParams as RoleAssignmentDeleteParams
1517
from .role_assignment_create_response import RoleAssignmentCreateResponse as RoleAssignmentCreateResponse
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing_extensions import Required, Annotated, TypedDict
6+
7+
from ..._utils import PropertyInfo
8+
from ..shared_params.subject import Subject
9+
10+
__all__ = ["MembershipRetrieveParams"]
11+
12+
13+
class MembershipRetrieveParams(TypedDict, total=False):
14+
subject: Required[Subject]
15+
"""Subject to check membership for"""
16+
17+
group_id: Annotated[str, PropertyInfo(alias="groupId")]
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Optional
4+
5+
from ..._models import BaseModel
6+
from .group_membership import GroupMembership
7+
8+
__all__ = ["MembershipRetrieveResponse"]
9+
10+
11+
class MembershipRetrieveResponse(BaseModel):
12+
member: Optional[GroupMembership] = None
13+
"""The membership if found, nil if subject is not a member"""

src/gitpod/types/organizations/agent_policy.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

3-
from typing import List
3+
from typing import List, Optional
44

55
from pydantic import Field as FieldInfo
66

@@ -29,3 +29,9 @@ class AgentPolicy(BaseModel):
2929
scm_tools_disabled controls whether SCM (Source Control Management) tools are
3030
disabled for agents
3131
"""
32+
33+
scm_tools_allowed_group_id: Optional[str] = FieldInfo(alias="scmToolsAllowedGroupId", default=None)
34+
"""
35+
scm_tools_allowed_group_id restricts SCM tools access to members of this group.
36+
Empty means no restriction (all users can use SCM tools if not disabled).
37+
"""

src/gitpod/types/organizations/policy_update_params.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ class AgentPolicy(TypedDict, total=False):
131131
agents
132132
"""
133133

134+
scm_tools_allowed_group_id: Annotated[Optional[str], PropertyInfo(alias="scmToolsAllowedGroupId")]
135+
"""
136+
scm_tools_allowed_group_id restricts SCM tools access to members of this group.
137+
Empty means no restriction (all users can use SCM tools if not disabled).
138+
"""
139+
134140
scm_tools_disabled: Annotated[Optional[bool], PropertyInfo(alias="scmToolsDisabled")]
135141
"""
136142
scm_tools_disabled controls whether SCM (Source Control Management) tools are

src/gitpod/types/project_list_params.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
from __future__ import annotations
44

5+
from typing import List
56
from typing_extensions import Annotated, TypedDict
67

78
from .._types import SequenceNotStr
89
from .._utils import PropertyInfo
10+
from .runner_kind import RunnerKind
911

1012
__all__ = ["ProjectListParams", "Filter", "Pagination"]
1113

@@ -31,6 +33,12 @@ class Filter(TypedDict, total=False):
3133
from these runners
3234
"""
3335

36+
runner_kinds: Annotated[List[RunnerKind], PropertyInfo(alias="runnerKinds")]
37+
"""
38+
runner_kinds filters the response to only projects that use environment classes
39+
from runners of these kinds
40+
"""
41+
3442
search: str
3543
"""
3644
search performs case-insensitive search across project name, project ID, and

0 commit comments

Comments
 (0)