about summary refs log tree commit diff
path: root/nixos/tests/switch-test.nix
diff options
context:
space:
mode:
authorMichael Weiss <dev.primeos@gmail.com>2021-11-27 17:14:55 +0100
committerMichael Weiss <dev.primeos@gmail.com>2021-11-27 17:22:22 +0100
commit1cfecb636b14a88174d914cd0522b78ff3bf9f82 (patch)
tree68f3b11a71e557e2c23e452344c929ec63ae01ab /nixos/tests/switch-test.nix
parent549025bbedac9080a513507a263a6c06326be62c (diff)
Revert "Merge pull request #141192 from helsinki-systems/feat/improved-socket-handling2"
This reverts commit 57961d2b838cc31fa4ce89641b6a8db544a8471a, reversing
changes made to b04f913afce4419f6b777fd64ac52315dbef3aaf.
(I.e. this reverts PR #141192.)

While well-intended, this change does unfortunately introduce very
serious regressions that are especially disruptive/noticeable on desktop
systems (e.g. users of Sway will loose their graphical session when
running "nixos-rebuild switch").

Therefore, this change has to be reverted ASAP instead of trying to fix
it in "production".
Note: An updated version should be extensively discussed, reviewed, and
tested before re-landing this change as an earlier version also had to
be reverted for the exact same issues [0].

Fix: #146727

[0]: https://github.com/NixOS/nixpkgs/pull/73871#issuecomment-559783752
Diffstat (limited to 'nixos/tests/switch-test.nix')
-rw-r--r--nixos/tests/switch-test.nix386
1 files changed, 3 insertions, 383 deletions
diff --git a/nixos/tests/switch-test.nix b/nixos/tests/switch-test.nix
index 7ea07a390b808..78adf7ffa7da5 100644
--- a/nixos/tests/switch-test.nix
+++ b/nixos/tests/switch-test.nix
@@ -7,224 +7,15 @@ import ./make-test-python.nix ({ pkgs, ...} : {
   };
 
   nodes = {
-    machine = { config, pkgs, lib, ... }: {
-      environment.systemPackages = [ pkgs.socat ]; # for the socket activation stuff
+    machine = { ... }: {
       users.mutableUsers = false;
-
-      specialisation = {
-        # A system with a simple socket-activated unit
-        simple-socket.configuration = {
-          systemd.services.socket-activated.serviceConfig = {
-            ExecStart = pkgs.writeScript "socket-test.py" /* python */ ''
-              #!${pkgs.python3}/bin/python3
-
-              from socketserver import TCPServer, StreamRequestHandler
-              import socket
-
-              class Handler(StreamRequestHandler):
-                  def handle(self):
-                      self.wfile.write("hello".encode("utf-8"))
-
-              class Server(TCPServer):
-                  def __init__(self, server_address, handler_cls):
-                      # Invoke base but omit bind/listen steps (performed by systemd activation!)
-                      TCPServer.__init__(
-                          self, server_address, handler_cls, bind_and_activate=False)
-                      # Override socket
-                      self.socket = socket.fromfd(3, self.address_family, self.socket_type)
-
-              if __name__ == "__main__":
-                  server = Server(("localhost", 1234), Handler)
-                  server.serve_forever()
-            '';
-          };
-          systemd.sockets.socket-activated = {
-            wantedBy = [ "sockets.target" ];
-            listenStreams = [ "/run/test.sock" ];
-            socketConfig.SocketMode = lib.mkDefault "0777";
-          };
-        };
-
-        # The same system but the socket is modified
-        modified-socket.configuration = {
-          imports = [ config.specialisation.simple-socket.configuration ];
-          systemd.sockets.socket-activated.socketConfig.SocketMode = "0666";
-        };
-
-        # The same system but the service is modified
-        modified-service.configuration = {
-          imports = [ config.specialisation.simple-socket.configuration ];
-          systemd.services.socket-activated.serviceConfig.X-Test = "test";
-        };
-
-        # The same system but both service and socket are modified
-        modified-service-and-socket.configuration = {
-          imports = [ config.specialisation.simple-socket.configuration ];
-          systemd.services.socket-activated.serviceConfig.X-Test = "some_value";
-          systemd.sockets.socket-activated.socketConfig.SocketMode = "0444";
-        };
-
-        # A system with a socket-activated service and some simple services
-        service-and-socket.configuration = {
-          imports = [ config.specialisation.simple-socket.configuration ];
-          systemd.services.simple-service = {
-            wantedBy = [ "multi-user.target" ];
-            serviceConfig = {
-              Type = "oneshot";
-              RemainAfterExit = true;
-              ExecStart = "${pkgs.coreutils}/bin/true";
-            };
-          };
-
-          systemd.services.simple-restart-service = {
-            stopIfChanged = false;
-            wantedBy = [ "multi-user.target" ];
-            serviceConfig = {
-              Type = "oneshot";
-              RemainAfterExit = true;
-              ExecStart = "${pkgs.coreutils}/bin/true";
-            };
-          };
-
-          systemd.services.simple-reload-service = {
-            reloadIfChanged = true;
-            wantedBy = [ "multi-user.target" ];
-            serviceConfig = {
-              Type = "oneshot";
-              RemainAfterExit = true;
-              ExecStart = "${pkgs.coreutils}/bin/true";
-              ExecReload = "${pkgs.coreutils}/bin/true";
-            };
-          };
-
-          systemd.services.no-restart-service = {
-            restartIfChanged = false;
-            wantedBy = [ "multi-user.target" ];
-            serviceConfig = {
-              Type = "oneshot";
-              RemainAfterExit = true;
-              ExecStart = "${pkgs.coreutils}/bin/true";
-            };
-          };
-        };
-
-        # The same system but with an activation script that restarts all services
-        restart-and-reload-by-activation-script.configuration = {
-          imports = [ config.specialisation.service-and-socket.configuration ];
-          system.activationScripts.restart-and-reload-test = {
-            supportsDryActivation = true;
-            deps = [];
-            text = ''
-              if [ "$NIXOS_ACTION" = dry-activate ]; then
-                f=/run/nixos/dry-activation-restart-list
-              else
-                f=/run/nixos/activation-restart-list
-              fi
-              cat <<EOF >> "$f"
-              simple-service.service
-              simple-restart-service.service
-              simple-reload-service.service
-              no-restart-service.service
-              socket-activated.service
-              EOF
-            '';
-          };
-        };
-
-        # A system with a timer
-        with-timer.configuration = {
-          systemd.timers.test-timer = {
-            wantedBy = [ "timers.target" ];
-            timerConfig.OnCalendar = "@1395716396"; # chosen by fair dice roll
-          };
-          systemd.services.test-timer = {
-            serviceConfig = {
-              Type = "oneshot";
-              ExecStart = "${pkgs.coreutils}/bin/true";
-            };
-          };
-        };
-
-        # The same system but with another time
-        with-timer-modified.configuration = {
-          imports = [ config.specialisation.with-timer.configuration ];
-          systemd.timers.test-timer.timerConfig.OnCalendar = lib.mkForce "Fri 2012-11-23 16:00:00";
-        };
-
-        # A system with a systemd mount
-        with-mount.configuration = {
-          systemd.mounts = [
-            {
-              description = "Testmount";
-              what = "tmpfs";
-              type = "tmpfs";
-              where = "/testmount";
-              options = "size=1M";
-              wantedBy = [ "local-fs.target" ];
-            }
-          ];
-        };
-
-        # The same system but with another time
-        with-mount-modified.configuration = {
-          systemd.mounts = [
-            {
-              description = "Testmount";
-              what = "tmpfs";
-              type = "tmpfs";
-              where = "/testmount";
-              options = "size=10M";
-              wantedBy = [ "local-fs.target" ];
-            }
-          ];
-        };
-
-        # A system with a path unit
-        with-path.configuration = {
-          systemd.paths.test-watch = {
-            wantedBy = [ "paths.target" ];
-            pathConfig.PathExists = "/testpath";
-          };
-          systemd.services.test-watch = {
-            serviceConfig = {
-              Type = "oneshot";
-              ExecStart = "${pkgs.coreutils}/bin/touch /testpath-modified";
-            };
-          };
-        };
-
-        # The same system but watching another file
-        with-path-modified.configuration = {
-          imports = [ config.specialisation.with-path.configuration ];
-          systemd.paths.test-watch.pathConfig.PathExists = lib.mkForce "/testpath2";
-        };
-
-        # A system with a slice
-        with-slice.configuration = {
-          systemd.slices.testslice.sliceConfig.MemoryMax = "1"; # don't allow memory allocation
-          systemd.services.testservice = {
-            serviceConfig = {
-              Type = "oneshot";
-              RemainAfterExit = true;
-              ExecStart = "${pkgs.coreutils}/bin/true";
-              Slice = "testslice.slice";
-            };
-          };
-        };
-
-        # The same system but the slice allows to allocate memory
-        with-slice-non-crashing.configuration = {
-          imports = [ config.specialisation.with-slice.configuration ];
-          systemd.slices.testslice.sliceConfig.MemoryMax = lib.mkForce null;
-        };
-      };
     };
     other = { ... }: {
       users.mutableUsers = true;
     };
   };
 
-  testScript = { nodes, ... }: let
+  testScript = {nodes, ...}: let
     originalSystem = nodes.machine.config.system.build.toplevel;
     otherSystem = nodes.other.config.system.build.toplevel;
 
@@ -236,183 +27,12 @@ import ./make-test-python.nix ({ pkgs, ...} : {
       set -o pipefail
       exec env -i "$@" | tee /dev/stderr
     '';
-  in /* python */ ''
-    def switch_to_specialisation(name, action="test"):
-        out = machine.succeed(f"${originalSystem}/specialisation/{name}/bin/switch-to-configuration {action} 2>&1")
-        assert_lacks(out, "switch-to-configuration line")  # Perl warnings
-        return out
-
-    def assert_contains(haystack, needle):
-        if needle not in haystack:
-            print("The haystack that will cause the following exception is:")
-            print("---")
-            print(haystack)
-            print("---")
-            raise Exception(f"Expected string '{needle}' was not found")
-
-    def assert_lacks(haystack, needle):
-        if needle in haystack:
-            print("The haystack that will cause the following exception is:")
-            print("---")
-            print(haystack, end="")
-            print("---")
-            raise Exception(f"Unexpected string '{needle}' was found")
-
-
+  in ''
     machine.succeed(
         "${stderrRunner} ${originalSystem}/bin/switch-to-configuration test"
     )
     machine.succeed(
         "${stderrRunner} ${otherSystem}/bin/switch-to-configuration test"
     )
-
-    with subtest("systemd sockets"):
-        machine.succeed("${originalSystem}/bin/switch-to-configuration test")
-
-        # Simple socket is created
-        out = switch_to_specialisation("simple-socket")
-        assert_lacks(out, "stopping the following units:")
-        # not checking for reload because dbus gets reloaded
-        assert_lacks(out, "restarting the following units:")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_contains(out, "the following new units were started: socket-activated.socket\n")
-        assert_lacks(out, "as well:")
-        machine.succeed("[ $(stat -c%a /run/test.sock) = 777 ]")
-
-        # Changing the socket restarts it
-        out = switch_to_specialisation("modified-socket")
-        assert_lacks(out, "stopping the following units:")
-        #assert_lacks(out, "reloading the following units:")
-        assert_contains(out, "restarting the following units: socket-activated.socket\n")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_lacks(out, "the following new units were started:")
-        assert_lacks(out, "as well:")
-        machine.succeed("[ $(stat -c%a /run/test.sock) = 666 ]")  # change was applied
-
-        # The unit is properly activated when the socket is accessed
-        if machine.succeed("socat - UNIX-CONNECT:/run/test.sock") != "hello":
-            raise Exception("Socket was not properly activated")
-
-        # Changing the socket restarts it and ignores the active service
-        out = switch_to_specialisation("simple-socket")
-        assert_contains(out, "stopping the following units: socket-activated.service\n")
-        assert_lacks(out, "reloading the following units:")
-        assert_contains(out, "restarting the following units: socket-activated.socket\n")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_lacks(out, "the following new units were started:")
-        assert_lacks(out, "as well:")
-        machine.succeed("[ $(stat -c%a /run/test.sock) = 777 ]")  # change was applied
-
-        # Changing the service does nothing when the service is not active
-        out = switch_to_specialisation("modified-service")
-        assert_lacks(out, "stopping the following units:")
-        assert_lacks(out, "reloading the following units:")
-        assert_lacks(out, "restarting the following units:")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_lacks(out, "the following new units were started:")
-        assert_lacks(out, "as well:")
-
-        # Activating the service and modifying it stops it but leaves the socket untouched
-        machine.succeed("socat - UNIX-CONNECT:/run/test.sock")
-        out = switch_to_specialisation("simple-socket")
-        assert_contains(out, "stopping the following units: socket-activated.service\n")
-        assert_lacks(out, "reloading the following units:")
-        assert_lacks(out, "restarting the following units:")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_lacks(out, "the following new units were started:")
-        assert_lacks(out, "as well:")
-
-        # Activating the service and both the service and the socket stops the service and restarts the socket
-        machine.succeed("socat - UNIX-CONNECT:/run/test.sock")
-        out = switch_to_specialisation("modified-service-and-socket")
-        assert_contains(out, "stopping the following units: socket-activated.service\n")
-        assert_lacks(out, "reloading the following units:")
-        assert_contains(out, "restarting the following units: socket-activated.socket\n")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_lacks(out, "the following new units were started:")
-        assert_lacks(out, "as well:")
-
-    with subtest("restart and reload by activation file"):
-        out = switch_to_specialisation("service-and-socket")
-        # Switch to a system where the example services get restarted
-        # by the activation script
-        out = switch_to_specialisation("restart-and-reload-by-activation-script")
-        assert_lacks(out, "stopping the following units:")
-        assert_contains(out, "stopping the following units as well: simple-service.service, socket-activated.service\n")
-        assert_contains(out, "reloading the following units: simple-reload-service.service\n")
-        assert_contains(out, "restarting the following units: simple-restart-service.service\n")
-        assert_contains(out, "\nstarting the following units: simple-service.service")
-
-        # The same, but in dry mode
-        switch_to_specialisation("service-and-socket")
-        out = switch_to_specialisation("restart-and-reload-by-activation-script", action="dry-activate")
-        assert_lacks(out, "would stop the following units:")
-        assert_contains(out, "would stop the following units as well: simple-service.service, socket-activated.service\n")
-        assert_contains(out, "would reload the following units: simple-reload-service.service\n")
-        assert_contains(out, "would restart the following units: simple-restart-service.service\n")
-        assert_contains(out, "\nwould start the following units: simple-service.service")
-
-    with subtest("mounts"):
-        switch_to_specialisation("with-mount")
-        out = machine.succeed("mount | grep 'on /testmount'")
-        assert_contains(out, "size=1024k")
-
-        out = switch_to_specialisation("with-mount-modified")
-        assert_lacks(out, "stopping the following units:")
-        assert_contains(out, "reloading the following units: testmount.mount\n")
-        assert_lacks(out, "restarting the following units:")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_lacks(out, "the following new units were started:")
-        assert_lacks(out, "as well:")
-        # It changed
-        out = machine.succeed("mount | grep 'on /testmount'")
-        assert_contains(out, "size=10240k")
-
-    with subtest("timers"):
-        switch_to_specialisation("with-timer")
-        out = machine.succeed("systemctl show test-timer.timer")
-        assert_contains(out, "OnCalendar=2014-03-25 02:59:56 UTC")
-
-        out = switch_to_specialisation("with-timer-modified")
-        assert_lacks(out, "stopping the following units:")
-        assert_lacks(out, "reloading the following units:")
-        assert_contains(out, "restarting the following units: test-timer.timer\n")
-        assert_lacks(out, "\nstarting the following units:")
-        assert_lacks(out, "the following new units were started:")
-        assert_lacks(out, "as well:")
-        # It changed
-        out = machine.succeed("systemctl show test-timer.timer")
-        assert_contains(out, "OnCalendar=Fri 2012-11-23 16:00:00")
-
-    with subtest("paths"):
-        switch_to_specialisation("with-path")
-        machine.fail("test -f /testpath-modified")
-
-        # touch the file, unit should be triggered
-        machine.succeed("touch /testpath")
-        machine.wait_until_succeeds("test -f /testpath-modified")
-
-        machine.succeed("rm /testpath")
-        machine.succeed("rm /testpath-modified")
-        switch_to_specialisation("with-path-modified")
-
-        machine.succeed("touch /testpath")
-        machine.fail("test -f /testpath-modified")
-        machine.succeed("touch /testpath2")
-        machine.wait_until_succeeds("test -f /testpath-modified")
-
-    # This test ensures that changes to slice configuration get applied.
-    # We test this by having a slice that allows no memory allocation at
-    # all and starting a service within it. If the service crashes, the slice
-    # is applied and if we modify the slice to allow memory allocation, the
-    # service should successfully start.
-    with subtest("slices"):
-        machine.succeed("echo 0 > /proc/sys/vm/panic_on_oom")  # allow OOMing
-        out = switch_to_specialisation("with-slice")
-        machine.fail("systemctl start testservice.service")
-        out = switch_to_specialisation("with-slice-non-crashing")
-        machine.succeed("systemctl start testservice.service")
-        machine.succeed("echo 1 > /proc/sys/vm/panic_on_oom")  # disallow OOMing
-
   '';
 })