diff options
author | Andrew Hoff <ahoff@anduril.com> | 2023-01-07 15:43:15 -0500 |
---|---|---|
committer | Andrew Hoff <ahoff@anduril.com> | 2023-01-22 12:20:40 -0500 |
commit | 6ae3e7695e27a4f7afb1d2017f5967d5e82f4c00 (patch) | |
tree | bc34c5eb552872cc71b946c06b240b1b1100d202 /nixos/lib | |
parent | 1c18d9a5fbb064e8b948b75b420e3c3d78d16935 (diff) |
nixos/virtualisation: add option for explicitly named network interfaces
Adds a new option to the virtualisation modules that enables specifying explicitly named network interfaces in QEMU VMs. The existing `virtualisation.vlans` is still supported for cases where the name of the network interface is irrelevant.
Diffstat (limited to 'nixos/lib')
-rw-r--r-- | nixos/lib/testing/driver.nix | 4 | ||||
-rw-r--r-- | nixos/lib/testing/network.nix | 41 |
2 files changed, 30 insertions, 15 deletions
diff --git a/nixos/lib/testing/driver.nix b/nixos/lib/testing/driver.nix index fb181c1d7e9ad..2c2ee179fede6 100644 --- a/nixos/lib/testing/driver.nix +++ b/nixos/lib/testing/driver.nix @@ -12,7 +12,9 @@ let }; - vlans = map (m: m.virtualisation.vlans) (lib.attrValues config.nodes); + vlans = map (m: ( + m.virtualisation.vlans ++ + (lib.mapAttrsToList (_: v: v.vlan) m.virtualisation.interfaces))) (lib.attrValues config.nodes); vms = map (m: m.system.build.vm) (lib.attrValues config.nodes); nodeHostNames = diff --git a/nixos/lib/testing/network.nix b/nixos/lib/testing/network.nix index 04ea9a2bc9f7a..98a77f918e079 100644 --- a/nixos/lib/testing/network.nix +++ b/nixos/lib/testing/network.nix @@ -18,24 +18,40 @@ let networkModule = { config, nodes, pkgs, ... }: let - interfacesNumbered = zipLists config.virtualisation.vlans (range 1 255); - interfaces = forEach interfacesNumbered ({ fst, snd }: - nameValuePair "eth${toString snd}" { - ipv4.addresses = - [{ - address = "192.168.${toString fst}.${toString config.virtualisation.test.nodeNumber}"; + qemu-common = import ../qemu-common.nix { inherit lib pkgs; }; + + # Convert legacy VLANs to named interfaces and merge with explicit interfaces. + vlansNumbered = forEach (zipLists config.virtualisation.vlans (range 1 255)) (v: { + name = "eth${toString v.snd}"; + vlan = v.fst; + assignIP = true; + }); + explicitInterfaces = lib.mapAttrsToList (n: v: v // { name = n; }) config.virtualisation.interfaces; + interfaces = vlansNumbered ++ explicitInterfaces; + interfacesNumbered = zipLists interfaces (range 1 255); + + # Automatically assign IP addresses to requested interfaces. + assignIPs = lib.filter (i: i.assignIP) interfaces; + ipInterfaces = forEach assignIPs (i: + nameValuePair i.name { ipv4.addresses = + [ { address = "192.168.${toString i.vlan}.${toString config.virtualisation.test.nodeNumber}"; prefixLength = 24; }]; }); + qemuOptions = lib.flatten (forEach interfacesNumbered ({ fst, snd }: + qemu-common.qemuNICFlags snd fst.vlan config.virtualisation.test.nodeNumber)); + udevRules = forEach interfacesNumbered ({ fst, snd }: + "SUBSYSTEM==\"net\",ACTION==\"add\",ATTR{address}==\"${qemu-common.qemuNicMac fst.vlan config.virtualisation.test.nodeNumber}\",NAME=\"${fst.name}\""); + networkConfig = { networking.hostName = mkDefault config.virtualisation.test.nodeName; - networking.interfaces = listToAttrs interfaces; + networking.interfaces = listToAttrs ipInterfaces; networking.primaryIPAddress = - optionalString (interfaces != [ ]) (head (head interfaces).value.ipv4.addresses).address; + optionalString (ipInterfaces != [ ]) (head (head ipInterfaces).value.ipv4.addresses).address; # Put the IP addresses of all VMs in this machine's # /etc/hosts file. If a machine has multiple @@ -51,16 +67,13 @@ let "${config.networking.hostName}.${config.networking.domain} " + "${config.networking.hostName}\n")); - virtualisation.qemu.options = - let qemu-common = import ../qemu-common.nix { inherit lib pkgs; }; - in - flip concatMap interfacesNumbered - ({ fst, snd }: qemu-common.qemuNICFlags snd fst config.virtualisation.test.nodeNumber); + virtualisation.qemu.options = qemuOptions; + boot.initrd.services.udev.rules = concatMapStrings (x: x + "\n") udevRules; }; in { - key = "ip-address"; + key = "network-interfaces"; config = networkConfig // { # Expose the networkConfig items for tests like nixops # that need to recreate the network config. |