135 lines
3.7 KiB
Bash
Executable File
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-Auth-Token: ${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-Auth-Token: ${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-Auth-Token: ${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" ]
|