Add macvlan support for declarative containers
This commit is contained in:
parent
42a0fc4387
commit
4889c271ca
@ -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
|
||||
''}
|
||||
|
82
nixos/tests/containers-macvlans.nix
Normal file
82
nixos/tests/containers-macvlans.nix
Normal file
@ -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}");
|
||||
'';
|
||||
})
|
Loading…
Reference in New Issue
Block a user