bd31a3f2f3
- pyproject.toml (hatchling) with ruff/mypy/pytest dev deps - src/ci_orchestrator/: config, credentials, backends (Protocol + WorkstationVmrunBackend), transport (WinRM via pypsrp, SSH via paramiko) - CLI entry point with PoC 'wait-ready' subcommand (Windows + Linux guests) - tests/python/: 35 unit tests, 83% coverage, all backends/transport mocked - gitea/workflows/lint.yml: new 'python' job (ruff + mypy --strict + pytest --cov-fail-under=70) - config.example.toml + README setup section + .gitignore Python entries Neutral VmBackend Protocol prepared for Phase C ESXi extension. See plans/implementation-plan-A-B.md step A1.
31 lines
1.2 KiB
Python
31 lines
1.2 KiB
Python
"""VM backend implementations.
|
|
|
|
The :class:`~ci_orchestrator.backends.protocol.VmBackend` Protocol defines
|
|
the neutral interface every backend must satisfy. Phase A ships only the
|
|
:class:`~ci_orchestrator.backends.workstation.WorkstationVmrunBackend`;
|
|
Phase C will add an ESXi backend behind the same interface.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from ci_orchestrator.backends.protocol import VmBackend, VmHandle, VmState
|
|
from ci_orchestrator.backends.workstation import WorkstationVmrunBackend
|
|
|
|
__all__ = ["VmBackend", "VmHandle", "VmState", "WorkstationVmrunBackend", "load_backend"]
|
|
|
|
|
|
def load_backend(config: object) -> VmBackend:
|
|
"""Factory: pick a backend implementation from ``config.backend.type``.
|
|
|
|
Phase C hook: when the ESXi backend lands, this function will dispatch
|
|
on ``config.backend.type``. For now only ``workstation`` is supported.
|
|
"""
|
|
backend_type = getattr(getattr(config, "backend", None), "type", "workstation")
|
|
if backend_type != "workstation":
|
|
raise NotImplementedError(
|
|
f"Backend type '{backend_type}' is not implemented. "
|
|
"Only 'workstation' is available in Phase A."
|
|
)
|
|
vmrun_path = getattr(config, "vmrun_path", None)
|
|
return WorkstationVmrunBackend(vmrun_path=vmrun_path)
|