#!/bin/bash # Test splitting an Arch Linux image. set -xeuo pipefail shopt -s inherit_errexit SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" # shellcheck source=SCRIPTDIR/lib.sh . "${SCRIPT_DIR}/lib.sh" TARGET_IMAGE="quay.io/archlinux/archlinux:latest" CHUNKED_IMAGE="localhost/archlinux-chunked:test" output_dir="${OUTPUT_DIR:?}" cleanup() { cleanup_images "${CHUNKED_IMAGE}" } trap cleanup EXIT # build split image using Containerfile.splitter API podman pull "${TARGET_IMAGE}" config_str=$(podman inspect "${TARGET_IMAGE}") buildah_build \ --from "${TARGET_IMAGE}" --build-arg CHUNKAH="${CHUNKAH_IMG:?}" \ --build-arg CHUNKAH_CONFIG_STR="${config_str}" \ --build-arg "CHUNKAH_ARGS=--max-layers 96 --write-manifest-to /run/output/manifest.json" \ -v "${output_dir}:/run/output" \ -t "${CHUNKED_IMAGE}" "${REPO_ROOT}/Containerfile.splitter" # sanity-check it podman run --rm "${CHUNKED_IMAGE}" cat /etc/os-release | grep "Arch Linux" # check for expected Arch Linux components assert_has_components "${CHUNKED_IMAGE}" "alpm/linux-api-headers" "alpm/systemd" "alpm/glibc" "alpm/pacman-mirrorlist" # verify we got exactly 96 layers assert_layer_count "${CHUNKED_IMAGE}" 96 # verify unclaimed component is under 10MiB (10485760 bytes) unclaimed_size=$(jq '.components["chunkah/unclaimed"].size' "${output_dir}/manifest.json") [[ -n "${unclaimed_size}" ]] [[ ${unclaimed_size} -le 10485760 ]] # verify chunked image is not larger than original + 1% # (catches possible e.g. bad hardlink handling) size_original=$(podman image inspect "${TARGET_IMAGE}" | jq '.[0].Size') size_chunked=$(podman image inspect "${CHUNKED_IMAGE}" | jq '.[0].Size') max_size=$((size_original * 101 / 100)) [[ ${size_chunked} -le ${max_size} ]] # verify the chunked image is equivalent to the source assert_no_diff "${TARGET_IMAGE}" "${CHUNKED_IMAGE}"