From 0509da7a941e9e31c21097d3b0a34a0682e4e962 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Fri, 8 Aug 2025 15:44:55 -0400 Subject: [PATCH 1/6] feat: multi version pg_net including 0.19.5 --- nix/ext/pg_net.nix | 126 ++++++++++++++---- nix/ext/versions.json | 72 ++++++++++ nix/tests/expected/z_15_ext_interface.out | 6 +- nix/tests/expected/z_17_ext_interface.out | 6 +- .../expected/z_orioledb-17_ext_interface.out | 6 +- 5 files changed, 185 insertions(+), 31 deletions(-) diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index 02d673297..ee95c4e9b 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -1,41 +1,117 @@ { + pkgs, lib, stdenv, fetchFromGitHub, curl, postgresql, + libuv, }: -stdenv.mkDerivation rec { +let pname = "pg_net"; - version = "0.14.0"; - - buildInputs = [ - curl - postgresql - ]; - - src = fetchFromGitHub { - owner = "supabase"; - repo = pname; - rev = "refs/tags/v${version}"; - hash = "sha256-c1pxhTyrE5j6dY+M5eKAboQNofIORS+Dccz+7HKEKQI="; - }; + build = + version: hash: + stdenv.mkDerivation rec { + inherit pname version; + + buildInputs = [ + curl + postgresql + ] ++ lib.optional (version == "0.6") libuv; + + src = fetchFromGitHub { + owner = "supabase"; + repo = pname; + rev = "refs/tags/v${version}"; + inherit hash; + }; + + buildPhase = '' + make PG_CONFIG=${postgresql}/bin/pg_config + ''; + + postPatch = + lib.optionalString (version == "0.6") '' + # handle collision with pg_net 0.10.0 + rm sql/pg_net--0.2--0.3.sql + rm sql/pg_net--0.4--0.5.sql + rm sql/pg_net--0.5.1--0.6.sql + '' + + lib.optionalString (version == "0.7.1") '' + # handle collision with pg_net 0.10.0 + rm sql/pg_net--0.5.1--0.6.sql + ''; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + installPhase = '' + mkdir -p $out/{lib,share/postgresql/extension} + + # Install versioned library + install -Dm755 ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix} + + if [ -f sql/${pname}.sql ]; then + cp sql/${pname}.sql $out/share/postgresql/extension/${pname}--${version}.sql + else + cp sql/${pname}--${version}.sql $out/share/postgresql/extension/${pname}--${version}.sql + fi + + # Install upgrade scripts + find . -name '${pname}--*--*.sql' -exec install -Dm644 {} $out/share/postgresql/extension/ \; - env.NIX_CFLAGS_COMPILE = "-Wno-error"; + # Create versioned control file with modified module path + sed -e "/^default_version =/d" \ + -e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}'|" \ + ${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control + ''; - installPhase = '' - mkdir -p $out/{lib,share/postgresql/extension} + meta = with lib; { + description = "Async networking for Postgres"; + homepage = "https://github.com/supabase/pg_net"; + platforms = postgresql.meta.platforms; + license = licenses.postgresql; + }; + }; + allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).pg_net; + # Filter out versions that don't work on current platform + platformFilteredVersions = lib.filterAttrs ( + name: _: + # Exclude 0.11.0 on macOS due to epoll.h dependency + !(stdenv.isDarwin && name == "0.11.0") + ) allVersions; + supportedVersions = lib.filterAttrs ( + _: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql + ) platformFilteredVersions; + versions = lib.naturalSort (lib.attrNames supportedVersions); + latestVersion = lib.last versions; + numberOfVersions = builtins.length versions; + packages = builtins.attrValues ( + lib.mapAttrs (name: value: build name value.hash) supportedVersions + ); +in +pkgs.buildEnv { + name = pname; + paths = packages; + postBuild = '' + { + echo "default_version = '${latestVersion}'" + cat $out/share/postgresql/extension/${pname}--${latestVersion}.control + } > $out/share/postgresql/extension/${pname}.control + ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix} - cp *${postgresql.dlSuffix} $out/lib - cp sql/*.sql $out/share/postgresql/extension - cp *.control $out/share/postgresql/extension + # checks + (set -x + test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ + toString (numberOfVersions + 1) + }" + ) ''; - meta = with lib; { - description = "Async networking for Postgres"; - homepage = "https://github.com/supabase/pg_net"; - platforms = postgresql.meta.platforms; - license = licenses.postgresql; + passthru = { + inherit versions numberOfVersions; + pname = "${pname}-all"; + version = + "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); }; } diff --git a/nix/ext/versions.json b/nix/ext/versions.json index c77b23be6..6f64b674f 100644 --- a/nix/ext/versions.json +++ b/nix/ext/versions.json @@ -20,5 +20,77 @@ ], "hash": "sha256-G0eQk2bY5CNPMeokN/nb05g03CuiplRf902YXFVQFbs=" } + }, + "pg_net": { + "0.1": { + "postgresql": [ + "15" + ], + "hash": "sha256-geXGMb9MxU2vVB3ZBkGEwNqHixPbqjywyUumk7kbdbQ=" + }, + "0.2": { + "postgresql": [ + "15" + ], + "hash": "sha256-ArJmZTh7rc6OgvA6RIndMqcDRJl91QPt6pgEeCuHA6M=" + }, + "0.6": { + "postgresql": [ + "15" + ], + "hash": "sha256-SpQbF/ZeAVa8zf0+N6uluHrjpmGy0NLd2/hvyiOyNsY=" + }, + "0.7": { + "postgresql": [ + "15" + ], + "hash": "sha256-FRaTZPCJQPYAFmsJg22hYJJ0+gH1tMdDQoCQgiqEnaA=" + }, + "0.7.1": { + "postgresql": [ + "15" + ], + "hash": "sha256-VScRKzY/skQu9SWGx9iZvifH7pv7SRXcvLfybB+XX4Q=" + }, + "0.8.0": { + "postgresql": [ + "15" + ], + "hash": "sha256-ZPsRPWV1G3lMM2mT+H139Wvgoy8QnmeUbzEnGeDJmZA=" + }, + "0.10.0": { + "postgresql": [ + "15" + ], + "hash": "sha256-R9Mzw5gvV7b2R59LTOzuOc0AI99+3ncFNzijI4mySUg=" + }, + "0.11.0": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-XN441jXK1q+I/LZRNwvzbSsebXHgZ8iYsslZvcPFlAs=" + }, + "0.13.0": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-FRaTZPCJQPYAFmsJg22hYJJ0+gH1tMdDQoCQgiqEnaA=" + }, + "0.14.0": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-c1pxhTyrE5j6dY+M5eKAboQNofIORS+Dccz+7HKEKQI=" + }, + "0.19.5": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-Cpi2iASi1QJoED0Qs1dANqg/BNZTsz5S+pw8iYyW03Y=" + } } } diff --git a/nix/tests/expected/z_15_ext_interface.out b/nix/tests/expected/z_15_ext_interface.out index c652a95eb..d3d9f7c4f 100644 --- a/nix/tests/expected/z_15_ext_interface.out +++ b/nix/tests/expected/z_15_ext_interface.out @@ -1161,9 +1161,11 @@ order by pg_net | net | _urlencode_string | string character varying | text pg_net | net | check_worker_is_up | | void pg_net | net | http_collect_response | request_id bigint, async boolean | net.http_response_result - pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer, body jsonb | bigint pg_net | net | http_get | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint pg_net | net | http_post | url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | wait_until_running | | void + pg_net | net | wake | | void pg_net | net | worker_restart | | boolean pg_prewarm | public | autoprewarm_dump_now | | bigint pg_prewarm | public | autoprewarm_start_worker | | void @@ -5227,7 +5229,7 @@ order by xml2 | public | xpath_table | text, text, text, text, text | SETOF record xml2 | public | xslt_process | text, text | text xml2 | public | xslt_process | text, text, text | text -(5057 rows) +(5059 rows) /* diff --git a/nix/tests/expected/z_17_ext_interface.out b/nix/tests/expected/z_17_ext_interface.out index d31894bc3..46792e48f 100644 --- a/nix/tests/expected/z_17_ext_interface.out +++ b/nix/tests/expected/z_17_ext_interface.out @@ -1146,9 +1146,11 @@ order by pg_net | net | _urlencode_string | string character varying | text pg_net | net | check_worker_is_up | | void pg_net | net | http_collect_response | request_id bigint, async boolean | net.http_response_result - pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer, body jsonb | bigint pg_net | net | http_get | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint pg_net | net | http_post | url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | wait_until_running | | void + pg_net | net | wake | | void pg_net | net | worker_restart | | boolean pg_prewarm | public | autoprewarm_dump_now | | bigint pg_prewarm | public | autoprewarm_start_worker | | void @@ -4871,7 +4873,7 @@ order by xml2 | public | xpath_table | text, text, text, text, text | SETOF record xml2 | public | xslt_process | text, text | text xml2 | public | xslt_process | text, text, text | text -(4714 rows) +(4716 rows) /* diff --git a/nix/tests/expected/z_orioledb-17_ext_interface.out b/nix/tests/expected/z_orioledb-17_ext_interface.out index d31894bc3..46792e48f 100644 --- a/nix/tests/expected/z_orioledb-17_ext_interface.out +++ b/nix/tests/expected/z_orioledb-17_ext_interface.out @@ -1146,9 +1146,11 @@ order by pg_net | net | _urlencode_string | string character varying | text pg_net | net | check_worker_is_up | | void pg_net | net | http_collect_response | request_id bigint, async boolean | net.http_response_result - pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer, body jsonb | bigint pg_net | net | http_get | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint pg_net | net | http_post | url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | wait_until_running | | void + pg_net | net | wake | | void pg_net | net | worker_restart | | boolean pg_prewarm | public | autoprewarm_dump_now | | bigint pg_prewarm | public | autoprewarm_start_worker | | void @@ -4871,7 +4873,7 @@ order by xml2 | public | xpath_table | text, text, text, text, text | SETOF record xml2 | public | xslt_process | text, text | text xml2 | public | xslt_process | text, text, text | text -(4714 rows) +(4716 rows) /* From 05f1e708c54c37b375e99a0700a52fbb5788e91b Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Fri, 8 Aug 2025 15:48:58 -0400 Subject: [PATCH 2/6] feat: bump ver and add tests --- nix/ext/tests/pg_net.nix | 153 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 nix/ext/tests/pg_net.nix diff --git a/nix/ext/tests/pg_net.nix b/nix/ext/tests/pg_net.nix new file mode 100644 index 000000000..971465ec7 --- /dev/null +++ b/nix/ext/tests/pg_net.nix @@ -0,0 +1,153 @@ +{ self, pkgs }: +let + inherit (pkgs) lib; + installedExtension = + postgresMajorVersion: self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/pg_net-all"; + versions = (installedExtension "17").versions; + firstVersion = lib.head versions; + latestVersion = lib.last versions; + postgresqlWithExtension = + postgresql: + let + majorVersion = lib.versions.major postgresql.version; + pkg = pkgs.buildEnv { + name = "postgresql-${majorVersion}-pg_net"; + paths = [ + postgresql + postgresql.lib + (installedExtension majorVersion) + ]; + passthru = { + inherit (postgresql) version psqlSchema; + lib = pkg; + withPackages = _: pkg; + }; + nativeBuildInputs = [ pkgs.makeWrapper ]; + pathsToLink = [ + "/" + "/bin" + "/lib" + ]; + postBuild = '' + wrapProgram $out/bin/postgres --set NIX_PGLIBDIR $out/lib + wrapProgram $out/bin/pg_ctl --set NIX_PGLIBDIR $out/lib + wrapProgram $out/bin/pg_upgrade --set NIX_PGLIBDIR $out/lib + ''; + }; + in + pkg; +in +self.inputs.nixpkgs.lib.nixos.runTest { + name = "pg_net"; + hostPkgs = pkgs; + nodes.server = + { config, ... }: + { + virtualisation = { + forwardPorts = [ + { + from = "host"; + host.port = 13022; + guest.port = 22; + } + ]; + }; + services.openssh = { + enable = true; + }; + users.users.root.openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIo+ulCUfJjnCVgfM4946Ih5Nm8DeZZiayYeABHGPEl7 jfroche" + ]; + + services.postgresql = { + enable = true; + package = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15; + settings = { + shared_preload_libraries = "pg_net"; + }; + }; + + specialisation.postgresql17.configuration = { + services.postgresql = { + package = lib.mkForce (postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17); + }; + + systemd.services.postgresql-migrate = { + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + User = "postgres"; + Group = "postgres"; + StateDirectory = "postgresql"; + WorkingDirectory = "${builtins.dirOf config.services.postgresql.dataDir}"; + }; + script = + let + oldPostgresql = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15; + newPostgresql = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17; + oldDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${oldPostgresql.psqlSchema}"; + newDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}"; + in + '' + if [[ ! -d ${newDataDir} ]]; then + install -d -m 0700 -o postgres -g postgres "${newDataDir}" + ${newPostgresql}/bin/initdb -D "${newDataDir}" + ${newPostgresql}/bin/pg_upgrade --old-datadir "${oldDataDir}" --new-datadir "${newDataDir}" \ + --old-bindir "${oldPostgresql}/bin" --new-bindir "${newPostgresql}/bin" + else + echo "${newDataDir} already exists" + fi + ''; + }; + + systemd.services.postgresql = { + after = [ "postgresql-migrate.service" ]; + requires = [ "postgresql-migrate.service" ]; + }; + }; + }; + testScript = + { nodes, ... }: + let + pg17-configuration = "${nodes.server.system.build.toplevel}/specialisation/postgresql17"; + in + '' + def run_sql(query): + return server.succeed(f"""sudo -u postgres psql -t -A -F\",\" -c \"{query}\" """).strip() + + def check_upgrade_path(): + with subtest("Check pg_net upgrade path"): + server.succeed("sudo -u postgres psql -c 'DROP EXTENSION IF EXISTS pg_net;'") + run_sql(r"""CREATE EXTENSION pg_net WITH VERSION \"${firstVersion}\";""") + installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = 'pg_net';""") + assert installed_version == "${firstVersion}", f"Expected pg_net version ${firstVersion}, but found {installed_version}" + for version in [${lib.concatStringsSep ", " (map (s: ''"${s}"'') versions)}][1:]: + run_sql(f"""ALTER EXTENSION pg_net UPDATE TO '{version}';""") + installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = 'pg_net';""") + assert installed_version == version, f"Expected pg_net version {version}, but found {installed_version}" + + start_all() + + server.wait_for_unit("multi-user.target") + server.wait_for_unit("postgresql.service") + + check_upgrade_path() + + with subtest("Check pg_net latest extension version"): + server.succeed("sudo -u postgres psql -c 'DROP EXTENSION pg_net;'") + server.succeed("sudo -u postgres psql -c 'CREATE EXTENSION pg_net;'") + installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""") + assert "pg_net,${latestVersion}" in installed_extensions + + with subtest("switch to multiple node configuration"): + server.succeed( + "${pg17-configuration}/bin/switch-to-configuration test >&2" + ) + + with subtest("Check pg_net latest extension version"): + installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""") + assert "pg_net,${latestVersion}" in installed_extensions + + check_upgrade_path() + ''; +} From 22d2c91311f3e4a7ad48718fc522f0d95d18a328 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Mon, 11 Aug 2025 16:33:25 -0400 Subject: [PATCH 3/6] feat: if file exists, run prestart version switch scripts --- ansible/files/postgres_prestart.sh.j2 | 96 ++++++++++++++++++++++++++- nix/ext/pg_net.nix | 81 ++++++++++++++++++++++ 2 files changed, 176 insertions(+), 1 deletion(-) diff --git a/ansible/files/postgres_prestart.sh.j2 b/ansible/files/postgres_prestart.sh.j2 index 3ffe54c85..e0c18e4f2 100644 --- a/ansible/files/postgres_prestart.sh.j2 +++ b/ansible/files/postgres_prestart.sh.j2 @@ -1,5 +1,11 @@ #!/bin/bash +set -x # Print commands + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" +} + check_orioledb_enabled() { local pg_conf="/etc/postgresql/postgresql.conf" if [ ! -f "$pg_conf" ]; then @@ -26,7 +32,93 @@ update_orioledb_buffers() { fi } +check_extensions_file() { + local extensions_file="/etc/adminapi/pg-extensions.json" + if [ ! -f "$extensions_file" ]; then + log "extensions: No extensions file found, skipping extensions versions check" + return 1 + fi + if [ ! -r "$extensions_file" ]; then + log "extensions: Cannot read extensions file" + return 1 + fi + return 0 +} + +switch_extension_version() { + local extension_name="$1" + local version="$2" + + # Use BIN_PATH environment variable or default to /var/lib/postgresql/.nix-profile + : ${BIN_PATH:="/var/lib/postgresql/.nix-profile"} + + local switch_script="$BIN_PATH/bin/switch_${extension_name}_version" + + if [ ! -x "$switch_script" ]; then + log "$extension_name: No version switch script available at $switch_script, skipping" + return 0 + fi + + log "$extension_name: Switching to version $version" + # Run directly as root since we're already running as root + "$switch_script" "$version" + local exit_code=$? + if [ $exit_code -eq 0 ]; then + log "$extension_name: Version switch completed successfully" + else + log "$extension_name: Version switch failed with exit code $exit_code" + fi + return $exit_code +} + +handle_extension_versions() { + if ! check_extensions_file; then + return + fi + + local extensions_file="/etc/adminapi/pg-extensions.json" + + # Get all extension names from the JSON file + local extensions + extensions=$(jq -r 'keys[]' "$extensions_file" 2>/dev/null) + + if [ -z "$extensions" ]; then + log "extensions: No extensions found in configuration" + return + fi + + # Iterate through each extension + while IFS= read -r extension_name; do + # Get the version for this extension + local version + version=$(jq -r --arg ext "$extension_name" '.[$ext] // empty' "$extensions_file") + + if [ -z "$version" ]; then + log "$extension_name: No version specified, skipping" + continue + fi + + # Basic version format validation (semantic versioning) + if ! [[ "$version" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then + log "$extension_name: Invalid version format: $version, skipping" + continue + fi + + log "$extension_name: Found version $version in extensions file" + + # Don't fail if version switch fails - just log and continue + switch_extension_version "$extension_name" "$version" || log "$extension_name: Version switch failed but continuing" + + done <<< "$extensions" +} + main() { + log "Starting prestart script" + + # 1. Handle all extension versions from config file + handle_extension_versions + + # 2. orioledb handling local has_orioledb=$(check_orioledb_enabled) if [ "$has_orioledb" -lt 1 ]; then return 0 @@ -35,6 +127,8 @@ main() { if [ ! -z "$shared_buffers_value" ]; then update_orioledb_buffers "$shared_buffers_value" fi + + log "Prestart script completed" } # Initial locale setup @@ -46,4 +140,4 @@ if [ $(locale -a | grep -c en_US.utf8) -eq 0 ]; then locale-gen fi -main +main \ No newline at end of file diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index ee95c4e9b..8c4d43ea4 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -100,6 +100,87 @@ pkgs.buildEnv { } > $out/share/postgresql/extension/${pname}.control ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix} + # Create version switcher script + mkdir -p $out/bin + cat > $out/bin/switch_pg_net_version <<'EOF' + #!/bin/sh + set -e + + if [ $# -ne 1 ]; then + echo "Usage: $0 " + echo "Example: $0 0.10.0" + echo "" + echo "Optional environment variables:" + echo " NIX_PROFILE - Path to nix profile (default: /var/lib/postgresql/.nix-profile)" + echo " LIB_DIR - Override library directory" + echo " EXTENSION_DIR - Override extension directory" + exit 1 + fi + + VERSION=$1 + + # Set defaults, allow environment variable overrides + : ''${NIX_PROFILE:="/var/lib/postgresql/.nix-profile"} + : ''${LIB_DIR:=""} + : ''${EXTENSION_DIR:=""} + + # If LIB_DIR not explicitly set, auto-detect it + if [ -z "$LIB_DIR" ]; then + # Follow the complete chain of symlinks to find the multi-version directory + CURRENT_LINK="$NIX_PROFILE/lib/pg_net-$VERSION${postgresql.dlSuffix}" + echo "Starting with link: $CURRENT_LINK" + + # Follow first two symlinks to get to the multi-version directory + for i in 1 2; do + if [ -L "$CURRENT_LINK" ]; then + NEXT_LINK=$(readlink "$CURRENT_LINK") + echo "Following link: $NEXT_LINK" + if echo "$NEXT_LINK" | grep -q '^/'; then + CURRENT_LINK="$NEXT_LINK" + else + CURRENT_LINK="$(dirname "$CURRENT_LINK")/$NEXT_LINK" + fi + echo "Current link is now: $CURRENT_LINK" + fi + done + + # The multi-version directory should be the parent of the current link + MULTI_VERSION_DIR=$(dirname "$CURRENT_LINK") + echo "Found multi-version directory: $MULTI_VERSION_DIR" + LIB_DIR="$MULTI_VERSION_DIR" + else + echo "Using provided LIB_DIR: $LIB_DIR" + fi + + # If EXTENSION_DIR not explicitly set, use default + if [ -z "$EXTENSION_DIR" ]; then + EXTENSION_DIR="$NIX_PROFILE/share/postgresql/extension" + fi + echo "Using EXTENSION_DIR: $EXTENSION_DIR" + + echo "Looking for file: $LIB_DIR/pg_net-$VERSION${postgresql.dlSuffix}" + ls -la "$LIB_DIR" || true + + # Check if version exists + if [ ! -f "$LIB_DIR/pg_net-$VERSION${postgresql.dlSuffix}" ]; then + echo "Error: Version $VERSION not found in $LIB_DIR" + echo "Available versions:" + ls "$LIB_DIR"/pg_net-*${postgresql.dlSuffix} 2>/dev/null | sed 's/.*pg_net-/ /' | sed 's/${postgresql.dlSuffix}$//' || echo " No versions found" + exit 1 + fi + + # Update library symlink + ln -sfnv "pg_net-$VERSION${postgresql.dlSuffix}" "$LIB_DIR/pg_net${postgresql.dlSuffix}" + + # Update control file + echo "default_version = '$VERSION'" > "$EXTENSION_DIR/pg_net.control" + cat "$EXTENSION_DIR/pg_net--$VERSION.control" >> "$EXTENSION_DIR/pg_net.control" + + echo "Successfully switched pg_net to version $VERSION" + EOF + + chmod +x $out/bin/switch_pg_net_version + # checks (set -x test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ From fac1f9b8da851231500126d2a3f57c025ee78f18 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 13 Aug 2025 12:15:18 -0400 Subject: [PATCH 4/6] tests: bump version to test --- ansible/vars.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ansible/vars.yml b/ansible/vars.yml index cd7ea6a28..dd0c4775e 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -9,9 +9,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.5.1.017-orioledb" - postgres17: "17.4.1.074" - postgres15: "15.8.1.131" + postgresorioledb-17: "17.5.1.017-orioledb-pg-net-2" + postgres17: "17.4.1.074-pg-net-2" + postgres15: "15.8.1.131-pg-net-2" # Non Postgres Extensions pgbouncer_release: "1.19.0" From 6d5085442d2aad0118561ce59351446d3419108a Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Thu, 14 Aug 2025 08:44:06 -0400 Subject: [PATCH 5/6] fix: rm unneeded check and fix err codes for file handling --- ansible/files/postgres_prestart.sh.j2 | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/ansible/files/postgres_prestart.sh.j2 b/ansible/files/postgres_prestart.sh.j2 index e0c18e4f2..cc8ff53c6 100644 --- a/ansible/files/postgres_prestart.sh.j2 +++ b/ansible/files/postgres_prestart.sh.j2 @@ -36,11 +36,11 @@ check_extensions_file() { local extensions_file="/etc/adminapi/pg-extensions.json" if [ ! -f "$extensions_file" ]; then log "extensions: No extensions file found, skipping extensions versions check" - return 1 + return 0 #if file not found, skip fi if [ ! -r "$extensions_file" ]; then log "extensions: Cannot read extensions file" - return 1 + return 1 #a true error, we should be able to read file fi return 0 } @@ -97,13 +97,7 @@ handle_extension_versions() { log "$extension_name: No version specified, skipping" continue fi - - # Basic version format validation (semantic versioning) - if ! [[ "$version" =~ ^[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then - log "$extension_name: Invalid version format: $version, skipping" - continue - fi - + log "$extension_name: Found version $version in extensions file" # Don't fail if version switch fails - just log and continue From f6e224d0777b74a0d4a87d022d7476fe785dceaf Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Fri, 15 Aug 2025 14:00:39 -0400 Subject: [PATCH 6/6] chore: bump version for testing --- ansible/vars.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ansible/vars.yml b/ansible/vars.yml index dd0c4775e..fc7d48b1b 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -9,9 +9,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.5.1.017-orioledb-pg-net-2" - postgres17: "17.4.1.074-pg-net-2" - postgres15: "15.8.1.131-pg-net-2" + postgresorioledb-17: "17.5.1.017-orioledb-pg-net-3" + postgres17: "17.4.1.074-pg-net-3" + postgres15: "15.8.1.131-pg-net-3" # Non Postgres Extensions pgbouncer_release: "1.19.0"