Merge pull request #101598 from andir/nixos-build-vms-qemu

nixos/tests: follow-up to the closure reduction PR
This commit is contained in:
Andreas Rammhold 2020-10-26 14:19:45 +01:00 committed by GitHub
commit 1088f05940
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 146 additions and 125 deletions

View file

@ -7,9 +7,9 @@
# !!! See comment about args in lib/modules.nix
, specialArgs ? { }
# Modules to add to each VM
, extraConfigurations ? [] }:
, extraConfigurations ? [ ]
}:
with import ./build-vms.nix { inherit system pkgs minimal specialArgs extraConfigurations; };
with pkgs;
rec {
@ -17,9 +17,11 @@ rec {
inherit pkgs;
mkTestDriver = let
mkTestDriver =
let
testDriverScript = ./test-driver/test-driver.py;
in qemu_pkg: stdenv.mkDerivation {
in
qemu_pkg: stdenv.mkDerivation {
name = "nixos-test-driver";
nativeBuildInputs = [ makeWrapper ];
@ -51,9 +53,6 @@ rec {
'';
};
testDriver = mkTestDriver qemu_test;
testDriverInteractive = mkTestDriver qemu_kvm;
# Run an automated test suite in the given virtual network.
# `driver' is the script that runs the network.
runTests = driver:
@ -79,7 +78,6 @@ rec {
, skipLint ? false
, ...
} @ t:
let
# A standard store path to the vm monitor is built like this:
# /tmp/nix-build-vm-test-run-$name.drv-0/vm-state-machine/monitor
@ -88,25 +86,7 @@ rec {
maxTestNameLen = 50;
testNameLen = builtins.stringLength name;
testDriverName = with builtins;
if testNameLen > maxTestNameLen then
abort ("The name of the test '${name}' must not be longer than ${toString maxTestNameLen} " +
"it's currently ${toString testNameLen} characters long.")
else
"nixos-test-driver-${name}";
nodes = buildVirtualNetwork (
t.nodes or (if t ? machine then { machine = t.machine; } else { }));
testScript' =
# Call the test script with the computed nodes.
if lib.isFunction testScript
then testScript { inherit nodes; }
else testScript;
vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes);
vms = map (m: m.config.system.build.vm) (lib.attrValues nodes);
ocrProg = tesseract4.override { enableLanguages = [ "eng" ]; };
@ -115,15 +95,51 @@ rec {
# Generate convenience wrappers for running the test driver
# interactively with the specified network, and for starting the
# VMs from the command line.
driver = testDriver:
mkDriver = qemu_pkg:
let
build-vms = import ./build-vms.nix {
inherit system pkgs minimal specialArgs;
extraConfigurations = extraConfigurations ++ (pkgs.lib.optional (qemu_pkg != null)
{
virtualisation.qemu.package = qemu_pkg;
}
);
};
# FIXME: get this pkg from the module system
testDriver = mkTestDriver (if qemu_pkg == null then pkgs.qemu_test else qemu_pkg);
nodes = build-vms.buildVirtualNetwork (
t.nodes or (if t ? machine then { machine = t.machine; } else { })
);
vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes);
vms = map (m: m.config.system.build.vm) (lib.attrValues nodes);
testScript' =
# Call the test script with the computed nodes.
if lib.isFunction testScript
then testScript { inherit nodes; }
else testScript;
testDriverName = with builtins;
if testNameLen > maxTestNameLen then
abort
("The name of the test '${name}' must not be longer than ${toString maxTestNameLen} " +
"it's currently ${toString testNameLen} characters long.")
else
"nixos-test-driver-${name}";
warn = if skipLint then lib.warn "Linting is disabled!" else lib.id;
in
warn (runCommand testDriverName
{ buildInputs = [ makeWrapper];
{
buildInputs = [ makeWrapper ];
testScript = testScript';
preferLocalBuild = true;
testName = name;
passthru = {
inherit nodes;
};
}
''
mkdir -p $out/bin
@ -154,11 +170,15 @@ rec {
meta = (drv.meta or { }) // t.meta;
};
test = passMeta (runTests (driver testDriver));
driver = mkDriver null;
driverInteractive = mkDriver pkgs.qemu;
nodeNames = builtins.attrNames nodes;
test = passMeta (runTests driver);
nodeNames = builtins.attrNames driver.nodes;
invalidNodeNames = lib.filter
(node: builtins.match "^[A-z_]([A-z0-9_]+)?$" node == null) nodeNames;
(node: builtins.match "^[A-z_]([A-z0-9_]+)?$" node == null)
nodeNames;
in
if lib.length invalidNodeNames > 0 then
@ -171,9 +191,8 @@ rec {
''
else
test // {
inherit nodes test;
driver = driver testDriver;
driverInteractive = driver testDriverInteractive;
inherit test driver driverInteractive;
inherit (test) nodes;
};
runInMachine =
@ -181,12 +200,19 @@ rec {
, machine
, preBuild ? ""
, postBuild ? ""
, qemu ? pkgs.qemu_test
, ... # ???
}:
let
vm = buildVM { }
[ machine
{ key = "run-in-machine";
build-vms = import ./build-vms.nix {
inherit system pkgs minimal specialArgs extraConfigurations;
};
vm = build-vms.buildVM { }
[
machine
{
key = "run-in-machine";
networking.hostName = "client";
nix.readOnlyStore = false;
virtualisation.writableStore = false;
@ -229,7 +255,7 @@ rec {
unset xchg
export tests='${testScript}'
${testDriver}/bin/nixos-test-driver ${vm.config.system.build.vm}/bin/run-*-vm
${mkTestDriver qemu}/bin/nixos-test-driver --keep-vm-state ${vm.config.system.build.vm}/bin/run-*-vm
''; # */
in

View file

@ -6,12 +6,7 @@
let
nodes = builtins.mapAttrs (vm: module: {
_file = "${networkExpr}@node-${vm}";
imports = [
module
({ pkgs, ... }: {
virtualisation.qemu.package = pkgs.qemu;
})
];
imports = [ module ];
}) (import networkExpr);
in
@ -20,4 +15,4 @@ with import ../../../../lib/testing-python.nix {
pkgs = import ../../../../.. { inherit system config; };
};
(makeTest { inherit nodes; testScript = ""; }).driver
(makeTest { inherit nodes; testScript = ""; }).driverInteractive