···
{ system ? builtins.currentSystem,
3
-
pkgs ? import ../.. { inherit system config; }
3
+
pkgs ? import ../.. { inherit system config; },
with import ../lib/testing-python.nix { inherit system pkgs; };
···
# Makes a test for a PostgreSQL package, given by name and looked up from `pkgs`.
12
-
makePostgresqlWalReceiverTest = postgresqlPackage:
13
+
makeTestAttribute = name:
14
-
name = postgresqlPackage;
17
-
pkg = pkgs."${postgresqlPackage}";
18
-
postgresqlDataDir = "/var/lib/postgresql/${pkg.psqlSchema}";
19
-
replicationUser = "wal_receiver_user";
20
-
replicationSlot = "wal_receiver_slot";
21
-
replicationConn = "postgresql://${replicationUser}@localhost";
22
-
baseBackupDir = "/tmp/pg_basebackup";
23
-
walBackupDir = "/tmp/pg_wal";
24
-
atLeast12 = lib.versionAtLeast pkg.version "12.0";
16
+
value = makePostgresqlWalReceiverTest pkgs."${name}";
26
-
recoveryFile = if atLeast12
27
-
then pkgs.writeTextDir "recovery.signal" ""
28
-
else pkgs.writeTextDir "recovery.conf" "restore_command = 'cp ${walBackupDir}/%f %p'";
19
+
makePostgresqlWalReceiverTest = pkg:
21
+
postgresqlDataDir = "/var/lib/postgresql/${pkg.psqlSchema}";
22
+
replicationUser = "wal_receiver_user";
23
+
replicationSlot = "wal_receiver_slot";
24
+
replicationConn = "postgresql://${replicationUser}@localhost";
25
+
baseBackupDir = "/tmp/pg_basebackup";
26
+
walBackupDir = "/tmp/pg_wal";
27
+
atLeast12 = lib.versionAtLeast pkg.version "12.0";
31
-
name = "postgresql-wal-receiver-${postgresqlPackage}";
32
-
meta.maintainers = with lib.maintainers; [ pacien ];
29
+
recoveryFile = if atLeast12
30
+
then pkgs.writeTextDir "recovery.signal" ""
31
+
else pkgs.writeTextDir "recovery.conf" "restore_command = 'cp ${walBackupDir}/%f %p'";
34
-
nodes.machine = { ... }: {
35
-
services.postgresql = {
38
-
settings = lib.mkMerge [
40
-
wal_level = "archive"; # alias for replica on pg >= 9.6
41
-
max_wal_senders = 10;
42
-
max_replication_slots = 10;
44
-
(lib.mkIf atLeast12 {
45
-
restore_command = "cp ${walBackupDir}/%f %p";
46
-
recovery_end_command = "touch recovery.done";
50
-
host replication ${replicationUser} all trust
52
-
initialScript = pkgs.writeText "init.sql" ''
53
-
create user ${replicationUser} replication;
54
-
select * from pg_create_physical_replication_slot('${replicationSlot}');
34
+
name = "postgresql-wal-receiver-${pkg.name}";
35
+
meta.maintainers = with lib.maintainers; [ pacien ];
37
+
nodes.machine = { ... }: {
38
+
services.postgresql = {
41
+
settings = lib.mkMerge [
43
+
wal_level = "archive"; # alias for replica on pg >= 9.6
44
+
max_wal_senders = 10;
45
+
max_replication_slots = 10;
47
+
(lib.mkIf atLeast12 {
48
+
restore_command = "cp ${walBackupDir}/%f %p";
49
+
recovery_end_command = "touch recovery.done";
53
+
host replication ${replicationUser} all trust
55
+
initialScript = pkgs.writeText "init.sql" ''
56
+
create user ${replicationUser} replication;
57
+
select * from pg_create_physical_replication_slot('${replicationSlot}');
58
-
services.postgresqlWalReceiver.receivers.main = {
59
-
postgresqlPackage = pkg;
60
-
connection = replicationConn;
61
-
slot = replicationSlot;
62
-
directory = walBackupDir;
64
-
# This is only to speedup test, it isn't time racing. Service is set to autorestart always,
65
-
# default 60sec is fine for real system, but is too much for a test
66
-
systemd.services.postgresql-wal-receiver-main.serviceConfig.RestartSec = lib.mkForce 5;
61
+
services.postgresqlWalReceiver.receivers.main = {
62
+
postgresqlPackage = pkg;
63
+
connection = replicationConn;
64
+
slot = replicationSlot;
65
+
directory = walBackupDir;
67
+
# This is only to speedup test, it isn't time racing. Service is set to autorestart always,
68
+
# default 60sec is fine for real system, but is too much for a test
69
+
systemd.services.postgresql-wal-receiver-main.serviceConfig.RestartSec = lib.mkForce 5;
70
-
# make an initial base backup
71
-
machine.wait_for_unit("postgresql")
72
-
machine.wait_for_unit("postgresql-wal-receiver-main")
73
-
# WAL receiver healthchecks PG every 5 seconds, so let's be sure they have connected each other
74
-
# required only for 9.4
77
-
"${pkg}/bin/pg_basebackup --dbname=${replicationConn} --pgdata=${baseBackupDir}"
73
+
# make an initial base backup
74
+
machine.wait_for_unit("postgresql")
75
+
machine.wait_for_unit("postgresql-wal-receiver-main")
76
+
# WAL receiver healthchecks PG every 5 seconds, so let's be sure they have connected each other
77
+
# required only for 9.4
80
+
"${pkg}/bin/pg_basebackup --dbname=${replicationConn} --pgdata=${baseBackupDir}"
80
-
# create a dummy table with 100 records
82
-
"sudo -u postgres psql --command='create table dummy as select * from generate_series(1, 100) as val;'"
83
+
# create a dummy table with 100 records
85
+
"sudo -u postgres psql --command='create table dummy as select * from generate_series(1, 100) as val;'"
85
-
# stop postgres and destroy data
86
-
machine.systemctl("stop postgresql")
87
-
machine.systemctl("stop postgresql-wal-receiver-main")
88
-
machine.succeed("rm -r ${postgresqlDataDir}/{base,global,pg_*}")
88
+
# stop postgres and destroy data
89
+
machine.systemctl("stop postgresql")
90
+
machine.systemctl("stop postgresql-wal-receiver-main")
91
+
machine.succeed("rm -r ${postgresqlDataDir}/{base,global,pg_*}")
90
-
# restore the base backup
92
-
"cp -r ${baseBackupDir}/* ${postgresqlDataDir} && chown postgres:postgres -R ${postgresqlDataDir}"
93
+
# restore the base backup
95
+
"cp -r ${baseBackupDir}/* ${postgresqlDataDir} && chown postgres:postgres -R ${postgresqlDataDir}"
95
-
# prepare WAL and recovery
96
-
machine.succeed("chmod a+rX -R ${walBackupDir}")
98
-
"for part in ${walBackupDir}/*.partial; do mv $part ''${part%%.*}; done"
99
-
) # make use of partial segments too
101
-
"cp ${recoveryFile}/* ${postgresqlDataDir}/ && chmod 666 ${postgresqlDataDir}/recovery*"
98
+
# prepare WAL and recovery
99
+
machine.succeed("chmod a+rX -R ${walBackupDir}")
101
+
"for part in ${walBackupDir}/*.partial; do mv $part ''${part%%.*}; done"
102
+
) # make use of partial segments too
104
+
"cp ${recoveryFile}/* ${postgresqlDataDir}/ && chmod 666 ${postgresqlDataDir}/recovery*"
105
-
machine.systemctl("start postgresql")
106
-
machine.wait_for_file("${postgresqlDataDir}/recovery.done")
107
-
machine.systemctl("restart postgresql")
108
-
machine.wait_for_unit("postgresql")
108
+
machine.systemctl("start postgresql")
109
+
machine.wait_for_file("${postgresqlDataDir}/recovery.done")
110
+
machine.systemctl("restart postgresql")
111
+
machine.wait_for_unit("postgresql")
110
-
# check that our records have been restored
112
-
"test $(sudo -u postgres psql --pset='pager=off' --tuples-only --command='select count(distinct val) from dummy;') -eq 100"
113
+
# check that our records have been restored
115
+
"test $(sudo -u postgres psql --pset='pager=off' --tuples-only --command='select count(distinct val) from dummy;') -eq 100"
118
-
# Maps the generic function over all attributes of PostgreSQL packages
119
-
in builtins.listToAttrs (map makePostgresqlWalReceiverTest (builtins.attrNames (import ../../pkgs/servers/sql/postgresql pkgs)))
121
+
if package == null then
122
+
# all-tests.nix: Maps the generic function over all attributes of PostgreSQL packages
123
+
builtins.listToAttrs (map makeTestAttribute (builtins.attrNames (import ../../pkgs/servers/sql/postgresql pkgs)))
125
+
# Called directly from <package>.tests
126
+
makePostgresqlWalReceiverTest package