1import ../make-test-python.nix (
2 {
3 pkgs,
4 lib,
5 rke2,
6 ...
7 }:
8 let
9 throwSystem = throw "RKE2: Unsupported system: ${pkgs.stdenv.hostPlatform.system}";
10 coreImages =
11 {
12 aarch64-linux = rke2.images-core-linux-arm64-tar-zst;
13 x86_64-linux = rke2.images-core-linux-amd64-tar-zst;
14 }
15 .${pkgs.stdenv.hostPlatform.system} or throwSystem;
16 canalImages =
17 {
18 aarch64-linux = rke2.images-canal-linux-arm64-tar-zst;
19 x86_64-linux = rke2.images-canal-linux-amd64-tar-zst;
20 }
21 .${pkgs.stdenv.hostPlatform.system} or throwSystem;
22 helloImage = pkgs.dockerTools.buildImage {
23 name = "test.local/hello";
24 tag = "local";
25 compressor = "zstd";
26 copyToRoot = pkgs.hello;
27 config.Entrypoint = [ "${pkgs.hello}/bin/hello" ];
28 };
29 testJobYaml = pkgs.writeText "test.yaml" ''
30 apiVersion: batch/v1
31 kind: Job
32 metadata:
33 name: test
34 spec:
35 template:
36 spec:
37 containers:
38 - name: test
39 image: "test.local/hello:local"
40 restartPolicy: Never
41 '';
42 in
43 {
44 name = "${rke2.name}-single-node";
45 meta.maintainers = rke2.meta.maintainers;
46 nodes.machine =
47 {
48 config,
49 nodes,
50 pkgs,
51 ...
52 }:
53 {
54 # Setup image archives to be imported by rke2
55 systemd.tmpfiles.settings."10-rke2" = {
56 "/var/lib/rancher/rke2/agent/images/rke2-images-core.tar.zst" = {
57 "L+".argument = "${coreImages}";
58 };
59 "/var/lib/rancher/rke2/agent/images/rke2-images-canal.tar.zst" = {
60 "L+".argument = "${canalImages}";
61 };
62 "/var/lib/rancher/rke2/agent/images/hello.tar.zst" = {
63 "L+".argument = "${helloImage}";
64 };
65 };
66
67 # RKE2 needs more resources than the default
68 virtualisation.cores = 4;
69 virtualisation.memorySize = 4096;
70 virtualisation.diskSize = 8092;
71
72 services.rke2 = {
73 enable = true;
74 role = "server";
75 package = rke2;
76 # Without nodeIP the apiserver starts with the wrong service IP family
77 nodeIP = config.networking.primaryIPAddress;
78 # Slightly reduce resource consumption
79 disable = [
80 "rke2-coredns"
81 "rke2-metrics-server"
82 "rke2-ingress-nginx"
83 "rke2-snapshot-controller"
84 "rke2-snapshot-controller-crd"
85 "rke2-snapshot-validation-webhook"
86 ];
87 };
88 };
89
90 testScript =
91 let
92 kubectl = "${pkgs.kubectl}/bin/kubectl --kubeconfig=/etc/rancher/rke2/rke2.yaml";
93 in
94 # python
95 ''
96 start_all()
97
98 machine.wait_for_unit("rke2-server")
99 machine.succeed("${kubectl} cluster-info")
100
101 machine.wait_until_succeeds("${kubectl} get serviceaccount default")
102 machine.succeed("${kubectl} apply -f ${testJobYaml}")
103 machine.wait_until_succeeds("${kubectl} wait --for 'condition=complete' job/test")
104 output = machine.succeed("${kubectl} logs -l batch.kubernetes.io/job-name=test")
105 assert output.rstrip() == "Hello, world!", f"unexpected output of test job: {output}"
106 '';
107 }
108)