"""스토리지 계층 추상화 패키지 (plan ds-s1-backend-1 D 그룹, scaffold-first). 활성 백엔드 선택 = get_storage_backend(): - env DS_STORAGE_BACKEND (기본 'local') 로 결정 — config.yaml storage 섹션 편집 없이도 동작(검색실험 Soft Lock 동안 config 불가침). 실 활성(외부 백엔드)은 D-3. - 'local' → LocalBackend(settings.nas_mount_path) : 현행 NAS NFS, /file 동작 불변. - 'nas_api'/'nas'→ NasApiBackend(env DS_NAS_API_BASE_URL) : 미프로비전 시 503(silent fallback X). """ from __future__ import annotations import os from functools import lru_cache from core.config import settings from .base import StatResult, StorageBackend, StorageNotConfigured from .local import LocalBackend from .nas_api import NasApiBackend __all__ = [ "StorageBackend", "StorageNotConfigured", "StatResult", "LocalBackend", "NasApiBackend", "get_storage_backend", ] @lru_cache(maxsize=1) def get_storage_backend() -> StorageBackend: """활성 스토리지 백엔드 1개 반환 (프로세스 단위 캐시).""" backend = os.getenv("DS_STORAGE_BACKEND", "local").lower() if backend == "local": return LocalBackend(settings.nas_mount_path) if backend in ("nas_api", "nas"): return NasApiBackend(os.getenv("DS_NAS_API_BASE_URL")) raise StorageNotConfigured(f"unknown DS_STORAGE_BACKEND={backend!r}")