prole/tests/etc/test_init_garage_recycles_released_pv_claimref.sh

159 lines
3.9 KiB
Bash

#!/usr/bin/env bash
# Regression test: Garage startup should auto-recycle a Released synology-iscsi PV with a stale
# claimRef when the PVC is Pending and rollout is stuck beyond the initial timeout.
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
KNOE_HOME=$(cd "$SCRIPT_DIR/../.." && pwd)
SOURCE_ETC_DIR="$KNOE_HOME/etc"
SOURCE_ETC_LIB_SHELL_DIR="$KNOE_HOME/etc/lib/shell"
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT
WORK_DIR="$TMP_DIR/work"
BIN_DIR="$TMP_DIR/bin"
mkdir -p "$WORK_DIR/etc/lib/shell" "$WORK_DIR/conf" "$WORK_DIR/k8s/knoe" "$BIN_DIR"
cp "$SOURCE_ETC_DIR/init_garage_store.sh" "$WORK_DIR/etc/init_garage_store.sh"
cp "$SOURCE_ETC_DIR/common_core_lib.sh" "$WORK_DIR/etc/common_core_lib.sh"
cp "$SOURCE_ETC_LIB_SHELL_DIR/common_core_lib.sh" "$WORK_DIR/etc/lib/shell/common_core_lib.sh"
cp "$SOURCE_ETC_DIR/knoe_cfg.sh" "$WORK_DIR/etc/knoe_cfg.sh"
chmod +x "$WORK_DIR/etc/init_garage_store.sh"
# Dummy manifests required by init_garage_store.sh
for f in storageclass-synology-iscsi.yaml iscsi-pvs.yaml garage-configmap.yaml garage-statefulset.yaml garage-service.yaml; do
printf '%s\n' "apiVersion: v1" > "$WORK_DIR/k8s/knoe/$f"
done
cat <<EOF > "$WORK_DIR/conf/knoe.cfg"
[globals]
knoe.home = $WORK_DIR
knoe.mode = k3s
NAMESPACE = test-ns
SERVICE_NAMESPACE = knoe-system
EOF
export KUBECTL_LOG="$TMP_DIR/kubectl.log"
cat <<'EOF' > "$BIN_DIR/kubectl"
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' "$*" >> "${KUBECTL_LOG}"
# Skip global options like --request-timeout=...
while [[ "${1:-}" == --* ]]; do
shift
done
sub="${1:-}"
case "$sub" in
config)
case "${2:-}" in
current-context)
printf '%s' "default"
exit 0
;;
use-context|get-contexts)
exit 0
;;
esac
exit 0
;;
get)
# apiserver readiness
if [[ "$*" == "get nodes"* ]]; then
exit 0
fi
# namespace/secret checks
if [[ "$*" == *"get namespace"* || "$*" == *"get secret"* ]]; then
exit 1
fi
# PVC existence + phase/uid
if [[ "$*" == *"get pvc data-garage-0"*"-o jsonpath={.status.phase}"* ]]; then
printf '%s' "Pending"
exit 0
fi
if [[ "$*" == *"get pvc data-garage-0"*"-o jsonpath={.metadata.uid}"* ]]; then
printf '%s' "newuid"
exit 0
fi
if [[ "$*" == *"get pvc data-garage-0"* ]]; then
exit 0
fi
# PV list for recycle helper
if [[ "$*" == *"get pv"*"-o jsonpath="* ]]; then
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
"synology-iscsi-d001-garage" "synology-iscsi" "Retain" "Released" "test-ns" "data-garage-0" "olduid"
exit 0
fi
# Pod lookup for init_layout
if [[ "$*" == *"get pods"*"-l app=garage"*"-o jsonpath={.items[0].metadata.name}"* ]]; then
printf '%s' "garage-0"
exit 0
fi
exit 0
;;
create)
# namespace + secret creation
exit 0
;;
diff)
exit 1
;;
apply)
exit 0
;;
rollout)
if [[ "$*" == *"rollout status"*"--timeout=0s"* ]]; then
exit 1
fi
exit 0
;;
patch)
exit 0
;;
exec)
if [[ "$*" == *"/garage node id"* ]]; then
printf '%s\n' "deadbeefdeadbeef@node"
exit 0
fi
if [[ "$*" == *"/garage layout show"* ]]; then
printf '%s\n' "deadbeefdeadbeef"
exit 0
fi
exit 0
;;
*)
exit 0
;;
esac
EOF
chmod +x "$BIN_DIR/kubectl"
export PATH="$BIN_DIR:$PATH"
export KNOE_HOME="$WORK_DIR"
export KNOE_CONF="$WORK_DIR/conf"
export KNOE_MODE="k3s"
export PVC_REPAIR_WAIT_TIMEOUT="0s"
if "$WORK_DIR/etc/init_garage_store.sh" -n "test-ns" restart >"$TMP_DIR/stdout" 2>"$TMP_DIR/stderr"; then
:
else
echo "FAILURE: init_garage_store.sh restart exited non-zero" >&2
cat "$TMP_DIR/stderr" >&2
exit 1
fi
if ! grep -q "patch pv synology-iscsi-d001-garage" "$KUBECTL_LOG"; then
echo "FAILURE: expected PV claimRef recycle (kubectl patch pv) was not invoked" >&2
echo "--- kubectl log ---" >&2
sed -n '1,200p' "$KUBECTL_LOG" >&2 || true
exit 1
fi
echo "SUCCESS"