import ./make-test-python.nix ({ lib, ... }: {
  name = "systemd-initrd-vlan";
  meta.maintainers = [ lib.maintainers.majiir ];

  # Tests VLAN interface configuration in systemd-initrd.
  #
  # Two nodes are configured for a tagged VLAN. (Note that they also still have
  # their ordinary eth0 and eth1 interfaces, which are not VLAN-tagged.)
  #
  # The 'server' node waits forever in initrd (stage 1) with networking
  # enabled. The 'client' node pings it to test network connectivity.

  nodes = let
    network = id: {
      networking = {
        vlans."eth1.10" = {
          id = 10;
          interface = "eth1";
        };
        interfaces."eth1.10" = {
          ipv4.addresses = [{
            address = "192.168.10.${id}";
            prefixLength = 24;
          }];
        };
      };
    };
  in {
    # Node that will use initrd networking.
    server = network "1" // {
      boot.initrd.systemd.enable = true;
      boot.initrd.network.enable = true;
      boot.initrd.systemd.services.boot-blocker = {
        before = [ "initrd.target" ];
        wantedBy = [ "initrd.target" ];
        script = "sleep infinity";
        serviceConfig.Type = "oneshot";
      };
    };

    # Node that will ping the server.
    client = network "2";
  };

  testScript = ''
    start_all()
    client.wait_for_unit("network.target")

    # Wait for the regular (untagged) interface to be up.
    def server_is_up(_) -> bool:
        status, _ = client.execute("ping -n -c 1 server >&2")
        return status == 0
    with client.nested("waiting for server to come up"):
        retry(server_is_up)

    # Try to ping the (tagged) VLAN interface.
    client.succeed("ping -n -w 10 -c 1 192.168.10.1 >&2")
  '';
})
