Skip to content

Commit 1adac71

Browse files
committed
Another refactoring attempt
1 parent dc86f82 commit 1adac71

File tree

8 files changed

+63
-93
lines changed

8 files changed

+63
-93
lines changed

pkg/cluster/cluster.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ func (c *Cluster) Create() (err error) {
430430
return nil
431431
}
432432

433-
func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet) *compareStatefulsetResult {
433+
func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet, deltePodAnnotations *[]string) *compareStatefulsetResult {
434434
reasons := make([]string, 0)
435435
var match, needsRollUpdate, needsReplace bool
436436

@@ -445,7 +445,7 @@ func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet) *compa
445445
needsReplace = true
446446
reasons = append(reasons, "new statefulset's ownerReferences do not match")
447447
}
448-
if changed, reason := c.compareAnnotations(c.Statefulset.Annotations, statefulSet.Annotations); changed {
448+
if changed, reason := c.compareAnnotations(c.Statefulset.Annotations, statefulSet.Annotations, nil); changed {
449449
match = false
450450
needsReplace = true
451451
reasons = append(reasons, "new statefulset's annotations do not match: "+reason)
@@ -519,7 +519,7 @@ func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet) *compa
519519
}
520520
}
521521

522-
if changed, reason := c.compareAnnotations(c.Statefulset.Spec.Template.Annotations, statefulSet.Spec.Template.Annotations); changed {
522+
if changed, reason := c.compareAnnotations(c.Statefulset.Spec.Template.Annotations, statefulSet.Spec.Template.Annotations, deltePodAnnotations); changed {
523523
match = false
524524
needsReplace = true
525525
reasons = append(reasons, "new statefulset's pod template metadata annotations does not match "+reason)
@@ -541,7 +541,7 @@ func (c *Cluster) compareStatefulSetWith(statefulSet *appsv1.StatefulSet) *compa
541541
reasons = append(reasons, fmt.Sprintf("new statefulset's name for volume %d does not match the current one", i))
542542
continue
543543
}
544-
if changed, reason := c.compareAnnotations(c.Statefulset.Spec.VolumeClaimTemplates[i].Annotations, statefulSet.Spec.VolumeClaimTemplates[i].Annotations); changed {
544+
if changed, reason := c.compareAnnotations(c.Statefulset.Spec.VolumeClaimTemplates[i].Annotations, statefulSet.Spec.VolumeClaimTemplates[i].Annotations, nil); changed {
545545
needsReplace = true
546546
reasons = append(reasons, fmt.Sprintf("new statefulset's annotations for volume %q do not match the current ones: %s", name, reason))
547547
}
@@ -781,7 +781,7 @@ func volumeMountExists(mount v1.VolumeMount, mounts []v1.VolumeMount) bool {
781781
return false
782782
}
783783

784-
func (c *Cluster) compareAnnotations(old, new map[string]string) (bool, string) {
784+
func (c *Cluster) compareAnnotations(old, new map[string]string, removedList *[]string) (bool, string) {
785785
reason := ""
786786
ignoredAnnotations := make(map[string]bool)
787787
for _, ignore := range c.OpConfig.IgnoredAnnotations {
@@ -794,9 +794,11 @@ func (c *Cluster) compareAnnotations(old, new map[string]string) (bool, string)
794794
}
795795
if _, ok := new[key]; !ok {
796796
reason += fmt.Sprintf(" Removed %q.", key)
797+
if removedList != nil {
798+
*removedList = append(*removedList, key)
799+
}
797800
}
798801
}
799-
800802
for key := range new {
801803
if _, ok := ignoredAnnotations[key]; ok {
802804
continue
@@ -836,7 +838,7 @@ func (c *Cluster) compareServices(old, new *v1.Service) (bool, string) {
836838
return true, ""
837839
}
838840

839-
func (c *Cluster) compareLogicalBackupJob(cur, new *batchv1.CronJob) (match bool, reason string) {
841+
func (c *Cluster) compareLogicalBackupJob(cur, new *batchv1.CronJob, deletedPodAnnotations *[]string) (match bool, reason string) {
840842

841843
if cur.Spec.Schedule != new.Spec.Schedule {
842844
return false, fmt.Sprintf("new job's schedule %q does not match the current one %q",
@@ -852,7 +854,7 @@ func (c *Cluster) compareLogicalBackupJob(cur, new *batchv1.CronJob) (match bool
852854

853855
newPodAnnotation := new.Spec.JobTemplate.Spec.Template.Annotations
854856
curPodAnnotation := cur.Spec.JobTemplate.Spec.Template.Annotations
855-
if changed, reason := c.compareAnnotations(curPodAnnotation, newPodAnnotation); changed {
857+
if changed, reason := c.compareAnnotations(curPodAnnotation, newPodAnnotation, deletedPodAnnotations); changed {
856858
return false, fmt.Sprint("new job's pod template metadata annotations do not match " + reason)
857859
}
858860

@@ -881,7 +883,7 @@ func (c *Cluster) comparePodDisruptionBudget(cur, new *policyv1.PodDisruptionBud
881883
if !reflect.DeepEqual(new.ObjectMeta.OwnerReferences, cur.ObjectMeta.OwnerReferences) {
882884
return false, "new PDB's owner references do not match the current ones"
883885
}
884-
if changed, reason := c.compareAnnotations(cur.Annotations, new.Annotations); changed {
886+
if changed, reason := c.compareAnnotations(cur.Annotations, new.Annotations, nil); changed {
885887
return false, "new PDB's annotations do not match the current ones:" + reason
886888
}
887889
return true, ""
@@ -1016,7 +1018,7 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error {
10161018
// only when streams were not specified in oldSpec but in newSpec
10171019
needStreamUser := len(oldSpec.Spec.Streams) == 0 && len(newSpec.Spec.Streams) > 0
10181020

1019-
annotationsChanged, _ := c.compareAnnotations(oldSpec.Annotations, newSpec.Annotations)
1021+
annotationsChanged, _ := c.compareAnnotations(oldSpec.Annotations, newSpec.Annotations, nil)
10201022

10211023
initUsers := !sameUsers || !sameRotatedUsers || needPoolerUser || needStreamUser
10221024
if initUsers {

pkg/cluster/cluster_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1680,7 +1680,7 @@ func TestCompareLogicalBackupJob(t *testing.T) {
16801680
}
16811681
}
16821682

1683-
match, reason := cluster.compareLogicalBackupJob(currentCronJob, desiredCronJob)
1683+
match, reason := cluster.compareLogicalBackupJob(currentCronJob, desiredCronJob, nil)
16841684
if match != tt.match {
16851685
t.Errorf("%s - unexpected match result %t when comparing cronjobs %#v and %#v", t.Name(), match, currentCronJob, desiredCronJob)
16861686
} else {

pkg/cluster/connection_pooler.go

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -978,7 +978,7 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql
978978
err error
979979
)
980980

981-
updatedAnnotations := map[string]*string{}
981+
updatedPodAnnotations := map[string]*string{}
982982
syncReason := make([]string, 0)
983983
deployment, err = c.KubeClient.
984984
Deployments(c.Namespace).
@@ -1040,34 +1040,24 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql
10401040
}
10411041

10421042
newPodAnnotations := c.annotationsSet(c.generatePodAnnotations(&c.Spec))
1043-
if changed, reason := c.compareAnnotations(deployment.Spec.Template.Annotations, newPodAnnotations); changed {
1043+
deletedPodAnnotations := []string{}
1044+
if changed, reason := c.compareAnnotations(deployment.Spec.Template.Annotations, newPodAnnotations, &deletedPodAnnotations); changed {
10441045
specSync = true
10451046
syncReason = append(syncReason, []string{"new connection pooler's pod template annotations do not match the current ones: " + reason}...)
1046-
1047-
if strings.Contains(reason, "Removed") {
1048-
templateMetadataReq := map[string]map[string]map[string]map[string]map[string]*string{"spec": {"template": {"metadata": {"annotations": {}}}}}
1049-
for anno := range deployment.Spec.Template.Annotations {
1050-
if _, ok := newPodAnnotations[anno]; !ok {
1051-
// template annotation was removed
1052-
for _, ignore := range c.OpConfig.IgnoredAnnotations {
1053-
if anno == ignore {
1054-
continue
1055-
}
1056-
}
1057-
updatedAnnotations[anno] = nil
1058-
}
1059-
}
1060-
templateMetadataReq["spec"]["template"]["metadata"]["annotations"] = updatedAnnotations
1061-
patch, err := json.Marshal(templateMetadataReq)
1062-
if err != nil {
1063-
return nil, fmt.Errorf("could not marshal ObjectMeta for %s connection pooler's pod template: %v", role, err)
1064-
}
1065-
deployment, err = c.KubeClient.Deployments(c.Namespace).Patch(context.TODO(),
1066-
deployment.Name, types.StrategicMergePatchType, patch, metav1.PatchOptions{}, "")
1067-
if err != nil {
1068-
c.logger.Errorf("failed to remove annotations from %s connection pooler's pod template: %v", role, err)
1069-
return nil, err
1070-
}
1047+
for _, anno := range deletedPodAnnotations {
1048+
updatedPodAnnotations[anno] = nil
1049+
}
1050+
templateMetadataReq := map[string]map[string]map[string]map[string]map[string]*string{
1051+
"spec": {"template": {"metadata": {"annotations": updatedPodAnnotations}}}}
1052+
patch, err := json.Marshal(templateMetadataReq)
1053+
if err != nil {
1054+
return nil, fmt.Errorf("could not marshal ObjectMeta for %s connection pooler's pod template: %v", role, err)
1055+
}
1056+
deployment, err = c.KubeClient.Deployments(c.Namespace).Patch(context.TODO(),
1057+
deployment.Name, types.StrategicMergePatchType, patch, metav1.PatchOptions{}, "")
1058+
if err != nil {
1059+
c.logger.Errorf("failed to patch %s connection pooler's pod template: %v", role, err)
1060+
return nil, err
10711061
}
10721062
deployment.Spec.Template.Annotations = newPodAnnotations
10731063
}
@@ -1092,7 +1082,7 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql
10921082
}
10931083

10941084
newAnnotations := c.AnnotationsToPropagate(c.annotationsSet(nil)) // including the downscaling annotations
1095-
if changed, _ := c.compareAnnotations(deployment.Annotations, newAnnotations); changed {
1085+
if changed, _ := c.compareAnnotations(deployment.Annotations, newAnnotations, nil); changed {
10961086
deployment, err = patchConnectionPoolerAnnotations(c.KubeClient, deployment, newAnnotations)
10971087
if err != nil {
10981088
return nil, err
@@ -1126,13 +1116,13 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql
11261116
if err != nil {
11271117
return nil, fmt.Errorf("could not delete pooler pod: %v", err)
11281118
}
1129-
} else if changed, _ := c.compareAnnotations(pod.Annotations, deployment.Spec.Template.Annotations); changed {
1119+
} else if changed, _ := c.compareAnnotations(pod.Annotations, deployment.Spec.Template.Annotations, nil); changed {
11301120
metadataReq := map[string]map[string]map[string]*string{"metadata": {}}
11311121

11321122
for anno, val := range deployment.Spec.Template.Annotations {
1133-
updatedAnnotations[anno] = &val
1123+
updatedPodAnnotations[anno] = &val
11341124
}
1135-
metadataReq["metadata"]["annotations"] = updatedAnnotations
1125+
metadataReq["metadata"]["annotations"] = updatedPodAnnotations
11361126
patch, err := json.Marshal(metadataReq)
11371127
if err != nil {
11381128
return nil, fmt.Errorf("could not marshal ObjectMeta for %s connection pooler's pods: %v", role, err)

pkg/cluster/resources.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ func (c *Cluster) updateService(role PostgresRole, oldService *v1.Service, newSe
329329
}
330330
}
331331

332-
if changed, _ := c.compareAnnotations(oldService.Annotations, newService.Annotations); changed {
332+
if changed, _ := c.compareAnnotations(oldService.Annotations, newService.Annotations, nil); changed {
333333
patchData, err := metaAnnotationsPatch(newService.Annotations)
334334
if err != nil {
335335
return nil, fmt.Errorf("could not form patch for service %q annotations: %v", oldService.Name, err)

pkg/cluster/streams.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ func (c *Cluster) compareStreams(curEventStreams, newEventStreams *zalandov1.Fab
545545
for newKey, newValue := range newEventStreams.Annotations {
546546
desiredAnnotations[newKey] = newValue
547547
}
548-
if changed, reason := c.compareAnnotations(curEventStreams.ObjectMeta.Annotations, desiredAnnotations); changed {
548+
if changed, reason := c.compareAnnotations(curEventStreams.ObjectMeta.Annotations, desiredAnnotations, nil); changed {
549549
match = false
550550
reasons = append(reasons, fmt.Sprintf("new streams annotations do not match: %s", reason))
551551
}

pkg/cluster/sync.go

Lines changed: 24 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func (c *Cluster) syncPatroniConfigMap(suffix string) error {
230230
maps.Copy(annotations, cm.Annotations)
231231
// Patroni can add extra annotations so incl. current annotations in desired annotations
232232
desiredAnnotations := c.annotationsSet(cm.Annotations)
233-
if changed, _ := c.compareAnnotations(annotations, desiredAnnotations); changed {
233+
if changed, _ := c.compareAnnotations(annotations, desiredAnnotations, nil); changed {
234234
patchData, err := metaAnnotationsPatch(desiredAnnotations)
235235
if err != nil {
236236
return fmt.Errorf("could not form patch for %s config map: %v", configMapName, err)
@@ -275,7 +275,7 @@ func (c *Cluster) syncPatroniEndpoint(suffix string) error {
275275
maps.Copy(annotations, ep.Annotations)
276276
// Patroni can add extra annotations so incl. current annotations in desired annotations
277277
desiredAnnotations := c.annotationsSet(ep.Annotations)
278-
if changed, _ := c.compareAnnotations(annotations, desiredAnnotations); changed {
278+
if changed, _ := c.compareAnnotations(annotations, desiredAnnotations, nil); changed {
279279
patchData, err := metaAnnotationsPatch(desiredAnnotations)
280280
if err != nil {
281281
return fmt.Errorf("could not form patch for %s endpoint: %v", endpointName, err)
@@ -320,7 +320,7 @@ func (c *Cluster) syncPatroniService() error {
320320
maps.Copy(annotations, svc.Annotations)
321321
// Patroni can add extra annotations so incl. current annotations in desired annotations
322322
desiredAnnotations := c.annotationsSet(svc.Annotations)
323-
if changed, _ := c.compareAnnotations(annotations, desiredAnnotations); changed {
323+
if changed, _ := c.compareAnnotations(annotations, desiredAnnotations, nil); changed {
324324
patchData, err := metaAnnotationsPatch(desiredAnnotations)
325325
if err != nil {
326326
return fmt.Errorf("could not form patch for %s service: %v", serviceName, err)
@@ -412,7 +412,7 @@ func (c *Cluster) syncEndpoint(role PostgresRole) error {
412412
return fmt.Errorf("could not update %s endpoint: %v", role, err)
413413
}
414414
} else {
415-
if changed, _ := c.compareAnnotations(ep.Annotations, desiredEp.Annotations); changed {
415+
if changed, _ := c.compareAnnotations(ep.Annotations, desiredEp.Annotations, nil); changed {
416416
patchData, err := metaAnnotationsPatch(desiredEp.Annotations)
417417
if err != nil {
418418
return fmt.Errorf("could not form patch for %s endpoint: %v", role, err)
@@ -559,42 +559,27 @@ func (c *Cluster) syncStatefulSet() error {
559559
// statefulset is already there, make sure we use its definition in order to compare with the spec.
560560
c.Statefulset = sset
561561

562-
cmp := c.compareStatefulSetWith(desiredSts)
562+
deletedPodAnnotations := []string{}
563+
cmp := c.compareStatefulSetWith(desiredSts, &deletedPodAnnotations)
563564
if !cmp.rollingUpdate {
564-
for _, pod := range pods {
565-
if changed, _ := c.compareAnnotations(pod.Annotations, desiredSts.Spec.Template.Annotations); changed {
566-
patchData, err := metaAnnotationsPatch(desiredSts.Spec.Template.Annotations)
567-
if err != nil {
568-
return fmt.Errorf("could not form patch for pod %q annotations: %v", pod.Name, err)
569-
}
570-
_, err = c.KubeClient.Pods(pod.Namespace).Patch(context.TODO(), pod.Name, types.MergePatchType, []byte(patchData), metav1.PatchOptions{})
571-
if err != nil {
572-
return fmt.Errorf("could not patch annotations for pod %q: %v", pod.Name, err)
573-
}
574-
}
565+
updatedPodAnnotations := map[string]*string{}
566+
for _, anno := range deletedPodAnnotations {
567+
updatedPodAnnotations[anno] = nil
575568
}
576-
metadataReq := map[string]map[string]map[string]*string{"metadata": {"annotations": {}}}
577-
for anno := range c.Statefulset.Spec.Template.Annotations {
578-
if _, ok := desiredSts.Spec.Template.Annotations[anno]; !ok {
579-
// template annotation was removed
580-
for _, ignore := range c.OpConfig.IgnoredAnnotations {
581-
if anno == ignore {
582-
continue
583-
}
584-
}
585-
metadataReq["metadata"]["annotations"][anno] = nil
586-
}
569+
for anno, val := range desiredSts.Spec.Template.Annotations {
570+
updatedPodAnnotations[anno] = &val
587571
}
588-
if len(metadataReq["metadata"]["annotations"]) != 0 {
589-
for _, pod := range pods {
572+
metadataReq := map[string]map[string]map[string]*string{"metadata": {"annotations": updatedPodAnnotations}}
573+
574+
for _, pod := range pods {
575+
if changed, _ := c.compareAnnotations(pod.Annotations, desiredSts.Spec.Template.Annotations, nil); changed {
590576
patch, err := json.Marshal(metadataReq)
591577
if err != nil {
592-
return fmt.Errorf("could not marshal ObjectMeta for pod %s: %v", pod.Name, err)
578+
return fmt.Errorf("could not form patch for pod %q annotations: %v", pod.Name, err)
593579
}
594580
_, err = c.KubeClient.Pods(c.Namespace).Patch(context.Background(), pod.Name, types.StrategicMergePatchType, patch, metav1.PatchOptions{})
595581
if err != nil {
596-
c.logger.Errorf("failed to remove annotations from pod %s: %v", pod.Name, err)
597-
return err
582+
return fmt.Errorf("could not patch annotations for pod %q: %v", pod.Name, err)
598583
}
599584
}
600585
}
@@ -1167,7 +1152,7 @@ func (c *Cluster) updateSecret(
11671152
c.Secrets[secret.UID] = secret
11681153
}
11691154

1170-
if changed, _ := c.compareAnnotations(secret.Annotations, generatedSecret.Annotations); changed {
1155+
if changed, _ := c.compareAnnotations(secret.Annotations, generatedSecret.Annotations, nil); changed {
11711156
patchData, err := metaAnnotationsPatch(generatedSecret.Annotations)
11721157
if err != nil {
11731158
return fmt.Errorf("could not form patch for secret %q annotations: %v", secret.Name, err)
@@ -1612,26 +1597,19 @@ func (c *Cluster) syncLogicalBackupJob() error {
16121597
}
16131598
c.logger.Infof("logical backup job %s updated", c.getLogicalBackupJobName())
16141599
}
1615-
if match, reason := c.compareLogicalBackupJob(job, desiredJob); !match {
1600+
deletedPodAnnotations := []string{}
1601+
if match, reason := c.compareLogicalBackupJob(job, desiredJob, &deletedPodAnnotations); !match {
16161602
c.logger.Infof("logical job %s is not in the desired state and needs to be updated",
16171603
c.getLogicalBackupJobName(),
16181604
)
16191605
if reason != "" {
16201606
c.logger.Infof("reason: %s", reason)
16211607
}
1622-
if strings.Contains(reason, "annotations do not match") {
1608+
if len(deletedPodAnnotations) == 0 {
16231609
templateMetadataReq := map[string]map[string]map[string]map[string]map[string]map[string]map[string]*string{
16241610
"spec": {"jobTemplate": {"spec": {"template": {"metadata": {"annotations": {}}}}}}}
1625-
for anno := range job.Spec.JobTemplate.Spec.Template.Annotations {
1626-
if _, ok := desiredJob.Spec.JobTemplate.Spec.Template.Annotations[anno]; !ok {
1627-
// template annotation was removed
1628-
for _, ignore := range c.OpConfig.IgnoredAnnotations {
1629-
if anno == ignore {
1630-
continue
1631-
}
1632-
}
1633-
templateMetadataReq["spec"]["jobTemplate"]["spec"]["template"]["metadata"]["annotations"][anno] = nil
1634-
}
1611+
for _, anno := range deletedPodAnnotations {
1612+
templateMetadataReq["spec"]["jobTemplate"]["spec"]["template"]["metadata"]["annotations"][anno] = nil
16351613
}
16361614
patch, err := json.Marshal(templateMetadataReq)
16371615
if err != nil {
@@ -1649,7 +1627,7 @@ func (c *Cluster) syncLogicalBackupJob() error {
16491627
}
16501628
c.logger.Info("the logical backup job is synced")
16511629
}
1652-
if changed, _ := c.compareAnnotations(job.Annotations, desiredJob.Annotations); changed {
1630+
if changed, _ := c.compareAnnotations(job.Annotations, desiredJob.Annotations, nil); changed {
16531631
patchData, err := metaAnnotationsPatch(desiredJob.Annotations)
16541632
if err != nil {
16551633
return fmt.Errorf("could not form patch for the logical backup job %q: %v", jobName, err)

pkg/cluster/sync_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func TestSyncStatefulSetsAnnotations(t *testing.T) {
122122
desiredSts, err := cluster.generateStatefulSet(&cluster.Postgresql.Spec)
123123
assert.NoError(t, err)
124124

125-
cmp := cluster.compareStatefulSetWith(desiredSts)
125+
cmp := cluster.compareStatefulSetWith(desiredSts, nil)
126126
if cmp.match {
127127
t.Errorf("%s: match between current and desired statefulsets albeit differences: %#v", testName, cmp)
128128
}
@@ -131,7 +131,7 @@ func TestSyncStatefulSetsAnnotations(t *testing.T) {
131131
cluster.syncStatefulSet()
132132

133133
// compare again after the SYNC - must be identical to the desired state
134-
cmp = cluster.compareStatefulSetWith(desiredSts)
134+
cmp = cluster.compareStatefulSetWith(desiredSts, nil)
135135
if !cmp.match {
136136
t.Errorf("%s: current and desired statefulsets are not matching %#v", testName, cmp)
137137
}

pkg/cluster/volumes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ func (c *Cluster) syncVolumeClaims() error {
225225
}
226226

227227
newAnnotations := c.annotationsSet(nil)
228-
if changed, _ := c.compareAnnotations(pvc.Annotations, newAnnotations); changed {
228+
if changed, _ := c.compareAnnotations(pvc.Annotations, newAnnotations, nil); changed {
229229
patchData, err := metaAnnotationsPatch(newAnnotations)
230230
if err != nil {
231231
return fmt.Errorf("could not form patch for the persistent volume claim for volume %q: %v", pvc.Name, err)

0 commit comments

Comments
 (0)