{ lib, ... }: let inherit (lib) mkOption types; inherit (types) submodule; in { resources.network = { description = "Networking info."; policy = { config, ... }: { _class = "fediversity-resource-policy"; options = { name = mkOption { description = '' The name of the machine. Most of the time, this will look like `vm02XXX` or `fediYYY`. ''; }; ipv4 = mkOption { type = submodule { options = { # enable = mkOption { # default = true; # }; interface = mkOption { description = '' The interface that carries the machine's IPv4 network. ''; default = "eth0"; }; address = mkOption { description = '' The IP address of the machine, version 4. It will be injected as a value in `networking.interfaces.eth0`, but it will also be used to communicate with the machine via NixOps4. ''; }; # prefixLength = mkOption { # description = '' # The subnet mask of the interface, specified as the number of bits in # the prefix. # ''; # default = 24; # }; gateway = mkOption { description = '' The IP address of the default gateway. ''; default = "185.206.232.1"; # FIXME: compute default from `address` and `prefixLength`. }; }; }; }; ipv6 = mkOption { type = submodule { options = { # enable = mkOption { # default = true; # }; interface = mkOption { description = '' The interface that carries the machine's IPv6 network. ''; default = "eth0"; }; address = mkOption { description = '' The IP address of the machine, version 6. It will be injected as a value in `networking.interfaces.eth0`, but it will also be used to communicate with the machine via NixOps4. ''; }; # prefixLength = mkOption { # description = '' # The subnet mask of the interface, specified as the number of bits in # the prefix. # ''; # default = 64; # }; gateway = mkOption { description = '' The IP address of the default gateway. ''; default = "2a00:51c0:12:1201::1"; # FIXME: compute default from `address` and `prefixLength`. }; }; }; }; }; config = { resource-type = types.unspecified; # NixOS module apply = let cfg = config; in _requests: { config, ... }: { # imports = [ # ../../../../infra/common/nixos/networking.nix # ]; networking = lib.mkMerge [ { hostName = cfg.name; } { interfaces.${config.networking.defaultGateway.interface}.ipv4.addresses = [ { prefixLength = 24; address = cfg.ipv4.address; } ]; defaultGateway = { address = cfg.ipv4.gateway; }; } { interfaces.${config.networking.defaultGateway6.interface}.ipv6.addresses = [ { prefixLength = 64; address = cfg.ipv6.address; } ]; defaultGateway6 = { address = cfg.ipv6.gateway; }; } ]; }; }; }; }; }