Luigit
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'