Skip to content

Commit 8231797

Browse files
authored
add cluster field for PVCs (#2785)
* add cluster field for PVCs * sync volumes on cluster creation * fully spell pvc in log messages
1 parent 45e9227 commit 8231797

File tree

5 files changed

+51
-34
lines changed

5 files changed

+51
-34
lines changed

docs/reference/operator_parameters.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ configuration they are grouped under the `kubernetes` key.
366366
manifest. To keep secrets, set this option to `false`. The default is `true`.
367367

368368
* **enable_persistent_volume_claim_deletion**
369-
By default, the operator deletes PersistentVolumeClaims when removing the
369+
By default, the operator deletes persistent volume claims when removing the
370370
Postgres cluster manifest, no matter if `persistent_volume_claim_retention_policy`
371371
on the statefulset is set to `retain`. To keep PVCs set this option to `false`.
372372
The default is `true`.

pkg/cluster/cluster.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ type kubeResources struct {
6565
PatroniConfigMaps map[string]*v1.ConfigMap
6666
Secrets map[types.UID]*v1.Secret
6767
Statefulset *appsv1.StatefulSet
68+
VolumeClaims map[types.UID]*v1.PersistentVolumeClaim
6869
PodDisruptionBudget *policyv1.PodDisruptionBudget
6970
LogicalBackupJob *batchv1.CronJob
7071
Streams map[string]*zalandov1.FabricEventStream
7172
//Pods are treated separately
72-
//PVCs are treated separately
7373
}
7474

7575
// Cluster describes postgresql cluster
@@ -140,6 +140,7 @@ func New(cfg Config, kubeClient k8sutil.KubernetesClient, pgSpec acidv1.Postgres
140140
Endpoints: make(map[PostgresRole]*v1.Endpoints),
141141
PatroniEndpoints: make(map[string]*v1.Endpoints),
142142
PatroniConfigMaps: make(map[string]*v1.ConfigMap),
143+
VolumeClaims: make(map[types.UID]*v1.PersistentVolumeClaim),
143144
Streams: make(map[string]*zalandov1.FabricEventStream)},
144145
userSyncStrategy: users.DefaultUserSyncStrategy{
145146
PasswordEncryption: passwordEncryption,
@@ -363,6 +364,11 @@ func (c *Cluster) Create() (err error) {
363364
c.logger.Infof("pods are ready")
364365
c.eventRecorder.Event(c.GetReference(), v1.EventTypeNormal, "StatefulSet", "Pods are ready")
365366

367+
// sync volume may already transition volumes to gp3, if iops/throughput or type is specified
368+
if err = c.syncVolumes(); err != nil {
369+
return err
370+
}
371+
366372
// sync resources created by Patroni
367373
if err = c.syncPatroniResources(); err != nil {
368374
c.logger.Warnf("Patroni resources not yet synced: %v", err)

pkg/cluster/resources.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func (c *Cluster) listResources() error {
3939
c.logger.Infof("found logical backup job: %q (uid: %q)", util.NameFromMeta(c.LogicalBackupJob.ObjectMeta), c.LogicalBackupJob.UID)
4040
}
4141

42-
for _, secret := range c.Secrets {
43-
c.logger.Infof("found secret: %q (uid: %q) namespace: %s", util.NameFromMeta(secret.ObjectMeta), secret.UID, secret.ObjectMeta.Namespace)
42+
for uid, secret := range c.Secrets {
43+
c.logger.Infof("found secret: %q (uid: %q) namespace: %s", util.NameFromMeta(secret.ObjectMeta), uid, secret.ObjectMeta.Namespace)
4444
}
4545

4646
for role, service := range c.Services {
@@ -70,13 +70,8 @@ func (c *Cluster) listResources() error {
7070
c.logger.Infof("found pod: %q (uid: %q)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
7171
}
7272

73-
pvcs, err := c.listPersistentVolumeClaims()
74-
if err != nil {
75-
return fmt.Errorf("could not get the list of PVCs: %v", err)
76-
}
77-
78-
for _, obj := range pvcs {
79-
c.logger.Infof("found PVC: %q (uid: %q)", util.NameFromMeta(obj.ObjectMeta), obj.UID)
73+
for uid, pvc := range c.VolumeClaims {
74+
c.logger.Infof("found persistent volume claim: %q (uid: %q)", util.NameFromMeta(pvc.ObjectMeta), uid)
8075
}
8176

8277
for role, poolerObjs := range c.ConnectionPooler {
@@ -288,10 +283,10 @@ func (c *Cluster) deleteStatefulSet() error {
288283

289284
if c.OpConfig.EnablePersistentVolumeClaimDeletion != nil && *c.OpConfig.EnablePersistentVolumeClaimDeletion {
290285
if err := c.deletePersistentVolumeClaims(); err != nil {
291-
return fmt.Errorf("could not delete PersistentVolumeClaims: %v", err)
286+
return fmt.Errorf("could not delete persistent volume claims: %v", err)
292287
}
293288
} else {
294-
c.logger.Info("not deleting PersistentVolumeClaims because disabled in configuration")
289+
c.logger.Info("not deleting persistent volume claims because disabled in configuration")
295290
}
296291

297292
return nil

pkg/cluster/volumes.go

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import (
1313

1414
"github.com/aws/aws-sdk-go/aws"
1515
"github.com/zalando/postgres-operator/pkg/spec"
16-
"github.com/zalando/postgres-operator/pkg/util"
1716
"github.com/zalando/postgres-operator/pkg/util/constants"
1817
"github.com/zalando/postgres-operator/pkg/util/filesystems"
18+
"github.com/zalando/postgres-operator/pkg/util/k8sutil"
1919
"github.com/zalando/postgres-operator/pkg/util/volumes"
2020
)
2121

@@ -185,7 +185,7 @@ func (c *Cluster) syncVolumeClaims() error {
185185

186186
if c.OpConfig.StorageResizeMode == "off" || c.OpConfig.StorageResizeMode == "ebs" {
187187
ignoreResize = true
188-
c.logger.Debugf("Storage resize mode is set to %q. Skipping volume size sync of PVCs.", c.OpConfig.StorageResizeMode)
188+
c.logger.Debugf("Storage resize mode is set to %q. Skipping volume size sync of persistent volume claims.", c.OpConfig.StorageResizeMode)
189189
}
190190

191191
newSize, err := resource.ParseQuantity(c.Spec.Volume.Size)
@@ -196,9 +196,10 @@ func (c *Cluster) syncVolumeClaims() error {
196196

197197
pvcs, err := c.listPersistentVolumeClaims()
198198
if err != nil {
199-
return fmt.Errorf("could not receive persistent volume claims: %v", err)
199+
return fmt.Errorf("could not list persistent volume claims: %v", err)
200200
}
201201
for _, pvc := range pvcs {
202+
c.VolumeClaims[pvc.UID] = &pvc
202203
needsUpdate := false
203204
currentSize := quantityToGigabyte(pvc.Spec.Resources.Requests[v1.ResourceStorage])
204205
if !ignoreResize && currentSize != manifestSize {
@@ -213,9 +214,11 @@ func (c *Cluster) syncVolumeClaims() error {
213214

214215
if needsUpdate {
215216
c.logger.Infof("updating persistent volume claim definition for volume %q", pvc.Name)
216-
if _, err := c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Update(context.TODO(), &pvc, metav1.UpdateOptions{}); err != nil {
217+
updatedPvc, err := c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Update(context.TODO(), &pvc, metav1.UpdateOptions{})
218+
if err != nil {
217219
return fmt.Errorf("could not update persistent volume claim: %q", err)
218220
}
221+
c.VolumeClaims[pvc.UID] = updatedPvc
219222
c.logger.Infof("successfully updated persistent volume claim %q", pvc.Name)
220223
} else {
221224
c.logger.Debugf("volume claim for volume %q do not require updates", pvc.Name)
@@ -227,10 +230,11 @@ func (c *Cluster) syncVolumeClaims() error {
227230
if err != nil {
228231
return fmt.Errorf("could not form patch for the persistent volume claim for volume %q: %v", pvc.Name, err)
229232
}
230-
_, err = c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Patch(context.TODO(), pvc.Name, types.MergePatchType, []byte(patchData), metav1.PatchOptions{})
233+
patchedPvc, err := c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Patch(context.TODO(), pvc.Name, types.MergePatchType, []byte(patchData), metav1.PatchOptions{})
231234
if err != nil {
232235
return fmt.Errorf("could not patch annotations of the persistent volume claim for volume %q: %v", pvc.Name, err)
233236
}
237+
c.VolumeClaims[pvc.UID] = patchedPvc
234238
}
235239
}
236240

@@ -268,28 +272,40 @@ func (c *Cluster) listPersistentVolumeClaims() ([]v1.PersistentVolumeClaim, erro
268272

269273
pvcs, err := c.KubeClient.PersistentVolumeClaims(ns).List(context.TODO(), listOptions)
270274
if err != nil {
271-
return nil, fmt.Errorf("could not list of PersistentVolumeClaims: %v", err)
275+
return nil, fmt.Errorf("could not list of persistent volume claims: %v", err)
272276
}
273277
return pvcs.Items, nil
274278
}
275279

276280
func (c *Cluster) deletePersistentVolumeClaims() error {
277-
c.logger.Debug("deleting PVCs")
278-
pvcs, err := c.listPersistentVolumeClaims()
279-
if err != nil {
280-
return err
281-
}
282-
for _, pvc := range pvcs {
283-
c.logger.Debugf("deleting PVC %q", util.NameFromMeta(pvc.ObjectMeta))
284-
if err := c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Delete(context.TODO(), pvc.Name, c.deleteOptions); err != nil {
285-
c.logger.Warningf("could not delete PersistentVolumeClaim: %v", err)
281+
c.setProcessName("deleting persistent volume claims")
282+
errors := make([]string, 0)
283+
for uid := range c.VolumeClaims {
284+
err := c.deletePersistentVolumeClaim(uid)
285+
if err != nil {
286+
errors = append(errors, fmt.Sprintf("%v", err))
286287
}
287288
}
288-
if len(pvcs) > 0 {
289-
c.logger.Debug("PVCs have been deleted")
290-
} else {
291-
c.logger.Debug("no PVCs to delete")
289+
290+
if len(errors) > 0 {
291+
c.logger.Warningf("could not delete all persistent volume claims: %v", strings.Join(errors, `', '`))
292+
}
293+
294+
return nil
295+
}
296+
297+
func (c *Cluster) deletePersistentVolumeClaim(uid types.UID) error {
298+
c.setProcessName("deleting persistent volume claim")
299+
pvc := c.VolumeClaims[uid]
300+
c.logger.Debugf("deleting persistent volume claim %q", pvc.Name)
301+
err := c.KubeClient.PersistentVolumeClaims(pvc.Namespace).Delete(context.TODO(), pvc.Name, c.deleteOptions)
302+
if k8sutil.ResourceNotFound(err) {
303+
c.logger.Debugf("persistent volume claim %q has already been deleted", pvc.Name)
304+
} else if err != nil {
305+
return fmt.Errorf("could not delete persistent volume claim %q: %v", pvc.Name, err)
292306
}
307+
c.logger.Infof("persistent volume claim %q has been deleted", pvc.Name)
308+
delete(c.VolumeClaims, uid)
293309

294310
return nil
295311
}
@@ -299,7 +315,7 @@ func (c *Cluster) listPersistentVolumes() ([]*v1.PersistentVolume, error) {
299315

300316
pvcs, err := c.listPersistentVolumeClaims()
301317
if err != nil {
302-
return nil, fmt.Errorf("could not list cluster's PersistentVolumeClaims: %v", err)
318+
return nil, fmt.Errorf("could not list cluster's persistent volume claims: %v", err)
303319
}
304320

305321
pods, err := c.listPods()

pkg/cluster/volumes_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestResizeVolumeClaim(t *testing.T) {
9393

9494
// check if listPersistentVolumeClaims returns only the PVCs matching the filter
9595
if len(pvcs) != len(pvcList.Items)-1 {
96-
t.Errorf("%s: could not find all PVCs, got %v, expected %v", testName, len(pvcs), len(pvcList.Items)-1)
96+
t.Errorf("%s: could not find all persistent volume claims, got %v, expected %v", testName, len(pvcs), len(pvcList.Items)-1)
9797
}
9898

9999
// check if PVCs were correctly resized

0 commit comments

Comments
 (0)