-- Migration: Create separate tables for metrics and docker images -- Purpose: Fix data classification issue where storage/system metrics were incorrectly stored as package updates -- Create metrics table for system and storage metrics CREATE TABLE IF NOT EXISTS metrics ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE, package_type VARCHAR(50) NOT NULL, -- "storage", "system", "cpu", "memory" package_name VARCHAR(255) NOT NULL, current_version TEXT NOT NULL, -- current usage, value available_version TEXT NOT NULL, -- available space, threshold severity VARCHAR(20) NOT NULL DEFAULT 'low', -- "low", "moderate", "high", "critical" repository_source VARCHAR(255), metadata JSONB DEFAULT '{}', event_type VARCHAR(50) NOT NULL DEFAULT 'discovered', created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), -- Unique constraint to prevent duplicate entries UNIQUE (agent_id, package_name, package_type, created_at) ); -- Create docker_images table for Docker image information CREATE TABLE IF NOT EXISTS docker_images ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE, package_type VARCHAR(50) NOT NULL DEFAULT 'docker_image', package_name VARCHAR(500) NOT NULL, -- image name:tag current_version VARCHAR(255) NOT NULL, -- current image ID available_version VARCHAR(255), -- latest image ID severity VARCHAR(20) NOT NULL DEFAULT 'low', -- "low", "moderate", "high", "critical" repository_source VARCHAR(500), -- registry URL metadata JSONB DEFAULT '{}', event_type VARCHAR(50) NOT NULL DEFAULT 'discovered', created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), -- Unique constraint to prevent duplicate entries UNIQUE (agent_id, package_name, package_type, created_at) ); -- Create indexes for better performance CREATE INDEX IF NOT EXISTS idx_metrics_agent_id ON metrics(agent_id); CREATE INDEX IF NOT EXISTS idx_metrics_package_type ON metrics(package_type); CREATE INDEX IF NOT EXISTS idx_metrics_created_at ON metrics(created_at); CREATE INDEX IF NOT EXISTS idx_metrics_severity ON metrics(severity); CREATE INDEX IF NOT EXISTS idx_docker_images_agent_id ON docker_images(agent_id); CREATE INDEX IF NOT EXISTS idx_docker_images_package_type ON docker_images(package_type); CREATE INDEX IF NOT EXISTS idx_docker_images_created_at ON docker_images(created_at); CREATE INDEX IF NOT EXISTS idx_docker_images_severity ON docker_images(severity); CREATE INDEX IF NOT EXISTS idx_docker_images_has_updates ON docker_images(current_version, available_version) WHERE current_version != available_version; -- Add comments for documentation COMMENT ON TABLE metrics IS 'Stores system and storage metrics collected from agents, separate from package updates'; COMMENT ON TABLE docker_images IS 'Stores Docker image information and update availability, separate from package updates'; COMMENT ON COLUMN metrics.package_type IS 'Type of metric: storage, system, cpu, memory, etc.'; COMMENT ON COLUMN metrics.package_name IS 'Name of the metric (mount point, metric name, etc.)'; COMMENT ON COLUMN metrics.current_version IS 'Current value or usage'; COMMENT ON COLUMN metrics.available_version IS 'Available space or threshold'; COMMENT ON COLUMN metrics.severity IS 'Severity level: low, moderate, high, critical'; COMMENT ON COLUMN docker_images.package_name IS 'Docker image name with tag (e.g., nginx:latest)'; COMMENT ON COLUMN docker_images.current_version IS 'Current image ID'; COMMENT ON COLUMN docker_images.available_version IS 'Latest available image ID'; COMMENT ON COLUMN docker_images.severity IS 'Update severity: low, moderate, high, critical'; -- Create or replace function to clean old data (optional) CREATE OR REPLACE FUNCTION clean_misclassified_data() RETURNS INTEGER AS $$ DECLARE deleted_count INTEGER := 0; BEGIN -- This function can be called to clean up any storage/system metrics that were -- incorrectly stored in the update_events table before migration -- For now, just return 0 as we're keeping the old data for audit purposes RETURN deleted_count; END; $$ LANGUAGE plpgsql; -- Grant permissions (adjust as needed for your setup) -- GRANT ALL PRIVILEGES ON TABLE metrics TO redflag_user; -- GRANT ALL PRIVILEGES ON TABLE docker_images TO redflag_user; -- GRANT USAGE ON SCHEMA public TO redflag_user;