summary refs log tree commit diff
path: root/pkgs/applications/networking/cluster/mesos/default.nix
blob: ec152fdc464847dfd86c996e9558ef0d4d72d3a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
{ stdenv, lib, makeWrapper, fetchurl, curl, sasl, openssh
, unzip, gnutar, jdk, python, wrapPython
, setuptools, boto, pythonProtobuf, apr, subversion, gzip
, leveldb, glog, perf, utillinux, libnl, iproute, openssl, libevent
, ethtool, coreutils, which, iptables, maven
, bash, autoreconfHook
, utf8proc, lz4
, withJava ? !stdenv.isDarwin
}:

let
  mavenRepo = import ./mesos-deps.nix { inherit stdenv curl; };
  # `tar -z` requires gzip on $PATH, so wrap tar.
  # At some point, we should try to patch mesos so we add gzip to the PATH when
  # tar is invoked. I think that only needs to be done here:
  #   src/common/command_utils.cpp
  # https://github.com/NixOS/nixpkgs/issues/13783
  tarWithGzip = lib.overrideDerivation gnutar (oldAttrs: {
    # Original builder is bash 4.3.42 from bootstrap tools, too old for makeWrapper.
    builder = "${bash}/bin/bash";
    buildInputs = (oldAttrs.buildInputs or []) ++ [ makeWrapper ];
    postInstall = (oldAttrs.postInstall or "") + ''
      wrapProgram $out/bin/tar --prefix PATH ":" "${gzip}/bin"
    '';
  });

in stdenv.mkDerivation rec {
  version = "1.4.1";
  pname = "mesos";

  enableParallelBuilding = true;
  dontDisableStatic = true;

  src = fetchurl {
    url = "mirror://apache/mesos/${version}/${pname}-${version}.tar.gz";
    sha256 = "1c7l0rim9ija913gpppz2mcms08ywyqhlzbbspqsi7wwfdd7jwsr";
  };

  patches = [
    # https://reviews.apache.org/r/36610/
    # TODO: is this still needed?
    ./rb36610.patch

    # see https://github.com/cstrahan/mesos/tree/nixos-${version}
    ./nixos.patch
  ];
  nativeBuildInputs = [
    autoreconfHook
  ];
  buildInputs = [
    makeWrapper curl sasl
    python wrapPython boto setuptools leveldb
    subversion apr glog openssl libevent
    utf8proc lz4
  ] ++ lib.optionals stdenv.isLinux [
    libnl
  ] ++ lib.optionals withJava [
    jdk maven
  ];

  propagatedBuildInputs = [
    pythonProtobuf
  ];

  NIX_CFLAGS_COMPILE = "-Wno-error=format-overflow -Wno-error=class-memaccess";

  preConfigure = ''
    # https://issues.apache.org/jira/browse/MESOS-6616
    configureFlagsArray+=(
      "CXXFLAGS=-O2 -Wno-error=strict-aliasing"
    )

    substituteInPlace 3rdparty/stout/include/stout/jsonify.hpp \
      --replace '<xlocale.h>' '<locale.h>'
    # Fix cases where makedev(),major(),minor() are referenced through
    # <sys/types.h> instead of <sys/sysmacros.h>
    sed 1i'#include <sys/sysmacros.h>' -i src/linux/fs.cpp
    sed 1i'#include <sys/sysmacros.h>' -i src/slave/containerizer/mesos/isolators/gpu/isolator.cpp
    substituteInPlace 3rdparty/stout/include/stout/os/posix/chown.hpp \
      --subst-var-by chown ${coreutils}/bin/chown

    substituteInPlace 3rdparty/stout/Makefile.am \
      --replace "-lprotobuf" \
                "${pythonProtobuf.protobuf}/lib/libprotobuf.a"

    substituteInPlace 3rdparty/stout/include/stout/os/posix/fork.hpp \
      --subst-var-by sh ${bash}/bin/bash

    substituteInPlace 3rdparty/stout/include/stout/posix/os.hpp \
      --subst-var-by tar ${tarWithGzip}/bin/tar

    substituteInPlace src/cli/mesos-scp \
      --subst-var-by scp ${openssh}/bin/scp

    substituteInPlace src/common/command_utils.cpp \
      --subst-var-by curl      ${curl}/bin/curl \
      --subst-var-by gzip      ${gzip}/bin/gzip \
      --subst-var-by sha512sum ${coreutils}/bin/sha512sum \
      --subst-var-by tar       ${tarWithGzip}/bin/tar

    substituteInPlace src/launcher/fetcher.cpp \
      --subst-var-by cp    ${coreutils}/bin/cp \
      --subst-var-by gzip  ${gzip}/bin/gzip \
      --subst-var-by tar   ${tarWithGzip}/bin/tar \
      --subst-var-by unzip ${unzip}/bin/unzip

    substituteInPlace src/python/cli/src/mesos/cli.py \
      --subst-var-by mesos-resolve $out/bin/mesos-resolve

    substituteInPlace src/python/native_common/ext_modules.py.in \
      --replace "-lprotobuf" \
                "${pythonProtobuf.protobuf}/lib/libprotobuf.a"

    substituteInPlace src/slave/containerizer/mesos/isolators/gpu/volume.cpp \
      --subst-var-by cp    ${coreutils}/bin/cp \
      --subst-var-by which ${which}/bin/which

    substituteInPlace src/slave/containerizer/mesos/isolators/posix/disk.cpp \
      --subst-var-by du ${coreutils}/bin/du

    substituteInPlace src/slave/containerizer/mesos/provisioner/backends/copy.cpp \
      --subst-var-by cp ${coreutils}/bin/cp \
      --subst-var-by rm ${coreutils}/bin/rm

    substituteInPlace src/uri/fetchers/copy.cpp \
      --subst-var-by cp ${coreutils}/bin/cp

    substituteInPlace src/uri/fetchers/curl.cpp \
      --subst-var-by curl ${curl}/bin/curl

    substituteInPlace src/uri/fetchers/docker.cpp \
      --subst-var-by curl ${curl}/bin/curl

    substituteInPlace src/Makefile.am \
      --subst-var-by mavenRepo ${mavenRepo} \
      --replace "-lprotobuf" \
                "${pythonProtobuf.protobuf}/lib/libprotobuf.a"

  '' + lib.optionalString stdenv.isLinux ''

    substituteInPlace src/linux/perf.cpp \
      --subst-var-by perf ${perf}/bin/perf

    substituteInPlace src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp \
      --subst-var-by mount ${utillinux}/bin/mount

    substituteInPlace src/slave/containerizer/mesos/isolators/filesystem/linux.cpp \
      --subst-var-by mount ${utillinux}/bin/mount

    substituteInPlace src/slave/containerizer/mesos/isolators/filesystem/shared.cpp \
      --subst-var-by mount ${utillinux}/bin/mount

    substituteInPlace src/slave/containerizer/mesos/isolators/gpu/isolator.cpp \
      --subst-var-by mount ${utillinux}/bin/mount

    substituteInPlace src/slave/containerizer/mesos/isolators/namespaces/pid.cpp \
      --subst-var-by mount ${utillinux}/bin/mount

    substituteInPlace src/slave/containerizer/mesos/isolators/network/cni/cni.cpp \
      --subst-var-by mount ${utillinux}/bin/mount

    substituteInPlace src/slave/containerizer/mesos/isolators/network/cni/plugins/port_mapper/port_mapper.cpp \
      --subst-var-by iptables ${iptables}/bin/iptables

    substituteInPlace src/slave/containerizer/mesos/isolators/network/port_mapping.cpp \
      --subst-var-by ethtool ${ethtool}/sbin/ethtool \
      --subst-var-by ip      ${iproute}/bin/ip \
      --subst-var-by mount   ${utillinux}/bin/mount \
      --subst-var-by tc      ${iproute}/bin/tc

    substituteInPlace src/slave/containerizer/mesos/isolators/volume/image.cpp \
      --subst-var-by mount   ${utillinux}/bin/mount

    substituteInPlace src/slave/containerizer/mesos/isolators/volume/sandbox_path.cpp \
      --subst-var-by mount   ${utillinux}/bin/mount
  '';

  configureFlags = [
    "--sbindir=\${out}/bin"
    "--with-apr=${apr.dev}"
    "--with-svn=${subversion.dev}"
    "--with-leveldb=${leveldb}"
    "--with-glog=${glog}"
    "--enable-optimize"
    "--disable-python-dependency-install"
    "--enable-ssl"
    "--with-ssl=${openssl.dev}"
    "--enable-libevent"
    "--with-libevent=${libevent.dev}"
    "--with-protobuf=${pythonProtobuf.protobuf}"
    "PROTOBUF_JAR=${mavenRepo}/com/google/protobuf/protobuf-java/3.3.0/protobuf-java-3.3.0.jar"
    (if withJava then "--enable-java" else "--disable-java")
  ] ++ lib.optionals stdenv.isLinux [
    "--with-network-isolator"
    "--with-nl=${libnl.dev}"
  ];

  postInstall = ''
    rm -rf $out/var
    rm $out/bin/*.sh

    # Inspired by: pkgs/development/python-modules/generic/default.nix
    pushd src/python
    mkdir -p $out/lib/${python.libPrefix}/site-packages
    export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
    ${python}/bin/${python.executable} setup.py install \
      --install-lib=$out/lib/${python.libPrefix}/site-packages \
      --old-and-unmanageable \
      --prefix="$out"
    rm -f "$out/lib/${python.libPrefix}"/site-packages/site.py*
    popd

    # optional python dependency for mesos cli
    pushd src/python/cli
    ${python}/bin/${python.executable} setup.py install \
      --install-lib=$out/lib/${python.libPrefix}/site-packages \
      --old-and-unmanageable \
      --prefix="$out"
    popd
  '' + stdenv.lib.optionalString withJava ''
    mkdir -p $out/share/java
    cp src/java/target/mesos-*.jar $out/share/java

    MESOS_NATIVE_JAVA_LIBRARY=$out/lib/libmesos${stdenv.hostPlatform.extensions.sharedLibrary}

    mkdir -p $out/nix-support
    touch $out/nix-support/setup-hook
    echo "export MESOS_NATIVE_JAVA_LIBRARY=$MESOS_NATIVE_JAVA_LIBRARY" >> $out/nix-support/setup-hook
    echo "export MESOS_NATIVE_LIBRARY=$MESOS_NATIVE_JAVA_LIBRARY" >> $out/nix-support/setup-hook
  '';

  postFixup = ''
    if test -e $out/nix-support/propagated-build-inputs; then
      ln -s $out/nix-support/propagated-build-inputs $out/nix-support/propagated-user-env-packages
    fi

    for inputsfile in propagated-build-inputs propagated-native-build-inputs; do
      if test -e $out/nix-support/$inputsfile; then
        createBuildInputsPth $inputsfile "$(cat $out/nix-support/$inputsfile)"
      fi
    done

    for f in $out/libexec/mesos/python/mesos/*.py; do
      ${python}/bin/${python.executable} -c "import py_compile; py_compile.compile('$f')"
    done

    # wrap the python programs
    for prog in mesos-cat mesos-ps mesos-scp mesos-tail; do
      wrapProgram "$out/bin/$prog" \
        --prefix PYTHONPATH ":" "$out/lib/${python.libPrefix}/site-packages"
      true
    done
  '';

  meta = with lib; {
    homepage    = "http://mesos.apache.org";
    license     = licenses.asl20;
    description = "A cluster manager that provides efficient resource isolation and sharing across distributed applications, or frameworks";
    maintainers = with maintainers; [ cstrahan offline ];
    platforms   = platforms.unix;
  };
}