Skip to content

Commit 9193424

Browse files
authored
[Fix] GT-11 Orphan PVC are not removed (#962)
1 parent b37219f commit 9193424

File tree

6 files changed

+68
-6
lines changed

6 files changed

+68
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Change Log
22

33
## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A)
4+
- (Bugfix) Orphan PVC are not removed
45

56
## [1.2.10](https://github.com/arangodb/kube-arangodb/tree/1.2.10) (2022-04-27)
67
- (Feature) Allow configuration for securityContext.runAsUser value

pkg/deployment/deployment_inspector.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ func (d *Deployment) inspectDeployment(lastInterval util.Interval) util.Interval
155155
return nextInterval.ReduceTo(maxInspectionInterval)
156156
}
157157

158+
// inspectDeploymentWithError ensures that the deployment is in a valid state
158159
func (d *Deployment) inspectDeploymentWithError(ctx context.Context, lastInterval util.Interval) (nextInterval util.Interval, inspectError error) {
159160
t := time.Now()
160161

@@ -434,6 +435,7 @@ func (d *Deployment) refreshMaintenanceTTL(ctx context.Context) {
434435
}
435436
}
436437

438+
// ensureResources creates all required resources for the deployment
437439
func (d *Deployment) ensureResources(ctx context.Context, lastInterval util.Interval, cachedStatus inspectorInterface.Inspector) (util.Interval, error) {
438440
// Ensure all resources are created
439441
if d.haveServiceMonitorCRD {

pkg/deployment/resources/labels.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ func (r *Resources) EnsurePodsLabels(ctx context.Context, cachedStatus inspector
209209

210210
func (r *Resources) EnsurePersistentVolumeClaimsLabels(ctx context.Context, cachedStatus inspectorInterface.Inspector) error {
211211
changed := false
212-
if err := cachedStatus.PersistentVolumeClaim().V1().Iterate(func(persistentVolumeClaim *core.PersistentVolumeClaim) error {
212+
213+
actionFn := func(persistentVolumeClaim *core.PersistentVolumeClaim) error {
213214
if ensureGroupLabelsMap(persistentVolumeClaim.Kind, persistentVolumeClaim, r.context.GetSpec(), func(name string, d []byte) error {
214215
return globals.GetGlobalTimeouts().Kubernetes().RunWithTimeout(ctx, func(ctxChild context.Context) error {
215216
_, err := r.context.PersistentVolumeClaimsModInterface().Patch(ctxChild, name, types.JSONPatchType, d, meta.PatchOptions{})
@@ -220,9 +221,13 @@ func (r *Resources) EnsurePersistentVolumeClaimsLabels(ctx context.Context, cach
220221
}
221222

222223
return nil
223-
}, func(persistentVolumeClaim *core.PersistentVolumeClaim) bool {
224+
}
225+
226+
ownerFilterFn := func(persistentVolumeClaim *core.PersistentVolumeClaim) bool {
224227
return r.isChildResource(persistentVolumeClaim)
225-
}); err != nil {
228+
}
229+
230+
if err := cachedStatus.PersistentVolumeClaim().V1().Iterate(actionFn, ownerFilterFn); err != nil {
226231
return err
227232
}
228233

pkg/deployment/resources/pvc_inspector.go

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,17 @@ import (
2424
"context"
2525
"time"
2626

27-
"github.com/arangodb/kube-arangodb/pkg/util/errors"
28-
inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
29-
3027
v1 "k8s.io/api/core/v1"
28+
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
29+
"k8s.io/apimachinery/pkg/types"
3130

31+
"github.com/arangodb/kube-arangodb/pkg/deployment/patch"
3232
"github.com/arangodb/kube-arangodb/pkg/metrics"
3333
"github.com/arangodb/kube-arangodb/pkg/util"
34+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
35+
"github.com/arangodb/kube-arangodb/pkg/util/globals"
3436
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
37+
inspectorInterface "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector"
3538
pvcv1 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolumeclaim/v1"
3639
)
3740

@@ -76,6 +79,26 @@ func (r *Resources) InspectPVCs(ctx context.Context, cachedStatus inspectorInter
7679
return nil
7780
}
7881

82+
owner := r.context.GetAPIObject().AsOwner()
83+
if k8sutil.UpdateOwnerRefToObjectIfNeeded(pvc.GetObjectMeta(), &owner) {
84+
q := patch.NewPatch(patch.ItemReplace(patch.NewPath("metadata", "ownerReferences"), pvc.ObjectMeta.OwnerReferences))
85+
d, err := q.Marshal()
86+
if err != nil {
87+
log.Debug().Err(err).Msg("Failed to prepare PVC patch (ownerReferences)")
88+
return errors.WithStack(err)
89+
}
90+
91+
err = globals.GetGlobalTimeouts().Kubernetes().RunWithTimeout(ctx, func(ctxChild context.Context) error {
92+
_, err := r.context.PersistentVolumeClaimsModInterface().Patch(ctxChild, pvc.GetName(), types.JSONPatchType, d, meta.PatchOptions{})
93+
return err
94+
})
95+
96+
if err != nil {
97+
log.Debug().Err(err).Msg("Failed to update PVC (ownerReferences)")
98+
return errors.WithStack(err)
99+
}
100+
}
101+
79102
if k8sutil.IsPersistentVolumeClaimMarkedForDeletion(pvc) {
80103
// Process finalizers
81104
if x, err := r.runPVCFinalizers(ctx, pvc, group, memberStatus); err != nil {

pkg/util/k8sutil/util.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@ func AddOwnerRefToObject(obj metav1.Object, ownerRef *metav1.OwnerReference) {
5656
}
5757
}
5858

59+
// UpdateOwnerRefToObjectIfNeeded add given owner reference to given object if it does not exist yet
60+
func UpdateOwnerRefToObjectIfNeeded(obj metav1.Object, ownerRef *metav1.OwnerReference) bool {
61+
if ownerRef != nil {
62+
for _, existingOwnerRef := range obj.GetOwnerReferences() {
63+
if existingOwnerRef.UID == ownerRef.UID {
64+
return false
65+
}
66+
}
67+
68+
AddOwnerRefToObject(obj, ownerRef)
69+
return true
70+
}
71+
return false
72+
}
73+
5974
// LabelsForExporterServiceSelector returns a map of labels, used to select the all arangodb-exporter containers
6075
func LabelsForExporterServiceSelector(deploymentName string) map[string]string {
6176
return map[string]string{

pkg/util/k8sutil/util_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,22 @@ func TestAddOwnerRefToObject(t *testing.T) {
3838
assert.Len(t, p.GetOwnerReferences(), 1)
3939
}
4040

41+
// UpdateOwnerRefToObjectIfNeeded tests UpdateOwnerRefToObjectIfNeeded.
42+
func TestUpdateOwnerRefToObjectIfNeeded(t *testing.T) {
43+
p := &v1.Pod{}
44+
result := UpdateOwnerRefToObjectIfNeeded(p, nil)
45+
assert.Len(t, p.GetOwnerReferences(), 0)
46+
assert.False(t, result)
47+
48+
result = UpdateOwnerRefToObjectIfNeeded(p, &metav1.OwnerReference{})
49+
assert.Len(t, p.GetOwnerReferences(), 1)
50+
assert.True(t, result)
51+
52+
result = UpdateOwnerRefToObjectIfNeeded(p, &metav1.OwnerReference{})
53+
assert.Len(t, p.GetOwnerReferences(), 1)
54+
assert.False(t, result)
55+
}
56+
4157
// TestLabelsForDeployment tests LabelsForDeployment.
4258
func TestLabelsForDeployment(t *testing.T) {
4359
l := LabelsForDeployment("test", "role")

0 commit comments

Comments
 (0)