nixos/hydra postgresql: Fix #27314 and add test case

Changed files
+47 -8
nixos
modules
services
continuous-integration
hydra
databases
tests
+2 -2
nixos/modules/services/continuous-integration/hydra/default.nix
···
${optionalString haveLocalDB ''
if ! [ -e ${baseDir}/.db-created ]; then
-
${config.services.postgresql.package}/bin/createuser hydra
-
${config.services.postgresql.package}/bin/createdb -O hydra hydra
+
${pkgs.sudo}/bin/sudo -u ${config.services.postgresql.superUser} ${config.services.postgresql.package}/bin/createuser hydra
+
${pkgs.sudo}/bin/sudo -u ${config.services.postgresql.superUser} ${config.services.postgresql.package}/bin/createdb -O hydra hydra
touch ${baseDir}/.db-created
fi
''}
+13 -6
nixos/modules/services/databases/postgresql.nix
···
pre84 = versionOlder (builtins.parseDrvName postgresql.name).version "8.4";
-
# NixOS traditionally used `root` as superuser, most other distros use `postgres`. From 17.09
-
# we also try to follow this standard
-
superuser = (if versionAtLeast config.system.stateVersion "17.09" then "postgres" else "root");
in
···
Contents of the <filename>recovery.conf</filename> file.
'';
};
+
superUser = mkOption {
+
type = types.str;
+
default= if versionAtLeast config.system.stateVersion "17.09" then "postgres" else "root";
+
internal = true;
+
description = ''
+
NixOS traditionally used `root` as superuser, most other distros use `postgres`.
+
From 17.09 we also try to follow this standard. Internal since changing this value
+
would lead to breakage while setting up databases.
+
'';
+
};
};
};
···
''
# Initialise the database.
if ! test -e ${cfg.dataDir}/PG_VERSION; then
-
initdb -U ${superuser}
+
initdb -U ${cfg.superUser}
# See postStart!
touch "${cfg.dataDir}/.first_startup"
fi
···
# Wait for PostgreSQL to be ready to accept connections.
postStart =
''
-
while ! ${pkgs.sudo}/bin/sudo -u ${superuser} psql --port=${toString cfg.port} -d postgres -c "" 2> /dev/null; do
+
while ! ${pkgs.sudo}/bin/sudo -u ${cfg.superUser} psql --port=${toString cfg.port} -d postgres -c "" 2> /dev/null; do
if ! kill -0 "$MAINPID"; then exit 1; fi
sleep 0.1
done
if test -e "${cfg.dataDir}/.first_startup"; then
${optionalString (cfg.initialScript != null) ''
-
${pkgs.sudo}/bin/sudo -u ${superuser} psql -f "${cfg.initialScript}" --port=${toString cfg.port} -d postgres
+
${pkgs.sudo}/bin/sudo -u ${cfg.superUser} psql -f "${cfg.initialScript}" --port=${toString cfg.port} -d postgres
''}
rm -f "${cfg.dataDir}/.first_startup"
fi
+32
nixos/tests/hydra.nix
···
+
import ./make-test.nix ({ pkgs, ...} : {
+
name = "hydra-init-localdb";
+
meta = with pkgs.stdenv.lib.maintainers; {
+
maintainers = [ pstn ];
+
};
+
+
machine =
+
{ config, pkgs, ... }:
+
+
{
+
services.hydra = {
+
enable = true;
+
+
#Hydra needs those settings to start up, so we add something not harmfull.
+
hydraURL = "example.com";
+
notificationSender = "example@example.com";
+
};
+
};
+
+
testScript =
+
''
+
# let the system boot up
+
$machine->waitForUnit("multi-user.target");
+
# test whether the database is running
+
$machine->succeed("systemctl status postgresql.service");
+
# test whether the actual hydra daemons are running
+
$machine->succeed("systemctl status hydra-queue-runner.service");
+
$machine->succeed("systemctl status hydra-init.service");
+
$machine->succeed("systemctl status hydra-evaluator.service");
+
$machine->succeed("systemctl status hydra-send-stats.service");
+
'';
+
})