nix-processmgmt-services/tests/hydra/default.nix

172 lines
4.5 KiB
Nix

{ pkgs, testService, processManagers, profiles, nix-processmgmt }:
let
node-hydra-connector = (import ./nodepkgs {
inherit pkgs;
inherit (pkgs.stdenv) system;
}).node-hydra-connector;
loginParams = pkgs.writeTextFile {
name = "loginparams";
text = ''
admin
admin
'';
};
projectParams = pkgs.writeTextFile {
name = "projectparams";
text = ''
trivial
Trivial
Trivial project
1
1
'';
};
generateTrivialProject = pkgs.writeScriptBin "generate-trivial-project" ''
#! ${pkgs.stdenv.shell} -e
mkdir -p /tmp/project
cat > /tmp/project/release.nix <<EOF
{ trivial = derivation {
name = "trivial";
system = "${pkgs.stdenv.system}";
builder = "/bin/sh";
allowSubstitutes = false;
preferLocalBuild = true;
args = ["-c" "echo success > $out; exit 0"];
};
}
EOF
'';
jobsetParams = pkgs.writeTextFile {
name = "jobsetparams";
text = ''
main
Main jobset
projectPath
release.nix
admin@localhost
1
1
1
1
1
projectPath
path
/tmp/project
'';
};
in
testService {
exprFile = ../../example-deployments/hydra/processes.nix;
extraParams = {
inherit nix-processmgmt;
};
nixosConfig = {
virtualisation.memorySize = 1024;
virtualisation.diskSize = 8192;
virtualisation.writableStore = true;
};
systemPackages = [ pkgs.hydra-unstable node-hydra-connector generateTrivialProject ];
readiness = {instanceName, instance, ...}:
pkgs.lib.optionalString (instanceName == "postgresql" || instanceName == "hydra-server" || instanceName == "apache") ''
machine.wait_for_open_port(${toString instance.port})
'';
postTests = {...}:
''
import json
import re
# Create admin user
machine.succeed("su - hydra -c 'hydra-create-user admin --role admin --password admin'")
# Login as admin user and extract session environment variable
loginOutput = machine.succeed(
"cat ${loginParams} | hydra-connect --url http://localhost --login"
)
sessionEnvVar = re.search("HYDRA_SESSION=[0-9a-zA-Z]*", loginOutput).group(0)
# Create a project
machine.succeed(
"cat ${projectParams} | "
+ sessionEnvVar
+ " hydra-connect --url http://localhost --project trivial --modify >&2"
)
machine.succeed(sessionEnvVar + " hydra-connect --url http://localhost --projects >&2")
# Create a jobset
machine.succeed("generate-trivial-project")
machine.succeed(
"(cat ${jobsetParams}; sleep 3; echo; echo; echo) | "
+ sessionEnvVar
+ " hydra-connect --url http://localhost --project trivial --jobset main --modify >&2"
)
machine.succeed(
sessionEnvVar + " hydra-connect --url http://localhost --project trivial >&2"
)
# Wait for an evaluation to appear
count = 0
while True:
machine.succeed("sleep 1")
evalsOutput = machine.succeed(
sessionEnvVar
+ " hydra-connect --url http://localhost --project trivial --jobset main --evals --json"
)
evalsObj = json.loads(evalsOutput)
count += 1
if len(evalsObj["evals"]) > 0:
break
elif count == 10:
raise Exception("Maximum number of 10 tries reached!")
machine.succeed(
sessionEnvVar
+ " hydra-connect --url http://localhost --project trivial --jobset main --evals >&2"
)
# Check properties of the build
machine.succeed(
sessionEnvVar
+ " hydra-connect --url http://localhost --project trivial --jobset main --build 1 >&2"
)
buildOutput = machine.succeed(
sessionEnvVar
+ " hydra-connect --url http://localhost --project trivial --jobset main --build 1 --json"
)
buildObj = json.loads(buildOutput)
if buildObj["buildoutputs"]["out"]["path"].startswith("/nix/store/"):
print("Found output path: {}".format(buildObj["buildoutputs"]["out"]["path"]))
else:
raise Exception("No output path found!")
machine.succeed(
sessionEnvVar
+ " hydra-connect --url http://localhost --project trivial --jobset main --build 1 --raw-log >&2"
)
'';
inherit processManagers;
# We don't support unprivileged user deployments
profiles = builtins.filter (profile: profile == "privileged") profiles;
}