diff --git a/CHANGELOG.md b/CHANGELOG.md index 99acaf8dee9..127fc1c5eb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ To learn more about active deprecations, we recommend checking [GitHub Discussio ### Fixes - **Admission Webhooks**: Allow to remove the finalizer even if the ScaledObject isn't valid ([#4396](https://github.com/kedacore/keda/issue/4396)) +- **ScaledJob**: Check if MaxReplicaCount is nil before access to it ([#4568]https://github.com/kedacore/keda/issues/4568) - **AWS SQS Scaler**: Respect `scaleOnInFlight` value ([#4276](https://github.com/kedacore/keda/issue/4276)) - **Azure Pipelines**: Fix for disallowing `$top` on query when using `meta.parentID` method ([#4397]) - **Azure Pipelines**: Respect all required demands ([#4404](https://github.com/kedacore/keda/issues/4404)) diff --git a/apis/keda/v1alpha1/scaledjob_types.go b/apis/keda/v1alpha1/scaledjob_types.go index 24ecea53d72..d9e179bd725 100644 --- a/apis/keda/v1alpha1/scaledjob_types.go +++ b/apis/keda/v1alpha1/scaledjob_types.go @@ -21,6 +21,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const ( + defaultScaledJobMaxReplicaCount = 100 + defaultScaledJobMinReplicaCount = 0 +) + // +genclient // +kubebuilder:object:root=true // +kubebuilder:subresource:status @@ -114,19 +119,23 @@ func init() { // MaxReplicaCount returns MaxReplicaCount func (s ScaledJob) MaxReplicaCount() int64 { if s.Spec.MaxReplicaCount != nil { + if s.Spec.MinReplicaCount != nil && *s.Spec.MinReplicaCount > *s.Spec.MaxReplicaCount { + return int64(*s.Spec.MaxReplicaCount) + } return int64(*s.Spec.MaxReplicaCount) - s.MinReplicaCount() } - return 100 + return defaultScaledJobMaxReplicaCount } // MinReplicaCount returns MinReplicaCount func (s ScaledJob) MinReplicaCount() int64 { if s.Spec.MinReplicaCount != nil { - if *s.Spec.MinReplicaCount > *s.Spec.MaxReplicaCount { + if s.Spec.MaxReplicaCount != nil && + *s.Spec.MinReplicaCount > *s.Spec.MaxReplicaCount { return int64(*s.Spec.MaxReplicaCount) } return int64(*s.Spec.MinReplicaCount) } - return 0 + return defaultScaledJobMinReplicaCount } diff --git a/apis/keda/v1alpha1/scaledjob_types_test.go b/apis/keda/v1alpha1/scaledjob_types_test.go new file mode 100644 index 00000000000..4e6e81065e3 --- /dev/null +++ b/apis/keda/v1alpha1/scaledjob_types_test.go @@ -0,0 +1,98 @@ +/* +Copyright 2023 The KEDA Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + "testing" +) + +func TestScaledJob(t *testing.T) { + tests := []struct { + name string + expectedMax int64 + expectedMin int64 + maxReplicas *int32 + minReplicas *int32 + }{ + { + name: "MaxReplicaCount is set to 10 and MinReplicaCount is set to 0", + expectedMax: 10, + expectedMin: 0, + maxReplicas: int32Ptr(10), + minReplicas: int32Ptr(0), + }, + { + name: "MaxReplicaCount is set to 10 and MinReplicaCount is nil", + expectedMax: 10, + expectedMin: defaultScaledJobMinReplicaCount, + maxReplicas: int32Ptr(10), + minReplicas: nil, + }, + { + name: "MaxReplicaCount is set to 10 and MinReplicaCount is set to 1", + expectedMax: 9, + expectedMin: 1, + maxReplicas: int32Ptr(10), + minReplicas: int32Ptr(1), + }, + { + name: "MaxReplicaCount is nil and MinReplicaCount is set to 1", + expectedMax: defaultScaledJobMaxReplicaCount, + expectedMin: 1, + maxReplicas: nil, + minReplicas: int32Ptr(1), + }, + { + name: "MaxReplicaCount is nil and MinReplicaCount nil", + expectedMax: defaultScaledJobMaxReplicaCount, + expectedMin: defaultScaledJobMinReplicaCount, + maxReplicas: nil, + minReplicas: nil, + }, + { + name: "MaxReplicaCount is set to 1 and MinReplicaCount is set to 10", + expectedMax: 1, + expectedMin: 1, + maxReplicas: int32Ptr(1), + minReplicas: int32Ptr(10), + }, + } + + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + scaledJob := &ScaledJob{ + Spec: ScaledJobSpec{ + MaxReplicaCount: test.maxReplicas, + MinReplicaCount: test.minReplicas, + }, + } + + if scaledJob.MaxReplicaCount() != test.expectedMax { + t.Errorf("MaxReplicaCount()=%d, expected %d", scaledJob.MaxReplicaCount(), test.expectedMax) + } + + if scaledJob.MinReplicaCount() != test.expectedMin { + t.Errorf("MinReplicaCount()=%d, expected %d", scaledJob.MinReplicaCount(), test.expectedMin) + } + }) + } +} + +func int32Ptr(i int32) *int32 { + return &i +}