cli.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from __future__ import annotations
  2. import argparse
  3. import json
  4. import logging
  5. from supply_infra.pipeline.reconciler import PipelineReconciler, reconcile_once
  6. from supply_infra.pipeline.run_service import (
  7. get_pipeline_run,
  8. submit_pipeline_run,
  9. )
  10. from supply_infra.pipeline.worker import PipelineWorker
  11. def _parser() -> argparse.ArgumentParser:
  12. parser = argparse.ArgumentParser(description="SupplyAgent durable pipeline control")
  13. sub = parser.add_subparsers(dest="command", required=True)
  14. submit = sub.add_parser("submit")
  15. submit.add_argument("--biz-dt")
  16. submit.add_argument("--reason")
  17. submit.add_argument(
  18. "--dry-run",
  19. action="store_true",
  20. help="execute all local steps but record AIGC effects without dispatching them",
  21. )
  22. inspect = sub.add_parser("inspect")
  23. inspect.add_argument("--run-id", required=True)
  24. sub.add_parser("worker")
  25. sub.add_parser("reconciler")
  26. sub.add_parser("reconcile-once")
  27. return parser
  28. def main() -> None:
  29. logging.basicConfig(
  30. level=logging.INFO,
  31. format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
  32. )
  33. args = _parser().parse_args()
  34. if args.command == "submit":
  35. result = submit_pipeline_run(
  36. biz_dt=args.biz_dt,
  37. trigger_type="cli",
  38. trigger_source="cli",
  39. trigger_reason=args.reason,
  40. dry_run=args.dry_run,
  41. ).to_dict()
  42. print(json.dumps(result, ensure_ascii=False))
  43. return
  44. if args.command == "inspect":
  45. result = get_pipeline_run(args.run_id)
  46. print(json.dumps(result, ensure_ascii=False, default=str))
  47. raise SystemExit(0 if result is not None else 1)
  48. if args.command == "worker":
  49. PipelineWorker().run_forever()
  50. return
  51. if args.command == "reconciler":
  52. PipelineReconciler().run_forever()
  53. return
  54. print(json.dumps(reconcile_once(), ensure_ascii=False))
  55. if __name__ == "__main__":
  56. main()