From b85c3ed870b0ace2ff297c564ee32f489d64cb0a Mon Sep 17 00:00:00 2001 From: tcondeixa Date: Wed, 1 Jul 2026 17:39:44 +0200 Subject: [PATCH] sync pvc and service labels --- pkg/cluster/resources.go | 54 ++++++++++++++++++---------------------- pkg/cluster/volumes.go | 15 +++++++++++ 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/pkg/cluster/resources.go b/pkg/cluster/resources.go index c8270b388..095c5a13e 100644 --- a/pkg/cluster/resources.go +++ b/pkg/cluster/resources.go @@ -222,25 +222,15 @@ func (c *Cluster) relabelPodsForSelector(oldSelector, newSelector map[string]str if err != nil { return fmt.Errorf("could not list pods for relabeling: %v", err) } - pods := podList.Items + patchData, err := metaLabelsPatch(newSelector) + if err != nil { + return fmt.Errorf("could not form label patch for pods: %v", err) + } - for _, pod := range pods { - // only patch pods that are missing one or more of the new selector labels - needsPatch := false - for k, v := range newSelector { - if pod.Labels[k] != v { - needsPatch = true - break - } - } - if !needsPatch { + for _, pod := range podList.Items { + if util.MapContains(pod.Labels, newSelector) { continue } - - patchData, err := metaLabelsPatch(newSelector) - if err != nil { - return fmt.Errorf("could not form label patch for pod %q: %v", pod.Name, err) - } if _, err := c.KubeClient.Pods(pod.Namespace).Patch(context.TODO(), pod.Name, types.MergePatchType, patchData, metav1.PatchOptions{}); err != nil { return fmt.Errorf("could not relabel pod %q: %v", pod.Name, err) } @@ -259,21 +249,14 @@ func (c *Cluster) relabelPVCsForSelector(oldSelector, newSelector map[string]str return fmt.Errorf("could not list PVCs for relabeling: %v", err) } - for _, pvc := range pvcList.Items { - needsPatch := false - for k, v := range newSelector { - if pvc.Labels[k] != v { - needsPatch = true - break - } - } - if !needsPatch { - continue - } + patchData, err := metaLabelsPatch(newSelector) + if err != nil { + return fmt.Errorf("could not form label patch for PVCs: %v", err) + } - patchData, err := metaLabelsPatch(newSelector) - if err != nil { - return fmt.Errorf("could not form label patch for PVC %q: %v", pvc.Name, err) + for _, pvc := range pvcList.Items { + if util.MapContains(pvc.Labels, newSelector) { + continue } if _, err := c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Patch(context.TODO(), pvc.Name, types.MergePatchType, patchData, metav1.PatchOptions{}); err != nil { return fmt.Errorf("could not relabel PVC %q: %v", pvc.Name, err) @@ -434,6 +417,17 @@ func (c *Cluster) updateService(role PostgresRole, oldService *v1.Service, newSe } } + if !util.MapContains(oldService.Labels, newService.Labels) { + patchData, err := metaLabelsPatch(newService.Labels) + if err != nil { + return nil, fmt.Errorf("could not form patch for service %q labels: %v", oldService.Name, err) + } + svc, err = c.KubeClient.Services(serviceName.Namespace).Patch(context.TODO(), newService.Name, types.MergePatchType, patchData, metav1.PatchOptions{}) + if err != nil { + return nil, fmt.Errorf("could not patch labels for service %q: %v", oldService.Name, err) + } + } + return svc, nil } diff --git a/pkg/cluster/volumes.go b/pkg/cluster/volumes.go index e32e558e6..d1a282102 100644 --- a/pkg/cluster/volumes.go +++ b/pkg/cluster/volumes.go @@ -13,6 +13,7 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/zalando/postgres-operator/pkg/spec" + "github.com/zalando/postgres-operator/pkg/util" "github.com/zalando/postgres-operator/pkg/util/constants" "github.com/zalando/postgres-operator/pkg/util/filesystems" "github.com/zalando/postgres-operator/pkg/util/k8sutil" @@ -198,6 +199,7 @@ func (c *Cluster) syncVolumeClaims() error { if err != nil { return fmt.Errorf("could not list persistent volume claims: %v", err) } + newLabels := c.labelsSet(true) for _, pvc := range pvcs { c.VolumeClaims[pvc.UID] = &pvc needsUpdate := false @@ -236,6 +238,19 @@ func (c *Cluster) syncVolumeClaims() error { } c.VolumeClaims[pvc.UID] = patchedPvc } + + if !util.MapContains(pvc.Labels, newLabels) { + patchData, err := metaLabelsPatch(newLabels) + if err != nil { + return fmt.Errorf("could not form patch for labels of persistent volume claim %q: %v", pvc.Name, err) + } + patchedPvc, err := c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Patch(context.TODO(), pvc.Name, types.MergePatchType, patchData, metav1.PatchOptions{}) + if err != nil { + return fmt.Errorf("could not patch labels of persistent volume claim %q: %v", pvc.Name, err) + } + c.VolumeClaims[pvc.UID] = patchedPvc + c.logger.Infof("updated labels on persistent volume claim %q", pvc.Name) + } } c.logger.Debug("volume claims have been synced successfully")