#!/usr/bin/env bash set -euo pipefail BASE="https://fission.kube5s.ru/console/api" COUNT=${1:-10} RUN_ID="mt$(date +%s | tail -c 6)" ROOT_DIR=$(cd "$(dirname "$0")" && pwd) NS_CLEANUP_SCRIPT="${ROOT_DIR}/cleanup_test_namespaces.sh" TMP=$(mktemp -d) declare -a USERS=() cleanup() { rm -rf "$TMP" 2>/dev/null || true if [ -x "$NS_CLEANUP_SCRIPT" ] && [ ${#USERS[@]} -gt 0 ]; then KUBECTL_DIRECT=1 "$NS_CLEANUP_SCRIPT" "${USERS[@]}" >/dev/null 2>&1 || true fi } trap cleanup EXIT json_escape() { python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))' } init_call() { local user="$1" local code="" local try for try in 1 2 3; do code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 30 -X GET "${BASE}/functions" -H "X-Test-Sub: ${user}" 2>/dev/null || echo 000) echo "INIT_TRY user=${user} try=${try} http=${code}" >&2 if [ "$code" = "200" ]; then printf '%s' "$code" return 0 fi [ "$try" -lt 3 ] && sleep 2 done printf '%s' "$code" } echo "=== MULTIUSER TEST START run=$RUN_ID count=$COUNT ===" for i in $(seq 1 "$COUNT"); do USERS+=("${RUN_ID}-u${i}@test.local") ( U="${RUN_ID}-u${i}@test.local" CODE=$(init_call "${U}") echo "$i:$CODE:$U" > "${TMP}/init-$i" ) & done wait INIT_OK=0 for i in $(seq 1 "$COUNT"); do R=$(cat "${TMP}/init-$i" 2>/dev/null || echo "$i:000:") C=$(echo "$R" | cut -d: -f2) if [ "$C" = "200" ]; then INIT_OK=$((INIT_OK+1)) else echo "INIT_FAIL user$i http=$C" fi done echo "INIT_OK=$INIT_OK/$COUNT" for i in $(seq 1 "$COUNT"); do ( U="${RUN_ID}-u${i}@test.local" FN="mtfn-${RUN_ID}-${i}" CODE_TEXT=$(printf 'def main():\n return "ok-%s-%s"\n' "$RUN_ID" "$i") CODE_JSON=$(printf '%s' "$CODE_TEXT" | json_escape) BODY=$(printf '{"name":"%s","language":"python","code":%s}' "$FN" "$CODE_JSON") C=$(curl -s -o /dev/null -w "%{http_code}" --max-time 60 -X POST "${BASE}/functions" -H "X-Test-Sub: ${U}" -H "Content-Type: application/json" -d "$BODY" 2>/dev/null || echo 000) echo "$i:$C:$FN:$U" > "${TMP}/create-$i" ) & done wait CREATE_OK=0 for i in $(seq 1 "$COUNT"); do R=$(cat "${TMP}/create-$i" 2>/dev/null || echo "$i:000::") C=$(echo "$R" | cut -d: -f2) if [ "$C" = "200" ] || [ "$C" = "201" ]; then CREATE_OK=$((CREATE_OK+1)) else echo "CREATE_FAIL user$i http=$C" fi done echo "CREATE_OK=$CREATE_OK/$COUNT" sleep 8 for i in $(seq 1 "$COUNT"); do ( U="${RUN_ID}-u${i}@test.local" FN="mtfn-${RUN_ID}-${i}" C=$(curl -s -o /dev/null -w "%{http_code}" --max-time 40 -X POST "${BASE}/functions/${FN}/invoke" -H "X-Test-Sub: ${U}" -H "Content-Type: application/json" -d '{}' 2>/dev/null || echo 000) echo "$i:$C" > "${TMP}/invoke-$i" ) & done wait INVOKE_OK=0 for i in $(seq 1 "$COUNT"); do R=$(cat "${TMP}/invoke-$i" 2>/dev/null || echo "$i:000") C=$(echo "$R" | cut -d: -f2) if [ "$C" = "200" ]; then INVOKE_OK=$((INVOKE_OK+1)) else echo "INVOKE_FAIL user$i http=$C" fi done echo "INVOKE_OK=$INVOKE_OK/$COUNT" echo "=== MULTIUSER TEST END ===" [ "$INIT_OK" = "$COUNT" ] [ "$CREATE_OK" = "$COUNT" ] [ "$INVOKE_OK" = "$COUNT" ]