macOS support for NixOS tests (#282401)
Closes #193336 Closes #261694 Related to #108984 The goal here was to get the following flake to build and run on `aarch64-darwin`: ```nix { inputs.nixpkgs.url = <this branch>; outputs = { nixpkgs, ... }: { checks.aarch64-darwin.default = nixpkgs.legacyPackages.aarch64-darwin.nixosTest { name = "test"; nodes.machine = { }; testScript = ""; }; }; } ``` … and after this change it does. There's no longer a need for the user to set `nodes.*.nixpkgs.pkgs` or `nodes.*.virtualisation.host.pkgs` as the correct values are inferred from the host system.
This commit is contained in:
parent
458b097d81
commit
b8698cd8d6
9 changed files with 51 additions and 10 deletions
|
@ -14,6 +14,25 @@ let
|
||||||
types
|
types
|
||||||
;
|
;
|
||||||
|
|
||||||
|
inherit (hostPkgs) hostPlatform;
|
||||||
|
|
||||||
|
guestSystem =
|
||||||
|
if hostPlatform.isLinux
|
||||||
|
then hostPlatform.system
|
||||||
|
else
|
||||||
|
let
|
||||||
|
hostToGuest = {
|
||||||
|
"x86_64-darwin" = "x86_64-linux";
|
||||||
|
"aarch64-darwin" = "aarch64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
supportedHosts = lib.concatStringsSep ", " (lib.attrNames hostToGuest);
|
||||||
|
|
||||||
|
message =
|
||||||
|
"NixOS Test: don't know which VM guest system to pair with VM host system: ${hostPlatform.system}. Perhaps you intended to run the tests on a Linux host, or one of the following systems that may run NixOS tests: ${supportedHosts}";
|
||||||
|
in
|
||||||
|
hostToGuest.${hostPlatform.system} or (throw message);
|
||||||
|
|
||||||
baseOS =
|
baseOS =
|
||||||
import ../eval-config.nix {
|
import ../eval-config.nix {
|
||||||
inherit lib;
|
inherit lib;
|
||||||
|
@ -27,13 +46,14 @@ let
|
||||||
({ config, ... }:
|
({ config, ... }:
|
||||||
{
|
{
|
||||||
virtualisation.qemu.package = testModuleArgs.config.qemu.package;
|
virtualisation.qemu.package = testModuleArgs.config.qemu.package;
|
||||||
|
virtualisation.host.pkgs = hostPkgs;
|
||||||
})
|
})
|
||||||
({ options, ... }: {
|
({ options, ... }: {
|
||||||
key = "nodes.nix-pkgs";
|
key = "nodes.nix-pkgs";
|
||||||
config = optionalAttrs (!config.node.pkgsReadOnly) (
|
config = optionalAttrs (!config.node.pkgsReadOnly) (
|
||||||
mkIf (!options.nixpkgs.pkgs.isDefined) {
|
mkIf (!options.nixpkgs.pkgs.isDefined) {
|
||||||
# TODO: switch to nixpkgs.hostPlatform and make sure containers-imperative test still evaluates.
|
# TODO: switch to nixpkgs.hostPlatform and make sure containers-imperative test still evaluates.
|
||||||
nixpkgs.system = hostPkgs.stdenv.hostPlatform.system;
|
nixpkgs.system = guestSystem;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
|
|
|
@ -2,7 +2,11 @@
|
||||||
{
|
{
|
||||||
config = {
|
config = {
|
||||||
# default pkgs for use in VMs
|
# default pkgs for use in VMs
|
||||||
_module.args.pkgs = hostPkgs;
|
_module.args.pkgs =
|
||||||
|
# TODO: deprecate it everywhere; not just on darwin. Throw on darwin?
|
||||||
|
lib.warnIf hostPkgs.stdenv.hostPlatform.isDarwin
|
||||||
|
"Do not use the `pkgs` module argument in tests you want to run on darwin. It is ambiguous, and many tests are broken because of it. If you need to use a package on the VM host, use `hostPkgs`. Otherwise, use `config.node.pkgs`, or `config.nodes.<name>.nixpkgs.pkgs`."
|
||||||
|
hostPkgs;
|
||||||
|
|
||||||
defaults = {
|
defaults = {
|
||||||
# TODO: a module to set a shared pkgs, if options.nixpkgs.* is untouched by user (highestPrio) */
|
# TODO: a module to set a shared pkgs, if options.nixpkgs.* is untouched by user (highestPrio) */
|
||||||
|
|
|
@ -41,7 +41,9 @@ in
|
||||||
rawTestDerivation = hostPkgs.stdenv.mkDerivation {
|
rawTestDerivation = hostPkgs.stdenv.mkDerivation {
|
||||||
name = "vm-test-run-${config.name}";
|
name = "vm-test-run-${config.name}";
|
||||||
|
|
||||||
requiredSystemFeatures = [ "kvm" "nixos-test" ];
|
requiredSystemFeatures = [ "nixos-test" ]
|
||||||
|
++ lib.optionals hostPkgs.stdenv.hostPlatform.isLinux [ "kvm" ]
|
||||||
|
++ lib.optionals hostPkgs.stdenv.hostPlatform.isDarwin [ "apple-virt" ];
|
||||||
|
|
||||||
buildCommand = ''
|
buildCommand = ''
|
||||||
mkdir -p $out
|
mkdir -p $out
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
{ pkgs, lib, ... }: let
|
{ config, lib, ... }: let
|
||||||
|
|
||||||
|
pkgs = config.node.pkgs;
|
||||||
|
|
||||||
commonConfig = ./common/acme/client;
|
commonConfig = ./common/acme/client;
|
||||||
|
|
||||||
dnsServerIP = nodes: nodes.dnsserver.networking.primaryIPAddress;
|
dnsServerIP = nodes: nodes.dnsserver.networking.primaryIPAddress;
|
||||||
|
|
|
@ -78,8 +78,9 @@ let
|
||||||
# it with `allowAliases = false`?
|
# it with `allowAliases = false`?
|
||||||
# warnIf pkgs.config.allowAliases "nixosTests: pkgs includes aliases."
|
# warnIf pkgs.config.allowAliases "nixosTests: pkgs includes aliases."
|
||||||
{
|
{
|
||||||
|
_file = "${__curPos.file} readOnlyPkgs";
|
||||||
_class = "nixosTest";
|
_class = "nixosTest";
|
||||||
node.pkgs = pkgs;
|
node.pkgs = pkgs.pkgsLinux;
|
||||||
};
|
};
|
||||||
|
|
||||||
in {
|
in {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{ pkgs, buildPackages, lib, callPackage, runCommand, stdenv, substituteAll, testers }:
|
{ pkgs, pkgsLinux, buildPackages, lib, callPackage, runCommand, stdenv, substituteAll, testers }:
|
||||||
# Documentation is in doc/builders/testers.chapter.md
|
# Documentation is in doc/builders/testers.chapter.md
|
||||||
{
|
{
|
||||||
# See https://nixos.org/manual/nixpkgs/unstable/#tester-testBuildFailure
|
# See https://nixos.org/manual/nixpkgs/unstable/#tester-testBuildFailure
|
||||||
|
@ -107,7 +107,7 @@
|
||||||
(lib.setDefaultModuleLocation "the argument that was passed to pkgs.runNixOSTest" testModule)
|
(lib.setDefaultModuleLocation "the argument that was passed to pkgs.runNixOSTest" testModule)
|
||||||
];
|
];
|
||||||
hostPkgs = pkgs;
|
hostPkgs = pkgs;
|
||||||
node.pkgs = pkgs;
|
node.pkgs = pkgsLinux;
|
||||||
};
|
};
|
||||||
|
|
||||||
# See doc/builders/testers.chapter.md or
|
# See doc/builders/testers.chapter.md or
|
||||||
|
@ -123,7 +123,7 @@
|
||||||
inherit pkgs;
|
inherit pkgs;
|
||||||
extraConfigurations = [(
|
extraConfigurations = [(
|
||||||
{ lib, ... }: {
|
{ lib, ... }: {
|
||||||
config.nixpkgs.pkgs = lib.mkDefault pkgs;
|
config.nixpkgs.pkgs = lib.mkDefault pkgsLinux;
|
||||||
}
|
}
|
||||||
)];
|
)];
|
||||||
});
|
});
|
||||||
|
|
|
@ -27,11 +27,11 @@ lib.recurseIntoAttrs {
|
||||||
|
|
||||||
# Check that the wiring of nixosTest is correct.
|
# Check that the wiring of nixosTest is correct.
|
||||||
# Correct operation of the NixOS test driver should be asserted elsewhere.
|
# Correct operation of the NixOS test driver should be asserted elsewhere.
|
||||||
nixosTest-example = pkgs-with-overlay.testers.nixosTest ({ lib, pkgs, figlet, ... }: {
|
nixosTest-example = pkgs-with-overlay.testers.nixosTest ({ lib, ... }: {
|
||||||
name = "nixosTest-test";
|
name = "nixosTest-test";
|
||||||
nodes.machine = { pkgs, ... }: {
|
nodes.machine = { pkgs, ... }: {
|
||||||
system.nixos = dummyVersioning;
|
system.nixos = dummyVersioning;
|
||||||
environment.systemPackages = [ pkgs.proof-of-overlay-hello figlet ];
|
environment.systemPackages = [ pkgs.proof-of-overlay-hello pkgs.figlet ];
|
||||||
};
|
};
|
||||||
testScript = ''
|
testScript = ''
|
||||||
machine.succeed("hello | figlet >/dev/console")
|
machine.succeed("hello | figlet >/dev/console")
|
||||||
|
|
|
@ -53,6 +53,7 @@ let
|
||||||
pkgsStatic = true;
|
pkgsStatic = true;
|
||||||
pkgsCross = true;
|
pkgsCross = true;
|
||||||
pkgsi686Linux = true;
|
pkgsi686Linux = true;
|
||||||
|
pkgsLinux = true;
|
||||||
pkgsExtraHardening = true;
|
pkgsExtraHardening = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -243,6 +243,16 @@ let
|
||||||
};
|
};
|
||||||
} else throw "x86_64 Darwin package set can only be used on Darwin systems.";
|
} else throw "x86_64 Darwin package set can only be used on Darwin systems.";
|
||||||
|
|
||||||
|
# If already linux: the same package set unaltered
|
||||||
|
# Otherwise, return a natively built linux package set for the current cpu architecture string.
|
||||||
|
# (ABI and other details will be set to the default for the cpu/os pair)
|
||||||
|
pkgsLinux =
|
||||||
|
if stdenv.hostPlatform.isLinux
|
||||||
|
then self
|
||||||
|
else nixpkgsFun {
|
||||||
|
localSystem = lib.systems.elaborate "${stdenv.hostPlatform.parsed.cpu.name}-linux";
|
||||||
|
};
|
||||||
|
|
||||||
# Extend the package set with zero or more overlays. This preserves
|
# Extend the package set with zero or more overlays. This preserves
|
||||||
# preexisting overlays. Prefer to initialize with the right overlays
|
# preexisting overlays. Prefer to initialize with the right overlays
|
||||||
# in one go when calling Nixpkgs, for performance and simplicity.
|
# in one go when calling Nixpkgs, for performance and simplicity.
|
||||||
|
|
Loading…
Reference in a new issue