2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-10-21 15:18:19 +00:00

test(installer): exercise Genesis package transactions

This commit is contained in:
Vinícius Ferrão
2026-10-08 22:49:51 -03:00
parent dbbdcddcb2
commit 32ccf13fbe
2 changed files with 116 additions and 20 deletions
+116
View File
@@ -0,0 +1,116 @@
#!/usr/bin/env bats
load helpers/script_sandbox
setup() {
setup_script_sandbox awk cat comm cp cut dirname grep head id ln mkdir mktemp mv rm sed sleep sort tr wc xargs
mkdir -p "$fixture/etc/yum.repos.d" "$fixture/tools"
sandbox+=(--uid 0 --gid 0
--ro-bind "$(repo_path xCAT-server/share/xcat/tools/go-xcat)" /run/go-xcat)
# An inherited library-only setting must not disable the command.
sandbox+=(--setenv GO_XCAT_LIBRARY_ONLY 1)
cat >"$fixture/tools/manager" <<'SH'
#!/bin/sh
operation=
for arg do
case "$arg" in install|remove) operation=$arg; continue ;; esac
[ -n "$operation" ] || continue
case "$arg" in -*) continue ;; esac
printf '%s %s\n' "$operation" "$arg" >> /run/fixture/transactions
done
[ "$operation" != install ] || exit 17
case "$*" in *repoquery*) printf '%s\n' fixture-package ;; esac
exit 0
SH
cat >"$fixture/tools/rpm" <<'SH'
#!/bin/sh
case "$*" in
'-q --quiet '*) grep -Fxq "$3" /run/fixture/installed ;;
*) exit 0 ;;
esac
SH
cat >"$fixture/tools/dpkg-query" <<'SH'
#!/bin/sh
if grep -Fxq "$3" /run/fixture/installed; then printf 'install ok installed'; else exit 1; fi
SH
printf '#!/bin/sh\nexit 0\n' >"$fixture/tools/apt-cache"
printf '#!/bin/sh\nexit 22\n' >"$fixture/bin/curl"
chmod +x "$fixture/bin/curl" "$fixture/tools/"*
: >"$fixture/installed"
: >"$fixture/transactions"
}
invoke() {
local format=$1 architecture=$2 action=$3
local debian_arch=$architecture
if [ "$format" = rpm ]; then
printf 'ID=almalinux\nVERSION_ID=8.10\n' >"$fixture/etc/os-release"
cp "$fixture/tools/rpm" "$fixture/bin/rpm"
cp "$fixture/tools/manager" "$fixture/bin/dnf"
else
[ "$architecture" != x86_64 ] || debian_arch=amd64
printf '#!/bin/sh\nprintf "%%s\\n" "%s"\n' "$debian_arch" >"$fixture/bin/dpkg"
chmod +x "$fixture/bin/dpkg"
mkdir -p "$fixture/etc/apt/sources.list.d" "$fixture/var/lib/apt/lists"
printf 'ID=ubuntu\nVERSION_ID=24.04\n' >"$fixture/etc/os-release"
printf 'DISTRIB_CODENAME=noble\n' >"$fixture/etc/lsb-release"
printf 'Package: fixture-package\nVersion: 1\n' >"$fixture/var/lib/apt/lists/test_xcat-core_dists_noble_main_binary-${debian_arch}_Packages"
cp "$fixture/var/lib/apt/lists/test_xcat-core_dists_noble_main_binary-${debian_arch}_Packages" "$fixture/var/lib/apt/lists/test_xcat-dep_dists_noble_main_binary-${debian_arch}_Packages"
cp "$fixture/tools/dpkg-query" "$fixture/bin/dpkg-query"
cp "$fixture/tools/apt-cache" "$fixture/bin/apt-cache"
cp "$fixture/tools/manager" "$fixture/bin/apt-get"
fi
run "${sandbox[@]}" --setenv HOSTTYPE "$architecture" \
timeout 30 bash /run/go-xcat -y \
--xcat-core=https://packages.example.test/core \
--xcat-dep=https://packages.example.test/dep "$action"
}
check_uninstall() {
local format=$1 selection=$2 name prefix=xCAT
[ "$format" != deb ] || prefix=xcat
local architectures=(x86 x86_64 ppc64 ppc64le armv7hf aarch64 riscv64 s390x)
[ "$selection" != subset ] || architectures=(ppc64le riscv64)
for name in "${architectures[@]}"; do
[ "$format" != deb ] || name=${name//_/-}
printf '%s-genesis-openembedded-%s\n' "$prefix" "$name"
done >"$fixture/installed"
printf 'unrelated-package\n' >>"$fixture/installed"
invoke "$format" x86_64 uninstall
[ "$status" -eq 0 ] || { echo "$output" >&2; return 1; }
grep -v '^unrelated-package$' "$fixture/installed" | sed 's/^/remove /' | sort >"$fixture/expected"
sort "$fixture/transactions" >"$fixture/actual"
diff -u "$fixture/expected" "$fixture/actual"
}
check_install() {
local format=$1 architecture=$2 prefix=xCAT legacy=ppc64 x86=x86_64
if [ "$format" = deb ]; then prefix=xcat; legacy=ppc64el; x86=amd64; fi
invoke "$format" "$architecture" install
[ "$status" -eq 17 ] || { echo "$output" >&2; return 1; }
local packages=("perl-$prefix" "$prefix-client" "$prefix" "$prefix-buildkit" "$prefix-server"
elilo-xcat grub2-xcat ipmitool-xcat syslinux-xcat ipxe-xcat xnba-undi)
if [ "$architecture" = riscv64 ]; then
packages+=("$prefix-genesis-openembedded-riscv64")
else
packages+=("$prefix-genesis-scripts-$legacy" "$prefix-genesis-scripts-$x86"
"$prefix-genesis-base-$legacy" "$prefix-genesis-base-$x86")
fi
[ "$format" != rpm ] || packages+=(initscripts)
printf 'install %s\n' "${packages[@]}" | sort >"$fixture/expected"
sort "$fixture/transactions" >"$fixture/actual"
diff -u "$fixture/expected" "$fixture/actual" || {
echo "$output" >&2
[ ! -f "$fixture/tmp/go-xcat.log" ] || cat "$fixture/tmp/go-xcat.log" >&2
return 1
}
}
@test "RPM uninstall removes all installed OpenEmbedded architectures" { check_uninstall rpm all; }
@test "DEB uninstall removes all installed OpenEmbedded architectures" { check_uninstall deb all; }
@test "RPM uninstall excludes absent and unrelated packages" { check_uninstall rpm subset; }
@test "DEB uninstall excludes absent and unrelated packages" { check_uninstall deb subset; }
@test "RPM RISC-V installation selects OpenEmbedded and keeps other packages" { check_install rpm riscv64; }
@test "DEB RISC-V installation selects OpenEmbedded and keeps other packages" { check_install deb riscv64; }
@test "RPM x86 installation retains its legacy Genesis packages" { check_install rpm x86_64; }
@test "DEB x86 installation retains its legacy Genesis packages" { check_install deb x86_64; }
@@ -57,26 +57,6 @@ like(
'DEB service nodes recommend the s390x image',
);
my $go_xcat = slurp_repo_file('xCAT-server/share/xcat/tools/go-xcat');
unlike(
$go_xcat,
qr/GO_XCAT_LIBRARY_ONLY/,
'go-xcat cannot be disabled by an inherited test environment variable',
);
for my $architecture (qw(x86 x86_64 ppc64 ppc64le armv7hf aarch64 riscv64 s390x)) {
like(
$go_xcat,
qr/\bxCAT-genesis-openembedded-\Q$architecture\E\b/,
"go-xcat removes the $architecture RPM image",
);
(my $deb_architecture = $architecture) =~ tr/_/-/;
like(
$go_xcat,
qr/\bxcat-genesis-openembedded-\Q$deb_architecture\E\b/,
"go-xcat removes the $architecture DEB image",
);
}
my $mknb_pod = slurp_repo_file('xCAT-client/pods/man8/mknb.8.pod');
like(
$mknb_pod,