tests: Add qemu-guest-agent system test.

Enable the QEMU guest agent interface in marionette VMs, run the
qemu-guest-agent service in one and try talking to it.

* gnu/build/marionette.scm (make-marionette): Enable the guest agent device.
* gnu/tests/virtualization.scm (run-qemu-guest-agent-test): New procedure.
(%test-qemu-guest-agent): New variable.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Timotej Lazar 2022-07-28 17:03:26 +02:00 committed by Ludovic Courtès
parent ee199cd3ba
commit fd74fe6325
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 88 additions and 1 deletions

View file

@ -105,11 +105,14 @@ (define extra-options
"-monitor" (string-append "unix:" socket-directory "/monitor")
"-chardev" (string-append "socket,id=repl,path=" socket-directory
"/repl")
"-chardev" (string-append "socket,id=qga,server=on,wait=off,path="
socket-directory "/qemu-ga")
;; See
;; <http://www.linux-kvm.org/page/VMchannel_Requirements#Invocation>.
"-device" "virtio-serial"
"-device" "virtserialport,chardev=repl,name=org.gnu.guix.port.0"))
"-device" "virtserialport,chardev=repl,name=org.gnu.guix.port.0"
"-device" "virtserialport,chardev=qga,name=org.qemu.guest_agent.0"))
(define (accept* port)
(match (select (list port) '() (list port) timeout)

View file

@ -37,6 +37,7 @@ (define-module (gnu tests virtualization)
#:use-module (guix records)
#:use-module (guix store)
#:export (%test-libvirt
%test-qemu-guest-agent
%test-childhurd))
@ -115,6 +116,89 @@ (define %test-libvirt
(description "Connect to the running LIBVIRT service.")
(value (run-libvirt-test))))
;;;
;;; QEMU Guest Agent service.
;;;
(define %qemu-guest-agent-os
(simple-operating-system
(service qemu-guest-agent-service-type)))
(define (run-qemu-guest-agent-test)
"Run tests in %QEMU-GUEST-AGENT-OS."
(define os
(marionette-operating-system
%qemu-guest-agent-os
#:imported-modules '((gnu services herd))))
(define vm
(virtual-machine
(operating-system os)
(port-forwardings '())))
(define test
(with-imported-modules '((gnu build marionette))
#~(begin
(use-modules (gnu build marionette)
(ice-9 rdelim)
(srfi srfi-64))
(define marionette
;; Ensure we look for the socket in the correct place below.
(make-marionette (list #$vm) #:socket-directory "/tmp"))
(define* (try-read port #:optional (attempts 10))
;; Try reading from a port several times before giving up.
(cond ((char-ready? port)
(let ((response (read-line port)))
(close-port port)
response))
((> attempts 1)
(sleep 1)
(try-read port (- attempts 1)))
(else "")))
(define (run command)
;; Run a QEMU guest agent command and return the response.
(let ((s (socket PF_UNIX SOCK_STREAM 0)))
(connect s AF_UNIX "/tmp/qemu-ga")
(display command s)
(try-read s)))
(test-runner-current (system-test-runner #$output))
(test-begin "qemu-guest-agent")
(test-assert "service running"
(marionette-eval
'(begin
(use-modules (gnu services herd))
(match (start-service 'qemu-guest-agent)
(#f #f)
(('service response-parts ...)
(match (assq-ref response-parts 'running)
((pid) (number? pid))))))
marionette))
(test-equal "ping guest"
"{\"return\": {}}"
(run "{\"execute\": \"guest-ping\"}"))
(test-assert "get network interfaces"
(string-contains
(run "{\"execute\": \"guest-network-get-interfaces\"}")
"127.0.0.1"))
(test-end))))
(gexp->derivation "qemu-guest-agent-test" test))
(define %test-qemu-guest-agent
(system-test
(name "qemu-guest-agent")
(description "Run commands in a virtual machine using QEMU guest agent.")
(value (run-qemu-guest-agent-test))))
;;;
;;; GNU/Hurd virtual machines, aka. childhurds.