diff --git a/apps/api/src/services/harbor_registry_controlled_recovery_receipt.py b/apps/api/src/services/harbor_registry_controlled_recovery_receipt.py index 0676806e..1dcf59ec 100644 --- a/apps/api/src/services/harbor_registry_controlled_recovery_receipt.py +++ b/apps/api/src/services/harbor_registry_controlled_recovery_receipt.py @@ -24,6 +24,7 @@ def validate_harbor_registry_controlled_recovery_receipt( ssh_diagnosis_output = _text( receipt_payload.get("ssh_publickey_diagnosis_output") ) + local_console_output = _text(receipt_payload.get("local_console_recovery_output")) ssh_local_output = _text(receipt_payload.get("ssh_local_repair_output")) watchdog_check_output = _text(receipt_payload.get("watchdog_check_output")) watchdog_repair_output = _text(receipt_payload.get("watchdog_repair_output")) @@ -34,14 +35,24 @@ def validate_harbor_registry_controlled_recovery_receipt( receipt_payload.get("non110_runner_readiness_output") ) - ssh_diagnosis = _parse_ssh_publickey_diagnosis_output(ssh_diagnosis_output) - ssh_local = _parse_ssh_local_repair_output(ssh_local_output) - watchdog_check = _parse_watchdog_output(watchdog_check_output) - watchdog_repair = _parse_watchdog_output(watchdog_repair_output) - controlled_cd_lane = _parse_controlled_cd_lane_readiness_output( - controlled_cd_lane_output + ssh_diagnosis = _parse_ssh_publickey_diagnosis_output( + _receipt_output(ssh_diagnosis_output, local_console_output) + ) + ssh_local = _parse_ssh_local_repair_output( + _receipt_output(ssh_local_output, local_console_output) + ) + watchdog_check = _parse_watchdog_output( + _receipt_output(watchdog_check_output, local_console_output) + ) + watchdog_repair = _parse_watchdog_output( + _receipt_output(watchdog_repair_output, local_console_output) + ) + controlled_cd_lane = _parse_controlled_cd_lane_readiness_output( + _receipt_output(controlled_cd_lane_output, local_console_output) + ) + non110_runner = _parse_non110_runner_readiness_output( + _receipt_output(non110_runner_output, local_console_output) ) - non110_runner = _parse_non110_runner_readiness_output(non110_runner_output) verifier = _post_apply_verifier(receipt_payload) gitea_queue = _gitea_queue_readback( receipt_payload.get("gitea_actions_queue_readback") @@ -105,6 +116,7 @@ def validate_harbor_registry_controlled_recovery_receipt( ssh_diagnosis_output ), "ssh_local_repair_output": _text_stats(ssh_local_output), + "local_console_recovery_output": _text_stats(local_console_output), "watchdog_check_output": _text_stats(watchdog_check_output), "watchdog_repair_output": _text_stats(watchdog_repair_output), "controlled_cd_lane_readiness_output": _text_stats( @@ -2142,6 +2154,12 @@ def _text(value: Any) -> str: return value if isinstance(value, str) else "" +def _receipt_output(specific_output: str, local_console_output: str) -> str: + if specific_output.strip(): + return specific_output + return local_console_output + + def _text_stats(value: str) -> dict[str, Any]: return { "provided": bool(value), diff --git a/apps/api/tests/test_harbor_registry_controlled_recovery_receipt.py b/apps/api/tests/test_harbor_registry_controlled_recovery_receipt.py index ec2fcb73..f3d86119 100644 --- a/apps/api/tests/test_harbor_registry_controlled_recovery_receipt.py +++ b/apps/api/tests/test_harbor_registry_controlled_recovery_receipt.py @@ -147,6 +147,34 @@ def test_harbor_recovery_receipt_surfaces_ssh_local_metadata_blockers() -> None: assert "secret-token-like-content" not in str(payload) +def test_harbor_recovery_receipt_accepts_combined_local_console_output() -> None: + payload = validate_harbor_registry_controlled_recovery_receipt( + { + "local_console_recovery_output": "\n".join( + [ + "AWOOOI_110_CONTROL_PATH_AND_HARBOR_LOCAL_RECOVERY mode=check requested_mode=--check target_user=wooo", + "operation_boundary_secret_value_read=false", + "operation_boundary_docker_daemon_restart_performed=false", + _ssh_local_apply_output(), + ] + ) + } + ) + + assert payload["status"] == ( + "ssh_local_repair_receipt_waiting_harbor_watchdog_check" + ) + assert payload["readback"]["ssh_local_repair"]["receipt_seen"] is True + assert payload["readback"]["ssh_local_repair"][ + "control_channel_metadata_ready" + ] is True + assert payload["input_redaction"]["ssh_local_repair_output"]["provided"] is False + assert payload["input_redaction"]["local_console_recovery_output"][ + "provided" + ] is True + assert payload["input_redaction"]["raw_output_returned"] is False + + def test_harbor_recovery_receipt_routes_unhealthy_check_to_repair_once() -> None: payload = validate_harbor_registry_controlled_recovery_receipt( {