Skip to content

Commit df2df6d

Browse files
authored
feat: add field to keep pvc after cr be deleted (#772)
* feat: add field to keep pvc after cr be deleted Signed-off-by: drivebyer <wuyangmuc@gmail.com> * fix kind Signed-off-by: drivebyer <wuyangmuc@gmail.com> * fix delete name Signed-off-by: drivebyer <wuyangmuc@gmail.com> --------- Signed-off-by: drivebyer <wuyangmuc@gmail.com>
1 parent bb69d00 commit df2df6d

22 files changed

+915
-6
lines changed

.github/workflows/e2e-chainsaw.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ jobs:
2222
- ./tests/e2e-chainsaw/v1beta2/ha-setup/
2323
- ./tests/e2e-chainsaw/v1beta2/nodeport/
2424
- ./tests/e2e-chainsaw/v1beta2/pvc-name/
25+
- ./tests/e2e-chainsaw/v1beta2/keep-pvc/
2526

2627
steps:
2728
- name: Checkout code

api/common_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ type RedisConfig struct {
5454
// Storage is the inteface to add pvc and pv support in redis
5555
// +k8s:deepcopy-gen=true
5656
type Storage struct {
57+
KeepAfterDelete bool `json:"keepAfterDelete,omitempty"`
5758
VolumeClaimTemplate corev1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"`
5859
VolumeMount AdditionalVolume `json:"volumeMount,omitempty"`
5960
}

config/crd/bases/redis.redis.opstreelabs.in_redis.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,6 +1685,8 @@ spec:
16851685
description: Storage is the inteface to add pvc and pv support in
16861686
redis
16871687
properties:
1688+
keepAfterDelete:
1689+
type: boolean
16881690
volumeClaimTemplate:
16891691
description: PersistentVolumeClaim is a user's request for and
16901692
claim to a persistent volume
@@ -6098,6 +6100,8 @@ spec:
60986100
description: Storage is the inteface to add pvc and pv support in
60996101
redis
61006102
properties:
6103+
keepAfterDelete:
6104+
type: boolean
61016105
volumeClaimTemplate:
61026106
description: PersistentVolumeClaim is a user's request for and
61036107
claim to a persistent volume

config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2884,6 +2884,8 @@ spec:
28842884
description: Storage is the inteface to add pvc and pv support in
28852885
redis
28862886
properties:
2887+
keepAfterDelete:
2888+
type: boolean
28872889
volumeClaimTemplate:
28882890
description: PersistentVolumeClaim is a user's request for and
28892891
claim to a persistent volume
@@ -8657,6 +8659,8 @@ spec:
86578659
storage:
86588660
description: Node-conf needs to be added only in redis cluster
86598661
properties:
8662+
keepAfterDelete:
8663+
type: boolean
86608664
nodeConfVolume:
86618665
default: false
86628666
type: boolean

config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,6 +1687,8 @@ spec:
16871687
description: Storage is the inteface to add pvc and pv support in
16881688
redis
16891689
properties:
1690+
keepAfterDelete:
1691+
type: boolean
16901692
volumeClaimTemplate:
16911693
description: PersistentVolumeClaim is a user's request for and
16921694
claim to a persistent volume
@@ -6103,6 +6105,8 @@ spec:
61036105
description: Storage is the inteface to add pvc and pv support in
61046106
redis
61056107
properties:
6108+
keepAfterDelete:
6109+
type: boolean
61066110
volumeClaimTemplate:
61076111
description: PersistentVolumeClaim is a user's request for and
61086112
claim to a persistent volume

k8sutils/finalizer.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ func finalizerLogger(namespace string, name string) logr.Logger {
3131
func HandleRedisFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.Redis) error {
3232
if cr.GetDeletionTimestamp() != nil {
3333
if controllerutil.ContainsFinalizer(cr, RedisFinalizer) {
34-
if err := finalizeRedisPVC(k8sClient, logger, cr); err != nil {
35-
return err
34+
if !cr.Spec.Storage.KeepAfterDelete {
35+
if err := finalizeRedisPVC(k8sClient, logger, cr); err != nil {
36+
return err
37+
}
3638
}
3739
controllerutil.RemoveFinalizer(cr, RedisFinalizer)
3840
if err := ctrlclient.Update(context.TODO(), cr); err != nil {
@@ -48,8 +50,10 @@ func HandleRedisFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interfa
4850
func HandleRedisClusterFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.RedisCluster) error {
4951
if cr.GetDeletionTimestamp() != nil {
5052
if controllerutil.ContainsFinalizer(cr, RedisClusterFinalizer) {
51-
if err := finalizeRedisClusterPVC(k8sClient, logger, cr); err != nil {
52-
return err
53+
if !cr.Spec.Storage.KeepAfterDelete {
54+
if err := finalizeRedisClusterPVC(k8sClient, logger, cr); err != nil {
55+
return err
56+
}
5357
}
5458
controllerutil.RemoveFinalizer(cr, RedisClusterFinalizer)
5559
if err := ctrlclient.Update(context.TODO(), cr); err != nil {
@@ -65,8 +69,10 @@ func HandleRedisClusterFinalizer(ctrlclient client.Client, k8sClient kubernetes.
6569
func HandleRedisReplicationFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.RedisReplication) error {
6670
if cr.GetDeletionTimestamp() != nil {
6771
if controllerutil.ContainsFinalizer(cr, RedisReplicationFinalizer) {
68-
if err := finalizeRedisReplicationPVC(k8sClient, logger, cr); err != nil {
69-
return err
72+
if !cr.Spec.Storage.KeepAfterDelete {
73+
if err := finalizeRedisReplicationPVC(k8sClient, logger, cr); err != nil {
74+
return err
75+
}
7076
}
7177
controllerutil.RemoveFinalizer(cr, RedisReplicationFinalizer)
7278
if err := ctrlclient.Update(context.TODO(), cr); err != nil {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json
2+
3+
apiVersion: chainsaw.kyverno.io/v1alpha1
4+
kind: Test
5+
metadata:
6+
name: keep-pvc
7+
spec:
8+
steps:
9+
- name: Install
10+
try:
11+
- apply:
12+
file: cluster.yaml
13+
- assert:
14+
file: ready-cluster.yaml
15+
- assert:
16+
file: ready-sts.yaml
17+
- assert:
18+
file: ready-svc.yaml
19+
- assert:
20+
file: ready-pvc.yaml
21+
22+
- name: Uninstall
23+
try:
24+
- delete:
25+
ref:
26+
name: redis-cluster-v1beta2
27+
kind: RedisCluster
28+
apiVersion: redis.redis.opstreelabs.in/v1beta2
29+
- error:
30+
file: ready-sts.yaml
31+
- error:
32+
file: ready-svc.yaml
33+
- assert:
34+
file: ready-pvc.yaml
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apiVersion: redis.redis.opstreelabs.in/v1beta2
2+
kind: RedisCluster
3+
metadata:
4+
name: redis-cluster-v1beta2
5+
spec:
6+
clusterSize: 3
7+
clusterVersion: v7
8+
persistenceEnabled: true
9+
podSecurityContext:
10+
runAsUser: 1000
11+
fsGroup: 1000
12+
kubernetesConfig:
13+
image: quay.io/opstree/redis:latest
14+
imagePullPolicy: Always
15+
resources:
16+
requests:
17+
cpu: 101m
18+
memory: 128Mi
19+
limits:
20+
cpu: 101m
21+
memory: 128Mi
22+
redisExporter:
23+
enabled: true
24+
image: quay.io/opstree/redis-exporter:v1.44.0
25+
imagePullPolicy: Always
26+
resources:
27+
requests:
28+
cpu: 100m
29+
memory: 128Mi
30+
limits:
31+
cpu: 100m
32+
memory: 128Mi
33+
storage:
34+
keepAfterDelete: true
35+
volumeClaimTemplate:
36+
spec:
37+
# storageClassName: standard
38+
accessModes: ["ReadWriteOnce"]
39+
resources:
40+
requests:
41+
storage: 1Gi
42+
nodeConfVolume: true
43+
nodeConfVolumeClaimTemplate:
44+
spec:
45+
accessModes: ["ReadWriteOnce"]
46+
resources:
47+
requests:
48+
storage: 1Gi
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: redis.redis.opstreelabs.in/v1beta2
2+
kind: RedisCluster
3+
metadata:
4+
name: redis-cluster-v1beta2
5+
status:
6+
readyFollowerReplicas: 3
7+
readyLeaderReplicas: 3
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
apiVersion: v1
2+
kind: PersistentVolumeClaim
3+
metadata:
4+
name: node-conf-redis-cluster-v1beta2-leader-0
5+
labels:
6+
app: redis-cluster-v1beta2-leader
7+
redis_setup_type: cluster
8+
role: leader
9+
status:
10+
accessModes:
11+
- ReadWriteOnce
12+
capacity:
13+
storage: 1Gi
14+
phase: Bound
15+
---
16+
apiVersion: v1
17+
kind: PersistentVolumeClaim
18+
metadata:
19+
name: node-conf-redis-cluster-v1beta2-leader-1
20+
labels:
21+
app: redis-cluster-v1beta2-leader
22+
redis_setup_type: cluster
23+
role: leader
24+
status:
25+
accessModes:
26+
- ReadWriteOnce
27+
capacity:
28+
storage: 1Gi
29+
phase: Bound
30+
---
31+
apiVersion: v1
32+
kind: PersistentVolumeClaim
33+
metadata:
34+
name: node-conf-redis-cluster-v1beta2-leader-2
35+
labels:
36+
app: redis-cluster-v1beta2-leader
37+
redis_setup_type: cluster
38+
role: leader
39+
status:
40+
accessModes:
41+
- ReadWriteOnce
42+
capacity:
43+
storage: 1Gi
44+
phase: Bound
45+
---
46+
apiVersion: v1
47+
kind: PersistentVolumeClaim
48+
metadata:
49+
name: node-conf-redis-cluster-v1beta2-follower-0
50+
labels:
51+
app: redis-cluster-v1beta2-follower
52+
redis_setup_type: cluster
53+
role: follower
54+
status:
55+
accessModes:
56+
- ReadWriteOnce
57+
capacity:
58+
storage: 1Gi
59+
phase: Bound
60+
---
61+
apiVersion: v1
62+
kind: PersistentVolumeClaim
63+
metadata:
64+
name: node-conf-redis-cluster-v1beta2-follower-1
65+
labels:
66+
app: redis-cluster-v1beta2-follower
67+
redis_setup_type: cluster
68+
role: follower
69+
status:
70+
accessModes:
71+
- ReadWriteOnce
72+
capacity:
73+
storage: 1Gi
74+
phase: Bound
75+
---
76+
apiVersion: v1
77+
kind: PersistentVolumeClaim
78+
metadata:
79+
name: node-conf-redis-cluster-v1beta2-follower-2
80+
labels:
81+
app: redis-cluster-v1beta2-follower
82+
redis_setup_type: cluster
83+
role: follower
84+
status:
85+
accessModes:
86+
- ReadWriteOnce
87+
capacity:
88+
storage: 1Gi
89+
phase: Bound
90+
91+
---
92+
93+
apiVersion: v1
94+
kind: PersistentVolumeClaim
95+
metadata:
96+
name: redis-cluster-v1beta2-leader-redis-cluster-v1beta2-leader-0
97+
labels:
98+
app: redis-cluster-v1beta2-leader
99+
redis_setup_type: cluster
100+
role: leader
101+
status:
102+
accessModes:
103+
- ReadWriteOnce
104+
capacity:
105+
storage: 1Gi
106+
phase: Bound
107+
---
108+
apiVersion: v1
109+
kind: PersistentVolumeClaim
110+
metadata:
111+
name: redis-cluster-v1beta2-leader-redis-cluster-v1beta2-leader-1
112+
labels:
113+
app: redis-cluster-v1beta2-leader
114+
redis_setup_type: cluster
115+
role: leader
116+
status:
117+
accessModes:
118+
- ReadWriteOnce
119+
capacity:
120+
storage: 1Gi
121+
phase: Bound
122+
---
123+
apiVersion: v1
124+
kind: PersistentVolumeClaim
125+
metadata:
126+
name: redis-cluster-v1beta2-leader-redis-cluster-v1beta2-leader-2
127+
labels:
128+
app: redis-cluster-v1beta2-leader
129+
redis_setup_type: cluster
130+
role: leader
131+
status:
132+
accessModes:
133+
- ReadWriteOnce
134+
capacity:
135+
storage: 1Gi
136+
phase: Bound
137+
---
138+
apiVersion: v1
139+
kind: PersistentVolumeClaim
140+
metadata:
141+
name: redis-cluster-v1beta2-follower-redis-cluster-v1beta2-follower-0
142+
labels:
143+
app: redis-cluster-v1beta2-follower
144+
redis_setup_type: cluster
145+
role: follower
146+
status:
147+
accessModes:
148+
- ReadWriteOnce
149+
capacity:
150+
storage: 1Gi
151+
phase: Bound
152+
---
153+
apiVersion: v1
154+
kind: PersistentVolumeClaim
155+
metadata:
156+
name: redis-cluster-v1beta2-follower-redis-cluster-v1beta2-follower-1
157+
labels:
158+
app: redis-cluster-v1beta2-follower
159+
redis_setup_type: cluster
160+
role: follower
161+
status:
162+
accessModes:
163+
- ReadWriteOnce
164+
capacity:
165+
storage: 1Gi
166+
phase: Bound
167+
---
168+
apiVersion: v1
169+
kind: PersistentVolumeClaim
170+
metadata:
171+
name: redis-cluster-v1beta2-follower-redis-cluster-v1beta2-follower-2
172+
labels:
173+
app: redis-cluster-v1beta2-follower
174+
redis_setup_type: cluster
175+
role: follower
176+
status:
177+
accessModes:
178+
- ReadWriteOnce
179+
capacity:
180+
storage: 1Gi
181+
phase: Bound

0 commit comments

Comments
 (0)