#!/bin/bash
# Un game day chico: se cae el proceso de Kallpa a propósito y se mide cuánto se
# nota. Corre en la terminal de su computadora (necesita Docker y una imagen con
# GET /health; Kallpa escucha en el puerto 8080). No toca el volumen de nadie:
# usa uno propio, kallpa-gameday, y lo borra al final.
#
#   game-day.sh IMAGEN                     nadie reinicia: el monitor avisa y una
#                                          persona corre docker start
#   game-day.sh IMAGEN --restart=on-failure  Docker reinicia el proceso
IMAGE=${1:?Falta la imagen}
POLICY=${2:-}
NAME=kallpa-gameday
PORT=8080
CALLS=$(mktemp)

docker rm -f "$NAME" >/dev/null 2>&1
docker run -d --name "$NAME" -p "$PORT:3000" -v kallpa-gameday:/app/data $POLICY "$IMAGE" >/dev/null
sleep 2

# El tráfico: una solicitud por segundo, como un vecino que recarga la página.
(
  while true; do
    echo "$(date +%T) $(curl -s -m 2 -o /dev/null -w '%{http_code}' "localhost:$PORT/api/courts")" >> "$CALLS"
    sleep 1
  done
) &
TRAFFIC=$!

sleep 20
echo "$(date +%T) se manda el pedido que tumba el proceso"
curl -s --path-as-is -o /dev/null "localhost:$PORT//"

# El monitor: revisa /health cada 10 s y avisa a la segunda falla seguida. Si
# Docker reinicia el proceso, nunca llega a avisar.
FAILS=0
for _ in 1 2 3 4; do
  sleep 10
  if curl -s -m 2 -o /dev/null -f "localhost:$PORT/health"; then
    FAILS=0
  else
    FAILS=$((FAILS + 1))
    echo "$(date +%T) el monitor ve /health caído ($FAILS)"
  fi
  if [ "$FAILS" -eq 2 ]; then
    echo "$(date +%T) el monitor avisa a quien está de turno"
    sleep 30   # lo que tarda una persona en ver el aviso, leer el log y reiniciar
    echo "$(date +%T) docker start"
    docker start "$NAME" >/dev/null
    sleep 10
    break
  fi
done

kill "$TRAFFIC"
wait "$TRAFFIC" 2>/dev/null
echo "$(date +%T) fin del ensayo"
docker inspect -f 'estado={{.State.Status}} reinicios={{.RestartCount}}' "$NAME"
echo "solicitudes: $(wc -l < "$CALLS" | tr -d ' '), fallidas: $(grep -c ' 000$' "$CALLS")"
echo "primera falla: $(grep -m1 ' 000$' "$CALLS"), última falla: $(grep ' 000$' "$CALLS" | tail -1)"
docker logs "$NAME" 2>&1 | grep -c '"msg":"listening"' | sed 's/^/arranques en el log: /'
docker rm -f "$NAME" >/dev/null
docker volume rm kallpa-gameday >/dev/null
rm -f "$CALLS"
