# Session Management Workflow - 事例1ベースのテスト用YAML
#
# このファイルは Railway Framework の DAG機能開発・テストに使用します。
# 実際の運用ワークフロー（セッション管理）の構造を再現しています。
#
# 使用方法:
#   railway sync transition --entry top2
#
# 参照: 事例１.md

version: "1.0"
entrypoint: top2
description: "セッション管理ワークフロー - DBセッションの監視と自動解決"

# ============================================================
# ノード定義
# ============================================================
nodes:
  # Node 1: トリガコンテキスト取得
  fetch_alert:
    module: nodes.fetch_alert
    function: fetch_alert
    description: "PagerDuty REST API経由でアラート情報取得。ホスト名・セッションIDを取得"

  # Node 2: セッションID存在判定（初回）
  check_session_exists:
    module: nodes.check_session_exists
    function: check_session_exists
    description: "DBサーバーにリモートSQLPlus実行。セッションID存在確認クエリ"

  # Node 3: セッションステータス判定
  check_session_status:
    module: nodes.check_session_status
    function: check_session_status
    description: "セッションステータス確認。ACTIVEの場合は内部でリトライ（tenacity）"

  # Node 4: 後続処理有無判定
  check_follow_up:
    module: nodes.check_follow_up
    function: check_follow_up
    description: "後続処理の有無を確認"

  # Node 5: セッションID存在判定（再確認）
  # ※ Node 2と同じロジックだが遷移先が異なるため別ノードとして定義
  recheck_session_exists:
    module: nodes.check_session_exists
    function: recheck_session_exists
    description: "セッションID存在の再確認。後続処理なしの場合に実行"

  # Node 6: セッション継続時間判定
  check_ctime:
    module: nodes.check_ctime
    function: check_ctime
    description: "CTIME（継続時間）を確認。5400秒以下なら正常終了"

  # Node 7: セッションkill実行
  kill_session:
    module: nodes.kill_session
    function: kill_session
    description: "セッションをkill"

  # Node 8: インシデントresolve
  resolve_incident:
    module: nodes.resolve_incident
    function: resolve_incident
    description: "PagerDuty APIでインシデントを自動解決"

# ============================================================
# 終了コード定義
# ============================================================
exits:
  green_active_timeout:
    code: 0
    description: "ACTIVEセッションがタイムアウト（5回リトライ後）による正常終了"

  green_ctime_ok:
    code: 0
    description: "CTIME ≤ 5400秒による正常終了（セッションは自然終了を待つ）"

  green_resolved:
    code: 0
    description: "インシデント正常解決"

  red_error:
    code: 1
    description: "異常終了（API/SSH/SQL/データ形式エラー）"

# ============================================================
# 開始ノード
# ============================================================
start: fetch_alert

# ============================================================
# 遷移定義（隣接リスト形式）
# ============================================================
transitions:
  # Node 1: fetch_alert の遷移
  fetch_alert:
    success::done: check_session_exists
    failure::http: exit::red_error
    failure::request: exit::red_error
    failure::api: exit::red_error
    failure::unknown: exit::red_error

  # Node 2: check_session_exists の遷移
  check_session_exists:
    success::exist: check_session_status
    success::not_exist: resolve_incident
    failure::ssh: exit::red_error
    failure::sql: exit::red_error
    failure::data_format: exit::red_error
    failure::unknown: exit::red_error

  # Node 3: check_session_status の遷移
  # ※ success::active::retry はノード内でtenacityによりリトライ（遷移には現れない）
  check_session_status:
    success::inactive: check_follow_up
    success::active_timeout: exit::green_active_timeout
    failure::ssh: exit::red_error
    failure::sql: exit::red_error
    failure::data_format: exit::red_error
    failure::unknown: exit::red_error

  # Node 4: check_follow_up の遷移
  check_follow_up:
    success::exist: kill_session
    success::not_exist: recheck_session_exists
    failure::ssh: exit::red_error
    failure::sql: exit::red_error
    failure::data_format: exit::red_error
    failure::unknown: exit::red_error

  # Node 5: recheck_session_exists の遷移（再確認後の分岐）
  recheck_session_exists:
    success::exist: check_ctime
    success::not_exist: resolve_incident
    failure::ssh: exit::red_error
    failure::sql: exit::red_error
    failure::data_format: exit::red_error
    failure::unknown: exit::red_error

  # Node 6: check_ctime の遷移
  check_ctime:
    success::lessthan: exit::green_ctime_ok
    success::higher: kill_session
    failure::data_format: exit::red_error
    failure::unknown: exit::red_error

  # Node 7: kill_session の遷移
  kill_session:
    success::killed: resolve_incident
    failure::command: exit::red_error
    failure::ssh: exit::red_error
    failure::unknown: exit::red_error

  # Node 8: resolve_incident の遷移
  resolve_incident:
    success::resolved: exit::green_resolved
    failure::http: exit::red_error
    failure::api: exit::red_error
    failure::data_format: exit::red_error
    failure::unknown: exit::red_error

# ============================================================
# オプション設定
# ============================================================
options:
  max_iterations: 20
  enable_loop_detection: true
  strict_state_check: true
