From f52a9e6c5ea11cbd3cfc27fa452dcb4c61a5ce1d Mon Sep 17 00:00:00 2001 From: Apple Date: Fri, 28 Nov 2025 04:10:01 -0800 Subject: [PATCH] feat: add migration for normalizing agent node_id and node_cache table --- migrations/022_normalize_agent_node_id.sql | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 migrations/022_normalize_agent_node_id.sql diff --git a/migrations/022_normalize_agent_node_id.sql b/migrations/022_normalize_agent_node_id.sql new file mode 100644 index 00000000..3de9f3f0 --- /dev/null +++ b/migrations/022_normalize_agent_node_id.sql @@ -0,0 +1,102 @@ +-- Migration 022: Normalize Agent node_id to match Node Registry +-- Приводимо node_id агентів до формату Node Registry + +-- ============================================================================ +-- Нормалізація node_id +-- ============================================================================ + +-- NODE1 → node-1-hetzner-gex44 +UPDATE agents +SET node_id = 'node-1-hetzner-gex44' +WHERE node_id = 'NODE1' OR node_id = 'node1' OR node_id = 'Node1'; + +-- NODE2 → node-2-macbook-m4max +UPDATE agents +SET node_id = 'node-2-macbook-m4max' +WHERE node_id = 'NODE2' OR node_id = 'node2' OR node_id = 'Node2'; + +-- Перевірка +SELECT node_id, COUNT(*) as count +FROM agents +WHERE node_id IS NOT NULL +GROUP BY node_id +ORDER BY count DESC; + +-- ============================================================================ +-- Створюємо таблицю-кеш для нод в БД daarion +-- (для швидкого JOIN без cross-database запитів) +-- ============================================================================ + +CREATE TABLE IF NOT EXISTS node_cache ( + id SERIAL PRIMARY KEY, + node_id TEXT NOT NULL UNIQUE, + node_name TEXT NOT NULL, + hostname TEXT, + status TEXT DEFAULT 'offline', + roles TEXT[] DEFAULT '{}', + gpu JSONB DEFAULT NULL, + environment TEXT DEFAULT 'production', + last_sync TIMESTAMPTZ DEFAULT NOW(), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_node_cache_node_id ON node_cache(node_id); +CREATE INDEX IF NOT EXISTS idx_node_cache_status ON node_cache(status); + +COMMENT ON TABLE node_cache IS 'Кеш нод з Node Registry для швидкого JOIN з agents'; + +-- ============================================================================ +-- Початкові дані для node_cache +-- ============================================================================ + +INSERT INTO node_cache (node_id, node_name, hostname, status, roles, environment) +VALUES + ('node-1-hetzner-gex44', 'Hetzner GEX44 Production', '144.76.224.179', 'online', + ARRAY['core', 'gateway', 'matrix', 'agents', 'gpu'], 'production'), + ('node-2-macbook-m4max', 'MacBook Pro M4 Max', '192.168.1.33', 'online', + ARRAY['development', 'gpu', 'ai_runtime'], 'development') +ON CONFLICT (node_id) DO UPDATE SET + node_name = EXCLUDED.node_name, + hostname = EXCLUDED.hostname, + status = EXCLUDED.status, + roles = EXCLUDED.roles, + environment = EXCLUDED.environment, + updated_at = NOW(); + +-- ============================================================================ +-- Тригер для оновлення updated_at +-- ============================================================================ + +CREATE OR REPLACE FUNCTION update_node_cache_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS trigger_update_node_cache_updated_at ON node_cache; +CREATE TRIGGER trigger_update_node_cache_updated_at + BEFORE UPDATE ON node_cache + FOR EACH ROW + EXECUTE FUNCTION update_node_cache_updated_at(); + +-- ============================================================================ +-- Перевірка результату +-- ============================================================================ + +SELECT + a.id, + a.display_name, + a.node_id, + nc.node_name, + nc.roles, + nc.environment +FROM agents a +LEFT JOIN node_cache nc ON a.node_id = nc.node_id +WHERE a.is_public = true +LIMIT 10; + +SELECT 'Migration 022 completed: Agent node_id normalized and node_cache created' AS result; +