sync pvc and service labels

This commit is contained in:
tcondeixa 2026-07-01 17:39:44 +02:00
parent b992029528
commit b85c3ed870
No known key found for this signature in database
2 changed files with 39 additions and 30 deletions

View File

@ -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
}

View File

@ -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")