diff options
Diffstat (limited to 'gnu/tests/nfs.scm')
-rw-r--r-- | gnu/tests/nfs.scm | 152 |
1 files changed, 151 insertions, 1 deletions
diff --git a/gnu/tests/nfs.scm b/gnu/tests/nfs.scm index 5e4de2783b..da729ddcc9 100644 --- a/gnu/tests/nfs.scm +++ b/gnu/tests/nfs.scm @@ -39,7 +39,8 @@ #:use-module (guix store) #:use-module (guix monads) #:export (%test-nfs - %test-nfs-server)) + %test-nfs-server + %test-nfs-root-fs)) (define %base-os (operating-system @@ -262,3 +263,152 @@ (description "Test that an NFS server can be started and exported directories can be mounted.") (value (run-nfs-server-test)))) + + +(define (run-nfs-root-fs-test) + "Run a test of an OS mounting its root file system via NFS." + (define nfs-root-server-os + (marionette-operating-system + (operating-system + (inherit %nfs-os) + (services + (modify-services (operating-system-user-services %nfs-os) + (nfs-service-type config => + (nfs-configuration + (debug '(nfs nfsd mountd)) + ;;; Note: Adding the following line causes Guix to hang. + ;(rpcmountd-port 20001) + ;;; Note: Adding the following line causes Guix to hang. + ;(rpcstatd-port 20002) ; FIXME: Set broadcast port AND listening port. + (nfsd-port 2049) + (nfs-versions '("4.2")) + (exports '(("/export" + "*(rw,insecure,no_subtree_check,crossmnt,fsid=root,no_root_squash,insecure,async)")))))))) + #:requirements '(nscd) + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define nfs-root-client-os + (marionette-operating-system + (operating-system + (inherit (simple-operating-system (service dhcp-client-service-type))) + (kernel-arguments '("ip=dhcp")) + (file-systems (cons + (file-system + (type "nfs") + (mount-point "/") + (device ":/export") + (options "addr=127.0.0.1,vers=4.2")) + %base-file-systems))) + #:requirements '(nscd) + #:imported-modules '((gnu services herd) + (guix combinators)))) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (gnu build marionette) + (srfi srfi-64)) + + (mkdir #$output) + (chdir #$output) + + (test-begin "start-nfs-boot-test") + + ;;; Start up NFS server host. + + (mkdir "/tmp/server") + (define server-marionette + (make-marionette (list #$(virtual-machine + nfs-root-server-os + ;(operating-system nfs-root-server-os) + ;(port-forwardings '( ; (111 . 111) + ; (2049 . 2049) + ; (20001 . 20001) + ; (20002 . 20002))) +)) + #:socket-directory "/tmp/server")) + + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (current-output-port + (open-file "/dev/console" "w0")) + ;; FIXME: Instead statfs "/" and "/export" and wait until they + ;; are different file systems. But Guile doesn't seem to have + ;; statfs. + (sleep 5) + (chmod "/export" #o777) + (symlink "/gnu" "/export/gnu") + (start-service 'nscd) + (start-service 'networking) + (start-service 'nfs)) + server-marionette) + + ;;; Wait for the NFS services to be up and running. + + (test-assert "nfs services are running" + (wait-for-file "/var/run/rpc.statd.pid" server-marionette)) + + (test-assert "NFS port is ready" + (wait-for-tcp-port 2049 server-marionette)) + + (test-assert "NFS statd port is ready" + (wait-for-tcp-port 20002 server-marionette)) + + (test-assert "NFS mountd port is ready" + (wait-for-tcp-port 20001 server-marionette)) + + ;;; FIXME: (test-assert "NFS portmapper port is ready" + ;;; FIXME: (wait-for-tcp-port 111 server-marionette)) + + ;;; Start up NFS client host. + + (define client-marionette + (make-marionette (list #$(virtual-machine + nfs-root-client-os + ;(port-forwardings '((111 . 111) + ; (2049 . 2049) + ; (20001 . 20001) + ; (20002 . 20002))) + )))) + + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (use-modules (rnrs io ports)) + + (current-output-port + (open-file "/dev/console" "w0")) + (let ((content (call-with-input-file "/proc/mounts" get-string-all))) + (call-with-output-file "/mounts.new" + (lambda (port) + (display content port)))) + (chmod "/mounts.new" #o777) + (rename-file "/mounts.new" "/mounts")) + client-marionette) + + (test-assert "nfs-root-client booted") + + ;;; Check whether NFS client host communicated with NFS server host. + + (test-assert "nfs client deposited file" + (wait-for-file "/export/mounts" server-marionette)) + (marionette-eval + '(begin + (current-output-port + (open-file "/dev/console" "w0")) + (call-with-input-file "/export/mounts" display)) + server-marionette) + + (test-end) + (exit (= (test-runner-fail-count (test-runner-current)) 0))))) + + (gexp->derivation "nfs-server-test" test)) + +(define %test-nfs-root-fs + (system-test + (name "nfs-root-fs") + (description "Test that an NFS server can be started and the exported +directory can be used as root filesystem.") + (value (run-nfs-root-fs-test)))) |