From 113a6b9325b92d483e6c2f12c35c2887ab175a8d Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Mon, 17 Sep 2018 23:08:43 +0200 Subject: [PATCH] nixos/testing: disallow special chars in machine names in network expressions These names are referenced by Perl variables inside the testing frameworks which don't allow chars like `-` as character inside. An exemplary expression may look like this: ``` { x11-vm = { services.xserver.enable = true; }; } ``` This expression evaluates, e.g. when running `nixos-build-vms`, but when trying to run `./result/bin/nixos-run-vms`, an error like this occurs: ``` starting VDE switch for network 1 running the VM test script error: Can't modify subtraction (-) in scalar assignment at (eval 17) line 1, at EOF Bareword "test" not allowed while "strict subs" in use at (eval 17) line 1. Can't modify subtraction (-) in scalar assignment at (eval 17) line 1, at EOF Bareword "test" not allowed while "strict subs" in use at (eval 17) line 1. vde_switch: EOF on stdin, cleaning up and exiting cleaning up ``` This can be very confusing for beginners, this change breaks evaluation if such names are used for machines. --- nixos/lib/testing.nix | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/nixos/lib/testing.nix b/nixos/lib/testing.nix index 42a0c60c7e19..3fb691409a0d 100644 --- a/nixos/lib/testing.nix +++ b/nixos/lib/testing.nix @@ -149,9 +149,23 @@ in rec { test = passMeta (runTests driver); report = passMeta (releaseTools.gcovReport { coverageRuns = [ test ]; }); - in (if makeCoverageReport then report else test) // { - inherit nodes driver test; - }; + nodeNames = builtins.attrNames nodes; + invalidNodeNames = lib.filter + (node: builtins.match "^[A-z_][A-z0-9_]+$" node == null) nodeNames; + + in + if lib.length invalidNodeNames > 0 then + throw '' + Cannot create machines out of (${lib.concatStringsSep ", " invalidNodeNames})! + All machines are references as perl variables in the testing framework which will break the + script when special characters are allowed. + + Please stick to alphanumeric chars and underscores as separation. + '' + else + (if makeCoverageReport then report else test) // { + inherit nodes driver test; + }; runInMachine = { drv