migrations/versions/0001_2025.05.06_38b0d2de.py (265 lines of code) (raw):
"""Use the existing ATR schema
Revision ID: 0001_2025.05.06_38b0d2de
Revises:
Create Date: 2025-05-06 14:44:00.401362+00:00
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
import atr.db.models
# revision identifiers, used by Alembic.
revision: str = "0001_2025.05.06_38b0d2de"
down_revision: str | None = None
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.create_table(
"committee",
sa.Column("name", sa.String(), nullable=False),
sa.Column("full_name", sa.String(), nullable=True),
sa.Column("is_podling", sa.Boolean(), nullable=False),
sa.Column("parent_committee_name", sa.String(), nullable=True),
sa.Column("committee_members", sa.JSON(), nullable=True),
sa.Column("committers", sa.JSON(), nullable=True),
sa.Column("release_managers", sa.JSON(), nullable=True),
sa.ForeignKeyConstraint(
["parent_committee_name"],
["committee.name"],
),
sa.PrimaryKeyConstraint("name"),
sa.UniqueConstraint("name"),
)
op.create_table(
"publicsigningkey",
sa.Column("fingerprint", sa.String(), nullable=False),
sa.Column("algorithm", sa.Integer(), nullable=False),
sa.Column("length", sa.Integer(), nullable=False),
sa.Column("created", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("expires", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("declared_uid", sa.String(), nullable=True),
sa.Column("apache_uid", sa.String(), nullable=False),
sa.Column("ascii_armored_key", sa.String(), nullable=False),
sa.PrimaryKeyConstraint("fingerprint"),
sa.UniqueConstraint("fingerprint"),
)
op.create_table(
"releasepolicy",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("mailto_addresses", sa.JSON(), nullable=True),
sa.Column("manual_vote", sa.Boolean(), nullable=False),
sa.Column("min_hours", sa.Integer(), nullable=False),
sa.Column("release_checklist", sa.String(), nullable=False),
sa.Column("pause_for_rm", sa.Boolean(), nullable=False),
sa.Column("start_vote_template", sa.String(), nullable=False),
sa.Column("announce_release_template", sa.String(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"sshkey",
sa.Column("fingerprint", sa.String(), nullable=False),
sa.Column("key", sa.String(), nullable=False),
sa.Column("asf_uid", sa.String(), nullable=False),
sa.PrimaryKeyConstraint("fingerprint"),
)
op.create_table(
"textvalue",
sa.Column("ns", sa.String(), nullable=False),
sa.Column("key", sa.String(), nullable=False),
sa.Column("value", sa.String(), nullable=False),
sa.PrimaryKeyConstraint("ns", "key"),
)
op.create_index(op.f("ix_textvalue_key"), "textvalue", ["key"], unique=False)
op.create_index(op.f("ix_textvalue_ns"), "textvalue", ["ns"], unique=False)
op.create_table(
"keylink",
sa.Column("committee_name", sa.String(), nullable=False),
sa.Column("key_fingerprint", sa.String(), nullable=False),
sa.ForeignKeyConstraint(
["committee_name"],
["committee.name"],
),
sa.ForeignKeyConstraint(
["key_fingerprint"],
["publicsigningkey.fingerprint"],
),
sa.PrimaryKeyConstraint("committee_name", "key_fingerprint"),
)
op.create_table(
"project",
sa.Column("name", sa.String(), nullable=False),
sa.Column("full_name", sa.String(), nullable=True),
sa.Column("is_podling", sa.Boolean(), nullable=False),
sa.Column("is_retired", sa.Boolean(), nullable=False),
sa.Column("super_project_name", sa.String(), nullable=True),
sa.Column("description", sa.String(), nullable=True),
sa.Column("category", sa.String(), nullable=True),
sa.Column("programming_languages", sa.String(), nullable=True),
sa.Column("committee_name", sa.String(), nullable=True),
sa.Column("release_policy_id", sa.Integer(), nullable=True),
sa.Column("created", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("created_by", sa.String(), nullable=True),
sa.ForeignKeyConstraint(
["committee_name"],
["committee.name"],
),
sa.ForeignKeyConstraint(["release_policy_id"], ["releasepolicy.id"], ondelete="CASCADE"),
sa.ForeignKeyConstraint(
["super_project_name"],
["project.name"],
),
sa.PrimaryKeyConstraint("name"),
sa.UniqueConstraint("name"),
)
op.create_table(
"distributionchannel",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("name", sa.String(), nullable=False),
sa.Column("url", sa.String(), nullable=False),
sa.Column("credentials", sa.String(), nullable=False),
sa.Column("is_test", sa.Boolean(), nullable=False),
sa.Column("automation_endpoint", sa.String(), nullable=False),
sa.Column("project_name", sa.String(), nullable=False),
sa.ForeignKeyConstraint(
["project_name"],
["project.name"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_distributionchannel_name"), "distributionchannel", ["name"], unique=True)
op.create_table(
"release",
sa.Column("name", sa.String(), nullable=False),
sa.Column(
"stage", sa.Enum("RELEASE_CANDIDATE", "RELEASE", "MIGRATION", "FAILED", name="releasestage"), nullable=False
),
sa.Column(
"phase",
sa.Enum("RELEASE_CANDIDATE_DRAFT", "RELEASE_CANDIDATE", "RELEASE_PREVIEW", "RELEASE", name="releasephase"),
nullable=False,
),
sa.Column("created", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("released", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("project_name", sa.String(), nullable=False),
sa.Column("package_managers", sa.JSON(), nullable=True),
sa.Column("version", sa.String(), nullable=False),
sa.Column("revision", sa.String(), nullable=True),
sa.Column("sboms", sa.JSON(), nullable=True),
sa.Column("release_policy_id", sa.Integer(), nullable=True),
sa.Column("votes", sa.JSON(), nullable=True),
sa.Column("vote_started", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("vote_resolved", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(
["project_name"],
["project.name"],
),
sa.ForeignKeyConstraint(
["release_policy_id"],
["releasepolicy.id"],
),
sa.PrimaryKeyConstraint("name"),
sa.UniqueConstraint("name"),
sa.UniqueConstraint("project_name", "version", name="unique_project_version"),
)
op.create_index(op.f("ix_release_revision"), "release", ["revision"], unique=False)
op.create_table(
"checkresult",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("release_name", sa.String(), nullable=False),
sa.Column("checker", sa.String(), nullable=False),
sa.Column("primary_rel_path", sa.String(), nullable=True),
sa.Column("created", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column(
"status", sa.Enum("EXCEPTION", "FAILURE", "SUCCESS", "WARNING", name="checkresultstatus"), nullable=False
),
sa.Column("message", sa.String(), nullable=False),
sa.Column("data", sa.JSON(), nullable=True),
sa.ForeignKeyConstraint(
["release_name"],
["release.name"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_checkresult_primary_rel_path"), "checkresult", ["primary_rel_path"], unique=False)
op.create_table(
"task",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("status", sa.Enum("QUEUED", "ACTIVE", "COMPLETED", "FAILED", name="taskstatus"), nullable=False),
sa.Column(
"task_type",
sa.Enum(
"HASHING_CHECK",
"LICENSE_FILES",
"LICENSE_HEADERS",
"MESSAGE_SEND",
"PATHS_CHECK",
"RAT_CHECK",
"SBOM_GENERATE_CYCLONEDX",
"SIGNATURE_CHECK",
"SVN_IMPORT_FILES",
"TARGZ_INTEGRITY",
"TARGZ_STRUCTURE",
"VOTE_INITIATE",
"ZIPFORMAT_INTEGRITY",
"ZIPFORMAT_LICENSE_FILES",
"ZIPFORMAT_LICENSE_HEADERS",
"ZIPFORMAT_STRUCTURE",
name="tasktype",
),
nullable=False,
),
sa.Column("task_args", sa.JSON(), nullable=True),
sa.Column("added", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("started", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("pid", sa.Integer(), nullable=True),
sa.Column("completed", atr.db.models.UTCDateTime(timezone=True), nullable=True),
sa.Column("result", sa.JSON(), nullable=True),
sa.Column("error", sa.String(), nullable=True),
sa.Column("release_name", sa.String(), nullable=True),
sa.Column("draft_revision", sa.String(), nullable=True),
sa.Column("primary_rel_path", sa.String(), nullable=True),
sa.CheckConstraint(
"""
(
-- Initial state is always valid
status = 'QUEUED'
-- QUEUED -> ACTIVE requires setting started time and pid
OR (status = 'ACTIVE' AND started IS NOT NULL AND pid IS NOT NULL)
-- ACTIVE -> COMPLETED requires setting completed time and result
OR (status = 'COMPLETED' AND completed IS NOT NULL AND result IS NOT NULL)
-- ACTIVE -> FAILED requires setting completed time and error (result optional)
OR (status = 'FAILED' AND completed IS NOT NULL AND error IS NOT NULL)
)
""",
name="valid_task_status_transitions",
),
sa.ForeignKeyConstraint(
["release_name"],
["release.name"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(op.f("ix_task_added"), "task", ["added"], unique=False)
op.create_index(op.f("ix_task_draft_revision"), "task", ["draft_revision"], unique=False)
op.create_index(op.f("ix_task_primary_rel_path"), "task", ["primary_rel_path"], unique=False)
op.create_index(op.f("ix_task_status"), "task", ["status"], unique=False)
op.create_index("ix_task_status_added", "task", ["status", "added"], unique=False)
op.create_table(
"checkresulthistorylink",
sa.Column("check_result_id", sa.Integer(), nullable=False),
sa.Column("draft_revision", sa.String(), nullable=False),
sa.ForeignKeyConstraint(
["check_result_id"],
["checkresult.id"],
),
sa.PrimaryKeyConstraint("check_result_id", "draft_revision"),
)
op.create_index(
op.f("ix_checkresulthistorylink_draft_revision"), "checkresulthistorylink", ["draft_revision"], unique=False
)
def downgrade() -> None:
op.drop_index(op.f("ix_checkresulthistorylink_draft_revision"), table_name="checkresulthistorylink")
op.drop_table("checkresulthistorylink")
op.drop_index("ix_task_status_added", table_name="task")
op.drop_index(op.f("ix_task_status"), table_name="task")
op.drop_index(op.f("ix_task_primary_rel_path"), table_name="task")
op.drop_index(op.f("ix_task_draft_revision"), table_name="task")
op.drop_index(op.f("ix_task_added"), table_name="task")
op.drop_table("task")
op.drop_index(op.f("ix_checkresult_primary_rel_path"), table_name="checkresult")
op.drop_table("checkresult")
op.drop_index(op.f("ix_release_revision"), table_name="release")
op.drop_table("release")
op.drop_index(op.f("ix_distributionchannel_name"), table_name="distributionchannel")
op.drop_table("distributionchannel")
op.drop_table("project")
op.drop_table("keylink")
op.drop_index(op.f("ix_textvalue_ns"), table_name="textvalue")
op.drop_index(op.f("ix_textvalue_key"), table_name="textvalue")
op.drop_table("textvalue")
op.drop_table("sshkey")
op.drop_table("releasepolicy")
op.drop_table("publicsigningkey")
op.drop_table("committee")