1{ pkgs, lib, ... }:
2
3let
4 incus-image = import ../release.nix {
5 configuration = {
6 # Building documentation makes the test unnecessarily take a longer time:
7 documentation.enable = lib.mkForce false;
8 };
9 };
10
11 incus-image-metadata =
12 incus-image.incusContainerMeta.${pkgs.stdenv.hostPlatform.system}
13 + "/tarball/nixos-image-lxc-*-${pkgs.stdenv.hostPlatform.system}.tar.xz";
14
15 incus-image-rootfs =
16 incus-image.incusContainerImage.${pkgs.stdenv.hostPlatform.system}
17 + "/nixos-lxc-image-${pkgs.stdenv.hostPlatform.system}.squashfs";
18
19in
20{
21 name = "lxd-image-server";
22
23 meta = with pkgs.lib.maintainers; {
24 maintainers = [
25 mkg20001
26 patryk27
27 ];
28 };
29
30 nodes.machine =
31 { lib, ... }:
32 {
33 virtualisation = {
34 cores = 2;
35
36 memorySize = 2048;
37 diskSize = 4096;
38
39 incus.enable = true;
40 };
41
42 # incus requires
43 networking.nftables.enable = true;
44
45 security.pki.certificates = [
46 (builtins.readFile ./common/acme/server/ca.cert.pem)
47 ];
48
49 services.nginx = {
50 enable = true;
51 };
52
53 services.lxd-image-server = {
54 enable = true;
55 nginx = {
56 enable = true;
57 domain = "acme.test";
58 };
59 };
60
61 services.nginx.virtualHosts."acme.test" = {
62 enableACME = false;
63 sslCertificate = ./common/acme/server/acme.test.cert.pem;
64 sslCertificateKey = ./common/acme/server/acme.test.key.pem;
65 };
66
67 networking.hosts = {
68 "::1" = [ "acme.test" ];
69 };
70 };
71
72 testScript = ''
73 machine.wait_for_unit("sockets.target")
74 machine.wait_for_unit("incus.service")
75
76 machine.succeed("incus admin waitready")
77 machine.succeed("incus admin init --minimal")
78
79 machine.succeed(
80 "incus image import ${incus-image-metadata} ${incus-image-rootfs} --alias nixos"
81 )
82
83 loc = "/var/www/simplestreams/images/iats/nixos/amd64/default/v1"
84
85 with subtest("push image to server"):
86 machine.succeed("incus launch nixos test")
87 machine.sleep(5)
88 machine.succeed("incus stop -f test")
89 machine.succeed("incus publish --public test --alias=testimg")
90 machine.succeed("incus image export testimg")
91 machine.succeed("ls >&2")
92 machine.succeed("mkdir -p " + loc)
93 machine.succeed("mv *.tar.gz " + loc)
94
95 with subtest("pull image from server"):
96 machine.succeed("incus remote add img https://acme.test --protocol=simplestreams")
97 machine.succeed("incus image list img: >&2")
98 '';
99}