Enable strictDeps on all our toplevel packages #12
							
								
								
									
										405
									
								
								pkgs/ceph.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										405
									
								
								pkgs/ceph.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,405 @@ | |||||||
|  | { lib | ||||||
|  | , stdenv | ||||||
|  | , runCommand | ||||||
|  | , fetchurl | ||||||
|  | , fetchFromGitHub | ||||||
|  | , fetchPypi | ||||||
|  | 
 | ||||||
|  | # Build time | ||||||
|  | , cmake | ||||||
|  | , ensureNewerSourcesHook | ||||||
|  | , fmt | ||||||
|  | , git | ||||||
|  | , makeWrapper | ||||||
|  | , nasm | ||||||
|  | , pkg-config | ||||||
|  | , which | ||||||
|  | 
 | ||||||
|  | # Tests | ||||||
|  | , nixosTests | ||||||
|  | 
 | ||||||
|  | # Runtime dependencies | ||||||
|  | , arrow-cpp | ||||||
|  | , babeltrace | ||||||
|  | , boost179 | ||||||
|  | , bzip2 | ||||||
|  | , cryptsetup | ||||||
|  | , cunit | ||||||
|  | , doxygen | ||||||
|  | , gperf | ||||||
|  | , graphviz | ||||||
|  | , gtest | ||||||
|  | , icu | ||||||
|  | , libcap | ||||||
|  | , libcap_ng | ||||||
|  | , libnl | ||||||
|  | , libxml2 | ||||||
|  | , lttng-ust | ||||||
|  | , lua | ||||||
|  | , lz4 | ||||||
|  | , oath-toolkit | ||||||
|  | , openldap | ||||||
|  | , python310 | ||||||
|  | , rdkafka | ||||||
|  | , rocksdb | ||||||
|  | , snappy | ||||||
|  | , sqlite | ||||||
|  | , utf8proc | ||||||
|  | , zlib | ||||||
|  | , zstd | ||||||
|  | 
 | ||||||
|  | # Optional Dependencies | ||||||
|  | , curl ? null | ||||||
|  | , expat ? null | ||||||
|  | , fuse ? null | ||||||
|  | , libatomic_ops ? null | ||||||
|  | , libedit ? null | ||||||
|  | , libs3 ? null | ||||||
|  | , yasm ? null | ||||||
|  | 
 | ||||||
|  | # Mallocs | ||||||
|  | , gperftools ? null | ||||||
|  | , jemalloc ? null | ||||||
|  | 
 | ||||||
|  | # Crypto Dependencies | ||||||
|  | , cryptopp ? null | ||||||
|  | , nspr ? null | ||||||
|  | , nss ? null | ||||||
|  | 
 | ||||||
|  | # Linux Only Dependencies | ||||||
|  | , linuxHeaders | ||||||
|  | , util-linux | ||||||
|  | , libuuid | ||||||
|  | , udev | ||||||
|  | , keyutils | ||||||
|  | , rdma-core | ||||||
|  | , rabbitmq-c | ||||||
|  | , libaio ? null | ||||||
|  | , libxfs ? null | ||||||
|  | , liburing ? null | ||||||
|  | , zfs ? null | ||||||
|  | , ... | ||||||
|  | }: | ||||||
|  | 
 | ||||||
|  | # We must have one crypto library | ||||||
|  | assert cryptopp != null || (nss != null && nspr != null); | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |   shouldUsePkg = pkg: if pkg != null && pkg.meta.available then pkg else null; | ||||||
|  | 
 | ||||||
|  |   optYasm = shouldUsePkg yasm; | ||||||
|  |   optExpat = shouldUsePkg expat; | ||||||
|  |   optCurl = shouldUsePkg curl; | ||||||
|  |   optFuse = shouldUsePkg fuse; | ||||||
|  |   optLibedit = shouldUsePkg libedit; | ||||||
|  |   optLibatomic_ops = shouldUsePkg libatomic_ops; | ||||||
|  |   optLibs3 = shouldUsePkg libs3; | ||||||
|  | 
 | ||||||
|  |   optJemalloc = shouldUsePkg jemalloc; | ||||||
|  |   optGperftools = shouldUsePkg gperftools; | ||||||
|  | 
 | ||||||
|  |   optCryptopp = shouldUsePkg cryptopp; | ||||||
|  |   optNss = shouldUsePkg nss; | ||||||
|  |   optNspr = shouldUsePkg nspr; | ||||||
|  | 
 | ||||||
|  |   optLibaio = shouldUsePkg libaio; | ||||||
|  |   optLibxfs = shouldUsePkg libxfs; | ||||||
|  |   optZfs = shouldUsePkg zfs; | ||||||
|  | 
 | ||||||
|  |   # Downgrade rocksdb, 7.10 breaks ceph | ||||||
|  |   rocksdb' = rocksdb.overrideAttrs { | ||||||
|  |     version = "7.9.2"; | ||||||
|  |     src = fetchFromGitHub { | ||||||
|  |       owner = "facebook"; | ||||||
|  |       repo = "rocksdb"; | ||||||
|  |       rev = "refs/tags/v7.9.2"; | ||||||
|  |       hash = "sha256-5P7IqJ14EZzDkbjaBvbix04ceGGdlWBuVFH/5dpD5VM="; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   hasRadosgw = optExpat != null && optCurl != null && optLibedit != null; | ||||||
|  | 
 | ||||||
|  |   # Malloc implementation (can be jemalloc, tcmalloc or null) | ||||||
|  |   malloc = if optJemalloc != null then optJemalloc else optGperftools; | ||||||
|  | 
 | ||||||
|  |   # We prefer nss over cryptopp | ||||||
|  |   cryptoStr = if optNss != null && optNspr != null then "nss" else | ||||||
|  |     if optCryptopp != null then "cryptopp" else "none"; | ||||||
|  | 
 | ||||||
|  |   cryptoLibsMap = { | ||||||
|  |     nss = [ optNss optNspr ]; | ||||||
|  |     cryptopp = [ optCryptopp ]; | ||||||
|  |     none = [ ]; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   getMeta = description: with lib; { | ||||||
|  |      homepage = "https://ceph.io/en/"; | ||||||
|  |      inherit description; | ||||||
|  |      license = with licenses; [ lgpl21 gpl2 bsd3 mit publicDomain ]; | ||||||
|  |      maintainers = with maintainers; [ adev ak johanot krav ]; | ||||||
|  |      platforms = [ "x86_64-linux" "aarch64-linux" ]; | ||||||
|  |    }; | ||||||
|  | 
 | ||||||
|  |   ceph-common = with python.pkgs; buildPythonPackage { | ||||||
|  |     pname = "ceph-common"; | ||||||
|  |     inherit src version; | ||||||
|  | 
 | ||||||
|  |     sourceRoot = "ceph-${version}/src/python-common"; | ||||||
|  | 
 | ||||||
|  |     propagatedBuildInputs = [ | ||||||
|  |       pyyaml | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     nativeCheckInputs = [ | ||||||
|  |       pytestCheckHook | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     disabledTests = [ | ||||||
|  |       # requires network access | ||||||
|  |       "test_valid_addr" | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     meta = getMeta "Ceph common module for code shared by manager modules"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # Watch out for python <> boost compatibility | ||||||
|  |   python = python310.override { | ||||||
|  |     packageOverrides = self: super: { | ||||||
|  |       sqlalchemy = super.sqlalchemy.overridePythonAttrs rec { | ||||||
|  |         version = "1.4.46"; | ||||||
|  |         src = fetchPypi { | ||||||
|  |           pname = "SQLAlchemy"; | ||||||
|  |           inherit version; | ||||||
|  |           hash = "sha256-aRO4JH2KKS74MVFipRkx4rQM6RaB8bbxj2lwRSAMSjA="; | ||||||
|  |         }; | ||||||
|  |         disabledTestPaths = [ | ||||||
|  |           "test/aaa_profiling" | ||||||
|  |           "test/ext/mypy" | ||||||
|  |         ]; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   boost = boost179.override { | ||||||
|  |     enablePython = true; | ||||||
|  |     inherit python; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   # TODO: split this off in build and runtime environment | ||||||
|  |   ceph-python-env = python.withPackages (ps: with ps; [ | ||||||
|  |     ceph-common | ||||||
|  | 
 | ||||||
|  |     # build time | ||||||
|  |     cython | ||||||
|  | 
 | ||||||
|  |     # debian/control | ||||||
|  |     bcrypt | ||||||
|  |     cherrypy | ||||||
|  |     influxdb | ||||||
|  |     jinja2 | ||||||
|  |     kubernetes | ||||||
|  |     natsort | ||||||
|  |     numpy | ||||||
|  |     pecan | ||||||
|  |     prettytable | ||||||
|  |     pyjwt | ||||||
|  |     pyopenssl | ||||||
|  |     python-dateutil | ||||||
|  |     pyyaml | ||||||
|  |     requests | ||||||
|  |     routes | ||||||
|  |     scikit-learn | ||||||
|  |     scipy | ||||||
|  |     setuptools | ||||||
|  |     sphinx | ||||||
|  |     virtualenv | ||||||
|  |     werkzeug | ||||||
|  | 
 | ||||||
|  |     # src/pybind/mgr/requirements-required.txt | ||||||
|  |     cryptography | ||||||
|  |     jsonpatch | ||||||
|  | 
 | ||||||
|  |     # src/tools/cephfs/shell/setup.py | ||||||
|  |     cmd2 | ||||||
|  |     colorama | ||||||
|  |   ]); | ||||||
|  |   inherit (ceph-python-env.python) sitePackages; | ||||||
|  | 
 | ||||||
|  |   version = "18.2.0"; | ||||||
|  |   src = fetchurl { | ||||||
|  |     url = "https://download.ceph.com/tarballs/ceph-${version}.tar.gz"; | ||||||
|  |     hash = "sha256:0k9nl6xi5brva51rr14m7ig27mmmd7vrpchcmqc40q3c2khn6ns9"; | ||||||
|  |   }; | ||||||
|  | in rec { | ||||||
|  |   ceph = stdenv.mkDerivation { | ||||||
|  |     pname = "ceph"; | ||||||
|  |     inherit src version; | ||||||
|  | 
 | ||||||
|  |     nativeBuildInputs = [ | ||||||
|  |       cmake | ||||||
|  |       fmt | ||||||
|  |       git | ||||||
|  |       makeWrapper | ||||||
|  |       nasm | ||||||
|  |       pkg-config | ||||||
|  |       python | ||||||
|  |       python.pkgs.python # for the toPythonPath function | ||||||
|  |       python.pkgs.wrapPython | ||||||
|  |       which | ||||||
|  |       (ensureNewerSourcesHook { year = "1980"; }) | ||||||
|  |       # for building docs/man-pages presumably | ||||||
|  |       doxygen | ||||||
|  |       graphviz | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     enableParallelBuilding = true; | ||||||
|  | 
 | ||||||
|  |     buildInputs = cryptoLibsMap.${cryptoStr} ++ [ | ||||||
|  |       arrow-cpp | ||||||
|  |       babeltrace | ||||||
|  |       boost | ||||||
|  |       bzip2 | ||||||
|  |       ceph-python-env | ||||||
|  |       cryptsetup | ||||||
|  |       cunit | ||||||
|  |       gperf | ||||||
|  |       gtest | ||||||
|  |       icu | ||||||
|  |       libcap | ||||||
|  |       libnl | ||||||
|  |       libxml2 | ||||||
|  |       lttng-ust | ||||||
|  |       lua | ||||||
|  |       lz4 | ||||||
|  |       malloc | ||||||
|  |       oath-toolkit | ||||||
|  |       openldap | ||||||
|  |       optLibatomic_ops | ||||||
|  |       optLibs3 | ||||||
|  |       optYasm | ||||||
|  |       rdkafka | ||||||
|  |       rocksdb' | ||||||
|  |       snappy | ||||||
|  |       sqlite | ||||||
|  |       utf8proc | ||||||
|  |       zlib | ||||||
|  |       zstd | ||||||
|  |     ] ++ lib.optionals stdenv.isLinux [ | ||||||
|  |       keyutils | ||||||
|  |       libcap_ng | ||||||
|  |       liburing | ||||||
|  |       libuuid | ||||||
|  |       linuxHeaders | ||||||
|  |       optLibaio | ||||||
|  |       optLibxfs | ||||||
|  |       optZfs | ||||||
|  |       rabbitmq-c | ||||||
|  |       rdma-core | ||||||
|  |       udev | ||||||
|  |       util-linux | ||||||
|  |     ] ++ lib.optionals hasRadosgw [ | ||||||
|  |       optCurl | ||||||
|  |       optExpat | ||||||
|  |       optFuse | ||||||
|  |       optLibedit | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     pythonPath = [ ceph-python-env "${placeholder "out"}/${ceph-python-env.sitePackages}" ]; | ||||||
|  | 
 | ||||||
|  |     preConfigure ='' | ||||||
|  |       substituteInPlace src/common/module.c --replace "/sbin/modinfo"  "modinfo" | ||||||
|  |       substituteInPlace src/common/module.c --replace "/sbin/modprobe" "modprobe" | ||||||
|  |       substituteInPlace src/common/module.c --replace "/bin/grep" "grep" | ||||||
|  | 
 | ||||||
|  |       # install target needs to be in PYTHONPATH for "*.pth support" check to succeed | ||||||
|  |       # set PYTHONPATH, so the build system doesn't silently skip installing ceph-volume and others | ||||||
|  |       export PYTHONPATH=${ceph-python-env}/${sitePackages}:$lib/${sitePackages}:$out/${sitePackages} | ||||||
|  |       patchShebangs src/ | ||||||
|  |     ''; | ||||||
|  | 
 | ||||||
|  |     cmakeFlags = [ | ||||||
|  |       "-DCMAKE_INSTALL_DATADIR=${placeholder "lib"}/lib" | ||||||
|  | 
 | ||||||
|  |       "-DWITH_CEPHFS_SHELL:BOOL=ON" | ||||||
|  |       "-DWITH_SYSTEMD:BOOL=OFF" | ||||||
|  |       # `WITH_JAEGER` requires `thrift` as a depenedncy (fine), but the build fails with: | ||||||
|  |       #     CMake Error at src/opentelemetry-cpp-stamp/opentelemetry-cpp-build-Release.cmake:49 (message): | ||||||
|  |       #     Command failed: 2 | ||||||
|  |       # | ||||||
|  |       #        'make' 'opentelemetry_trace' 'opentelemetry_exporter_jaeger_trace' | ||||||
|  |       # | ||||||
|  |       #     See also | ||||||
|  |       # | ||||||
|  |       #        /build/ceph-18.2.0/build/src/opentelemetry-cpp/src/opentelemetry-cpp-stamp/opentelemetry-cpp-build-*.log | ||||||
|  |       # and that file contains: | ||||||
|  |       #     /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()': | ||||||
|  |       #     /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'? | ||||||
|  |       #       71 |     ::THRIFT_CLOSESOCKET(socket_); | ||||||
|  |       #          |       ^~~~~~~~~~~~~~~~~~ | ||||||
|  |       # Looks like `close()` is somehow not included. | ||||||
|  |       # But the relevant code is already removed in `open-telemetry` 1.10: https://github.com/open-telemetry/opentelemetry-cpp/pull/2031 | ||||||
|  |       # So it's proably not worth trying to fix that for this Ceph version, | ||||||
|  |       # and instead just disable Ceph's Jaeger support. | ||||||
|  |       "-DWITH_JAEGER:BOOL=OFF" | ||||||
|  |       "-DWITH_TESTS:BOOL=OFF" | ||||||
|  | 
 | ||||||
|  |       # Use our own libraries, where possible | ||||||
|  |       "-DWITH_SYSTEM_ARROW:BOOL=ON" # Only used if other options enable Arrow support. | ||||||
|  |       "-DWITH_SYSTEM_BOOST:BOOL=ON" | ||||||
|  |       "-DWITH_SYSTEM_GTEST:BOOL=ON" | ||||||
|  |       "-DWITH_SYSTEM_ROCKSDB:BOOL=ON" | ||||||
|  |       "-DWITH_SYSTEM_UTF8PROC:BOOL=ON" | ||||||
|  |       "-DWITH_SYSTEM_ZSTD:BOOL=ON" | ||||||
|  | 
 | ||||||
|  |       # TODO breaks with sandbox, tries to download stuff with npm | ||||||
|  |       "-DWITH_MGR_DASHBOARD_FRONTEND:BOOL=OFF" | ||||||
|  |       # WITH_XFS has been set default ON from Ceph 16, keeping it optional in nixpkgs for now | ||||||
|  |       ''-DWITH_XFS=${if optLibxfs != null then "ON" else "OFF"}'' | ||||||
|  |     ] ++ lib.optional stdenv.isLinux "-DWITH_SYSTEM_LIBURING=ON"; | ||||||
|  | 
 | ||||||
|  |     postFixup = '' | ||||||
|  |       wrapPythonPrograms | ||||||
|  |       wrapProgram $out/bin/ceph-mgr --prefix PYTHONPATH ":" "$(toPythonPath ${placeholder "out"}):$(toPythonPath ${ceph-python-env})" | ||||||
|  | 
 | ||||||
|  |       # Test that ceph-volume exists since the build system has a tendency to | ||||||
|  |       # silently drop it with misconfigurations. | ||||||
|  |       test -f $out/bin/ceph-volume | ||||||
|  |     ''; | ||||||
|  | 
 | ||||||
|  |     outputs = [ "out" "lib" "dev" "doc" "man" ]; | ||||||
|  | 
 | ||||||
|  |     doCheck = false; # uses pip to install things from the internet | ||||||
|  | 
 | ||||||
|  |     # Takes 7+h to build with 2 cores. | ||||||
|  |     requiredSystemFeatures = [ "big-parallel" ]; | ||||||
|  | 
 | ||||||
|  |     meta = getMeta "Distributed storage system"; | ||||||
|  | 
 | ||||||
|  |     passthru = { | ||||||
|  |       inherit version; | ||||||
|  |       tests = { | ||||||
|  |         inherit (nixosTests) | ||||||
|  |           ceph-multi-node | ||||||
|  |           ceph-single-node | ||||||
|  |           ceph-single-node-bluestore; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   ceph-client = runCommand "ceph-client-${version}" { | ||||||
|  |       meta = getMeta "Tools needed to mount Ceph's RADOS Block Devices/Cephfs"; | ||||||
|  |     } '' | ||||||
|  |       mkdir -p $out/{bin,etc,${sitePackages},share/bash-completion/completions} | ||||||
|  |       cp -r ${ceph}/bin/{ceph,.ceph-wrapped,rados,rbd,rbdmap} $out/bin | ||||||
|  |       cp -r ${ceph}/bin/ceph-{authtool,conf,dencoder,rbdnamer,syn} $out/bin | ||||||
|  |       cp -r ${ceph}/bin/rbd-replay* $out/bin | ||||||
|  |       cp -r ${ceph}/sbin/mount.ceph $out/bin | ||||||
|  |       cp -r ${ceph}/sbin/mount.fuse.ceph $out/bin | ||||||
|  |       ln -s bin $out/sbin | ||||||
|  |       cp -r ${ceph}/${sitePackages}/* $out/${sitePackages} | ||||||
|  |       cp -r ${ceph}/etc/bash_completion.d $out/share/bash-completion/completions | ||||||
|  |       # wrapPythonPrograms modifies .ceph-wrapped, so lets just update its paths | ||||||
|  |       substituteInPlace $out/bin/ceph          --replace ${ceph} $out | ||||||
|  |       substituteInPlace $out/bin/.ceph-wrapped --replace ${ceph} $out | ||||||
|  |    ''; | ||||||
|  | } | ||||||
| @ -25,4 +25,11 @@ final: prev: | |||||||
|       ]; |       ]; | ||||||
|     }); |     }); | ||||||
|   }); |   }); | ||||||
|  | 
 | ||||||
|  |   # Update ceph to 18.2.0 until it lands in nixpkgs, see: | ||||||
|  |   # https://github.com/NixOS/nixpkgs/pull/247849 | ||||||
|  |   inherit (prev.callPackage ./ceph.nix { | ||||||
|  |     lua = prev.lua5_4; | ||||||
|  |     fmt = prev.fmt_8; | ||||||
|  |   }) ceph ceph-client; | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user