70 lines
2.6 KiB
Python
70 lines
2.6 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
import tempfile
|
|
|
|
|
|
def runtime_state(component: str, prior_invocations: int = 0) -> dict:
|
|
return {
|
|
"component": component,
|
|
"deployment_mode": "DORMANT_SHADOW_ONLY",
|
|
"enabled": False,
|
|
"active": False,
|
|
"production_routing": False,
|
|
"production_mutation": False,
|
|
"global_gitops_writes_enabled": False,
|
|
"prior_invocations": prior_invocations,
|
|
"restart_recovery": prior_invocations > 0,
|
|
}
|
|
|
|
|
|
def checkpoint_state(component: str, root: Path) -> dict:
|
|
root.mkdir(parents=True, exist_ok=True)
|
|
destination = root / f"{component}.json"
|
|
prior = 0
|
|
if destination.exists():
|
|
previous = json.loads(destination.read_text(encoding="utf-8"))
|
|
if previous.get("component") != component or previous.get("deployment_mode") != "DORMANT_SHADOW_ONLY":
|
|
raise RuntimeError("checkpoint identity mismatch")
|
|
prior = int(previous.get("invocations", 0))
|
|
state = runtime_state(component, prior)
|
|
checkpoint = {**state, "invocations": prior + 1}
|
|
with tempfile.NamedTemporaryFile("w", encoding="utf-8", dir=root, delete=False) as handle:
|
|
json.dump(checkpoint, handle, sort_keys=True)
|
|
handle.write("\n")
|
|
handle.flush()
|
|
temporary = Path(handle.name)
|
|
temporary.replace(destination)
|
|
return state
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--component", required=True, choices=("owner-review-adapter", "machine-status-producer"))
|
|
parser.add_argument("--self-check", action="store_true")
|
|
parser.add_argument("--activate", action="store_true")
|
|
parser.add_argument("--checkpoint-dir", type=Path)
|
|
args = parser.parse_args(argv)
|
|
if args.activate:
|
|
parser.error("activation is not authorized by the prerequisites candidate")
|
|
if os.environ.get("AIOS_SINGLE_OWNER_GOVERNANCE_ENABLED", "false").lower() != "false":
|
|
parser.error("candidate must remain disabled")
|
|
if os.environ.get("AIOS_SINGLE_OWNER_ACTIVATION_ACTIVE", "false").lower() != "false":
|
|
parser.error("activation must remain inactive")
|
|
if os.environ.get("AIOS_GITOPS_WRITES_ENABLED", "false").lower() != "false":
|
|
parser.error("production mutation must remain disabled")
|
|
state = (
|
|
checkpoint_state(args.component, args.checkpoint_dir)
|
|
if args.checkpoint_dir is not None
|
|
else runtime_state(args.component)
|
|
)
|
|
print(json.dumps(state, sort_keys=True))
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|