|
529 | 529 | RETURN (part_one::bigint << 32) + part_two::bigint; |
530 | 530 | END; |
531 | 531 | $_$ LANGUAGE plpgsql IMMUTABLE STRICT; |
532 | | -""" |
| 532 | +
|
| 533 | +CREATE OR REPLACE FUNCTION tf_kafka_produce_event() RETURNS trigger AS $$ |
| 534 | +BEGIN |
| 535 | + IF TG_OP = 'DELETE' THEN |
| 536 | + INSERT INTO kafka_produce_event (table_name, event_type, payload) VALUES (TG_TABLE_NAME, TG_OP, row_to_json(OLD)::jsonb); |
| 537 | + ELSIF OLD IS DISTINCT FROM NEW THEN |
| 538 | + INSERT INTO kafka_produce_event (table_name, event_type, payload) VALUES (TG_TABLE_NAME, TG_OP, row_to_json(NEW)::jsonb); |
| 539 | + END IF; |
| 540 | + RETURN NEW; |
| 541 | +END; |
| 542 | +$$ LANGUAGE plpgsql;""" |
533 | 543 |
|
534 | 544 | ip_net = """ |
535 | 545 | -------------------------------------------- |
|
538 | 548 | -- |
539 | 549 | -------------------------------------------- |
540 | 550 |
|
541 | | -COMMENT ON DATABASE %s IS 'NIPAP database - schema version: 7'; |
| 551 | +COMMENT ON DATABASE %s IS 'NIPAP database - schema version: 8'; |
542 | 552 |
|
543 | 553 | CREATE EXTENSION IF NOT EXISTS ip4r; |
544 | 554 | CREATE EXTENSION IF NOT EXISTS hstore; |
|
790 | 800 | CREATE INDEX ip_net_log__prefix__index ON ip_net_log(prefix_id); |
791 | 801 | CREATE INDEX ip_net_log__pool__index ON ip_net_log(pool_id); |
792 | 802 |
|
793 | | -""" |
| 803 | +-- |
| 804 | +-- Kafka event table and triggers |
| 805 | +-- |
| 806 | +-- This table is used as a queue for the external kafka_producer process. |
| 807 | +-- Triggers on the core tables insert events here. The daemon will enable or |
| 808 | +-- disable these triggers at startup depending on configuration. |
| 809 | +-- |
| 810 | +CREATE TABLE IF NOT EXISTS kafka_produce_event ( |
| 811 | + id SERIAL PRIMARY KEY, |
| 812 | + table_name TEXT NOT NULL, |
| 813 | + event_type TEXT NOT NULL, |
| 814 | + payload JSONB, |
| 815 | + processed BOOLEAN DEFAULT FALSE, |
| 816 | + created_at TIMESTAMP WITH TIME ZONE DEFAULT now() |
| 817 | +);""" |
794 | 818 |
|
795 | 819 | triggers = """ |
796 | 820 | -- |
|
1768 | 1792 | WHEN (OLD.ipv4_default_prefix_length IS DISTINCT FROM NEW.ipv4_default_prefix_length |
1769 | 1793 | OR OLD.ipv6_default_prefix_length IS DISTINCT FROM NEW.ipv6_default_prefix_length) |
1770 | 1794 | EXECUTE PROCEDURE tf_ip_net_pool__iu_before(); |
1771 | | -""" |
| 1795 | +
|
| 1796 | +-- Triggers that write to kafka_produce_event |
| 1797 | +CREATE TRIGGER trigger_kafka_ip_net_plan |
| 1798 | + AFTER INSERT OR UPDATE OR DELETE |
| 1799 | + ON ip_net_plan |
| 1800 | + FOR EACH ROW |
| 1801 | + EXECUTE PROCEDURE tf_kafka_produce_event(); |
| 1802 | +
|
| 1803 | +CREATE TRIGGER trigger_kafka_ip_net_vrf |
| 1804 | + AFTER INSERT OR UPDATE OR DELETE |
| 1805 | + ON ip_net_vrf |
| 1806 | + FOR EACH ROW |
| 1807 | + EXECUTE PROCEDURE tf_kafka_produce_event(); |
| 1808 | +
|
| 1809 | +CREATE TRIGGER trigger_kafka_ip_net_pool |
| 1810 | + AFTER INSERT OR UPDATE OR DELETE |
| 1811 | + ON ip_net_pool |
| 1812 | + FOR EACH ROW |
| 1813 | + EXECUTE PROCEDURE tf_kafka_produce_event();""" |
1772 | 1814 |
|
1773 | 1815 | upgrade = [ |
1774 | 1816 | """ |
|
2272 | 2314 | -- update database schema version |
2273 | 2315 | COMMENT ON DATABASE %s IS 'NIPAP database - schema version: 7'; |
2274 | 2316 | """, |
| 2317 | +""" |
| 2318 | +-- |
| 2319 | +-- Upgrade from NIPAP database schema version 7 to 8 |
| 2320 | +-- |
| 2321 | +
|
| 2322 | +-- |
| 2323 | +-- Kafka event table and triggers |
| 2324 | +-- |
| 2325 | +-- This table is used as a queue for the external kafka_producer process. |
| 2326 | +-- Triggers on the core tables insert events here. The daemon will enable or |
| 2327 | +-- disable these triggers at startup depending on configuration. |
| 2328 | +-- |
| 2329 | +CREATE TABLE IF NOT EXISTS kafka_produce_event ( |
| 2330 | + id SERIAL PRIMARY KEY, |
| 2331 | + table_name TEXT NOT NULL, |
| 2332 | + event_type TEXT NOT NULL, |
| 2333 | + payload JSONB, |
| 2334 | + processed BOOLEAN DEFAULT FALSE, |
| 2335 | + created_at TIMESTAMP WITH TIME ZONE DEFAULT now() |
| 2336 | +); |
| 2337 | +
|
| 2338 | +CREATE OR REPLACE FUNCTION tf_kafka_produce_event() RETURNS trigger AS $$ |
| 2339 | +BEGIN |
| 2340 | + IF TG_OP = 'DELETE' THEN |
| 2341 | + INSERT INTO kafka_produce_event (table_name, event_type, payload) VALUES (TG_TABLE_NAME, TG_OP, row_to_json(OLD)::jsonb); |
| 2342 | + ELSIF OLD IS DISTINCT FROM NEW THEN |
| 2343 | + INSERT INTO kafka_produce_event (table_name, event_type, payload) VALUES (TG_TABLE_NAME, TG_OP, row_to_json(NEW)::jsonb); |
| 2344 | + END IF; |
| 2345 | + RETURN NEW; |
| 2346 | +END; |
| 2347 | +$$ LANGUAGE plpgsql; |
| 2348 | +
|
| 2349 | +-- Triggers that write to kafka_produce_event |
| 2350 | +CREATE TRIGGER trigger_kafka_ip_net_plan |
| 2351 | + AFTER INSERT OR UPDATE OR DELETE |
| 2352 | + ON ip_net_plan |
| 2353 | + FOR EACH ROW |
| 2354 | + EXECUTE PROCEDURE tf_kafka_produce_event(); |
| 2355 | +
|
| 2356 | +CREATE TRIGGER trigger_kafka_ip_net_vrf |
| 2357 | + AFTER INSERT OR UPDATE OR DELETE |
| 2358 | + ON ip_net_vrf |
| 2359 | + FOR EACH ROW |
| 2360 | + EXECUTE PROCEDURE tf_kafka_produce_event(); |
| 2361 | +
|
| 2362 | +CREATE TRIGGER trigger_kafka_ip_net_pool |
| 2363 | + AFTER INSERT OR UPDATE OR DELETE |
| 2364 | + ON ip_net_pool |
| 2365 | + FOR EACH ROW |
| 2366 | + EXECUTE PROCEDURE tf_kafka_produce_event(); |
| 2367 | +
|
| 2368 | +
|
| 2369 | +-- update database schema version |
| 2370 | +COMMENT ON DATABASE %s IS 'NIPAP database - schema version: 8'; |
| 2371 | +""", |
2275 | 2372 | ] |
0 commit comments