Skip to content

Commit 6f6d1c1

Browse files
committed
wip
1 parent 4f66a84 commit 6f6d1c1

File tree

8 files changed

+475
-1
lines changed

8 files changed

+475
-1
lines changed

src/ai/backend/manager/actions/action.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,18 @@ def entity_type(self) -> str:
1717
def operation_type(self) -> str:
1818
raise NotImplementedError
1919

20+
21+
class BaseBatchAction(ABC):
2022
@abstractmethod
21-
def request_id(self) -> str:
23+
def entity_ids(self) -> list[str]:
24+
raise NotImplementedError
25+
26+
@abstractmethod
27+
def entity_type(self) -> str:
28+
raise NotImplementedError
29+
30+
@abstractmethod
31+
def operation_type(self) -> str:
2232
raise NotImplementedError
2333

2434

@@ -27,6 +37,24 @@ class BaseActionResult(ABC):
2737
def entity_id(self) -> Optional[str]:
2838
raise NotImplementedError
2939

40+
@abstractmethod
41+
def status(self) -> str:
42+
raise NotImplementedError
43+
44+
@abstractmethod
45+
def description(self) -> Optional[str]:
46+
raise NotImplementedError
47+
48+
49+
class BaseBatchActionResult(ABC):
50+
@abstractmethod
51+
def entity_ids(self) -> list[str]:
52+
raise NotImplementedError
53+
54+
@abstractmethod
55+
def statuses(self) -> dict[str, str]:
56+
raise NotImplementedError
57+
3058

3159
@dataclass
3260
class BaseActionResultMeta:

src/ai/backend/manager/actions/processor.py

+9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import asyncio
2+
from abc import ABC
23
from datetime import datetime
34
from typing import Awaitable, Callable, Generic, Optional
45

56
from .action import (
7+
BaseAction,
68
BaseActionResultMeta,
79
ProcessResult,
810
TAction,
@@ -11,9 +13,16 @@
1113
from .monitors.monitor import ActionMonitor
1214

1315

16+
class ActionValidator(ABC):
17+
async def validate(self, action: BaseAction) -> None:
18+
pass
19+
20+
1421
class ActionProcessor(Generic[TAction, TActionResult]):
1522
_monitors: list[ActionMonitor]
1623
_func: Callable[[TAction], Awaitable[TActionResult]]
24+
validates: list[ActionValidator]
25+
rollback: Callable[[TAction], None]
1726

1827
def __init__(
1928
self,

src/ai/backend/manager/services/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
python_sources()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from ai.backend.manager.services.vfolder.processors import VFolderProcessors
2+
3+
4+
class Processors:
5+
vfolder: VFolderProcessors
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
python_sources()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
import uuid
2+
from typing import Optional
3+
4+
from ai.backend.manager.actions.action import BaseAction, BaseActionResult, BaseBatchAction
5+
6+
7+
class VFolderAction(BaseAction):
8+
def entity_type(self):
9+
return "vfolder"
10+
11+
12+
class VFolderBatchAction(BaseBatchAction):
13+
def entity_type(self):
14+
return "vfolder"
15+
16+
17+
class CreateVFolderAction(VFolderAction):
18+
def entity_id(self):
19+
return None
20+
21+
def operation_type(self):
22+
return "create"
23+
24+
25+
class CreateVFolderActionResult(BaseActionResult):
26+
vfolder_id: uuid.UUID
27+
28+
def entity_id(self) -> Optional[str]:
29+
return str(self.vfolder_id)
30+
31+
32+
class UpdateVFolderAttributeAction(VFolderAction):
33+
pass
34+
35+
36+
class UpdateVFolderAttributeActionResult(BaseActionResult):
37+
pass
38+
39+
40+
class ChangeOwnershipAction(VFolderAction):
41+
pass
42+
43+
44+
class ChangeOwnershipActionResult(BaseActionResult):
45+
pass
46+
47+
48+
class ListVFolderAction(VFolderAction):
49+
pass
50+
51+
52+
class ListVFolderActionResult(BaseActionResult):
53+
pass
54+
55+
56+
class MoveToTrashVFolderAction(VFolderAction):
57+
pass
58+
59+
60+
class MoveToTrashVFolderActionResult(BaseActionResult):
61+
pass
62+
63+
64+
class RestoreVFolderFromTrashAction(VFolderAction):
65+
pass
66+
67+
68+
class RestoreVFolderFromTrashActionResult(BaseActionResult):
69+
pass
70+
71+
72+
class DeleteForeverVFolderAction(VFolderAction):
73+
pass
74+
75+
76+
class DeleteForeverVFolderActionResult(BaseActionResult):
77+
pass
78+
79+
80+
class PurgeVFolderAction(VFolderAction):
81+
"""
82+
This action transits the state of vfolder from ready to delete-forever directly.
83+
"""
84+
85+
86+
class PurgeVFolderActionResult(BaseActionResult):
87+
pass
88+
89+
90+
class CloneVFolderAction(VFolderAction):
91+
pass
92+
93+
94+
class CloneVFolderActionResult(BaseActionResult):
95+
pass
96+
97+
98+
# Invite operations
99+
class InviteVFolderAction(VFolderAction):
100+
pass
101+
102+
103+
class InviteVFolderActionResult(BaseActionResult):
104+
pass
105+
106+
107+
class ReceiveInvitationAction(VFolderAction):
108+
pass
109+
110+
111+
class ReceiveInvitationActionResult(BaseActionResult):
112+
pass
113+
114+
115+
class UpdateInvitationAction(VFolderAction):
116+
pass
117+
118+
119+
class UpdateInvitationActionResult(BaseActionResult):
120+
pass
121+
122+
123+
class ListInvitationAction(VFolderAction):
124+
pass
125+
126+
127+
class ListInvitationActionResult(BaseActionResult):
128+
pass
129+
130+
131+
class LeaveInvitedVFolderAction(VFolderAction):
132+
pass
133+
134+
135+
class LeaveInvitedVFolderActionResult(BaseActionResult):
136+
pass
137+
138+
139+
# File operations
140+
class UploadFileAction(VFolderAction):
141+
pass
142+
143+
144+
class UploadFileActionResult(BaseActionResult):
145+
pass
146+
147+
148+
class DownloadFileAction(VFolderAction):
149+
pass
150+
151+
152+
class DownloadFileActionResult(BaseActionResult):
153+
pass
154+
155+
156+
class ListFilesAction(VFolderAction):
157+
pass
158+
159+
160+
class ListFilesActionResult(BaseActionResult):
161+
pass
162+
163+
164+
class RenameFileAction(VFolderAction):
165+
pass
166+
167+
168+
class RenameFileActionResult(BaseActionResult):
169+
pass
170+
171+
172+
class DeleteFilesAction(VFolderAction):
173+
pass
174+
175+
176+
class DeleteFilesActionResult(BaseActionResult):
177+
pass
178+
179+
180+
class MkdirAction(VFolderAction):
181+
pass
182+
183+
184+
class MkdirActionResult(BaseActionResult):
185+
pass
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from ai.backend.manager.actions.processor import ActionProcessor
2+
3+
from .actions import (
4+
ChangeOwnershipAction,
5+
ChangeOwnershipActionResult,
6+
CloneVFolderAction,
7+
CloneVFolderActionResult,
8+
CreateVFolderAction,
9+
CreateVFolderActionResult,
10+
DeleteFilesAction,
11+
DeleteFilesActionResult,
12+
DeleteForeverVFolderAction,
13+
DeleteForeverVFolderActionResult,
14+
DownloadFileAction,
15+
DownloadFileActionResult,
16+
InviteVFolderAction,
17+
InviteVFolderActionResult,
18+
LeaveInvitedVFolderAction,
19+
LeaveInvitedVFolderActionResult,
20+
ListFilesAction,
21+
ListFilesActionResult,
22+
ListInvitationAction,
23+
ListInvitationActionResult,
24+
ListVFolderAction,
25+
ListVFolderActionResult,
26+
MkdirAction,
27+
MkdirActionResult,
28+
MoveToTrashVFolderAction,
29+
MoveToTrashVFolderActionResult,
30+
PurgeVFolderAction,
31+
PurgeVFolderActionResult,
32+
ReceiveInvitationAction,
33+
ReceiveInvitationActionResult,
34+
RenameFileAction,
35+
RenameFileActionResult,
36+
RestoreVFolderFromTrashAction,
37+
RestoreVFolderFromTrashActionResult,
38+
UpdateInvitationAction,
39+
UpdateInvitationActionResult,
40+
UpdateVFolderAttributeAction,
41+
UpdateVFolderAttributeActionResult,
42+
UploadFileAction,
43+
UploadFileActionResult,
44+
)
45+
from .service import VFolderService
46+
47+
48+
class VFolderProcessors:
49+
create_vfolder = ActionProcessor[CreateVFolderAction, CreateVFolderActionResult]
50+
list_vfolder = ActionProcessor[ListVFolderAction, ListVFolderActionResult]
51+
upload_file = ActionProcessor[UploadFileAction, UploadFileActionResult]
52+
update_vfolder_attribute = ActionProcessor[
53+
UpdateVFolderAttributeAction, UpdateVFolderAttributeActionResult
54+
]
55+
change_ownership = ActionProcessor[ChangeOwnershipAction, ChangeOwnershipActionResult]
56+
move_to_trash_vfolder = ActionProcessor[
57+
MoveToTrashVFolderAction, MoveToTrashVFolderActionResult
58+
]
59+
restore_vfolder_from_trash = ActionProcessor[
60+
RestoreVFolderFromTrashAction, RestoreVFolderFromTrashActionResult
61+
]
62+
delete_forever_vfolder = ActionProcessor[
63+
DeleteForeverVFolderAction, DeleteForeverVFolderActionResult
64+
]
65+
purge_vfolder = ActionProcessor[PurgeVFolderAction, PurgeVFolderActionResult]
66+
clone_vfolder = ActionProcessor[CloneVFolderAction, CloneVFolderActionResult]
67+
68+
# Invite operations
69+
invite_vfolder = ActionProcessor[InviteVFolderAction, InviteVFolderActionResult]
70+
receive_invitation = ActionProcessor[ReceiveInvitationAction, ReceiveInvitationActionResult]
71+
update_invitation = ActionProcessor[UpdateInvitationAction, UpdateInvitationActionResult]
72+
list_invitation = ActionProcessor[ListInvitationAction, ListInvitationActionResult]
73+
leave_invited_vfolder = ActionProcessor[
74+
LeaveInvitedVFolderAction, LeaveInvitedVFolderActionResult
75+
]
76+
77+
# File operations
78+
list_files = ActionProcessor[ListFilesAction, ListFilesActionResult]
79+
download_file = ActionProcessor[DownloadFileAction, DownloadFileActionResult]
80+
mkdir = ActionProcessor[MkdirAction, MkdirActionResult]
81+
rename_file = ActionProcessor[RenameFileAction, RenameFileActionResult]
82+
delete_files = ActionProcessor[DeleteFilesAction, DeleteFilesActionResult]
83+
84+
def __init__(self, service: VFolderService) -> None:
85+
self.create_vfolder = ActionProcessor(service.create)
86+
self.list_vfolder = ActionProcessor(service.list)
87+
self.update_vfolder_attribute = ActionProcessor(service.update_attribute)
88+
self.change_ownership = ActionProcessor(service.change_ownership)
89+
self.move_to_trash_vfolder = ActionProcessor(service.move_to_trash)
90+
self.restore_vfolder_from_trash = ActionProcessor(service.restore)
91+
self.delete_forever_vfolder = ActionProcessor(service.delete_forever)
92+
self.purge_vfolder = ActionProcessor(service.purge)
93+
self.clone_vfolder = ActionProcessor(service.clone)
94+
95+
# Invite
96+
self.invite_vfolder = ActionProcessor(service.invite)
97+
self.receive_invitation = ActionProcessor(service.receive_invitation)
98+
self.update_invitation = ActionProcessor(service.update_invitation)
99+
self.list_invitation = ActionProcessor(service.list_invitation)
100+
self.leave_invited_vfolder = ActionProcessor(service.leave_invited_vfolder)
101+
102+
# File operations
103+
self.list_files = ActionProcessor(service.list_files)
104+
self.download_file = ActionProcessor(service.download_file)
105+
self.upload_file = ActionProcessor(service.upload_file)
106+
self.mkdir = ActionProcessor(service.mkdir)
107+
self.rename_file = ActionProcessor(service.rename_file)
108+
self.delete_files = ActionProcessor(service.delete_files)

0 commit comments

Comments
 (0)