From 2cb3ae9a562a352096744f92f8a0c585b0ff0388 Mon Sep 17 00:00:00 2001 From: Kirill Ilin Date: Tue, 2 Apr 2024 22:01:47 +0500 Subject: [PATCH] fix validation for zero value in PDB --- api/v1alpha1/etcdcluster_webhook.go | 5 +++-- api/v1alpha1/etcdcluster_webhook_test.go | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/api/v1alpha1/etcdcluster_webhook.go b/api/v1alpha1/etcdcluster_webhook.go index 676829ae..8c5ca56b 100644 --- a/api/v1alpha1/etcdcluster_webhook.go +++ b/api/v1alpha1/etcdcluster_webhook.go @@ -25,6 +25,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -146,7 +147,7 @@ func (r *EtcdCluster) validatePdb() (admission.Warnings, field.ErrorList) { minQuorumSize := r.CalculateQuorumSize() if pdb.Spec.MinAvailable != nil { minAvailable := pdb.Spec.MinAvailable.IntValue() - if pdb.Spec.MinAvailable.IntVal == 0 && pdb.Spec.MinAvailable.IntValue() == 0 { + if pdb.Spec.MinAvailable.Type == intstr.String && minAvailable == 0 && pdb.Spec.MinAvailable.StrVal != "0" { var percentage int _, err := fmt.Sscanf(pdb.Spec.MinAvailable.StrVal, "%d%%", &percentage) if err != nil { @@ -180,7 +181,7 @@ func (r *EtcdCluster) validatePdb() (admission.Warnings, field.ErrorList) { } if pdb.Spec.MaxUnavailable != nil { maxUnavailable := pdb.Spec.MaxUnavailable.IntValue() - if pdb.Spec.MaxUnavailable.IntVal == 0 && pdb.Spec.MaxUnavailable.IntValue() == 0 { + if pdb.Spec.MaxUnavailable.Type == intstr.String && maxUnavailable == 0 && pdb.Spec.MaxUnavailable.StrVal != "0" { var percentage int _, err := fmt.Sscanf(pdb.Spec.MaxUnavailable.StrVal, "%d%%", &percentage) if err != nil { diff --git a/api/v1alpha1/etcdcluster_webhook_test.go b/api/v1alpha1/etcdcluster_webhook_test.go index 4ce58aef..d6264e90 100644 --- a/api/v1alpha1/etcdcluster_webhook_test.go +++ b/api/v1alpha1/etcdcluster_webhook_test.go @@ -239,5 +239,17 @@ var _ = Describe("EtcdCluster Webhook", func() { } } }) + It("should correctly use zero numeric value for maxUnavailable PDB", func() { + localCluster := etcdCluster.DeepCopy() + localCluster.Spec.PodDisruptionBudget.Spec.MaxUnavailable = ptr.To(intstr.FromInt32(int32(0))) + _, err := localCluster.validatePdb() + Expect(err).To(BeNil()) + }) + It("should correctly use zero string value for PDB", func() { + localCluster := etcdCluster.DeepCopy() + localCluster.Spec.PodDisruptionBudget.Spec.MaxUnavailable = ptr.To(intstr.FromString("0")) + _, err := localCluster.validatePdb() + Expect(err).To(BeNil()) + }) }) })