Skip to content

Commit 747c603

Browse files
fregataaclaudelablup-octodog
authored
feat(BA-5299): Add SessionV2GQL to EntityNode union and resolve SESSION in RBAC entity resolvers (#10320)
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> Co-authored-by: octodog <mu001@lablup.com>
1 parent 5f1d1f6 commit 747c603

6 files changed

Lines changed: 26 additions & 7 deletions

File tree

changes/10320.feature.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Support resolving session entities in RBAC entity and permission scope queries

docs/manager/graphql-reference/supergraph.graphql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4639,6 +4639,7 @@ union EntityNode
46394639
@join__unionMember(graph: STRAWBERRY, member: "VirtualFolderNode")
46404640
@join__unionMember(graph: STRAWBERRY, member: "ImageV2")
46414641
@join__unionMember(graph: STRAWBERRY, member: "ComputeSessionNode")
4642+
@join__unionMember(graph: STRAWBERRY, member: "SessionV2")
46424643
@join__unionMember(graph: STRAWBERRY, member: "Artifact")
46434644
@join__unionMember(graph: STRAWBERRY, member: "ArtifactRegistry")
46444645
@join__unionMember(graph: STRAWBERRY, member: "AppConfig")
@@ -4649,7 +4650,7 @@ union EntityNode
46494650
@join__unionMember(graph: STRAWBERRY, member: "ContainerRegistryV2")
46504651
@join__unionMember(graph: STRAWBERRY, member: "ArtifactRevision")
46514652
@join__unionMember(graph: STRAWBERRY, member: "Role")
4652-
= UserV2 | ProjectV2 | DomainV2 | VirtualFolderNode | ImageV2 | ComputeSessionNode | Artifact | ArtifactRegistry | AppConfig | NotificationChannel | NotificationRule | ModelDeployment | ResourceGroup | ContainerRegistryV2 | ArtifactRevision | Role
4653+
= UserV2 | ProjectV2 | DomainV2 | VirtualFolderNode | ImageV2 | ComputeSessionNode | SessionV2 | Artifact | ArtifactRegistry | AppConfig | NotificationChannel | NotificationRule | ModelDeployment | ResourceGroup | ContainerRegistryV2 | ArtifactRevision | Role
46534654

46544655
"""Added in 26.3.0. Order by specification for entity associations"""
46554656
input EntityOrderBy

docs/manager/graphql-reference/v2-schema.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2677,7 +2677,7 @@ input EntityFilter {
26772677
NOT: [EntityFilter!] = null
26782678
}
26792679

2680-
union EntityNode = UserV2 | ProjectV2 | DomainV2 | VirtualFolderNode | ImageV2 | ComputeSessionNode | Artifact | ArtifactRegistry | AppConfig | NotificationChannel | NotificationRule | ModelDeployment | ResourceGroup | ContainerRegistryV2 | ArtifactRevision | Role
2680+
union EntityNode = UserV2 | ProjectV2 | DomainV2 | VirtualFolderNode | ImageV2 | ComputeSessionNode | SessionV2 | Artifact | ArtifactRegistry | AppConfig | NotificationChannel | NotificationRule | ModelDeployment | ResourceGroup | ContainerRegistryV2 | ArtifactRevision | Role
26812681

26822682
"""Added in 26.3.0. Order by specification for entity associations"""
26832683
input EntityOrderBy {

src/ai/backend/manager/api/gql/rbac/types/entity.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ async def entity(
6363
*,
6464
info: Info[StrawberryGQLContext],
6565
) -> EntityNode | None:
66-
from ai.backend.common.types import ImageID
66+
from ai.backend.common.types import ImageID, SessionId
6767
from ai.backend.manager.api.gql.artifact.types import ArtifactRevision
6868
from ai.backend.manager.api.gql.container_registry.types import ContainerRegistryGQL
6969
from ai.backend.manager.api.gql.deployment.types.deployment import ModelDeployment
@@ -76,6 +76,7 @@ async def entity(
7676
from ai.backend.manager.api.gql.project_v2.types.node import ProjectV2GQL
7777
from ai.backend.manager.api.gql.rbac.types.role import RoleGQL
7878
from ai.backend.manager.api.gql.resource_group.types import ResourceGroupGQL
79+
from ai.backend.manager.api.gql.session.types import SessionV2GQL
7980
from ai.backend.manager.api.gql.user.types.node import UserV2GQL
8081

8182
element_type = self.entity_type.to_element()
@@ -146,9 +147,15 @@ async def entity(
146147
if cr_data is None:
147148
return None
148149
return ContainerRegistryGQL.from_data(cr_data)
150+
case RBACElementType.SESSION:
151+
session_data = await data_loaders.session_loader.load(
152+
SessionId(uuid.UUID(self.entity_id))
153+
)
154+
if session_data is None:
155+
return None
156+
return SessionV2GQL.from_data(session_data)
149157
case (
150-
RBACElementType.SESSION
151-
| RBACElementType.VFOLDER
158+
RBACElementType.VFOLDER
152159
| RBACElementType.KEYPAIR
153160
| RBACElementType.NETWORK
154161
| RBACElementType.STORAGE_HOST

src/ai/backend/manager/api/gql/rbac/types/entity_node.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from ai.backend.manager.api.gql.project_v2.types.node import ProjectV2GQL
2525
from ai.backend.manager.api.gql.rbac.types.role import RoleGQL
2626
from ai.backend.manager.api.gql.resource_group.types import ResourceGroupGQL
27+
from ai.backend.manager.api.gql.session.types import SessionV2GQL
2728
from ai.backend.manager.api.gql.session_federation import Session
2829
from ai.backend.manager.api.gql.user.types.node import UserV2GQL
2930
from ai.backend.manager.api.gql.vfolder import VFolder
@@ -39,6 +40,7 @@
3940
| VFolder
4041
| ImageV2GQL
4142
| Session
43+
| SessionV2GQL
4244
| Artifact
4345
| ArtifactRegistry
4446
| AppConfig

src/ai/backend/manager/api/gql/rbac/types/permission.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
OperationType,
1616
RBACElementType,
1717
)
18+
from ai.backend.common.types import SessionId
1819
from ai.backend.manager.api.gql.base import OrderDirection
1920
from ai.backend.manager.api.gql.rbac.types.entity_node import EntityNode
2021
from ai.backend.manager.api.gql.types import GQLFilter, GQLOrderBy, StrawberryGQLContext
@@ -194,6 +195,7 @@ async def scope(
194195
from ai.backend.manager.api.gql.project_v2.types.node import ProjectV2GQL
195196
from ai.backend.manager.api.gql.rbac.types.role import RoleGQL
196197
from ai.backend.manager.api.gql.resource_group.types import ResourceGroupGQL
198+
from ai.backend.manager.api.gql.session.types import SessionV2GQL
197199
from ai.backend.manager.api.gql.user.types.node import UserV2GQL
198200

199201
element_type = self.scope_type.to_element()
@@ -243,9 +245,15 @@ async def scope(
243245
if cr_data is None:
244246
return None
245247
return ContainerRegistryGQL.from_data(cr_data)
248+
case RBACElementType.SESSION:
249+
session_data = await data_loaders.session_loader.load(
250+
SessionId(uuid.UUID(self.scope_id))
251+
)
252+
if session_data is None:
253+
return None
254+
return SessionV2GQL.from_data(session_data)
246255
case (
247-
RBACElementType.SESSION
248-
| RBACElementType.VFOLDER
256+
RBACElementType.VFOLDER
249257
| RBACElementType.KEYPAIR
250258
| RBACElementType.NOTIFICATION_CHANNEL
251259
| RBACElementType.NETWORK

0 commit comments

Comments
 (0)