88 lines
3.1 KiB
Python
88 lines
3.1 KiB
Python
"""add repository data key epochs
|
|
|
|
Revision ID: 0007_repository_data_key_epochs
|
|
Revises: 0006_local_sources_only
|
|
"""
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision = "0007_repository_data_key_epochs"
|
|
down_revision = "0006_local_sources_only"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column("repositories", sa.Column("active_data_key_id", sa.String(36), nullable=True))
|
|
op.add_column("backups", sa.Column("data_key_id", sa.String(36), nullable=True))
|
|
op.create_table(
|
|
"repository_data_key_epochs",
|
|
sa.Column("id", sa.String(36), primary_key=True),
|
|
sa.Column(
|
|
"created_at",
|
|
sa.DateTime(timezone=True),
|
|
nullable=False,
|
|
server_default=sa.text("CURRENT_TIMESTAMP"),
|
|
),
|
|
sa.Column(
|
|
"updated_at",
|
|
sa.DateTime(timezone=True),
|
|
nullable=False,
|
|
server_default=sa.text("CURRENT_TIMESTAMP"),
|
|
),
|
|
sa.Column(
|
|
"repository_id",
|
|
sa.String(36),
|
|
sa.ForeignKey("repositories.id", ondelete="RESTRICT"),
|
|
nullable=False,
|
|
),
|
|
sa.Column("key_id", sa.String(36), nullable=False),
|
|
sa.Column("state", sa.String(16), nullable=False),
|
|
sa.Column("retired_at", sa.DateTime(timezone=True)),
|
|
sa.UniqueConstraint(
|
|
"repository_id", "key_id", name="uq_repository_data_key_epochs_repository_key_epoch"
|
|
),
|
|
sa.CheckConstraint(
|
|
"state IN ('active','retired')",
|
|
name="ck_repository_data_key_epochs_repository_data_key_epoch_state",
|
|
),
|
|
)
|
|
op.create_index(
|
|
"ix_repository_data_key_epochs_repository_id",
|
|
"repository_data_key_epochs",
|
|
["repository_id"],
|
|
)
|
|
op.create_index(
|
|
"uq_repository_data_key_epochs_active",
|
|
"repository_data_key_epochs",
|
|
["repository_id"],
|
|
unique=True,
|
|
sqlite_where=sa.text("state = 'active'"),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
connection = op.get_bind()
|
|
epochs = sa.table("repository_data_key_epochs")
|
|
repositories = sa.table("repositories", sa.column("active_data_key_id"))
|
|
backups = sa.table("backups", sa.column("data_key_id"))
|
|
epoch_count = connection.scalar(sa.select(sa.func.count()).select_from(epochs))
|
|
active_key_count = connection.scalar(
|
|
sa.select(sa.func.count())
|
|
.select_from(repositories)
|
|
.where(repositories.c.active_data_key_id.is_not(None))
|
|
)
|
|
backup_key_count = connection.scalar(
|
|
sa.select(sa.func.count()).select_from(backups).where(backups.c.data_key_id.is_not(None))
|
|
)
|
|
if epoch_count or active_key_count or backup_key_count:
|
|
raise RuntimeError("cannot downgrade while repository data key metadata exists")
|
|
op.drop_index("uq_repository_data_key_epochs_active", table_name="repository_data_key_epochs")
|
|
op.drop_index(
|
|
"ix_repository_data_key_epochs_repository_id", table_name="repository_data_key_epochs"
|
|
)
|
|
op.drop_table("repository_data_key_epochs")
|
|
op.drop_column("backups", "data_key_id")
|
|
op.drop_column("repositories", "active_data_key_id")
|