perf: allow caching wireguard network information to significantly speed up evaluation

This commit is contained in:
oddlama 2024-11-21 19:51:16 +01:00
parent ba53e1a0be
commit 0de9c0751b
No known key found for this signature in database
GPG key ID: 14EFE510775FE39A
3 changed files with 27 additions and 8 deletions

View file

@ -16,6 +16,7 @@ inputs: final: prev: let
nameValuePair
partition
removeSuffix
warn
;
inherit
@ -32,8 +33,8 @@ inputs: final: prev: let
in {
lib =
prev.lib
// {
wireguard = userInputs: wgName: let
// rec {
wireguard.evaluateNetwork = userInputs: wgName: let
inherit (userInputs.self) nodes;
# Returns the given node's wireguard configuration of this network
wgCfgOf = node: nodes.${node}.config.wireguard.${wgName};
@ -220,5 +221,24 @@ in {
wgQuickConfigScript
;
};
wireguard.createEvalCache = userInputs: wgNames:
genAttrs wgNames (wireguard.evaluateNetwork userInputs);
wireguard.getNetwork = userInputs: wgName:
userInputs.self.wireguardEvalCache.${wgName}
or (
warn ''
The calculated information for the wireguard network "${wgName}" is not cached!
This will siginificantly increase evaluation times. Please consider pre-evaluating
this information by exposing it in your flake:
wireguardEvalCache.${wgName} = lib.wireguard.createEvalCache inputs [
"${wgName}"
# all other networks
];
'' (wireguard.evaluateNetwork userInputs wgName)
);
};
}

View file

@ -30,7 +30,7 @@ in {
topology.networks = mkMerge (
flip mapAttrsToList config.wireguard (
wgName: _: let
inherit (lib.wireguard inputs wgName) networkCidrs;
inherit (lib.wireguard.getNetwork inputs wgName) networkCidrs;
in {
${networkId wgName} = {
name = mkDefault "Wireguard network '${wgName}'";
@ -47,7 +47,7 @@ in {
flip mapAttrsToList config.wireguard (
wgName: wgCfg: let
inherit
(lib.wireguard inputs wgName)
(lib.wireguard.getNetwork inputs wgName)
participatingServerNodes
wgCfgOf
;

View file

@ -28,7 +28,6 @@
optionals
stringLength
types
wireguard
;
cfg = config.wireguard;
@ -36,7 +35,7 @@
configForNetwork = wgName: wgCfg: let
inherit
(wireguard inputs wgName)
(lib.wireguard.getNetwork inputs wgName)
externalPeerName
externalPeerNamesRaw
networkCidrs
@ -385,7 +384,7 @@ in {
ipv4 = mkOption {
type = types.lazyOf types.net.ipv4;
default = types.lazyValue (wireguard inputs name).assignedIpv4Addresses.${nodeName};
default = types.lazyValue (lib.wireguard.getNetwork inputs name).assignedIpv4Addresses.${nodeName};
description = ''
The ipv4 address for this machine. If you do not set this explicitly,
a semi-stable ipv4 address will be derived automatically based on the
@ -397,7 +396,7 @@ in {
ipv6 = mkOption {
type = types.lazyOf types.net.ipv6;
default = types.lazyValue (wireguard inputs name).assignedIpv6Addresses.${nodeName};
default = types.lazyValue (lib.wireguard.getNetwork inputs name).assignedIpv6Addresses.${nodeName};
description = ''
The ipv6 address for this machine. If you do not set this explicitly,
a semi-stable ipv6 address will be derived automatically based on the