test: add multi-function stress suite and severe load testing

This commit is contained in:
Naeel
2026-04-14 23:15:26 +03:00
parent b1b990ada3
commit d40c5c6e07
8 changed files with 210 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
def main():
total = 0
for i in range(1, 12000):
total += (i * i) % 97
return f"cpu-ok:{total}"
+2
View File
@@ -0,0 +1,2 @@
def main():
return "fast-ok"
+2
View File
@@ -0,0 +1,2 @@
def main():
return '{"status":"ok","service":"json"}'
+92
View File
@@ -0,0 +1,92 @@
terraform {
required_providers {
fission = {
source = "nail/fission"
version = "~> 0.1.0"
}
}
}
provider "fission" {
kubeconfig_path = "/home/naeel/.kube/config"
namespace = "default"
}
resource "fission_environment" "python" {
name = "tf-stress-python-env"
image = "ghcr.io/fission/python-env"
version = 3
poolsize = 10
}
resource "fission_package" "fast" {
name = "tf-stress-fast-pkg"
environment = fission_environment.python.name
source_dir = "${path.module}/code/fast"
}
resource "fission_function" "fast" {
name = "tf-stress-fast-fn"
environment = fission_environment.python.name
package_name = fission_package.fast.name
entrypoint = "main.main"
}
resource "fission_http_trigger" "fast" {
name = "tf-stress-fast-route"
function = fission_function.fast.name
url = "/stress/fast"
methods = ["GET"]
}
resource "fission_package" "cpu" {
name = "tf-stress-cpu-pkg"
environment = fission_environment.python.name
source_dir = "${path.module}/code/cpu"
}
resource "fission_function" "cpu" {
name = "tf-stress-cpu-fn"
environment = fission_environment.python.name
package_name = fission_package.cpu.name
entrypoint = "main.main"
}
resource "fission_http_trigger" "cpu" {
name = "tf-stress-cpu-route"
function = fission_function.cpu.name
url = "/stress/cpu"
methods = ["GET"]
}
resource "fission_package" "json" {
name = "tf-stress-json-pkg"
environment = fission_environment.python.name
source_dir = "${path.module}/code/json"
}
resource "fission_function" "json" {
name = "tf-stress-json-fn"
environment = fission_environment.python.name
package_name = fission_package.json.name
entrypoint = "main.main"
}
resource "fission_http_trigger" "json" {
name = "tf-stress-json-route"
function = fission_function.json.name
url = "/stress/json"
methods = ["GET"]
}
output "stress_fast_url" {
value = "https://fission.kube5s.ru/stress/fast"
}
output "stress_cpu_url" {
value = "https://fission.kube5s.ru/stress/cpu"
}
output "stress_json_url" {
value = "https://fission.kube5s.ru/stress/json"
}
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
set -euo pipefail
# Суровый параллельный прогон по нескольким endpoint-ам.
BASE_URL=${1:-https://fission.kube5s.ru}
TOTAL_REQUESTS=${2:-600}
CONCURRENCY=${3:-60}
USER_NAME=$(kubectl get secrets/router --template={{.data.username}} -n fission | base64 -d)
USER_PASS=$(kubectl get secrets/router --template={{.data.password}} -n fission | base64 -d)
TOKEN=$(fission token create --username "$USER_NAME" --password "$USER_PASS")
LB_IP=$(kubectl -n ingress get svc shturval-ingress-controller-controller -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
run_load() {
local path="$1"
local label="$2"
echo "[load] endpoint=$label path=$path requests=$TOTAL_REQUESTS concurrency=$CONCURRENCY"
result=$(seq 1 "$TOTAL_REQUESTS" | xargs -P "$CONCURRENCY" -I{} sh -c '
final_code="000"
for attempt in 1 2; do
code=$(curl -sk --resolve fission.kube5s.ru:443:'"$LB_IP"' -H "Authorization: Bearer '"$TOKEN"'" -o /dev/null -w "%{http_code}" '"$BASE_URL$path"')
final_code="$code"
if [ "$code" = "200" ]; then
break
fi
done
if [ "$final_code" = "200" ]; then
echo ok:200
else
echo fail:"$final_code"
fi
')
success=$(printf "%s\n" "$result" | grep -c "^ok:200$" || true)
fail=$(printf "%s\n" "$result" | grep -c "^fail:" || true)
rate=$(awk -v s="$success" -v t="$TOTAL_REQUESTS" 'BEGIN { if (t==0) print 0; else printf "%.2f", (s*100.0)/t }')
codes=$(printf "%s\n" "$result" | grep "^fail:" | cut -d: -f2 | sort | uniq -c | tr '\n' ';' || true)
echo "[result] $label success=$success fail=$fail success_rate=${rate}% fail_codes=[${codes}]"
if [ "$fail" -gt 0 ]; then
echo "[error] load test failed for $label"
return 1
fi
}
run_load "/stress/fast" "fast"
run_load "/stress/cpu" "cpu"
run_load "/stress/json" "json"
echo "[ok] all load tests passed"