Unverified Commit fb5f54e0 authored by Ramses's avatar Ramses Committed by GitHub
Browse files

nixos: replace container activation scripts (#499313)

parents cf6e375c 61425f10
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -13,18 +13,24 @@
    ];
  };

  # copy the config for nixos-rebuild
  system.activationScripts.config =
  # Create a default configuration.nix on first boot so nixos-rebuild works
  # out of the box.
  systemd.services.incus-create-nixos-config =
    let
      config = pkgs.replaceVars ./incus-container-image-inner.nix {
      configFile = pkgs.replaceVars ./incus-container-image-inner.nix {
        stateVersion = lib.trivial.release;
      };
    in
    ''
      if [ ! -e /etc/nixos/configuration.nix ]; then
        install -m 0644 -D ${config} /etc/nixos/configuration.nix
      fi
    '';
    {
      description = "Create default NixOS configuration for Incus";
      wantedBy = [ "multi-user.target" ];
      unitConfig.ConditionPathExists = "!/etc/nixos/configuration.nix";
      serviceConfig = {
        Type = "oneshot";
        RemainAfterExit = true;
        ExecStart = "${pkgs.coreutils}/bin/install -m 0644 -D ${configFile} /etc/nixos/configuration.nix";
      };
    };

  networking = {
    dhcpcd.enable = false;
+14 −8
Original line number Diff line number Diff line
@@ -13,18 +13,24 @@
    ];
  };

  # copy the config for nixos-rebuild
  system.activationScripts.config =
  # Create a default configuration.nix on first boot so nixos-rebuild works
  # out of the box.
  systemd.services.incus-create-nixos-config =
    let
      config = pkgs.replaceVars ./incus-virtual-machine-image-inner.nix {
      configFile = pkgs.replaceVars ./incus-virtual-machine-image-inner.nix {
        stateVersion = lib.trivial.release;
      };
    in
    ''
      if [ ! -e /etc/nixos/configuration.nix ]; then
        install -m 0644 -D ${config} /etc/nixos/configuration.nix
      fi
    '';
    {
      description = "Create default NixOS configuration for Incus";
      wantedBy = [ "multi-user.target" ];
      unitConfig.ConditionPathExists = "!/etc/nixos/configuration.nix";
      serviceConfig = {
        Type = "oneshot";
        RemainAfterExit = true;
        ExecStart = "${pkgs.coreutils}/bin/install -m 0644 -D ${configFile} /etc/nixos/configuration.nix";
      };
    };

  # Network
  networking = {
+4 −3
Original line number Diff line number Diff line
@@ -79,8 +79,9 @@ in
    '';
  };

  # Install new init script
  system.activationScripts.installInitScript = ''
    ln -fs $systemConfig/init /init
  # Update /init symlink when switching configurations so the container
  # boots the new system on restart.
  system.build.installBootLoader = pkgs.writeShellScript "install-docker-init" ''
    ${pkgs.coreutils}/bin/ln -fs "$1/init" /init
  '';
}
+0 −3
Original line number Diff line number Diff line
@@ -136,8 +136,5 @@

      systemd.packages = [ pkgs.distrobuilder.generator ];

      system.activationScripts.installInitScript = lib.mkForce ''
        ln -fs $systemConfig/init /sbin/init
      '';
    };
}
+25 −0
Original line number Diff line number Diff line
@@ -156,6 +156,16 @@ in

                      server.succeed(f"incus exec {instance_name} -- test -e /dev/tpm0")
                      server.succeed(f"incus exec {instance_name} -- test -e /dev/tpmrm0")

                  with subtest("[${image_id}] default configuration.nix is created on first boot"):
                      server.succeed(f"incus exec {instance_name} -- test -f /etc/nixos/configuration.nix")

                  with subtest("[${image_id}] configuration.nix create service does not overwrite existing config"):
                      server.succeed(f"incus exec {instance_name} -- systemctl restart incus-create-nixos-config.service")
                      status = server.succeed(
                          f"incus exec {instance_name} -- systemctl show -p ActiveState incus-create-nixos-config.service"
                      ).strip()
                      assert "inactive" in status, f"Expected inactive (ConditionPathExists should prevent start), got {status}"
                ''
                #
                # container specific
@@ -164,6 +174,21 @@ in
                  lib.optionalString (config.type == "container")
                    # python
                    ''
                      with subtest("[${image_id}] switch-to-configuration updates /sbin/init via installBootLoader"):
                          # Remove /sbin/init so we can verify installBootLoader recreates it
                          server.succeed(f"incus exec {instance_name} -- rm -f /sbin/init")
                          server.fail(f"incus exec {instance_name} -- test -e /sbin/init")

                          server.succeed(
                              f"incus exec {instance_name} -- /run/current-system/bin/switch-to-configuration switch"
                          )

                          # Verify installBootLoader recreated /sbin/init pointing to the system's init
                          server.succeed(f"incus exec {instance_name} -- test -x /sbin/init")
                          target = server.succeed(f"incus exec {instance_name} -- readlink -f /sbin/init").strip()
                          current = server.succeed(f"incus exec {instance_name} -- readlink -f /run/current-system/init").strip()
                          assert target == current, f"/sbin/init -> {target}, expected {current}"

                      # TODO troubleshoot VM hot memory resizing which was introduced in 6.12
                      with subtest("[${image_id}] memory limits can be hotplug changed"):
                          server.set_instance_config(instance_name, "limits.memory 512MB")