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 in14 15 nixpkgs.lib.genAttrs flake-utils.lib.defaultSystems (system: let16 withData = data: rec {17 root = nixpkgs.lib.evalModules {18 modules = (import ../modules/fleet/_modules.nix) ++ [config data];19 specialArgs = {20 inherit nixpkgs fleetLib;21 };22 };23 failedAssertions = map (x: x.message) (nixpkgs.lib.filter (x: !x.assertion) root.config.assertions);24 rootAssertWarn =25 if failedAssertions != []26 then throw "Failed assertions:\n${nixpkgs.lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"27 else nixpkgs.lib.showWarnings root.config.warnings root;28 configuredHosts = rootAssertWarn.config.hosts;29 configuredSecrets = rootAssertWarn.config.secrets;30 configuredSystems = configuredSystemsWithExtraModules [];31 configuredSystemsWithExtraModules = extraModules:32 nixpkgs.lib.listToAttrs (33 map34 (35 name: {36 inherit name;37 value = nixpkgs.lib.nixosSystem {38 system = configuredHosts.${name}.system;39 modules =40 configuredHosts.${name}.modules41 ++ extraModules42 ++ [43 ({...}: {44 nixpkgs.system = system;45 nixpkgs.localSystem.system = system;46 nixpkgs.crossSystem =47 if system == configuredHosts.${name}.system48 then null49 else {50 system = configuredHosts.${name}.system;51 };52 })53 ];54 specialArgs = {55 inherit fleetLib;56 fleet = fleetLib.hostsToAttrs (host: configuredSystems.${host}.config);57 };58 };59 }60 )61 (builtins.attrNames rootAssertWarn.config.hosts)62 );63 buildSystems = {64 toplevel = builtins.mapAttrs (_name: value: value.config.system.build.toplevel) (configuredSystemsWithExtraModules [65 ({...}: {66 buildTarget = "toplevel";67 })68 ]);69 sdImage = builtins.mapAttrs (_name: value: value.config.system.build.sdImage) (configuredSystemsWithExtraModules [70 71 ({...}: {72 buildTarget = "sd-image";73 })74 ]);75 installationCd = builtins.mapAttrs (_name: value: value.config.system.build.isoImage) (configuredSystemsWithExtraModules [76 (nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix")77 ({lib, ...}: {78 buildTarget = "installation-cd";79 80 boot.supportedFilesystems = lib.mkForce ["btrfs" "reiserfs" "vfat" "f2fs" "xfs" "ntfs" "cifs"];81 })82 ]);83 };84 configUnchecked = root.config;85 };86 defaultData = withData data;87 in rec {88 inherit (defaultData) configuredHosts configuredSecrets configuredSystems buildSystems configUnchecked;89 injectData = data: let90 injectedData = withData data;91 in {92 inherit (injectedData) configuredHosts configuredSecrets configuredSystems buildSystems configUnchecked;93 };94 });95}