From 2c579da191a67f03c180546244a52b6cbf7043fd Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 21 Oct 2020 12:18:59 +0200 Subject: [PATCH] tox: use virio net driver --- packages/genodelabs/targets.nix | 5 ++- tests/test-driver/test-driver.py | 61 ++++++++++++++++++++++++++++++-- tests/tox-bootstrapd.dhall | 22 +++++++----- tests/tox-bootstrapd.nix | 33 +++++++++++------ 4 files changed, 98 insertions(+), 23 deletions(-) diff --git a/packages/genodelabs/targets.nix b/packages/genodelabs/targets.nix index e92780a..313bd62 100644 --- a/packages/genodelabs/targets.nix +++ b/packages/genodelabs/targets.nix @@ -1,4 +1,4 @@ -# This file contains overrides necesarry to build some Make and Depot targets. +# This file contains overrides necessary to build some Make and Depot targets. # Many targets can be built with the default attributes, and are not listed here. { buildPackages, ports }: @@ -91,6 +91,9 @@ in { vfs_lwip.portInputs = [ lwip ]; vfs_ttf.portInputs = [ libc stb ]; + virtdev_rom = { }; + virtio_nic_drv = { postInstall = "rm $out/*.xsd"; }; + wifi_drv.portInputs = [ dde_linux libc openssl ]; } diff --git a/tests/test-driver/test-driver.py b/tests/test-driver/test-driver.py index 45137fc..bcb9564 100644 --- a/tests/test-driver/test-driver.py +++ b/tests/test-driver/test-driver.py @@ -5,7 +5,10 @@ from contextlib import contextmanager, _GeneratorContextManager from queue import Queue, Empty from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List from xml.sax.saxutils import XMLGenerator +import queue +import io import _thread +import argparse import atexit import base64 import codecs @@ -21,6 +24,7 @@ import subprocess import sys import tempfile import time +import traceback import unicodedata CHAR_TO_KEY = { @@ -99,6 +103,33 @@ def make_command(args: list) -> str: return " ".join(map(shlex.quote, (map(str, args)))) +def create_vlan(vlan_nr: str) -> Tuple[str, str, "subprocess.Popen[bytes]", Any]: + global log + log.log("starting VDE switch for network {}".format(vlan_nr)) + vde_socket = tempfile.mkdtemp( + prefix="nixos-test-vde-", suffix="-vde{}.ctl".format(vlan_nr) + ) + pty_master, pty_slave = pty.openpty() + vde_process = subprocess.Popen( + ["vde_switch", "-s", vde_socket, "--dirmode", "0700"], + bufsize=1, + stdin=pty_slave, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=False, + ) + fd = os.fdopen(pty_master, "w") + fd.write("version\n") + # TODO: perl version checks if this can be read from + # an if not, dies. we could hang here forever. Fix it. + assert vde_process.stdout is not None + vde_process.stdout.readline() + if not os.path.exists(os.path.join(vde_socket, "ctl")): + raise Exception("cannot start vde_switch") + + return (vlan_nr, vde_socket, vde_process, fd) + + def retry(fn: Callable) -> None: """Call the given function repeatedly, with 1 second intervals, until it returns True or a timeout is reached. @@ -216,7 +247,15 @@ class Machine: net_backend = "-netdev user,id=net0" net_frontend = "-device virtio-net-pci,netdev=net0" - start_command = "qemu-system-x86_64 -m 384 $QEMU_OPTS " + if "netBackendArgs" in args: + net_backend += "," + args["netBackendArgs"] + + if "netFrontendArgs" in args: + net_frontend += "," + args["netFrontendArgs"] + + start_command = ( + "qemu-kvm -m 384 " + net_backend + " " + net_frontend + " $QEMU_OPTS " + ) if "hda" in args: hda_path = os.path.abspath(args["hda"]) @@ -886,10 +925,26 @@ def subtest(name: str) -> Iterator[None]: if __name__ == "__main__": + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument( + "-K", + "--keep-vm-state", + help="re-use a VM state coming from a previous run", + action="store_true", + ) + (cli_args, vm_scripts) = arg_parser.parse_known_args() + log = Logger() - vm_scripts = sys.argv[1:] - machines = [create_machine({"startCommand": s}) for s in vm_scripts] + vlan_nrs = list(dict.fromkeys(os.environ.get("VLANS", "").split())) + vde_sockets = [create_vlan(v) for v in vlan_nrs] + for nr, vde_socket, _, _ in vde_sockets: + os.environ["QEMU_VDE_SOCKET_{}".format(nr)] = vde_socket + + machines = [ + create_machine({"startCommand": s, "keepVmState": cli_args.keep_vm_state}) + for s in vm_scripts + ] machine_eval = [ "{0} = machines[{1}]".format(m.name, idx) for idx, m in enumerate(machines) ] diff --git a/tests/tox-bootstrapd.dhall b/tests/tox-bootstrapd.dhall index 194cbb1..b27eee6 100644 --- a/tests/tox-bootstrapd.dhall +++ b/tests/tox-bootstrapd.dhall @@ -42,15 +42,21 @@ let tox-bootstrap = , content = [ XML.text '' - + - - - - enable_motd = true - motd = "Genode Tox bootstrapd test" - - + + + + + + + + + + enable_motd = true + motd = "Genode Tox bootstrapd test" + + '' ] diff --git a/tests/tox-bootstrapd.nix b/tests/tox-bootstrapd.nix index 88effeb..10386f1 100644 --- a/tests/tox-bootstrapd.nix +++ b/tests/tox-bootstrapd.nix @@ -3,16 +3,27 @@ { name = "tox-bootstrapd"; constraints = builtins.any (spec: spec == "x86"); - machine = { - config = ./tox-bootstrapd.dhall; - inputs = (with pkgs; [ - acpi_drv - ipxe_nic_drv - libc-raise - platform_drv - posix - report_rom - vfs_lwip - ]) ++ (with legacyPackages; [ libtoxcore ]); + nodes = let + node = { + config = ./tox-bootstrapd.dhall; + inputs = (with pkgs; [ + acpi_drv + libc-raise + platform_drv + posix + report_rom + vfs_lwip + virtdev_rom + virtio_nic_drv + ]) ++ (with legacyPackages; [ libtoxcore ]); + }; + in { + alice = node; }; + + testScript = '' + start_all() + alice.wait_until_serial_output('child "init" exited with exit value 0') + ''; + }