"""M1 hardware plane persistence. Revision ID: 20260824_0002 Revises: 20260824_0001 """ import sqlalchemy as sa from alembic import op revision = "20260824_0002" down_revision = "20260824_0001" branch_labels = None depends_on = None def upgrade() -> None: for column in ( sa.Column("display_name", sa.String(255), nullable=False, server_default=""), sa.Column("identity_source", sa.String(32), nullable=False, server_default="unknown"), sa.Column("os_name", sa.String(128)), sa.Column("os_version", sa.Text()), sa.Column("architecture", sa.String(128)), sa.Column("kernel_version", sa.String(255)), sa.Column("cpu_model", sa.String(255)), sa.Column("logical_cpu_count", sa.Integer()), sa.Column("physical_core_count", sa.Integer()), sa.Column("total_ram_bytes", sa.BigInteger()), sa.Column("agent_version", sa.String(64)), sa.Column("status_reason", sa.Text()), sa.Column( "first_seen_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now(), ), sa.Column("inventory_at", sa.DateTime(timezone=True)), ): op.add_column("compute_nodes", column) for column in ( sa.Column("pci_bus_id", sa.String(64)), sa.Column("vendor", sa.String(64), nullable=False, server_default="NVIDIA"), sa.Column("architecture", sa.String(64)), sa.Column("compute_capability_major", sa.Integer()), sa.Column("compute_capability_minor", sa.Integer()), sa.Column("total_vram_bytes", sa.BigInteger()), sa.Column("mig_mode_current", sa.Boolean()), sa.Column("status", sa.String(32), nullable=False, server_default="active"), sa.Column("status_reason", sa.Text()), sa.Column("inventory_source", sa.String(32), nullable=False, server_default="nvidia_nvml"), sa.Column( "first_seen_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now(), ), sa.Column("last_seen_at", sa.DateTime(timezone=True)), sa.Column("inventory_at", sa.DateTime(timezone=True)), ): op.add_column("accelerators", column) op.create_table( "host_telemetry_latest", sa.Column( "compute_node_id", sa.Uuid(), sa.ForeignKey("compute_nodes.id", ondelete="CASCADE"), nullable=False, unique=True, ), sa.Column("available_ram_bytes", sa.BigInteger()), sa.Column("availability", sa.JSON(), nullable=False), sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False), sa.Column("id", sa.Uuid(), primary_key=True), ) op.create_index( "ix_host_telemetry_latest_compute_node_id", "host_telemetry_latest", ["compute_node_id"], unique=True, ) op.create_table( "accelerator_telemetry_latest", sa.Column( "accelerator_id", sa.Uuid(), sa.ForeignKey("accelerators.id", ondelete="CASCADE"), nullable=False, unique=True, ), sa.Column("used_vram_bytes", sa.BigInteger()), sa.Column("free_vram_bytes", sa.BigInteger()), sa.Column("gpu_utilization_percent", sa.Integer()), sa.Column("memory_utilization_percent", sa.Integer()), sa.Column("temperature_c", sa.Integer()), sa.Column("power_draw_w", sa.Float()), sa.Column("power_limit_w", sa.Float()), sa.Column("graphics_clock_mhz", sa.Integer()), sa.Column("memory_clock_mhz", sa.Integer()), sa.Column("fan_speed_percent", sa.Integer()), sa.Column("performance_state", sa.String(32)), sa.Column("availability", sa.JSON(), nullable=False), sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False), sa.Column("id", sa.Uuid(), primary_key=True), ) op.create_index( "ix_accelerator_telemetry_latest_accelerator_id", "accelerator_telemetry_latest", ["accelerator_id"], unique=True, ) op.create_table( "storage_volume_states", sa.Column( "compute_node_id", sa.Uuid(), sa.ForeignKey("compute_nodes.id", ondelete="CASCADE"), nullable=False, ), sa.Column("purpose", sa.String(64), nullable=False), sa.Column("path", sa.Text(), nullable=False), sa.Column("total_bytes", sa.BigInteger()), sa.Column("used_bytes", sa.BigInteger()), sa.Column("free_bytes", sa.BigInteger()), sa.Column("availability", sa.JSON(), nullable=False), sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False), sa.Column("id", sa.Uuid(), primary_key=True), sa.UniqueConstraint("compute_node_id", "purpose", "path", name="uq_node_storage_path"), ) op.create_index( "ix_storage_volume_states_compute_node_id", "storage_volume_states", ["compute_node_id"] ) op.create_table( "hardware_inventory_runs", sa.Column( "compute_node_id", sa.Uuid(), sa.ForeignKey("compute_nodes.id", ondelete="SET NULL") ), sa.Column("status", sa.String(32), nullable=False), sa.Column("source", sa.String(64), nullable=False), sa.Column("fingerprint", sa.String(64)), sa.Column("summary", sa.JSON(), nullable=False), sa.Column("error", sa.Text()), sa.Column("started_at", sa.DateTime(timezone=True), nullable=False), sa.Column("completed_at", sa.DateTime(timezone=True)), sa.Column("id", sa.Uuid(), primary_key=True), ) op.create_index( "ix_hardware_inventory_runs_compute_node_id", "hardware_inventory_runs", ["compute_node_id"] ) op.create_index( "ix_hardware_inventory_runs_fingerprint", "hardware_inventory_runs", ["fingerprint"] ) def downgrade() -> None: for table in ( "hardware_inventory_runs", "storage_volume_states", "accelerator_telemetry_latest", "host_telemetry_latest", ): op.drop_table(table) for column in ( "inventory_at", "last_seen_at", "first_seen_at", "inventory_source", "status_reason", "status", "mig_mode_current", "total_vram_bytes", "compute_capability_minor", "compute_capability_major", "architecture", "vendor", "pci_bus_id", ): op.drop_column("accelerators", column) for column in ( "inventory_at", "first_seen_at", "status_reason", "agent_version", "total_ram_bytes", "physical_core_count", "logical_cpu_count", "cpu_model", "kernel_version", "architecture", "os_version", "os_name", "identity_source", "display_name", ): op.drop_column("compute_nodes", column)