1import ./make-test.nix ({ pkgs, ...} : rec {
2 name = "mesos";
3 meta = with pkgs.stdenv.lib.maintainers; {
4 maintainers = [ offline kamilchm cstrahan ];
5 };
6
7 nodes = {
8 master = { config, pkgs, ... }: {
9 networking.firewall.enable = false;
10 services.zookeeper.enable = true;
11 services.mesos.master = {
12 enable = true;
13 zk = "zk://master:2181/mesos";
14 };
15 };
16
17 slave = { config, pkgs, ... }: {
18 networking.firewall.enable = false;
19 networking.nat.enable = true;
20 virtualisation.docker.enable = true;
21 services.mesos = {
22 slave = {
23 enable = true;
24 master = "master:5050";
25 dockerRegistry = registry;
26 executorEnvironmentVariables = {
27 PATH = "/run/current-system/sw/bin";
28 };
29 };
30 };
31 };
32 };
33
34 simpleDocker = pkgs.dockerTools.buildImage {
35 name = "echo";
36 contents = [ pkgs.stdenv.shellPackage pkgs.coreutils ];
37 config = {
38 Env = [
39 # When shell=true, mesos invokes "sh -c '<cmd>'", so make sure "sh" is
40 # on the PATH.
41 "PATH=${pkgs.stdenv.shellPackage}/bin:${pkgs.coreutils}/bin"
42 ];
43 Entrypoint = [ "echo" ];
44 };
45 };
46
47 registry = pkgs.runCommand "registry" { } ''
48 mkdir -p $out
49 cp ${simpleDocker} $out/echo:latest.tar
50 '';
51
52 testFramework = pkgs.pythonPackages.buildPythonPackage {
53 name = "mesos-tests";
54 propagatedBuildInputs = [ pkgs.mesos ];
55 catchConflicts = false;
56 src = ./mesos_test.py;
57 phases = [ "installPhase" "fixupPhase" ];
58 installPhase = ''
59 install -Dvm 0755 $src $out/bin/mesos_test.py
60
61 echo "done" > test.result
62 tar czf $out/test.tar.gz test.result
63 '';
64 };
65
66 testScript =
67 ''
68 startAll;
69 $master->waitForUnit("mesos-master.service");
70 $slave->waitForUnit("mesos-slave.service");
71
72 $master->waitForOpenPort(5050);
73 $slave->waitForOpenPort(5051);
74
75 # is slave registered?
76 $master->waitUntilSucceeds("curl -s --fail http://master:5050/master/slaves".
77 " | grep -q \"\\\"hostname\\\":\\\"slave\\\"\"");
78
79 # try to run docker image
80 $master->succeed("${pkgs.mesos}/bin/mesos-execute --master=master:5050".
81 " --resources=\"cpus:0.1;mem:32\" --name=simple-docker".
82 " --containerizer=mesos --docker_image=echo:latest".
83 " --shell=true --command=\"echo done\" | grep -q TASK_FINISHED");
84
85 # simple command with .tar.gz uri
86 $master->succeed("${testFramework}/bin/mesos_test.py master ".
87 "${testFramework}/test.tar.gz");
88 '';
89})