diff --git a/checks/installation/flake-module.nix b/checks/installation/flake-module.nix index 545ed82c4..d49c8dd58 100644 --- a/checks/installation/flake-module.nix +++ b/checks/installation/flake-module.nix @@ -3,6 +3,72 @@ lib, ... }: +let + installer = + { modulesPath, pkgs, ... }: + let + dependencies = [ + self + self.clanInternals.machines.${pkgs.hostPlatform.system}.test-install-machine-with-system.config.system.build.toplevel + self.clanInternals.machines.${pkgs.hostPlatform.system}.test-install-machine-with-system.config.system.build.diskoScript + self.clanInternals.machines.${pkgs.hostPlatform.system}.test-install-machine-with-system.config.system.clan.deployment.file + pkgs.stdenv.drvPath + pkgs.bash.drvPath + pkgs.nixos-anywhere + pkgs.bubblewrap + ] ++ builtins.map (i: i.outPath) (builtins.attrValues self.inputs); + closureInfo = pkgs.closureInfo { rootPaths = dependencies; }; + # with Nix 2.24 we get: + # vm-test-run-test-installation> installer # error: sized: unexpected end-of-file + # vm-test-run-test-installation> installer # error: unexpected end-of-file + # This seems to be fixed with Nix 2.26 + # Remove this line once `pkgs.nix` is 2.26+ + nixPackage = + assert + lib.versionOlder pkgs.nix.version "2.26" + && lib.versionAtLeast pkgs.nixVersions.latest.version "2.26"; + pkgs.nixVersions.latest; + in + { + imports = [ + (modulesPath + "/../tests/common/auto-format-root-device.nix") + ]; + networking.useNetworkd = true; + services.openssh.enable = true; + services.openssh.settings.UseDns = false; + services.openssh.settings.PasswordAuthentication = false; + system.nixos.variant_id = "installer"; + environment.systemPackages = [ + self.packages.${pkgs.system}.clan-cli + pkgs.nixos-facter + ] ++ self.packages.${pkgs.system}.clan-cli.runtimeDependencies; + environment.etc."install-closure".source = "${closureInfo}/store-paths"; + virtualisation.emptyDiskImages = [ 512 ]; + virtualisation.diskSize = 8 * 1024; + virtualisation.rootDevice = "/dev/vdb"; + # both installer and target need to use the same diskImage + virtualisation.diskImage = "./target.qcow2"; + virtualisation.memorySize = 3048; + nix.package = nixPackage; + nix.settings = { + substituters = lib.mkForce [ ]; + hashed-mirrors = null; + connect-timeout = lib.mkForce 3; + flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}''; + experimental-features = [ + "nix-command" + "flakes" + ]; + }; + users.users.nonrootuser = { + isNormalUser = true; + openssh.authorizedKeys.keyFiles = [ ../lib/ssh/pubkey ]; + extraGroups = [ "wheel" ]; + }; + security.sudo.wheelNeedsPassword = false; + system.extraDependencies = dependencies; + }; +in { # The purpose of this test is to ensure `clan machines install` works # for machines that don't have a hardware config yet. @@ -112,32 +178,8 @@ perSystem = { pkgs, - lib, ... }: - let - dependencies = [ - self - self.clanInternals.machines.${pkgs.hostPlatform.system}.test-install-machine-with-system.config.system.build.toplevel - self.clanInternals.machines.${pkgs.hostPlatform.system}.test-install-machine-with-system.config.system.build.diskoScript - self.clanInternals.machines.${pkgs.hostPlatform.system}.test-install-machine-with-system.config.system.clan.deployment.file - pkgs.stdenv.drvPath - pkgs.bash.drvPath - pkgs.nixos-anywhere - pkgs.bubblewrap - ] ++ builtins.map (i: i.outPath) (builtins.attrValues self.inputs); - closureInfo = pkgs.closureInfo { rootPaths = dependencies; }; - # with Nix 2.24 we get: - # vm-test-run-test-installation> installer # error: sized: unexpected end-of-file - # vm-test-run-test-installation> installer # error: unexpected end-of-file - # This seems to be fixed with Nix 2.26 - # Remove this line once `pkgs.nix` is 2.26+ - nixPackage = - assert - lib.versionOlder pkgs.nix.version "2.26" - && lib.versionAtLeast pkgs.nixVersions.latest.version "2.26"; - pkgs.nixVersions.latest; - in { # On aarch64-linux, hangs on reboot with after installation: # vm-test-run-test-installation-> installer # [ 288.002871] reboot: Restarting system @@ -153,59 +195,41 @@ # vm-test-run-test-installation-> target: Guest root shell did not produce any data yet... # vm-test-run-test-installation-> target: To debug, enter the VM and run 'systemctl status backdoor.service'. checks = pkgs.lib.mkIf (pkgs.stdenv.isLinux && !pkgs.stdenv.isAarch64) { - test-installation = (import ../lib/test-base.nix) { - name = "test-installation"; + installation = (import ../lib/test-base.nix) { + name = "installation"; nodes.target = { services.openssh.enable = true; virtualisation.diskImage = "./target.qcow2"; virtualisation.useBootLoader = true; - nix.package = nixPackage; }; - nodes.installer = - { modulesPath, ... }: - { - imports = [ - (modulesPath + "/../tests/common/auto-format-root-device.nix") - ]; - networking.useNetworkd = true; - services.openssh.enable = true; - system.nixos.variant_id = "installer"; - environment.systemPackages = [ - self.packages.${pkgs.system}.clan-cli - pkgs.nixos-facter - ] ++ self.packages.${pkgs.system}.clan-cli.runtimeDependencies; - environment.etc."install-closure".source = "${closureInfo}/store-paths"; - virtualisation.emptyDiskImages = [ 512 ]; - virtualisation.diskSize = 8 * 1024; - virtualisation.rootDevice = "/dev/vdb"; - # both installer and target need to use the same diskImage - virtualisation.diskImage = "./target.qcow2"; - virtualisation.memorySize = 3048; - nix.package = nixPackage; - nix.settings = { - substituters = lib.mkForce [ ]; - hashed-mirrors = null; - connect-timeout = lib.mkForce 3; - flake-registry = pkgs.writeText "flake-registry" ''{"flakes":[],"version":2}''; - experimental-features = [ - "nix-command" - "flakes" - ]; - }; - users.users.nonrootuser = { - isNormalUser = true; - openssh.authorizedKeys.keyFiles = [ ../lib/ssh/pubkey ]; - extraGroups = [ "wheel" ]; - }; - security.sudo.wheelNeedsPassword = false; - system.extraDependencies = dependencies; - }; + nodes.installer = installer; testScript = '' installer.start() installer.succeed("${pkgs.coreutils}/bin/install -Dm 600 ${../lib/ssh/privkey} /root/.ssh/id_ed25519") + installer.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new -v nonrootuser@localhost hostname") + installer.succeed("cp -r ${../..} test-flake && chmod -R +w test-flake") + + installer.succeed("clan machines install --no-reboot --debug --flake test-flake --yes test-install-machine --target-host nonrootuser@localhost --update-hardware-config nixos-facter >&2") + + target.state_dir = installer.state_dir + target.start() + target.wait_for_unit("multi-user.target") + #@breakpoint() + #@result = target.succeed("cat /etc/install-successful").strip() + #@assert result == "ok", f"{result} != ok" + ''; + } { inherit pkgs self; }; + + update-hardware-configuration = (import ../lib/test-base.nix) { + name = "update-hardware-configuration"; + nodes.installer = installer; + + testScript = '' + installer.start() + installer.succeed("${pkgs.coreutils}/bin/install -Dm 600 ${../lib/ssh/privkey} /root/.ssh/id_ed25519") installer.wait_until_succeeds("timeout 2 ssh -o StrictHostKeyChecking=accept-new -v nonrootuser@localhost hostname") installer.succeed("cp -r ${../..} test-flake && chmod -R +w test-flake") installer.fail("test -f test-flake/machines/test-install-machine/hardware-configuration.nix") @@ -218,19 +242,6 @@ installer.succeed("clan machines update-hardware-config --debug --backend nixos-generate-config --flake test-flake test-install-machine nonrootuser@localhost>&2") installer.succeed("test -f test-flake/machines/test-install-machine/hardware-configuration.nix") installer.succeed("rm test-flake/machines/test-install-machine/hardware-configuration.nix") - - installer.succeed("clan machines install --debug --flake test-flake --yes test-install-machine --target-host nonrootuser@localhost --update-hardware-config nixos-facter >&2") - - try: - installer.shutdown() - except BrokenPipeError: - # qemu has already exited - pass - - target.state_dir = installer.state_dir - target.start() - target.wait_for_unit("multi-user.target") - assert(target.succeed("cat /etc/install-successful").strip() == "ok") ''; } { inherit pkgs self; }; };