about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorWilliam A. Kennington III <william@wkennington.com>2014-11-29 22:34:50 -0800
committerWilliam A. Kennington III <william@wkennington.com>2014-11-29 22:35:03 -0800
commit7ecb084b77ae7f4ae66f844ae23f22e7ceea0879 (patch)
tree9ddff3657cce77068c41abaf5c54815f5e8c1601 /nixos
parent017e6b72c123833c609dd45fcd523849d876da53 (diff)
downloadnixlib-7ecb084b77ae7f4ae66f844ae23f22e7ceea0879.tar
nixlib-7ecb084b77ae7f4ae66f844ae23f22e7ceea0879.tar.gz
nixlib-7ecb084b77ae7f4ae66f844ae23f22e7ceea0879.tar.bz2
nixlib-7ecb084b77ae7f4ae66f844ae23f22e7ceea0879.tar.lz
nixlib-7ecb084b77ae7f4ae66f844ae23f22e7ceea0879.tar.xz
nixlib-7ecb084b77ae7f4ae66f844ae23f22e7ceea0879.tar.zst
nixlib-7ecb084b77ae7f4ae66f844ae23f22e7ceea0879.zip
nixos/networking: More fixes
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/system/boot/systemd.nix1
-rw-r--r--nixos/modules/tasks/network-interfaces-scripted.nix11
-rw-r--r--nixos/modules/tasks/network-interfaces.nix14
-rw-r--r--nixos/tests/networking.nix27
4 files changed, 42 insertions, 11 deletions
diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix
index 89029a098e96..97cbc507e032 100644
--- a/nixos/modules/system/boot/systemd.nix
+++ b/nixos/modules/system/boot/systemd.nix
@@ -1026,6 +1026,7 @@ in
 
     systemd.services.systemd-networkd = {
       wantedBy = [ "multi-user.target" ];
+      before = [ "network-interfaces.target" ];
       restartTriggers = [ config.environment.etc."systemd/network".source ];
     };
 
diff --git a/nixos/modules/tasks/network-interfaces-scripted.nix b/nixos/modules/tasks/network-interfaces-scripted.nix
index 30fcb3a80104..12be812c71cb 100644
--- a/nixos/modules/tasks/network-interfaces-scripted.nix
+++ b/nixos/modules/tasks/network-interfaces-scripted.nix
@@ -33,8 +33,8 @@ let
       done
       [ "$UPDATED" -eq "1" ] && break
     done
-    ip link set "${i}" down || true
-    ip link del "${i}" || true
+    ip link set "${i}" down 2>/dev/null || true
+    ip link del "${i}" 2>/dev/null || true
   '';
 
 in
@@ -43,12 +43,6 @@ in
 
   config = mkIf (!cfg.useNetworkd) {
 
-    systemd.targets."network-interfaces" =
-      { description = "All Network Interfaces";
-        wantedBy = [ "network.target" ];
-        unitConfig.X-StopOnReconfiguration = true;
-      };
-
     systemd.services =
       let
 
@@ -240,6 +234,7 @@ in
               # Bring up the bond and enslave the specified interfaces
               ip link set "${n}" up
               ${flip concatMapStrings v.interfaces (i: ''
+                ip link set "${i}" down
                 ip link set "${i}" master "${n}"
               '')}
             '';
diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix
index 0ee2c9d2d00d..81228ea55a95 100644
--- a/nixos/modules/tasks/network-interfaces.nix
+++ b/nixos/modules/tasks/network-interfaces.nix
@@ -11,6 +11,11 @@ let
   hasSits = cfg.sits != { };
   hasBonds = cfg.bonds != { };
 
+  slaves = concatMap (i: i.interfaces) (attrValues cfg.bonds)
+    ++ concatMap (i: i.interfaces) (attrValues cfg.bridges);
+
+  slaveIfs = map (i: cfg.interfaces.${i}) slaves;
+
   # We must escape interfaces due to the systemd interpretation
   subsystemDevice = interface:
     "sys-subsystem-net-devices-${escapeSystemdPath interface}.device";
@@ -589,6 +594,9 @@ in
       (flip map interfaces (i: {
         assertion = i.subnetMask == null;
         message = "The networking.interfaces.${i.name}.subnetMask option is defunct. Use prefixLength instead.";
+      })) ++ (flip map slaveIfs (i: {
+        assertion = i.ip4 == [ ] && i.ipAddress == null && i.ip6 == [ ] && i.ipv6Address == null;
+        message = "The networking.interfaces.${i.name} must not have any defined ips when it is a slave.";
       })) ++ [
         {
           assertion = cfg.hostId == null || (stringLength cfg.hostId == 8 && isHexString cfg.hostId);
@@ -657,6 +665,12 @@ in
         pkgs.openresolv
       ];
 
+    systemd.targets."network-interfaces" =
+      { description = "All Network Interfaces";
+        wantedBy = [ "network.target" ];
+        unitConfig.X-StopOnReconfiguration = true;
+      };
+
     systemd.services = {
       network-local-commands = {
         description = "Extra networking commands.";
diff --git a/nixos/tests/networking.nix b/nixos/tests/networking.nix
index b5e09cc3950b..4b48a5021fbf 100644
--- a/nixos/tests/networking.nix
+++ b/nixos/tests/networking.nix
@@ -55,7 +55,9 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client->waitForUnit("network-interfaces.target");
             $client->waitForUnit("network.target");
+            $router->waitForUnit("network-interfaces.target");
             $router->waitForUnit("network.target");
 
             # Make sure dhcpcd is not started
@@ -101,9 +103,10 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client->waitForUnit("network-interfaces.target");
             $client->waitForUnit("network.target");
+            $router->waitForUnit("network-interfaces.target");
             $router->waitForUnit("network.target");
-            $client->waitForUnit("dhcpcd.service");
 
             # Wait until we have an ip address on each interface
             $client->succeed("while ! ip addr show dev eth1 | grep '192.168.1'; do true; done");
@@ -144,9 +147,10 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client->waitForUnit("network-interfaces.target");
             $client->waitForUnit("network.target");
+            $router->waitForUnit("network-interfaces.target");
             $router->waitForUnit("network.target");
-            $client->waitForUnit("dhcpcd.service");
 
             # Wait until we have an ip address on each interface
             $client->succeed("while ! ip addr show dev eth1 | grep '192.168.1'; do true; done");
@@ -177,6 +181,8 @@ import ./make-test.nix ({ networkd, test, ... }:
               mode = "balance-rr";
               interfaces = [ "eth1" "eth2" ];
             };
+            interfaces.eth1.ip4 = mkOverride 0 [ ];
+            interfaces.eth2.ip4 = mkOverride 0 [ ];
             interfaces.bond.ip4 = mkOverride 0
               [ { inherit address; prefixLength = 30; } ];
           };
@@ -189,9 +195,16 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client1->waitForUnit("network-interfaces.target");
             $client1->waitForUnit("network.target");
+            $client2->waitForUnit("network-interfaces.target");
             $client2->waitForUnit("network.target");
 
+            $client1->succeed("ip link >&2");
+            $client1->succeed("systemctl status bond-netdev -l");
+            $client2->succeed("ip link >&2");
+            $client2->succeed("systemctl status bond-netdev -l");
+
             # Test bonding
             $client1->succeed("ping -c 2 192.168.1.1");
             $client1->succeed("ping -c 2 192.168.1.2");
@@ -232,8 +245,11 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client1->waitForUnit("network-interfaces.target");
             $client1->waitForUnit("network.target");
+            $client2->waitForUnit("network-interfaces.target");
             $client2->waitForUnit("network.target");
+            $router->waitForUnit("network-interfaces.target");
             $router->waitForUnit("network.target");
 
             # Test bridging
@@ -267,9 +283,10 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client->waitForUnit("network-interfaces.target");
             $client->waitForUnit("network.target");
+            $router->waitForUnit("network-interfaces.target");
             $router->waitForUnit("network.target");
-            $client->waitForUnit("dhcpcd.service");
 
             # Wait until we have an ip address on each interface
             $client->succeed("while ! ip addr show dev eth1 | grep '192.168.1'; do true; done");
@@ -311,7 +328,9 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client1->waitForUnit("network-interfaces.target");
             $client1->waitForUnit("network.target");
+            $client2->waitForUnit("network-interfaces.target");
             $client2->waitForUnit("network.target");
 
             $client1->succeed("ip addr >&2");
@@ -350,7 +369,9 @@ import ./make-test.nix ({ networkd, test, ... }:
           ''
             startAll;
 
+            $client1->waitForUnit("network-interfaces.target");
             $client1->waitForUnit("network.target");
+            $client2->waitForUnit("network-interfaces.target");
             $client2->waitForUnit("network.target");
 
             # Test vlan is setup