diff --git a/internal/manifests/mutate.go b/internal/manifests/mutate.go index cea218760e..fb9399346c 100644 --- a/internal/manifests/mutate.go +++ b/internal/manifests/mutate.go @@ -344,7 +344,12 @@ func mutateStatefulSet(existing, desired *appsv1.StatefulSet) error { existing.Spec.RevisionHistoryLimit = desired.Spec.RevisionHistoryLimit existing.Spec.ServiceName = desired.Spec.ServiceName existing.Spec.UpdateStrategy = desired.Spec.UpdateStrategy - existing.Spec.VolumeClaimTemplates = desired.Spec.VolumeClaimTemplates + + for i := range existing.Spec.VolumeClaimTemplates { + existing.Spec.VolumeClaimTemplates[i].TypeMeta = desired.Spec.VolumeClaimTemplates[i].TypeMeta + existing.Spec.VolumeClaimTemplates[i].ObjectMeta = desired.Spec.VolumeClaimTemplates[i].ObjectMeta + existing.Spec.VolumeClaimTemplates[i].Spec = desired.Spec.VolumeClaimTemplates[i].Spec + } if err := mutatePodTemplate(&existing.Spec.Template, &desired.Spec.Template); err != nil { return err @@ -409,6 +414,9 @@ func hasVolumeClaimsTemplatesChanged(existing, desired *appsv1.StatefulSet) bool if !apiequality.Semantic.DeepEqual(desired.Spec.VolumeClaimTemplates[i].Annotations, existing.Spec.VolumeClaimTemplates[i].Annotations) { return true } + if !apiequality.Semantic.DeepEqual(desired.Spec.VolumeClaimTemplates[i].Labels, existing.Spec.VolumeClaimTemplates[i].Labels) { + return true + } if !apiequality.Semantic.DeepEqual(desired.Spec.VolumeClaimTemplates[i].Spec, existing.Spec.VolumeClaimTemplates[i].Spec) { return true } diff --git a/tests/e2e/volume-claim-label/00-assert.yaml b/tests/e2e/volume-claim-label/00-assert.yaml new file mode 100644 index 0000000000..548af25f4f --- /dev/null +++ b/tests/e2e/volume-claim-label/00-assert.yaml @@ -0,0 +1,43 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stateful-collector +spec: + podManagementPolicy: Parallel + template: + spec: + containers: + - args: + - --config=/conf/collector.yaml + name: otc-container + volumeMounts: + - mountPath: /conf + name: otc-internal + - mountPath: /usr/share/testvolume + name: testvolume + volumes: + - configMap: + items: + - key: collector.yaml + path: collector.yaml + name: stateful-collector-4b08af22 + name: otc-internal + - emptyDir: {} + name: testvolume + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: testvolume + labels: + test: "true" + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + volumeMode: Filesystem +status: + replicas: 3 + readyReplicas: 3 diff --git a/tests/e2e/volume-claim-label/00-install.yaml b/tests/e2e/volume-claim-label/00-install.yaml new file mode 100644 index 0000000000..07f49c18c4 --- /dev/null +++ b/tests/e2e/volume-claim-label/00-install.yaml @@ -0,0 +1,35 @@ +apiVersion: opentelemetry.io/v1alpha1 +kind: OpenTelemetryCollector +metadata: + name: stateful +spec: + mode: statefulset + replicas: 3 + volumes: + - name: testvolume + volumeMounts: + - name: testvolume + mountPath: /usr/share/testvolume + volumeClaimTemplates: + - metadata: + name: testvolume + labels: + test: "true" + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi + config: | + receivers: + jaeger: + protocols: + grpc: + processors: + exporters: + debug: + service: + pipelines: + traces: + receivers: [jaeger] + exporters: [debug] diff --git a/tests/e2e/volume-claim-label/01-assert.yaml b/tests/e2e/volume-claim-label/01-assert.yaml new file mode 100644 index 0000000000..b08be4d90d --- /dev/null +++ b/tests/e2e/volume-claim-label/01-assert.yaml @@ -0,0 +1,43 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: stateful-collector +spec: + podManagementPolicy: Parallel + template: + spec: + containers: + - args: + - --config=/conf/collector.yaml + name: otc-container + volumeMounts: + - mountPath: /conf + name: otc-internal + - mountPath: /usr/share/testvolume + name: testvolume + volumes: + - configMap: + items: + - key: collector.yaml + path: collector.yaml + name: stateful-collector-4b08af22 + name: otc-internal + - emptyDir: {} + name: testvolume + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: testvolume + labels: + test: "updated" + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + volumeMode: Filesystem +status: + replicas: 3 + readyReplicas: 3 diff --git a/tests/e2e/volume-claim-label/01-update-volume-claim-template-labels.yaml b/tests/e2e/volume-claim-label/01-update-volume-claim-template-labels.yaml new file mode 100644 index 0000000000..5b1b68ea33 --- /dev/null +++ b/tests/e2e/volume-claim-label/01-update-volume-claim-template-labels.yaml @@ -0,0 +1,35 @@ +apiVersion: opentelemetry.io/v1alpha1 +kind: OpenTelemetryCollector +metadata: + name: stateful +spec: + mode: statefulset + replicas: 3 + volumes: + - name: testvolume + volumeMounts: + - name: testvolume + mountPath: /usr/share/testvolume + volumeClaimTemplates: + - metadata: + name: testvolume + labels: + test: "updated" + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi + config: | + receivers: + jaeger: + protocols: + grpc: + processors: + exporters: + debug: + service: + pipelines: + traces: + receivers: [jaeger] + exporters: [debug] diff --git a/tests/e2e/volume-claim-label/chainsaw-test.yaml b/tests/e2e/volume-claim-label/chainsaw-test.yaml new file mode 100755 index 0000000000..e079f6a8ae --- /dev/null +++ b/tests/e2e/volume-claim-label/chainsaw-test.yaml @@ -0,0 +1,20 @@ +# 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: + creationTimestamp: null + name: persistent-volume-claim-label +spec: + steps: + - name: step-00 + try: + - apply: + file: 00-install.yaml + - assert: + file: 00-assert.yaml + - name: step-01 + try: + - apply: + file: 01-update-volume-claim-template-labels.yaml + - assert: + file: 01-assert.yaml