Files
ss-tools/backend/alembic/versions/x3y4z5a6b7c8_add_scenario_run_tables.py

72 lines
3.5 KiB
Python

# #region Alembic.ScenarioRunTables [C:3] [TYPE Module] [SEMANTICS alembic,scenario,run,step,execution]
# @ingroup Alembic
# @BRIEF Add 044 scenario run + step run tables.
# @LAYER Database
"""add durable scenario execution run tables (044)"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
revision: str = "x3y4z5a6b7c8"
down_revision: str | Sequence[str] | None = "w2x3y4z5a6"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.create_table(
"scenario_runs",
sa.Column("id", sa.String(36), nullable=False),
sa.Column("scenario_id", sa.String(36), nullable=False),
sa.Column("scenario_revision_id", sa.String(36), nullable=False),
sa.Column("scenario_content_hash", sa.String(64), nullable=False),
sa.Column("environment_id", sa.String(128), nullable=False),
sa.Column("status", sa.String(32), nullable=False),
sa.Column("phase", sa.String(32), nullable=False),
sa.Column("parameter_bindings", sa.JSON(), nullable=False),
sa.Column("target_snapshot", sa.JSON(), nullable=False),
sa.Column("trigger_source", sa.String(32), nullable=False),
sa.Column("idempotency_key", sa.String(128), nullable=False),
sa.Column("runner_plan", sa.JSON(), nullable=False),
sa.Column("execution_principal_fingerprint", sa.String(64), nullable=True),
sa.Column("error_code", sa.String(64), nullable=True),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("started_at", sa.DateTime(), nullable=True),
sa.Column("finished_at", sa.DateTime(), nullable=True),
sa.ForeignKeyConstraint(["scenario_id"], ["scenario_registry_entries.scenario_id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("idempotency_key"),
)
op.create_index("ix_scenario_runs_scenario_status", "scenario_runs", ["scenario_id", "status"])
op.create_index("ix_scenario_runs_revision", "scenario_runs", ["scenario_revision_id"])
op.create_table(
"scenario_step_runs",
sa.Column("id", sa.String(36), nullable=False),
sa.Column("run_id", sa.String(36), nullable=False),
sa.Column("logical_step_id", sa.String(128), nullable=False),
sa.Column("step_position", sa.Integer(), nullable=False),
sa.Column("attempt", sa.Integer(), nullable=False),
sa.Column("status", sa.String(32), nullable=False),
sa.Column("inputs_snapshot", sa.JSON(), nullable=False),
sa.Column("outputs", sa.JSON(), nullable=False),
sa.Column("artifact_refs", sa.JSON(), nullable=False),
sa.Column("progress", sa.Integer(), nullable=False),
sa.Column("error_code", sa.String(64), nullable=True),
sa.Column("started_at", sa.DateTime(), nullable=True),
sa.Column("finished_at", sa.DateTime(), nullable=True),
sa.Column("step_outcome", sa.JSON(), nullable=False),
sa.ForeignKeyConstraint(["run_id"], ["scenario_runs.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)
op.create_index("ix_scenario_step_runs_run", "scenario_step_runs", ["run_id"])
def downgrade() -> None:
op.drop_index("ix_scenario_step_runs_run", table_name="scenario_step_runs")
op.drop_table("scenario_step_runs")
op.drop_index("ix_scenario_runs_revision", table_name="scenario_runs")
op.drop_index("ix_scenario_runs_scenario_status", table_name="scenario_runs")
op.drop_table("scenario_runs")
# #endregion Alembic.ScenarioRunTables