feat(v2): complete v2 reimplementation
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
"""Readiness checks shared by HTTP and background process roles."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
from backup_tool.cli import build_alembic_config
|
||||
from backup_tool.config import Settings
|
||||
from backup_tool.db.engine import assert_schema_current, create_engine
|
||||
|
||||
|
||||
class ReadinessError(RuntimeError):
|
||||
"""A dependency needed by the selected role is unavailable."""
|
||||
|
||||
|
||||
def _require_access(path: object, mode: int) -> None:
|
||||
try:
|
||||
candidate = path if isinstance(path, str) else str(path)
|
||||
if not os.path.isdir(candidate) or not os.access(candidate, mode):
|
||||
raise ReadinessError("required storage is unavailable")
|
||||
except OSError as error:
|
||||
raise ReadinessError("required storage is unavailable") from error
|
||||
|
||||
|
||||
async def check_role_readiness(settings: Settings, role: str) -> None:
|
||||
engine = create_engine(settings)
|
||||
try:
|
||||
await assert_schema_current(engine, build_alembic_config(settings))
|
||||
except Exception as error:
|
||||
raise ReadinessError("metadata is unavailable") from error
|
||||
finally:
|
||||
await engine.dispose()
|
||||
if role == "scheduler":
|
||||
return
|
||||
_require_access(settings.data_dir, os.R_OK | os.W_OK | os.X_OK)
|
||||
for root in settings.repository_roots + settings.restore_roots:
|
||||
_require_access(root, os.R_OK | os.W_OK | os.X_OK)
|
||||
for root in settings.local_source_roots:
|
||||
_require_access(root, os.R_OK | os.X_OK)
|
||||
Reference in New Issue
Block a user