Files
Timofei Larkin f0b99da43a test(kubernetes): make kubectl_wait_retry set -e safe
The chainsaw scripts source run-kubernetes.sh under `set -eu`, where the
wrapper's bare `_out=$(kubectl wait ... 2>&1)` on a failing wait aborts
the whole sourcing script at the assignment -- before `_rc=$?`, before
the retry loop, before anything prints, with the error text captured
into the substitution and lost. Every `kubectl wait` failure therefore
killed the suite instantly and silently, and the transient-retry
machinery the wrapper exists for (etcd leader flap et al.) has never
been reachable. This is how the kubernetes-latest suite died in CI with
an empty stderr: the wait it was executing failed, and the script
simply stopped.

Guard the assignment (`_rc=0; _out=$(...) || _rc=$?`) so the wrapper's
own logic decides: allowlisted transient errors retry with a visible
notice, everything else prints and propagates, exactly the documented
contract.

New unit suite executes the wrapper in a `sh -eu` subshell against a
fake kubectl, the same way chainsaw runs it: a transient etcd error
must be retried with the script surviving (against the previous lib
this exits 1 after one call with empty output), and NotFound must not
be retried, must fail, and must be printed.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Timofei Larkin <lllamnyp@gmail.com>
2026-07-31 16:11:08 +03:00

25 lines
841 B
Bash
Executable File

#!/bin/sh
# Fake kubectl for hack/kubectl-wait-retry_test.bats. Mocks only `kubectl wait`.
# Env:
# FAKE_CMDLOG path to append one line per invocation (also the call counter)
# FAKE_MODE transient-once: first call fails with an etcd leader-change
# message (the wrapper's retry allowlist), later calls succeed
# notfound: every call fails NotFound (must NOT be retried)
echo "wait $*" >> "$FAKE_CMDLOG"
calls=$(grep -c . "$FAKE_CMDLOG")
case "${FAKE_MODE:-}" in
transient-once)
if [ "$calls" -le 1 ]; then
echo "Error from server: etcdserver: leader changed" >&2
exit 1
fi
echo "deployment.apps/x condition met"
exit 0 ;;
notfound)
echo 'Error from server (NotFound): deployments.apps "x" not found' >&2
exit 1 ;;
*)
echo "condition met"
exit 0 ;;
esac