defmodule ArcadiaCloud.Repo.Migrations.CreateDrift do use Ecto.Migration def change do # One row per drifted field of a provisioned resource. The operator # resolves each: "accept" (desired-state := actual) or "revert" # (schedule a saga to put actual back to desired). create table(:cloud_drift, 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 :provisioned_id, references(:cloud_provisioned, type: :binary_id, on_delete: :delete_all), null: false add :field, :string, null: false add :expected, :map add :actual, :map add :status, :string, null: false, default: "open" add :detected_at, :utc_datetime, null: false add :resolved_at, :utc_datetime add :resolved_by, :string timestamps(type: :utc_datetime) end # At most one OPEN drift per (resource, field); resolved ones are history. create unique_index(:cloud_drift, [:resource_id, :field], where: "status = 'open'", name: :cloud_drift_open_unique ) create index(:cloud_drift, [:status]) create index(:cloud_drift, [:provisioned_id]) end end