94 lines
2.9 KiB
Python
94 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
from io import StringIO
|
|
|
|
from pve_vm_setup.doctor import run_live_doctor
|
|
from pve_vm_setup.services.base import AuthenticatedSession, Node, Pool, Realm
|
|
from pve_vm_setup.settings import AppSettings
|
|
|
|
|
|
class StubDoctorService:
|
|
mode = "live"
|
|
|
|
def check_connectivity(self) -> str:
|
|
return "HTTP 200"
|
|
|
|
def check_api_base(self) -> str:
|
|
return "8.2"
|
|
|
|
def load_realms(self) -> list[Realm]:
|
|
return [Realm(name="pam", title="Linux PAM standard authentication", default=True)]
|
|
|
|
def login(self, username: str, password: str, realm: str) -> AuthenticatedSession:
|
|
return AuthenticatedSession(username=f"{username}@{realm}", ticket="ticket")
|
|
|
|
def load_nodes(self) -> list[Node]:
|
|
return [Node(name="pve-test-01")]
|
|
|
|
def load_pools(self) -> list[Pool]:
|
|
return [Pool(poolid="sandbox")]
|
|
|
|
def load_existing_tags(self) -> list[str]:
|
|
return []
|
|
|
|
def load_storages(self, node: str):
|
|
raise AssertionError("not used in doctor")
|
|
|
|
def load_isos(self, node: str, storage: str):
|
|
raise AssertionError("not used in doctor")
|
|
|
|
|
|
class StubFactory:
|
|
@staticmethod
|
|
def create(settings: AppSettings) -> StubDoctorService:
|
|
return StubDoctorService()
|
|
|
|
|
|
def test_doctor_succeeds_and_keeps_secrets_out_of_output() -> None:
|
|
settings = AppSettings.from_env(
|
|
{
|
|
"PROXMOX_URL": "https://proxmox.example.invalid:8006",
|
|
"PROXMOX_USER": "root",
|
|
"PROXMOX_PASSWORD": "super-secret",
|
|
"PROXMOX_REALM": "pam",
|
|
},
|
|
load_dotenv_file=False,
|
|
)
|
|
stream = StringIO()
|
|
|
|
exit_code = run_live_doctor(settings, stream=stream, service_factory=StubFactory)
|
|
|
|
output = stream.getvalue()
|
|
assert exit_code == 0
|
|
assert "Doctor finished successfully." in output
|
|
assert "super-secret" not in output
|
|
assert "root@pam" in output
|
|
assert "host: proxmox.example.invalid:8006" in output
|
|
|
|
|
|
def test_doctor_validates_create_scope_when_enabled() -> None:
|
|
settings = AppSettings.from_env(
|
|
{
|
|
"PROXMOX_URL": "https://proxmox.example.invalid:8006",
|
|
"PROXMOX_USER": "root",
|
|
"PROXMOX_PASSWORD": "super-secret",
|
|
"PROXMOX_REALM": "pam",
|
|
"PROXMOX_PREVENT_CREATE": "false",
|
|
"PROXMOX_ENABLE_TEST_MODE": "true",
|
|
"PROXMOX_TEST_NODE": "pve-test-01",
|
|
"PROXMOX_TEST_POOL": "sandbox",
|
|
},
|
|
load_dotenv_file=False,
|
|
)
|
|
stream = StringIO()
|
|
|
|
exit_code = run_live_doctor(settings, stream=stream, service_factory=StubFactory)
|
|
|
|
output = stream.getvalue()
|
|
assert exit_code == 0
|
|
assert "prevent_create: False" in output
|
|
assert "enable_test_mode: True" in output
|
|
assert "node=pve-test-01" in output
|
|
assert "pool=sandbox" in output
|
|
assert "tag=codex-e2e" in output
|
|
assert "name_prefix=codex-e2e-" in output
|