Skip to content

Commit 03c62c5

Browse files
fregataaclaude
andcommitted
refactor(BA-5040): Remove RBAC validator from GetAllImagesAction
Revert GetAllImagesAction to plain ImageAction without scope metadata. Remove ImageScopeAction/ImageScopeActionResult base classes and ScopeActionProcessor usage from Image processors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 618a231 commit 03c62c5

5 files changed

Lines changed: 14 additions & 53 deletions

File tree

src/ai/backend/manager/api/gql_legacy/image.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,7 @@ async def load_all(
308308
if types is None:
309309
types = set()
310310
result = await ctx.processors.image.get_all_images.wait_for_complete(
311-
GetAllImagesAction(
312-
status_filter=filter_by_statuses,
313-
user_uuid=str(ctx.user["uuid"]),
314-
)
311+
GetAllImagesAction(status_filter=filter_by_statuses)
315312
)
316313
all_items = [cls.from_image_with_agent_install_status(img) for img in result.data.values()]
317314
return [item for item in all_items if item.matches_filter(ctx, types)]

src/ai/backend/manager/services/image/actions/base.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from ai.backend.common.data.permission.types import EntityType
55
from ai.backend.manager.actions.action import BaseAction, BaseBatchAction
6-
from ai.backend.manager.actions.action.scope import BaseScopeAction, BaseScopeActionResult
76
from ai.backend.manager.actions.action.single_entity import (
87
BaseSingleEntityAction,
98
BaseSingleEntityActionResult,
@@ -27,18 +26,6 @@ def entity_type(cls) -> EntityType:
2726
return EntityType.IMAGE
2827

2928

30-
@dataclass
31-
class ImageScopeAction(BaseScopeAction):
32-
@override
33-
@classmethod
34-
def entity_type(cls) -> EntityType:
35-
return EntityType.IMAGE
36-
37-
38-
class ImageScopeActionResult(BaseScopeActionResult):
39-
pass
40-
41-
4229
@dataclass
4330
class ImageSingleEntityAction(BaseSingleEntityAction):
4431
@override

src/ai/backend/manager/services/image/actions/get_all_images.py

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@
22
from dataclasses import dataclass
33
from typing import override
44

5-
from ai.backend.common.data.permission.types import RBACElementType, ScopeType
65
from ai.backend.common.types import ImageID
6+
from ai.backend.manager.actions.action import BaseActionResult
77
from ai.backend.manager.actions.types import ActionOperationType
88
from ai.backend.manager.data.image.types import (
99
ImageStatus,
1010
ImageWithAgentInstallStatus,
1111
)
12-
from ai.backend.manager.data.permission.types import RBACElementRef
13-
from ai.backend.manager.services.image.actions.base import ImageScopeAction, ImageScopeActionResult
12+
from ai.backend.manager.services.image.actions.base import ImageAction
1413

1514

1615
@dataclass
17-
class GetAllImagesAction(ImageScopeAction):
16+
class GetAllImagesAction(ImageAction):
1817
"""
1918
Action to retrieve all images, optionally filtered by their status.
2019
Args:
@@ -23,36 +22,21 @@ class GetAllImagesAction(ImageScopeAction):
2322
"""
2423

2524
status_filter: list[ImageStatus] | None
26-
user_uuid: str
25+
26+
@override
27+
def entity_id(self) -> str | None:
28+
return None
2729

2830
@override
2931
@classmethod
3032
def operation_type(cls) -> ActionOperationType:
3133
return ActionOperationType.SEARCH
3234

33-
@override
34-
def scope_type(self) -> ScopeType:
35-
# Images are scoped to the user
36-
return ScopeType.USER
37-
38-
@override
39-
def scope_id(self) -> str:
40-
return self.user_uuid
41-
42-
@override
43-
def target_element(self) -> RBACElementRef:
44-
return RBACElementRef(RBACElementType.USER, self.user_uuid)
45-
4635

4736
@dataclass
48-
class GetAllImagesActionResult(ImageScopeActionResult):
37+
class GetAllImagesActionResult(BaseActionResult):
4938
data: Mapping[ImageID, ImageWithAgentInstallStatus]
50-
user_uuid: str = ""
51-
52-
@override
53-
def scope_type(self) -> ScopeType:
54-
return ScopeType.USER
5539

5640
@override
57-
def scope_id(self) -> str:
58-
return self.user_uuid
41+
def entity_id(self) -> str | None:
42+
return None

src/ai/backend/manager/services/image/processors.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from ai.backend.manager.actions.monitors.monitor import ActionMonitor
44
from ai.backend.manager.actions.processor import ActionProcessor
5-
from ai.backend.manager.actions.processor.scope import ScopeActionProcessor
65
from ai.backend.manager.actions.processor.single_entity import SingleEntityActionProcessor
76
from ai.backend.manager.actions.types import AbstractProcessorPackage, ActionSpec
87
from ai.backend.manager.actions.validators import ActionValidators
@@ -131,7 +130,7 @@ class ImageProcessors(AbstractProcessorPackage):
131130
get_image_installed_agents: ActionProcessor[
132131
GetImageInstalledAgentsAction, GetImageInstalledAgentsActionResult
133132
]
134-
get_all_images: ScopeActionProcessor[GetAllImagesAction, GetAllImagesActionResult]
133+
get_all_images: ActionProcessor[GetAllImagesAction, GetAllImagesActionResult]
135134
search_images: ActionProcessor[SearchImagesAction, SearchImagesActionResult]
136135
search_aliases: ActionProcessor[SearchAliasesAction, SearchAliasesActionResult]
137136
load_image_last_used: ActionProcessor[LoadImageLastUsedAction, LoadImageLastUsedActionResult]
@@ -155,10 +154,7 @@ def __init__(
155154
self.get_image_by_id = ActionProcessor(service.get_image_by_id, action_monitors)
156155
self.forget_image = ActionProcessor(service.forget_image, action_monitors)
157156

158-
# Scope actions with RBAC validation
159-
self.get_all_images = ScopeActionProcessor(
160-
service.get_all_images, action_monitors, validators=[validators.rbac.scope]
161-
)
157+
self.get_all_images = ActionProcessor(service.get_all_images, action_monitors)
162158
self.search_images = ActionProcessor(service.search_images, action_monitors)
163159

164160
# Single entity actions with RBAC validation

src/ai/backend/manager/services/image/service.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,7 @@ async def get_image_installed_agents(
183183

184184
async def get_all_images(self, action: GetAllImagesAction) -> GetAllImagesActionResult:
185185
images = await self._image_repository.get_all_images(status_filter=action.status_filter)
186-
return GetAllImagesActionResult(
187-
data=images,
188-
user_uuid=action.user_uuid,
189-
)
186+
return GetAllImagesActionResult(data=images)
190187

191188
async def get_image_by_id(self, action: GetImageByIdAction) -> GetImageByIdActionResult:
192189
user = current_user()

0 commit comments

Comments
 (0)