train_utility/tests/test_deployment.py
2026-08-04 14:00:46 +04:00

45 lines
1.5 KiB
Python

from __future__ import annotations
from pathlib import Path
import yaml
PROJECT_ROOT = Path(__file__).resolve().parents[1]
def test_compose_is_local_and_does_not_require_nvidia() -> None:
compose = yaml.safe_load(
(PROJECT_ROOT / "docker-compose.yml").read_text(encoding="utf-8")
)
webui = compose["services"]["webui"]
assert webui["ports"] == ["127.0.0.1:8000:8000"]
assert "deploy" not in webui
mlflow = compose["services"]["mlflow"]
assert mlflow["ports"] == ["127.0.0.1:5000:5000"]
assert mlflow["volumes"] == ["./mlflow:/mlflow"]
assert "server" in mlflow["command"]
assert webui["environment"]["YOLO_WEBUI_MLFLOW_TRACKING_URI"] == "http://mlflow:5000"
def test_docker_dependencies_are_exported_from_lock_file() -> None:
dockerfile = (PROJECT_ROOT / "Dockerfile").read_text(encoding="utf-8")
assert "COPY pyproject.toml uv.lock README.md ./" in dockerfile
assert "uv export --locked --no-dev" in dockerfile
assert "--group build" in dockerfile
assert "--prune ultralytics" in dockerfile
assert "uv pip install --system --no-deps --no-build-isolation ." in dockerfile
assert "ULTRALYTICS_SAFE_LOAD=1" in dockerfile
def test_docker_context_excludes_local_training_artifacts() -> None:
ignored = {
line.strip()
for line in (PROJECT_ROOT / ".dockerignore").read_text(encoding="utf-8").splitlines()
if line.strip() and not line.lstrip().startswith("#")
}
assert {".git", ".venv", "datasets", "models", "runs", "mlruns"} <= ignored