mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-29 18:33:00 +00:00
d506595e43
Although kubectl has builtin JSONpath support, it is only supported partially and the support varies between different versions. While using JSONpath in tests worked for some versions, it failed for others. This contribution replaces the problematic JSONpath usages with the jq JSON processor.
81 lines
3.2 KiB
Nix
81 lines
3.2 KiB
Nix
# A test that sets extra kubelet configuration and enables graceful node shutdown
|
|
import ../make-test-python.nix (
|
|
{
|
|
pkgs,
|
|
lib,
|
|
k3s,
|
|
...
|
|
}:
|
|
let
|
|
nodeName = "test";
|
|
shutdownGracePeriod = "1m13s";
|
|
shutdownGracePeriodCriticalPods = "13s";
|
|
podsPerCore = 3;
|
|
memoryThrottlingFactor = 0.69;
|
|
containerLogMaxSize = "5Mi";
|
|
in
|
|
{
|
|
name = "${k3s.name}-kubelet-config";
|
|
nodes.machine =
|
|
{ pkgs, ... }:
|
|
{
|
|
environment.systemPackages = [ pkgs.jq ];
|
|
|
|
# k3s uses enough resources the default vm fails.
|
|
virtualisation.memorySize = 1536;
|
|
virtualisation.diskSize = 4096;
|
|
|
|
services.k3s = {
|
|
enable = true;
|
|
package = k3s;
|
|
# Slightly reduce resource usage
|
|
extraFlags = [
|
|
"--disable coredns"
|
|
"--disable local-storage"
|
|
"--disable metrics-server"
|
|
"--disable servicelb"
|
|
"--disable traefik"
|
|
"--node-name ${nodeName}"
|
|
];
|
|
gracefulNodeShutdown = {
|
|
enable = true;
|
|
inherit shutdownGracePeriod shutdownGracePeriodCriticalPods;
|
|
};
|
|
extraKubeletConfig = {
|
|
inherit podsPerCore memoryThrottlingFactor containerLogMaxSize;
|
|
};
|
|
};
|
|
};
|
|
|
|
testScript = ''
|
|
import json
|
|
|
|
start_all()
|
|
machine.wait_for_unit("k3s")
|
|
# wait until the node is ready
|
|
machine.wait_until_succeeds(r"""kubectl get node ${nodeName} -ojson | jq -e '.status.conditions[] | select(.type == "Ready") | .status == "True"'""")
|
|
# test whether the kubelet registered an inhibitor lock
|
|
machine.succeed("systemd-inhibit --list --no-legend | grep \"kubelet.*k3s-server.*shutdown\"")
|
|
# run kubectl proxy in the background, close stdout through redirection to not wait for the command to finish
|
|
machine.execute("kubectl proxy --address 127.0.0.1 --port=8001 >&2 &")
|
|
machine.wait_until_succeeds("nc -z 127.0.0.1 8001")
|
|
# get the kubeletconfig
|
|
kubelet_config=json.loads(machine.succeed("curl http://127.0.0.1:8001/api/v1/nodes/${nodeName}/proxy/configz | jq '.kubeletconfig'"))
|
|
|
|
with subtest("Kubelet config values are set correctly"):
|
|
assert kubelet_config["shutdownGracePeriod"] == "${shutdownGracePeriod}", \
|
|
f"unexpected value for shutdownGracePeriod: {kubelet_config["shutdownGracePeriod"]}"
|
|
assert kubelet_config["shutdownGracePeriodCriticalPods"] == "${shutdownGracePeriodCriticalPods}", \
|
|
f"unexpected value for shutdownGracePeriodCriticalPods: {kubelet_config["shutdownGracePeriodCriticalPods"]}"
|
|
assert kubelet_config["podsPerCore"] == ${toString podsPerCore}, \
|
|
f"unexpected value for podsPerCore: {kubelet_config["podsPerCore"]}"
|
|
assert kubelet_config["memoryThrottlingFactor"] == ${toString memoryThrottlingFactor}, \
|
|
f"unexpected value for memoryThrottlingFactor: {kubelet_config["memoryThrottlingFactor"]}"
|
|
assert kubelet_config["containerLogMaxSize"] == "${containerLogMaxSize}", \
|
|
f"unexpected value for containerLogMaxSize: {kubelet_config["containerLogMaxSize"]}"
|
|
'';
|
|
|
|
meta.maintainers = lib.teams.k3s.members;
|
|
}
|
|
)
|