From f2faac4d0c430e18f1c14376ed626af9329900ce Mon Sep 17 00:00:00 2001 From: Robert Rose Date: Mon, 18 Aug 2025 22:00:47 +0200 Subject: [PATCH] k3s: simplify airgap images passthru This reduces the filtering and renaming of airgap images archives to make the update script and builder more resilient to upstream changes. Additionally, it reduces the code of the k3s builder. --- doc/release-notes/rl-2511.section.md | 7 +++ nixos/tests/k3s/airgap-images.nix | 10 +--- .../cluster/k3s/1_30/images-versions.json | 22 ++++++--- .../cluster/k3s/1_31/images-versions.json | 22 ++++++--- .../cluster/k3s/1_32/images-versions.json | 22 ++++++--- .../cluster/k3s/1_33/images-versions.json | 22 ++++++--- .../networking/cluster/k3s/builder.nix | 48 ++++++------------- .../networking/cluster/k3s/update-script.sh | 12 ++--- 8 files changed, 87 insertions(+), 78 deletions(-) diff --git a/doc/release-notes/rl-2511.section.md b/doc/release-notes/rl-2511.section.md index a62e6bc0c001..968056e2acb5 100644 --- a/doc/release-notes/rl-2511.section.md +++ b/doc/release-notes/rl-2511.section.md @@ -59,6 +59,13 @@ - `ansible-later` has been removed because it was discontinued by the author. +- `k3s` airgap images passthru attributes have changed: + - `imagesList` was removed + - `airgapImages` was renamed to `airgap-images` + - `airgapImagesAmd64` was renamed to `airgap-images-amd64-tar-zst` + - `airgapImagesArm64` was renamed to `airgap-images-arm64-tar-zst` + - `airgapImagesArm` was renamed to `airgap-images-arm-tar-zst` + - `stalwart-mail` since `0.13.0` "introduces a significant redesign of the MTA’s delivery and queueing subsystem". See [the upgrading announcement for the `0.13.0` release](https://github.com/stalwartlabs/stalwart/blob/89b561b5ca1c5a11f2a768b4a2cfef0f473b7a01/UPGRADING.md#upgrading-from-v012x-and-v011x-to-v013x). - Greetd and its original greeters (`tuigreet`, `gtkgreet`, `qtgreet`, `regreet`, `wlgreet`) were moved from `greetd` namespace to top level (`greetd.tuigreet` -> `tuigreet`, `greetd.greetd` -> `greetd`, etc). The original attrs are available for compatibility as passthrus of `greetd`, but will emit a warning. They will be removed in future releases. diff --git a/nixos/tests/k3s/airgap-images.nix b/nixos/tests/k3s/airgap-images.nix index 84a535feb7fc..79fd2c77025b 100644 --- a/nixos/tests/k3s/airgap-images.nix +++ b/nixos/tests/k3s/airgap-images.nix @@ -22,21 +22,13 @@ import ../make-test-python.nix ( "--disable servicelb" "--disable traefik" ]; - images = [ k3s.airgapImages ]; + images = [ k3s.airgap-images ]; }; }; testScript = '' - import json - - start_all() machine.wait_for_unit("k3s") machine.wait_until_succeeds("journalctl -r --no-pager -u k3s | grep \"Imported images from /var/lib/rancher/k3s/agent/images/\"") - images = json.loads(machine.succeed("crictl img -o json")) - image_names = [i["repoTags"][0] for i in images["images"]] - with open("${k3s.imagesList}") as expected_images: - for line in expected_images: - assert line.rstrip() in image_names, f"The image {line.rstrip()} is not present in the airgap images archive" ''; } ) diff --git a/pkgs/applications/networking/cluster/k3s/1_30/images-versions.json b/pkgs/applications/networking/cluster/k3s/1_30/images-versions.json index c37737fbbfd6..9ec9d1b5d8a2 100644 --- a/pkgs/applications/networking/cluster/k3s/1_30/images-versions.json +++ b/pkgs/applications/networking/cluster/k3s/1_30/images-versions.json @@ -1,18 +1,26 @@ { - "airgap-images-amd64": { + "airgap-images-amd64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-amd64.tar.gz", + "sha256": "f98a57f7b25a4537096fbe9755f96cfd05bfe6fc6315f111c0f44e1abf4aad6d" + }, + "airgap-images-amd64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-amd64.tar.zst", "sha256": "9bda99cde833c4e13fb4d35fa46fd57d4b1a2eefc33e00fa352ce686c871c842" }, - "airgap-images-arm": { + "airgap-images-arm-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm.tar.gz", + "sha256": "33df3a2b155118198c48e66426a04292a348aa53fef126a3cb8e4fe7aea83ccc" + }, + "airgap-images-arm-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm.tar.zst", "sha256": "d40a78ff14b40547bca6d05db3d7e767b272bb9257628ebd3905d1659bc49bd5" }, - "airgap-images-arm64": { + "airgap-images-arm64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm64.tar.gz", + "sha256": "bba9c2e417ece797a5ae8bf9346bb35dc8ab163828c801a2cb512d6097610b52" + }, + "airgap-images-arm64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-airgap-images-arm64.tar.zst", "sha256": "6561f91f14c8419c9d1c20fb9af7948757d87bd91855b376058d9f2e16010452" - }, - "images-list": { - "url": "https://github.com/k3s-io/k3s/releases/download/v1.30.14%2Bk3s2/k3s-images.txt", - "sha256": "1f87ad26acac5e553279a64942c0e3eeef5c026cc2f82661d358990848672584" } } diff --git a/pkgs/applications/networking/cluster/k3s/1_31/images-versions.json b/pkgs/applications/networking/cluster/k3s/1_31/images-versions.json index 3eb41c7c1b00..8ea08a211171 100644 --- a/pkgs/applications/networking/cluster/k3s/1_31/images-versions.json +++ b/pkgs/applications/networking/cluster/k3s/1_31/images-versions.json @@ -1,18 +1,26 @@ { - "airgap-images-amd64": { + "airgap-images-amd64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-amd64.tar.gz", + "sha256": "fa4f87e7e82c0e613f854eedf8f64d2cdabbd127f3ae84707ed1ca59e2137855" + }, + "airgap-images-amd64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-amd64.tar.zst", "sha256": "c98ad7590af33ef7e148920eb809dfd0f8145a623fdd8d32c6efeecab6088412" }, - "airgap-images-arm": { + "airgap-images-arm-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm.tar.gz", + "sha256": "0b6009407069fdd684d9627c5fa4bdb31ea4644172f1f429a2cce15d2c18631d" + }, + "airgap-images-arm-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm.tar.zst", "sha256": "c1bd7557836538592dbd59f798e7a4b91d7aef74c8f9f71631060c96a5288dd6" }, - "airgap-images-arm64": { + "airgap-images-arm64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm64.tar.gz", + "sha256": "6fa41db4ee001c1db8a404dd38f17f2426f27f688f9f7a2a76f4ef336f51c886" + }, + "airgap-images-arm64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-airgap-images-arm64.tar.zst", "sha256": "97f0db38f57a2dc63167795620ba34a89348d874ecc91fbf3d8d962dc1392e47" - }, - "images-list": { - "url": "https://github.com/k3s-io/k3s/releases/download/v1.31.11%2Bk3s1/k3s-images.txt", - "sha256": "1f87ad26acac5e553279a64942c0e3eeef5c026cc2f82661d358990848672584" } } diff --git a/pkgs/applications/networking/cluster/k3s/1_32/images-versions.json b/pkgs/applications/networking/cluster/k3s/1_32/images-versions.json index b5c452ddc819..5755fbf56aff 100644 --- a/pkgs/applications/networking/cluster/k3s/1_32/images-versions.json +++ b/pkgs/applications/networking/cluster/k3s/1_32/images-versions.json @@ -1,18 +1,26 @@ { - "airgap-images-amd64": { + "airgap-images-amd64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-amd64.tar.gz", + "sha256": "f6a8720aa9bb03d0c8a97a93e994557292f1efba1fa6648cd8a07830622ce748" + }, + "airgap-images-amd64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-amd64.tar.zst", "sha256": "965f5767c08cffc96bf0967813e7c3fec4c41309e9952a480f0a50865bebd039" }, - "airgap-images-arm": { + "airgap-images-arm-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm.tar.gz", + "sha256": "9aa6f9f33e58e04fb9d8f9cd5c51dd01c6092d7b5434f84341b2f74bc8de783e" + }, + "airgap-images-arm-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm.tar.zst", "sha256": "57ab9c306cc96f8dd925bc788c80e49c2d13ee7a222a12235fb525529ad25ac0" }, - "airgap-images-arm64": { + "airgap-images-arm64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm64.tar.gz", + "sha256": "9633b71655ed0f4af556c148f9bf7753221b3c9b42a8d902391187789302adca" + }, + "airgap-images-arm64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-airgap-images-arm64.tar.zst", "sha256": "1aa05a55492ba0872fa8a0ff518d6e947869bea32dc2b8e5223bdcf53450c7f9" - }, - "images-list": { - "url": "https://github.com/k3s-io/k3s/releases/download/v1.32.7%2Bk3s1/k3s-images.txt", - "sha256": "e786e9a6f0331a92a2257a12995028761bfee1b5bfaac866025b64162e69bfe0" } } diff --git a/pkgs/applications/networking/cluster/k3s/1_33/images-versions.json b/pkgs/applications/networking/cluster/k3s/1_33/images-versions.json index 6e80722b9f5a..bd07f3e8f7a2 100644 --- a/pkgs/applications/networking/cluster/k3s/1_33/images-versions.json +++ b/pkgs/applications/networking/cluster/k3s/1_33/images-versions.json @@ -1,18 +1,26 @@ { - "airgap-images-amd64": { + "airgap-images-amd64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-amd64.tar.gz", + "sha256": "64690dc963f6cbff8adb175a1bc41e6bf207734a9a214362544a36361a2d8350" + }, + "airgap-images-amd64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-amd64.tar.zst", "sha256": "51b6ddeafa465e542f0707272736100916886dd49abcb1420ee52878dd3638a9" }, - "airgap-images-arm": { + "airgap-images-arm-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm.tar.gz", + "sha256": "878d17722dd98e7d88de93a83606e0c9b0d7587c7e4a043559b5236a353fb224" + }, + "airgap-images-arm-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm.tar.zst", "sha256": "339dd2b33b40f03bf95ee2e5dcb8e543ab6852e156cb8aaebe3885717a2966b5" }, - "airgap-images-arm64": { + "airgap-images-arm64-tar-gz": { + "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm64.tar.gz", + "sha256": "e4ab063deb50241e60218a3a30ce090a5817daa0f38dacd10651e27b2be28b9e" + }, + "airgap-images-arm64-tar-zst": { "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-airgap-images-arm64.tar.zst", "sha256": "c12ec7b122f34eb1f89310b05e66b500a2f49522d7cd4ceb3475a675cab6ebc6" - }, - "images-list": { - "url": "https://github.com/k3s-io/k3s/releases/download/v1.33.3%2Bk3s1/k3s-images.txt", - "sha256": "e786e9a6f0331a92a2257a12995028761bfee1b5bfaac866025b64162e69bfe0" } } diff --git a/pkgs/applications/networking/cluster/k3s/builder.nix b/pkgs/applications/networking/cluster/k3s/builder.nix index a165b8f68fb7..d7f98cd7ba93 100644 --- a/pkgs/applications/networking/cluster/k3s/builder.nix +++ b/pkgs/applications/networking/cluster/k3s/builder.nix @@ -130,38 +130,15 @@ let traefikChart = fetchurl chartVersions.traefik; traefik-crdChart = fetchurl chartVersions.traefik-crd; - mutFirstChar = - f: s: - let - firstChar = f (lib.substring 0 1 s); - rest = lib.substring 1 (-1) s; - in - firstChar + rest; - - kebabToCamel = - s: - mutFirstChar lib.toLower (lib.concatMapStrings (mutFirstChar lib.toUpper) (lib.splitString "-" s)); - - # finds the images archive for the desired architecture, throws in case no suitable archive is found - findImagesArchive = - arch: - let - imagesVersionsNames = builtins.attrNames imagesVersions; - in - lib.findFirst ( - n: lib.hasInfix arch n - ) (throw "k3s: no airgap images for ${arch} available") imagesVersionsNames; - # a shortcut that provides the images archive for the host platform. Currently only supports # aarch64 (arm64) and x86_64 (amd64), throws on other architectures. - airgapImages = fetchurl ( - if stdenv.hostPlatform.isAarch64 then - imagesVersions.${findImagesArchive "arm64"} - else if stdenv.hostPlatform.isx86_64 then - imagesVersions.${findImagesArchive "amd64"} - else - throw "k3s: airgap images cannot be found automatically for architecture ${stdenv.hostPlatform.linuxArch}, consider using an image archive with an explicit architecture." - ); + airgap-images = + { + x86_64-linux = fetchurl imagesVersions.airgap-images-amd64-tar-zst; + aarch64-linux = fetchurl imagesVersions.airgap-images-arm64-tar-zst; + } + .${stdenv.hostPlatform.system} + or (throw "k3s: no airgap images available for system ${stdenv.hostPlatform.system}, consider using an image archive with an explicit architecture."); # so, k3s is a complicated thing to package # This derivation attempts to avoid including any random binaries from the @@ -467,7 +444,7 @@ buildGoModule rec { ''; passthru = { - inherit airgapImages; + inherit airgap-images; k3sCNIPlugins = k3sCNIPlugins; k3sContainerd = k3sContainerd; k3sRepo = k3sRepo; @@ -481,10 +458,13 @@ buildGoModule rec { lib.mapAttrs (name: value: nixosTests.k3s.${name}.${k3s_version}) nixosTests.k3s; tests = passthru.mkTests k3sVersion; updateScript = updateScript; + imagesList = throw "k3s.imagesList was removed"; + airgapImages = throw "k3s.airgapImages was renamed to k3s.airgap-images"; + airgapImagesAmd64 = throw "k3s.airgapImagesAmd64 was renamed to k3s.airgap-images-amd64-tar-zst"; + airgapImagesArm64 = throw "k3s.airgapImagesArm64 was renamed to k3s.airgap-images-arm64-tar-zst"; + airgapImagesArm = throw "k3s.airgapImagesArm was renamed to k3s.airgap-images-arm-tar-zst"; } - // (lib.mapAttrs' ( - name: _: lib.nameValuePair (kebabToCamel name) (fetchurl imagesVersions.${name}) - ) imagesVersions); + // (lib.mapAttrs (_: value: fetchurl value) imagesVersions); meta = baseMeta; } diff --git a/pkgs/applications/networking/cluster/k3s/update-script.sh b/pkgs/applications/networking/cluster/k3s/update-script.sh index 0a1d06a656c0..aced5253abf1 100755 --- a/pkgs/applications/networking/cluster/k3s/update-script.sh +++ b/pkgs/applications/networking/cluster/k3s/update-script.sh @@ -83,22 +83,20 @@ mv chart-versions.nix.update chart-versions.nix SHA256_HASHES="\ $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-amd64.txt") $($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-arm64.txt") -$($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-arm.txt") -$($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/k3s-images.txt" | sha256sum | cut -d' ' -f1) k3s-images.txt" +$($CURL "https://github.com/k3s-io/k3s/releases/download/v${K3S_VERSION}/sha256sum-arm.txt")" # Get all airgap images files associated with this release IMAGES_ARCHIVES=$($CURL "https://api.github.com/repos/k3s-io/k3s/releases/tags/v${K3S_VERSION}" | \ - # Filter the assets so that only zstd archives and text files that have "images" in their name remain - jq -r '.assets[] | select(.name | (contains("images") and (endswith(".tar.zst") or endswith("k3s-images.txt")))) | - "\(.name) \(.browser_download_url)"') + # Filter the assets for airgap images archives + jq -r '.assets[] | select(.name | test("^k3s-airgap-images-.*\\.tar\\.")) | "\(.name) \(.browser_download_url)"') # Create a JSON object for each airgap images file and prefetch all download URLs in the process # Combine all JSON objects and write the result to images-versions.json while read -r name url; do # Pick the right hash based on the name sha256=$(grep "$name" <<< "$SHA256_HASHES" | cut -d ' ' -f 1) - # Remove the k3s- prefix and file endings - clean_name=$(sed -e 's/^k3s-//' -e 's/\.tar\.zst//' -e 's/\.txt/-list/' <<< "$name") + # Remove the k3s prefix and replace all dots with hyphens + clean_name=$(sed -e "s/^k3s-//" -e "s/\./-/g" <<< "$name") jq --null-input --arg name "$clean_name" \ --arg url "$url" \ --arg sha256 "$sha256" \