103 lines
4.0 KiB
Python
103 lines
4.0 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from .common import HashChainAudit
|
|
from .ledger import OperationLedger
|
|
from .mirror import ApprovalMirrorWorker
|
|
from .policy import DevelopmentPolicy
|
|
from .projection import ReleaseObjectProjector, RuntimeSourceProjector
|
|
from .renewal import RenewalController
|
|
from .writer import CommitRequest, GovernedDevelopmentWriter
|
|
|
|
|
|
def load_json(path: Path) -> dict:
|
|
value = json.loads(path.read_text(encoding="utf-8"))
|
|
if not isinstance(value, dict):
|
|
raise SystemExit("JSON object required")
|
|
return value
|
|
|
|
|
|
def build_parser() -> argparse.ArgumentParser:
|
|
parser = argparse.ArgumentParser()
|
|
commands = parser.add_subparsers(dest="command", required=True)
|
|
|
|
writer = commands.add_parser("writer-commit")
|
|
writer.add_argument("--policy", type=Path, required=True)
|
|
writer.add_argument("--request", type=Path, required=True)
|
|
writer.add_argument("--worktree", type=Path, required=True)
|
|
writer.add_argument("--remote", required=True)
|
|
writer.add_argument("--ledger", type=Path, required=True)
|
|
writer.add_argument("--audit", type=Path, required=True)
|
|
|
|
mirror = commands.add_parser("mirror")
|
|
mirror.add_argument("--source-git-dir", type=Path, required=True)
|
|
mirror.add_argument("--authoritative-git-dir", type=Path, required=True)
|
|
mirror.add_argument("--target-oid", required=True)
|
|
|
|
runtime = commands.add_parser("runtime-project")
|
|
runtime.add_argument("--path", action="append", type=Path, required=True)
|
|
runtime.add_argument("--output", type=Path, required=True)
|
|
runtime.add_argument("--task-id", required=True)
|
|
|
|
release = commands.add_parser("release-project")
|
|
release.add_argument("--source-git-dir", type=Path, required=True)
|
|
release.add_argument("--commit-oid", required=True)
|
|
release.add_argument("--tree-oid", required=True)
|
|
release.add_argument("--output", type=Path, required=True)
|
|
release.add_argument("--path", action="append", required=True)
|
|
|
|
renew = commands.add_parser("renew")
|
|
renew.add_argument("--standing-policy", type=Path, required=True)
|
|
renew.add_argument("--previous-manifest", type=Path, required=True)
|
|
renew.add_argument("--observation", type=Path, required=True)
|
|
|
|
return parser
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
args = build_parser().parse_args(argv)
|
|
os.environ.setdefault("AIOS_GITOPS_WRITES_ENABLED", "false")
|
|
|
|
if args.command == "writer-commit":
|
|
policy = DevelopmentPolicy.from_mapping(load_json(args.policy))
|
|
request_value = load_json(args.request)
|
|
content_path = Path(request_value.pop("content_path"))
|
|
request = CommitRequest(content=content_path.read_bytes(), **request_value)
|
|
result = GovernedDevelopmentWriter(
|
|
worktree=args.worktree,
|
|
remote=args.remote,
|
|
policy=policy,
|
|
ledger=OperationLedger(args.ledger),
|
|
audit=HashChainAudit(args.audit),
|
|
).commit_file(request)
|
|
elif args.command == "mirror":
|
|
result = ApprovalMirrorWorker(
|
|
args.source_git_dir, args.authoritative_git_dir
|
|
).mirror(expected_target_oid=args.target_oid).__dict__
|
|
elif args.command == "runtime-project":
|
|
result = RuntimeSourceProjector(args.path).collect(args.output, args.task_id)
|
|
elif args.command == "release-project":
|
|
result = ReleaseObjectProjector(args.source_git_dir).project(
|
|
commit_oid=args.commit_oid,
|
|
expected_tree_oid=args.tree_oid,
|
|
output_path=args.output,
|
|
allowed_paths=args.path,
|
|
).__dict__
|
|
result["output_path"] = str(result["output_path"])
|
|
else:
|
|
result = RenewalController().decide(
|
|
standing_policy=load_json(args.standing_policy),
|
|
previous_manifest=load_json(args.previous_manifest),
|
|
observation=load_json(args.observation),
|
|
).__dict__
|
|
print(json.dumps(result, sort_keys=True, default=str))
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|