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

44 lines
2.2 KiB
Python

# #region Alembic.ScenarioCancelDrainDeadline [C:3] [TYPE Module] [SEMANTICS alembic,scenario,execution,cancel,drain]
# @ingroup Alembic
# @BRIEF Add nullable persisted cancellation timing so a worker/scheduler can finish a bounded drain after restart.
# @RELATION DEPENDS_ON -> [Models.ScenarioExecution.Run]
# @INVARIANT Existing runs retain null timing fields; only a cancel request pins a deadline.
# @REJECTED Deriving a deadline from mutable target snapshot or an in-memory process timer was rejected.
"""add durable ScenarioRun cancellation drain timing (044)"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
revision: str = "e3f4a5b6c7d8"
down_revision: str | Sequence[str] | None = "d2e3f4a5b6c7"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
# #region Alembic.ScenarioCancelDrainDeadline.Upgrade [C:4] [TYPE Function] [SEMANTICS alembic,scenario,execution,cancel,additive]
# @BRIEF Add nullable request/deadline timestamps and a deadline lookup index.
# @POST Historical ScenarioRuns preserve null timing until explicitly cancelled.
# @SIDE_EFFECT Schema mutation: two nullable lifecycle timestamps and one index.
def upgrade() -> None:
op.add_column("scenario_runs", sa.Column("cancel_requested_at", sa.DateTime(), nullable=True))
op.add_column("scenario_runs", sa.Column("cancel_drain_deadline_at", sa.DateTime(), nullable=True))
op.create_index(
"ix_scenario_runs_cancel_drain_deadline_at",
"scenario_runs",
["cancel_drain_deadline_at"],
)
# #endregion Alembic.ScenarioCancelDrainDeadline.Upgrade
# #region Alembic.ScenarioCancelDrainDeadline.Downgrade [C:3] [TYPE Function] [SEMANTICS alembic,scenario,execution,cancel,rollback]
# @BRIEF Remove only additive timing metadata; no run/step/evidence history is altered.
def downgrade() -> None:
op.drop_index("ix_scenario_runs_cancel_drain_deadline_at", table_name="scenario_runs")
op.drop_column("scenario_runs", "cancel_drain_deadline_at")
op.drop_column("scenario_runs", "cancel_requested_at")
# #endregion Alembic.ScenarioCancelDrainDeadline.Downgrade
# #endregion Alembic.ScenarioCancelDrainDeadline