"""Add host_metrics table for builtin playbooks data collection Revision ID: 0005 Revises: 0004_add_users_table Create Date: 2024-12-11 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = '0005_add_host_metrics' down_revision: Union[str, None] = '0004_add_users' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( 'host_metrics', sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), sa.Column('host_id', sa.String(), nullable=False), sa.Column('metric_type', sa.String(50), nullable=False), # CPU metrics sa.Column('cpu_count', sa.Integer(), nullable=True), sa.Column('cpu_model', sa.String(200), nullable=True), sa.Column('cpu_load_1m', sa.Float(), nullable=True), sa.Column('cpu_load_5m', sa.Float(), nullable=True), sa.Column('cpu_load_15m', sa.Float(), nullable=True), sa.Column('cpu_usage_percent', sa.Float(), nullable=True), sa.Column('cpu_temperature', sa.Float(), nullable=True), # Memory metrics sa.Column('memory_total_mb', sa.Integer(), nullable=True), sa.Column('memory_used_mb', sa.Integer(), nullable=True), sa.Column('memory_free_mb', sa.Integer(), nullable=True), sa.Column('memory_usage_percent', sa.Float(), nullable=True), sa.Column('swap_total_mb', sa.Integer(), nullable=True), sa.Column('swap_used_mb', sa.Integer(), nullable=True), sa.Column('swap_usage_percent', sa.Float(), nullable=True), # Disk metrics sa.Column('disk_info', sa.JSON(), nullable=True), sa.Column('disk_root_total_gb', sa.Float(), nullable=True), sa.Column('disk_root_used_gb', sa.Float(), nullable=True), sa.Column('disk_root_usage_percent', sa.Float(), nullable=True), # System info sa.Column('os_name', sa.String(100), nullable=True), sa.Column('os_version', sa.String(100), nullable=True), sa.Column('kernel_version', sa.String(100), nullable=True), sa.Column('hostname', sa.String(200), nullable=True), sa.Column('uptime_seconds', sa.Integer(), nullable=True), sa.Column('uptime_human', sa.String(100), nullable=True), # Network info sa.Column('network_info', sa.JSON(), nullable=True), # Raw data and metadata sa.Column('raw_data', sa.JSON(), nullable=True), sa.Column('collection_source', sa.String(100), nullable=True), sa.Column('collection_duration_ms', sa.Integer(), nullable=True), sa.Column('error_message', sa.Text(), nullable=True), # Timestamps sa.Column('collected_at', sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), sa.ForeignKeyConstraint(['host_id'], ['hosts.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) # Create indexes op.create_index('idx_host_metrics_host_id', 'host_metrics', ['host_id']) op.create_index('idx_host_metrics_collected_at', 'host_metrics', ['collected_at']) op.create_index('idx_host_metrics_metric_type', 'host_metrics', ['metric_type']) def downgrade() -> None: op.drop_index('idx_host_metrics_metric_type', 'host_metrics') op.drop_index('idx_host_metrics_collected_at', 'host_metrics') op.drop_index('idx_host_metrics_host_id', 'host_metrics') op.drop_table('host_metrics')