repositories / bugabinga.net
bugabinga.net
personal infrastructure for bugabinga!
owned by admin
services/pufferpanel/test-valheim-klops.sh
Raw#!/usr/bin/env bash
set -euo pipefail
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
scratch_root=/var/tmp/pufferpanel-fork/valheim-ingress-klops
install -d -m 0700 "$scratch_root"
work="$(mktemp -d "$scratch_root/test.XXXXXX")"
trap 'rm -rf -- "$work"' EXIT
mkdir -p "$work/bin"
chmod 0700 "$work"
cat >"$work/owner.env" <<'ENV'
PUFFER_OWNER_EMAIL=owner@example.test
PUFFER_OWNER_PASSWORD=test-password
PUFFER_OWNER_URL=https://games.bugabinga.net
ENV
chmod 0600 "$work/owner.env"
cat >"$work/bin/firewall-cmd" <<'MOCK'
#!/usr/bin/env bash
printf 'firewall-cmd %s\n' "$*" >>"$VALHEIM_TEST_LOG"
case " $* " in
*' --get-zone-of-interface=wg0 '*) printf 'public\n' ;;
*' --query-rich-rule='*) exit 1 ;;
esac
MOCK
cat >"$work/bin/ssh" <<'MOCK'
#!/usr/bin/env bash
printf 'ssh %s\n' "$*" >>"$VALHEIM_TEST_LOG"
if [[ "$*" == *'bash -s -- 10.100.0.2 fd00:100::2'* ]]; then
bash -s -- 10.100.0.2 fd00:100::2
else
cat >/dev/null
fi
MOCK
cat >"$work/bin/curl" <<'MOCK'
#!/usr/bin/env bash
printf 'curl %s\n' "$*" >>"$VALHEIM_TEST_LOG"
url="${!#}"
case "$url" in
*/auth/login|*/auth/logout) ;;
*/definition)
if [[ " $* " == *' -X PUT '* ]]; then
for arg in "$@"; do
if [[ "$arg" = @* ]]; then
cp -- "${arg#@}" "$VALHEIM_TEST_PUT"
fi
done
elif [[ "$VALHEIM_FIXTURE" = desired ]]; then
printf '%s\n' '{"name":"Valheim","environment":{"portBindings":["10.100.0.2:2456:2456/udp","[fd00:100::2]:2456:2456/udp","10.100.0.2:2457:2457/udp","[fd00:100::2]:2457:2457/udp"]},"limits":{"memory":1}}'
else
printf '%s\n' '{"name":"Valheim","environment":{"portBindings":["0.0.0.0:2456:2456/udp"]},"limits":{"memory":1},"variables":{"world":"preserve-me"}}'
fi
;;
*/status)
count_file="$VALHEIM_TEST_LOG.status"
count=0
[[ -f "$count_file" ]] && count="$(<"$count_file")"
count=$((count + 1))
printf '%s' "$count" >"$count_file"
case "$VALHEIM_FIXTURE:$count" in
poll_failure:1) printf '%s\n' '{"running":true,"installing":false}' ;;
poll_failure:*) exit 22 ;;
installing:*) printf '%s\n' '{"running":true,"installing":true}' ;;
stopped:*) printf '%s\n' '{"running":false,"installing":false}' ;;
normal:1) printf '%s\n' '{"running":true,"installing":false}' ;;
normal:2) printf '%s\n' '{"running":false,"installing":false}' ;;
normal:*) printf '%s\n' '{"running":true,"installing":false}' ;;
desired:*) printf '%s\n' '{"running":false,"installing":false}' ;;
esac
;;
esac
MOCK
chmod +x "$work/bin"/*
export PATH="$work/bin:$PATH"
export VALHEIM_TEST_LOG="$work/log"
export PUFFER_OWNER_ENV="$work/owner.env"
export VALHEIM_TEST_PUT="$work/put.json"
run() {
"$repo_root/scripts/local/deploy-valheim-klops.sh" klops.example.test 22 10.100.0.2 fd00:100::2
}
reset() {
: >"$work/log"
rm -f -- "$work/log.status" "$work/put.json"
}
reset
export VALHEIM_FIXTURE=normal
run
jq -e '.limits.memory == 1 and .variables.world == "preserve-me" and .environment.portBindings == ["10.100.0.2:2456:2456/udp", "[fd00:100::2]:2456:2456/udp", "10.100.0.2:2457:2457/udp", "[fd00:100::2]:2457:2457/udp"]' "$work/put.json" >/dev/null
grep -F -- '/stop' "$work/log" >/dev/null
if grep -F -- '/stop?wait=' "$work/log" >/dev/null; then exit 1; fi
grep -F -- '/start' "$work/log" >/dev/null
reset
export VALHEIM_FIXTURE=stopped
run
if grep -E -- '/stop|/start' "$work/log" >/dev/null; then exit 1; fi
[[ -f "$work/put.json" ]]
reset
export VALHEIM_FIXTURE=desired
run
if grep -E -- '/stop|/start|-X PUT' "$work/log" >/dev/null; then exit 1; fi
[[ "$(grep -Fc -- '--add-rich-rule=rule family=ipv4 destination address=10.100.0.2 port port=2456-2457 protocol=udp accept' "$work/log")" -eq 2 ]]
[[ "$(grep -Fc -- '--add-rich-rule=rule family=ipv6 destination address=fd00:100::2 port port=2456-2457 protocol=udp accept' "$work/log")" -eq 2 ]]
reset
export VALHEIM_FIXTURE=installing
if run; then
echo 'expected installing server to refuse reconciliation' >&2
exit 1
fi
if grep -E -- '/stop|/start|-X PUT' "$work/log" >/dev/null; then exit 1; fi
reset
export VALHEIM_FIXTURE=poll_failure
if run; then
echo 'expected status request failure while polling to fail closed' >&2
exit 1
fi
if grep -E -- '-X PUT|/start' "$work/log" >/dev/null; then exit 1; fi
printf '%s\n' 'Valheim klops mocks verify firewall reconciliation, fail-closed status polling, installing refusal, stopped preservation, binding no-op, and running stop-backup-update-restart'