From ad1c2d6bca45e738eb762a0e91337e31105dcfbc Mon Sep 17 00:00:00 2001
From: Alok Naushad <alokme123@gmail.com>
Date: Fri, 26 May 2023 20:36:13 +0530
Subject: [PATCH] test: pod restart on configmap/secret update (#7306)

* test: pod restart on secret update

Signed-off-by: Alok N <alokme123@gmail.com>

* fix: requested changes

Signed-off-by: Alok N <alokme123@gmail.com>

* fix: debug remove, secret

Signed-off-by: Alok N <alokme123@gmail.com>

---------

Signed-off-by: Alok N <alokme123@gmail.com>
---
 .../01-manifests.yaml                         |  5 ++
 .../pod-restart-on-cm-update/02-policy.yaml   |  6 ++
 .../03-save-pod-name.yaml                     |  4 ++
 .../04-update-sc.yaml                         |  7 ++
 .../pod-restart-on-cm-update/05-sleep.yaml    |  4 ++
 .../06-check-restart.yaml                     |  4 ++
 .../pod-restart-on-cm-update/README.md        | 11 +++
 .../cluster-role.yaml                         | 15 ++++
 .../pod-restart-on-cm-update/manifests.yaml   | 37 ++++++++++
 .../policy-ready.yaml                         |  9 +++
 .../pod-restart-on-cm-update/policy.yaml      | 68 +++++++++++++++++++
 .../add-external-secret-prefix/03-sleep.yaml  |  4 ++
 .../{03-resource.yaml => 04-resource.yaml}    |  0
 13 files changed, 174 insertions(+)
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/01-manifests.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/02-policy.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/03-save-pod-name.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/04-update-sc.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/05-sleep.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/06-check-restart.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/README.md
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/cluster-role.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/manifests.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy-ready.yaml
 create mode 100644 test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy.yaml
 create mode 100644 test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/03-sleep.yaml
 rename test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/{03-resource.yaml => 04-resource.yaml} (100%)

diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/01-manifests.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/01-manifests.yaml
new file mode 100644
index 0000000000..cc496d2df4
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/01-manifests.yaml
@@ -0,0 +1,5 @@
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+apply:
+- manifests.yaml
+- cluster-role.yaml
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/02-policy.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/02-policy.yaml
new file mode 100644
index 0000000000..f3857739b0
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/02-policy.yaml
@@ -0,0 +1,6 @@
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+apply:
+- policy.yaml
+assert:
+- policy-ready.yaml
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/03-save-pod-name.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/03-save-pod-name.yaml
new file mode 100644
index 0000000000..1442a3185b
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/03-save-pod-name.yaml
@@ -0,0 +1,4 @@
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+  - script: "kubectl get po -n kube-state-metrics | awk 'NR==2{print $1}' > pod-name.txt"
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/04-update-sc.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/04-update-sc.yaml
new file mode 100644
index 0000000000..6e7dda9b5a
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/04-update-sc.yaml
@@ -0,0 +1,7 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: kube-state-metrics-crds
+  namespace: kube-state-metrics
+data:
+  foo: bm90LWJhcg==
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/05-sleep.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/05-sleep.yaml
new file mode 100644
index 0000000000..5b8bfb4701
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/05-sleep.yaml
@@ -0,0 +1,4 @@
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+  - command: sleep 5
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/06-check-restart.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/06-check-restart.yaml
new file mode 100644
index 0000000000..db1c68f914
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/06-check-restart.yaml
@@ -0,0 +1,4 @@
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+  - script: "if [ \"$(kubectl get pods -n kyverno | sort --key 5 --numeric | awk 'NR==2{print $1}')\" != \"$(cat pod-name.txt)\" ];then exit;else (exit 1);fi"
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/README.md b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/README.md
new file mode 100644
index 0000000000..3be519f36d
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/README.md
@@ -0,0 +1,11 @@
+## Description
+
+This test checks if a restart is triggered on a generated secret update
+
+## Expected Behavior
+
+Pod restarted after the generated secret is updated
+
+## Reference Issue(s)
+
+https://github.com/kyverno/kyverno/issues/6605
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/cluster-role.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/cluster-role.yaml
new file mode 100644
index 0000000000..6b093b6d7c
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/cluster-role.yaml
@@ -0,0 +1,15 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+  name: kyverno:background-controller:additional
+  labels:
+    app.kubernetes.io/component: background-controller
+    app.kubernetes.io/instance: kyverno
+    app.kubernetes.io/part-of: kyverno
+rules:
+- apiGroups:
+  - apps
+  resources:
+  - deployments
+  verbs:
+  - update
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/manifests.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/manifests.yaml
new file mode 100644
index 0000000000..06dd336459
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/manifests.yaml
@@ -0,0 +1,37 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: kube-state-metrics
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: kube-state-metrics-source-cm
+  namespace: kube-state-metrics
+  labels:
+    kubestatemetrics.platform.example: source
+data:
+  allowed: '"true"'
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  namespace: kube-state-metrics
+  name: kube-state-metrics
+  labels:
+    app: busybox
+spec:
+  selector:
+    matchLabels:
+      app: busybox
+  template:
+    metadata:
+      labels:
+        app: busybox
+    spec:
+      containers:
+      - name: busybox
+        image: busybox:1.35
+        command:
+        - sleep
+        - "36000"
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy-ready.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy-ready.yaml
new file mode 100644
index 0000000000..409d06e3c7
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy-ready.yaml
@@ -0,0 +1,9 @@
+apiVersion: kyverno.io/v1
+kind: ClusterPolicy
+metadata:
+  name: generate-cm-for-kube-state-metrics-crds
+status:
+  conditions:
+  - reason: Succeeded
+    status: "True"
+    type: Ready
\ No newline at end of file
diff --git a/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy.yaml b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy.yaml
new file mode 100644
index 0000000000..a4aa067717
--- /dev/null
+++ b/test/conformance/kuttl/generate/clusterpolicy/cornercases/pod-restart-on-cm-update/policy.yaml
@@ -0,0 +1,68 @@
+apiVersion: kyverno.io/v1
+kind: ClusterPolicy
+metadata:
+  name: generate-cm-for-kube-state-metrics-crds
+  annotations:
+    policies.kyverno.io/description: >-
+      This policy generates and synchronizes a configmap for custom resource kube-state-metrics.
+spec:
+  generateExisting: true
+  mutateExistingOnPolicyUpdate: false
+  schemaValidation: false
+  rules:
+    - name: generate-cm-for-kube-state-metrics-crds
+      match:
+        any:
+          - resources:
+              names:
+                - "*"
+              kinds:
+                - ConfigMap
+              namespaces:
+                - "kube-state-metrics"
+              selector:
+                matchLabels:
+                  kubestatemetrics.platform.example: source
+      generate:
+        synchronize: true
+        apiVersion: v1
+        kind: Secret
+        name: kube-state-metrics-crds
+        namespace: kube-state-metrics
+        data:
+          metadata:
+            labels:
+              generatedBy: kyverno
+              kubestatemetrics.platform.example: generated
+          data:
+            foo: YmFy
+    - name: restart-kube-state-metrics-on-sc-change
+      match:
+        any:
+          - resources:
+              kinds:
+                - Secret
+              names:
+                - "kube-state-metrics-crds"
+              namespaces:
+                - "kube-state-metrics"
+      preconditions:
+        all:
+          - key: "{{ request.object.metadata.labels.\"kubestatemetrics.platform.example\" || '' }}"
+            operator: NotEquals
+            value: source
+          - key: "{{request.operation || 'BACKGROUND'}}"
+            operator: Equals
+            value: UPDATE
+      mutate:
+        targets:
+          - apiVersion: apps/v1
+            kind: Deployment
+            name: kube-state-metrics
+            namespace: kube-state-metrics
+        patchStrategicMerge:
+          spec:
+            template:
+              metadata:
+                annotations:
+                  platform.cloud.allianz/triggerrestart: "{{request.object.metadata.resourceVersion}}"
\ No newline at end of file
diff --git a/test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/03-sleep.yaml b/test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/03-sleep.yaml
new file mode 100644
index 0000000000..5b8bfb4701
--- /dev/null
+++ b/test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/03-sleep.yaml
@@ -0,0 +1,4 @@
+apiVersion: kuttl.dev/v1beta1
+kind: TestStep
+commands:
+  - command: sleep 5
\ No newline at end of file
diff --git a/test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/03-resource.yaml b/test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/04-resource.yaml
similarity index 100%
rename from test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/03-resource.yaml
rename to test/conformance/kuttl/mutate/refactor/add-external-secret-prefix/04-resource.yaml