nixosTest: remove hostname limitations

This commit is contained in:
Alyssa Ross 2023-04-25 08:48:47 +00:00
parent 6d69171610
commit d6e84a4574
No known key found for this signature in database
GPG key ID: F9DBED4859B271C0
3 changed files with 22 additions and 21 deletions

View file

@ -130,6 +130,11 @@ starting them in parallel:
start_all() start_all()
``` ```
If the hostname of a node contains characters that can't be used in a
Python variable name, those characters will be replaced with
underscores in the variable name, so `nodes.machine-a` will be exposed
to Python as `machine_a`.
## Machine objects {#ssec-machine-objects} ## Machine objects {#ssec-machine-objects}
The following methods are available on machine objects: The following methods are available on machine objects:

View file

@ -2,6 +2,7 @@ from contextlib import contextmanager
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Iterator, List, Union, Optional, Callable, ContextManager from typing import Any, Dict, Iterator, List, Union, Optional, Callable, ContextManager
import os import os
import re
import tempfile import tempfile
from test_driver.logger import rootlog from test_driver.logger import rootlog
@ -28,6 +29,10 @@ def get_tmp_dir() -> Path:
return tmp_dir return tmp_dir
def pythonize_name(name: str) -> str:
return re.sub(r"^[^A-z_]|[^A-z0-9_]", "_", name)
class Driver: class Driver:
"""A handle to the driver that sets up the environment """A handle to the driver that sets up the environment
and runs the tests""" and runs the tests"""
@ -113,7 +118,7 @@ class Driver:
polling_condition=self.polling_condition, polling_condition=self.polling_condition,
Machine=Machine, # for typing Machine=Machine, # for typing
) )
machine_symbols = {m.name: m for m in self.machines} machine_symbols = {pythonize_name(m.name): m for m in self.machines}
# If there's exactly one machine, make it available under the name # If there's exactly one machine, make it available under the name
# "machine", even if it's not called that. # "machine", even if it's not called that.
if len(self.machines) == 1: if len(self.machines) == 1:

View file

@ -21,29 +21,20 @@ let
in in
nodesList ++ lib.optional (lib.length nodesList == 1 && !lib.elem "machine" nodesList) "machine"; nodesList ++ lib.optional (lib.length nodesList == 1 && !lib.elem "machine" nodesList) "machine";
# TODO: This is an implementation error and needs fixing pythonizeName = name:
# the testing famework cannot legitimately restrict hostnames further let
# beyond RFC1035 head = lib.substring 0 1 name;
invalidNodeNames = lib.filter tail = lib.substring 1 (-1) name;
(node: builtins.match "^[A-z_]([A-z0-9_]+)?$" node == null) in
nodeHostNames; (if builtins.match "[A-z_]" head == null then "_" else head) +
lib.stringAsChars (c: if builtins.match "[A-z0-9_]" c == null then "_" else c) tail;
uniqueVlans = lib.unique (builtins.concatLists vlans); uniqueVlans = lib.unique (builtins.concatLists vlans);
vlanNames = map (i: "vlan${toString i}: VLan;") uniqueVlans; vlanNames = map (i: "vlan${toString i}: VLan;") uniqueVlans;
machineNames = map (name: "${name}: Machine;") nodeHostNames; pythonizedNames = map pythonizeName nodeHostNames;
machineNames = map (name: "${name}: Machine;") pythonizedNames;
withChecks = withChecks = lib.warnIf config.skipLint "Linting is disabled";
if lib.length invalidNodeNames > 0 then
throw ''
Cannot create machines out of (${lib.concatStringsSep ", " invalidNodeNames})!
All machines are referenced as python variables in the testing framework which will break the
script when special characters are used.
This is an IMPLEMENTATION ERROR and needs to be fixed. Meanwhile,
please stick to alphanumeric chars and underscores as separation.
''
else
lib.warnIf config.skipLint "Linting is disabled";
driver = driver =
hostPkgs.runCommand "nixos-test-driver-${config.name}" hostPkgs.runCommand "nixos-test-driver-${config.name}"
@ -87,7 +78,7 @@ let
${testDriver}/bin/generate-driver-symbols ${testDriver}/bin/generate-driver-symbols
${lib.optionalString (!config.skipLint) '' ${lib.optionalString (!config.skipLint) ''
PYFLAKES_BUILTINS="$( PYFLAKES_BUILTINS="$(
echo -n ${lib.escapeShellArg (lib.concatStringsSep "," nodeHostNames)}, echo -n ${lib.escapeShellArg (lib.concatStringsSep "," pythonizedNames)},
< ${lib.escapeShellArg "driver-symbols"} < ${lib.escapeShellArg "driver-symbols"}
)" ${hostPkgs.python3Packages.pyflakes}/bin/pyflakes $out/test-script )" ${hostPkgs.python3Packages.pyflakes}/bin/pyflakes $out/test-script
''} ''}