1{ pkgs, lib, ... }:
2let
3 demo-program = pkgs.writeShellScriptBin "demo" ''
4 while ${pkgs.coreutils}/bin/sleep 3; do
5 echo Hello World > /dev/null
6 done
7 '';
8 demo-service = pkgs.writeText "demo.service" ''
9 [Unit]
10 Description=demo service
11 Requires=demo.socket
12 After=demo.socket
13
14 [Service]
15 Type=simple
16 ExecStart=${demo-program}/bin/demo
17 Restart=always
18
19 [Install]
20 WantedBy=multi-user.target
21 Also=demo.socket
22 '';
23 demo-socket = pkgs.writeText "demo.socket" ''
24 [Unit]
25 Description=demo socket
26
27 [Socket]
28 ListenStream=/run/demo.sock
29 SocketMode=0666
30
31 [Install]
32 WantedBy=sockets.target
33 '';
34 demo-portable = pkgs.portableService {
35 pname = "demo";
36 version = "1.0";
37 description = ''A demo "Portable Service" for a shell program built with nix'';
38 units = [
39 demo-service
40 demo-socket
41 ];
42 };
43in
44{
45
46 name = "systemd-portabled";
47 nodes.machine = { };
48 testScript = ''
49 machine.succeed("portablectl")
50 machine.wait_for_unit("systemd-portabled.service")
51 machine.succeed("portablectl attach --now --runtime ${demo-portable}/demo_1.0.raw")
52 machine.wait_for_unit("demo.service")
53 machine.succeed("portablectl detach --now --runtime demo_1.0")
54 machine.fail("systemctl status demo.service")
55 '';
56}