docs(loadtest): hold/stress профили и правила безопасности IFT. Refs EventHub/EventHubBack#31 [skip ci]
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user