Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PWX-36475 : Creating node PDB for parallel upgrades #1508

Merged
merged 10 commits into from
May 27, 2024
110 changes: 103 additions & 7 deletions drivers/storage/portworx/component/disruption_budget.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package component

import (
"context"
"fmt"
"math"
"strconv"

"github.com/hashicorp/go-version"
"github.com/libopenstorage/openstorage/api"
"github.com/sirupsen/logrus"
"google.golang.org/grpc"
policyv1 "k8s.io/api/policy/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/client-go/tools/record"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand Down Expand Up @@ -71,9 +75,40 @@
if err := c.createKVDBPodDisruptionBudget(cluster, ownerRef); err != nil {
return err
}
if err := c.createPortworxPodDisruptionBudget(cluster, ownerRef); err != nil {
// Create node PDB only if parallel upgrade is supported
var err error
c.sdkConn, err = pxutil.GetPortworxConn(c.sdkConn, c.k8sClient, cluster.Namespace)
if err != nil {

Check warning on line 81 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L79-L81

Added lines #L79 - L81 were not covered by tests
return err
}

// Get list of portworx storage nodes
nodeClient := api.NewOpenStorageNodeClient(c.sdkConn)
ctx, err := pxutil.SetupContextWithToken(context.Background(), cluster, c.k8sClient)
if err != nil {
return err

Check warning on line 89 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L86-L89

Added lines #L86 - L89 were not covered by tests
}
nodeEnumerateResponse, err := nodeClient.EnumerateWithFilters(
ctx,
&api.SdkNodeEnumerateWithFiltersRequest{},
)
if err != nil {
return fmt.Errorf("failed to enumerate nodes: %v", err)

Check warning on line 96 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L91-L96

Added lines #L91 - L96 were not covered by tests
}

if pxutil.ClusterSupportsParallelUpgrade(nodeEnumerateResponse) {
if err := c.createPortworxNodePodDisruptionBudget(cluster, ownerRef, nodeEnumerateResponse); err != nil {
return err

Check warning on line 101 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L99-L101

Added lines #L99 - L101 were not covered by tests
}
if err := c.deletePortworxNodePodDisruptionBudget(cluster, ownerRef, nodeEnumerateResponse); err != nil {
return err

Check warning on line 104 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L103-L104

Added lines #L103 - L104 were not covered by tests
}
} else {
if err := c.createPortworxPodDisruptionBudget(cluster, ownerRef, nodeEnumerateResponse); err != nil {
return err

Check warning on line 108 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L106-L108

Added lines #L106 - L108 were not covered by tests
}
}

return nil
}

Expand All @@ -100,6 +135,7 @@
func (c *disruptionBudget) createPortworxPodDisruptionBudget(
cluster *corev1.StorageCluster,
ownerRef *metav1.OwnerReference,
nodeEnumerateResponse *api.SdkNodeEnumerateWithFiltersResponse,
) error {
userProvidedMinValue, err := pxutil.MinAvailableForStoragePDB(cluster)
if err != nil {
Expand All @@ -108,12 +144,8 @@
}

var minAvailable int
c.sdkConn, err = pxutil.GetPortworxConn(c.sdkConn, c.k8sClient, cluster.Namespace)
if err != nil {
return err
}

storageNodesCount, err := pxutil.CountStorageNodes(cluster, c.sdkConn, c.k8sClient)
storageNodesCount, err := pxutil.CountStorageNodes(cluster, c.sdkConn, c.k8sClient, nodeEnumerateResponse)

Check warning on line 148 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L148

Added line #L148 was not covered by tests
if err != nil {
c.closeSdkConn()
return err
Expand Down Expand Up @@ -157,6 +189,71 @@
return err
}

func (c *disruptionBudget) createPortworxNodePodDisruptionBudget(
cluster *corev1.StorageCluster,
ownerRef *metav1.OwnerReference,
nodeEnumerateResponse *api.SdkNodeEnumerateWithFiltersResponse,
) error {
nodesNeedingPDB, err := pxutil.NodesNeedingPDB(c.k8sClient, nodeEnumerateResponse)
if err != nil {
return err

Check warning on line 199 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L196-L199

Added lines #L196 - L199 were not covered by tests
}
errors := []error{}
for _, node := range nodesNeedingPDB {
minAvailable := intstr.FromInt(1)
PDBName := "px-" + node
Copy link
Contributor

@piyush-nimbalkar piyush-nimbalkar Jul 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: internal variables should have lower case.

*pdbName

pdb := &policyv1.PodDisruptionBudget{
ObjectMeta: metav1.ObjectMeta{
Name: PDBName,
Namespace: cluster.Namespace,
OwnerReferences: []metav1.OwnerReference{*ownerRef},
},
Spec: policyv1.PodDisruptionBudgetSpec{
MinAvailable: &minAvailable,
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
constants.LabelKeyClusterName: cluster.Name,
constants.OperatorLabelNodeNameKey: node,
},
},
},

Check warning on line 219 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L201-L219

Added lines #L201 - L219 were not covered by tests
}
err = k8sutil.CreateOrUpdatePodDisruptionBudget(c.k8sClient, pdb, ownerRef)
if err != nil {
logrus.Warnf("Failed to create PDB for node %s: %v", node, err)
errors = append(errors, err)

Check warning on line 224 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L221-L224

Added lines #L221 - L224 were not covered by tests
}
}
return utilerrors.NewAggregate(errors)

Check warning on line 227 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L227

Added line #L227 was not covered by tests

}

// Delete node pod disruption budget when kubertetes is not part of cluster or portworx does not run on it
func (c *disruptionBudget) deletePortworxNodePodDisruptionBudget(
cluster *corev1.StorageCluster,
ownerRef *metav1.OwnerReference,
nodeEnumerateResponse *api.SdkNodeEnumerateWithFiltersResponse,
) error {
nodesToDeletePDB, err := pxutil.NodesToDeletePDB(c.k8sClient, nodeEnumerateResponse)
if err != nil {
return err

Check warning on line 239 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L236-L239

Added lines #L236 - L239 were not covered by tests
}
errors := []error{}

Check warning on line 241 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L241

Added line #L241 was not covered by tests

for _, node := range nodesToDeletePDB {
PDBName := "px-" + node
err = k8sutil.DeletePodDisruptionBudget(
c.k8sClient, PDBName,
cluster.Namespace, *ownerRef,
)
if err != nil {
logrus.Warnf("Failed to delete PDB for node %s: %v", node, err)
errors = append(errors, err)

Check warning on line 251 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L243-L251

Added lines #L243 - L251 were not covered by tests
}
}
return utilerrors.NewAggregate(errors)

Check warning on line 254 in drivers/storage/portworx/component/disruption_budget.go

View check run for this annotation

Codecov / codecov/patch

drivers/storage/portworx/component/disruption_budget.go#L254

Added line #L254 was not covered by tests
}

func (c *disruptionBudget) createKVDBPodDisruptionBudget(
cluster *corev1.StorageCluster,
ownerRef *metav1.OwnerReference,
Expand All @@ -165,7 +262,6 @@
if cluster.Spec.Kvdb != nil && !cluster.Spec.Kvdb.Internal {
return nil
}

clusterSize := kvdbClusterSize(cluster)
minAvailable := intstr.FromInt(clusterSize - 1)
pdb := &policyv1.PodDisruptionBudget{
Expand Down
Loading
Loading