from __future__ import annotations
import argparse
import json
import subprocess
import sys
from pathlib import Path
from typing import Any, Dict, Sequence
ROOT = Path(__file__).resolve().parents[1]
def parse_args(argv: Sequence[str]) -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Write the Iridium service install/package report artifacts"
)
parser.add_argument("--report-dir", default="artifacts")
parser.add_argument("--report-prefix", default="service_install")
parser.add_argument("--listen", default="127.0.0.1:7001")
parser.add_argument("--telemetry-endpoint", default="stdout")
parser.add_argument("--tls", default="operator-optional")
parser.add_argument("--admin-token", default="local-dev")
parser.add_argument(
"--binary",
default=str(ROOT / "target" / "debug" / "ir"),
help="Path to the Iridium CLI binary",
)
return parser.parse_args(argv)
def run_json(command: list[str]) -> Dict[str, Any]:
completed = subprocess.run(
command,
cwd=ROOT,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
check=True,
)
return json.loads(completed.stdout)
def run_command(command: list[str]) -> None:
subprocess.run(
command,
cwd=ROOT,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
check=True,
)
def load_json(path: Path) -> Dict[str, Any]:
return json.loads(path.read_text(encoding="utf-8"))
def write_markdown(path: Path, payload: Dict[str, Any]) -> None:
md_lines = [
"# Service Install Report",
"",
f"- schema: `{payload['schema']}`",
f"- package_name: `{payload['package_identity']['name']}`",
f"- package_version: `{payload['package_identity']['version']}`",
f"- deployment_profile_id: `{payload['package_identity']['deployment_profile_id']}`",
f"- maturity_tier: `{payload['package_identity']['maturity_tier']}`",
f"- support_band: `{payload['package_identity']['support_band']}`",
f"- artifact_class: `{payload['package_identity']['artifact_class']}`",
"",
"## Install Inputs",
f"- schema_id: `{payload['install_inputs']['schema_id']}`",
f"- listen_address: `{payload['install_inputs']['listen_address']}`",
f"- telemetry_endpoint: `{payload['install_inputs']['telemetry_endpoint']}`",
f"- tls_mode: `{payload['install_inputs']['tls_mode']}`",
f"- admin_token_configured: `{str(payload['install_inputs']['admin_token_configured']).lower()}`",
f"- data_directory: `{payload['install_inputs']['data_directory']}`",
"",
"## Release Outputs",
f"- runbook: `{payload['release_outputs']['operator_runbook']}`",
f"- compatibility_report: `{payload['release_outputs']['compatibility_report']}`",
f"- lifecycle_report: `{payload['release_outputs']['lifecycle_report']}`",
f"- service_candidate_report: `{payload['release_outputs']['service_candidate_report']}`",
f"- evidence_report: `{payload['release_outputs']['evidence_report']}`",
"",
"## Shared References",
f"- support_band_guidance: `{payload['shared_references']['support_band_guidance']}`",
f"- install_release_conventions: `{payload['shared_references']['install_release_conventions']}`",
f"- operator_runbook_template: `{payload['shared_references']['operator_runbook_template']}`",
f"- compatibility_matrix: `{payload['shared_references']['compatibility_matrix']}`",
f"- incident_taxonomy: `{payload['shared_references']['incident_taxonomy']}`",
]
path.write_text("\n".join(md_lines) + "\n", encoding="utf-8")
def main(argv: Sequence[str]) -> int:
args = parse_args(argv)
report_dir = Path(args.report_dir)
report_dir.mkdir(parents=True, exist_ok=True)
run_command(
[
sys.executable,
str(ROOT / "scripts" / "service_compatibility_report.py"),
"--report-dir",
str(report_dir),
"--listen",
args.listen,
"--telemetry-endpoint",
args.telemetry_endpoint,
"--tls",
args.tls,
"--admin-token",
args.admin_token,
"--binary",
args.binary,
]
)
service = run_json([args.binary, "service-report", "--listen", args.listen])
compatibility = load_json(report_dir / "service_compatibility_report.json")
payload = {
"schema": "iridium.service-install-report.v1",
"package_identity": {
"name": "iridium-service-candidate",
"version": "0.1.0",
"deployment_profile_id": service["profile_id"],
"maturity_tier": "single-node-production-candidate",
"support_band": service["support_band"],
"artifact_class": "package",
},
"install_inputs": {
"schema_id": service["schema_id"],
"listen_address": service["listen_address"],
"telemetry_endpoint": args.telemetry_endpoint,
"tls_mode": args.tls,
"admin_token_configured": bool(args.admin_token),
"data_directory": "<service-root>/data",
},
"release_outputs": {
"install_instructions": "docs/service_install.md",
"operator_runbook": "docs/service_single_node.md",
"compatibility_report": "artifacts/service_compatibility_report.json",
"lifecycle_report": "artifacts/service_lifecycle_report.json",
"service_candidate_report": "artifacts/service_candidate_report.json",
"evidence_report": "artifacts/retrieval_quality_service_report.json",
},
"shared_references": {
"support_band_guidance": "../alloy/docs/support-band-guidance.md",
"install_release_conventions": "../alloy/docs/install-release-conventions.md",
"operator_runbook_template": "../alloy/docs/operator-runbook-template.md",
"compatibility_matrix": "../alloy/docs/compatibility-matrix.md",
"incident_taxonomy": "../alloy/docs/incident-taxonomy.md",
},
"compatibility_gate": compatibility["compatibility_gate"],
}
json_path = report_dir / f"{args.report_prefix}_report.json"
md_path = report_dir / f"{args.report_prefix}_report.md"
json_path.write_text(json.dumps(payload, indent=2), encoding="utf-8")
write_markdown(md_path, payload)
print(f"wrote: {json_path}")
print(f"wrote: {md_path}")
return 0 if compatibility["compatibility_gate"]["overall_compatible"] else 1
if __name__ == "__main__":
raise SystemExit(main(sys.argv[1:]))