diff --git a/services/aios-release-controller/aios_release_controller/cli.py b/services/aios-release-controller/aios_release_controller/cli.py new file mode 100644 index 0000000..bb10474 --- /dev/null +++ b/services/aios-release-controller/aios_release_controller/cli.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +import argparse +import json +from pathlib import Path + +from .manifest import ( + ManifestValidationError, + build_approval_request, + validate_release_request, + validate_source_manifest, +) + + +def main() -> int: + parser = argparse.ArgumentParser() + sub = parser.add_subparsers(dest="command", required=True) + source = sub.add_parser("validate-source") + source.add_argument("manifest", type=Path) + source.add_argument("--base-oid", required=True) + release = sub.add_parser("validate-release") + release.add_argument("source_manifest", type=Path) + release.add_argument("request", type=Path) + release.add_argument("--main-oid") + approval = sub.add_parser("approval-request") + approval.add_argument("source_manifest", type=Path) + approval.add_argument("--target-oid", required=True) + approval.add_argument("--artifact-uri", required=True) + approval.add_argument("--artifact-sha256", required=True) + approval.add_argument("--artifact-size", required=True, type=int) + approval.add_argument("--evidence-closure-oid", required=True) + approval.add_argument("--rollback-metadata", required=True) + approval.add_argument("--current-tag-oid", required=True) + args = parser.parse_args() + try: + if args.command == "validate-source": + result = validate_source_manifest(args.manifest, args.base_oid) + elif args.command == "validate-release": + source_data = json.loads(args.source_manifest.read_text(encoding="utf-8")) + source = validate_source_manifest(args.source_manifest, source_data["base_oid"]) + result = validate_release_request(source, args.request, args.main_oid) + else: + result = build_approval_request( + source_manifest_path=args.source_manifest, + target_oid=args.target_oid, + artifact_uri=args.artifact_uri, + artifact_sha256=args.artifact_sha256, + artifact_size=args.artifact_size, + evidence_closure_oid=args.evidence_closure_oid, + rollback_metadata=args.rollback_metadata, + current_tag_oid=args.current_tag_oid, + ) + print(json.dumps(result, sort_keys=True)) + return 0 + except (ManifestValidationError, OSError, ValueError, KeyError) as exc: + code = exc.code if isinstance(exc, ManifestValidationError) else "VALIDATION_ERROR"