summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nixos/modules/virtualisation/containers.nix12
-rw-r--r--nixos/tests/containers-macvlans.nix82
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}");
+ '';
+})