Skip to content

Commit c174665

Browse files
authored
refactor(BA-627): Extract list_volumes and get_volume into pool.py (#3564) (#3569)
1 parent 92c54a1 commit c174665

File tree

3 files changed

+96
-1
lines changed

3 files changed

+96
-1
lines changed

changes/3569.enhance.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Extract list_volumes and get_volume into pool.py

src/ai/backend/common/api_handlers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ def from_request(cls, request: web.Request) -> Self:
303303
return cls(user_id=user_id)
304304
305305
@api_handler
306-
async def handler(auth: AuthMiddlewareParam): # No generic, so no need to call 'parsed'
306+
async def handler(auth: AuthMiddlewareParam): # No generic, so no need to call 'parsed'
307307
return APIResponse(status_code=200, response_model=YourResponseModel(author_name=auth.name))
308308
309309
6. Multiple Parameters:
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from __future__ import annotations
2+
3+
from contextlib import asynccontextmanager as actxmgr
4+
from pathlib import Path
5+
from typing import Any, AsyncIterator, Mapping, Type
6+
7+
from ai.backend.common.etcd import AsyncEtcd
8+
from ai.backend.common.events import EventDispatcher, EventProducer
9+
from ai.backend.storage.volumes.cephfs import CephFSVolume
10+
from ai.backend.storage.volumes.ddn import EXAScalerFSVolume
11+
from ai.backend.storage.volumes.dellemc import DellEMCOneFSVolume
12+
from ai.backend.storage.volumes.gpfs import GPFSVolume
13+
from ai.backend.storage.volumes.netapp import NetAppVolume
14+
from ai.backend.storage.volumes.purestorage import FlashBladeVolume
15+
from ai.backend.storage.volumes.vast import VASTVolume
16+
from ai.backend.storage.volumes.vfs import BaseVolume
17+
from ai.backend.storage.volumes.weka import WekaVolume
18+
from ai.backend.storage.volumes.xfs import XfsVolume
19+
20+
from ..exception import InvalidVolumeError
21+
from ..types import VolumeInfo
22+
from .abc import AbstractVolume
23+
24+
DEFAULT_BACKENDS: Mapping[str, Type[AbstractVolume]] = {
25+
FlashBladeVolume.name: FlashBladeVolume,
26+
BaseVolume.name: BaseVolume,
27+
XfsVolume.name: XfsVolume,
28+
NetAppVolume.name: NetAppVolume,
29+
# NOTE: Dell EMC has two different storage: PowerStore and PowerScale (OneFS).
30+
# We support the latter only for now.
31+
DellEMCOneFSVolume.name: DellEMCOneFSVolume,
32+
WekaVolume.name: WekaVolume,
33+
GPFSVolume.name: GPFSVolume, # IBM SpectrumScale or GPFS
34+
"spectrumscale": GPFSVolume, # IBM SpectrumScale or GPFS
35+
CephFSVolume.name: CephFSVolume,
36+
VASTVolume.name: VASTVolume,
37+
EXAScalerFSVolume.name: EXAScalerFSVolume,
38+
}
39+
40+
41+
class VolumePool:
42+
_volumes: dict[str, AbstractVolume]
43+
_local_config: Mapping[str, Any]
44+
_etcd: AsyncEtcd
45+
_event_dispatcher: EventDispatcher
46+
_event_producer: EventProducer
47+
_backends: dict[str, Type[AbstractVolume]]
48+
49+
def __init__(
50+
self,
51+
local_config: Mapping[str, Any],
52+
etcd: AsyncEtcd,
53+
event_dispatcher: EventDispatcher,
54+
event_producer: EventProducer,
55+
):
56+
self._volumes = {}
57+
self._local_config = local_config
58+
self._etcd = etcd
59+
self._event_dispatcher = event_dispatcher
60+
self._event_producer = event_producer
61+
62+
async def __aenter__(self) -> None:
63+
self._backends = {**DEFAULT_BACKENDS}
64+
65+
def list_volumes(self) -> Mapping[str, VolumeInfo]:
66+
return {
67+
volume_id: VolumeInfo(**info)
68+
for volume_id, info in self._local_config["volume"].items()
69+
}
70+
71+
@actxmgr
72+
async def get_volume(self, volume_id: str) -> AsyncIterator[AbstractVolume]:
73+
if volume_id in self._volumes:
74+
yield self._volumes[volume_id]
75+
else:
76+
try:
77+
volume_config = self._local_config["volume"][volume_id]
78+
except KeyError:
79+
raise InvalidVolumeError(volume_id)
80+
81+
volume_cls: Type[AbstractVolume] = self._backends[volume_config["backend"]]
82+
volume_obj = volume_cls(
83+
local_config=self._local_config,
84+
mount_path=Path(volume_config["path"]),
85+
etcd=self._etcd,
86+
event_dispatcher=self._event_dispatcher,
87+
event_producer=self._event_producer,
88+
options=volume_config["options"] or {},
89+
)
90+
91+
await volume_obj.init()
92+
self._volumes[volume_id] = volume_obj
93+
94+
yield volume_obj

0 commit comments

Comments
 (0)