From 57963b9c1610cf4e315afd5f49f6665f4ddf44d0 Mon Sep 17 00:00:00 2001 From: _cry64 Date: Thu, 15 Jan 2026 20:10:16 +1000 Subject: [PATCH] introduce nexus templating via nib --- cerulean/{flake-config => nexus}/default.nix | 0 cerulean/{flake-config => nexus}/nexus.nix | 53 +++++++++++++++++--- cerulean/{flake-config => nexus}/nodes.nix | 5 +- 3 files changed, 50 insertions(+), 8 deletions(-) rename cerulean/{flake-config => nexus}/default.nix (100%) rename cerulean/{flake-config => nexus}/nexus.nix (63%) rename cerulean/{flake-config => nexus}/nodes.nix (97%) diff --git a/cerulean/flake-config/default.nix b/cerulean/nexus/default.nix similarity index 100% rename from cerulean/flake-config/default.nix rename to cerulean/nexus/default.nix diff --git a/cerulean/flake-config/nexus.nix b/cerulean/nexus/nexus.nix similarity index 63% rename from cerulean/flake-config/nexus.nix rename to cerulean/nexus/nexus.nix index f97d3e5..433be8b 100644 --- a/cerulean/flake-config/nexus.nix +++ b/cerulean/nexus/nexus.nix @@ -14,6 +14,7 @@ { this, sys, + nib, lib, deploy-rs, ... @@ -21,8 +22,10 @@ inherit (builtins) elem + isAttrs mapAttrs pathExists + typeOf ; inherit @@ -30,19 +33,52 @@ mapNodes ; - mkNexus' = config: rec { - nixosConfigurations = mapNodes config.nexus.nodes ( + inherit + (nib.std) + getAttrOr + ; + + templateNexus = let + inherit + (nib.types) + Terminal + ; + + missing = msg: path: + Terminal (abort '' + Each Cerulean Nexus node is required to specify ${msg}! + Ensure `nexus.${path}` exists under your call to `cerulean.mkNexus`. + ''); + in { + root = missing "the root directory for all cerulean nix modules." "root"; + groups = missing "an list of all valid node group names." "groups"; + nodes = Terminal {}; + }; + + parseNexus = nexus: + if !(isAttrs nexus) + then + abort '' + Cerulean Nexus config must be provided as an attribute set, got "${typeOf nexus}" instead! + Ensure all the `nexus` declaration is an attribute set under your call to `cerulean.mkNexus`. + '' + else nib.parse.overrideStruct templateNexus nexus; + + mkNexus' = nexus': let + nexus = parseNexus nexus'; + in rec { + nixosConfigurations = mapNodes nexus.nodes ( nodeName: node: lib.nixosSystem { system = node.system; modules = let - core' = config.root + "/hosts/${nodeName}"; + core' = nexus.root + "/hosts/${nodeName}"; core = if pathExists core' then core' else core' + ".nix"; in - [core] ++ node.extraModules; + [core ../nixos-module] ++ node.extraModules; # nix passes these to every single module specialArgs = @@ -54,7 +90,7 @@ } ); - deploy.nodes = mapNodes config.nexus.nodes (nodeName: node: let + deploy.nodes = mapNodes nexus.nodes (nodeName: node: let inherit (node.deploy) activationTimeout @@ -107,6 +143,9 @@ checks = mapAttrs (system: deployLib: deployLib.deployChecks deploy) deploy-rs.lib; }; in { - mkNexus = outputs: - (mkNexus' outputs.cerulean) // (removeAttrs outputs ["cerulean"]); + mkNexus = outputs': let + autogen = mkNexus' <| getAttrOr "nexus" outputs' {}; + outputs = removeAttrs outputs' ["nexus"]; + in + autogen // outputs; # XXX: TODO: replace this with a deep merge } diff --git a/cerulean/flake-config/nodes.nix b/cerulean/nexus/nodes.nix similarity index 97% rename from cerulean/flake-config/nodes.nix rename to cerulean/nexus/nodes.nix index 5c560fa..781a1fa 100644 --- a/cerulean/flake-config/nodes.nix +++ b/cerulean/nexus/nodes.nix @@ -21,7 +21,10 @@ in rec { # abstract node instance that stores all default values templateNode = name: system: let - Terminal = nib.types.Terminal; + inherit + (nib.types) + Terminal + ; missing = msg: path: Terminal (abort ''