diff options
Diffstat (limited to 'gnu/tests/docker.scm')
| -rw-r--r-- | gnu/tests/docker.scm | 118 |
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, | ||
| 176 | inside %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 | ||
| 281 | docker-image} inside Docker.") | ||
| 282 | (value (with-monad %store-monad | ||
| 283 | (>>= (system-docker-image (simple-operating-system)) | ||
| 284 | run-docker-system-test))))) | ||
