ALPHA: wire is a tool to deploy nixos systems wire.althaea.zone/
at stable 2.7 kB view raw
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}