diff options
-rw-r--r-- | nixos/modules/virtualisation/containers.nix | 12 | ||||
-rw-r--r-- | nixos/tests/containers-macvlans.nix | 82 |
2 files changed, 94 insertions, 0 deletions
diff --git a/nixos/modules/virtualisation/containers.nix b/nixos/modules/virtualisation/containers.nix index a532696d03ae..637a87139045 100644 --- a/nixos/modules/virtualisation/containers.nix +++ b/nixos/modules/virtualisation/containers.nix @@ -476,6 +476,17 @@ in ''; }; + macvlans = mkOption { + type = types.listOf types.str; + default = []; + example = [ "eth1" "eth2" ]; + description = '' + The list of host interfaces from which macvlans will be + created. For each interface specified, a macvlan interface + will be created and moved to the container. + ''; + }; + extraVeths = mkOption { type = with types; attrsOf (submodule { options = networkOptions; }); default = {}; @@ -654,6 +665,7 @@ in ''} ''} INTERFACES="${toString cfg.interfaces}" + MACVLANS="${toString cfg.macvlans}" ${optionalString cfg.autoStart '' AUTO_START=1 ''} diff --git a/nixos/tests/containers-macvlans.nix b/nixos/tests/containers-macvlans.nix new file mode 100644 index 000000000000..721f98481497 --- /dev/null +++ b/nixos/tests/containers-macvlans.nix @@ -0,0 +1,82 @@ +# Test for NixOS' container support. + +let + # containers IP on VLAN 1 + containerIp1 = "192.168.1.253"; + containerIp2 = "192.168.1.254"; +in + +import ./make-test.nix ({ pkgs, ...} : { + name = "containers-macvlans"; + meta = with pkgs.stdenv.lib.maintainers; { + maintainers = [ montag451 ]; + }; + + nodes = { + + machine1 = + { config, pkgs, lib, ... }: + { + virtualisation.memorySize = 256; + virtualisation.vlans = [ 1 ]; + + # To be able to ping containers from the host, it is necessary + # to create a macvlan on the host on the VLAN 1 network. + networking.macvlans.mv-eth1-host = { + interface = "eth1"; + mode = "bridge"; + }; + networking.interfaces.eth1.ip4 = lib.mkForce []; + networking.interfaces.mv-eth1-host = { + ip4 = [ { address = "192.168.1.1"; prefixLength = 24; } ]; + }; + + containers.test1 = { + autoStart = true; + macvlans = [ "eth1" ]; + + config = { + networking.interfaces.mv-eth1 = { + ip4 = [ { address = containerIp1; prefixLength = 24; } ]; + }; + }; + }; + + containers.test2 = { + autoStart = true; + macvlans = [ "eth1" ]; + + config = { + networking.interfaces.mv-eth1 = { + ip4 = [ { address = containerIp2; prefixLength = 24; } ]; + }; + }; + }; + }; + + machine2 = + { config, pkgs, ... }: + { + virtualisation.memorySize = 256; + virtualisation.vlans = [ 1 ]; + }; + + }; + + testScript = '' + startAll; + $machine1->waitForUnit("default.target"); + $machine2->waitForUnit("default.target"); + + # Ping between containers to check that macvlans are created in bridge mode + $machine1->succeed("nixos-container run test1 -- ping -n -c 1 ${containerIp2}"); + + # Ping containers from the host (machine1) + $machine1->succeed("ping -n -c 1 ${containerIp1}"); + $machine1->succeed("ping -n -c 1 ${containerIp2}"); + + # Ping containers from the second machine to check that containers are reachable from the outside + $machine2->succeed("ping -n -c 1 ${containerIp1}"); + $machine2->succeed("ping -n -c 1 ${containerIp2}"); + ''; +}) |