94 lines
3.4 KiB
Python
94 lines
3.4 KiB
Python
"""Complete display inventory must never authorize recovery of fenced runners."""
|
|
|
|
from datetime import UTC, datetime, timedelta
|
|
|
|
from backend.app.core.config import settings
|
|
from backend.tests.test_runner_scheduler_liveness_recovery import _configure
|
|
|
|
|
|
def _snapshot(
|
|
monkeypatch, *, busy=False, queued=False, apply_filter=True, incomplete=False
|
|
):
|
|
connector = _configure(monkeypatch)
|
|
monkeypatch.setitem(
|
|
settings.apis,
|
|
"GITEA_RUNNER_TARGETS_JSON",
|
|
'{"linux-validation":"itworx-ci-backend"}',
|
|
)
|
|
runners = [
|
|
{
|
|
"id": 71 + index,
|
|
"name": f"itworx-ci-{profile}",
|
|
"status": "online" if busy and profile == "backend" else "offline",
|
|
"busy": busy and profile == "backend",
|
|
"disabled": True,
|
|
"labels": ["linux-validation"],
|
|
"token": "fixture-secret",
|
|
}
|
|
for index, profile in enumerate(
|
|
("checks", "backend", "frontend", "security", "browser", "build")
|
|
)
|
|
]
|
|
requests = []
|
|
|
|
def request(path, params=None):
|
|
requests.append((path, params))
|
|
if path.endswith("/runners"):
|
|
rows = [] if apply_filter and params.get("disabled") == "false" else runners
|
|
return {"total_count": len(rows) + int(incomplete), "runners": rows}
|
|
jobs = []
|
|
if queued and params.get("status") == "queued":
|
|
jobs = [
|
|
{
|
|
"id": 9,
|
|
"status": "queued",
|
|
"runner_id": 0,
|
|
"labels": ["linux-validation"],
|
|
"created_at": (
|
|
datetime.now(UTC) - timedelta(minutes=20)
|
|
).isoformat(),
|
|
}
|
|
]
|
|
return {"total_count": len(jobs), "jobs": jobs}
|
|
|
|
monkeypatch.setattr(connector, "_request", request)
|
|
return connector.snapshot(refresh=True), requests
|
|
|
|
|
|
def test_standby_fleet_remains_visible_and_does_not_appear_broken(monkeypatch):
|
|
result, requests = _snapshot(monkeypatch)
|
|
assert len(result["runners"]) == 6
|
|
assert result["summary"]["disabled"] == 6
|
|
assert result["summary"]["available"] == 0
|
|
assert result["inventory"] == {"scope": "all_registrations", "complete": True}
|
|
assert result["severity"] == "healthy"
|
|
assert result["recommendedAction"] is None
|
|
assert "fixture-secret" not in repr(result)
|
|
assert requests[0][1] == {"page": 1, "limit": 100}
|
|
|
|
|
|
def test_fenced_busy_runner_is_counted_without_becoming_claimable(monkeypatch):
|
|
result, _ = _snapshot(monkeypatch, busy=True)
|
|
assert result["summary"]["busy"] == 1
|
|
assert result["summary"]["online"] == 0
|
|
assert result["summary"]["available"] == 0
|
|
assert result["summary"]["disabled"] == 6
|
|
assert result["runners"][1]["busy"] is True
|
|
assert result["runners"][1]["disabled"] is True
|
|
|
|
|
|
def test_disabled_runner_never_receives_restart_guidance_for_a_stalled_queue(
|
|
monkeypatch,
|
|
):
|
|
result, _ = _snapshot(monkeypatch, queued=True, apply_filter=False)
|
|
assert result["severity"] == "critical"
|
|
assert result["queue"]["queued"] == 1
|
|
assert result["recommendedAction"] is None
|
|
|
|
|
|
def test_incomplete_runner_sample_is_not_reported_as_complete(monkeypatch):
|
|
result, _ = _snapshot(monkeypatch, incomplete=True)
|
|
assert len(result["runners"]) == 6
|
|
assert result["inventory"] == {"scope": "all_registrations", "complete": False}
|
|
assert result["recommendedAction"] is None
|