Skip to content

Commit 26bb6ea

Browse files
committed
breaking(BA-5650-H): drop owner_access_key from REST v1 session API
REST v1 session endpoints no longer accept owner_access_key. The delegation field is replaced with owner_id (user UUID) and is honored only on the three session-creation endpoints (create_from_template / create_from_params / create_cluster). Read and control endpoints always act as the authenticated caller. - common/dto/manager/session/request.py: drop the owner_access_key field from Create/Destroy/Restart/GetContainerLogs/GetStatusHistory request DTOs; add owner_id to the three creation DTOs. - api/rest/session/handler.py: remove all 26 resolve_access_key_scope calls, drop the AuthProcessors dependency, and renumber log format placeholders that dropped the owner argument. - api/rest/v2/session/handler.py: drop the redundant user_ctx / access_key arguments from shutdown_service / get_logs / update. - api/adapters/session.py: update adapter call sites accordingly. - api/rest/tree.py: drop the auth= argument from SessionHandler(). Test updates for the corresponding DTO assertions and component fixtures are included.
1 parent 4303676 commit 26bb6ea

10 files changed

Lines changed: 70 additions & 364 deletions

File tree

changes/BA-5650-H.breaking.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
**Breaking**: Remove `owner_access_key` query parameter from REST v1 session endpoints. Delegation is now performed via `owner_id` (user UUID) and only on the session creation endpoints (`/session/_/create-from-template`, `/session/_/create`, `/session/_/create-cluster`). Read/control endpoints always act as the authenticated caller. Clients that previously passed `owner_access_key=<AK>` must migrate to `owner_id=<user-uuid>`.

src/ai/backend/common/dto/manager/session/request.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ class CreateFromTemplateRequest(BaseRequestModel):
135135
default=None,
136136
validation_alias=AliasChoices("callback_url", "callbackUrl", "callbackURL"),
137137
)
138-
owner_access_key: str | None = None
138+
owner_id: UUID | None = None
139139

140140

141141
class CreateFromParamsRequest(BaseRequestModel):
@@ -214,7 +214,7 @@ class CreateFromParamsRequest(BaseRequestModel):
214214
default=None,
215215
validation_alias=AliasChoices("callback_url", "callbackUrl", "callbackURL"),
216216
)
217-
owner_access_key: str | None = None
217+
owner_id: UUID | None = None
218218

219219

220220
class CreateClusterRequest(BaseRequestModel):
@@ -252,7 +252,7 @@ class CreateClusterRequest(BaseRequestModel):
252252
ge=0,
253253
validation_alias=AliasChoices("max_wait_seconds", "maxWaitSeconds"),
254254
)
255-
owner_access_key: str | None = None
255+
owner_id: UUID | None = None
256256

257257

258258
# ---------------------------------------------------------------------------
@@ -352,14 +352,11 @@ class DestroySessionRequest(BaseRequestModel):
352352

353353
forced: bool = False
354354
recursive: bool = False
355-
owner_access_key: str | None = None
356355

357356

358357
class RestartSessionRequest(BaseRequestModel):
359358
"""PATCH ``/{session_name}``"""
360359

361-
owner_access_key: str | None = None
362-
363360

364361
class MatchSessionsRequest(BaseRequestModel):
365362
"""GET ``/_/match``"""
@@ -419,10 +416,6 @@ class ListFilesRequest(BaseRequestModel):
419416
class GetContainerLogsRequest(BaseRequestModel):
420417
"""GET ``/{session_name}/logs``"""
421418

422-
owner_access_key: str | None = Field(
423-
default=None,
424-
validation_alias=AliasChoices("owner_access_key", "ownerAccessKey"),
425-
)
426419
kernel_id: UUID | None = Field(
427420
default=None,
428421
validation_alias=AliasChoices("kernel_id", "kernelId"),
@@ -441,5 +434,3 @@ class GetTaskLogsRequest(BaseRequestModel):
441434

442435
class GetStatusHistoryRequest(BaseRequestModel):
443436
"""GET ``/{session_name}/status-history``"""
444-
445-
owner_access_key: str | None = None

src/ai/backend/manager/api/adapters/session.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ async def enqueue(
223223
224224
When ``input.owner_id`` is set, the session is created on behalf of the
225225
target user: their main access key, role, and domain are used in place
226-
of the caller's. Resolution and authorization of the delegated user
227-
are handled by the downstream session service, not by this adapter.
226+
of the caller's. The target user must be loadable via the user
227+
processor (RBAC enforced).
228228
"""
229229
batch_spec: SessionBatchSpec | None = None
230230
if input.batch is not None:
@@ -849,12 +849,10 @@ async def shutdown_service(
849849
self,
850850
session_id: UUID,
851851
input: ShutdownSessionServiceInput,
852-
access_key: str,
853852
) -> None:
854853
"""Shut down a service in a session."""
855854
action = ShutdownServiceAction(
856855
session_name=str(session_id),
857-
owner_access_key=AccessKey(access_key),
858856
service_name=input.service,
859857
)
860858
await self._processors.session.shutdown_service.wait_for_complete(action)
@@ -866,13 +864,11 @@ async def shutdown_service(
866864
async def get_logs(
867865
self,
868866
session_id: UUID,
869-
access_key: str,
870867
kernel_id: UUID | None = None,
871868
) -> SessionLogsPayload:
872869
"""Get container logs for a session."""
873870
action = GetContainerLogsAction(
874871
session_name=str(session_id),
875-
owner_access_key=AccessKey(access_key),
876872
kernel_id=KernelId(kernel_id) if kernel_id else None,
877873
)
878874
result = await self._processors.session.get_container_logs.wait_for_complete(action)
@@ -887,14 +883,12 @@ async def update(
887883
self,
888884
session_id: UUID,
889885
input: UpdateSessionInput,
890-
access_key: str,
891886
) -> UpdateSessionPayload:
892887
"""Update session fields (currently supports rename only)."""
893888
if input.name is not None:
894889
action = RenameSessionAction(
895890
session_name=str(session_id),
896891
new_name=input.name,
897-
owner_access_key=AccessKey(access_key),
898892
)
899893
result = await self._processors.session.rename_session.wait_for_complete(action)
900894
return UpdateSessionPayload(session=self._session_data_to_node(result.session_data))
@@ -933,13 +927,13 @@ def _session_data_to_node(data: SessionData) -> SessionNode:
933927
return SessionNode(
934928
id=data.id,
935929
domain_name=data.domain_name,
936-
user_id=data.user_uuid,
930+
user_id=data.owner_id,
937931
project_id=data.group_id,
938932
metadata=SessionMetadataInfoGQLDTO(
939933
creation_id=data.creation_id or "",
940934
name=data.name or "",
941935
session_type=data.session_type.value,
942-
access_key=str(data.access_key) if data.access_key else "",
936+
access_key=data.owner.main_access_key if data.owner else None,
943937
cluster_mode=data.cluster_mode.name,
944938
cluster_size=data.cluster_size,
945939
priority=data.priority,
@@ -1011,8 +1005,8 @@ def _kernel_info_to_node(info: KernelInfo) -> KernelNode:
10111005
session_type=info.session.session_type.value,
10121006
),
10131007
user_info=KernelUserInfoGQLDTO(
1014-
user_id=info.user_permission.user_uuid,
1015-
access_key=info.user_permission.access_key,
1008+
user_id=info.user_permission.owner_id,
1009+
access_key=info.user_permission.main_access_key,
10161010
domain_name=info.user_permission.domain_name,
10171011
group_id=info.user_permission.group_id,
10181012
),

0 commit comments

Comments
 (0)