Files
fission-console/scripts/test_invoke.sh
T

91 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# test_invoke.sh — тестирует вызов функций:
# NodeJS и Python: create → wait cold start → invoke → проверка тела.
# Invoke несуществующей функции → 404.
# ВАЖНО: использует livetest@test.local — прогретый namespace в kube кластере.
# Для новых namespace fission router требует перезапуска (watchedNamespaces).
set -uo pipefail
ROOT_DIR=$(cd "$(dirname "$0")" && pwd)
source "${ROOT_DIR}/lib.sh"
RUN_ID=$(mk_run_id)
# Используем прогретый namespace — fission router его знает.
SUB="livetest@test.local"
FN_NODE="node-fn-${RUN_ID}"
FN_PY="py-fn-${RUN_ID}"
cleanup() {
# Удаляем только конкретные функции через API, не весь namespace.
for fn in "$FN_NODE" "$FN_PY"; do
curl -s -X DELETE "${BASE}/functions/${fn}" -H "X-Auth-Token: ${SUB}" > /dev/null 2>&1 || true
done
}
trap cleanup EXIT
echo ""
echo "========================================"
echo " test_invoke.sh run=$RUN_ID"
echo "========================================"
# ── Invoke несуществующей ─────────────────────────────────────────────────
echo ""
echo ">>> INVOKE несуществующей функции → 404"
R=$(curl -s -w "\n%{http_code}" -X POST "${BASE}/functions/no-such-fn-xyz-${RUN_ID}/invoke" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" -d '{}')
check_http "$(echo "$R" | tail -1)" "404" "INVOKE несуществующей → 404"
# ── NodeJS ────────────────────────────────────────────────────────────────────
echo ""
echo ">>> NodeJS: create + invoke"
JS_CODE='module.exports = async function(ctx) { return { status: 200, body: "node-invoke-ok" }; }'
R=$(curl -s -w "\n%{http_code}" -X POST "${BASE}/functions" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d "{\"name\":\"${FN_NODE}\",\"language\":\"nodejs\",\"code\":$(printf '%s' "$JS_CODE" | json_escape)}")
check_http "$(echo "$R" | tail -1)" "201" "NodeJS CREATE → 201"
if wait_invoke "$SUB" "$FN_NODE" "node-invoke-ok" 12 5; then
pass "NodeJS invoke → 200, тело содержит node-invoke-ok"
else
fail "NodeJS invoke не стабилизировался за 60s"
fi
# Второй вызов — проверяем что работает warm path
R=$(curl -s --max-time 30 -X POST "${BASE}/functions/${FN_NODE}/invoke" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" -d '{}')
STATUS=$(json_field "$R" status)
[ "$STATUS" = "200" ] && pass "NodeJS второй invoke → 200 (warm)" || fail "NodeJS второй invoke → status=$STATUS"
# ── Python ───────────────────────────────────────────────────────────────────
echo ""
echo ">>> Python: create + invoke"
PY_CODE=$(printf 'def main():\n return "py-invoke-ok", 200' | json_escape)
R=$(curl -s -w "\n%{http_code}" -X POST "${BASE}/functions" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d "{\"name\":\"${FN_PY}\",\"language\":\"python\",\"code\":${PY_CODE}}")
check_http "$(echo "$R" | tail -1)" "201" "Python CREATE → 201"
if wait_invoke "$SUB" "$FN_PY" "py-invoke-ok" 15 5; then
pass "Python invoke → 200, тело содержит py-invoke-ok"
else
fail "Python invoke не стабилизировался за 75s"
fi
# ── Invoke возвращает корректные поля ─────────────────────────────────────────
echo ""
echo ">>> Invoke response fields"
R=$(curl -s --max-time 30 -X POST "${BASE}/functions/${FN_NODE}/invoke" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" -d '{}')
STATUS=$(json_field "$R" status)
LATENCY=$(json_field "$R" latency_ms)
RAW=$(json_field "$R" response_raw)
[ "$STATUS" = "200" ] && pass "invoke.status = 200" || fail "invoke.status = $STATUS"
printf '%s' "$LATENCY" | grep -qE '^[0-9]+$' && pass "invoke.latency_ms = $LATENCY ms" || fail "invoke.latency_ms не число: $LATENCY"
[ -n "$RAW" ] && pass "invoke.response_raw непустой" || fail "invoke.response_raw пустой"
print_summary