Skip to content

Commit ef99c4d

Browse files
authored
feat: add environment to customize data pvc prefix (#742)
* support customize pvc template name Signed-off-by: drivebyer <wuyangmuc@gmail.com> * add test case Signed-off-by: drivebyer <wuyangmuc@gmail.com> * kubectl Signed-off-by: drivebyer <wuyangmuc@gmail.com> * wait operator ready Signed-off-by: drivebyer <wuyangmuc@gmail.com> * fix sleep Signed-off-by: drivebyer <wuyangmuc@gmail.com> * fix sleep Signed-off-by: drivebyer <wuyangmuc@gmail.com> * remove debug Signed-off-by: drivebyer <wuyangmuc@gmail.com> --------- Signed-off-by: drivebyer <wuyangmuc@gmail.com>
1 parent f07f596 commit ef99c4d

File tree

11 files changed

+530
-8
lines changed

11 files changed

+530
-8
lines changed

.github/workflows/e2e-chainsaw.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ jobs:
2121
- ./tests/e2e-chainsaw/v1beta2/password/
2222
- ./tests/e2e-chainsaw/v1beta2/ha-setup/
2323
- ./tests/e2e-chainsaw/v1beta2/nodeport/
24+
- ./tests/e2e-chainsaw/v1beta2/pvc-name/
2425

2526
steps:
2627
- name: Checkout code

k8sutils/const.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ package k8sutils
33
const (
44
AnnotationKeyRecreateStatefulset = "redis.opstreelabs.in/recreate-statefulset"
55
)
6+
7+
const (
8+
EnvOperatorSTSPVCTemplateName = "OPERATOR_STS_PVC_TEMPLATE_NAME"
9+
)

k8sutils/finalizer.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package k8sutils
33
import (
44
"context"
55
"fmt"
6+
"k8s.io/utils/env"
67

78
redisv1beta2 "github.com/OT-CONTAINER-KIT/redis-operator/api/v1beta2"
89
"github.com/go-logr/logr"
@@ -133,7 +134,8 @@ func AddRedisSentinelFinalizer(cr *redisv1beta2.RedisSentinel, cl client.Client)
133134

134135
// finalizeRedisPVC delete PVC
135136
func finalizeRedisPVC(client kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.Redis) error {
136-
PVCName := fmt.Sprintf("%s-%s-0", cr.Name, cr.Name)
137+
pvcTemplateName := env.GetString(EnvOperatorSTSPVCTemplateName, cr.Name)
138+
PVCName := fmt.Sprintf("%s-%s-0", pvcTemplateName, cr.Name)
137139
err := client.CoreV1().PersistentVolumeClaims(cr.Namespace).Delete(context.TODO(), PVCName, metav1.DeleteOptions{})
138140
if err != nil && !errors.IsNotFound(err) {
139141
logger.Error(err, "Could not delete Persistent Volume Claim", "PVCName", PVCName)
@@ -146,7 +148,8 @@ func finalizeRedisPVC(client kubernetes.Interface, logger logr.Logger, cr *redis
146148
func finalizeRedisClusterPVC(client kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.RedisCluster) error {
147149
for _, role := range []string{"leader", "follower"} {
148150
for i := 0; i < int(cr.Spec.GetReplicaCounts(role)); i++ {
149-
PVCName := fmt.Sprintf("%s-%s-%s-%s-%d", cr.Name, role, cr.Name, role, i)
151+
pvcTemplateName := env.GetString(EnvOperatorSTSPVCTemplateName, cr.Name+"-"+role)
152+
PVCName := fmt.Sprintf("%s-%s-%s-%d", pvcTemplateName, cr.Name, role, i)
150153
err := client.CoreV1().PersistentVolumeClaims(cr.Namespace).Delete(context.TODO(), PVCName, metav1.DeleteOptions{})
151154
if err != nil && !errors.IsNotFound(err) {
152155
logger.Error(err, "Could not delete Persistent Volume Claim "+PVCName)
@@ -171,7 +174,8 @@ func finalizeRedisClusterPVC(client kubernetes.Interface, logger logr.Logger, cr
171174
// finalizeRedisReplicationPVC delete PVCs
172175
func finalizeRedisReplicationPVC(client kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.RedisReplication) error {
173176
for i := 0; i < int(cr.Spec.GetReplicationCounts("replication")); i++ {
174-
PVCName := fmt.Sprintf("%s-%s-%d", cr.Name, cr.Name, i)
177+
pvcTemplateName := env.GetString(EnvOperatorSTSPVCTemplateName, cr.Name)
178+
PVCName := fmt.Sprintf("%s-%s-%d", pvcTemplateName, cr.Name, i)
175179
err := client.CoreV1().PersistentVolumeClaims(cr.Namespace).Delete(context.TODO(), PVCName, metav1.DeleteOptions{})
176180
if err != nil && !errors.IsNotFound(err) {
177181
logger.Error(err, "Could not delete Persistent Volume Claim "+PVCName)

k8sutils/statefulset.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package k8sutils
33
import (
44
"context"
55
"fmt"
6+
"k8s.io/utils/env"
67
"path"
78
"sort"
89
"strconv"
@@ -269,7 +270,8 @@ func generateStatefulSetsDef(stsMeta metav1.ObjectMeta, params statefulSetParame
269270
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, createPVCTemplate("node-conf", stsMeta, params.NodeConfPersistentVolumeClaim))
270271
}
271272
if containerParams.PersistenceEnabled != nil && *containerParams.PersistenceEnabled {
272-
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, createPVCTemplate(stsMeta.GetName(), stsMeta, params.PersistentVolumeClaim))
273+
pvcTplName := env.GetString(EnvOperatorSTSPVCTemplateName, stsMeta.GetName())
274+
statefulset.Spec.VolumeClaimTemplates = append(statefulset.Spec.VolumeClaimTemplates, createPVCTemplate(pvcTplName, stsMeta, params.PersistentVolumeClaim))
273275
}
274276
if params.ExternalConfig != nil {
275277
statefulset.Spec.Template.Spec.Volumes = getExternalConfig(*params.ExternalConfig)
@@ -328,7 +330,7 @@ func createPVCTemplate(volumeName string, stsMeta metav1.ObjectMeta, storageSpec
328330
pvcTemplate.CreationTimestamp = metav1.Time{}
329331
pvcTemplate.Name = volumeName
330332
pvcTemplate.Labels = stsMeta.GetLabels()
331-
// We want the same annoations as the StatefulSet here
333+
// We want the same annotation as the StatefulSet here
332334
pvcTemplate.Annotations = generateStatefulSetsAnots(stsMeta, nil)
333335
if storageSpec.Spec.AccessModes == nil {
334336
pvcTemplate.Spec.AccessModes = []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce}
@@ -559,7 +561,7 @@ func getVolumeMount(name string, persistenceEnabled *bool, clusterMode bool, nod
559561

560562
if persistenceEnabled != nil && *persistenceEnabled {
561563
VolumeMounts = append(VolumeMounts, corev1.VolumeMount{
562-
Name: name,
564+
Name: env.GetString(EnvOperatorSTSPVCTemplateName, name),
563565
MountPath: "/data",
564566
})
565567
}

tests/_config/chainsaw-configuration.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ spec:
99
timeouts:
1010
apply: 5m
1111
delete: 5m
12-
assert: 15m
13-
error: 15m
12+
assert: 10m
13+
error: 10m
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
apiVersion: chainsaw.kyverno.io/v1alpha1
3+
kind: Test
4+
metadata:
5+
name: pvc-name
6+
spec:
7+
steps:
8+
- name: Add PVC name environment
9+
try:
10+
- script:
11+
content: |
12+
kubectl patch deployment redis-operator-redis-operator --namespace redis-operator-system --type json -p='[{"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": {"name": "OPERATOR_STS_PVC_TEMPLATE_NAME", "value": "data"}}]'
13+
- sleep:
14+
duration: 1m
15+
16+
- name: redis-cluster-install
17+
try:
18+
- apply:
19+
file: cluster.yaml
20+
- assert:
21+
file: ready-cluster.yaml
22+
- assert:
23+
file: ready-sts.yaml
24+
- assert:
25+
file: ready-svc.yaml
26+
- assert:
27+
file: ready-pvc.yaml
28+
29+
- name: redis-cluster-uninstall
30+
try:
31+
- delete:
32+
ref:
33+
name: redis-cluster-v1beta2
34+
kind: RedisCluster
35+
apiVersion: redis.redis.opstreelabs.in/v1beta2
36+
- error:
37+
file: ready-cluster.yaml
38+
- error:
39+
file: ready-sts.yaml
40+
- error:
41+
file: ready-svc.yaml
42+
- error:
43+
file: ready-pvc.yaml
44+
45+
- name: Remove PVC name environment
46+
try:
47+
- script:
48+
content: |
49+
kubectl patch deployment redis-operator-redis-operator --namespace redis-operator-system --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/env/1"}]'
50+
kubectl wait --for=condition=available --timeout=300s deployment/redis-operator-redis-operator -n redis-operator-system
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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+
volumeClaimTemplate:
35+
spec:
36+
# storageClassName: standard
37+
accessModes: ["ReadWriteOnce"]
38+
resources:
39+
requests:
40+
storage: 1Gi
41+
nodeConfVolume: true
42+
nodeConfVolumeClaimTemplate:
43+
spec:
44+
accessModes: ["ReadWriteOnce"]
45+
resources:
46+
requests:
47+
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: data-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: data-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: data-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: data-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: data-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: data-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)