"""Which image a swarm service is pinned to, and which images each host holds Adds docker_swarm_services.image_digest (the sha256 digest a stack deploy pinned) and docker_disk_usage.digests_json (every "repo@sha256:…" the host holds), both from agent 1.26.0. A maintenance run spreads services back out only onto a node holding the service's image. Older agents leave them empty. Revision ID: docker_014_image_digests Revises: docker_013_mem_used Create Date: 2026-10-25 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = "docker_014_image_digests" down_revision: Union[str, None] = "docker_013_mem_used" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.add_column("docker_swarm_services", sa.Column("image_digest", sa.String(80), nullable=True)) op.add_column("docker_disk_usage", sa.Column("digests_json", sa.Text, nullable=False, server_default="[]")) def downgrade() -> None: op.drop_column("docker_disk_usage", "digests_json") op.drop_column("docker_swarm_services", "image_digest")