defmodule ArcadiaCloud.Provisioning.SagaRun do use Ecto.Schema import Ecto.Changeset @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id @kinds ~w(provision suspend unsuspend offboard update rollback test) @statuses ~w(pending running completed failed compensating rolled_back) schema "saga_runs" do field :deployment_id, :binary_id field :kind, :string field :status, :string, default: "pending" field :step_modules, {:array, :string}, default: [] field :current_step_idx, :integer, default: 0 field :context, :map, default: %{} field :started_at, :utc_datetime field :completed_at, :utc_datetime field :cancel_requested, :boolean, default: false field :error, :map field :triggered_by, :string timestamps(type: :utc_datetime) end @required ~w(kind step_modules)a @optional ~w(deployment_id status current_step_idx context started_at completed_at cancel_requested error triggered_by)a def changeset(saga, attrs) do saga |> cast(attrs, @required ++ @optional) |> validate_required(@required) |> validate_inclusion(:kind, @kinds) |> validate_inclusion(:status, @statuses) end end