ALPHA: wire is a tool to deploy nixos systems
wire.althaea.zone/
1# SPDX-License-Identifier: AGPL-3.0-or-later
2# Copyright 2024-2025 wire Contributors
3
4{
5 hive,
6 nixosConfigurations ? { },
7}:
8let
9 module = import ./module;
10
11 mergedHive = {
12 meta = { };
13
14 defaults = { };
15 }
16 // hive
17 # Map nixosConfigurations into nodes
18 // (builtins.mapAttrs (name: value: {
19 imports =
20 value._module.args.modules
21 # Include any custom stuff within `colmena`
22 ++ [ hive.${name} or { } ];
23 }) nixosConfigurations);
24
25 nodeNames = builtins.filter (
26 name:
27 !builtins.elem name [
28 "meta"
29 "defaults"
30 "-"
31 ]
32 ) (builtins.filter (name: builtins.hasAttr name hive) (builtins.attrNames mergedHive));
33
34 resolveNixpkgs =
35 value: help:
36 # support `<nixpkgs>`
37 if builtins.isPath value then
38 import value { }
39 # support npins sources passed directly
40 else if value ? "outPath" then
41 import value { }
42 # support `import <nixpkgs> { }`
43 else if builtins.isAttrs value then
44 value
45 else
46 builtins.abort "${help} was not a path, { outPath, .. }, or attrset. Was type: ${builtins.typeOf value}";
47
48 hiveGlobalNixpkgs =
49 if mergedHive.meta ? "nixpkgs" then
50 (resolveNixpkgs mergedHive.meta.nixpkgs "meta.nixpkgs")
51 else
52 builtins.abort "makeHive called without meta.nixpkgs specified.";
53
54 getNodeNixpkgs =
55 name:
56 if mergedHive.meta ? "nodeNixpkgs" then
57 if mergedHive.meta.nodeNixpkgs ? "${name}" then
58 (resolveNixpkgs mergedHive.meta.nodeNixpkgs.${name} "meta.nodeNixpkgs.${name}")
59 else
60 hiveGlobalNixpkgs
61 else
62 hiveGlobalNixpkgs;
63
64 nixpkgsIsFlake = nixpkgs: nixpkgs.lib.hasSuffix "-source" nixpkgs.path;
65
66 evaluateNode =
67 name:
68 let
69 nixpkgs = getNodeNixpkgs name;
70 evalConfig = import (nixpkgs.path + "/nixos/lib/eval-config.nix");
71 in
72 evalConfig {
73 modules = [
74 module
75
76 mergedHive.defaults
77 mergedHive.${name}
78 ]
79 ++ (nixpkgs.lib.optional (nixpkgsIsFlake nixpkgs) {
80 config.nixpkgs.flake.source = nixpkgs.lib.mkDefault nixpkgs.path;
81 });
82 system = null;
83 specialArgs = {
84 inherit name nodes;
85 }
86 // mergedHive.meta.specialArgs or { }
87 // mergedHive.meta.nodeSpecialArgs.${name} or { };
88 };
89
90 nodes = builtins.listToAttrs (
91 map (name: {
92 inherit name;
93 value = evaluateNode name;
94 }) nodeNames
95 );
96
97 getTopLevel = node: (evaluateNode node).config.system.build.toplevel.drvPath;
98in
99rec {
100 inherit nodes;
101
102 topLevels = builtins.mapAttrs (name: _: getTopLevel name) nodes;
103 inspect = {
104 _schema = 1;
105
106 nodes = builtins.mapAttrs (_: v: v.config.deployment) nodes;
107 };
108
109 names = nodeNames;
110}