72 lines
3.5 KiB
Python
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
|