Skip to content

Commit 5fde725

Browse files
jfrochesamrose
authored andcommitted
feat: add nixos test for pg_cron extension
1 parent e8446a4 commit 5fde725

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed

nix/checks.nix

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,10 @@
309309
;
310310
}
311311
// pkgs.lib.optionalAttrs (system == "x86_64-linux") {
312+
pg_cron = import ./ext/tests/pg_cron.nix {
313+
inherit self;
314+
inherit pkgs;
315+
};
312316
pg_net = import ./ext/tests/pg_net.nix {
313317
inherit self;
314318
inherit pkgs;

nix/ext/tests/pg_cron.nix

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
{ self, pkgs }:
2+
let
3+
pname = "pg_cron";
4+
inherit (pkgs) lib;
5+
installedExtension =
6+
postgresMajorVersion: self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/${pname}-all";
7+
versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions;
8+
postgresqlWithExtension =
9+
postgresql:
10+
let
11+
majorVersion = lib.versions.major postgresql.version;
12+
pkg = pkgs.buildEnv {
13+
name = "postgresql-${majorVersion}-${pname}";
14+
paths = [
15+
postgresql
16+
postgresql.lib
17+
(installedExtension majorVersion)
18+
self.packages.${pkgs.system}."psql_${majorVersion}/exts/hypopg" # dependency
19+
];
20+
passthru = {
21+
inherit (postgresql) version psqlSchema;
22+
lib = pkg;
23+
withPackages = _: pkg;
24+
};
25+
nativeBuildInputs = [ pkgs.makeWrapper ];
26+
pathsToLink = [
27+
"/"
28+
"/bin"
29+
"/lib"
30+
];
31+
postBuild = ''
32+
wrapProgram $out/bin/postgres --set NIX_PGLIBDIR $out/lib
33+
wrapProgram $out/bin/pg_ctl --set NIX_PGLIBDIR $out/lib
34+
wrapProgram $out/bin/pg_upgrade --set NIX_PGLIBDIR $out/lib
35+
'';
36+
};
37+
in
38+
pkg;
39+
in
40+
self.inputs.nixpkgs.lib.nixos.runTest {
41+
name = pname;
42+
hostPkgs = pkgs;
43+
nodes.server =
44+
{ config, ... }:
45+
{
46+
virtualisation = {
47+
forwardPorts = [
48+
{
49+
from = "host";
50+
host.port = 13022;
51+
guest.port = 22;
52+
}
53+
];
54+
};
55+
56+
services.postgresql = {
57+
enable = true;
58+
package = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15;
59+
settings = {
60+
"cron.database_name" = "postgres";
61+
shared_preload_libraries = "pg_cron";
62+
};
63+
};
64+
65+
specialisation.postgresql17.configuration = {
66+
services.postgresql = {
67+
package = lib.mkForce (postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17);
68+
};
69+
70+
systemd.services.postgresql-migrate = {
71+
serviceConfig = {
72+
Type = "oneshot";
73+
RemainAfterExit = true;
74+
User = "postgres";
75+
Group = "postgres";
76+
StateDirectory = "postgresql";
77+
WorkingDirectory = "${builtins.dirOf config.services.postgresql.dataDir}";
78+
};
79+
script =
80+
let
81+
oldPostgresql = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15;
82+
newPostgresql = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17;
83+
oldDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${oldPostgresql.psqlSchema}";
84+
newDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}";
85+
in
86+
''
87+
if [[ ! -d ${newDataDir} ]]; then
88+
install -d -m 0700 -o postgres -g postgres "${newDataDir}"
89+
${newPostgresql}/bin/initdb -D "${newDataDir}"
90+
${newPostgresql}/bin/pg_upgrade --old-datadir "${oldDataDir}" --new-datadir "${newDataDir}" \
91+
--old-bindir "${oldPostgresql}/bin" --new-bindir "${newPostgresql}/bin"
92+
else
93+
echo "${newDataDir} already exists"
94+
fi
95+
'';
96+
};
97+
98+
systemd.services.postgresql = {
99+
after = [ "postgresql-migrate.service" ];
100+
requires = [ "postgresql-migrate.service" ];
101+
};
102+
};
103+
};
104+
testScript =
105+
{ nodes, ... }:
106+
let
107+
pg17-configuration = "${nodes.server.system.build.toplevel}/specialisation/postgresql17";
108+
in
109+
''
110+
versions = {
111+
"15": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "15"))}],
112+
"17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "17"))}],
113+
}
114+
115+
def run_sql(query):
116+
return server.succeed(f"""sudo -u postgres psql -t -A -F\",\" -c \"{query}\" """).strip()
117+
118+
def check_upgrade_path(pg_version):
119+
with subtest("Check ${pname} upgrade path"):
120+
firstVersion = versions[pg_version][0]
121+
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION IF EXISTS ${pname};'")
122+
run_sql(f"""CREATE EXTENSION ${pname} WITH VERSION '{firstVersion}' CASCADE;""")
123+
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = '${pname}';""")
124+
assert installed_version == firstVersion, f"Expected ${pname} version {firstVersion}, but found {installed_version}"
125+
for version in versions[pg_version][1:]:
126+
run_sql(f"""ALTER EXTENSION ${pname} UPDATE TO '{version}';""")
127+
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = '${pname}';""")
128+
assert installed_version == version, f"Expected ${pname} version {version}, but found {installed_version}"
129+
130+
start_all()
131+
132+
server.wait_for_unit("multi-user.target")
133+
server.wait_for_unit("postgresql.service")
134+
135+
check_upgrade_path("15")
136+
137+
with subtest("Check ${pname} latest extension version"):
138+
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION ${pname};'")
139+
server.succeed("sudo -u postgres psql -c 'CREATE EXTENSION ${pname} CASCADE;'")
140+
installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""")
141+
latestVersion = versions["15"][-1]
142+
assert f"${pname},{latestVersion}" in installed_extensions
143+
144+
with subtest("switch to postgresql 17"):
145+
server.succeed(
146+
"${pg17-configuration}/bin/switch-to-configuration test >&2"
147+
)
148+
149+
check_upgrade_path("17")
150+
'';
151+
}

0 commit comments

Comments
 (0)