Skip to content

Commit 7de5141

Browse files
jfrocheyvan-sraka
andauthored
feat: enable nixosTest on aarch64 darwin (#1989)
* feat: enable nixosTest on aarch64 darwin Build nixosTest using a local aarch64 linux builder and run nixosTest qemu VM in aarch64 darwin. This keeps the tests fast as they don't require nested virtualisation. For example, you can run the nixos test for the http extension on your aarch64 macOS with: ```shell nix build .\#checks.aarch64-darwin.ext-http ``` * chore: reduce warnings related to system Current system value has been moved into `pkgs.stdenv.hostPlatform` by NixOS/nixpkgs#456527 * fix: remove redundant postgresqlWithExtension wrapper in extension tests The tests were unnecessarily wrapping psql_15 with postgresqlWithExtension when psql_15 already includes the extensions. * fix: remove port forwarding from test configurations This cause problem starting nixos tests on darwin hosts. * fix: remaining nixos test references to use pkgs.pkgsLinux - self.legacyPackages.${pkgs.stdenv.hostPlatform.system} -> pkgs.pkgsLinux.stdenv.hostPlatform.system - self.packages.${pkgs.stdenv.hostPlatform.system} -> pkgs.pkgsLinux.stdenv.hostPlatform.system * fix: improve HTTP mock server error handling and directory creation - Guard against empty dirname when creating port file directory - Use bare 'raise' to preserve original exception traceback - Only create directory if dirname is non-empty * fix: check full PostGIS version instead of just major version Changes the version assertion to compare the complete version string rather than only the major version, providing more precise validation. --------- Co-authored-by: Yvan Sraka <yvan@sraka.xyz>
1 parent 2ee1ac8 commit 7de5141

21 files changed

Lines changed: 444 additions & 283 deletions

nix/cargo-pgrx/mkPgrxExtension.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ let
4242
import (builtins.fetchTarball {
4343
url = "https://channels.nixos.org/nixos-22.11/nixexprs.tar.xz";
4444
sha256 = "1j7h75a9hwkkm97jicky5rhvzkdwxsv5v46473rl6agvq2sj97y1";
45-
}) { system = stdenv.hostPlatform.system; }
45+
}) { inherit (stdenv.hostPlatform) system; }
4646
);
4747
in
4848
rustPlatform.bindgenHook.overrideAttrs {

nix/checks.nix

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -439,21 +439,19 @@
439439
;
440440
devShell = self'.devShells.default;
441441
}
442-
// pkgs.lib.optionalAttrs (pkgs.stdenv.isLinux) (
443-
{
444-
inherit (self'.packages)
445-
postgresql_15_debug
446-
postgresql_15_src
447-
postgresql_orioledb-17_debug
448-
postgresql_orioledb-17_src
449-
postgresql_17_debug
450-
postgresql_17_src
451-
;
452-
}
453-
// (import ./ext/tests {
454-
inherit self;
455-
inherit pkgs;
456-
})
457-
);
442+
// (import ./ext/tests {
443+
inherit self;
444+
inherit pkgs;
445+
})
446+
// pkgs.lib.optionalAttrs (pkgs.stdenv.isLinux) {
447+
inherit (self'.packages)
448+
postgresql_15_debug
449+
postgresql_15_src
450+
postgresql_orioledb-17_debug
451+
postgresql_orioledb-17_src
452+
postgresql_17_debug
453+
postgresql_17_src
454+
;
455+
};
458456
};
459457
}

nix/ext/tests/default.nix

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ let
1616

1717
installedExtension =
1818
postgresMajorVersion:
19-
self.legacyPackages.${pkgs.stdenv.hostPlatform.system}."psql_${postgresMajorVersion}".exts."${
19+
self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}."psql_${postgresMajorVersion}".exts."${
2020
pname
2121
}";
2222
versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions;
@@ -25,15 +25,15 @@ let
2525
let
2626
majorVersion =
2727
if postgresql.isOrioleDB then "orioledb-17" else lib.versions.major postgresql.version;
28-
pkg = pkgs.buildEnv {
28+
pkg = pkgs.pkgsLinux.buildEnv {
2929
name = "postgresql-${majorVersion}-${pname}";
3030
paths = [
3131
postgresql
3232
postgresql.lib
3333
(installedExtension majorVersion)
3434
]
3535
++ lib.optional (postgresql.isOrioleDB
36-
) self.legacyPackages.${pkgs.stdenv.hostPlatform.system}.psql_orioledb-17.exts.orioledb;
36+
) self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.psql_orioledb-17.exts.orioledb;
3737
passthru = {
3838
inherit (postgresql) version psqlSchema;
3939
lib = pkg;
@@ -42,7 +42,7 @@ let
4242
withoutJIT = pkg;
4343
installedExtensions = [ (installedExtension majorVersion) ];
4444
};
45-
nativeBuildInputs = [ pkgs.makeWrapper ];
45+
nativeBuildInputs = [ pkgs.pkgsLinux.makeWrapper ];
4646
pathsToLink = [
4747
"/"
4848
"/bin"
@@ -56,27 +56,21 @@ let
5656
};
5757
in
5858
pkg;
59-
psql_15 = postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_15;
60-
psql_17 = postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_17;
59+
psql_15 =
60+
postgresqlWithExtension
61+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15;
62+
psql_17 =
63+
postgresqlWithExtension
64+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17;
6165
orioledb_17 =
6266
postgresqlWithExtension
63-
self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_orioledb-17;
67+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17;
6468
in
65-
self.inputs.nixpkgs.lib.nixos.runTest {
69+
pkgs.testers.runNixOSTest {
6670
name = pname;
67-
hostPkgs = pkgs;
6871
nodes.server =
6972
{ config, ... }:
7073
{
71-
virtualisation = {
72-
forwardPorts = [
73-
{
74-
from = "host";
75-
host.port = 13022;
76-
guest.port = 22;
77-
}
78-
];
79-
};
8074
services.openssh = {
8175
enable = true;
8276
};
@@ -153,7 +147,8 @@ let
153147
specialisation.orioledb17.configuration = {
154148
services.postgresql = {
155149
package = lib.mkForce (
156-
postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_orioledb-17
150+
postgresqlWithExtension
151+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17
157152
);
158153
settings = lib.mkForce (
159154
((installedExtension "17").defaultSettings or { })
@@ -191,7 +186,7 @@ let
191186
let
192187
newPostgresql =
193188
postgresqlWithExtension
194-
self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_orioledb-17;
189+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17;
195190
in
196191
''
197192
if [[ -z "${newPostgresql.psqlSchema}" ]]; then

nix/ext/tests/http.nix

Lines changed: 85 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
let
33
pname = "http";
44
inherit (pkgs) lib;
5+
mockServer = ../../tests/http-mock-server.py;
56
installedExtension =
67
postgresMajorVersion:
7-
self.legacyPackages.${pkgs.stdenv.hostPlatform.system}."psql_${postgresMajorVersion}".exts."${
8+
self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}."psql_${postgresMajorVersion}".exts."${
89
pname
910
}";
1011
versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions;
@@ -13,15 +14,15 @@ let
1314
let
1415
majorVersion =
1516
if postgresql.isOrioleDB then "orioledb-17" else lib.versions.major postgresql.version;
16-
pkg = pkgs.buildEnv {
17+
pkg = pkgs.pkgsLinux.buildEnv {
1718
name = "postgresql-${majorVersion}-${pname}";
1819
paths = [
1920
postgresql
2021
postgresql.lib
2122
(installedExtension majorVersion)
2223
]
2324
++ lib.optional (postgresql.isOrioleDB
24-
) self.legacyPackages.${pkgs.stdenv.hostPlatform.system}.psql_orioledb-17.exts.orioledb;
25+
) self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.psql_orioledb-17.exts.orioledb;
2526
passthru = {
2627
inherit (postgresql) version psqlSchema;
2728
installedExtensions = [ (installedExtension majorVersion) ];
@@ -30,7 +31,7 @@ let
3031
withJIT = pkg;
3132
withoutJIT = pkg;
3233
};
33-
nativeBuildInputs = [ pkgs.makeWrapper ];
34+
nativeBuildInputs = [ pkgs.pkgsLinux.makeWrapper ];
3435
pathsToLink = [
3536
"/"
3637
"/bin"
@@ -44,34 +45,30 @@ let
4445
};
4546
in
4647
pkg;
47-
psql_15 = postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_15;
48-
psql_17 = postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_17;
48+
psql_15 =
49+
postgresqlWithExtension
50+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15;
51+
psql_17 =
52+
postgresqlWithExtension
53+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17;
4954
orioledb_17 =
5055
postgresqlWithExtension
51-
self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_orioledb-17;
56+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17;
5257
in
53-
self.inputs.nixpkgs.lib.nixos.runTest {
58+
pkgs.testers.runNixOSTest {
5459
name = pname;
55-
hostPkgs = pkgs;
5660
nodes.server =
5761
{ config, ... }:
5862
{
59-
virtualisation = {
60-
forwardPorts = [
61-
{
62-
from = "host";
63-
host.port = 13022;
64-
guest.port = 22;
65-
}
66-
];
67-
};
6863
services.openssh = {
6964
enable = true;
7065
};
7166

7267
services.postgresql = {
7368
enable = true;
74-
package = postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_15;
69+
package =
70+
postgresqlWithExtension
71+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15;
7572
settings = (installedExtension "15").defaultSettings or { };
7673
authentication = ''
7774
local all postgres peer map=postgres
@@ -89,24 +86,40 @@ self.inputs.nixpkgs.lib.nixos.runTest {
8986
];
9087
initialScript = pkgs.writeText "init-postgres" ''
9188
CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
92-
INSERT INTO test_config (key, value) VALUES ('http_mock_port', '8880') ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
9389
'';
9490
};
9591

9692
systemd.services.http-mock-server = {
9793
wantedBy = [ "multi-user.target" ];
94+
before = [ "postgresql.service" ];
9895
serviceConfig = {
9996
Type = "simple";
97+
Restart = "on-failure";
98+
RestartSec = "2";
99+
TimeoutStartSec = "30";
100+
User = "root";
101+
};
102+
environment = {
103+
HTTP_MOCK_PORT_FILE = "/tmp/http-mock-port";
104+
PYTHONUNBUFFERED = "1";
100105
};
101106
script = ''
102-
${pkgs.python3}/bin/python3 ${../../tests/http-mock-server.py}
107+
# Ensure temp directory exists
108+
mkdir -p /tmp
109+
110+
# Start the mock server
111+
exec ${pkgs.pkgsLinux.python3}/bin/python3 ${mockServer}
103112
'';
104113
};
105114

115+
systemd.services.postgresql = {
116+
after = [ "http-mock-server.service" ];
117+
};
118+
106119
specialisation.postgresql17.configuration = {
107120
services.postgresql = {
108121
package = lib.mkForce (
109-
postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_17
122+
postgresqlWithExtension self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17
110123
);
111124
settings = ((installedExtension "17").defaultSettings or { });
112125
};
@@ -124,10 +137,10 @@ self.inputs.nixpkgs.lib.nixos.runTest {
124137
let
125138
oldPostgresql =
126139
postgresqlWithExtension
127-
self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_15;
140+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15;
128141
newPostgresql =
129142
postgresqlWithExtension
130-
self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_17;
143+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17;
131144
oldDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${oldPostgresql.psqlSchema}";
132145
newDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}";
133146
in
@@ -152,7 +165,8 @@ self.inputs.nixpkgs.lib.nixos.runTest {
152165
specialisation.orioledb17.configuration = {
153166
services.postgresql = {
154167
package = lib.mkForce (
155-
postgresqlWithExtension self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_orioledb-17
168+
postgresqlWithExtension
169+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17
156170
);
157171
settings = lib.mkForce (
158172
((installedExtension "17").defaultSettings or { })
@@ -175,7 +189,6 @@ self.inputs.nixpkgs.lib.nixos.runTest {
175189
pkgs.writeText "init-postgres-with-orioledb" ''
176190
CREATE EXTENSION orioledb CASCADE;
177191
CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
178-
INSERT INTO test_config (key, value) VALUES ('http_mock_port', '8880') ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
179192
''
180193
);
181194
};
@@ -194,7 +207,7 @@ self.inputs.nixpkgs.lib.nixos.runTest {
194207
let
195208
newPostgresql =
196209
postgresqlWithExtension
197-
self.packages.${pkgs.stdenv.hostPlatform.system}.postgresql_orioledb-17;
210+
self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17;
198211
in
199212
''
200213
if [[ -z "${newPostgresql.psqlSchema}" ]]; then
@@ -243,8 +256,37 @@ self.inputs.nixpkgs.lib.nixos.runTest {
243256
start_all()
244257
245258
server.wait_for_unit("multi-user.target")
259+
server.wait_for_unit("http-mock-server.service")
246260
server.wait_for_unit("postgresql.service")
247261
262+
# Read the HTTP mock port and configure it in PostgreSQL
263+
# Wait for the port file to be created with retry logic
264+
server.succeed("""
265+
for i in {1..30}; do
266+
if [ -f /tmp/http-mock-port ]; then
267+
break
268+
fi
269+
echo "Waiting for HTTP mock server port file... ($i/30)"
270+
sleep 1
271+
done
272+
273+
if [ ! -f /tmp/http-mock-port ]; then
274+
echo "ERROR: HTTP mock server port file not found after 30 seconds"
275+
systemctl status http-mock-server.service || true
276+
journalctl -u http-mock-server.service --no-pager || true
277+
exit 1
278+
fi
279+
""")
280+
281+
http_port = server.succeed("cat /tmp/http-mock-port").strip()
282+
server.succeed(f"""
283+
sudo -u postgres psql -d postgres -c '
284+
CREATE TABLE IF NOT EXISTS test_config (key TEXT PRIMARY KEY, value TEXT);
285+
INSERT INTO test_config (key, value) VALUES ('"'"'http_mock_port'"'"', '"'"'{http_port}'"'"')
286+
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
287+
'
288+
""")
289+
248290
test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory, support_upgrade, ext_schema, lib_name)
249291
test.create_schema()
250292
@@ -269,6 +311,14 @@ self.inputs.nixpkgs.lib.nixos.runTest {
269311
server.succeed(
270312
"${pg17-configuration}/bin/switch-to-configuration test >&2"
271313
)
314+
server.wait_for_unit("postgresql.service")
315+
# Reconfigure the HTTP mock port after switching PostgreSQL version
316+
server.succeed(f"""
317+
sudo -u postgres psql -d postgres -c '
318+
INSERT INTO test_config (key, value) VALUES ('"'"'http_mock_port'"'"', '"'"'{http_port}'"'"')
319+
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
320+
'
321+
""")
272322
273323
with subtest("Check last version of the extension after postgresql upgrade"):
274324
test.assert_version_matches(last_version)
@@ -289,6 +339,14 @@ self.inputs.nixpkgs.lib.nixos.runTest {
289339
server.succeed(
290340
"${orioledb17-configuration}/bin/switch-to-configuration test >&2"
291341
)
342+
server.wait_for_unit("postgresql.service")
343+
# Reconfigure the HTTP mock port after switching to orioledb
344+
server.succeed(f"""
345+
sudo -u postgres psql -d postgres -c '
346+
INSERT INTO test_config (key, value) VALUES ('"'"'http_mock_port'"'"', '"'"'{http_port}'"'"')
347+
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
348+
'
349+
""")
292350
installed_extensions=test.run_sql("""SELECT extname FROM pg_extension WHERE extname = 'orioledb';""")
293351
assert "orioledb" in installed_extensions
294352
test.create_schema()

0 commit comments

Comments
 (0)