Files
fission-console/smoke_live_multiuser.sh
T

135 lines
3.7 KiB
Bash
Executable File

#!/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"
}
invoke_call() {
local user="$1"
local fn="$2"
local code=""
local try
for try in 1 2 3 4; do
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 40 -X POST "${BASE}/functions/${fn}/invoke" -H "X-Test-Sub: ${user}" -H "Content-Type: application/json" -d '{}' 2>/dev/null || echo 000)
echo "INVOKE_TRY user=${user} fn=${fn} try=${try} http=${code}" >&2
if [ "$code" = "200" ]; then
printf '%s' "$code"
return 0
fi
[ "$try" -lt 4 ] && sleep 4
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=$(invoke_call "${U}" "${FN}")
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" ]