diff --git a/CHANGELOG.md b/CHANGELOG.md index 963665fd4b7..a6b8bf2a047 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,6 +75,10 @@ Here is an overview of all new **experimental** features: ### Fixes +- **General**: Centralize and improve automaxprocs configuration with proper structured logging ([#5970](https://github.com/kedacore/keda/issues/5970)) +- **General**: Paused ScaledObject count is reported correctly after operator restart ([#6321](https://github.com/kedacore/keda/issues/6321)) +- **General**: Revise some annotations above function and fix fallback check bug ([#6407](https://github.com/kedacore/keda/pull/6407)) +- **General**: ScaledJobs ready status set to true when recoverred problem ([#6329](https://github.com/kedacore/keda/pull/6329)) - **AWS Scalers**: Add AWS region to the AWS Config Cache key ([#6128](https://github.com/kedacore/keda/issues/6128)) ### Deprecations diff --git a/apis/keda/v1alpha1/scaledobject_types.go b/apis/keda/v1alpha1/scaledobject_types.go index ce810528485..24383ab96a9 100644 --- a/apis/keda/v1alpha1/scaledobject_types.go +++ b/apis/keda/v1alpha1/scaledobject_types.go @@ -23,8 +23,11 @@ import ( autoscalingv2 "k8s.io/api/autoscaling/v2" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + logf "sigs.k8s.io/controller-runtime/pkg/log" ) +var scaledobjecttypeslog = logf.Log.WithName("scaledobject-types") + // +genclient // +kubebuilder:object:root=true // +kubebuilder:subresource:status @@ -237,7 +240,7 @@ func (so *ScaledObject) IsUsingModifiers() bool { return so.Spec.Advanced != nil && !reflect.DeepEqual(so.Spec.Advanced.ScalingModifiers, ScalingModifiers{}) } -// getHPAMinReplicas returns MinReplicas based on definition in ScaledObject or default value if not defined +// GetHPAMinReplicas returns MinReplicas based on definition in ScaledObject or default value if not defined func (so *ScaledObject) GetHPAMinReplicas() *int32 { if so.Spec.MinReplicaCount != nil && *so.Spec.MinReplicaCount > 0 { return so.Spec.MinReplicaCount @@ -246,7 +249,7 @@ func (so *ScaledObject) GetHPAMinReplicas() *int32 { return &tmp } -// getHPAMaxReplicas returns MaxReplicas based on definition in ScaledObject or default value if not defined +// GetHPAMaxReplicas returns MaxReplicas based on definition in ScaledObject or default value if not defined func (so *ScaledObject) GetHPAMaxReplicas() int32 { if so.Spec.MaxReplicaCount != nil { return *so.Spec.MaxReplicaCount @@ -254,7 +257,7 @@ func (so *ScaledObject) GetHPAMaxReplicas() int32 { return defaultHPAMaxReplicas } -// checkReplicaCountBoundsAreValid checks that Idle/Min/Max ReplicaCount defined in ScaledObject are correctly specified +// CheckReplicaCountBoundsAreValid checks that Idle/Min/Max ReplicaCount defined in ScaledObject are correctly specified // i.e. that Min is not greater than Max or Idle greater or equal to Min func CheckReplicaCountBoundsAreValid(scaledObject *ScaledObject) error { min := int32(0) @@ -288,10 +291,10 @@ func CheckFallbackValid(scaledObject *ScaledObject) error { 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) + scaledobjecttypeslog.Error(nil, fmt.Sprintf("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 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 62325038866..c37252d3035 100644 --- a/apis/keda/v1alpha1/scaledobject_webhook.go +++ b/apis/keda/v1alpha1/scaledobject_webhook.go @@ -193,7 +193,7 @@ func verifyFallback(incomingSo *ScaledObject, action string, _ bool) error { scaledobjectlog.WithValues("name", incomingSo.Name).Error(err, "validation error") metricscollector.RecordScaledObjectValidatingErrors(incomingSo.Namespace, action, "incorrect-fallback") } - return nil + return err } func verifyTriggers(incomingObject interface{}, action string, _ bool) error { diff --git a/apis/keda/v1alpha1/scaledobject_webhook_test.go b/apis/keda/v1alpha1/scaledobject_webhook_test.go index e30404d16c4..6c1328fb702 100644 --- a/apis/keda/v1alpha1/scaledobject_webhook_test.go +++ b/apis/keda/v1alpha1/scaledobject_webhook_test.go @@ -176,8 +176,8 @@ var _ = It("shouldn't validate the so creation when the fallback is wrong", func }).Should(HaveOccurred()) }) -var _ = It("shouldn't validate the so creation When the fallback are configured and the scaler is either CPU or memory.", func() { - namespaceName := "wrong-fallback-cpu-memory" +var _ = It("should validate the so creation When the fallback are configured and the scaler is either CPU or memory.", func() { + namespaceName := "right-fallback-cpu-memory" namespace := createNamespace(namespaceName) workload := createDeployment(namespaceName, true, true) so := createScaledObject(soName, namespaceName, workloadName, "apps/v1", "Deployment", true, map[string]string{}, "") @@ -185,6 +185,9 @@ var _ = It("shouldn't validate the so creation When the fallback are configured FailureThreshold: 3, Replicas: 6, } + for index := range so.Spec.Triggers { + so.Spec.Triggers[index].MetricType = "AverageValue" + } err := k8sClient.Create(context.Background(), namespace) Expect(err).ToNot(HaveOccurred()) @@ -193,7 +196,7 @@ var _ = It("shouldn't validate the so creation When the fallback are configured Eventually(func() error { return k8sClient.Create(context.Background(), so) - }).Should(HaveOccurred()) + }).ShouldNot(HaveOccurred()) }) var _ = It("shouldn't validate the so creation when there is another unmanaged hpa and so has transfer-hpa-ownership activated", func() { diff --git a/tests/internals/fallback/fallback_test.go b/tests/internals/fallback/fallback_test.go index 37cd8f03391..86940dc215a 100644 --- a/tests/internals/fallback/fallback_test.go +++ b/tests/internals/fallback/fallback_test.go @@ -189,6 +189,7 @@ spec: url: "{{.MetricsServerEndpoint}}" valueLocation: 'value' method: "query" + metricType: "AverageValue" authenticationRef: name: {{.TriggerAuthName}} ` diff --git a/tests/internals/scaling_modifiers/scaling_modifiers_test.go b/tests/internals/scaling_modifiers/scaling_modifiers_test.go index bc09c72fa2b..86f5ea2d5ab 100644 --- a/tests/internals/scaling_modifiers/scaling_modifiers_test.go +++ b/tests/internals/scaling_modifiers/scaling_modifiers_test.go @@ -163,12 +163,14 @@ spec: url: "{{.MetricsServerEndpoint}}" valueLocation: 'value' method: "query" + metricType: "AverageValue" authenticationRef: name: {{.TriggerAuthName}} - type: kubernetes-workload name: kw_trig metadata: podSelector: pod=workload-test + metricType: "AverageValue" ` soComplexFormula = ` @@ -205,12 +207,14 @@ spec: url: "{{.MetricsServerEndpoint}}" valueLocation: 'value' method: "query" + metricType: "AverageValue" authenticationRef: name: {{.TriggerAuthName}} - type: kubernetes-workload name: kw_trig metadata: podSelector: pod=workload-test + metricType: "AverageValue" ` workloadDeploymentTemplate = `