feat(v2): complete v2 reimplementation
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
"""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")
|
||||
Reference in New Issue
Block a user