migrate_n8n_workflow.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. """Convert one exported n8n workflow into governed migration artifacts."""
  2. from __future__ import annotations
  3. import argparse
  4. import json
  5. from pathlib import Path
  6. from app.core.orchestration.migration.dual_run import (
  7. MigrationBlocked,
  8. N8nWorkflowConverter,
  9. )
  10. def convert_export(
  11. workflow,
  12. *,
  13. dataflow_uid,
  14. data_source_uids,
  15. ):
  16. try:
  17. converted = N8nWorkflowConverter().convert(
  18. workflow,
  19. dataflow_uid=dataflow_uid,
  20. data_source_uids=data_source_uids,
  21. )
  22. except MigrationBlocked as exc:
  23. return exc.report
  24. return {
  25. "status": "converted",
  26. "source_workflow_id": converted.source_workflow_id,
  27. "definition_hash": converted.definition_hash,
  28. "workflow_spec": converted.workflow_spec,
  29. "schedule_plan": converted.schedule_plan,
  30. "deployment_performed": False,
  31. }
  32. def main() -> int:
  33. parser = argparse.ArgumentParser(
  34. description=(
  35. "Convert one n8n export without deploying it or copying credentials."
  36. )
  37. )
  38. parser.add_argument("--workflow-json", required=True)
  39. parser.add_argument("--dataflow-uid", required=True)
  40. parser.add_argument("--datasource-map-json", required=True)
  41. parser.add_argument("--output", required=True)
  42. args = parser.parse_args()
  43. workflow = json.loads(
  44. Path(args.workflow_json).read_text(encoding="utf-8")
  45. )
  46. mapping = json.loads(
  47. Path(args.datasource_map_json).read_text(encoding="utf-8")
  48. )
  49. if not isinstance(mapping, dict):
  50. raise ValueError("datasource map must be an object")
  51. report = convert_export(
  52. workflow,
  53. dataflow_uid=args.dataflow_uid,
  54. data_source_uids=mapping,
  55. )
  56. Path(args.output).write_text(
  57. json.dumps(report, ensure_ascii=False, indent=2) + "\n",
  58. encoding="utf-8",
  59. )
  60. return 0 if report["status"] == "converted" else 2
  61. if __name__ == "__main__":
  62. raise SystemExit(main())