Skip to content

Commit cbc67f5

Browse files
committed
allow updating the pvc
1 parent 772b800 commit cbc67f5

8 files changed

Lines changed: 103 additions & 17 deletions

File tree

config/rbac/cluster/role.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ rules:
88
- ''
99
resources:
1010
- configmaps
11-
- persistentvolumeclaims
1211
- pods
1312
- secrets
1413
- serviceaccounts
@@ -47,6 +46,18 @@ rules:
4746
verbs:
4847
- create
4948
- patch
49+
- apiGroups:
50+
- ''
51+
resources:
52+
- persistentvolumeclaims
53+
verbs:
54+
- create
55+
- delete
56+
- get
57+
- list
58+
- patch
59+
- update
60+
- watch
5061
- apiGroups:
5162
- apps
5263
resources:

config/rbac/namespace/role.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ rules:
88
- ''
99
resources:
1010
- configmaps
11-
- persistentvolumeclaims
1211
- pods
1312
- secrets
1413
- serviceaccounts
@@ -47,6 +46,18 @@ rules:
4746
verbs:
4847
- create
4948
- patch
49+
- apiGroups:
50+
- ''
51+
resources:
52+
- persistentvolumeclaims
53+
verbs:
54+
- create
55+
- delete
56+
- get
57+
- list
58+
- patch
59+
- update
60+
- watch
5061
- apiGroups:
5162
- apps
5263
resources:

deploy/bundle.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66731,7 +66731,6 @@ rules:
6673166731
- ""
6673266732
resources:
6673366733
- configmaps
66734-
- persistentvolumeclaims
6673566734
- pods
6673666735
- secrets
6673766736
- serviceaccounts
@@ -66770,6 +66769,18 @@ rules:
6677066769
verbs:
6677166770
- create
6677266771
- patch
66772+
- apiGroups:
66773+
- ""
66774+
resources:
66775+
- persistentvolumeclaims
66776+
verbs:
66777+
- create
66778+
- delete
66779+
- get
66780+
- list
66781+
- patch
66782+
- update
66783+
- watch
6677366784
- apiGroups:
6677466785
- apps
6677566786
resources:

deploy/cw-bundle.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66731,7 +66731,6 @@ rules:
6673166731
- ""
6673266732
resources:
6673366733
- configmaps
66734-
- persistentvolumeclaims
6673566734
- pods
6673666735
- secrets
6673766736
- serviceaccounts
@@ -66770,6 +66769,18 @@ rules:
6677066769
verbs:
6677166770
- create
6677266771
- patch
66772+
- apiGroups:
66773+
- ""
66774+
resources:
66775+
- persistentvolumeclaims
66776+
verbs:
66777+
- create
66778+
- delete
66779+
- get
66780+
- list
66781+
- patch
66782+
- update
66783+
- watch
6677366784
- apiGroups:
6677466785
- apps
6677566786
resources:

deploy/cw-rbac.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ rules:
1212
- ""
1313
resources:
1414
- configmaps
15-
- persistentvolumeclaims
1615
- pods
1716
- secrets
1817
- serviceaccounts
@@ -51,6 +50,18 @@ rules:
5150
verbs:
5251
- create
5352
- patch
53+
- apiGroups:
54+
- ""
55+
resources:
56+
- persistentvolumeclaims
57+
verbs:
58+
- create
59+
- delete
60+
- get
61+
- list
62+
- patch
63+
- update
64+
- watch
5465
- apiGroups:
5566
- apps
5667
resources:

deploy/rbac.yaml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ rules:
1212
- ""
1313
resources:
1414
- configmaps
15-
- persistentvolumeclaims
1615
- pods
1716
- secrets
1817
- serviceaccounts
@@ -51,6 +50,18 @@ rules:
5150
verbs:
5251
- create
5352
- patch
53+
- apiGroups:
54+
- ""
55+
resources:
56+
- persistentvolumeclaims
57+
verbs:
58+
- create
59+
- delete
60+
- get
61+
- list
62+
- patch
63+
- update
64+
- watch
5465
- apiGroups:
5566
- apps
5667
resources:

percona/controller/pgcluster/controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ func (r *PGClusterReconciler) watchSecrets() handler.TypedFuncs[*corev1.Secret,
219219
// +kubebuilder:rbac:groups=pgv2.percona.com,resources=perconapgclusters/finalizers,verbs=update
220220
// +kubebuilder:rbac:groups=batch,resources=jobs,verbs=create;list;update
221221
// +kubebuilder:rbac:groups="",resources="pods",verbs=create;delete
222+
// +kubebuilder:rbac:groups="",resources="persistentvolumeclaims",verbs=create;update
222223

223224
func (r *PGClusterReconciler) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
224225
log := logging.FromContext(ctx).WithValues("cluster", request.Name, "namespace", request.Namespace)

percona/controller/pgcluster/pvc.go

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package pgcluster
22

33
import (
44
"context"
5+
"maps"
56

67
"github.com/pkg/errors"
78
corev1 "k8s.io/api/core/v1"
89
k8serrors "k8s.io/apimachinery/pkg/api/errors"
10+
"k8s.io/client-go/util/retry"
911
"sigs.k8s.io/controller-runtime/pkg/client"
1012

1113
"github.com/percona/percona-postgresql-operator/v2/internal/naming"
@@ -73,21 +75,38 @@ func ensureSidecarPVCs(
7375
pvc := new(corev1.PersistentVolumeClaim)
7476
pvc.Name = sidecarPVC.Name
7577
pvc.Namespace = cr.Namespace
76-
pvc.Spec = sidecarPVC.Spec
77-
pvc.Labels = ls
7878

79-
err := cl.Get(ctx, client.ObjectKeyFromObject(pvc), &corev1.PersistentVolumeClaim{})
80-
if err == nil {
81-
// already exists
82-
continue
79+
if err := cl.Get(ctx, client.ObjectKeyFromObject(pvc), pvc); err != nil {
80+
if !k8serrors.IsNotFound(err) {
81+
return errors.Wrapf(err, "get %s", client.ObjectKeyFromObject(pvc).String())
82+
}
83+
pvc.Spec = sidecarPVC.Spec
84+
pvc.Labels = ls
85+
if err := cl.Create(ctx, pvc); err != nil {
86+
return errors.Wrap(err, "failed to create pvc")
87+
}
88+
return nil
8389
}
84-
85-
if !k8serrors.IsNotFound(err) {
86-
return errors.Wrapf(err, "get %s", client.ObjectKeyFromObject(pvc).String())
90+
if v := pvc.Labels[naming.LabelPerconaManagedBy]; v != "percona-postgresql-operator" {
91+
return errors.Errorf("PersistentVolumeClaim %s already exists and not managed by percona-postgresql-operator: %s", client.ObjectKeyFromObject(pvc).String(), v)
92+
}
93+
if v := pvc.Labels[naming.LabelPerconaInstance]; v != cr.Name {
94+
return errors.Errorf("PersistentVolumeClaim %s already exists and belongs to another cluster %s", client.ObjectKeyFromObject(pvc).String(), v)
8795
}
8896

89-
if err := cl.Create(ctx, pvc); err != nil {
90-
return errors.Wrapf(err, "create PVC %s", client.ObjectKeyFromObject(pvc).String())
97+
if err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
98+
if err := cl.Get(ctx, client.ObjectKeyFromObject(pvc), pvc); err != nil {
99+
return err
100+
}
101+
maps.Copy(pvc.Labels, ls)
102+
103+
// It's only allowed to update resources.requests and volumeAttributesClassName
104+
pvc.Spec.Resources.Requests = sidecarPVC.Spec.Resources.Requests
105+
pvc.Spec.VolumeAttributesClassName = sidecarPVC.Spec.VolumeAttributesClassName
106+
107+
return cl.Update(ctx, pvc)
108+
}); err != nil {
109+
return errors.Wrapf(err, "update PersistentVolumeClaim %s", client.ObjectKeyFromObject(pvc).String())
91110
}
92111
}
93112

0 commit comments

Comments
 (0)