#!/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