#!/usr/bin/env bash # Seed verified users for IFT stress hot-path (ift-users.csv). # Usage (from EventHubBack root or anywhere): # COUNT=400 bash test/tsung/seed-ift-users.sh set -euo pipefail ROOT="$(cd "$(dirname "$0")/../.." && pwd)" ENV_FILE="${ENV_FILE:-$ROOT/docker/.env.ift}" OUT="${OUT:-$ROOT/test/tsung/ift-users.csv}" COUNT="${COUNT:-400}" PASSWORD="${SEED_PASSWORD:-testpassword123}" API="${API_BASE:-https://api.ift.eventhub.local}" ADMIN_API="${ADMIN_API_BASE:-https://admin-api.ift.eventhub.local}" PREFIX="${SEED_PREFIX:-lt_stress_$(date +%Y%m%d%H%M%S)}" if [[ ! -f "$ENV_FILE" ]]; then echo "Missing $ENV_FILE" >&2 exit 1 fi set -a # shellcheck disable=SC1091 source <(sed $'s/\xEF\xBB\xBF//' "$ENV_FILE" | tr -d '\r' | grep -E '^(ADMIN_SUPER_|ADMIN_EMAIL|ADMIN_PASSWORD|SMOKE_ADMIN_)') set +a ADMIN_EMAIL_V="${SMOKE_ADMIN_EMAIL:-${ADMIN_SUPER_EMAIL:-$ADMIN_EMAIL}}" ADMIN_PASS_V="${SMOKE_ADMIN_PASSWORD:-${ADMIN_SUPER_PASSWORD:-$ADMIN_PASSWORD}}" if [[ -z "${ADMIN_EMAIL_V:-}" || -z "${ADMIN_PASS_V:-}" ]]; then echo "No admin credentials in $ENV_FILE" >&2 exit 1 fi echo "=== admin login ===" ADMIN_JSON=$(curl -skf --connect-timeout 15 -X POST "$ADMIN_API/v1/admin/login" \ -H 'Content-Type: application/json' \ -d "{\"email\":\"${ADMIN_EMAIL_V}\",\"password\":\"${ADMIN_PASS_V}\"}") ADMIN_TOKEN=$(printf '%s' "$ADMIN_JSON" | python3 -c 'import json,sys; print(json.load(sys.stdin)["token"])') : > "$OUT" OK=0 FAIL=0 for i in $(seq 1 "$COUNT"); do EMAIL="${PREFIX}_${i}@loadtest.local" REG=$(curl -sk --connect-timeout 15 -w '\n%{http_code}' -X POST "$API/v1/register" \ -H 'Content-Type: application/json' \ -d "{\"email\":\"${EMAIL}\",\"password\":\"${PASSWORD}\"}" || true) BODY=$(printf '%s' "$REG" | head -n -1) CODE=$(printf '%s' "$REG" | tail -n 1) if [[ "$CODE" != "201" && "$CODE" != "200" ]]; then echo "register fail i=$i code=$CODE body=$BODY" >&2 FAIL=$((FAIL + 1)) continue fi USER_ID=$(printf '%s' "$BODY" | python3 -c 'import json,sys; print(json.load(sys.stdin)["user"]["id"])') VT=$(curl -sk --connect-timeout 15 -w '\n%{http_code}' -X GET \ "$ADMIN_API/v1/admin/users/${USER_ID}/verification-token" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" || true) VT_BODY=$(printf '%s' "$VT" | head -n -1) VT_CODE=$(printf '%s' "$VT" | tail -n 1) if [[ "$VT_CODE" != "200" ]]; then echo "vtoken fail i=$i code=$VT_CODE" >&2 FAIL=$((FAIL + 1)) continue fi VTOKEN=$(printf '%s' "$VT_BODY" | python3 -c 'import json,sys; print(json.load(sys.stdin)["token"])') VER_CODE=$(curl -sk --connect-timeout 15 -o /dev/null -w '%{http_code}' -X POST "$API/v1/verify" \ -H 'Content-Type: application/json' \ -d "{\"token\":\"${VTOKEN}\"}" || true) if [[ "$VER_CODE" != "200" && "$VER_CODE" != "201" && "$VER_CODE" != "204" ]]; then echo "verify fail i=$i code=$VER_CODE" >&2 FAIL=$((FAIL + 1)) continue fi printf '%s;%s\n' "$EMAIL" "$PASSWORD" >> "$OUT" OK=$((OK + 1)) if (( i % 25 == 0 )); then echo " seeded $i/$COUNT (ok=$OK fail=$FAIL)" fi done chmod 600 "$OUT" echo "=== done ok=$OK fail=$FAIL out=$OUT prefix=$PREFIX ===" if (( OK < 10 )); then echo "Too few users seeded" >&2 exit 1 fi