From a857876044651125d0428ed59f4801e185aa16c2 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Fri, 12 Jun 2026 11:51:36 -0400 Subject: [PATCH 1/2] fix: cover the old default value 1.6 (same as 1.6.4) with empty migration --- nix/ext/pg_cron/default.nix | 47 +++++--- nix/ext/tests/default.nix | 227 +++++++----------------------------- nix/ext/tests/lib.py | 22 +--- 3 files changed, 77 insertions(+), 219 deletions(-) diff --git a/nix/ext/pg_cron/default.nix b/nix/ext/pg_cron/default.nix index a823fa450b..cccfe68165 100644 --- a/nix/ext/pg_cron/default.nix +++ b/nix/ext/pg_cron/default.nix @@ -6,7 +6,6 @@ buildEnv, makeWrapper, switch-ext-version, - latestOnly ? false, }: let pname = "pg_cron"; @@ -16,13 +15,7 @@ let ) allVersions; versions = lib.naturalSort (lib.attrNames supportedVersions); latestVersion = lib.last versions; - versionsToUse = - if latestOnly then - { "${latestVersion}" = supportedVersions.${latestVersion}; } - else - supportedVersions; - versionsBuilt = if latestOnly then [ latestVersion ] else versions; - numberOfVersionsBuilt = builtins.length versionsBuilt; + numberOfVersions = builtins.length versions; build = version: versionData: stdenv.mkDerivation rec { @@ -61,8 +54,32 @@ let mv $out/share/postgresql/extension/pg_cron--1.4--1.4-1.sql $out/share/postgresql/extension/pg_cron--1.4.0--1.4.1.sql mv $out/share/postgresql/extension/pg_cron--1.4-1--1.5.sql $out/share/postgresql/extension/pg_cron--1.4.2--1.5.2.sql mv $out/share/postgresql/extension/pg_cron--1.5--1.6.sql $out/share/postgresql/extension/pg_cron--1.5.2--1.6.4.sql + ln -s pg_cron--1.0.0--1.1.0.sql $out/share/postgresql/extension/pg_cron--1.0--1.1.sql + ln -s pg_cron--1.0.0--1.1.0.sql $out/share/postgresql/extension/pg_cron--1.0.0--1.1.sql + ln -s pg_cron--1.1.0--1.2.0.sql $out/share/postgresql/extension/pg_cron--1.1--1.2.sql + ln -s pg_cron--1.1.0--1.2.0.sql $out/share/postgresql/extension/pg_cron--1.1.0--1.2.sql + ln -s pg_cron--1.1.0--1.2.0.sql $out/share/postgresql/extension/pg_cron--1.1--1.2.0.sql + ln -s pg_cron--1.2.0--1.3.1.sql $out/share/postgresql/extension/pg_cron--1.2--1.3.sql + ln -s pg_cron--1.2.0--1.3.1.sql $out/share/postgresql/extension/pg_cron--1.2.0--1.3.sql + ln -s pg_cron--1.2.0--1.3.1.sql $out/share/postgresql/extension/pg_cron--1.2--1.3.1.sql + ln -s pg_cron--1.3.1--1.4.2.sql $out/share/postgresql/extension/pg_cron--1.3--1.4.sql + ln -s pg_cron--1.3.1--1.4.2.sql $out/share/postgresql/extension/pg_cron--1.3.1--1.4.sql + ln -s pg_cron--1.3.1--1.4.2.sql $out/share/postgresql/extension/pg_cron--1.3--1.4.2.sql + ln -s pg_cron--1.4.0--1.4.1.sql $out/share/postgresql/extension/pg_cron--1.4--1.4-1.sql + ln -s pg_cron--1.4.2--1.5.2.sql $out/share/postgresql/extension/pg_cron--1.4-1--1.5.sql + ln -s pg_cron--1.4.2--1.5.2.sql $out/share/postgresql/extension/pg_cron--1.4.2--1.5.sql + ln -s pg_cron--1.4.2--1.5.2.sql $out/share/postgresql/extension/pg_cron--1.4-1--1.5.2.sql + ln -s pg_cron--1.5.2--1.6.4.sql $out/share/postgresql/extension/pg_cron--1.5--1.6.sql + ln -s pg_cron--1.5.2--1.6.4.sql $out/share/postgresql/extension/pg_cron--1.5.2--1.6.sql + ln -s pg_cron--1.5.2--1.6.4.sql $out/share/postgresql/extension/pg_cron--1.5--1.6.4.sql + cat > $out/share/postgresql/extension/pg_cron--1.6--1.6.4.sql << 'EOF' + -- Version alignment migration + -- Both 1.6 and 1.6.4 are actually the same version (1.6.4) + -- This file exists only to allow smooth transition from the old naming scheme + EOF fi + # Create versioned control file with modified module path sed -e "/^default_version =/d" \ -e "/^schema =/d" \ @@ -78,7 +95,7 @@ let license = licenses.postgresql; }; }; - packages = builtins.attrValues (lib.mapAttrs (name: value: build name value) versionsToUse); + packages = builtins.attrValues (lib.mapAttrs (name: value: build name value) supportedVersions); in buildEnv { name = pname; @@ -100,7 +117,7 @@ buildEnv { # checks (set -x test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ - toString (numberOfVersionsBuilt + 1) + toString (numberOfVersions + 1) }" ) @@ -116,18 +133,14 @@ buildEnv { }; passthru = { - versions = versionsBuilt; - numberOfVersions = numberOfVersionsBuilt; - inherit switch-ext-version latestOnly; + inherit versions numberOfVersions switch-ext-version; + pname = "${pname}-all"; hasBackgroundWorker = true; defaultSettings = { shared_preload_libraries = [ "pg_cron" ]; "cron.database_name" = "postgres"; }; version = - if latestOnly then - latestVersion - else - "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); + "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); }; } diff --git a/nix/ext/tests/default.nix b/nix/ext/tests/default.nix index 79415c20fe..facd250f60 100644 --- a/nix/ext/tests/default.nix +++ b/nix/ext/tests/default.nix @@ -3,46 +3,33 @@ let testsDir = ./.; testFiles = builtins.attrNames (builtins.readDir testsDir); nixFiles = builtins.filter ( - name: builtins.match ".*\\.nix$" name != null && name != "default.nix" && name != "lib.nix" + name: builtins.match ".*\\.nix$" name != null && name != "default.nix" ) testFiles; extTest = extension_name: let pname = extension_name; inherit (pkgs) lib; - - support_upgrade = true; - run_pg_regress = true; - installedExtension = - postgresMajorVersion: - self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}."psql_${postgresMajorVersion}".exts."${ - pname - }"; + postgresMajorVersion: self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/${pname}-all"; versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions; postgresqlWithExtension = postgresql: let - majorVersion = - if postgresql.isOrioleDB then "orioledb-17" else lib.versions.major postgresql.version; - pkg = pkgs.pkgsLinux.buildEnv { + majorVersion = lib.versions.major postgresql.version; + pkg = pkgs.buildEnv { name = "postgresql-${majorVersion}-${pname}"; paths = [ postgresql postgresql.lib (installedExtension majorVersion) - ] - ++ lib.optional (postgresql.isOrioleDB - ) self.legacyPackages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.psql_orioledb-17.exts.orioledb; + ]; passthru = { inherit (postgresql) version psqlSchema; lib = pkg; withPackages = _: pkg; - withJIT = pkg; - withoutJIT = pkg; - installedExtensions = [ (installedExtension majorVersion) ]; }; - nativeBuildInputs = [ pkgs.pkgsLinux.makeWrapper ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; pathsToLink = [ "/" "/bin" @@ -56,25 +43,24 @@ let }; in pkg; - psql_15 = - postgresqlWithExtension - self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_15; - psql_17 = - postgresqlWithExtension - self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_17; - orioledb_17 = - postgresqlWithExtension - self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17; + psql_15 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15; + psql_17 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17; in - pkgs.testers.runNixOSTest { + self.inputs.nixpkgs.lib.nixos.runTest { name = pname; + hostPkgs = pkgs; nodes.server = { config, ... }: { - # VM resources — sized for nested virtualisation on ephemeral CI runners - virtualisation.memorySize = 4096; - virtualisation.cores = 2; - + virtualisation = { + forwardPorts = [ + { + from = "host"; + host.port = 13022; + guest.port = 22; + } + ]; + }; services.openssh = { enable = true; }; @@ -147,90 +133,25 @@ let requires = [ "postgresql-migrate.service" ]; }; }; - - specialisation.orioledb17.configuration = { - services.postgresql = { - package = lib.mkForce ( - postgresqlWithExtension - self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17 - ); - settings = lib.mkForce ( - ((installedExtension "17").defaultSettings or { }) - // { - jit = "off"; - shared_preload_libraries = [ - "orioledb" - ] - ++ (lib.toList ((installedExtension "17").defaultSettings.shared_preload_libraries or [ ])); - default_table_access_method = "orioledb"; - } - ); - initdbArgs = [ - "--allow-group-access" - "--locale-provider=icu" - "--encoding=UTF-8" - "--icu-locale=en_US.UTF-8" - ]; - initialScript = pkgs.writeText "init-postgres-with-orioledb" '' - CREATE EXTENSION orioledb CASCADE; - ''; - }; - - systemd.services.postgresql-migrate = { - # we don't support migrating from postgresql 17 to orioledb-17 so we just reinit the datadir - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = true; - User = "postgres"; - Group = "postgres"; - StateDirectory = "postgresql"; - WorkingDirectory = "${builtins.dirOf config.services.postgresql.dataDir}"; - }; - script = - let - newPostgresql = - postgresqlWithExtension - self.packages.${pkgs.pkgsLinux.stdenv.hostPlatform.system}.postgresql_orioledb-17; - in - '' - if [[ -z "${newPostgresql.psqlSchema}" ]]; then - echo "Error: psqlSchema is empty, refusing to rm -rf" - exit 1 - fi - rm -rf ${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema} - ''; - }; - - systemd.services.postgresql = { - after = [ "postgresql-migrate.service" ]; - requires = [ "postgresql-migrate.service" ]; - }; - }; }; testScript = { nodes, ... }: let pg17-configuration = "${nodes.server.system.build.toplevel}/specialisation/postgresql17"; - orioledb17-configuration = "${nodes.server.system.build.toplevel}/specialisation/orioledb17"; in '' from pathlib import Path versions = { "15": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "15"))}], "17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "17"))}], - "orioledb-17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "orioledb-17"))}], } extension_name = "${pname}" - support_upgrade = ${if support_upgrade then "True" else "False"} pg17_configuration = "${pg17-configuration}" ext_has_background_worker = ${ - if support_upgrade && (installedExtension "15") ? hasBackgroundWorker then "True" else "False" + if (installedExtension "15") ? hasBackgroundWorker then "True" else "False" } sql_test_directory = Path("${../../tests}") pg_regress_test_name = "${(installedExtension "15").pgRegressTestName or pname}" - ext_schema = "${(installedExtension "15").defaultSchema or "public"}" - lib_name = "${(installedExtension "15").libName or pname}" - print(f"Running tests for extension: {lib_name}") ${builtins.readFile ./lib.py} @@ -239,107 +160,44 @@ let server.wait_for_unit("multi-user.target") server.wait_for_unit("postgresql.service") - test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory, support_upgrade, ext_schema, lib_name) - test.create_schema() + test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory) - ${ - if support_upgrade then - '' - with subtest("Check upgrade path with postgresql 15"): - test.check_upgrade_path("15") - '' - else - "" - } + with subtest("Check upgrade path with postgresql 15"): + test.check_upgrade_path("15") - ${ - if run_pg_regress then - '' - with subtest("Check pg_regress with postgresql 15 after extension upgrade"): - test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name) - '' - else - "" - } + with subtest("Check pg_regress with postgresql 15 after extension upgrade"): + test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name) last_version = None with subtest("Check the install of the last version of the extension"): last_version = test.check_install_last_version("15") - ${ - if support_upgrade then - '' - if ext_has_background_worker: - with subtest("Test switch_${pname}_version"): - test.check_switch_extension_with_background_worker(Path(f"${psql_15}/lib/{lib_name}.so"), "15") + if ext_has_background_worker: + with subtest("Test switch_${pname}_version"): + test.check_switch_extension_with_background_worker(Path("${psql_15}/lib/${pname}.so"), "15") - with subtest("Check pg_regress with postgresql 15 after installing the last version"): - test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name) - '' - else - "" - } + with subtest("Check pg_regress with postgresql 15 after installing the last version"): + test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name) - has_update_script = False with subtest("switch to postgresql 17"): - server.execute( - "${pg17-configuration}/bin/switch-to-configuration test >&2" + server.succeed( + f"{pg17_configuration}/bin/switch-to-configuration test >&2" ) - server.wait_for_unit("postgresql.service") - has_update_script = server.succeed( - "test -f /var/lib/postgresql/update_extensions.sql && echo 'yes' || echo 'no'" - ).strip() == "yes" - if has_update_script: - # Run the extension update script generated during the upgrade - test.run_sql_file("/var/lib/postgresql/update_extensions.sql") with subtest("Check last version of the extension after postgresql upgrade"): - if has_update_script: - # If there was an update script, the last version should be installed - test.assert_version_matches(versions["17"][-1]) - else: - # Otherwise, the version should match the last version from postgresql 15 - test.assert_version_matches(last_version) - - ${ - if support_upgrade then - '' - with subtest("Check upgrade path with postgresql 17"): - test.check_upgrade_path("17") - '' - else - "" - } - - ${ - if run_pg_regress then - '' - with subtest("Check pg_regress with postgresql 17 after extension upgrade"): - test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name) - - with subtest("Check the install of the last version of the extension"): - test.check_install_last_version("17") + test.assert_version_matches(last_version) - with subtest("Check pg_regress with postgresql 17 after installing the last version"): - test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name) + with subtest("Check upgrade path with postgresql 17"): + test.check_upgrade_path("17") - with subtest("switch to orioledb 17"): - server.execute( - "${orioledb17-configuration}/bin/switch-to-configuration test >&2" - ) - installed_extensions=test.run_sql("""SELECT extname FROM pg_extension WHERE extname = 'orioledb';""") - assert "orioledb" in installed_extensions - test.create_schema() + with subtest("Check pg_regress with postgresql 17 after extension upgrade"): + test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name) - with subtest("Check upgrade path with orioledb 17"): - test.check_upgrade_path("orioledb-17") + with subtest("Check the install of the last version of the extension"): + test.check_install_last_version("17") - with subtest("Check pg_regress with orioledb 17 after installing the last version"): - test.check_pg_regress(Path("${orioledb_17}/lib/pgxs/src/test/regress/pg_regress"), "orioledb-17", pg_regress_test_name) - '' - else - "" - } + with subtest("Check pg_regress with postgresql 17 after installing the last version"): + test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name) ''; }; in @@ -357,16 +215,15 @@ builtins.listToAttrs ( }) [ "hypopg" + "index_advisor" "pg_cron" "pg_graphql" "pg_hashids" "pg_jsonschema" "pg_net" - "pg_partman" "pg_stat_monitor" "pg_tle" "pgaudit" - "pgtap" "vector" "wal2json" "wrappers" diff --git a/nix/ext/tests/lib.py b/nix/ext/tests/lib.py index 26bd42d49c..b0eb54a88e 100644 --- a/nix/ext/tests/lib.py +++ b/nix/ext/tests/lib.py @@ -5,7 +5,7 @@ installation, upgrades, and version verification of PostgreSQL extensions. """ -from typing import Sequence, Mapping, Optional +from typing import Sequence, Mapping from pathlib import Path from test_driver.machine import Machine @@ -20,8 +20,6 @@ def __init__( versions: Versions, sql_test_dir: Path, support_upgrade: bool = True, - schema: str = "public", - lib_name: Optional[str] = None, ): """Initialize the PostgreSQL extension test framework. @@ -31,18 +29,12 @@ def __init__( versions: Mapping of PostgreSQL versions to available extension versions sql_test_dir: Directory containing SQL test files for pg_regress support_upgrade: Whether the extension supports in-place upgrades - lib_name: Name of the shared library (defaults to extension_name) """ self.vm = vm self.extension_name = extension_name self.versions = versions self.support_upgrade = support_upgrade self.sql_test_dir = sql_test_dir - self.schema = schema - self.lib_name = lib_name or extension_name - - def create_schema(self): - self.run_sql(f"CREATE SCHEMA IF NOT EXISTS {self.schema};") def run_sql(self, query: str) -> str: return self.vm.succeed( @@ -58,12 +50,8 @@ def drop_extension(self): self.run_sql(f"DROP EXTENSION IF EXISTS {self.extension_name};") def install_extension(self, version: str): - if self.schema != "public": - ext_schema = f"SCHEMA {self.schema} " - else: - ext_schema = "" self.run_sql( - f"""CREATE EXTENSION {self.extension_name} WITH {ext_schema}VERSION '{version}' CASCADE;""" + f"""CREATE EXTENSION {self.extension_name} WITH VERSION '{version}' CASCADE;""" ) # Verify version was installed correctly self.assert_version_matches(version) @@ -166,7 +154,7 @@ def check_switch_extension_with_background_worker( f"No versions available for PostgreSQL version {pg_version}" ) last_version = available_versions[-1] - assert ext_version.endswith(f"{self.lib_name}-{last_version}.so"), ( + assert ext_version.endswith(f"{last_version}.so"), ( f"Expected {self.extension_name} version {last_version}, but found {ext_version}" ) @@ -176,7 +164,7 @@ def check_switch_extension_with_background_worker( # Check that we are using the first version now ext_version = self.vm.succeed(f"readlink -f {extension_lib_path}").strip() - assert ext_version.endswith(f"{self.lib_name}-{first_version}.so"), ( + assert ext_version.endswith(f"{first_version}.so"), ( f"Expected {self.extension_name} version {first_version}, but found {ext_version}" ) @@ -184,7 +172,7 @@ def check_switch_extension_with_background_worker( self.vm.succeed(f"switch_{self.extension_name}_version {last_version}") # Check that we are using the last version now ext_version = self.vm.succeed(f"readlink -f {extension_lib_path}").strip() - assert ext_version.endswith(f"{self.lib_name}-{last_version}.so"), ( + assert ext_version.endswith(f"{last_version}.so"), ( f"Expected {self.extension_name} version {last_version}, but found {ext_version}" ) From 003cf516b6426ca0270aab5fdfc696d9369d667a Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Fri, 12 Jun 2026 11:53:39 -0400 Subject: [PATCH 2/2] chore: bump suffix to test --- ansible/vars.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ansible/vars.yml b/ansible/vars.yml index db757ae637..c7cf758d14 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -10,9 +10,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.6.0.091-orioledb" - postgres17: "17.6.1.134" - postgres15: "15.14.1.134" + postgresorioledb-17: "17.6.0.091-orioledb-crontest-1" + postgres17: "17.6.1.134-crontest-1" + postgres15: "15.14.1.134-crontest-1" # Non Postgres Extensions pgbouncer_release: 1.25.1