buildClan function: export all machines via nixosModules/darwinModules

We want each machine not only to be exposed via nixosConfigurations but also as a module.
This allows re-importing the machine in tests and override the architecture for example.
This commit is contained in:
DavHau
2025-06-09 18:00:28 +07:00
parent baeefc8ba1
commit d37c7c4c05
12 changed files with 100 additions and 25 deletions

View File

@@ -7,11 +7,16 @@
...
}:
let
inherit (lib)
flip
mapAttrs'
;
inherit (config)
directory
inventory
pkgsForSystem
specialArgs
inventory
;
inherit (clan-core.clanLib.inventory) buildInventory;
@@ -75,6 +80,31 @@ let
}
) allMachines;
# Expose reusable modules these can be imported or wrapped or instantiated
# - by the user
# - by some test frameworks
# IMPORTANT!: It is utterly important that we don't add any logic outside of these modules, as it would get tested.
nixosModules' = lib.filterAttrs (
name: _: inventory.machines.${name}.machineClass or "nixos" == "nixos"
) (config.outputs.moduleForMachine);
darwinModules' = lib.filterAttrs (
name: _: inventory.machines.${name}.machineClass or "nixos" == "darwin"
) (config.outputs.moduleForMachine);
nixosModules = flip mapAttrs' nixosModules' (
name: machineModule: {
name = "clan-machine-${name}";
value = machineModule;
}
);
darwinModules = flip mapAttrs' darwinModules' (
name: machineModule: {
name = "clan-machine-${name}";
value = machineModule;
}
);
nixosConfigurations = lib.filterAttrs (name: _: machineClasses.${name} == "nixos") configurations;
darwinConfigurations = lib.filterAttrs (name: _: machineClasses.${name} == "darwin") configurations;
@@ -180,6 +210,9 @@ in
# - darwinModules (_class = darwin)
(lib.optionalAttrs (clan-core ? "${_class}Modules") clan-core."${_class}Modules".clanCore)
] ++ lib.optionals (_class == "nixos") (v.machineImports or [ ]);
# default hostname
networking.hostName = lib.mkDefault name;
}
)
) inventoryClass.machines)
@@ -193,6 +226,10 @@ in
self = lib.mkDefault config.self;
};
# expose all machines as modules for re-use
inherit nixosModules;
inherit darwinModules;
# Ready to use configurations
# These are only shallow wrapping the 'nixosModules' or 'darwinModules' with
# lib.nixosSystem
@@ -200,17 +237,6 @@ in
inherit darwinConfigurations;
clanInternals = {
# Expose reusable modules these can be imported or wrapped or instantiated
# - by the user
# - by some test frameworks
# IMPORTANT!: It is utterly important that we don't add any logic outside of these modules, as it would get tested.
nixosModules = lib.filterAttrs (
name: _: inventory.machines.${name}.machineClass or "nixos" == "nixos"
) (config.outputs.moduleForMachine);
darwinModules = lib.filterAttrs (
name: _: inventory.machines.${name}.machineClass or "nixos" == "darwin"
) (config.outputs.moduleForMachine);
inherit inventoryClass;
# Endpoint that can be called to get a service schema