1{ lib, ... }:
2{
3 name = "systemd-capsules";
4
5 meta.maintainers = with lib.maintainers; [ fpletz ];
6
7 nodes.machine =
8 { pkgs, ... }:
9 {
10 environment.systemPackages = [ pkgs.hello ];
11 systemd.user.services.alice-sleep = {
12 wantedBy = [ "capsule@alice.target" ];
13 serviceConfig = {
14 ExecStart = "${pkgs.coreutils}/bin/sleep 999";
15 };
16 };
17 };
18
19 testScript = # python
20 ''
21 machine.wait_for_unit("multi-user.target")
22
23 with subtest("capsule setup"):
24 machine.succeed("systemctl start capsule@alice.service")
25
26 with subtest("imperative user service in capsule"):
27 machine.succeed("systemd-run --capsule=alice --unit=sleeptest.service /run/current-system/sw/bin/sleep 999")
28 machine.succeed("systemctl --capsule=alice status sleeptest.service")
29
30 with subtest("declarative user service in capsule"):
31 machine.succeed("systemctl --capsule=alice status alice-sleep.service")
32 machine.succeed("systemctl --capsule=alice stop alice-sleep.service")
33 machine.fail("systemctl --capsule=alice status alice-sleep.service")
34 machine.succeed("systemctl --capsule=alice start alice-sleep.service")
35 machine.succeed("systemctl --capsule=alice status alice-sleep.service")
36
37 with subtest("interactive shell with terminal in capsule"):
38 hello_output = machine.succeed("systemd-run -t --capsule=alice /run/current-system/sw/bin/bash -i -c 'hello | tee ~/hello'")
39 assert hello_output == "Hello, world!\r\n"
40 machine.copy_from_vm("/var/lib/capsules/alice/hello")
41
42 with subtest("capsule cleanup"):
43 machine.succeed("systemctl --capsule=alice stop sleeptest.service")
44 machine.succeed("systemctl stop capsule@alice.service")
45 machine.succeed("systemctl clean --all capsule@alice.service")
46 '';
47}