From 5257d4e70b19c9079710c1aa827ba6f63256fa11 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 15 Aug 2024 01:07:07 +0200 Subject: [PATCH] cluster/services/patroni: test takeovers --- .../services/patroni/simulacrum/test-data.nix | 5 ++++ cluster/services/patroni/simulacrum/test.nix | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/cluster/services/patroni/simulacrum/test-data.nix b/cluster/services/patroni/simulacrum/test-data.nix index e56e862..11a4d1b 100644 --- a/cluster/services/patroni/simulacrum/test-data.nix +++ b/cluster/services/patroni/simulacrum/test-data.nix @@ -3,12 +3,17 @@ patroni = lib.mkIf config.simulacrum { databases = config.lib.forService "patroni" { testdb.owner = "testuser"; + existingdb.owner = "existinguser"; }; users = config.lib.forService "patroni" { testuser.locksmith = { nodes = config.services.patroni.nodes.haproxy; format = "pgpass"; }; + existinguser.locksmith = { + nodes = config.services.patroni.nodes.haproxy; + format = "pgpass"; + }; }; }; } diff --git a/cluster/services/patroni/simulacrum/test.nix b/cluster/services/patroni/simulacrum/test.nix index 438bfed..3460ec1 100644 --- a/cluster/services/patroni/simulacrum/test.nix +++ b/cluster/services/patroni/simulacrum/test.nix @@ -87,5 +87,31 @@ in for client in clients: client.succeed(f"PGPASSFILE=/run/locksmith/patroni-testuser psql -h ${link.ipv4} -p ${link.portStr} -U testuser -d testdb --command='create table test_table_{client.name} as select * from generate_series(1, 10) as val;'") client.fail("PGPASSFILE=/run/locksmith/patroni-testuser psql -h ${link.ipv4} -p ${link.portStr} -U testuser -d postgres --command='select * from dummy;'") + + with subtest("should take over existing databases and users via incandescence"): + for cmd in [ + "drop database existingdb;", + "drop user existinguser;", + "create database existingdb owner postgres;", + "create user existinguser;" + ]: + clients[0].succeed(f"psql -h ${link.ipv4} -p ${link.portStr} -U postgres --command='{cmd}'") + + for client in clients: + client.fail(f"PGPASSFILE=/run/locksmith/patroni-existinguser psql -h ${link.ipv4} -p ${link.portStr} -U existinguser -d existingdb --command='create table test_table_{client.name} as select * from generate_series(1, 10) as val;'") + + consulConfig = json.loads(clients[0].succeed("cat /etc/consul.json")) + addr = consulConfig["addresses"]["http"] + port = consulConfig["ports"]["http"] + setEnv = f"CONSUL_HTTP_ADDR={addr}:{port}" + clients[0].succeed(f"{setEnv} consul kv delete --recurse services/incandescence/providers/patroni/formulae/database/existingdb") + clients[0].succeed(f"{setEnv} consul kv delete --recurse services/incandescence/providers/patroni/formulae/user/existinguser") + + for node in nodes: + node.systemctl("restart incandescence-patroni.target") + clients[0].succeed("[[ $(psql -h ${link.ipv4} -p ${link.portStr} -U postgres --tuples-only --csv --command=\"SELECT pg_roles.rolname FROM pg_database JOIN pg_roles ON pg_database.datdba = pg_roles.oid WHERE pg_database.datname = 'existingdb'\") == existinguser ]]") + for client in clients: + client.succeed(f"PGPASSFILE=/run/locksmith/patroni-existinguser psql -h ${link.ipv4} -p ${link.portStr} -U existinguser -d existingdb --command='create table test_table_{client.name} as select * from generate_series(1, 10) as val;'") + client.fail("PGPASSFILE=/run/locksmith/patroni-existinguser psql -h ${link.ipv4} -p ${link.portStr} -U existinguser -d postgres --command='select * from dummy;'") ''; }