From 34bd8ac5bfe9c0614e09e25f2bec72bd899a4f31 Mon Sep 17 00:00:00 2001 From: Guo Peng <370090914@qq.com> Date: Wed, 27 Mar 2024 19:11:41 +0800 Subject: [PATCH] feat: validate fallback configuration Signed-off-by: Guo Peng <370090914@qq.com> --- apis/keda/v1alpha1/scaledobject_types.go | 23 ++++++++++++++++++++++ apis/keda/v1alpha1/scaledobject_webhook.go | 10 ++++++++++ 2 files changed, 33 insertions(+) diff --git a/apis/keda/v1alpha1/scaledobject_types.go b/apis/keda/v1alpha1/scaledobject_types.go index 0e8ddf614fe..fb3de9b6b5f 100644 --- a/apis/keda/v1alpha1/scaledobject_types.go +++ b/apis/keda/v1alpha1/scaledobject_types.go @@ -266,3 +266,26 @@ func CheckReplicaCountBoundsAreValid(scaledObject *ScaledObject) error { return nil } + +// CheckFallbackValid checks that the fallback supports scalers with an AverageValue metric target. +// Consequently, it does not support CPU & memory scalers, or scalers targeting a Value metric type. +func CheckFallbackValid(scaledObject *ScaledObject) error { + if scaledObject.Spec.Fallback == nil { + return nil + } + + if scaledObject.Spec.Fallback.FailureThreshold < 0 || scaledObject.Spec.Fallback.Replicas < 0 { + return fmt.Errorf("FailureThreshold=%d & Replicas=%d must both be greater than or equal to 0", + scaledObject.Spec.Fallback.FailureThreshold, scaledObject.Spec.Fallback.Replicas) + } + + for _, trigger := range scaledObject.Spec.Triggers { + if trigger.Type == cpuString || trigger.Type == memoryString { + return fmt.Errorf("type is %s , but fallback it is not supported by the CPU & memory scalers", trigger.Type) + } + if trigger.MetricType != autoscalingv2.AverageValueMetricType { + return fmt.Errorf("MetricType=%s, but Fallback can only be enabled for triggers with metric of type AverageValue", trigger.MetricType) + } + } + return nil +} diff --git a/apis/keda/v1alpha1/scaledobject_webhook.go b/apis/keda/v1alpha1/scaledobject_webhook.go index 4c8253f640c..546cce6e537 100644 --- a/apis/keda/v1alpha1/scaledobject_webhook.go +++ b/apis/keda/v1alpha1/scaledobject_webhook.go @@ -135,6 +135,7 @@ func validateWorkload(so *ScaledObject, action string, dryRun bool) (admission.W verifyScaledObjects, verifyHpas, verifyReplicaCount, + verifyFallback, } for i := range verifyFunctions { @@ -168,6 +169,15 @@ func verifyReplicaCount(incomingSo *ScaledObject, action string, _ bool) error { return nil } +func verifyFallback(incomingSo *ScaledObject, action string, _ bool) error { + err := CheckFallbackValid(incomingSo) + if err != nil { + scaledobjectlog.WithValues("name", incomingSo.Name).Error(err, "validation error") + metricscollector.RecordScaledObjectValidatingErrors(incomingSo.Namespace, action, "incorrect-fallback") + } + return nil +} + func verifyTriggers(incomingObject interface{}, action string, _ bool) error { var triggers []ScaleTriggers var name string