gnu: Use invoke and return #t from all builders.
[jackhill/guix/guix.git] / gnu / packages / storage.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2017, 2018 Marius Bakke <mbakke@fastmail.com>
3 ;;; Copyright © 2017 Rutger Helling <rhelling@mykolab.com>
4 ;;;
5 ;;; This file is part of GNU Guix.
6 ;;;
7 ;;; GNU Guix is free software; you can redistribute it and/or modify it
8 ;;; under the terms of the GNU General Public License as published by
9 ;;; the Free Software Foundation; either version 3 of the License, or (at
10 ;;; your option) any later version.
11 ;;;
12 ;;; GNU Guix is distributed in the hope that it will be useful, but
13 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ;;; GNU General Public License for more details.
16 ;;;
17 ;;; You should have received a copy of the GNU General Public License
18 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
19
20 (define-module (gnu packages storage)
21 #:use-module (guix download)
22 #:use-module ((guix licenses) #:prefix license:)
23 #:use-module (guix packages)
24 #:use-module (guix utils)
25 #:use-module (guix build-system cmake)
26 #:use-module (gnu packages)
27 #:use-module (gnu packages admin)
28 #:use-module (gnu packages assembly)
29 #:use-module (gnu packages bdw-gc)
30 #:use-module (gnu packages boost)
31 #:use-module (gnu packages check)
32 #:use-module (gnu packages cmake)
33 #:use-module (gnu packages compression)
34 #:use-module (gnu packages crypto)
35 #:use-module (gnu packages cryptsetup)
36 #:use-module (gnu packages curl)
37 #:use-module (gnu packages databases)
38 #:use-module (gnu packages disk)
39 #:use-module (gnu packages gnuzilla)
40 #:use-module (gnu packages gperf)
41 #:use-module (gnu packages jemalloc)
42 #:use-module (gnu packages linux)
43 #:use-module (gnu packages lua)
44 #:use-module (gnu packages openldap)
45 #:use-module (gnu packages perl)
46 #:use-module (gnu packages pkg-config)
47 #:use-module (gnu packages python)
48 #:use-module (gnu packages tls)
49 #:use-module (gnu packages web)
50 #:use-module (gnu packages xml))
51
52 (define-public ceph
53 (package
54 (name "ceph")
55 (version "12.2.4")
56 (source (origin
57 (method url-fetch)
58 (uri (string-append "https://download.ceph.com/tarballs/ceph-"
59 version ".tar.gz"))
60 (sha256
61 (base32
62 "13hv8scaxc1gdvrhzbfnsk4yy3pla6n1i4j4j4zf7schmbf0j8mp"))
63 (patches
64 (search-patches "ceph-skip-unittest_blockdev.patch"
65 "ceph-skip-collect-sys-info-test.patch"
66 "ceph-rocksdb-compat.patch"
67 "ceph-disable-cpu-optimizations.patch"))
68 (modules '((guix build utils)))
69 (snippet
70 '(begin
71 (for-each delete-file-recursively
72 '(;; TODO: Unbundle these:
73 ;"src/isa-l"
74 ;"src/lua"
75 ;"src/googletest"
76 ;"src/xxHash"
77 ;"src/zstd"
78 ;"src/civetweb"
79 "src/test/downloads"
80 "src/dpdk"
81 "src/spdk"
82 "src/rocksdb"
83 "src/boost"))
84 #t))))
85 (build-system cmake-build-system)
86 (arguments
87 `(#:configure-flags
88 (let* ((out (assoc-ref %outputs "out"))
89 (lib (assoc-ref %outputs "lib"))
90 (libdir (string-append lib "/lib")))
91 (list (string-append "-DCMAKE_INSTALL_PREFIX=" out)
92 (string-append "-DCMAKE_INSTALL_LIBDIR=" libdir)
93 ;; We need both libdir and libdir/ceph in RUNPATH.
94 (string-append "-DCMAKE_INSTALL_RPATH="
95 libdir ";" libdir "/ceph")
96 (string-append "-DCMAKE_INSTALL_SYSCONFDIR=" out "/etc")
97 (string-append "-DCMAKE_INSTALL_MANDIR=" out "/share/man")
98 (string-append "-DCMAKE_INSTALL_DOCDIR=" out "/share/ceph/doc")
99 (string-append "-DCMAKE_INSTALL_LIBEXECDIR=" out "/libexec")
100 (string-append "-DKEYUTILS_INCLUDE_DIR="
101 (assoc-ref %build-inputs "keyutils") "/include")
102 "-DCMAKE_INSTALL_LOCALSTATEDIR=/var"
103 "-DENABLE_SHARED=ON"
104 "-DWITH_EMBEDDED=OFF"
105 "-DWITH_SYSTEM_ROCKSDB=ON"
106 "-DWITH_SYSTEM_BOOST=ON"
107 "-DWITH_PYTHON3=ON"
108 ;; TODO: Enable these when available in Guix.
109 "-DWITH_BABELTRACE=OFF"
110 "-DWITH_LTTNG=OFF"
111 "-DWITH_XFS=OFF"
112 "-DWITH_XIO=OFF"
113 ;; Use jemalloc instead of tcmalloc.
114 "-DALLOCATOR=jemalloc"))
115 ;; FIXME: Some of the tests leak Btrfs subvolumes on Btrfs. See
116 ;; <https://bugs.gnu.org/29674> for details. Disable tests until
117 ;; resolved.
118 #:tests? #f
119 #:cmake ,cmake-3.11
120 #:phases
121 (modify-phases %standard-phases
122 (add-after 'unpack 'patch-source
123 (lambda* (#:key outputs #:allow-other-keys)
124 (let ((out (assoc-ref outputs "out"))
125 (lib (assoc-ref outputs "lib")))
126
127 ;; Make header files follow the dynamic libraries.
128 (substitute* "src/include/CMakeLists.txt"
129 (("DESTINATION include")
130 (string-append "DESTINATION " lib "/include")))
131
132 (substitute* "cmake/modules/Distutils.cmake"
133 ;; Prevent creation of Python eggs.
134 (("setup.py install")
135 "setup.py install --single-version-externally-managed --root=/"))
136
137 (substitute* (find-files "src/pybind" "^setup\\.py$")
138 ;; Here we inject an extra line to the `setup.py' of the
139 ;; Python C libraries so RUNPATH gets set up correctly.
140 (("^([[:blank:]]+)extra_compile_args=(.*)$" _ indent args)
141 (string-append indent "extra_compile_args=" args
142 indent "extra_link_args=['-Wl,-rpath="
143 lib "/lib'],\n")))
144
145 (substitute* "src/ceph-disk/tox.ini"
146 ;; Disable flake8 test since it complains about too long lines.
147 (("envlist = flake8,py27") "envlist = py27"))
148
149 (substitute* "src/ceph-detect-init/tox.ini"
150 ;; Disable python3 tests until we at least get py2 working.
151 (("envlist = pep8,py27,py3") "envlist = pep8,py27"))
152
153 (substitute* "src/key_value_store/kv_flat_btree_async.cc"
154 (("/usr/include/") ""))
155
156 (substitute* "src/test/test_subprocess.cc"
157 (("/bin/sh") (which "sh")))
158 (substitute* "qa/standalone/special/ceph_objectstore_tool.py"
159 (("/bin/rm") (which "rm")))
160 (substitute* "src/ceph-disk/ceph_disk/main.py"
161 (("/bin/mount") "mount")
162 (("/bin/umount") "umount")
163 (("/sbin/blkid") (which "blkid"))
164 (("'cryptsetup'") (string-append "'" (which "cryptsetup") "'"))
165 (("'sgdisk'") (string-append "'" (which "sgdisk") "'"))
166 (("'parted'") (string-append "'" (which "parted") "'"))
167 (("'udevadm'") (string-append "'" (which "udevadm") "'")))
168
169 (substitute* "udev/50-rbd.rules"
170 (("/usr/bin/ceph-rbdnamer")
171 (string-append out "/bin/ceph-rbdnamer")))
172 (substitute* "udev/60-ceph-by-parttypeuuid.rules"
173 (("/sbin/blkid") (which "blkid")))
174 (substitute* "udev/95-ceph-osd.rules"
175 (("/usr/sbin/ceph-disk")
176 (string-append out "/bin/ceph-disk")))
177
178 (substitute* "src/test/run-cli-tests"
179 ;; Use our python-cram instead of the (un)bundled one.
180 (("CRAM_BIN=.*$")
181 (string-append "CRAM_BIN=" (which "cram") "\n")))
182
183 ;; Disable tests that are known to fail.
184 ;; TODO: The majority of these fail because
185 ;; 'qa/workunits/ceph-helpers.sh' expects to find
186 ;; /tmp/ceph-disk-virtualenv/bin/ceph-disk, but somehow
187 ;; src/ceph-disk/CMakeLists.txt fails to create it.
188 (substitute* "src/test/CMakeLists.txt"
189 ;; FIXME: "create cannot load compressor of type zlib"
190 ;; "libceph_zlib.so: undefined symbol: isal_deflate"
191 (("^add_subdirectory\\(compressor\\)") "")
192 ;; FIXME: These tests fails because `ceph-disk'
193 ;; is not available.
194 (("^add_ceph_test\\(test-ceph-helpers\\.sh.*$") "\n")
195 (("^add_ceph_test\\(test_pidfile\\.sh.*$") "\n")
196 ;; XXX Why does this fail.
197 (("^add_ceph_test\\(cephtool-test-mon\\.sh.*$") "\n")
198 ;; This fails due to missing '/etc/fstab'.
199 (("^add_ceph_test\\(cephtool-test-rados\\.sh.*$") "\n")
200 ;; `Bad messages to stderr: OSD has the store locked'
201 (("^add_ceph_test\\(ceph_objectstore_tool\\.py.*$") "\n")
202 ;; The bundled python-cram fork needs patching to work on
203 ;; guix, and the system version does not support --error-dir.
204 ;; https://bitbucket.org/brodie/cram/issues/9
205 (("^add_ceph_test\\(run-cli-tests.*$") "\n")
206 ;; FIXME: tox/virtualenv/pip does not discover the
207 ;; required packages and tries to go online.
208 (("^add_test\\(NAME run-tox-ceph-disk.*$") "\n")
209 (("^add_test\\(NAME run-tox-ceph-detect-init.*$") "\n")
210 ;; Also remove from the set_property block.
211 (("run-tox-ceph-disk") "")
212 (("run-tox-ceph-detect-init") ""))
213 ;; TODO: This also seems to fail because of /etc/os-release.
214 ;; How to make src/common/util.cc behave without it.
215 (substitute* "src/test/crush/CMakeLists.txt"
216 (("^add_ceph_test\\(crush-classes\\.sh.*$") "\n"))
217 ;; More 'ceph-disk' issues here.. :-(
218 (substitute* "src/test/erasure-code/CMakeLists.txt"
219 (("^add_ceph_test\\(test-erasure-code-plugins\\.sh.*$") "\n")
220 (("^add_ceph_test\\(test-erasure-code\\.sh.*$") "\n")
221 (("^add_ceph_test\\(test-erasure-eio\\.sh.*$") "\n"))
222 (substitute* "src/test/libradosstriper/CMakeLists.txt"
223 (("^add_ceph_test\\(rados-striper\\.sh.*$") "\n"))
224 (substitute* "src/test/mon/CMakeLists.txt"
225 (("^add_ceph_test\\(osd-crush\\.sh.*$") "\n")
226 (("^add_ceph_test\\(test_pool_quota\\.sh.*$") "\n")
227 (("^add_ceph_test\\(osd-pool-create\\.sh.*$") "\n"))
228 (substitute* "src/test/osd/CMakeLists.txt"
229 (("^add_ceph_test\\(osd-bench\\.sh.*$") "\n")
230 (("^add_ceph_test\\(osd-config\\.sh.*$") "\n")
231 (("add_ceph_test\\(osd-dup\\.sh.*$") "\n")
232 (("^add_ceph_test\\(osd-markdown\\.sh.*$") "\n")
233 (("^add_ceph_test\\(osd-reactivate\\.sh.*$") "\n")
234 (("^add_ceph_test\\(osd-reuse-id\\.sh.*$") "\n")
235 (("^add_ceph_test\\(osd-scrub-repair\\.sh.*$") "\n")
236 (("^add_ceph_test\\(osd-scrub-snaps\\.sh.*$") "\n")
237 (("^add_ceph_test\\(osd-copy-from\\.sh.*$") "\n")
238 (("^add_ceph_test\\(osd-fast-mark-down\\.sh.*$") "\n"))
239 #t)))
240 (add-before 'check 'set-check-environment
241 (lambda _
242 ;; Run tests in parallel.
243 (setenv "CTEST_PARALLEL_LEVEL"
244 (number->string (parallel-job-count)))
245 ;; `pip' requires write access in $HOME.
246 (setenv "HOME" "/tmp")
247 #t))
248 (add-before 'install 'set-install-environment
249 (lambda* (#:key outputs #:allow-other-keys)
250 (let* ((out (assoc-ref outputs "out"))
251 (py2sitedir
252 (string-append out "/lib/python2.7/site-packages"))
253 (py3sitedir
254 (string-append out "/lib/python"
255 ,(version-major+minor
256 (package-version python))
257 "/site-packages")))
258 ;; The Python install scripts refuses to function if
259 ;; the install directory is not on PYTHONPATH.
260 (setenv "PYTHONPATH"
261 (string-append py2sitedir ":" py3sitedir ":"
262 (getenv "PYTHONPATH")))
263 #t)))
264 (add-after 'install 'wrap-python-scripts
265 (lambda* (#:key inputs outputs #:allow-other-keys)
266 (let* ((out (assoc-ref outputs "out"))
267 (ceph (string-append out "/bin/ceph"))
268 (ceph-disk (string-append out "/bin/ceph-disk"))
269 (ceph-detect-init (string-append
270 out "/bin/ceph-detect-init"))
271
272 (prettytable (assoc-ref inputs "python2-prettytable"))
273
274 (sitedir (lambda (package)
275 (string-append package
276 "/lib/python2.7/site-packages")))
277 (PYTHONPATH (string-append
278 (sitedir out) ":"
279 (sitedir prettytable))))
280 (for-each (lambda (executable)
281 (wrap-program executable
282 `("PYTHONPATH" ":" prefix (,PYTHONPATH))))
283 (list ceph ceph-disk ceph-detect-init))
284 #t))))))
285 (outputs
286 '("out" "lib"))
287 (native-inputs
288 `(("gperf" ,gperf)
289 ("pkg-config" ,pkg-config)
290 ("python-cython" ,python-cython)
291 ("python-sphinx" ,python-sphinx)
292 ("yasm" ,yasm)
293
294 ;; For tests.
295 ("inetutils" ,inetutils)
296 ("jq" ,jq)
297 ("perl" ,perl)
298 ("xmlstarlet" ,xmlstarlet)
299 ("python2-cram" ,python2-cram)
300 ("python2-virtualenv" ,python2-virtualenv)
301
302 ;; These dependencies are taken from test-requirements.txt
303 ;; of ceph-disk and ceph-detect-init. The latter can also
304 ;; test against python3, but let's try to get python2 tests
305 ;; working first since that is the default.
306 ("python2-configobj" ,python2-configobj)
307 ("python2-coverage" ,python2-coverage)
308 ("python2-discover" ,python2-discover)
309 ("python2-fixtures" ,python2-fixtures)
310 ("python2-flake8" ,python2-flake8)
311 ("python2-mock" ,python2-mock)
312 ("python2-nose" ,python2-nose)
313 ("python2-pip" ,python2-pip)
314 ("python2-pytest" ,python2-pytest)
315 ("python2-subunit" ,python2-subunit)
316 ("python2-testrepository" ,python2-testrepository)
317 ("python2-testtools" ,python2-testtools)
318 ("python2-tox" ,python2-tox)))
319 (inputs
320 `(("boost" ,boost)
321 ("curl" ,curl)
322 ("cryptsetup" ,cryptsetup)
323 ("expat" ,expat)
324 ("fcgi" ,fcgi)
325 ("fuse" ,fuse)
326 ("gptfdisk" ,gptfdisk)
327 ("jemalloc" ,jemalloc)
328 ("keyutils" ,keyutils)
329 ("leveldb" ,leveldb)
330 ("libaio" ,libaio)
331 ("libatomic-ops" ,libatomic-ops)
332 ("lua" ,lua)
333 ("lz4" ,lz4)
334 ("openldap" ,openldap)
335 ("openssl" ,openssl)
336 ("nss" ,nss)
337 ("parted" ,parted)
338 ("python@2" ,python-2)
339 ("python2-prettytable" ,python2-prettytable) ;used by ceph_daemon.py
340 ("python@3" ,python-3)
341 ("rocksdb" ,rocksdb)
342 ("snappy" ,snappy)
343 ("udev" ,eudev)
344 ("util-linux" ,util-linux)
345 ("zlib" ,zlib)))
346 (home-page "https://ceph.com/")
347 (synopsis "Distributed object store and file system")
348 (description
349 "Ceph is a distributed storage system designed for reliability and
350 performance. It provides network-based block devices (RBD), a POSIX
351 compliant file system (CephFS), and offers compatibility with various
352 storage protocols (S3, NFS, and others) through the RADOS gateway.")
353 ;; The Ceph libraries are LGPL2.1 and most of the utilities fall under
354 ;; GPL2. The installed erasure code plugins are BSD-3 licensed and do
355 ;; not use the GPL code. The source archive includes a number of files
356 ;; carrying other licenses; consult COPYING for more information. Note
357 ;; that COPYING does not cover third-party bundled software.
358 (license (list license:lgpl2.1 license:gpl2 ;some files are 'or later'
359 license:cc-by-sa3.0 ;documentation
360 license:bsd-3 ;isa-l,jerasure,++
361 license:expat)))) ;civetweb,java bindings