fix(reboot): package windows99 vmx source repair check mode
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / build-and-deploy (push) Has been cancelled
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / tests (push) Has been cancelled

This commit is contained in:
Your Name
2026-07-03 10:52:48 +08:00
parent e23fe78ada
commit c7bb7d4ffd
3 changed files with 369 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
from __future__ import annotations
import importlib.util
import json
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 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_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"] == (
"build_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
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,
)
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