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 = { ... }: {
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 = { ... }: {
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 tag = "latest";
37 contents = [ pkgs.stdenv.shellPackage pkgs.coreutils ];
38 config = {
39 Env = [
40 # When shell=true, mesos invokes "sh -c '<cmd>'", so make sure "sh" is
41 # on the PATH.
42 "PATH=${pkgs.stdenv.shellPackage}/bin:${pkgs.coreutils}/bin"
43 ];
44 Entrypoint = [ "echo" ];
45 };
46 };
47
48 registry = pkgs.runCommand "registry" { } ''
49 mkdir -p $out
50 cp ${simpleDocker} $out/echo:latest.tar
51 '';
52
53 testFramework = pkgs.pythonPackages.buildPythonPackage {
54 name = "mesos-tests";
55 propagatedBuildInputs = [ pkgs.mesos ];
56 catchConflicts = false;
57 src = ./mesos_test.py;
58 phases = [ "installPhase" "fixupPhase" ];
59 installPhase = ''
60 install -Dvm 0755 $src $out/bin/mesos_test.py
61
62 echo "done" > test.result
63 tar czf $out/test.tar.gz test.result
64 '';
65 };
66
67 testScript =
68 ''
69 startAll;
70 $master->waitForUnit("zookeeper.service");
71 $master->waitForUnit("mesos-master.service");
72 $slave->waitForUnit("docker.service");
73 $slave->waitForUnit("mesos-slave.service");
74 $master->waitForOpenPort(2181);
75 $master->waitForOpenPort(5050);
76 $slave->waitForOpenPort(5051);
77
78 # is slave registered?
79 $master->waitUntilSucceeds("curl -s --fail http://master:5050/master/slaves".
80 " | grep -q \"\\\"hostname\\\":\\\"slave\\\"\"");
81
82 # try to run docker image
83 $master->succeed("${pkgs.mesos}/bin/mesos-execute --master=master:5050".
84 " --resources=\"cpus:0.1;mem:32\" --name=simple-docker".
85 " --containerizer=mesos --docker_image=echo:latest".
86 " --shell=true --command=\"echo done\" | grep -q TASK_FINISHED");
87
88 # simple command with .tar.gz uri
89 $master->succeed("${testFramework}/bin/mesos_test.py master ".
90 "${testFramework}/test.tar.gz");
91 '';
92})