2022-06-06 13:29:04 +02:00
testModuleArgs @ { config , lib , hostPkgs , nodes , . . . }:
let
2023-05-07 17:39:08 +02:00
inherit ( lib )
literalExpression
literalMD
mapAttrs
mkDefault
mkIf
mkOption mkForce
optional
2023-05-07 17:47:29 +02:00
optionalAttrs
2023-05-07 17:39:08 +02:00
types
;
2022-06-06 13:29:04 +02:00
2024-03-02 06:33:14 +01:00
inherit ( hostPkgs ) hostPlatform ;
guestSystem =
if hostPlatform . isLinux
then hostPlatform . system
else
let
hostToGuest = {
" x 8 6 _ 6 4 - d a r w i n " = " x 8 6 _ 6 4 - l i n u x " ;
" a a r c h 6 4 - d a r w i n " = " a a r c h 6 4 - l i n u x " ;
} ;
supportedHosts = lib . concatStringsSep " , " ( lib . attrNames hostToGuest ) ;
message =
" N i x O S T e s t : d o n ' t k n o w w h i c h V M g u e s t s y s t e m t o p a i r w i t h V M h o s t s y s t e m : ${ hostPlatform . system } . P e r h a p s y o u i n t e n d e d t o r u n t h e t e s t s o n a L i n u x h o s t , o r o n e o f t h e f o l l o w i n g s y s t e m s t h a t m a y r u n N i x O S t e s t s : ${ supportedHosts } " ;
in
hostToGuest . ${ hostPlatform . system } or ( throw message ) ;
2022-06-06 13:29:04 +02:00
baseOS =
import ../eval-config.nix {
2023-06-04 04:43:20 +02:00
inherit lib ;
2023-05-07 15:38:58 +02:00
system = null ; # use modularly defined system
2022-06-06 13:29:04 +02:00
inherit ( config . node ) specialArgs ;
modules = [ config . defaults ] ;
baseModules = ( import ../../modules/module-list.nix ) ++
[
2022-06-22 01:12:01 +02:00
./nixos-test-base.nix
2022-06-27 20:07:08 +02:00
{ key = " n o d e s " ; _module . args . nodes = config . nodesCompat ; }
2022-06-06 13:29:04 +02:00
( { config , . . . }:
{
virtualisation . qemu . package = testModuleArgs . config . qemu . package ;
2024-03-02 06:33:14 +01:00
virtualisation . host . pkgs = hostPkgs ;
2023-05-07 15:38:58 +02:00
} )
2023-10-06 07:29:58 +02:00
( { options , . . . }: {
2023-05-07 15:44:54 +02:00
key = " n o d e s . n i x - p k g s " ;
2023-10-06 22:52:04 +02:00
config = optionalAttrs ( ! config . node . pkgsReadOnly ) (
mkIf ( ! options . nixpkgs . pkgs . isDefined ) {
# TODO: switch to nixpkgs.hostPlatform and make sure containers-imperative test still evaluates.
2024-03-02 06:33:14 +01:00
nixpkgs . system = guestSystem ;
2023-10-06 22:52:04 +02:00
}
) ;
2023-05-07 15:38:58 +02:00
} )
2022-09-17 15:34:14 +02:00
testModuleArgs . config . extraBaseModules
2022-12-20 14:28:47 +01:00
] ;
2022-06-06 13:29:04 +02:00
} ;
in
{
options = {
node . type = mkOption {
type = types . raw ;
default = baseOS . type ;
internal = true ;
} ;
nodes = mkOption {
type = types . lazyAttrsOf config . node . type ;
2022-06-27 20:06:30 +02:00
visible = " s h a l l o w " ;
2024-04-02 01:58:23 +02:00
description = ''
2022-06-27 20:06:30 +02:00
An attribute set of NixOS configuration modules .
2022-09-29 12:41:59 +02:00
The configurations are augmented by the [ ` defaults ` ] ( #test-opt-defaults) option.
2022-06-27 20:06:30 +02:00
They are assigned network addresses according to the ` nixos/lib/testing/network.nix ` module .
A few special options are available , that aren't in a plain NixOS configuration . See [ Configuring the nodes ] ( #sec-nixos-test-nodes)
'' ;
2022-06-06 13:29:04 +02:00
} ;
defaults = mkOption {
2024-04-02 01:58:23 +02:00
description = ''
2022-09-29 12:41:59 +02:00
NixOS configuration that is applied to all [ { option } ` nodes ` ] ( #test-opt-nodes).
2022-06-27 20:06:30 +02:00
'' ;
type = types . deferredModule ;
default = { } ;
} ;
extraBaseModules = mkOption {
2024-04-02 01:58:23 +02:00
description = ''
2022-09-29 12:41:59 +02:00
NixOS configuration that , like [ { option } ` defaults ` ] ( #test-opt-defaults), is applied to all [{option}`nodes`](#test-opt-nodes) and can not be undone with [`specialisation.<name>.inheritParentConfig`](https://search.nixos.org/options?show=specialisation.%3Cname%3E.inheritParentConfig&from=0&size=50&sort=relevance&type=packages&query=specialisation).
2022-06-06 13:29:04 +02:00
'' ;
type = types . deferredModule ;
default = { } ;
} ;
2023-05-07 17:10:40 +02:00
node . pkgs = mkOption {
2024-04-02 01:58:23 +02:00
description = ''
2023-05-07 17:10:40 +02:00
The Nixpkgs to use for the nodes .
Setting this will make the ` nixpkgs . * ` options read-only , to avoid mistakenly testing with a Nixpkgs configuration that diverges from regular use .
'' ;
type = types . nullOr types . pkgs ;
default = null ;
defaultText = literalMD ''
` null ` , so construct ` pkgs ` according to the ` nixpkgs . * ` options as usual .
'' ;
} ;
2023-05-07 17:39:08 +02:00
node . pkgsReadOnly = mkOption {
2024-04-02 01:58:23 +02:00
description = ''
2023-05-07 17:39:08 +02:00
Whether to make the ` nixpkgs . * ` options read-only . This is only relevant when [ ` node . pkgs ` ] ( #test-opt-node.pkgs) is set.
Set this to ` false ` when any of the [ ` nodes ` ] ( #test-opt-nodes) needs to configure any of the `nixpkgs.*` options. This will slow down evaluation of your test a bit.
'' ;
type = types . bool ;
default = config . node . pkgs != null ;
defaultText = literalExpression '' n o d e . p k g s ! = n u l l '' ;
} ;
2022-06-06 13:29:04 +02:00
node . specialArgs = mkOption {
type = types . lazyAttrsOf types . raw ;
default = { } ;
2024-04-02 01:58:23 +02:00
description = ''
2022-06-27 20:06:30 +02:00
An attribute set of arbitrary values that will be made available as module arguments during the resolution of module ` imports ` .
Note that it is not possible to override these from within the NixOS configurations . If you argument is not relevant to ` imports ` , consider setting { option } ` defaults . _module . args . <name> ` instead .
'' ;
2022-06-06 13:29:04 +02:00
} ;
nodesCompat = mkOption {
internal = true ;
2024-04-02 01:58:23 +02:00
description = ''
2022-06-27 20:06:30 +02:00
Basically ` _module . args . nodes ` , but with backcompat and warnings added .
This will go away .
'' ;
2022-06-06 13:29:04 +02:00
} ;
} ;
config = {
_module . args . nodes = config . nodesCompat ;
nodesCompat =
mapAttrs
( name : config : config // {
2022-10-16 16:19:29 +02:00
config = lib . warnIf ( lib . isInOldestRelease 2211 )
2022-06-06 13:29:04 +02:00
" M o d u l e a r g u m e n t ` n o d e s . ${ name } . c o n f i g ` i s d e p r e c a t e d . U s e ` n o d e s . ${ name } ` i n s t e a d . "
config ;
} )
config . nodes ;
passthru . nodes = config . nodesCompat ;
2023-05-07 17:10:40 +02:00
2023-05-07 17:39:08 +02:00
defaults = mkIf config . node . pkgsReadOnly {
2023-05-07 17:10:40 +02:00
nixpkgs . pkgs = config . node . pkgs ;
imports = [ ../../modules/misc/nixpkgs/read-only.nix ] ;
} ;
2022-06-06 13:29:04 +02:00
} ;
}