mirror of
https://github.com/cozystack/cozystack.git
synced 2026-10-23 03:27:50 +09:00
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>
118 lines
4.7 KiB
Bash
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
|
|
}
|
|
}
|