Files
dokku/tests/unit/scheduler-k3s-4.bats
Jose Diaz-Gonzalez f728fc8cd7 fix: only emit keda fallback when a non-cpu/memory trigger exists
Keda 2.17+ rejects ScaledObjects whose spec.fallback is set unless at least one trigger is not a cpu or memory scaler, so unconditionally emitting fallback broke deploys for apps autoscaled on cpu or memory alone. The chart now skips the fallback block when every configured trigger is cpu or memory and keeps the existing behavior otherwise.
2026-04-29 01:10:34 -04:00

188 lines
4.5 KiB
Bash

#!/usr/bin/env bats
load test_helper
TEST_APP="rdmtestapp"
setup() {
uninstall_k3s || true
global_setup
dokku nginx:stop
export KUBECONFIG="/etc/rancher/k3s/k3s.yaml"
}
teardown() {
global_teardown
dokku nginx:start
uninstall_k3s || true
}
@test "(scheduler-k3s) app.json defined service" {
if [[ -z "$DOCKERHUB_USERNAME" ]] || [[ -z "$DOCKERHUB_TOKEN" ]]; then
skip "skipping due to missing docker.io credentials DOCKERHUB_USERNAME:DOCKERHUB_TOKEN"
fi
INGRESS_CLASS=nginx install_k3s
run /bin/bash -c "dokku apps:create $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku ps:scale $TEST_APP web=1 worker=1"
echo "output: $output"
echo "status: $status"
assert_success
run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP inject_app_json
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "kubectl get services $TEST_APP-web -o json | jq -r '.spec.ports[0].port'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "80"
run /bin/bash -c "kubectl get services $TEST_APP-web -o json | jq -r '.spec.ports[0].targetPort'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "5000"
}
@test "(scheduler-k3s) deploy autoscaling cpu-only trigger [keda-fallback]" {
if [[ -z "$DOCKERHUB_USERNAME" ]] || [[ -z "$DOCKERHUB_TOKEN" ]]; then
skip "skipping due to missing docker.io credentials DOCKERHUB_USERNAME:DOCKERHUB_TOKEN"
fi
INGRESS_CLASS=nginx install_k3s
run /bin/bash -c "dokku apps:create $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP inject_cpu_autoscaling_app_json
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "kubectl get scaledobjects.keda.sh $TEST_APP-web -o=jsonpath='{.spec.fallback}'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output ""
run /bin/bash -c "kubectl get scaledobjects.keda.sh $TEST_APP-web -o=jsonpath='{.spec.triggers[0].type}'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "cpu"
}
@test "(scheduler-k3s) deploy autoscaling external trigger [keda-fallback]" {
if [[ -z "$DOCKERHUB_USERNAME" ]] || [[ -z "$DOCKERHUB_TOKEN" ]]; then
skip "skipping due to missing docker.io credentials DOCKERHUB_USERNAME:DOCKERHUB_TOKEN"
fi
INGRESS_CLASS=nginx install_k3s
run /bin/bash -c "dokku apps:create $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP inject_prometheus_autoscaling_app_json
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "kubectl get scaledobjects.keda.sh $TEST_APP-web -o=jsonpath='{.spec.fallback.failureThreshold}'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "3"
run /bin/bash -c "kubectl get scaledobjects.keda.sh $TEST_APP-web -o=jsonpath='{.spec.fallback.replicas}'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "1"
}
inject_app_json() {
local APP="$1"
local APP_REPO_DIR="$2"
[[ -z "$APP" ]] && local APP="$TEST_APP"
cat <<EOF >"$APP_REPO_DIR/app.json"
{
"formation": {
"worker": {
"service": {
"exposed": true
}
}
}
}
EOF
}
inject_cpu_autoscaling_app_json() {
local APP="$1"
local APP_REPO_DIR="$2"
[[ -z "$APP" ]] && local APP="$TEST_APP"
cat <<EOF >"$APP_REPO_DIR/app.json"
{
"formation": {
"web": {
"autoscaling": {
"min_quantity": 1,
"max_quantity": 3,
"triggers": [
{
"name": "cpu-trigger",
"type": "cpu",
"metadata": {
"value": "80"
}
}
]
}
}
}
}
EOF
}
inject_prometheus_autoscaling_app_json() {
local APP="$1"
local APP_REPO_DIR="$2"
[[ -z "$APP" ]] && local APP="$TEST_APP"
cat <<EOF >"$APP_REPO_DIR/app.json"
{
"formation": {
"web": {
"autoscaling": {
"min_quantity": 1,
"max_quantity": 3,
"triggers": [
{
"name": "prom-trigger",
"type": "prometheus",
"metadata": {
"serverAddress": "http://prometheus.example.com:9090",
"metricName": "http_requests_total",
"threshold": "100",
"query": "sum(rate(http_requests_total{deployment=\"[[ .DEPLOYMENT_NAME ]]\"}[2m]))"
}
}
]
}
}
}
}
EOF
}