Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/7868.enhance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Consolidate `AdminSessionRepository` into `SessionRepository` in the session domain to eliminate code duplication
76 changes: 0 additions & 76 deletions src/ai/backend/manager/repositories/session/admin_repository.py

This file was deleted.

4 changes: 0 additions & 4 deletions src/ai/backend/manager/repositories/session/repositories.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
from dataclasses import dataclass
from typing import Self

from ai.backend.manager.repositories.session.admin_repository import AdminSessionRepository
from ai.backend.manager.repositories.session.repository import SessionRepository
from ai.backend.manager.repositories.types import RepositoryArgs


@dataclass
class SessionRepositories:
repository: SessionRepository
admin_repository: AdminSessionRepository

@classmethod
def create(cls, args: RepositoryArgs) -> Self:
repository = SessionRepository(args.db)
admin_repository = AdminSessionRepository(args.db)

return cls(
repository=repository,
admin_repository=admin_repository,
)
1 change: 0 additions & 1 deletion src/ai/backend/manager/services/processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,6 @@ def create(cls, args: ServiceArgs) -> Self:
error_monitor=args.error_monitor,
idle_checker_host=args.idle_checker_host,
session_repository=repositories.session.repository,
admin_session_repository=repositories.session.admin_repository,
scheduling_controller=args.scheduling_controller,
)
)
Expand Down
5 changes: 2 additions & 3 deletions src/ai/backend/manager/services/session/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ The Session Service provides comprehensive session management capabilities inclu

- **SessionService**: Main service class that orchestrates all session operations
- **SessionProcessors**: Handles action processing and monitoring with 25+ specialized processors
- **SessionRepository & AdminSessionRepository**: Data access layer with repository pattern
- **SessionRepository**: Data access layer with repository pattern
- **Action Classes**: Structured actions for each session operation type
- **Base Classes**: Common abstractions for session and batch actions

Expand Down Expand Up @@ -211,8 +211,7 @@ for entry in result.status_history["history"]:
- **Resource Monitoring**: Collect resource usage statistics from agents

### Database Integration
- **SessionRepository**: Standard session operations with validation
- **AdminSessionRepository**: Administrative operations with elevated permissions
- **SessionRepository**: Data access layer with repository pattern
- **Database Schema**: PostgreSQL with SQLAlchemy ORM for session metadata
- **Transaction Management**: Atomic operations with rollback support

Expand Down
21 changes: 8 additions & 13 deletions src/ai/backend/manager/services/session/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@
)
from ai.backend.manager.models.user import UserRole
from ai.backend.manager.registry import AgentRegistry
from ai.backend.manager.repositories.session.admin_repository import AdminSessionRepository
from ai.backend.manager.repositories.session.repository import SessionRepository
from ai.backend.manager.repositories.session.updaters import SessionUpdaterSpec
from ai.backend.manager.services.session.actions.check_and_transit_status import (
Expand Down Expand Up @@ -202,7 +201,6 @@ class SessionServiceArgs:
error_monitor: ErrorPluginContext
idle_checker_host: IdleCheckerHost
session_repository: SessionRepository
admin_session_repository: AdminSessionRepository
scheduling_controller: SchedulingController


Expand All @@ -214,7 +212,6 @@ class SessionService:
_error_monitor: ErrorPluginContext
_idle_checker_host: IdleCheckerHost
_session_repository: SessionRepository
_admin_session_repository: AdminSessionRepository
_scheduling_controller: SchedulingController
_database_ptask_group: aiotools.PersistentTaskGroup
_rpc_ptask_group: aiotools.PersistentTaskGroup
Expand All @@ -230,7 +227,6 @@ def __init__(
self._error_monitor = args.error_monitor
self._idle_checker_host = args.idle_checker_host
self._session_repository = args.session_repository
self._admin_session_repository = args.admin_session_repository
self._scheduling_controller = args.scheduling_controller
self._database_ptask_group = aiotools.PersistentTaskGroup()
self._rpc_ptask_group = aiotools.PersistentTaskGroup()
Expand Down Expand Up @@ -1417,17 +1413,16 @@ async def check_and_transit_status(
user_role = action.user_role
session_id = action.session_id

if user_role in (UserRole.ADMIN, UserRole.SUPERADMIN):
session_row = (
await self._admin_session_repository.get_session_to_determine_status_force(
session_id
)
)
else:
session_row = await self._session_repository.get_session_to_determine_status(session_id)
# Fetch session by ID without ownership check
session_row = await self._session_repository.get_session_by_id(session_id)
if session_row is None:
raise SessionNotFound(f"Session not found (id:{session_id})")

# Regular users can only transit their own sessions
if user_role not in (UserRole.ADMIN, UserRole.SUPERADMIN):
if session_row.user_uuid != user_id:
log.warning(
f"You are not allowed to transit others's sessions status, skip (s:{session_id})"
f"You are not allowed to transit other user's session status, skip (s:{session_id})"
)
return CheckAndTransitStatusActionResult(
result={}, session_data=session_row.to_dataclass()
Expand Down
Loading
Loading