Skip to content

Commit f0a8927

Browse files
jfrochesamrose
authored andcommitted
feat: refactor pg_net according to previous refactoring
1 parent 5e8a6b6 commit f0a8927

File tree

2 files changed

+45
-138
lines changed

2 files changed

+45
-138
lines changed

nix/ext/pg_net.nix

Lines changed: 4 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -6,111 +6,11 @@
66
curl,
77
postgresql,
88
libuv,
9-
writeShellApplication,
109
makeWrapper,
10+
switch-ext-version,
1111
}:
1212

1313
let
14-
enableOverlayOnPackage = writeShellApplication {
15-
name = "enable_overlay_on_package";
16-
runtimeInputs = [ pkgs.coreutils ];
17-
text = ''
18-
# This script enable overlayfs on a specific nix store path
19-
set -euo pipefail
20-
21-
if [ $# -ne 1 ]; then
22-
echo "Usage: $0 <path>"
23-
exit 1
24-
fi
25-
26-
PACKAGE_PATH="$1"
27-
PACKAGE_NAME=$(basename "$1"|cut -c 34-)
28-
29-
# Nixos compatibility: use systemd mount unit
30-
#shellcheck disable=SC1091
31-
source /etc/os-release || true
32-
if [[ "$ID" == "nixos" ]]; then
33-
# This script is used in NixOS test only for the moment
34-
SYSTEMD_DIR="/run/systemd/system"
35-
else
36-
SYSTEMD_DIR="/etc/systemd/system"
37-
fi
38-
39-
# Create required directories for overlay
40-
echo "$PACKAGE_NAME"
41-
mkdir -p "/var/lib/overlay/$PACKAGE_NAME/"{upper,work}
42-
43-
PACKAGE_MOUNT_PATH=$(systemd-escape -p --suffix=mount "$PACKAGE_PATH")
44-
45-
cat > "$SYSTEMD_DIR/$PACKAGE_MOUNT_PATH" <<EOF
46-
[Unit]
47-
Description=Overlay mount for PostgreSQL extension $PACKAGE_NAME
48-
49-
[Mount]
50-
What=overlay
51-
Type=overlay
52-
Options=lowerdir=$PACKAGE_PATH,upperdir=/var/lib/overlay/$PACKAGE_NAME/upper,workdir=/var/lib/overlay/$PACKAGE_NAME/work
53-
54-
[Install]
55-
WantedBy=multi-user.target
56-
EOF
57-
58-
systemctl daemon-reload
59-
systemctl start "$PACKAGE_MOUNT_PATH"
60-
'';
61-
};
62-
switchPgNetVersion = writeShellApplication {
63-
name = "switch_pg_net_version";
64-
runtimeInputs = [ pkgs.coreutils ];
65-
text = ''
66-
# Create version switcher script
67-
set -euo pipefail
68-
69-
# Check if the required environment variables are set
70-
if [ -z "''${EXT_WRAPPER:-}" ]; then
71-
echo "Error: EXT_WRAPPER environment variable is not set."
72-
exit 1
73-
fi
74-
75-
if [ $# -ne 1 ]; then
76-
echo "Usage: $0 <version>"
77-
echo "Example: $0 0.10.0"
78-
echo ""
79-
echo "Optional environment variables:"
80-
echo " NIX_PROFILE - Path to nix profile (default: /var/lib/postgresql/.nix-profile)"
81-
echo " LIB_DIR - Override library directory"
82-
echo " EXTENSION_DIR - Override extension directory"
83-
exit 1
84-
fi
85-
86-
VERSION="$1"
87-
echo "$VERSION"
88-
89-
# Enable overlay on the wrapper package to be able to switch version
90-
${lib.getExe enableOverlayOnPackage} "$EXT_WRAPPER"
91-
92-
# Check if version exists
93-
EXT_WRAPPER_LIB="$EXT_WRAPPER/lib"
94-
PG_NET_LIB_TO_USE="$EXT_WRAPPER_LIB/pg_net-$VERSION${postgresql.dlSuffix}"
95-
if [ ! -f "$PG_NET_LIB_TO_USE" ]; then
96-
echo "Error: Version $VERSION not found in $EXT_WRAPPER_LIB"
97-
echo "Available versions:"
98-
#shellcheck disable=SC2012
99-
ls "$EXT_WRAPPER_LIB"/pg_net-*${postgresql.dlSuffix} 2>/dev/null | sed 's/.*pg_net-/ /' | sed 's/${postgresql.dlSuffix}$//' || echo " No versions found"
100-
exit 1
101-
fi
102-
103-
# Update library symlink
104-
ln -sfnv "$PG_NET_LIB_TO_USE" "$EXT_WRAPPER_LIB/pg_net${postgresql.dlSuffix}"
105-
106-
# Update control file
107-
EXT_WRAPPER_SHARE="$EXT_WRAPPER/share/postgresql/extension"
108-
echo "default_version = '$VERSION'" > "$EXT_WRAPPER_SHARE/pg_net.control"
109-
cat "$EXT_WRAPPER_SHARE/pg_net--$VERSION.control" >> "$EXT_WRAPPER_SHARE/pg_net.control"
110-
111-
echo "Successfully switched pg_net to version $VERSION"
112-
'';
113-
};
11414
pname = "pg_net";
11515
build =
11616
version: hash:
@@ -211,12 +111,12 @@ pkgs.buildEnv {
211111
}"
212112
)
213113
214-
makeWrapper ${lib.getExe switchPgNetVersion} $out/bin/switch_pg_net_version \
215-
--prefix EXT_WRAPPER : "$out"
114+
makeWrapper ${lib.getExe switch-ext-version} $out/bin/switch_pg_net_version \
115+
--prefix EXT_WRAPPER : "$out" --prefix EXT_NAME : "${pname}"
216116
'';
217117

218118
passthru = {
219-
inherit versions numberOfVersions switchPgNetVersion;
119+
inherit versions numberOfVersions;
220120
pname = "${pname}-all";
221121
version =
222122
"multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions);

nix/ext/tests/pg_net.nix

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
{ self, pkgs }:
22
let
3+
pname = "pg_net";
34
inherit (pkgs) lib;
45
installedExtension =
5-
postgresMajorVersion: self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/pg_net-all";
6-
versions = (installedExtension "17").versions;
7-
firstVersion = lib.head versions;
8-
latestVersion = lib.last versions;
6+
postgresMajorVersion: self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/${pname}-all";
7+
versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions;
98
postgresqlWithExtension =
109
postgresql:
1110
let
1211
majorVersion = lib.versions.major postgresql.version;
1312
pkg = pkgs.buildEnv {
14-
name = "postgresql-${majorVersion}-pg_net";
13+
name = "postgresql-${majorVersion}-${pname}";
1514
paths = [
1615
postgresql
1716
postgresql.lib
@@ -40,7 +39,7 @@ let
4039
psql_17 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17;
4140
in
4241
self.inputs.nixpkgs.lib.nixos.runTest {
43-
name = "pg_net";
42+
name = "${pname}";
4443
hostPkgs = pkgs;
4544
nodes.server =
4645
{ config, ... }:
@@ -65,7 +64,7 @@ self.inputs.nixpkgs.lib.nixos.runTest {
6564
enable = true;
6665
package = psql_15;
6766
settings = {
68-
shared_preload_libraries = "pg_net";
67+
shared_preload_libraries = pname;
6968
};
7069
};
7170

@@ -116,60 +115,68 @@ self.inputs.nixpkgs.lib.nixos.runTest {
116115
pg17-configuration = "${nodes.server.system.build.toplevel}/specialisation/postgresql17";
117116
in
118117
''
118+
versions = {
119+
"15": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "15"))}],
120+
"17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "17"))}],
121+
}
122+
119123
def run_sql(query):
120124
return server.succeed(f"""sudo -u postgres psql -t -A -F\",\" -c \"{query}\" """).strip()
121125
122-
def check_upgrade_path():
123-
with subtest("Check pg_net upgrade path"):
124-
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION IF EXISTS pg_net;'")
125-
run_sql(r"""CREATE EXTENSION pg_net WITH VERSION \"${firstVersion}\";""")
126-
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = 'pg_net';""")
127-
assert installed_version == "${firstVersion}", f"Expected pg_net version ${firstVersion}, but found {installed_version}"
128-
for version in [${lib.concatStringsSep ", " (map (s: ''"${s}"'') versions)}][1:]:
129-
run_sql(f"""ALTER EXTENSION pg_net UPDATE TO '{version}';""")
130-
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = 'pg_net';""")
131-
assert installed_version == version, f"Expected pg_net version {version}, but found {installed_version}"
126+
def check_upgrade_path(pg_version):
127+
with subtest("Check ${pname} upgrade path"):
128+
firstVersion = versions[pg_version][0]
129+
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION IF EXISTS ${pname};'")
130+
run_sql(f"""CREATE EXTENSION ${pname} WITH VERSION '{firstVersion}' CASCADE;""")
131+
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = '${pname}';""")
132+
assert installed_version == firstVersion, f"Expected ${pname} version {firstVersion}, but found {installed_version}"
133+
for version in versions[pg_version][1:]:
134+
run_sql(f"""ALTER EXTENSION ${pname} UPDATE TO '{version}';""")
135+
installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = '${pname}';""")
136+
assert installed_version == version, f"Expected ${pname} version {version}, but found {installed_version}"
132137
133138
start_all()
134139
135140
server.wait_for_unit("multi-user.target")
136141
server.wait_for_unit("postgresql.service")
137142
138-
check_upgrade_path()
143+
check_upgrade_path("15")
139144
140-
with subtest("Test switch_pg_net_version"):
145+
with subtest("Test switch_${pname}_version"):
141146
# Check that we are using the last version first
142-
pg_net_version = server.succeed("readlink -f ${psql_15}/lib/pg_net.so").strip()
143-
print(f"Current pg_net version: {pg_net_version}")
144-
assert pg_net_version.endswith("pg_net-${latestVersion}.so"), f"Expected pg_net version ${latestVersion}, but found {pg_net_version}"
147+
ext_version = server.succeed("readlink -f ${psql_15}/lib/${pname}.so").strip()
148+
firstVersion = versions["15"][0]
149+
latestVersion = versions["15"][-1]
150+
assert ext_version.endswith(f"${pname}-{latestVersion}.so"), f"Expected ${pname} version {latestVersion}, but found {ext_version}"
145151
146152
server.succeed(
147-
"switch_pg_net_version ${firstVersion}"
153+
f"switch_${pname}_version {firstVersion}"
148154
)
149155
150-
pg_net_version = server.succeed("readlink -f ${psql_15}/lib/pg_net.so").strip()
151-
assert pg_net_version.endswith("pg_net-${firstVersion}.so"), f"Expected pg_net version ${firstVersion}, but found {pg_net_version}"
156+
ext_version = server.succeed("readlink -f ${psql_15}/lib/${pname}.so").strip()
157+
assert ext_version.endswith(f"${pname}-{firstVersion}.so"), f"Expected ${pname} version {firstVersion}, but found {ext_version}"
152158
153159
server.succeed(
154-
"switch_pg_net_version ${latestVersion}"
160+
f"switch_${pname}_version {latestVersion}"
155161
)
156162
157-
with subtest("Check pg_net latest extension version"):
158-
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION pg_net;'")
159-
server.succeed("sudo -u postgres psql -c 'CREATE EXTENSION pg_net;'")
163+
with subtest("Check ${pname} latest extension version"):
164+
server.succeed("sudo -u postgres psql -c 'DROP EXTENSION ${pname};'")
165+
server.succeed("sudo -u postgres psql -c 'CREATE EXTENSION ${pname};'")
160166
installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""")
161-
assert "pg_net,${latestVersion}" in installed_extensions
167+
latestVersion = versions["15"][-1]
168+
assert f"${pname},{latestVersion}" in installed_extensions
162169
163170
with subtest("switch to multiple node configuration"):
164171
server.succeed(
165172
"${pg17-configuration}/bin/switch-to-configuration test >&2"
166173
)
167174
168-
with subtest("Check pg_net latest extension version"):
175+
with subtest("Check ${pname} latest extension version"):
169176
installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""")
170-
assert "pg_net,${latestVersion}" in installed_extensions
171-
172-
check_upgrade_path()
177+
latestVersion = versions["15"][-1]
178+
assert f"${pname},{latestVersion}" in installed_extensions
173179
180+
check_upgrade_path("17")
174181
'';
175182
}

0 commit comments

Comments
 (0)