Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(BA-626): Move abc.py and storage system modules to volumes package (#3563) #3567

Open
wants to merge 7 commits into
base: refactor/apply-decorator
Choose a base branch
from
Open
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/3567.enhance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Move abc.py and storage system modules to volumes package
5 changes: 3 additions & 2 deletions src/ai/backend/storage/api/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@
from ..utils import CheckParamSource, check_params

if TYPE_CHECKING:
from ..abc import AbstractVolume
from ..context import RootContext
from ..volumes.abc import AbstractVolume

log = BraceStyleAdapter(logging.getLogger(__spec__.name))

Expand Down Expand Up @@ -446,7 +446,8 @@ async def init_client_app(ctx: RootContext) -> web.Application:
r.add_route("GET", check_status)
r = cors.add(app.router.add_resource("/download"))
r.add_route("GET", download)
r = app.router.add_resource("/upload") # tus handlers handle CORS by themselves
# tus handlers handle CORS by themselves
r = app.router.add_resource("/upload")
r.add_route("OPTIONS", tus_options)
r.add_route("HEAD", tus_check_session)
r.add_route("PATCH", tus_upload_part)
Expand Down
5 changes: 3 additions & 2 deletions src/ai/backend/storage/api/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@
from ..utils import check_params, log_manager_api_entry

if TYPE_CHECKING:
from ..abc import AbstractVolume
from ..context import RootContext
from ..volumes.abc import AbstractVolume

log = BraceStyleAdapter(logging.getLogger(__spec__.name))

Expand Down Expand Up @@ -958,7 +958,8 @@ class Params(TypedDict):
t.Key("vfid"): tx.VFolderID(),
t.Key("relpath"): tx.PurePath(relative_only=True),
t.Key("new_name"): t.String(),
t.Key("is_dir", default=False): t.ToBool, # ignored since 22.03
# ignored since 22.03
t.Key("is_dir", default=False): t.ToBool,
},
),
),
Expand Down
22 changes: 11 additions & 11 deletions src/ai/backend/storage/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,28 +24,28 @@
from ai.backend.common.metrics.metric import CommonMetricRegistry
from ai.backend.logging import BraceStyleAdapter

from .abc import AbstractVolume
from .api.client import init_client_app
from .api.manager import init_manager_app
from .cephfs import CephFSVolume
from .ddn import EXAScalerFSVolume
from .dellemc import DellEMCOneFSVolume
from .exception import InvalidVolumeError
from .gpfs import GPFSVolume
from .netapp import NetAppVolume
from .plugin import (
BasePluginContext,
StorageClientWebappPluginContext,
StorageManagerWebappPluginContext,
StoragePluginContext,
)
from .purestorage import FlashBladeVolume
from .types import VolumeInfo
from .vast import VASTVolume
from .vfs import BaseVolume
from .volumes.abc import AbstractVolume
from .volumes.cephfs import CephFSVolume
from .volumes.ddn import EXAScalerFSVolume
from .volumes.dellemc import DellEMCOneFSVolume
from .volumes.gpfs import GPFSVolume
from .volumes.netapp import NetAppVolume
from .volumes.purestorage import FlashBladeVolume
from .volumes.vast import VASTVolume
from .volumes.vfs import BaseVolume
from .volumes.weka import WekaVolume
from .volumes.xfs import XfsVolume
from .watcher import WatcherClient
from .weka import WekaVolume
from .xfs import XfsVolume

log = BraceStyleAdapter(logging.getLogger(__spec__.name))

Expand Down
2 changes: 1 addition & 1 deletion src/ai/backend/storage/migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@
)
from ai.backend.logging import BraceStyleAdapter, LocalLogger

from .abc import CAP_FAST_SIZE, AbstractVolume
from .config import load_local_config, load_shared_config
from .context import EVENT_DISPATCHER_CONSUMER_GROUP, RootContext
from .types import VFolderID
from .volumes.abc import CAP_FAST_SIZE, AbstractVolume

log = BraceStyleAdapter(logging.getLogger(__spec__.name))

Expand Down
2 changes: 1 addition & 1 deletion src/ai/backend/storage/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from aiohttp import web

from ai.backend.common.plugin import AbstractPlugin, BasePluginContext
from ai.backend.storage.abc import AbstractVolume
from ai.backend.storage.api.types import CORSOptions, WebMiddleware
from ai.backend.storage.volumes.abc import AbstractVolume


class AbstractStoragePlugin(AbstractPlugin, metaclass=ABCMeta):
Expand Down
1 change: 1 addition & 0 deletions src/ai/backend/storage/volumes/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
python_sources(name="src")
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
from ai.backend.common.types import BinarySize, HardwareMetadata, QuotaScopeID
from ai.backend.logging import BraceStyleAdapter

from .exception import InvalidSubpathError, VFolderNotFoundError
from .types import (
from ..exception import InvalidSubpathError, VFolderNotFoundError
from ..types import (
CapacityUsage,
DirEntry,
FSPerfMetric,
Expand All @@ -35,9 +35,12 @@
CAP_VFOLDER: Final = "vfolder" # ability to create vfolder
CAP_METRIC: Final = "metric" # ability to report disk related metrics
CAP_QUOTA: Final = "quota" # ability to manage quota limits
CAP_FAST_FS_SIZE: Final = "fast-fs-size" # ability to scan filesystem size fast (e.g. by API)
CAP_FAST_SCAN: Final = "fast-scan" # ability to scan number of files in vFolder fast (e.g. by API)
CAP_FAST_SIZE: Final = "fast-size" # ability to scan vFolder size fast (e.g. by API)
# ability to scan filesystem size fast (e.g. by API)
CAP_FAST_FS_SIZE: Final = "fast-fs-size"
# ability to scan number of files in vFolder fast (e.g. by API)
CAP_FAST_SCAN: Final = "fast-scan"
# ability to scan vFolder size fast (e.g. by API)
CAP_FAST_SIZE: Final = "fast-size"

log = BraceStyleAdapter(logging.getLogger(__spec__.name))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,16 @@

from ai.backend.common.types import BinarySize, QuotaScopeID
from ai.backend.storage.exception import QuotaScopeNotFoundError

from ..abc import CAP_FAST_SIZE, CAP_QUOTA, CAP_VFOLDER, AbstractFSOpModel, AbstractQuotaModel
from ..subproc import run
from ..types import CapacityUsage, Optional, QuotaConfig, QuotaUsage, TreeUsage
from ai.backend.storage.subproc import run
from ai.backend.storage.types import CapacityUsage, Optional, QuotaConfig, QuotaUsage, TreeUsage

from ..abc import (
CAP_FAST_SIZE,
CAP_QUOTA,
CAP_VFOLDER,
AbstractFSOpModel,
AbstractQuotaModel,
)
from ..vfs import BaseFSOpModel, BaseQuotaModel, BaseVolume


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
from ai.backend.common.etcd import AsyncEtcd
from ai.backend.common.types import QuotaScopeID
from ai.backend.storage.exception import QuotaScopeAlreadyExists, QuotaScopeNotFoundError
from ai.backend.storage.subproc import run
from ai.backend.storage.types import Optional, QuotaConfig, QuotaUsage

from ..abc import CAP_QUOTA, CAP_VFOLDER, AbstractQuotaModel
from ..subproc import run
from ..types import Optional, QuotaConfig, QuotaUsage
from ..vfs import BaseQuotaModel, BaseVolume

FIRST_PROJECT_ID: Final = 100
Expand Down Expand Up @@ -62,7 +62,8 @@ async def _read_main_project_id(self) -> int:
return val

async def _set_quota_by_project(self, pid: int, path: Path, options: QuotaConfig) -> None:
quota_limit = _byte_to_kilobyte(options.limit_bytes) # default unit for DDN quota is KB
# default unit for DDN quota is KB
quota_limit = _byte_to_kilobyte(options.limit_bytes)
try:
await run([
b"sudo",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
from ai.backend.common.etcd import AsyncEtcd
from ai.backend.common.events import EventDispatcher, EventProducer
from ai.backend.common.types import HardwareMetadata, QuotaScopeID
from ai.backend.storage.exception import NotEmptyError
from ai.backend.storage.types import CapacityUsage, FSPerfMetric, QuotaConfig, QuotaUsage

from ..abc import CAP_FAST_FS_SIZE, CAP_METRIC, CAP_QUOTA, CAP_VFOLDER, AbstractQuotaModel
from ..exception import NotEmptyError
from ..types import CapacityUsage, FSPerfMetric, QuotaConfig, QuotaUsage
from ..vfs import BaseQuotaModel, BaseVolume
from .config import config_iv
from .exceptions import DellNoMetricError
Expand Down Expand Up @@ -197,7 +197,8 @@ async def get_performance_metric(self) -> FSPerfMetric:
workload = await self.get_workload_stats()
return FSPerfMetric(
iops_read=protocol_stats["disk"]["iops"] or 0,
iops_write=0, # Dell does not support IOPS Read/Write, They support only IOPS.
# Dell does not support IOPS Read/Write, They support only IOPS.
iops_write=0,
io_bytes_read=protocol_stats["onefs"]["out"] or 0,
io_bytes_write=protocol_stats["onefs"]["in"] or 0,
io_usec_read=workload["latency_write"] or 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from ai.backend.common.events import EventDispatcher, EventProducer
from ai.backend.common.types import BinarySize, HardwareMetadata, QuotaScopeID
from ai.backend.logging import BraceStyleAdapter
from ai.backend.storage.types import CapacityUsage, FSPerfMetric

from ..abc import (
CAP_FAST_FS_SIZE,
Expand All @@ -18,7 +19,6 @@
QuotaConfig,
QuotaUsage,
)
from ..types import CapacityUsage, FSPerfMetric
from ..vfs import BaseFSOpModel, BaseQuotaModel, BaseVolume
from .exceptions import GPFSNoMetricError
from .gpfs_client import GPFSAPIClient
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@

from ai.backend.common.types import BinarySize
from ai.backend.logging import BraceStyleAdapter
from ai.backend.storage.exception import ExternalError

from ..exception import ExternalError
from .exceptions import (
GPFSAPIError,
GPFSInvalidBodyError,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,24 +29,14 @@

from ai.backend.common.types import BinarySize, HardwareMetadata, QuotaScopeID
from ai.backend.logging import BraceStyleAdapter

from ..abc import (
CAP_FAST_FS_SIZE,
CAP_FAST_SIZE,
CAP_METRIC,
CAP_QUOTA,
CAP_VFOLDER,
AbstractFSOpModel,
AbstractQuotaModel,
)
from ..exception import (
from ai.backend.storage.exception import (
ExecutionError,
InvalidQuotaScopeError,
NotEmptyError,
QuotaScopeNotFoundError,
)
from ..subproc import spawn_and_watch
from ..types import (
from ai.backend.storage.subproc import spawn_and_watch
from ai.backend.storage.types import (
SENTINEL,
CapacityUsage,
DirEntry,
Expand All @@ -58,7 +48,17 @@
Stat,
TreeUsage,
)
from ..utils import fstime2datetime
from ai.backend.storage.utils import fstime2datetime

from ..abc import (
CAP_FAST_FS_SIZE,
CAP_FAST_SIZE,
CAP_METRIC,
CAP_QUOTA,
CAP_VFOLDER,
AbstractFSOpModel,
AbstractQuotaModel,
)
from ..vfs import BaseFSOpModel, BaseQuotaModel, BaseVolume
from .netappclient import JobResponseCode, NetAppClient, StorageID, VolumeID

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@

import aiohttp

from ..exception import ExternalError
from ..types import QuotaConfig, QuotaUsage
from ai.backend.storage.exception import ExternalError
from ai.backend.storage.types import QuotaConfig, QuotaUsage

StorageID: TypeAlias = uuid.UUID
VolumeID: TypeAlias = uuid.UUID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,15 @@

from ai.backend.common.types import HardwareMetadata
from ai.backend.logging import BraceStyleAdapter

from ..abc import CAP_FAST_FS_SIZE, CAP_FAST_SCAN, CAP_METRIC, CAP_VFOLDER, AbstractFSOpModel
from ..types import CapacityUsage, FSPerfMetric
from ai.backend.storage.types import CapacityUsage, FSPerfMetric

from ..abc import (
CAP_FAST_FS_SIZE,
CAP_FAST_SCAN,
CAP_METRIC,
CAP_VFOLDER,
AbstractFSOpModel,
)
from ..vfs import BaseVolume
from .purity import PurityClient
from .rapidfiles import RapidFileToolsFSOpModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
from typing import AsyncIterator

from ai.backend.common.types import BinarySize
from ai.backend.storage.subproc import run
from ai.backend.storage.types import DirEntry, DirEntryType, Stat, TreeUsage
from ai.backend.storage.utils import fstime2datetime

from ..subproc import run
from ..types import DirEntry, DirEntryType, Stat, TreeUsage
from ..utils import fstime2datetime
from ..vfs import BaseFSOpModel


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
from subprocess import CalledProcessError
from typing import AsyncIterator

from ai.backend.storage.subproc import run
from ai.backend.storage.types import DirEntry, DirEntryType, Stat, TreeUsage
from ai.backend.storage.utils import fstime2datetime

from ..subproc import run
from ..types import DirEntry, DirEntryType, Stat, TreeUsage
from .rapidfiles import RapidFileToolsFSOpModel


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
from ai.backend.common.events import EventDispatcher, EventProducer
from ai.backend.common.types import HardwareMetadata, QuotaConfig, QuotaScopeID
from ai.backend.logging import BraceStyleAdapter

from ..abc import CAP_FAST_FS_SIZE, CAP_FAST_SIZE, CAP_METRIC, CAP_QUOTA, CAP_VFOLDER
from ..exception import (
from ai.backend.storage.exception import (
ExternalError,
InvalidQuotaConfig,
QuotaScopeNotFoundError,
StorageProxyError,
)
from ..types import CapacityUsage, FSPerfMetric, QuotaUsage
from ai.backend.storage.types import CapacityUsage, FSPerfMetric, QuotaUsage

from ..abc import CAP_FAST_FS_SIZE, CAP_FAST_SIZE, CAP_METRIC, CAP_QUOTA, CAP_VFOLDER
from ..vfs import BaseQuotaModel, BaseVolume
from .config import config_iv
from .exceptions import VASTInvalidParameterError, VASTNotFoundError, VASTUnknownError
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
from yarl import URL

from ai.backend.logging import BraceStyleAdapter
from ai.backend.storage.exception import ExternalError, QuotaScopeAlreadyExists
from ai.backend.storage.types import CapacityUsage

from ..exception import ExternalError, QuotaScopeAlreadyExists
from ..types import CapacityUsage
from .config import APIVersion
from .exceptions import (
VASTAPIError,
Expand Down Expand Up @@ -263,7 +263,9 @@ async def _build_request(
VASTInvalidParameterError,
) as e:
log.warning(
f"Error occurs during communicating with Vast data API. Login and retry (e:{repr(e)})"
f"Error occurs during communicating with Vast data API. Login and retry (e:{
repr(e)
})"
)
await self._login()
return await func(
Expand Down Expand Up @@ -320,7 +322,8 @@ async def set_quota(
body: dict[str, Any] = {
"name": str(path),
"path": str(self.storage_base_dir / path.name),
"create_dir": False, # Explicitly disable to create directory owned by root.
# Explicitly disable to create directory owned by root.
"create_dir": False,
}
if soft_limit is not None:
body["soft_limit"] = soft_limit
Expand Down
Loading
Loading