defmodule ArcadiaCloud.Repo.Migrations.CreateSagas do use Ecto.Migration def change do create table(:saga_runs, primary_key: false) do add :id, :binary_id, primary_key: true add :deployment_id, :binary_id add :kind, :string, null: false add :status, :string, null: false, default: "pending" add :step_modules, {:array, :string}, null: false add :current_step_idx, :integer, null: false, default: 0 add :context, :map, null: false, default: %{} add :started_at, :utc_datetime add :completed_at, :utc_datetime add :cancel_requested, :boolean, null: false, default: false add :error, :map add :triggered_by, :string timestamps(type: :utc_datetime) end create index(:saga_runs, [:status]) create index(:saga_runs, [:kind]) create index(:saga_runs, [:deployment_id]) create table(:saga_step_results, primary_key: false) do add :id, :binary_id, primary_key: true add :saga_id, references(:saga_runs, type: :binary_id, on_delete: :delete_all), null: false add :step_idx, :integer, null: false add :step_name, :string, null: false add :status, :string, null: false add :output, :map, default: %{}, null: false add :attempts, :integer, default: 0, null: false add :started_at, :utc_datetime add :completed_at, :utc_datetime add :error, :map end create unique_index(:saga_step_results, [:saga_id, :step_idx]) create index(:saga_step_results, [:saga_id, :status]) # Desired-state for everything WE provisioned. Lets us detect drift # between cloud_resources (actual) and this (intended). create table(:cloud_provisioned, primary_key: false) do add :id, :binary_id, primary_key: true add :resource_id, references(:cloud_resources, type: :binary_id, on_delete: :delete_all), null: false add :spec, :map, null: false, default: %{} add :spec_version, :integer, null: false, default: 1 add :provisioned_at, :utc_datetime, null: false add :provisioned_by, :string add :saga_id, references(:saga_runs, type: :binary_id, on_delete: :nilify_all) timestamps(type: :utc_datetime) end create unique_index(:cloud_provisioned, [:resource_id]) create index(:cloud_provisioned, [:saga_id]) end end