All checks were successful
CD Pipeline / workflow-shape (push) Successful in 1s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 2m12s
AWOOOI Harbor 110 Local Repair / workflow-shape (push) Successful in 0s
AWOOOI Harbor 110 Local Repair / harbor-110-local-repair (push) Successful in 16s
CD Pipeline / build-and-deploy (push) Successful in 4m13s
CD Pipeline / post-deploy-checks (push) Successful in 1m55s
183 lines
6.6 KiB
Python
183 lines
6.6 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import json
|
|
import os
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[3]
|
|
SCRIPT = (
|
|
ROOT
|
|
/ "scripts"
|
|
/ "reboot-recovery"
|
|
/ "build-windows99-vmx-source-repair-package.py"
|
|
)
|
|
|
|
|
|
def _load_module():
|
|
spec = importlib.util.spec_from_file_location(
|
|
"windows99_vmx_source_repair_package",
|
|
SCRIPT,
|
|
)
|
|
assert spec is not None
|
|
module = importlib.util.module_from_spec(spec)
|
|
assert spec.loader is not None
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def _scorecard() -> dict:
|
|
return {
|
|
"status": "blocked_reboot_auto_recovery_slo_not_ready",
|
|
"generated_at": "2026-07-03T10:45:28+08:00",
|
|
"windows99_vmware_autostart": {
|
|
"required_vm_aliases": ["111", "188", "120", "121", "112"],
|
|
"missing_vmx_aliases": ["111"],
|
|
"powered_off_aliases": ["111", "112", "120", "121", "188"],
|
|
},
|
|
"readback": {
|
|
"windows99_no_secret_collector_status": (
|
|
"collected_windows99_vmware_verify_stdout"
|
|
)
|
|
},
|
|
}
|
|
|
|
|
|
def test_package_routes_missing_vmx_to_source_repair_check_mode() -> None:
|
|
module = _load_module()
|
|
|
|
payload = module.build_package(
|
|
_scorecard(),
|
|
generated_at="2026-07-03T10:46:00+08:00",
|
|
)
|
|
|
|
assert payload["schema_version"] == (
|
|
"windows99_vmx_source_repair_check_mode_package_v1"
|
|
)
|
|
assert payload["status"] == (
|
|
"check_mode_package_ready_windows99_vmx_source_repair_required"
|
|
)
|
|
assert payload["package_ready"] is True
|
|
assert payload["apply_allowed_by_this_package"] is False
|
|
assert payload["missing_vmx_aliases"] == ["111"]
|
|
assert payload["safe_next_step"] == (
|
|
"restore_windows99_missing_vmx_source_for_aliases_then_rerun_no_secret_"
|
|
"collector_and_scorecard_no_vm_power_change"
|
|
)
|
|
row_by_alias = {row["alias"]: row for row in payload["vm_rows"]}
|
|
assert row_by_alias["111"]["missing_vmx_source"] is True
|
|
assert row_by_alias["111"]["controlled_restore_required"] is True
|
|
assert row_by_alias["111"]["check_mode_probe_commands"] == [
|
|
(
|
|
"Test-Path -LiteralPath 'D:\\Documents\\Virtual Machines\\"
|
|
"192.168.0.111_Ubuntu_64-bit\\192.168.0.111_Ubuntu_64-bit.vmx'"
|
|
)
|
|
]
|
|
assert payload["work_order_id"] == "windows99-vmx-source-repair-111"
|
|
assert payload["action_stage"] == "source_repair_check_mode_ready"
|
|
assert (
|
|
payload["next_executable_step"]
|
|
== "locate_or_relink_missing_vmx_source_check_mode"
|
|
)
|
|
assert payload["check_mode_allowed_by_this_package"] is True
|
|
assert payload["rollback_required"] is True
|
|
assert payload["vm_power_change_allowed"] is False
|
|
assert payload["destructive_restore_allowed"] is False
|
|
action_chain = payload["action_chain"]
|
|
assert action_chain["target_selector"]["vm_aliases"] == ["111"]
|
|
assert action_chain["source_of_truth_diff"][0]["current_state"] == (
|
|
"expected_vmx_source_missing"
|
|
)
|
|
assert action_chain["check_mode"]["probe_command_count"] == 1
|
|
assert action_chain["controlled_apply_candidate"]["executor"] == (
|
|
"windows99_no_secret_management_channel_or_local_console"
|
|
)
|
|
assert action_chain["execution_boundary"]["execution_authorized_by_this_package"] is False
|
|
assert action_chain["post_apply_verifier_count"] == 5
|
|
assert action_chain["learning_writeback_ref_count"] == 6
|
|
assert payload["target_vm_aliases"] == ["111"]
|
|
assert payload["check_mode_probe_command_count"] == 1
|
|
assert payload["controlled_apply_candidate_status"] == (
|
|
"candidate_waiting_existing_vmx_source_or_backup_path"
|
|
)
|
|
assert payload["controlled_apply_candidate_executor"] == (
|
|
"windows99_no_secret_management_channel_or_local_console"
|
|
)
|
|
assert payload["post_apply_verifier_count"] == 5
|
|
assert payload["learning_writeback_ref_count"] == 6
|
|
assert payload["km_writeback_ref"].startswith("km://awoooi/reboot-slo/")
|
|
assert payload["playbook_trust_writeback_ref"].startswith(
|
|
"playbook://awoooi/windows99-vmx-source-repair/"
|
|
)
|
|
assert row_by_alias["188"]["missing_vmx_source"] is False
|
|
assert payload["operation_boundaries"]["vm_power_change_performed"] is False
|
|
assert payload["operation_boundaries"]["secret_value_read"] is False
|
|
assert "vm_power_change" in payload["forbidden_actions"]
|
|
assert "read_windows_password_or_secret" in payload["forbidden_actions"]
|
|
|
|
|
|
def test_package_prefers_existing_scorecard_package_readback() -> None:
|
|
module = _load_module()
|
|
scorecard = _scorecard()
|
|
scorecard["windows99_vmx_source_repair_package"] = {
|
|
"schema_version": "windows99_vmx_source_repair_check_mode_package_v1",
|
|
"sentinel": "from_scorecard_api",
|
|
}
|
|
|
|
payload = module.build_package(scorecard)
|
|
|
|
assert payload["sentinel"] == "from_scorecard_api"
|
|
|
|
|
|
def test_package_routes_power_only_to_autostart_check_mode() -> None:
|
|
module = _load_module()
|
|
scorecard = _scorecard()
|
|
scorecard["windows99_vmware_autostart"]["missing_vmx_aliases"] = []
|
|
|
|
payload = module.build_package(scorecard)
|
|
|
|
assert payload["status"] == (
|
|
"check_mode_package_ready_windows99_power_check_required"
|
|
)
|
|
assert payload["safe_next_step"] == (
|
|
"run_windows99_vmware_autostart_check_mode_package_for_powered_off_"
|
|
"aliases_then_rerun_no_secret_collector_no_vm_power_change"
|
|
)
|
|
assert payload["vm_rows"][0]["powered_off"] is True
|
|
assert payload["apply_allowed_by_this_package"] is False
|
|
assert payload["action_stage"] == "power_readback_check_mode_ready"
|
|
assert payload["next_executable_step"] == (
|
|
"build_vmware_autostart_power_readback_check_mode"
|
|
)
|
|
|
|
|
|
def test_cli_writes_package_file(tmp_path: Path) -> None:
|
|
scorecard = tmp_path / "scorecard.json"
|
|
output = tmp_path / "package.json"
|
|
scorecard.write_text(json.dumps(_scorecard()), encoding="utf-8")
|
|
|
|
result = subprocess.run(
|
|
[
|
|
"python3.11",
|
|
str(SCRIPT),
|
|
"--scorecard-file",
|
|
str(scorecard),
|
|
"--generated-at",
|
|
"2026-07-03T10:46:00+08:00",
|
|
"--output",
|
|
str(output),
|
|
],
|
|
cwd=ROOT,
|
|
capture_output=True,
|
|
text=True,
|
|
check=False,
|
|
env={key: value for key, value in os.environ.items() if key != "DATABASE_URL"},
|
|
)
|
|
|
|
assert result.returncode == 0
|
|
payload = json.loads(output.read_text(encoding="utf-8"))
|
|
assert payload["missing_vmx_aliases"] == ["111"]
|
|
assert payload["operation_boundaries"]["remote_write_performed"] is False
|