ttaenc: init at 3.4.1 (#238757)
[NixPkgs.git] / nixos / tests / frr.nix
blobf4cd68c9d3155ddb1e87036f69ab894332e4a095
1 # This test runs FRR and checks if OSPF routing works.
3 # Network topology:
4 #   [ client ]--net1--[ router1 ]--net2--[ router2 ]--net3--[ server ]
6 # All interfaces are in OSPF Area 0.
8 import ./make-test-python.nix (
9   { pkgs, ... }:
10   let
12     ifAddr = node: iface: (pkgs.lib.head node.networking.interfaces.${iface}.ipv4.addresses).address;
14     ospfConf1 = ''
15       router ospf
16         network 192.168.0.0/16 area 0
17     '';
19     ospfConf2 = ''
20       interface eth2
21         ip ospf hello-interval 1
22         ip ospf dead-interval 5
23       !
24       router ospf
25         network 192.168.0.0/16 area 0
26     '';
28   in
29   {
30     name = "frr";
32     meta = with pkgs.lib.maintainers; {
33       maintainers = [ ];
34     };
36     nodes = {
38       client =
39         { nodes, ... }:
40         {
41           virtualisation.vlans = [ 1 ];
42           services.frr = {
43             config = ''
44               ip route 192.168.0.0/16 ${ifAddr nodes.router1 "eth1"}
45             '';
46           };
47         };
49       router1 =
50         { ... }:
51         {
52           virtualisation.vlans = [
53             1
54             2
55           ];
56           boot.kernel.sysctl."net.ipv4.ip_forward" = "1";
57           networking.firewall.extraCommands = "iptables -A nixos-fw -i eth2 -p ospfigp -j ACCEPT";
58           services.frr = {
59             ospfd.enable = true;
60             config = ospfConf1;
61           };
63           specialisation.ospf.configuration = {
64             services.frr.config = ospfConf2;
65           };
66         };
68       router2 =
69         { ... }:
70         {
71           virtualisation.vlans = [
72             3
73             2
74           ];
75           boot.kernel.sysctl."net.ipv4.ip_forward" = "1";
76           networking.firewall.extraCommands = "iptables -A nixos-fw -i eth2 -p ospfigp -j ACCEPT";
77           services.frr = {
78             ospfd.enable = true;
79             config = ospfConf2;
80           };
81         };
83       server =
84         { nodes, ... }:
85         {
86           virtualisation.vlans = [ 3 ];
87           services.frr = {
88             config = ''
89               ip route 192.168.0.0/16 ${ifAddr nodes.router2 "eth1"}
90             '';
91           };
92         };
93     };
95     testScript =
96       { nodes, ... }:
97       ''
98         start_all()
100         # Wait for the networking to start on all machines
101         for machine in client, router1, router2, server:
102             machine.wait_for_unit("network.target")
104         with subtest("Wait for FRR"):
105             for gw in client, router1, router2, server:
106                 gw.wait_for_unit("frr")
108         router1.succeed("${nodes.router1.system.build.toplevel}/specialisation/ospf/bin/switch-to-configuration test >&2")
110         with subtest("Wait for OSPF to form adjacencies"):
111             for gw in router1, router2:
112                 gw.wait_until_succeeds("vtysh -c 'show ip ospf neighbor' | grep Full")
113                 gw.wait_until_succeeds("vtysh -c 'show ip route' | grep '^O>'")
115         with subtest("Test ICMP"):
116             client.wait_until_succeeds("ping -4 -c 3 server >&2")
117       '';
118   }