#!/usr/bin/env bash # test_layer1.sh — простой тест пропатченного Fission NSWatcher (Layer 1 only). # Без консоли. Только kubectl + fission CLI. # # Что проверяем: # # ВАЖНО: Cleanup правило # - Тест создает namespace с префиксом test-l1- # - 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