#!/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 < "$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"