summaryrefslogtreecommitdiff
path: root/gnu/tests/docker.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/tests/docker.scm')
-rw-r--r--gnu/tests/docker.scm118
1 files changed, 117 insertions, 1 deletions
diff --git a/gnu/tests/docker.scm b/gnu/tests/docker.scm
index 25e172efae3..3cd3a278840 100644
--- a/gnu/tests/docker.scm
+++ b/gnu/tests/docker.scm
@@ -1,5 +1,6 @@
1;;; GNU Guix --- Functional package management for GNU 1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2019 Danny Milosavljevic <dannym@scratchpost.org> 2;;; Copyright © 2019 Danny Milosavljevic <dannym@scratchpost.org>
3;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
3;;; 4;;;
4;;; This file is part of GNU Guix. 5;;; This file is part of GNU Guix.
5;;; 6;;;
@@ -28,6 +29,7 @@
28 #:use-module (gnu services desktop) 29 #:use-module (gnu services desktop)
29 #:use-module (gnu packages bootstrap) ; %bootstrap-guile 30 #:use-module (gnu packages bootstrap) ; %bootstrap-guile
30 #:use-module (gnu packages docker) 31 #:use-module (gnu packages docker)
32 #:use-module (gnu packages guile)
31 #:use-module (guix gexp) 33 #:use-module (guix gexp)
32 #:use-module (guix grafts) 34 #:use-module (guix grafts)
33 #:use-module (guix monads) 35 #:use-module (guix monads)
@@ -38,7 +40,8 @@
38 #:use-module (guix tests) 40 #:use-module (guix tests)
39 #:use-module (guix build-system trivial) 41 #:use-module (guix build-system trivial)
40 #:use-module ((guix licenses) #:prefix license:) 42 #:use-module ((guix licenses) #:prefix license:)
41 #:export (%test-docker)) 43 #:export (%test-docker
44 %test-docker-system))
42 45
43(define %docker-os 46(define %docker-os
44 (simple-operating-system 47 (simple-operating-system
@@ -166,3 +169,116 @@ standard output device and then enters a new line.")
166 (name "docker") 169 (name "docker")
167 (description "Test Docker container of Guix.") 170 (description "Test Docker container of Guix.")
168 (value (build-tarball&run-docker-test)))) 171 (value (build-tarball&run-docker-test))))
172
173
174(define (run-docker-system-test tarball)
175 "Load DOCKER-TARBALL as Docker image and run it in a Docker container,
176inside %DOCKER-OS."
177 (define os
178 (marionette-operating-system
179 %docker-os
180 #:imported-modules '((gnu services herd)
181 (guix combinators))))
182
183 (define vm
184 (virtual-machine
185 (operating-system os)
186 ;; FIXME: Because we're using the volatile-root setup where the root file
187 ;; system is a tmpfs overlaid over a small root file system, 'docker
188 ;; load' must be able to store the whole image into memory, hence the
189 ;; huge memory requirements. We should avoid the volatile-root setup
190 ;; instead.
191 (memory-size 3000)
192 (port-forwardings '())))
193
194 (define test
195 (with-imported-modules '((gnu build marionette)
196 (guix build utils))
197 #~(begin
198 (use-modules (srfi srfi-11) (srfi srfi-64)
199 (gnu build marionette)
200 (guix build utils))
201
202 (define marionette
203 (make-marionette (list #$vm)))
204
205 (mkdir #$output)
206 (chdir #$output)
207
208 (test-begin "docker")
209
210 (test-assert "service running"
211 (marionette-eval
212 '(begin
213 (use-modules (gnu services herd))
214 (match (start-service 'dockerd)
215 (#f #f)
216 (('service response-parts ...)
217 (match (assq-ref response-parts 'running)
218 ((pid) (number? pid))))))
219 marionette))
220
221 (test-assert "load system image and run it"
222 (marionette-eval
223 `(begin
224 (define (slurp command . args)
225 ;; Return the output from COMMAND.
226 (let* ((port (apply open-pipe* OPEN_READ command args))
227 (output (read-line port))
228 (status (close-pipe port)))
229 output))
230
231 (define (docker-cli command . args)
232 ;; Run the given Docker COMMAND.
233 (apply invoke #$(file-append docker-cli "/bin/docker")
234 command args))
235
236 (define (wait-for-container-file container file)
237 ;; Wait for FILE to show up in CONTAINER.
238 (docker-cli "exec" container
239 #$(file-append guile-2.2 "/bin/guile")
240 "-c"
241 (object->string
242 `(let loop ((n 15))
243 (when (zero? n)
244 (error "file didn't show up" ,file))
245 (unless (file-exists? ,file)
246 (sleep 1)
247 (loop (- n 1)))))))
248
249 (let* ((line (slurp #$(file-append docker-cli "/bin/docker")
250 "load" "-i" #$tarball))
251 (repository&tag (string-drop line
252 (string-length
253 "Loaded image: ")))
254 (container (slurp
255 #$(file-append docker-cli "/bin/docker")
256 "create" repository&tag)))
257 (docker-cli "start" container)
258
259 ;; Wait for shepherd to be ready.
260 (wait-for-container-file container
261 "/var/run/shepherd/socket")
262
263 (docker-cli "exec" container
264 "/run/current-system/profile/bin/herd"
265 "status")
266 (slurp #$(file-append docker-cli "/bin/docker")
267 "exec" container
268 "/run/current-system/profile/bin/herd"
269 "status" "guix-daemon")))
270 marionette))
271
272 (test-end)
273 (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
274
275 (gexp->derivation "docker-system-test" test))
276
277(define %test-docker-system
278 (system-test
279 (name "docker-system")
280 (description "Run a system image as produced by @command{guix system
281docker-image} inside Docker.")
282 (value (with-monad %store-monad
283 (>>= (system-docker-image (simple-operating-system))
284 run-docker-system-test)))))