From 5bd65732f5d60608037872976cd51b702c45c212 Mon Sep 17 00:00:00 2001 From: oddlama Date: Tue, 13 Jun 2023 00:16:18 +0200 Subject: [PATCH] fix: distributed-config now works across microvms and colmena nodes --- hosts/ward/microvms/grafana/default.nix | 1 - modules/distributed-config.nix | 29 +++++++++++++------------ modules/microvms.nix | 6 ++++- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/hosts/ward/microvms/grafana/default.nix b/hosts/ward/microvms/grafana/default.nix index 73a9059..a9c9718 100644 --- a/hosts/ward/microvms/grafana/default.nix +++ b/hosts/ward/microvms/grafana/default.nix @@ -28,7 +28,6 @@ }; nodes.sentinel.age.secrets.loki-basic-auth-hashes.generator.dependencies = [ - aaa not wokring config.age.secrets.grafana-loki-basic-auth-password ]; diff --git a/modules/distributed-config.nix b/modules/distributed-config.nix index 290be61..445da62 100644 --- a/modules/distributed-config.nix +++ b/modules/distributed-config.nix @@ -10,12 +10,13 @@ (lib) attrNames concatMap + elem filter mdDoc mkOption + mkOptionType + optionalAttrs types - unique - subtractLists ; inherit @@ -24,24 +25,24 @@ ; in { options.nodes = mkOption { - type = types.attrsOf types.unspecified; + type = types.attrsOf (mkOptionType { + name = "Toplevel NixOS config"; + merge = loc: map (x: x.value); + }); default = {}; description = mdDoc "Allows extending the configuration of other machines."; }; config = let + isColmenaNode = elem nodeName (attrNames colmenaNodes); otherNodes = filter (n: n != nodeName) (attrNames colmenaNodes); - foreignConfigs = map (n: colmenaNodes.${n}.config.nodes.${nodeName} or {}) otherNodes; + foreignConfigs = concatMap (n: colmenaNodes.${n}.config.nodes.${nodeName} or []) otherNodes; toplevelAttrs = ["age" "networking" "systemd" "services"]; in - todo wrong, currently extension FROM microvms is not possible - { - assertions = - map (n: { - assertion = false; - message = "Cannot extend configuration using nodes.${n} because the given node is not a registered or not a first-class nixos node (microvm's can't be extended right now)."; - }) - (subtractLists (attrNames colmenaNodes) (attrNames config.nodes)); - } - // mergeToplevelConfigs toplevelAttrs foreignConfigs; + optionalAttrs isColmenaNode (mergeToplevelConfigs toplevelAttrs ( + foreignConfigs + # Also allow extending ourselves, in case some attributes from depenent + # configurations such as containers or microvms are merged to the host + ++ [config.nodes.${nodeName} or {}] + )); } diff --git a/modules/microvms.nix b/modules/microvms.nix index c5bdfe3..e5dfa8c 100644 --- a/modules/microvms.nix +++ b/modules/microvms.nix @@ -87,6 +87,10 @@ }; }; + # Propagate node expansions, since doing this directly in the + # distributed-config module would cause infinite recursion. + nodes = mkMerge config.microvm.vms.${vmName}.config.options.nodes.definitions; + microvm.vms.${vmName} = let node = import ../nix/generate-node.nix inputs vmCfg.nodeName { inherit (vmCfg) system configPath; @@ -360,6 +364,6 @@ in { ipv6 = net.cidr.host 1 cfg.networking.wireguard.cidrv6; }; } - // extraLib.mergeToplevelConfigs ["disko" "microvm" "systemd"] (mapAttrsToList microvmConfig vms) + // extraLib.mergeToplevelConfigs ["nodes" "disko" "microvm" "systemd"] (mapAttrsToList microvmConfig vms) ); }