From 88f7c2da15433127872fb4f1e5d5468d27a6b738 Mon Sep 17 00:00:00 2001 From: svijaykumar-px Date: Mon, 26 Feb 2024 05:51:43 +0000 Subject: [PATCH] do not allow pdb annotation lesser than px quorum --- .../portworx/component/disruption_budget.go | 6 ++++-- drivers/storage/portworx/components_test.go | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/drivers/storage/portworx/component/disruption_budget.go b/drivers/storage/portworx/component/disruption_budget.go index 01e56b282..b99ff166e 100644 --- a/drivers/storage/portworx/component/disruption_budget.go +++ b/drivers/storage/portworx/component/disruption_budget.go @@ -1,6 +1,7 @@ package component import ( + "math" "strconv" "github.com/hashicorp/go-version" @@ -119,9 +120,10 @@ func (c *disruptionBudget) createPortworxPodDisruptionBudget( } // Set minAvailable value to storagenodes-1 if no value is provided, - // or if the user provided value is lesser than 0 + // or if the user provided value is lesser storageNodes/2 +1 (px quorum) // or greater than or equal to the number of storage nodes. - if userProvidedMinValue < 0 || userProvidedMinValue >= storageNodesCount { + quorumValue := math.Floor(float64(storageNodesCount)/2) + 1 + if userProvidedMinValue < int(quorumValue) || userProvidedMinValue >= storageNodesCount { logrus.Warnf("Value for px-storage pod disruption budget not provided or is invalid, using default calculated value %d: ", storageNodesCount-1) minAvailable = storageNodesCount - 1 } else { diff --git a/drivers/storage/portworx/components_test.go b/drivers/storage/portworx/components_test.go index a9b460778..0e756a9b9 100644 --- a/drivers/storage/portworx/components_test.go +++ b/drivers/storage/portworx/components_test.go @@ -4,13 +4,14 @@ import ( "context" "encoding/json" "fmt" - routev1 "github.com/openshift/api/route/v1" "math/rand" "strconv" "strings" "testing" "time" + routev1 "github.com/openshift/api/route/v1" + "github.com/golang-jwt/jwt/v4" "github.com/golang/mock/gomock" ocpconfig "github.com/openshift/api/config/v1" @@ -12518,6 +12519,19 @@ func TestPodDisruptionBudgetEnabled(t *testing.T) { require.Equal(t, 4, storagePDB.Spec.MinAvailable.IntValue()) + // TestCase: When annotation to override PDB value is lesser than num(storagenodes)/2 +1 + // Ignore annotation and use default PDB calculation + cluster.Annotations[pxutil.AnnotationStoragePodDisruptionBudget] = "2" + + err = driver.PreInstall(cluster) + require.NoError(t, err) + + storagePDB = &policyv1.PodDisruptionBudget{} + err = testutil.Get(k8sClient, storagePDB, component.StoragePodDisruptionBudgetName, cluster.Namespace) + require.NoError(t, err) + + require.Equal(t, 4, storagePDB.Spec.MinAvailable.IntValue()) + // TestCase: Use NonQuorumMember flag to determine storage node count cluster.Annotations[pxutil.AnnotationStoragePodDisruptionBudget] = "" expectedNodeEnumerateResp.Nodes = []*osdapi.StorageNode{