diff --git a/.github/workflows/e2e-chainsaw.yml b/.github/workflows/e2e-chainsaw.yml index e3708c5f9..c3d151ed7 100644 --- a/.github/workflows/e2e-chainsaw.yml +++ b/.github/workflows/e2e-chainsaw.yml @@ -22,6 +22,7 @@ jobs: - ./tests/e2e-chainsaw/v1beta2/ha-setup/ - ./tests/e2e-chainsaw/v1beta2/nodeport/ - ./tests/e2e-chainsaw/v1beta2/pvc-name/ + - ./tests/e2e-chainsaw/v1beta2/keep-pvc/ steps: - name: Checkout code diff --git a/api/common_types.go b/api/common_types.go index a67722406..ae4f5aa6a 100644 --- a/api/common_types.go +++ b/api/common_types.go @@ -54,6 +54,7 @@ type RedisConfig struct { // Storage is the inteface to add pvc and pv support in redis // +k8s:deepcopy-gen=true type Storage struct { + KeepAfterDelete bool `json:"keepAfterDelete,omitempty"` VolumeClaimTemplate corev1.PersistentVolumeClaim `json:"volumeClaimTemplate,omitempty"` VolumeMount AdditionalVolume `json:"volumeMount,omitempty"` } diff --git a/config/crd/bases/redis.redis.opstreelabs.in_redis.yaml b/config/crd/bases/redis.redis.opstreelabs.in_redis.yaml index fec228a5e..396696ccd 100644 --- a/config/crd/bases/redis.redis.opstreelabs.in_redis.yaml +++ b/config/crd/bases/redis.redis.opstreelabs.in_redis.yaml @@ -1685,6 +1685,8 @@ spec: description: Storage is the inteface to add pvc and pv support in redis properties: + keepAfterDelete: + type: boolean volumeClaimTemplate: description: PersistentVolumeClaim is a user's request for and claim to a persistent volume @@ -6098,6 +6100,8 @@ spec: description: Storage is the inteface to add pvc and pv support in redis properties: + keepAfterDelete: + type: boolean volumeClaimTemplate: description: PersistentVolumeClaim is a user's request for and claim to a persistent volume diff --git a/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml b/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml index e525f917e..b781c15ef 100644 --- a/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml +++ b/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml @@ -2884,6 +2884,8 @@ spec: description: Storage is the inteface to add pvc and pv support in redis properties: + keepAfterDelete: + type: boolean volumeClaimTemplate: description: PersistentVolumeClaim is a user's request for and claim to a persistent volume @@ -8657,6 +8659,8 @@ spec: storage: description: Node-conf needs to be added only in redis cluster properties: + keepAfterDelete: + type: boolean nodeConfVolume: default: false type: boolean diff --git a/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml b/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml index 76856bcfc..c52f9a10a 100644 --- a/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml +++ b/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml @@ -1687,6 +1687,8 @@ spec: description: Storage is the inteface to add pvc and pv support in redis properties: + keepAfterDelete: + type: boolean volumeClaimTemplate: description: PersistentVolumeClaim is a user's request for and claim to a persistent volume @@ -6103,6 +6105,8 @@ spec: description: Storage is the inteface to add pvc and pv support in redis properties: + keepAfterDelete: + type: boolean volumeClaimTemplate: description: PersistentVolumeClaim is a user's request for and claim to a persistent volume diff --git a/k8sutils/finalizer.go b/k8sutils/finalizer.go index b85ef3c51..526fac516 100644 --- a/k8sutils/finalizer.go +++ b/k8sutils/finalizer.go @@ -31,8 +31,10 @@ func finalizerLogger(namespace string, name string) logr.Logger { func HandleRedisFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.Redis) error { if cr.GetDeletionTimestamp() != nil { if controllerutil.ContainsFinalizer(cr, RedisFinalizer) { - if err := finalizeRedisPVC(k8sClient, logger, cr); err != nil { - return err + if !cr.Spec.Storage.KeepAfterDelete { + if err := finalizeRedisPVC(k8sClient, logger, cr); err != nil { + return err + } } controllerutil.RemoveFinalizer(cr, RedisFinalizer) if err := ctrlclient.Update(context.TODO(), cr); err != nil { @@ -48,8 +50,10 @@ func HandleRedisFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interfa func HandleRedisClusterFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.RedisCluster) error { if cr.GetDeletionTimestamp() != nil { if controllerutil.ContainsFinalizer(cr, RedisClusterFinalizer) { - if err := finalizeRedisClusterPVC(k8sClient, logger, cr); err != nil { - return err + if !cr.Spec.Storage.KeepAfterDelete { + if err := finalizeRedisClusterPVC(k8sClient, logger, cr); err != nil { + return err + } } controllerutil.RemoveFinalizer(cr, RedisClusterFinalizer) if err := ctrlclient.Update(context.TODO(), cr); err != nil { @@ -65,8 +69,10 @@ func HandleRedisClusterFinalizer(ctrlclient client.Client, k8sClient kubernetes. func HandleRedisReplicationFinalizer(ctrlclient client.Client, k8sClient kubernetes.Interface, logger logr.Logger, cr *redisv1beta2.RedisReplication) error { if cr.GetDeletionTimestamp() != nil { if controllerutil.ContainsFinalizer(cr, RedisReplicationFinalizer) { - if err := finalizeRedisReplicationPVC(k8sClient, logger, cr); err != nil { - return err + if !cr.Spec.Storage.KeepAfterDelete { + if err := finalizeRedisReplicationPVC(k8sClient, logger, cr); err != nil { + return err + } } controllerutil.RemoveFinalizer(cr, RedisReplicationFinalizer) if err := ctrlclient.Update(context.TODO(), cr); err != nil { diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/chainsaw-test.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/chainsaw-test.yaml new file mode 100644 index 000000000..5ee5221b4 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/chainsaw-test.yaml @@ -0,0 +1,34 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json + +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: keep-pvc +spec: + steps: + - name: Install + try: + - apply: + file: cluster.yaml + - assert: + file: ready-cluster.yaml + - assert: + file: ready-sts.yaml + - assert: + file: ready-svc.yaml + - assert: + file: ready-pvc.yaml + + - name: Uninstall + try: + - delete: + ref: + name: redis-cluster-v1beta2 + kind: RedisCluster + apiVersion: redis.redis.opstreelabs.in/v1beta2 + - error: + file: ready-sts.yaml + - error: + file: ready-svc.yaml + - assert: + file: ready-pvc.yaml diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/cluster.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/cluster.yaml new file mode 100644 index 000000000..126651a37 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/cluster.yaml @@ -0,0 +1,48 @@ +apiVersion: redis.redis.opstreelabs.in/v1beta2 +kind: RedisCluster +metadata: + name: redis-cluster-v1beta2 +spec: + clusterSize: 3 + clusterVersion: v7 + persistenceEnabled: true + podSecurityContext: + runAsUser: 1000 + fsGroup: 1000 + kubernetesConfig: + image: quay.io/opstree/redis:latest + imagePullPolicy: Always + resources: + requests: + cpu: 101m + memory: 128Mi + limits: + cpu: 101m + memory: 128Mi + redisExporter: + enabled: true + image: quay.io/opstree/redis-exporter:v1.44.0 + imagePullPolicy: Always + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 100m + memory: 128Mi + storage: + keepAfterDelete: true + volumeClaimTemplate: + spec: + # storageClassName: standard + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi + nodeConfVolume: true + nodeConfVolumeClaimTemplate: + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-cluster.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-cluster.yaml new file mode 100644 index 000000000..49e754e81 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-cluster.yaml @@ -0,0 +1,7 @@ +apiVersion: redis.redis.opstreelabs.in/v1beta2 +kind: RedisCluster +metadata: + name: redis-cluster-v1beta2 +status: + readyFollowerReplicas: 3 + readyLeaderReplicas: 3 diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-pvc.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-pvc.yaml new file mode 100644 index 000000000..a89bfa22a --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-pvc.yaml @@ -0,0 +1,181 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: node-conf-redis-cluster-v1beta2-leader-0 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: node-conf-redis-cluster-v1beta2-leader-1 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: node-conf-redis-cluster-v1beta2-leader-2 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: node-conf-redis-cluster-v1beta2-follower-0 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: node-conf-redis-cluster-v1beta2-follower-1 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: node-conf-redis-cluster-v1beta2-follower-2 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound + +--- + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-cluster-v1beta2-leader-redis-cluster-v1beta2-leader-0 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-cluster-v1beta2-leader-redis-cluster-v1beta2-leader-1 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-cluster-v1beta2-leader-redis-cluster-v1beta2-leader-2 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-cluster-v1beta2-follower-redis-cluster-v1beta2-follower-0 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-cluster-v1beta2-follower-redis-cluster-v1beta2-follower-1 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-cluster-v1beta2-follower-redis-cluster-v1beta2-follower-2 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-sts.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-sts.yaml new file mode 100644 index 000000000..1053eb784 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-sts.yaml @@ -0,0 +1,25 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: redis-cluster-v1beta2-leader + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader +status: + replicas: 3 + readyReplicas: 3 + +--- + +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: redis-cluster-v1beta2-follower + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower +status: + replicas: 3 + readyReplicas: 3 diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-svc.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-svc.yaml new file mode 100644 index 000000000..e8af234a6 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-cluster/ready-svc.yaml @@ -0,0 +1,201 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-cluster-v1beta2 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader + name: redis-cluster-v1beta2-leader-additional + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisCluster + name: redis-cluster-v1beta2 +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-cluster-v1beta2 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader + name: redis-cluster-v1beta2-leader + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisCluster + name: redis-cluster-v1beta2 +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + - name: redis-exporter + port: 9121 + protocol: TCP + targetPort: 9121 + selector: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-cluster-v1beta2 + labels: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader + name: redis-cluster-v1beta2-leader-headless + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisCluster + name: redis-cluster-v1beta2 +spec: + clusterIP: None + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-cluster-v1beta2-leader + redis_setup_type: cluster + role: leader + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-cluster-v1beta2 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower + name: redis-cluster-v1beta2-follower + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisCluster + name: redis-cluster-v1beta2 +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + - name: redis-exporter + port: 9121 + protocol: TCP + targetPort: 9121 + selector: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-cluster-v1beta2 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower + name: redis-cluster-v1beta2-follower-additional + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisCluster + name: redis-cluster-v1beta2 +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-cluster-v1beta2 + labels: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower + name: redis-cluster-v1beta2-follower-headless + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisCluster + name: redis-cluster-v1beta2 +spec: + clusterIP: None + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-cluster-v1beta2-follower + redis_setup_type: cluster + role: follower + type: ClusterIP +status: + loadBalancer: {} \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/chainsaw-test.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/chainsaw-test.yaml new file mode 100644 index 000000000..922c98e94 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/chainsaw-test.yaml @@ -0,0 +1,32 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json + +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: keep-pvc +spec: + steps: + - name: Install + try: + - apply: + file: replication.yaml + - assert: + file: ready-sts.yaml + - assert: + file: ready-svc.yaml + - assert: + file: ready-pvc.yaml + + - name: Uninstall + try: + - delete: + ref: + name: redis-replication + kind: RedisReplication + apiVersion: redis.redis.opstreelabs.in/v1beta2 + - error: + file: ready-sts.yaml + - error: + file: ready-svc.yaml + - assert: + file: ready-pvc.yaml \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-pvc.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-pvc.yaml new file mode 100644 index 000000000..f57cb3f61 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-pvc.yaml @@ -0,0 +1,44 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-replication-redis-replication-0 + labels: + app: redis-replication + redis_setup_type: replication + role: replication +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-replication-redis-replication-1 + labels: + app: redis-replication + redis_setup_type: replication + role: replication +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-replication-redis-replication-2 + labels: + app: redis-replication + redis_setup_type: replication + role: replication +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-sts.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-sts.yaml new file mode 100644 index 000000000..f2ac67b1a --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-sts.yaml @@ -0,0 +1,19 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + annotations: + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-replication + labels: + app: redis-replication + redis_setup_type: replication + role: replication + name: redis-replication + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisReplication + name: redis-replication +status: + readyReplicas: 3 + replicas: 3 \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-svc.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-svc.yaml new file mode 100644 index 000000000..707a8df9b --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/ready-svc.yaml @@ -0,0 +1,90 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-replication + labels: + app: redis-replication + redis_setup_type: replication + role: replication + name: redis-replication + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisReplication + name: redis-replication +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-replication + redis_setup_type: replication + role: replication + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-replication + labels: + app: redis-replication + redis_setup_type: replication + role: replication + name: redis-replication-additional + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisReplication + name: redis-replication +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-replication + redis_setup_type: replication + role: replication + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-replication + labels: + app: redis-replication + redis_setup_type: replication + role: replication + name: redis-replication-headless + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: RedisReplication + name: redis-replication +spec: + clusterIP: None + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-replication + redis_setup_type: replication + role: replication + type: ClusterIP \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/replication.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/replication.yaml new file mode 100644 index 000000000..5b3f3c5ac --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-replication/replication.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: redis.redis.opstreelabs.in/v1beta2 +kind: RedisReplication +metadata: + name: redis-replication +spec: + clusterSize: 3 + podSecurityContext: + runAsUser: 1000 + fsGroup: 1000 + kubernetesConfig: + image: quay.io/opstree/redis:latest + imagePullPolicy: Always + resources: + requests: + cpu: 101m + memory: 128Mi + limits: + cpu: 101m + memory: 128Mi + storage: + keepAfterDelete: true + volumeClaimTemplate: + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/chainsaw-test.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/chainsaw-test.yaml new file mode 100644 index 000000000..130ba36df --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/chainsaw-test.yaml @@ -0,0 +1,32 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/kyverno/chainsaw/main/.schemas/json/test-chainsaw-v1alpha1.json + +apiVersion: chainsaw.kyverno.io/v1alpha1 +kind: Test +metadata: + name: keep-pvc +spec: + steps: + - name: Install + try: + - apply: + file: standalone.yaml + - assert: + file: ready-sts.yaml + - assert: + file: ready-svc.yaml + - assert: + file: ready-pvc.yaml + + - name: Uninstall + try: + - delete: + ref: + name: redis-standalone-v1beta2 + kind: Redis + apiVersion: redis.redis.opstreelabs.in/v1beta2 + - error: + file: ready-sts.yaml + - error: + file: ready-svc.yaml + - assert: + file: ready-pvc.yaml \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-pvc.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-pvc.yaml new file mode 100644 index 000000000..777fa3656 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-pvc.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: redis-standalone-v1beta2-redis-standalone-v1beta2-0 + labels: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone +status: + accessModes: + - ReadWriteOnce + capacity: + storage: 1Gi + phase: Bound diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-sts.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-sts.yaml new file mode 100644 index 000000000..5402de920 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-sts.yaml @@ -0,0 +1,11 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: redis-standalone-v1beta2 + labels: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone +status: + replicas: 1 + readyReplicas: 1 diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-svc.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-svc.yaml new file mode 100644 index 000000000..08b416ce2 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/ready-svc.yaml @@ -0,0 +1,96 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-standalone-v1beta2 + labels: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone + name: redis-standalone-v1beta2-headless + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: Redis + name: redis-standalone-v1beta2 +spec: + clusterIP: None + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-standalone-v1beta2 + labels: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone + name: redis-standalone-v1beta2 + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: Redis + name: redis-standalone-v1beta2 +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone + type: ClusterIP +status: + loadBalancer: {} +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/port: "9121" + prometheus.io/scrape: "true" + redis.opstreelabs.in: "true" + redis.opstreelabs.instance: redis-standalone-v1beta2 + labels: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone + name: redis-standalone-v1beta2-additional + ownerReferences: + - apiVersion: redis.redis.opstreelabs.in/v1beta2 + controller: true + kind: Redis + name: redis-standalone-v1beta2 +spec: + ports: + - name: redis-client + port: 6379 + protocol: TCP + targetPort: 6379 + selector: + app: redis-standalone-v1beta2 + redis_setup_type: standalone + role: standalone + type: ClusterIP +status: + loadBalancer: {} \ No newline at end of file diff --git a/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/standalone.yaml b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/standalone.yaml new file mode 100644 index 000000000..3962ff653 --- /dev/null +++ b/tests/e2e-chainsaw/v1beta2/keep-pvc/redis-standalone/standalone.yaml @@ -0,0 +1,27 @@ +apiVersion: redis.redis.opstreelabs.in/v1beta2 +kind: Redis +metadata: + name: redis-standalone-v1beta2 +spec: + podSecurityContext: + runAsUser: 1000 + fsGroup: 1000 + kubernetesConfig: + image: quay.io/opstree/redis:latest + imagePullPolicy: Always + resources: + requests: + cpu: 101m + memory: 128Mi + limits: + cpu: 101m + memory: 128Mi + storage: + keepAfterDelete: true + volumeClaimTemplate: + spec: + # storageClassName: standard + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi