Files
cozystack/hack/run-kubernetes-drain_test.bats
Myasnikov Daniil cc942fed68 test(tests): run unit suites with Bats and retain POSIX coverage
The shell translator rewrites test bodies and loses Bats reporting.
The unit lane needs complete TAP results and JUnit reports without
changing how live-cluster suites run.

Sourced production helpers still need a dash pass, and unit test bodies
need nounset without exporting shell options into subprocesses.

Assisted-by: LLM
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
2026-10-07 11:04:00 +03:00

118 lines
4.7 KiB
Bash

#!/usr/bin/env bats
# -----------------------------------------------------------------------------
# Unit tests for the scoped tenant-drain helpers in run-kubernetes.sh.
#
# cozy_tenant_drained is the pure exit-condition of the inter-test drain loop
# (cozy_wait_tenant_drained). Each argument is one resource-probe capture: the
# stdout of a `kubectl get -o name` (empty once the resource is gone) or the
# literal "err" the loop substitutes when a probe itself fails, so an API blip
# is never misread as "the tenant has drained". The function returns 0 (drained)
# only when every capture is empty/whitespace, non-zero otherwise.
#
# CI runs this file under Bats through `make bats-unit-tests`. It also remains
# compatible with the legacy `hack/cozytest.sh` translator, whose awk parser
# recognizes only @test blocks and a bare `}` on its own line. The tests avoid
# `run` and `$status` for that compatibility path and use direct shell assertions.
#
# Run with: bats hack/run-kubernetes-drain_test.bats
# -----------------------------------------------------------------------------
load test_helper
@test "all-empty captures report drained" {
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
if ! cozy_tenant_drained "" "" ""; then
echo "expected drained when every capture is empty" >&2
exit 1
fi
}
@test "no arguments reports drained" {
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
if ! cozy_tenant_drained; then
echo "expected drained when there are no captures" >&2
exit 1
fi
}
@test "a remaining VirtualMachine reports not-drained" {
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
if cozy_tenant_drained "virtualmachine.kubevirt.io/kubernetes-test-latest-version-md0-abcde" "" ""; then
echo "expected not-drained while a VirtualMachine is still present" >&2
exit 1
fi
}
@test "a remaining PVC in the last capture reports not-drained" {
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
if cozy_tenant_drained "" "" "persistentvolumeclaim/disk-system-kubernetes-test-latest-version-md0-abcde"; then
echo "expected not-drained while a worker-disk PVC is still present" >&2
exit 1
fi
}
@test "a multi-line resource list reports not-drained" {
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
vms=$(printf 'virtualmachine.kubevirt.io/a\nvirtualmachine.kubevirt.io/b\n')
if cozy_tenant_drained "$vms" "" ""; then
echo "expected not-drained for a multi-line VirtualMachine list" >&2
exit 1
fi
}
@test "the err sentinel is never misread as drained" {
# A failed probe (transient API error) substitutes the literal "err". Even
# when every other capture is empty, an err capture MUST count as
# not-drained so the loop keeps polling instead of declaring victory on a
# blip and letting the next tenant schedule onto an un-vacated sandbox.
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
if cozy_tenant_drained "" "err" ""; then
echo "expected not-drained when a probe returned the err sentinel" >&2
exit 1
fi
}
@test "whitespace-only captures are treated as drained" {
# `kubectl get -o name` against an empty result set yields no resource
# names; a stray newline must not be mistaken for a live resource.
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
blank=$(printf '\n')
if ! cozy_tenant_drained "$blank" "" " "; then
echo "expected drained when captures hold only whitespace" >&2
exit 1
fi
}
@test "PVC filtering ignores leftovers from databases and other Kubernetes clusters" {
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
pvcs=$(printf '%s\n' \
'persistentvolumeclaim/clickhouse-data-test' \
'persistentvolumeclaim/disk-system-kubernetes-test-previous-version-md0-worker-a' \
'persistentvolumeclaim/disk-system-kubernetes-test-latest-version-md0-worker-b')
got=$(cozy_filter_cluster_pvcs test-latest-version "$pvcs")
expected='persistentvolumeclaim/disk-system-kubernetes-test-latest-version-md0-worker-b'
[ "$got" = "$expected" ] || {
echo "PVC filter crossed cluster ownership: [$got]" >&2
exit 1
}
}
@test "scoped drain queries the CAPI label and ignores unrelated PVCs" {
. hack/e2e-chainsaw/_lib/run-kubernetes.sh
calls=$(mktemp)
kubectl() {
printf '%s\n' "$*" >> "$calls"
case "$*" in
*" get pvc "*) printf 'persistentvolumeclaim/clickhouse-data-test\n' ;;
*) printf '' ;;
esac
}
cozy_wait_tenant_drained test-latest-version 0 >/dev/null
[ "$(grep -c 'cluster.x-k8s.io/cluster-name=kubernetes-test-latest-version' "$calls")" -eq 2 ] || {
echo "VM and VMI probes were not scoped to the current CAPI cluster" >&2
cat "$calls" >&2
exit 1
}
}