Files
fission-console/scripts/test_update.sh
T

106 lines
4.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# test_update.sh — тестирует обновление кода функции:
# PUT /functions/{name}/code → invoke возвращает новый код
# PUT несуществующей → 404
# PUT с пустым кодом → 400
# ВАЖНО: использует 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)
SUB="livetest@test.local"
FN="t-upd-fn-${RUN_ID}"
cleanup() {
curl -s -X DELETE "${BASE}/functions/${FN}" -H "X-Auth-Token: ${SUB}" > /dev/null 2>&1 || true
}
trap cleanup EXIT
echo ""
echo "========================================"
echo " test_update.sh run=$RUN_ID"
echo "========================================"
# ── Создаём функцию с начальным кодом ────────────────────────────────────────
echo ""
echo ">>> CREATE: версия v1"
CODE_V1='module.exports = async function() { return { status: 200, body: "version-one" }; }'
R=$(curl -s -w "\n%{http_code}" -X POST "${BASE}/functions" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d "{\"name\":\"${FN}\",\"language\":\"nodejs\",\"code\":$(printf '%s' "$CODE_V1" | json_escape)}")
check_http "$(echo "$R" | tail -1)" "201" "CREATE v1 → 201"
echo "Ждём прогрева..."
if wait_invoke "$SUB" "$FN" "version-one" 12 5; then
pass "Invoke v1 → version-one"
else
fail "Invoke v1 не стабилизировался"
fi
# ── PUT /code → 200 ──────────────────────────────────────────────────────────
echo ""
echo ">>> PUT /code: версия v2"
CODE_V2='module.exports = async function() { return { status: 200, body: "version-two" }; }'
R=$(curl -s -w "\n%{http_code}" -X PUT "${BASE}/functions/${FN}/code" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d "{\"code\":$(printf '%s' "$CODE_V2" | json_escape)}")
CODE=$(echo "$R" | tail -1)
BODY=$(echo "$R" | sed '$d')
check_http "$CODE" "200" "PUT /code v2 → 200"
UPDATED=$(json_field "$BODY" updated)
[ "$UPDATED" = "True" ] || [ "$UPDATED" = "true" ] && pass "PUT /code: updated=true" || fail "PUT /code: updated='$UPDATED'"
NEW_PKG=$(json_field "$BODY" package)
[ -n "$NEW_PKG" ] && pass "PUT /code: новый package=$NEW_PKG" || fail "PUT /code: package пустой"
echo "Ждём пока executor подхватит новый код..."
if wait_invoke "$SUB" "$FN" "version-two" 15 5; then
pass "Invoke после update → version-two"
else
fail "Invoke после update не вернул version-two"
fi
# ── PUT с пустым кодом → 400 ──────────────────────────────────────────────────
echo ""
echo ">>> PUT /code: пустой код → 400"
R=$(curl -s -w "\n%{http_code}" -X PUT "${BASE}/functions/${FN}/code" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d '{"code":""}')
check_http "$(echo "$R" | tail -1)" "400" "PUT /code пустой код → 400"
R=$(curl -s -w "\n%{http_code}" -X PUT "${BASE}/functions/${FN}/code" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d '{"code":" "}')
check_http "$(echo "$R" | tail -1)" "400" "PUT /code пробельный код → 400"
# ── PUT несуществующей → 404 ──────────────────────────────────────────────────
echo ""
echo ">>> PUT /code: несуществующая функция → 404"
R=$(curl -s -w "\n%{http_code}" -X PUT "${BASE}/functions/no-such-fn-xyz/code" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d "{\"code\":$(printf '%s' "$CODE_V1" | json_escape)}")
check_http "$(echo "$R" | tail -1)" "404" "PUT /code несуществующая → 404"
# ── Ещё одно обновление (v3) — убеждаемся что можно делать цепочку ────────────
echo ""
echo ">>> PUT /code: версия v3 (цепочка)"
CODE_V3='module.exports = async function() { return { status: 200, body: "version-three" }; }'
curl -s -X PUT "${BASE}/functions/${FN}/code" \
-H "X-Auth-Token: ${SUB}" -H "Content-Type: application/json" \
-d "{\"code\":$(printf '%s' "$CODE_V3" | json_escape)}" > /dev/null
if wait_invoke "$SUB" "$FN" "version-three" 15 5; then
pass "Invoke после v3 update → version-three"
else
fail "Invoke после v3 update не стабилизировался"
fi
print_summary