Skip to content

Commit df67664

Browse files
committed
feat: multiple versions for the wrappers extension
Build multiple versions of the wrappers extension on different PostgreSQL versions. Add test for the extensions and their upgrade on PostgreSQL 15 and 17. Make sure we build cargo extension and cargo-pgrx with the specified Rust version.
1 parent ad2e475 commit df67664

File tree

6 files changed

+425
-164
lines changed

6 files changed

+425
-164
lines changed

flake.nix

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,6 +1384,8 @@
13841384
devShell = devShells.default;
13851385
} // pkgs.lib.optionalAttrs (system == "aarch64-linux") {
13861386
inherit (basePackages) postgresql_15_debug postgresql_15_src postgresql_orioledb-17_debug postgresql_orioledb-17_src postgresql_17_debug postgresql_17_src;
1387+
} // pkgs.lib.optionalAttrs (system == "x86_64-linux") {
1388+
wrappers = import ./nix/ext/tests/wrappers.nix { inherit self; inherit pkgs; };
13871389
};
13881390

13891391
# Apps is a list of names of things that can be executed with 'nix run';

nix/cargo-pgrx/mkPgrxExtension.nix

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ let
2626
let
2727
pgrx =
2828
versions.${pgrxVersion}
29-
or (throw "Unsupported pgrx version ${pgrxVersion}. Available versions: ${builtins.attrNames versions}. Change 'nix/cargo-pgrx/versions.json' to add support for new versions.");
29+
or (throw "Unsupported pgrx version ${pgrxVersion}. Available versions: ${builtins.toString (builtins.attrNames versions)}. Change 'nix/cargo-pgrx/versions.json' to add support for new versions.");
3030
mapping = {
3131
inherit (pgrx) hash;
3232
cargoHash =
3333
pgrx.rust."${rustVersion}".cargoHash
34-
or (throw "Unsupported rust version ${rustVersion} for pgrx version ${pgrxVersion}. Available Rust versions: ${builtins.attrNames pgrx.rust}. Change 'nix/cargo-pgrx/versions.json' to add support for new versions.");
34+
or (throw "Unsupported rust version ${rustVersion} for pgrx version ${pgrxVersion}. Available Rust versions: ${builtins.toString (builtins.attrNames pgrx.rust)}. Change 'nix/cargo-pgrx/versions.json' to add support for new versions.");
3535
};
3636
in
3737
mkCargoPgrx {

nix/cargo-pgrx/versions.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
"0.11.3": {
1414
"hash": "sha256-UHIfwOdXoJvR4Svha6ud0FxahP1wPwUtviUwUnTmLXU=",
1515
"rust": {
16+
"1.76.0": {
17+
"cargoHash": "sha256-j4HnD8Zt9uhlV5N7ldIy9564o9qFEqs5KfXHmnQ1WEw="
18+
},
1619
"1.85.1": {
1720
"cargoHash": "sha256-KBlT3FARjGcbtHIGDoC6ir3aNXXfDRmIoy990SOqoFg="
1821
}
@@ -21,6 +24,9 @@
2124
"0.12.6": {
2225
"hash": "sha256-7aQkrApALZe6EoQGVShGBj0UIATnfOy2DytFj9IWdEA=",
2326
"rust": {
27+
"1.80.0": {
28+
"cargoHash": "sha256-Di4UldQwAt3xVyvgQT1gUhdvYUVp7n/a72pnX45kP0w="
29+
},
2430
"1.81.0": {
2531
"cargoHash": "sha256-Di4UldQwAt3xVyvgQT1gUhdvYUVp7n/a72pnX45kP0w="
2632
}
@@ -31,6 +37,9 @@
3137
"rust": {
3238
"1.81.0": {
3339
"cargoHash": "sha256-53HKhvsKLTa2JCByLEcK3UzWXoM+LTatd98zvS1C9no="
40+
},
41+
"1.84.0": {
42+
"cargoHash": "sha256-KTKcol9qSNLQZGW32e6fBb6cPkUGItknyVpLdBYqrBY="
3443
}
3544
}
3645
}

nix/ext/tests/wrappers.nix

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

nix/ext/versions.json

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{
2+
"wrappers": {
3+
"0.4.2": {
4+
"postgresql": [
5+
"15"
6+
],
7+
"hash": "sha256-ut3IQED6ANXgabiHoEUdfSrwkuuYYSpRoeWdtBvSe64=",
8+
"pgrx": "0.11.3",
9+
"rust": "1.76.0"
10+
},
11+
"0.4.3": {
12+
"postgresql": [
13+
"15"
14+
],
15+
"hash": "sha256-CkoNMoh40zbQL4V49ZNYgv3JjoNWjODtTpHn+L8DdZA=",
16+
"pgrx": "0.12.6",
17+
"rust": "1.80.0"
18+
},
19+
"0.4.4": {
20+
"postgresql": [
21+
"15",
22+
"17"
23+
],
24+
"hash": "sha256-QoGFJpq8PuvMM8SS+VZd7MlNl56uFivRjs1tCtwX+oE=",
25+
"pgrx": "0.12.6",
26+
"rust": "1.80.0"
27+
},
28+
"0.4.5": {
29+
"postgresql": [
30+
"15",
31+
"17"
32+
],
33+
"hash": "sha256-IgDfVFROMCHYLZ/Iqj12MsQjPPCdRoH+3oi3Ki/iaRI=",
34+
"pgrx": "0.12.9",
35+
"rust": "1.81.0"
36+
},
37+
"0.4.6": {
38+
"postgresql": [
39+
"15",
40+
"17"
41+
],
42+
"hash": "sha256-hthb3qEXT1Kf4yPoq0udEbQzlyLtI5tug6sK4YAPFjU=",
43+
"pgrx": "0.12.9",
44+
"rust": "1.84.0"
45+
},
46+
"0.5.0": {
47+
"postgresql": [
48+
"15",
49+
"17"
50+
],
51+
"hash": "sha256-FbRTUcpEHBa5DI6dutvBeahYM0RZVAXIzIAZWIaxvn0=",
52+
"pgrx": "0.12.9",
53+
"rust": "1.84.0"
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)