fix(agent): queue bounded host pressure handoff
All checks were successful
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 2m28s
CD Pipeline / build-and-deploy (push) Successful in 6m49s
AWOOOI Harbor 110 Local Repair / workflow-shape (push) Successful in 1s
AWOOOI Harbor 110 Local Repair / harbor-110-local-repair (push) Successful in 13s
CD Pipeline / post-deploy-checks (push) Successful in 1m59s

This commit is contained in:
ogt
2026-07-11 11:14:02 +08:00
parent 3d7a93b0eb
commit 69e5571812
2 changed files with 64 additions and 1 deletions

View File

@@ -1225,9 +1225,21 @@ class RepairCandidateService:
}
and repair_template.startswith("agent99-mode ")
)
rollback_template = str(
template.get("rollback_command_template") or ""
).strip()
safe_host_pressure_readonly_route = bool(
route == "host_pressure_readonly_after_owner_review"
and repair_template.startswith(
"/home/wooo/scripts/host-sustained-load-controller.py "
)
and "systemctl restart" not in repair_template.lower()
and rollback_template.startswith("no host mutation")
)
if (
"playbook_command_not_safely_routable" in set(blockers)
and not safe_agent99_route
and not safe_host_pressure_readonly_route
):
return False
if not coverage_gap.get("mcp_evidence_ready"):
@@ -1241,7 +1253,9 @@ class RepairCandidateService:
return False
if repair_template.startswith("service-specific repair"):
return False
return route.endswith("_after_owner_review")
return safe_host_pressure_readonly_route or route.endswith(
"_after_owner_review"
)
def _build_playbook_draft_template(
self,

View File

@@ -559,6 +559,55 @@ def test_host_pressure_controller_is_never_drafted_as_systemd_restart() -> None:
assert "systemctl is-active" not in " ".join(template["verifier_plan_template"])
@pytest.mark.asyncio
async def test_host_pressure_readonly_draft_queues_dedicated_ansible_candidate() -> None:
incident = _incident()
incident.signals[0].alert_name = "Host110SustainedModeratePressureLivefire"
incident.signals[0].labels = {
"component": "host-pressure-controller-livefire-source-sha",
"host": "110",
}
incident.affected_services = ["host-pressure-controller-livefire-source-sha"]
recorded: list[dict] = []
async def fake_recorder(**kwargs):
recorded.append(kwargs)
return True
service = RepairCandidateService(
incident_service=FakeIncidentService(),
investigator=FakeInvestigator(_evidence(incident.incident_id)),
playbook_repository=FakePlaybookRepository(_generic_fallback_playbook()),
auto_repair_service=FakeAutoRepairService(),
ansible_audit_recorder=fake_recorder,
)
result = await service.build_from_incident(
incident=incident,
alertname="Host110SustainedModeratePressureLivefire",
target_resource="host-pressure-controller-livefire-source-sha",
namespace="",
message="controlled host pressure live-fire",
fallback_action="NO_ACTION - REPAIR_CANDIDATE_MISSING",
matched_playbook_id="PB-GENERIC-FALLBACK",
severity="medium",
)
assert result.draft_ready_for_owner_review is True
assert result.metadata["repair_candidate_owner_review_required"] is False
handoff = result.metadata["controlled_executor_handoff"]
assert handoff["status"] == "ansible_candidate_matched_queued"
assert handoff["check_mode_queued"] is True
assert handoff["candidate_count"] >= 1
assert recorded
audit_input = recorded[0]["proposal_data"]
assert audit_input["route_id"] == "host_pressure_readonly_after_owner_review"
assert audit_input["action"].startswith(
"/home/wooo/scripts/host-sustained-load-controller.py"
)
@pytest.mark.asyncio
async def test_postgres_slow_query_gap_prefills_database_owner_review_not_restart() -> None:
incident = _incident()