diff --git a/pkg/collector/reconcile/deployment.go b/pkg/collector/reconcile/deployment.go index 247a932579..d8bb01d54e 100644 --- a/pkg/collector/reconcile/deployment.go +++ b/pkg/collector/reconcile/deployment.go @@ -24,6 +24,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/pkg/collector" "github.com/open-telemetry/opentelemetry-operator/pkg/targetallocator" ) @@ -98,14 +99,8 @@ func expectedDeployments(ctx context.Context, params Params, expected []appsv1.D updated.ObjectMeta.Labels[k] = v } - // if autoscale is enabled, use replicas from current Status if params.Instance.Spec.MaxReplicas != nil { - currentReplicas := existing.Status.Replicas - // if replicas (minReplicas from HPA perspective) is bigger than - // current status use it. - if params.Instance.Spec.Replicas != nil && *params.Instance.Spec.Replicas > currentReplicas { - currentReplicas = *params.Instance.Spec.Replicas - } + currentReplicas := currentReplicasWithHPA(params.Instance.Spec, existing.Status.Replicas) updated.Spec.Replicas = ¤tReplicas } @@ -154,3 +149,16 @@ func deleteDeployments(ctx context.Context, params Params, expected []appsv1.Dep return nil } + +// currentReplicasWithHPA calculates deployment replicas if HPA is enabled. +func currentReplicasWithHPA(spec v1alpha1.OpenTelemetryCollectorSpec, curr int32) int32 { + if curr < *spec.Replicas { + return *spec.Replicas + } + + if curr > *spec.MaxReplicas { + return *spec.MaxReplicas + } + + return curr +} diff --git a/pkg/collector/reconcile/deployment_test.go b/pkg/collector/reconcile/deployment_test.go index aa955af3a8..5a513d098b 100644 --- a/pkg/collector/reconcile/deployment_test.go +++ b/pkg/collector/reconcile/deployment_test.go @@ -234,3 +234,21 @@ func TestExpectedDeployments(t *testing.T) { }) } + +func TestCurrentReplicasWithHPA(t *testing.T) { + minReplicas := int32(2) + maxReplicas := int32(5) + spec := v1alpha1.OpenTelemetryCollectorSpec{ + Replicas: &minReplicas, + MaxReplicas: &maxReplicas, + } + + res := currentReplicasWithHPA(spec, 10) + assert.Equal(t, int32(5), res) + + res = currentReplicasWithHPA(spec, 1) + assert.Equal(t, int32(2), res) + + res = currentReplicasWithHPA(spec, 3) + assert.Equal(t, int32(3), res) +}