Merge remote-tracking branch 'origin/main' into codex/aia-sre-017-callback-closure-20260717
This commit is contained in:
@@ -22,9 +22,9 @@ from src.services.awooop_ansible_audit_service import get_ansible_catalog_item
|
||||
from src.services.awooop_ansible_check_mode_service import (
|
||||
AnsibleCheckModeClaim,
|
||||
AnsibleRunResult,
|
||||
_build_wazuh_break_glass_capability_packet,
|
||||
_wazuh_privileged_convergence_capability_is_missing,
|
||||
backfill_missing_wazuh_break_glass_capability_packets_once,
|
||||
_build_wazuh_controlled_capability_packet,
|
||||
_wazuh_privileged_convergence_failure_class,
|
||||
backfill_missing_wazuh_controlled_capability_packets_once,
|
||||
finalize_check_mode_claim,
|
||||
)
|
||||
from src.services.awooop_ansible_post_verifier import postconditions_for_catalog
|
||||
@@ -48,7 +48,7 @@ def _current_wazuh_source_recurrence(observed_at: str) -> dict[str, object]:
|
||||
|
||||
|
||||
def test_wazuh_runtime_sql_reads_schema_safe_packet_fallback() -> None:
|
||||
assert "ansible_break_glass_capability_work_item_queued" in _LIVE_RUNTIME_SQL
|
||||
assert "ansible_controlled_capability_repair_queued" in _LIVE_RUNTIME_SQL
|
||||
assert "remediation_executed" in _LIVE_RUNTIME_SQL
|
||||
assert "semantic_operation_type" in _LIVE_RUNTIME_SQL
|
||||
|
||||
@@ -146,7 +146,7 @@ def test_wazuh_runtime_readback_closes_only_with_complete_same_run_receipts() ->
|
||||
|
||||
assert (
|
||||
payload["schema_version"]
|
||||
== "iwooos_wazuh_controlled_executor_runtime_readback_v1"
|
||||
== "iwooos_wazuh_controlled_executor_runtime_readback_v2"
|
||||
)
|
||||
assert payload["status"] == "wazuh_manager_posture_same_run_runtime_closed"
|
||||
assert payload["summary"]["runtime_execution_performed_count"] == 1
|
||||
@@ -373,8 +373,7 @@ def test_wazuh_runtime_readback_projects_allowlisted_privilege_blocker() -> None
|
||||
"wazuh_privileged_convergence_capability_missing"
|
||||
)
|
||||
assert payload["next_safe_action"] == (
|
||||
"queue_critical_break_glass_privileged_convergence_capability_"
|
||||
"then_bounded_retry"
|
||||
"queue_high_risk_controlled_privilege_capability_repair_then_retry"
|
||||
)
|
||||
assert "wazuh_privileged_convergence_capability_missing" in (
|
||||
payload["active_blockers"]
|
||||
@@ -382,15 +381,61 @@ def test_wazuh_runtime_readback_projects_allowlisted_privilege_blocker() -> None
|
||||
assert payload["boundaries"]["host_write_performed"] is False
|
||||
assert payload["boundaries"]["secret_value_collection_allowed"] is False
|
||||
assert payload["summary"][
|
||||
"critical_break_glass_capability_packet_count"
|
||||
"controlled_capability_repair_packet_count"
|
||||
] == 0
|
||||
assert payload["critical_break_glass_capability_packet"] is None
|
||||
assert "critical_break_glass_capability_packet_missing" in (
|
||||
assert payload["controlled_capability_repair_packet"] is None
|
||||
assert "controlled_capability_repair_packet_missing" in (
|
||||
payload["active_blockers"]
|
||||
)
|
||||
|
||||
|
||||
def test_wazuh_runtime_readback_projects_durable_break_glass_packet() -> None:
|
||||
def test_wazuh_runtime_readback_keeps_only_secret_reference_as_critical() -> None:
|
||||
run_id = "00000000-0000-0000-0000-000000000342"
|
||||
recurrence = _current_wazuh_source_recurrence(
|
||||
"2026-07-17T10:00:00+08:00"
|
||||
)
|
||||
row = {
|
||||
"candidate_op_id": run_id,
|
||||
"automation_run_id": run_id,
|
||||
"trace_id": run_id,
|
||||
"run_id": run_id,
|
||||
"candidate_project_id": "awoooi",
|
||||
"work_item_id": "P0-03-WAZUH-ALERT-INGRESS",
|
||||
"proposal_source": "iwooos_wazuh_alert_ingress_scheduler",
|
||||
"run_namespace": "awoooi:iwooos:wazuh-alert-ingress",
|
||||
"source_receipt_ref": "wazuh-alert:2026071710",
|
||||
"candidate_source_recurrence": recurrence,
|
||||
"candidate_source_recurrence_verified": True,
|
||||
"catalog_id": "ansible:wazuh-alertmanager-integration",
|
||||
"check_op_id": "00000000-0000-0000-0000-000000000343",
|
||||
"check_status": "failed",
|
||||
"check_returncode": "2",
|
||||
"check_timed_out": "false",
|
||||
"check_automation_run_id": run_id,
|
||||
"check_trace_id": run_id,
|
||||
"check_run_id": run_id,
|
||||
"check_work_item_id": "P0-03-WAZUH-ALERT-INGRESS",
|
||||
"check_source_recurrence": recurrence,
|
||||
"check_failure_marker": (
|
||||
"wazuh_privileged_convergence_secret_reference_missing"
|
||||
),
|
||||
"stage_ids": [],
|
||||
}
|
||||
|
||||
payload = build_iwooos_wazuh_controlled_executor_runtime_readback(
|
||||
row,
|
||||
executor_enabled=True,
|
||||
)
|
||||
|
||||
assert payload["boundaries"]["critical_break_glass_required"] is True
|
||||
assert payload["boundaries"]["secret_value_collection_allowed"] is False
|
||||
assert payload["next_safe_action"] == (
|
||||
"queue_high_risk_capability_repair_with_critical_secret_"
|
||||
"reference_boundary"
|
||||
)
|
||||
|
||||
|
||||
def test_wazuh_runtime_readback_projects_controlled_capability_packet() -> None:
|
||||
run_id = "00000000-0000-0000-0000-000000000314"
|
||||
recurrence = _current_wazuh_source_recurrence(
|
||||
"2026-07-15T05:59:58+08:00"
|
||||
@@ -420,11 +465,11 @@ def test_wazuh_runtime_readback_projects_durable_break_glass_packet() -> None:
|
||||
"check_failure_marker": (
|
||||
"wazuh_privileged_convergence_capability_missing"
|
||||
),
|
||||
"break_glass_packet_receipt_id": (
|
||||
"controlled_capability_packet_receipt_id": (
|
||||
"00000000-0000-0000-0000-000000000315"
|
||||
),
|
||||
"break_glass_packet_status": "pending",
|
||||
"capability_packet_id": "IWZ-BG-0011223344556677",
|
||||
"controlled_capability_packet_status": "pending",
|
||||
"capability_packet_id": "IWZ-CC-0011223344556677",
|
||||
"capability_automation_run_id": run_id,
|
||||
"capability_trace_id": run_id,
|
||||
"capability_run_id": run_id,
|
||||
@@ -436,10 +481,16 @@ def test_wazuh_runtime_readback_projects_durable_break_glass_packet() -> None:
|
||||
),
|
||||
"capability_source_recurrence": recurrence,
|
||||
"capability_type": "bounded_privileged_convergence",
|
||||
"capability_risk_level": "critical",
|
||||
"capability_policy_route": "critical_break_glass_queue",
|
||||
"capability_risk_level": "high",
|
||||
"capability_policy_route": (
|
||||
"high_risk_controlled_apply_capability_repair"
|
||||
),
|
||||
"capability_queue_status": "queued",
|
||||
"capability_execution_allowed": False,
|
||||
"capability_controlled_apply_allowed": True,
|
||||
"capability_windows99_dispatch_required": True,
|
||||
"capability_critical_secret_reference_required": False,
|
||||
"capability_expires_at": "2030-07-17T02:30:00+00:00",
|
||||
"capability_execution_allowed": True,
|
||||
"capability_granted": False,
|
||||
"capability_packet_host_write_performed": False,
|
||||
"stage_ids": [],
|
||||
@@ -451,25 +502,39 @@ def test_wazuh_runtime_readback_projects_durable_break_glass_packet() -> None:
|
||||
)
|
||||
|
||||
assert payload["summary"][
|
||||
"critical_break_glass_capability_packet_count"
|
||||
"controlled_capability_repair_packet_count"
|
||||
] == 1
|
||||
assert payload["next_safe_action"] == (
|
||||
"critical_break_glass_capability_packet_queued_waiting_"
|
||||
"bounded_capability_verifier_then_retry"
|
||||
"windows99_verify_controlled_privilege_capability_then_"
|
||||
"requeue_same_run"
|
||||
)
|
||||
packet = payload["critical_break_glass_capability_packet"]
|
||||
packet = payload["controlled_capability_repair_packet"]
|
||||
assert packet["queue_status"] == "queued"
|
||||
assert packet["execution_allowed"] is False
|
||||
assert packet["execution_allowed"] is True
|
||||
assert packet["controlled_apply_allowed"] is True
|
||||
assert packet["windows99_dispatch_required"] is True
|
||||
assert packet["capability_granted"] is False
|
||||
assert packet["host_write_performed"] is False
|
||||
assert packet["secret_value_exposed"] is False
|
||||
assert "critical_break_glass_capability_packet_pending" in (
|
||||
assert "controlled_capability_repair_packet_pending" in (
|
||||
payload["active_blockers"]
|
||||
)
|
||||
assert payload["boundaries"][
|
||||
"critical_break_glass_capability_packet_persisted"
|
||||
"controlled_capability_repair_packet_persisted"
|
||||
] is True
|
||||
|
||||
row["capability_expires_at"] = "2020-07-17T02:30:00+00:00"
|
||||
expired = build_iwooos_wazuh_controlled_executor_runtime_readback(
|
||||
row,
|
||||
executor_enabled=True,
|
||||
)
|
||||
assert expired["summary"][
|
||||
"controlled_capability_repair_packet_count"
|
||||
] == 0
|
||||
assert "controlled_capability_repair_packet_expired" in (
|
||||
expired["active_blockers"]
|
||||
)
|
||||
|
||||
|
||||
def test_wazuh_runtime_readback_rejects_untrusted_failure_marker() -> None:
|
||||
row = {
|
||||
@@ -491,7 +556,7 @@ def test_wazuh_runtime_readback_rejects_untrusted_failure_marker() -> None:
|
||||
assert payload["boundaries"]["host_write_performed"] is False
|
||||
|
||||
|
||||
def test_wazuh_break_glass_packet_is_deterministic_and_public_safe() -> None:
|
||||
def test_wazuh_controlled_capability_packet_is_deterministic_and_public_safe() -> None:
|
||||
kwargs = {
|
||||
"check_op_id": "00000000-0000-0000-0000-000000000316",
|
||||
"source_candidate_op_id": "00000000-0000-0000-0000-000000000317",
|
||||
@@ -512,12 +577,14 @@ def test_wazuh_break_glass_packet_is_deterministic_and_public_safe() -> None:
|
||||
"unexpected_material": "must-not-be-projected",
|
||||
"command_output": "must-not-be-projected",
|
||||
},
|
||||
"failure_class": "wazuh_privileged_convergence_capability_missing",
|
||||
"observed_now": datetime(2026, 7, 17, 2, 0, tzinfo=UTC),
|
||||
}
|
||||
|
||||
packet_input, packet_output, dry_run = (
|
||||
_build_wazuh_break_glass_capability_packet(**kwargs)
|
||||
_build_wazuh_controlled_capability_packet(**kwargs)
|
||||
)
|
||||
repeated_input, _, _ = _build_wazuh_break_glass_capability_packet(
|
||||
repeated_input, _, _ = _build_wazuh_controlled_capability_packet(
|
||||
**kwargs
|
||||
)
|
||||
serialized = json.dumps(
|
||||
@@ -527,8 +594,14 @@ def test_wazuh_break_glass_packet_is_deterministic_and_public_safe() -> None:
|
||||
assert packet_input["capability_packet_id"] == repeated_input[
|
||||
"capability_packet_id"
|
||||
]
|
||||
assert packet_input["risk_level"] == "critical"
|
||||
assert packet_input["execution_allowed"] is False
|
||||
assert packet_input["risk_level"] == "high"
|
||||
assert packet_input["execution_allowed"] is True
|
||||
assert packet_input["controlled_apply_allowed"] is True
|
||||
assert packet_input["windows99_dispatch_required"] is True
|
||||
assert packet_input["critical_secret_reference_required"] is False
|
||||
assert packet_input["gate_lifecycle"]["expires_at"] == (
|
||||
"2026-07-17T02:30:00+00:00"
|
||||
)
|
||||
assert packet_input["host_write_performed"] is False
|
||||
assert packet_input["project_id"] == "awoooi"
|
||||
assert packet_input["source_recurrence"]["verified"] is True
|
||||
@@ -601,25 +674,29 @@ async def test_failed_wazuh_check_atomically_queues_deduplicated_packet(
|
||||
duration_ms=20,
|
||||
)
|
||||
|
||||
assert _wazuh_privileged_convergence_capability_is_missing(claim, result)
|
||||
assert _wazuh_privileged_convergence_failure_class(claim, result) == (
|
||||
"wazuh_privileged_convergence_capability_missing"
|
||||
)
|
||||
await finalize_check_mode_claim(claim, result)
|
||||
|
||||
assert len(calls) == 2
|
||||
insert_sql, insert_params = calls[1]
|
||||
assert "ansible_break_glass_capability_work_item_queued" in insert_sql
|
||||
assert "ansible_controlled_capability_repair_queued" in insert_sql
|
||||
assert "remediation_executed" in insert_sql
|
||||
assert "pg_get_constraintdef" in insert_sql
|
||||
assert "WHERE NOT EXISTS" in insert_sql
|
||||
packet_input = json.loads(str(insert_params["input"]))
|
||||
assert packet_input["work_item_id"] == "P0-03-WAZUH-ALERT-INGRESS"
|
||||
assert packet_input["semantic_operation_type"] == (
|
||||
"ansible_break_glass_capability_work_item_queued"
|
||||
"ansible_controlled_capability_repair_queued"
|
||||
)
|
||||
assert packet_input["risk_level"] == "high"
|
||||
assert packet_input["execution_allowed"] is True
|
||||
assert packet_input["secret_value_exposed"] is False
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_wazuh_break_glass_packet_backfill_closes_existing_gap(
|
||||
async def test_wazuh_controlled_capability_packet_backfill_closes_existing_gap(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
from src.services import awooop_ansible_check_mode_service as service
|
||||
@@ -639,6 +716,7 @@ async def test_wazuh_break_glass_packet_backfill_closes_existing_gap(
|
||||
"source_recurrence": _current_wazuh_source_recurrence(
|
||||
"2026-07-15T05:59:58+08:00"
|
||||
),
|
||||
"failure_class": "wazuh_privileged_convergence_capability_missing",
|
||||
}]
|
||||
|
||||
class _Mappings:
|
||||
@@ -669,7 +747,7 @@ async def test_wazuh_break_glass_packet_backfill_closes_existing_gap(
|
||||
|
||||
monkeypatch.setattr(service, "get_db_context", fake_db_context)
|
||||
|
||||
result = await backfill_missing_wazuh_break_glass_capability_packets_once()
|
||||
result = await backfill_missing_wazuh_controlled_capability_packets_once()
|
||||
|
||||
assert result == {"scanned": 1, "written": 1, "error": None}
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ BROKER_DEPLOYMENT = (
|
||||
ROOT / "k8s" / "awoooi-prod" / "08-deployment-ansible-executor-broker.yaml"
|
||||
)
|
||||
WORKER_DEPLOYMENT = ROOT / "k8s" / "awoooi-prod" / "08-deployment-worker.yaml"
|
||||
CD_WORKFLOW = ROOT / ".gitea" / "workflows" / "cd.yaml"
|
||||
CATALOG_ID = "ansible:wazuh-alertmanager-integration"
|
||||
|
||||
|
||||
@@ -179,9 +180,19 @@ def test_wazuh_integration_catalog_and_rollback_contract_are_bounded() -> None:
|
||||
assert self_test_task["ansible.builtin.command"]["argv"][0] == (
|
||||
"{{ ansible_playbook_python }}"
|
||||
)
|
||||
secret_reference_assert = next(
|
||||
task
|
||||
for task in playbook[0]["tasks"]
|
||||
if task.get("ansible.builtin.assert", {}).get("fail_msg")
|
||||
== "wazuh_privileged_convergence_secret_reference_missing"
|
||||
)
|
||||
assert secret_reference_assert.get("no_log") is not True
|
||||
assert "backup: true" in text
|
||||
assert "remote_src: true" in text
|
||||
assert "wazuh_privileged_convergence_capability_missing" in text
|
||||
assert "wazuh_privileged_convergence_secret_reference_missing" in text
|
||||
assert "ANSIBLE_BECOME_PASSWORD_FILE" in text
|
||||
assert "get_checksum: false" in text
|
||||
assert "/var/lib/awoooi-wazuh-alert-ingress/receipt.env" in text
|
||||
assert "raw_payload_persisted=0" in text
|
||||
assert "active_response_enabled=0" in text
|
||||
@@ -255,6 +266,27 @@ def test_wazuh_become_password_projection_is_path_only_and_optional(
|
||||
assert "ANSIBLE_BECOME_PASSWORD_FILE" not in unrelated_spec.env
|
||||
|
||||
|
||||
def test_cd_projects_wazuh_privilege_reference_without_readback() -> None:
|
||||
workflow = CD_WORKFLOW.read_text(encoding="utf-8")
|
||||
|
||||
assert (
|
||||
"HOST112_ANSIBLE_BECOME_PASSWORD: "
|
||||
"${{ secrets.HOST112_ANSIBLE_BECOME_PASSWORD }}"
|
||||
) in workflow
|
||||
assert (
|
||||
'HOST112_ANSIBLE_BECOME_PASSWORD_B64="$(secret_b64_env '
|
||||
'HOST112_ANSIBLE_BECOME_PASSWORD)"'
|
||||
) in workflow
|
||||
assert '"path":"/data/HOST112_ANSIBLE_BECOME_PASSWORD"' in workflow
|
||||
assert "host112_become_secret_reference_injected=1" in workflow
|
||||
assert "host112_become_secret_projection_ready=1" in workflow
|
||||
assert (
|
||||
"test -s /run/secrets/host112-become/password && "
|
||||
"test -r /run/secrets/host112-become/password"
|
||||
) in workflow
|
||||
assert "kubectl get secret awoooi-secrets -o json" not in workflow
|
||||
|
||||
|
||||
def test_wazuh_ingress_convergence_uses_only_the_mutating_catalog() -> None:
|
||||
route = resolve_typed_alert_target(
|
||||
alertname="WazuhAlertmanagerIntegrationConvergence",
|
||||
@@ -511,6 +543,115 @@ async def test_wazuh_ingress_scheduler_records_one_high_risk_controlled_candidat
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_wazuh_ingress_scheduler_does_not_repeat_failed_check_while_capability_repair_is_open(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
from src.jobs import awooop_ansible_candidate_backfill_job as job
|
||||
|
||||
run_id = "00000000-0000-0000-0000-000000000572"
|
||||
|
||||
class _Mappings:
|
||||
def first(self):
|
||||
return {
|
||||
"op_id": run_id,
|
||||
"automation_run_id": run_id,
|
||||
"source_receipt_ref": "wazuh-alert:2026071500",
|
||||
"latest_check_status": "failed",
|
||||
"latest_apply_status": None,
|
||||
"latest_learning_status": None,
|
||||
"latest_controlled_capability_packet_status": "pending",
|
||||
"latest_controlled_capability_queue_status": "queued",
|
||||
"latest_controlled_capability_packet_expires_at": (
|
||||
"2026-07-15T06:29:59+08:00"
|
||||
),
|
||||
"predecision_evidence_ready": True,
|
||||
}
|
||||
|
||||
class _Result:
|
||||
def mappings(self):
|
||||
return _Mappings()
|
||||
|
||||
class _Db:
|
||||
async def execute(self, statement, params):
|
||||
query = str(statement)
|
||||
assert ":capability_packet_operation_type" in query
|
||||
assert params["capability_packet_operation_type"] == (
|
||||
"ansible_controlled_capability_repair_queued"
|
||||
)
|
||||
return _Result()
|
||||
|
||||
@asynccontextmanager
|
||||
async def fake_db_context(_project_id: str):
|
||||
yield _Db()
|
||||
|
||||
recorder = AsyncMock(return_value=True)
|
||||
collector = AsyncMock(return_value=MagicMock(snapshot_id="must-not-run"))
|
||||
verifier = AsyncMock(return_value=True)
|
||||
binder = AsyncMock(return_value=True)
|
||||
monkeypatch.setattr(job, "get_db_context", fake_db_context)
|
||||
monkeypatch.setattr(
|
||||
job.settings,
|
||||
"ENABLE_IWOOOS_WAZUH_MANAGER_POSTURE_EXECUTOR",
|
||||
True,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
job,
|
||||
"now_taipei",
|
||||
MagicMock(return_value=datetime.fromisoformat("2026-07-15T05:59:59+08:00")),
|
||||
)
|
||||
|
||||
result = await job.enqueue_iwooos_wazuh_alertmanager_integration_candidate_once(
|
||||
recorder=recorder,
|
||||
evidence_collector=collector,
|
||||
evidence_verifier=verifier,
|
||||
incident_binder=binder,
|
||||
source_recurrence=_current_wazuh_source_recurrence(
|
||||
"2026-07-15T05:59:58+08:00"
|
||||
),
|
||||
)
|
||||
|
||||
assert result["status"] == (
|
||||
"controlled_privilege_capability_repair_already_queued"
|
||||
)
|
||||
assert result["queued"] == 0
|
||||
assert result["retry_of_failed_check_mode"] is True
|
||||
assert result["active_blockers"] == [
|
||||
"wazuh_controlled_privilege_capability_repair_pending"
|
||||
]
|
||||
recorder.assert_not_awaited()
|
||||
collector.assert_not_awaited()
|
||||
verifier.assert_not_awaited()
|
||||
binder.assert_not_awaited()
|
||||
|
||||
|
||||
def test_wazuh_controlled_capability_packet_cooldown_expires() -> None:
|
||||
from src.jobs import awooop_ansible_candidate_backfill_job as job
|
||||
|
||||
observed_now = datetime.fromisoformat("2026-07-15T05:59:59+08:00")
|
||||
row = {
|
||||
"latest_controlled_capability_packet_status": "pending",
|
||||
"latest_controlled_capability_queue_status": "queued",
|
||||
"latest_controlled_capability_packet_expires_at": (
|
||||
"2026-07-15T06:29:59+08:00"
|
||||
),
|
||||
}
|
||||
|
||||
assert job._controlled_capability_packet_is_active(
|
||||
row,
|
||||
observed_now=observed_now,
|
||||
) is True
|
||||
assert job._controlled_capability_packet_is_active(
|
||||
{
|
||||
**row,
|
||||
"latest_controlled_capability_packet_expires_at": (
|
||||
"2026-07-15T05:59:58+08:00"
|
||||
),
|
||||
},
|
||||
observed_now=observed_now,
|
||||
) is False
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_wazuh_ingress_scheduler_fails_closed_without_current_recurrence(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
|
||||
Reference in New Issue
Block a user