1{flake-utils}: {2 fleetConfiguration = {3 data,4 nixpkgs,5 hosts,6 ...7 } @ allConfig: let8 hostNames = nixpkgs.lib.attrNames hosts;9 config = builtins.removeAttrs allConfig ["nixpkgs" "data"];10 fleetLib = import ./fleetLib.nix {11 inherit nixpkgs hostNames;12 };13 in let14 root = nixpkgs.lib.evalModules {15 modules = (import ../modules/fleet/_modules.nix) ++ [config data];16 specialArgs = {17 inherit nixpkgs fleetLib;18 };19 };20 failedAssertions = map (x: x.message) (nixpkgs.lib.filter (x: !x.assertion) root.config.assertions);21 checkedRoot =22 if failedAssertions != []23 then throw "Fleet failed assertions:\n${nixpkgs.lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"24 else nixpkgs.lib.showWarnings root.config.warnings root;25 withData = {26 root,27 data,28 }: rec {29 configuredHosts = root.config.hosts;30 configuredUncheckedHosts = root.config.hosts;31 configuredSystems = configuredSystemsWithExtraModules [];32 configuredSystemsWithExtraModules = extraModules:33 nixpkgs.lib.listToAttrs (34 map35 (36 name: {37 inherit name;38 value = nixpkgs.lib.nixosSystem {39 system = configuredHosts.${name}.system;40 modules = configuredHosts.${name}.modules ++ extraModules;41 specialArgs = {42 inherit fleetLib;43 fleet = fleetLib.hostsToAttrs (host: configuredSystems.${host}.config);44 };45 };46 }47 )48 (builtins.attrNames root.config.hosts)49 );50 buildableSystems = {localSystem}: let51 buildConfigurationModule = {config, ...}: {52 53 54 nixpkgs.buildPlatform.system = localSystem;55 };56 in57 configuredSystemsWithExtraModules [58 buildConfigurationModule59 ];60 buildSystems = {localSystem}: let61 buildConfigurationModule = {config, ...}: {62 63 64 nixpkgs.buildPlatform.system = localSystem;65 };66 in {67 toplevel = builtins.mapAttrs (_name: value: value.config.system.build.toplevel) (configuredSystemsWithExtraModules [68 buildConfigurationModule69 ({...}: {70 buildTarget = "toplevel";71 })72 ]);73 sdImage = builtins.mapAttrs (_name: value: value.config.system.build.sdImage) (configuredSystemsWithExtraModules [74 buildConfigurationModule75 76 ({...}: {77 buildTarget = "sd-image";78 })79 ]);80 installationCd = builtins.mapAttrs (_name: value: value.config.system.build.isoImage) (configuredSystemsWithExtraModules [81 buildConfigurationModule82 (nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix")83 ({lib, ...}: {84 buildTarget = "installation-cd";85 86 boot.supportedFilesystems = lib.mkForce ["btrfs" "reiserfs" "vfat" "f2fs" "xfs" "ntfs" "cifs"];87 })88 ]);89 };90 configUnchecked = root.config;91 };92 defaultData = withData {93 inherit data;94 root = checkedRoot;95 };96 uncheckedData = withData {inherit data root;};97 in rec {98 inherit (defaultData) configuredHosts configuredSystems buildSystems configUnchecked buildableSystems;99 unchecked = {100 inherit (uncheckedData) configuredHosts configuredSystems buildSystems configUnchecked buildableSystems;101 };102 injectData = data: let103 injectedData = withData data;104 in {105 inherit (injectedData) configuredHosts configuredSystems buildSystems configUnchecked;106 };107 };108}