Skip to content

Commit cd96421

Browse files
committed
nixos/k3s: refactor multi-node test
The refactoring parallelizes preliminary tasks like the node start and import of the pause image to speed up execution of the test. It also uniforms the usage of extraFlags for all nodes.
1 parent 7efd5be commit cd96421

File tree

1 file changed

+52
-68
lines changed

1 file changed

+52
-68
lines changed

nixos/tests/k3s/multi-node.nix

Lines changed: 52 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ import ../make-test-python.nix (
1616
socat
1717
];
1818
};
19-
pauseImage = pkgs.dockerTools.streamLayeredImage {
19+
pauseImage = pkgs.dockerTools.buildImage {
2020
name = "test.local/pause";
2121
tag = "local";
22-
contents = imageEnv;
22+
copyToRoot = imageEnv;
2323
config.Entrypoint = [
2424
"/bin/tini"
2525
"--"
@@ -75,6 +75,7 @@ import ../make-test-python.nix (
7575
enable = true;
7676
role = "server";
7777
package = k3s;
78+
images = [ pauseImage ];
7879
clusterInit = true;
7980
extraFlags = [
8081
"--disable coredns"
@@ -117,23 +118,17 @@ import ../make-test-python.nix (
117118
inherit tokenFile;
118119
enable = true;
119120
package = k3s;
121+
images = [ pauseImage ];
120122
serverAddr = "https://192.168.1.1:6443";
121123
clusterInit = false;
122-
extraFlags = builtins.toString [
123-
"--disable"
124-
"coredns"
125-
"--disable"
126-
"local-storage"
127-
"--disable"
128-
"metrics-server"
129-
"--disable"
130-
"servicelb"
131-
"--disable"
132-
"traefik"
133-
"--node-ip"
134-
"192.168.1.3"
135-
"--pause-image"
136-
"test.local/pause:local"
124+
extraFlags = [
125+
"--disable coredns"
126+
"--disable local-storage"
127+
"--disable metrics-server"
128+
"--disable servicelb"
129+
"--disable traefik"
130+
"--node-ip 192.168.1.3"
131+
"--pause-image test.local/pause:local"
137132
];
138133
};
139134
networking.firewall.allowedTCPPorts = [
@@ -163,12 +158,11 @@ import ../make-test-python.nix (
163158
enable = true;
164159
role = "agent";
165160
package = k3s;
161+
images = [ pauseImage ];
166162
serverAddr = "https://192.168.1.3:6443";
167-
extraFlags = lib.concatStringsSep " " [
168-
"--pause-image"
169-
"test.local/pause:local"
170-
"--node-ip"
171-
"192.168.1.2"
163+
extraFlags = [
164+
"--pause-image test.local/pause:local"
165+
"--node-ip 192.168.1.2"
172166
];
173167
};
174168
networking.firewall.allowedTCPPorts = [ 6443 ];
@@ -185,52 +179,42 @@ import ../make-test-python.nix (
185179
};
186180
};
187181

188-
testScript = ''
189-
machines = [server, server2, agent]
190-
for m in machines:
191-
m.start()
192-
m.wait_for_unit("k3s")
193-
194-
is_aarch64 = "${toString pkgs.stdenv.hostPlatform.isAarch64}" == "1"
195-
196-
# wait for the agent to show up
197-
server.wait_until_succeeds("k3s kubectl get node agent")
198-
199-
for m in machines:
200-
m.succeed("k3s check-config")
201-
m.succeed(
202-
"${pauseImage} | k3s ctr image import -"
203-
)
204-
205-
server.succeed("k3s kubectl cluster-info")
206-
# Also wait for our service account to show up; it takes a sec
207-
server.wait_until_succeeds("k3s kubectl get serviceaccount default")
208-
209-
# Now create a pod on each node via a daemonset and verify they can talk to each other.
210-
server.succeed("k3s kubectl apply -f ${networkTestDaemonset}")
211-
server.wait_until_succeeds(f'[ "$(k3s kubectl get ds test -o json | jq .status.numberReady)" -eq {len(machines)} ]')
212-
213-
# Get pod IPs
214-
pods = server.succeed("k3s kubectl get po -o json | jq '.items[].metadata.name' -r").splitlines()
215-
pod_ips = [server.succeed(f"k3s kubectl get po {name} -o json | jq '.status.podIP' -cr").strip() for name in pods]
216-
217-
# Verify each server can ping each pod ip
218-
for pod_ip in pod_ips:
219-
server.succeed(f"ping -c 1 {pod_ip}")
220-
agent.succeed(f"ping -c 1 {pod_ip}")
221-
222-
# Verify the pods can talk to each other
223-
resp = server.wait_until_succeeds(f"k3s kubectl exec {pods[0]} -- socat TCP:{pod_ips[1]}:8000 -")
224-
assert resp.strip() == "server"
225-
resp = server.wait_until_succeeds(f"k3s kubectl exec {pods[1]} -- socat TCP:{pod_ips[0]}:8000 -")
226-
assert resp.strip() == "server"
227-
228-
# Cleanup
229-
server.succeed("k3s kubectl delete -f ${networkTestDaemonset}")
230-
231-
for m in machines:
232-
m.shutdown()
233-
'';
182+
testScript = # python
183+
''
184+
start_all()
185+
186+
machines = [server, server2, agent]
187+
for m in machines:
188+
m.wait_for_unit("k3s")
189+
190+
# wait for the agent to show up
191+
server.wait_until_succeeds("k3s kubectl get node agent")
192+
193+
for m in machines:
194+
m.succeed("k3s check-config")
195+
196+
server.succeed("k3s kubectl cluster-info")
197+
# Also wait for our service account to show up; it takes a sec
198+
server.wait_until_succeeds("k3s kubectl get serviceaccount default")
199+
200+
# Now create a pod on each node via a daemonset and verify they can talk to each other.
201+
server.succeed("k3s kubectl apply -f ${networkTestDaemonset}")
202+
server.wait_until_succeeds(f'[ "$(k3s kubectl get ds test -o json | jq .status.numberReady)" -eq {len(machines)} ]')
203+
204+
# Get pod IPs
205+
pods = server.succeed("k3s kubectl get po -o json | jq '.items[].metadata.name' -r").splitlines()
206+
pod_ips = [server.succeed(f"k3s kubectl get po {name} -o json | jq '.status.podIP' -cr").strip() for name in pods]
207+
208+
# Verify each server can ping each pod ip
209+
for pod_ip in pod_ips:
210+
server.succeed(f"ping -c 1 {pod_ip}")
211+
server2.succeed(f"ping -c 1 {pod_ip}")
212+
agent.succeed(f"ping -c 1 {pod_ip}")
213+
# Verify the pods can talk to each other
214+
for pod in pods:
215+
resp = server.succeed(f"k3s kubectl exec {pod} -- socat TCP:{pod_ip}:8000 -")
216+
assert resp.strip() == "server"
217+
'';
234218

235219
meta.maintainers = lib.teams.k3s.members;
236220
}

0 commit comments

Comments
 (0)