nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenv,
4 runCommand,
5 fetchurl,
6 fetchFromGitHub,
7 fetchPypi,
8 fetchpatch2,
9 callPackage,
10
11 # Build time
12 autoconf,
13 automake,
14 cmake,
15 ensureNewerSourcesHook,
16 # To see which `fmt` version Ceph upstream recommends, check its `src/fmt` submodule.
17 #
18 # Ceph does not currently build with `fmt_10`; see https://github.com/NixOS/nixpkgs/issues/281027#issuecomment-1899128557
19 # If we want to switch for that before upstream fixes it, use this patch:
20 # https://github.com/NixOS/nixpkgs/pull/281858#issuecomment-1899648638
21 fmt_9,
22 git,
23 libtool,
24 makeWrapper,
25 nasm,
26 pkg-config,
27 which,
28 openssl,
29
30 # Tests
31 nixosTests,
32
33 # Runtime dependencies
34
35 # Remove once Ceph supports arrow-cpp >= 20, see:
36 # * https://tracker.ceph.com/issues/71269
37 # * https://github.com/NixOS/nixpkgs/issues/406306
38 ceph-arrow-cpp ? callPackage ./arrow-cpp-19.nix { },
39 babeltrace,
40 # Note when trying to upgrade boost:
41 # * When upgrading Ceph, it's recommended to check which boost version Ceph uses on Fedora,
42 # and default to that.
43 # * The version that Ceph downloads if `-DWITH_SYSTEM_BOOST:BOOL=ON` is not given
44 # is declared in `cmake/modules/BuildBoost.cmake` line `set(boost_version ...)`.
45 #
46 # If you want to upgrade to boost >= 1.86, you need a Ceph version that
47 # has this PR in:
48 # https://github.com/ceph/ceph/pull/61312
49 boost183,
50 bzip2,
51 cryptsetup,
52 cunit,
53 e2fsprogs,
54 doxygen,
55 getopt,
56 gperf,
57 graphviz,
58 gnugrep,
59 gtest,
60 icu,
61 kmod,
62 libcap,
63 libcap_ng,
64 libnbd,
65 libnl,
66 libxml2,
67 lmdb,
68 lttng-ust,
69 # Ceph currently requires >= 5.3
70 lua5_4,
71 lvm2,
72 lz4,
73 oath-toolkit,
74 openldap,
75 parted,
76 python311, # to get an idea which Python versions are supported by Ceph, see upstream `do_cmake.sh` (see `PYBUILD=` variable)
77 rdkafka,
78 rocksdb,
79 snappy,
80 openssh,
81 sqlite,
82 utf8proc,
83 xfsprogs,
84 zlib,
85 zstd,
86
87 # Dependencies of overridden Python dependencies, hopefully we can remove these soon.
88 rustPlatform,
89
90 # Optional Dependencies
91 curl ? null,
92 expat ? null,
93 fuse ? null,
94 libatomic_ops ? null,
95 libedit ? null,
96 libs3 ? null,
97 yasm ? null,
98
99 # Mallocs
100 gperftools ? null,
101 jemalloc ? null,
102
103 # Crypto Dependencies
104 cryptopp ? null,
105 nspr ? null,
106 nss ? null,
107
108 # Linux Only Dependencies
109 linuxHeaders,
110 systemd,
111 util-linux,
112 libuuid,
113 udev,
114 keyutils,
115 rdma-core,
116 rabbitmq-c,
117 libaio ? null,
118 libxfs ? null,
119 liburing ? null,
120 zfs ? null,
121 withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd,
122}:
123
124# We must have one crypto library
125assert cryptopp != null || (nss != null && nspr != null);
126
127let
128 shouldUsePkg =
129 pkg: if pkg != null && lib.meta.availableOn stdenv.hostPlatform pkg then pkg else null;
130
131 optYasm = shouldUsePkg yasm;
132 optExpat = shouldUsePkg expat;
133 optCurl = shouldUsePkg curl;
134 optFuse = shouldUsePkg fuse;
135 optLibedit = shouldUsePkg libedit;
136 optLibatomic_ops = shouldUsePkg libatomic_ops;
137 optLibs3 = shouldUsePkg libs3;
138
139 optJemalloc = shouldUsePkg jemalloc;
140 optGperftools = shouldUsePkg gperftools;
141
142 optCryptopp = shouldUsePkg cryptopp;
143 optNss = shouldUsePkg nss;
144 optNspr = shouldUsePkg nspr;
145
146 optLibaio = shouldUsePkg libaio;
147 optLibxfs = shouldUsePkg libxfs;
148 optZfs = shouldUsePkg zfs;
149
150 # Downgrade rocksdb, 7.10 breaks ceph
151 rocksdb' = rocksdb.overrideAttrs {
152 version = "7.9.2";
153 src = fetchFromGitHub {
154 owner = "facebook";
155 repo = "rocksdb";
156 tag = "v7.9.2";
157 hash = "sha256-5P7IqJ14EZzDkbjaBvbix04ceGGdlWBuVFH/5dpD5VM=";
158 };
159 };
160
161 hasRadosgw = optExpat != null && optCurl != null && optLibedit != null;
162
163 # Malloc implementation (can be jemalloc, tcmalloc or null)
164 malloc = if optJemalloc != null then optJemalloc else optGperftools;
165
166 # We prefer nss over cryptopp
167 cryptoStr =
168 if optNss != null && optNspr != null then
169 "nss"
170 else if optCryptopp != null then
171 "cryptopp"
172 else
173 "none";
174
175 cryptoLibsMap = {
176 nss = [
177 optNss
178 optNspr
179 ];
180 cryptopp = [ optCryptopp ];
181 none = [ ];
182 };
183
184 getMeta = description: {
185 homepage = "https://ceph.io/en/";
186 inherit description;
187 license = with lib.licenses; [
188 lgpl21
189 gpl2Only
190 bsd3
191 mit
192 publicDomain
193 ];
194 maintainers = with lib.maintainers; [
195 adev
196 ak
197 johanot
198 krav
199 nh2
200 benaryorg
201 ];
202 platforms = [
203 "x86_64-linux"
204 "aarch64-linux"
205 ];
206 };
207
208 ceph-common =
209 with python.pkgs;
210 buildPythonPackage {
211 pname = "ceph-common";
212 format = "setuptools";
213 inherit src version;
214
215 sourceRoot = "ceph-${version}/src/python-common";
216
217 propagatedBuildInputs = [
218 pyyaml
219 ];
220
221 nativeCheckInputs = [
222 pytestCheckHook
223 ];
224
225 disabledTests = [
226 # requires network access
227 "test_valid_addr"
228 ];
229
230 meta = getMeta "Ceph common module for code shared by manager modules";
231 };
232
233 # Watch out for python <> boost compatibility
234 python = python311.override {
235 self = python;
236 packageOverrides =
237 self: super:
238 let
239 bcryptOverrideVersion = "4.0.1";
240 in
241 {
242 # Ceph does not support the following yet:
243 # * `bcrypt` > 4.0
244 # * `cryptography` > 40
245 # See:
246 # * https://github.com/NixOS/nixpkgs/pull/281858#issuecomment-1899358602
247 # * Upstream issue: https://tracker.ceph.com/issues/63529
248 # > Python Sub-Interpreter Model Used by ceph-mgr Incompatible With Python Modules Based on PyO3
249 # * Moved to issue: https://tracker.ceph.com/issues/64213
250 # > MGR modules incompatible with later PyO3 versions - PyO3 modules may only be initialized once per interpreter process
251
252 bcrypt = super.bcrypt.overridePythonAttrs (old: rec {
253 pname = "bcrypt";
254 version = bcryptOverrideVersion;
255 src = fetchPypi {
256 inherit pname version;
257 hash = "sha256-J9N1kDrIJhz+QEf2cJ0W99GNObHskqr3KvmJVSplDr0=";
258 };
259 cargoRoot = "src/_bcrypt";
260 cargoDeps = rustPlatform.fetchCargoVendor {
261 inherit
262 pname
263 version
264 src
265 cargoRoot
266 ;
267 hash = "sha256-8PyCgh/rUO8uynzGdgylAsb5k55dP9fCnf40UOTCR/M=";
268 };
269 });
270
271 # We pin the older `cryptography` 40 here;
272 # this also forces us to pin other packages, see below
273 cryptography = self.callPackage ./old-python-packages/cryptography.nix { };
274
275 # This is the most recent version of `pyopenssl` that's still compatible with `cryptography` 40.
276 # See https://github.com/NixOS/nixpkgs/pull/281858#issuecomment-1899358602
277 # and https://github.com/pyca/pyopenssl/blob/d9752e44127ba36041b045417af8a0bf16ec4f1e/CHANGELOG.rst#2320-2023-05-30
278 pyopenssl = super.pyopenssl.overridePythonAttrs (old: rec {
279 version = "23.1.1";
280 src = fetchPypi {
281 pname = "pyOpenSSL";
282 inherit version;
283 hash = "sha256-hBSYub7GFiOxtsR+u8AjZ8B9YODhlfGXkIF/EMyNsLc=";
284 };
285 disabledTests = old.disabledTests or [ ] ++ [
286 "test_export_md5_digest"
287 ];
288 disabledTestPaths = old.disabledTestPaths or [ ] ++ [
289 "tests/test_ssl.py"
290 ];
291 propagatedBuildInputs = old.propagatedBuildInputs or [ ] ++ [
292 self.flaky
293 ];
294 # hack: avoid building docs due to incompatibility with current sphinx
295 nativeBuildInputs = [ openssl ]; # old.nativeBuildInputs but without sphinx*
296 outputs = lib.filter (o: o != "doc") old.outputs;
297 });
298
299 # This is the most recent version of `trustme` that's still compatible with `cryptography` 40.
300 # See https://github.com/NixOS/nixpkgs/issues/359723
301 # and https://github.com/python-trio/trustme/commit/586f7759d5c27beb44da60615a71848eb2a5a490
302 trustme = self.callPackage ./old-python-packages/trustme.nix { };
303
304 fastapi = super.fastapi.overridePythonAttrs (old: {
305 # Flaky test:
306 # ResourceWarning: Unclosed <MemoryObjectSendStream>
307 # Unclear whether it's flaky in general or only in this overridden package set.
308 doCheck = false;
309 });
310
311 # Ceph does not support `kubernetes` >= 19, see:
312 # https://github.com/NixOS/nixpkgs/pull/281858#issuecomment-1900324090
313 kubernetes = super.kubernetes.overridePythonAttrs (old: rec {
314 version = "18.20.0";
315 src = fetchFromGitHub {
316 owner = "kubernetes-client";
317 repo = "python";
318 rev = "v${version}";
319 sha256 = "1sawp62j7h0yksmg9jlv4ik9b9i1a1w9syywc9mv8x89wibf5ql1";
320 fetchSubmodules = true;
321 };
322 });
323
324 };
325 };
326
327 boost' = boost183.override {
328 enablePython = true;
329 inherit python;
330 };
331
332 # TODO: split this off in build and runtime environment
333 ceph-python-env = python.withPackages (
334 ps: with ps; [
335 ceph-common
336
337 # build time
338 cython_0
339
340 # debian/control
341 bcrypt
342 cherrypy
343 influxdb
344 jinja2
345 kubernetes
346 natsort
347 numpy
348 pecan
349 prettytable
350 pyjwt
351 pyopenssl
352 python-dateutil
353 pyyaml
354 requests
355 routes
356 scikit-learn
357 scipy
358 setuptools
359 sphinx
360 virtualenv
361 werkzeug
362
363 # src/cephadm/zipapp-reqs.txt
364 markupsafe
365
366 # src/pybind/mgr/requirements-required.txt
367 cryptography
368 jsonpatch
369
370 # src/tools/cephfs/shell/setup.py
371 cmd2
372 colorama
373 ]
374 );
375 inherit (ceph-python-env.python) sitePackages;
376
377 version = "19.2.3";
378 src = fetchurl {
379 url = "https://download.ceph.com/tarballs/ceph-${version}.tar.gz";
380 hash = "sha256-zlgp28C81SZbaFJ4yvQk4ZgYz4K/aZqtcISTO8LscSU=";
381 };
382in
383stdenv.mkDerivation {
384 pname = "ceph";
385 inherit src version;
386
387 patches = [
388 ./boost-1.85.patch
389
390 (fetchpatch2 {
391 name = "ceph-boost-1.86-uuid.patch";
392 url = "https://github.com/ceph/ceph/commit/01306208eac492ee0e67bff143fc32d0551a2a6f.patch?full_index=1";
393 hash = "sha256-OnDrr72inzGXXYxPFQevsRZImSvI0uuqFHqtFU2dPQE=";
394 })
395
396 # See:
397 # * <https://github.com/boostorg/python/issues/394>
398 # * <https://aur.archlinux.org/cgit/aur.git/commit/?h=ceph&id=8c5cc7d8deec002f7596b6d0860859a0a718f12b>
399 # * <https://github.com/ceph/ceph/pull/60999>
400 ./boost-1.86-PyModule.patch
401
402 (fetchpatch2 {
403 name = "ceph-cmake-4.patch";
404 url = "https://gitlab.alpinelinux.org/ashpool/aports/-/raw/d22b70eafe33c3daabe4eea6913c5be87d9463ad/community/ceph19/cpp_redis.patch";
405 hash = "sha256-wxPIsYt25CjXhJ6kmr/MXwFD58Sl4y4W+r9jAMND+uw=";
406 })
407
408 # See:
409 # * <https://github.com/ceph/ceph/pull/55560>
410 # * <https://github.com/ceph/ceph/pull/60575>
411 (fetchpatch2 {
412 name = "ceph-systemd-sans-cluster-name.patch";
413 url = "https://github.com/ceph/ceph/commit/5659920c7c128cb8d9552580dbe23dd167a56c31.patch?full_index=1";
414 hash = "sha256-Uch8ZghyTowUvSq0p/RxiVpdG1Yqlww9inpVksO6zyk=";
415 })
416 (fetchpatch2 {
417 name = "ceph-systemd-prefix.patch";
418 url = "https://github.com/ceph/ceph/commit/9b38df488d7101b02afa834ea518fd52076d582a.patch?full_index=1";
419 hash = "sha256-VcbJhCGTUdNISBd6P96Mm5M3fFVmZ8r7pMl+srQmnIQ=";
420 })
421 (fetchpatch2 {
422 name = "ceph-19.2.2-gcc15.patch";
423 url = "https://github.com/ceph/ceph/commit/830925f0dd196f920893b1947ae74171a202e825.patch";
424 hash = "sha256-bs+noyjiyAjwqfgSHDxdZJnZ/kptOOcz75KMqAaROpg=";
425 })
426 ];
427
428 nativeBuildInputs = [
429 autoconf # `autoreconf` is called, e.g. for `qatlib_ext`
430 automake # `aclocal` is called, e.g. for `qatlib_ext`
431 cmake
432 fmt_9
433 git
434 makeWrapper
435 libtool # used e.g. for `qatlib_ext`
436 nasm
437 pkg-config
438 python
439 python.pkgs.python # for the toPythonPath function
440 python.pkgs.wrapPython
441 which
442 (ensureNewerSourcesHook { year = "1980"; })
443 # for building docs/man-pages presumably
444 doxygen
445 graphviz
446 ];
447
448 buildInputs =
449 cryptoLibsMap.${cryptoStr}
450 ++ [
451 ceph-arrow-cpp
452 babeltrace
453 boost'
454 bzip2
455 # Adding `ceph-python-env` here adds the env's `site-packages` to `PYTHONPATH` during the build.
456 # This is important, otherwise the build system may not find the Python deps and then
457 # silently skip installing ceph-volume and other Ceph python tools.
458 ceph-python-env
459 cryptsetup
460 cunit
461 e2fsprogs # according to `debian/control` file, `ceph-volume` is supposed to use it
462 gperf
463 gtest
464 icu
465 libcap
466 libnbd
467 libnl
468 libxml2
469 lmdb
470 lttng-ust
471 lua5_4
472 lvm2 # according to `debian/control` file, e.g. `pvs` command used by `src/ceph-volume/ceph_volume/api/lvm.py`
473 lz4
474 malloc
475 oath-toolkit
476 openldap
477 optLibatomic_ops
478 optLibs3
479 optYasm
480 parted # according to `debian/control` file, used by `src/ceph-volume/ceph_volume/util/disk.py`
481 rdkafka
482 rocksdb'
483 snappy
484 openssh # according to `debian/control` file, `ssh` command used by `cephadm`
485 sqlite
486 utf8proc
487 xfsprogs # according to `debian/control` file, `ceph-volume` is supposed to use it
488 zlib
489 zstd
490 ]
491 ++ lib.optionals stdenv.hostPlatform.isLinux [
492 keyutils
493 libcap_ng
494 liburing
495 libuuid
496 linuxHeaders
497 optLibaio
498 optLibxfs
499 optZfs
500 rabbitmq-c
501 rdma-core
502 udev
503 util-linux
504 ]
505 ++ lib.optionals hasRadosgw [
506 optCurl
507 optExpat
508 optFuse
509 optLibedit
510 ];
511
512 # Picked up, amongst others, by `wrapPythonPrograms`.
513 pythonPath = [
514 ceph-python-env
515 "${placeholder "out"}/${ceph-python-env.sitePackages}"
516 ];
517
518 # * `unset AS` because otherwise the Ceph CMake build errors with
519 # configure: error: No modern nasm or yasm found as required. Nasm should be v2.11.01 or later (v2.13 for AVX512) and yasm should be 1.2.0 or later.
520 # because the code at
521 # https://github.com/intel/isa-l/blob/633add1b569fe927bace3960d7c84ed9c1b38bb9/configure.ac#L99-L191
522 # doesn't even consider using `nasm` or `yasm` but instead uses `$AS`
523 # from `gcc-wrapper`.
524 # (Ceph's error message is extra confusing, because it says
525 # `No modern nasm or yasm found` when in fact it found e.g. `nasm`
526 # but then uses `$AS` instead.
527 # * replace /sbin and /bin based paths with direct nix store paths
528 # * increase the `command` buffer size since 2 nix store paths cannot fit within 128 characters
529 preConfigure = ''
530 unset AS
531
532 substituteInPlace src/common/module.c \
533 --replace "char command[128];" "char command[256];" \
534 --replace "/sbin/modinfo" "${kmod}/bin/modinfo" \
535 --replace "/sbin/modprobe" "${kmod}/bin/modprobe" \
536 --replace "/bin/grep" "${gnugrep}/bin/grep"
537
538 # Patch remount to use full path to mount(8), otherwise ceph-fuse fails when run
539 # from a systemd unit for example.
540 substituteInPlace src/client/fuse_ll.cc \
541 --replace-fail "mount -i -o remount" "${util-linux}/bin/mount -i -o remount"
542
543 substituteInPlace systemd/*.service.in \
544 --replace-quiet "/bin/kill" "${util-linux}/bin/kill"
545
546 substituteInPlace src/{ceph-osd-prestart.sh,ceph-post-file.in,init-ceph.in} \
547 --replace-fail "GETOPT=/usr/local/bin/getopt" "GETOPT=${getopt}/bin/getopt" \
548 --replace-fail "GETOPT=getopt" "GETOPT=${getopt}/bin/getopt"
549
550 # The install target needs to be in PYTHONPATH for "*.pth support" check to succeed
551 export PYTHONPATH=$PYTHONPATH:$lib/${sitePackages}:$out/${sitePackages}
552 patchShebangs src/
553 '';
554
555 cmakeFlags = [
556 "-DCMAKE_INSTALL_DATADIR=${placeholder "lib"}/lib"
557
558 "-DWITH_CEPHFS_SHELL:BOOL=ON"
559 "-DWITH_SYSTEMD:BOOL=${if withSystemd then "ON" else "OFF"}"
560 "-DSYSTEMD_SYSTEM_UNIT_DIR=${placeholder "out"}/lib/systemd/system"
561 # `WITH_JAEGER` requires `thrift` as a depenedncy (fine), but the build fails with:
562 # CMake Error at src/opentelemetry-cpp-stamp/opentelemetry-cpp-build-Release.cmake:49 (message):
563 # Command failed: 2
564 #
565 # 'make' 'opentelemetry_trace' 'opentelemetry_exporter_jaeger_trace'
566 #
567 # See also
568 #
569 # /build/ceph-18.2.0/build/src/opentelemetry-cpp/src/opentelemetry-cpp-stamp/opentelemetry-cpp-build-*.log
570 # and that file contains:
571 # /build/ceph-18.2.0/src/jaegertracing/opentelemetry-cpp/exporters/jaeger/src/TUDPTransport.cc: In member function 'virtual void opentelemetry::v1::exporter::jaeger::TUDPTransport::close()':
572 # /build/ceph-18.2.0/src/jaegertracing/opentelemetry-cpp/exporters/jaeger/src/TUDPTransport.cc:71:7: error: '::close' has not been declared; did you mean 'pclose'?
573 # 71 | ::THRIFT_CLOSESOCKET(socket_);
574 # | ^~~~~~~~~~~~~~~~~~
575 # Looks like `close()` is somehow not included.
576 # But the relevant code is already removed in `open-telemetry` 1.10: https://github.com/open-telemetry/opentelemetry-cpp/pull/2031
577 # So it's probably not worth trying to fix that for this Ceph version,
578 # and instead just disable Ceph's Jaeger support.
579 "-DWITH_JAEGER:BOOL=OFF"
580 "-DWITH_TESTS:BOOL=OFF"
581
582 # Use our own libraries, where possible
583 "-DWITH_SYSTEM_ARROW:BOOL=ON" # Only used if other options enable Arrow support.
584 "-DWITH_SYSTEM_BOOST:BOOL=ON"
585 "-DWITH_SYSTEM_GTEST:BOOL=ON"
586 "-DWITH_SYSTEM_ROCKSDB:BOOL=ON"
587 "-DWITH_SYSTEM_UTF8PROC:BOOL=ON"
588 "-DWITH_SYSTEM_ZSTD:BOOL=ON"
589
590 # Use our own python libraries too, see:
591 # https://github.com/NixOS/nixpkgs/pull/344993#issuecomment-2391046329
592 "-DCEPHADM_BUNDLED_DEPENDENCIES=none"
593
594 # TODO breaks with sandbox, tries to download stuff with npm
595 "-DWITH_MGR_DASHBOARD_FRONTEND:BOOL=OFF"
596 # WITH_XFS has been set default ON from Ceph 16, keeping it optional in nixpkgs for now
597 "-DWITH_XFS=${if optLibxfs != null then "ON" else "OFF"}"
598 ]
599 ++ lib.optional stdenv.hostPlatform.isLinux "-DWITH_SYSTEM_LIBURING=ON";
600
601 preBuild =
602 # The legacy-option-headers target is not correctly empbedded in the build graph.
603 # It also contains some internal race conditions that we work around by building with `-j 1`.
604 # Upstream discussion for additional context at https://tracker.ceph.com/issues/63402.
605 ''
606 cmake --build . --target legacy-option-headers -j 1
607 '';
608
609 postFixup = ''
610 wrapPythonPrograms
611 wrapProgram $out/bin/ceph-mgr --prefix PYTHONPATH ":" "$(toPythonPath ${placeholder "out"}):$(toPythonPath ${ceph-python-env})"
612
613 # Test that ceph-volume exists since the build system has a tendency to
614 # silently drop it with misconfigurations.
615 test -f $out/bin/ceph-volume
616
617 # Assert that getopt patch from preConfigure covered all instances
618 ! grep -F -r 'GETOPT=getopt' $out
619 ! grep -F -r 'GETOPT=/usr/local/bin/getopt' $out
620
621 mkdir -p $client/{bin,etc,${sitePackages},share/bash-completion/completions}
622 cp -r $out/bin/{ceph,.ceph-wrapped,rados,rbd,rbdmap} $client/bin
623 cp -r $out/bin/ceph-{authtool,conf,dencoder,rbdnamer,syn} $client/bin
624 cp -r $out/bin/rbd-replay* $client/bin
625 cp -r $out/sbin/mount.ceph $client/bin
626 cp -r $out/sbin/mount.fuse.ceph $client/bin
627 ln -s bin $client/sbin
628 cp -r $out/${sitePackages}/* $client/${sitePackages}
629 cp -r $out/etc/bash_completion.d $client/share/bash-completion/completions
630 # wrapPythonPrograms modifies .ceph-wrapped, so lets just update its paths
631 substituteInPlace $client/bin/ceph --replace $out $client
632 substituteInPlace $client/bin/.ceph-wrapped --replace $out $client
633 '';
634
635 outputs = [
636 "out"
637 "lib"
638 "client"
639 "dev"
640 "doc"
641 "man"
642 ];
643
644 doCheck = false; # uses pip to install things from the internet
645
646 # Takes 7+h to build with 2 cores.
647 requiredSystemFeatures = [ "big-parallel" ];
648
649 meta = getMeta "Distributed storage system";
650
651 passthru = {
652 inherit version;
653 inherit python; # to be able to test our overridden packages above individually with `nix-build -A`
654 arrow-cpp = ceph-arrow-cpp;
655 tests = {
656 inherit (nixosTests)
657 ceph-multi-node
658 ceph-single-node
659 ceph-single-node-bluestore
660 ceph-single-node-bluestore-dmcrypt
661 ;
662 };
663 };
664}