mirror of
https://github.com/cozystack/cozystack.git
synced 2026-10-30 08:37:31 +09:00
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>
25 lines
841 B
Bash
Executable File
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
|