164 lines
6.5 KiB
Bash
164 lines
6.5 KiB
Bash
#!/usr/bin/env bash
|
||
# test_layer1.sh — простой тест пропатченного Fission NSWatcher (Layer 1 only).
|
||
# Без консоли. Только kubectl + fission CLI.
|
||
#
|
||
# Что проверяем:
|
||
#
|
||
# ВАЖНО: Cleanup правило
|
||
# - Тест создает namespace с префиксом test-l1-<timestamp>
|
||
# - cleanup() удаляет этот NS явно через kubectl delete ns
|
||
# - Это гарантирует немедленное удаление и не зависит от cleanup_test_namespaces.sh
|
||
# 1. Создаём NS с меткой fission.io/managed=true
|
||
# 2. Executor регистрирует его через NSWatcher (лог)
|
||
# 3. Создаём Python env + function в новом NS
|
||
# 4. Вызываем функцию — должна ответить 200
|
||
#
|
||
# Запуск: bash ~/terra/fission/test_layer1.sh
|
||
|
||
set -uo pipefail
|
||
|
||
NS="test-l1-$(date +%s | tail -c 6)"
|
||
PASS=0; FAIL=0
|
||
|
||
green() { echo -e "\033[32m PASS: $1\033[0m"; PASS=$((PASS+1)); }
|
||
red() { echo -e "\033[31m FAIL: $1\033[0m"; FAIL=$((FAIL+1)); }
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo " Layer 1 NSWatcher — простой тест"
|
||
echo " NS: $NS"
|
||
echo "========================================"
|
||
|
||
# ── 1. Создаём NS с меткой ────────────────────────────────────────────────────
|
||
echo ""
|
||
echo ">>> [1/5] Создаём NS $NS с меткой fission.io/managed=true..."
|
||
kubectl create ns "$NS"
|
||
kubectl label ns "$NS" fission.io/managed=true --overwrite
|
||
|
||
kubectl get ns "$NS" --show-labels | grep "fission.io/managed"
|
||
if [ $? -eq 0 ]; then
|
||
green "NS создан с меткой"
|
||
else
|
||
red "Метка не применилась"
|
||
exit 1
|
||
fi
|
||
|
||
# ── 2. Ждём регистрации в executor ────────────────────────────────────────────
|
||
echo ""
|
||
echo ">>> [2/5] Ждём регистрации NS в executor (до 15 сек)..."
|
||
|
||
DEADLINE=$((SECONDS + 15))
|
||
REGISTERED=false
|
||
while [ $SECONDS -lt $DEADLINE ]; do
|
||
if kubectl logs -n fission deployment/executor 2>/dev/null | grep "registered namespace" | grep -q "$NS"; then
|
||
REGISTERED=true
|
||
break
|
||
fi
|
||
sleep 2
|
||
done
|
||
|
||
if [ "$REGISTERED" = "true" ]; then
|
||
green "Executor зарегистрировал NS $NS"
|
||
else
|
||
red "Executor НЕ зарегистрировал NS за 15 сек"
|
||
echo " Лог executor (последние строки про namespace):"
|
||
kubectl logs -n fission deployment/executor 2>/dev/null | grep "namespace" | tail -5
|
||
fi
|
||
|
||
# ── 3. Создаём environment в новом NS ─────────────────────────────────────────
|
||
echo ""
|
||
echo ">>> [3/5] Создаём Python environment в NS $NS..."
|
||
|
||
fission env create \
|
||
--name py-env \
|
||
--namespace "$NS" \
|
||
--image ghcr.io/fission/python-env:latest \
|
||
--poolsize 1 2>&1
|
||
|
||
if kubectl get environment py-env -n "$NS" &>/dev/null; then
|
||
green "Environment py-env создан в $NS"
|
||
else
|
||
red "Environment не создался"
|
||
fi
|
||
|
||
# ── 4. Создаём функцию ────────────────────────────────────────────────────────
|
||
echo ""
|
||
echo ">>> [4/5] Создаём функцию hello..."
|
||
|
||
cat > /tmp/hello.py << 'EOF'
|
||
def main():
|
||
return "hello from layer1"
|
||
EOF
|
||
|
||
fission fn create \
|
||
--name hello \
|
||
--namespace "$NS" \
|
||
--env py-env \
|
||
--code /tmp/hello.py 2>&1
|
||
|
||
fission httptrigger create \
|
||
--name hello-route \
|
||
--namespace "$NS" \
|
||
--function hello \
|
||
--url "/${NS}/hello" \
|
||
--method GET 2>&1
|
||
|
||
if kubectl get httptrigger hello-route -n "$NS" &>/dev/null; then
|
||
green "Function + HTTPTrigger созданы"
|
||
else
|
||
red "HTTPTrigger не создался"
|
||
fi
|
||
|
||
# ── 5. Вызываем функцию через внутренний router с JWT ────────────────────────
|
||
echo ""
|
||
echo ">>> [5/5] Вызываем функцию через internal router + JWT (cold start до 180 сек)..."
|
||
|
||
ROUTER_INT="http://router.fission.svc.cluster.local"
|
||
DEADLINE=$((SECONDS + 180))
|
||
FN_OK=false
|
||
|
||
while [ $SECONDS -lt $DEADLINE ]; do
|
||
RESULT=$(kubectl run fn-probe-$$ --rm -i --restart=Never \
|
||
--image=curlimages/curl:8.7.1 \
|
||
--namespace=fission \
|
||
-- sh -c "
|
||
TOKEN=\$(curl -sf --max-time 15 -X POST ${ROUTER_INT}/auth/login \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{\"username\":\"admin\",\"password\":\"7XG1lSg0EFqPLE4pf3He\"}' \
|
||
| grep -o '\"accesstoken\":\"[^\"]*' | cut -d'\"' -f4)
|
||
if [ -z \"\$TOKEN\" ]; then echo 'LOGIN_FAIL|||000'; exit 0; fi
|
||
curl -s -w '|||%{http_code}' --max-time 90 \
|
||
-H \"Authorization: Bearer \$TOKEN\" \
|
||
${ROUTER_INT}/${NS}/hello
|
||
" 2>/dev/null | grep "|||" || echo "|||000")
|
||
CODE=$(echo "$RESULT" | grep -o '|||[0-9]*' | tr -d '|||')
|
||
BODY=$(echo "$RESULT" | sed 's/|||[0-9]*$//')
|
||
echo " HTTP $CODE — $(echo "$BODY" | head -c 80)"
|
||
[ "$CODE" = "200" ] && FN_OK=true && break
|
||
sleep 5
|
||
done
|
||
|
||
if [ "$FN_OK" = "true" ]; then
|
||
green "Функция ответила 200: $BODY"
|
||
else
|
||
red "Функция не ответила 200 (timeout)"
|
||
echo " Логи router (last 3):"
|
||
kubectl logs -n fission deployment/router 2>/dev/null | tail -3
|
||
fi
|
||
|
||
# ── Cleanup ───────────────────────────────────────────────────────────────────
|
||
echo ""
|
||
echo ">>> Cleanup..."
|
||
fission httptrigger delete --name hello-route --namespace "$NS" 2>/dev/null || true
|
||
fission fn delete --name hello --namespace "$NS" 2>/dev/null || true
|
||
fission env delete --name py-env --namespace "$NS" 2>/dev/null || true
|
||
kubectl delete ns "$NS" --wait=false 2>/dev/null || true
|
||
echo " Готово."
|
||
|
||
# ── Итог ─────────────────────────────────────────────────────────────────────
|
||
echo ""
|
||
echo "========================================"
|
||
echo " ИТОГ: PASS=$PASS FAIL=$FAIL"
|
||
echo "========================================"
|
||
[ $FAIL -eq 0 ] && exit 0 || exit 1
|