# Support for GRETap interfaces in NixOS' scripted networking.
#
# We currently only use it in the edge01.waw test framework to bring vlans
# across test VMs.

{ config, pkgs, lib, ... }:

with lib;

let
  cfg = config.hscloud.gretap;

in {
  options.hscloud.gretap = {
    interfaces = mkOption {
      type = with types; attrsOf (submodule {
        options = {
          localV4 = mkOption {
            type = types.str;
            description = "Local outer IPv4 address";
          };
          remoteV4 = mkOption {
            type = types.str;
            description = "Remote outer IPv4 address";
          };
          id = mkOption {
            type = types.int;
            description = "Tunnel ID";
          };
          parent = mkOption {
            type = types.str;
            description = "Parent/outer device";
          };
        };
      });
      description = ''
        GRETap interfaces to create.
      '';
    };
  };

  config.boot.kernelModules = [ "fou" ];
  config.systemd.services = mapAttrs' (name: value: nameValuePair "${name}-gretap" {
    wants = if config.networking.useNetworkd then [
      "systemd-networkd.service"
    ] else [
      "${name}-netdev.service"
      "network-addresses-${value.parent}.service"
    ];
    after = if config.networking.useNetworkd then [
      "systemd-networkd.service"
    ] else [
      "network-addresses-${value.parent}.service"
    ];
    before = if config.networking.useNetworkd then [] else [
      "network-addresses-${name}.service"
    ];
    wantedBy = if config.networking.useNetworkd then [
      "network-online.target"
    ] else [
      "network-addresses-${name}.service"
    ];
    serviceConfig = {
      Type = "oneshot";
      ExecStart = "${pkgs.iproute2}/bin/ip link add name ${name} type gretap remote ${value.remoteV4} local ${value.localV4} key ${toString value.id}";
    };
  }) cfg.interfaces;
}
