diff --git a/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py b/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py index a4eda337e..2cb852dd5 100644 --- a/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py +++ b/apps/api/src/services/reboot_auto_recovery_slo_scorecard.py @@ -475,19 +475,60 @@ def _apply_prometheus_windows99_vmware_readback( payload["windows99_vmware_verify_ready"] = verify_ready payload["windows99_update_no_auto_reboot_ready"] = update_ready + required_checks = _dict(payload.setdefault("required_checks", {})) + required_checks["windows99_vmware_autostart_ready"] = verify_ready + required_checks["windows_update_no_auto_reboot_ready"] = update_ready + if verify_ready: + required_checks["windows99_management_channel_ready"] = True + readback = _dict(payload.setdefault("readback", {})) + readback["windows99_vmware_readback_present"] = True readback["windows99_vmware_verify_ready"] = verify_ready + readback["windows99_vmrun_present"] = True + readback["windows99_vmware_config_ready"] = not missing_vmx_aliases + readback["windows99_vmware_power_ready"] = not powered_off_aliases readback["windows99_update_no_auto_reboot_ready"] = update_ready readback["windows99_runtime_metric_overlay_applied"] = True readback["windows99_missing_vmx_aliases"] = missing_vmx_aliases readback["windows99_powered_off_aliases"] = powered_off_aliases + collection = _dict(payload.setdefault("windows99_verify_collection", {})) + preserved_collection_blockers = [ + blocker + for blocker in _strings(collection.get("collection_blockers")) + if blocker != "windows99_vmware_autostart_readback_missing" + ] + collection.update( + { + "readback_present": True, + "verify_ready": verify_ready, + "status": ( + "ready_windows99_vmware_verify_readback_green" + if verify_ready + else "blocked_windows99_verify_collection_not_ready" + ), + "collection_blockers": _unique_strings( + windows99_blockers + preserved_collection_blockers + ), + } + ) + rollups = _dict(payload.setdefault("rollups", {})) + rollups["windows99_vmware_readback_present"] = True + rollups["windows99_vmrun_present"] = True + rollups["windows99_vmware_config_ready"] = not missing_vmx_aliases + rollups["windows99_vmware_power_ready"] = not powered_off_aliases rollups["windows99_vmware_verify_ready"] = verify_ready rollups["windows99_update_no_auto_reboot_ready"] = update_ready rollups["windows99_runtime_metric_overlay_applied"] = True + rollups["windows99_vmware_missing_vmx_count"] = len(missing_vmx_aliases) + rollups["windows99_vmware_powered_off_count"] = len(powered_off_aliases) rollups["windows99_missing_vmx_alias_count"] = len(missing_vmx_aliases) rollups["windows99_powered_off_alias_count"] = len(powered_off_aliases) + rollups["windows99_verify_collection_status"] = collection["status"] + rollups["windows99_verify_collection_blocker_count"] = len( + _strings(collection.get("collection_blockers")) + ) def _reconcile_prometheus_metric_active_blockers_with_source_controls( diff --git a/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py b/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py index 6937f289d..e27a92cd5 100644 --- a/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py +++ b/apps/api/tests/test_reboot_auto_recovery_slo_scorecard_api.py @@ -301,8 +301,33 @@ def test_reboot_auto_recovery_slo_scorecard_overlays_prometheus_runtime_metrics( "windows99_vmware_guest_power_not_ready", "windows99_vmware_vmx_missing", ] + assert payload["readback"]["windows99_vmware_readback_present"] is True + assert payload["readback"]["windows99_vmrun_present"] is True + assert payload["readback"]["windows99_vmware_config_ready"] is False + assert payload["readback"]["windows99_vmware_power_ready"] is False + assert payload["readback"]["windows99_update_no_auto_reboot_ready"] is True assert payload["readback"]["windows99_runtime_metric_overlay_applied"] is True + assert ( + payload["windows99_verify_collection"]["status"] + == "blocked_windows99_verify_collection_not_ready" + ) + assert payload["windows99_verify_collection"]["readback_present"] is True + assert ( + "windows99_vmware_autostart_readback_missing" + not in payload["windows99_verify_collection"]["collection_blockers"] + ) + assert payload["rollups"]["windows99_vmware_readback_present"] is True + assert payload["rollups"]["windows99_vmrun_present"] is True + assert payload["rollups"]["windows99_vmware_config_ready"] is False + assert payload["rollups"]["windows99_vmware_power_ready"] is False + assert payload["rollups"]["windows99_update_no_auto_reboot_ready"] is True + assert payload["rollups"]["windows99_vmware_missing_vmx_count"] == 1 + assert payload["rollups"]["windows99_vmware_powered_off_count"] == 5 assert payload["rollups"]["windows99_missing_vmx_alias_count"] == 1 + assert payload["rollups"]["windows99_powered_off_alias_count"] == 5 + assert payload["rollups"]["windows99_verify_collection_status"] == ( + "blocked_windows99_verify_collection_not_ready" + ) action_by_blocker = { item["blocker"]: item for item in payload["active_blocker_action_matrix"]["items"]