{{- if and .Values.singleBinary.persistence.enabled .Values.singleBinary.persistence.enableStatefulSetRecreationForSizeChange -}} {{- $newStatefulSet := include (print $.Template.BasePath "/single-binary/statefulset.yaml") . | fromYaml -}} {{- $currentStatefulset := dict -}} {{- if $newStatefulSet -}} {{- $currentStatefulset = lookup $newStatefulSet.apiVersion $newStatefulSet.kind $newStatefulSet.metadata.namespace $newStatefulSet.metadata.name -}} {{- $needsRecreation := false -}} {{- $templates := dict -}} {{- if $currentStatefulset -}} {{- if ne (len $newStatefulSet.spec.volumeClaimTemplates) (len $currentStatefulset.spec.volumeClaimTemplates) -}} {{- $needsRecreation = true -}} {{- end -}} {{- range $index, $newVolumeClaimTemplate := $newStatefulSet.spec.volumeClaimTemplates -}} {{- $currentVolumeClaimTemplateSpec := dict -}} {{- range $oldVolumeClaimTemplate := $currentStatefulset.spec.volumeClaimTemplates -}} {{- if eq $oldVolumeClaimTemplate.metadata.name $newVolumeClaimTemplate.metadata.name -}} {{- $currentVolumeClaimTemplateSpec = $oldVolumeClaimTemplate.spec -}} {{- end -}} {{- end -}} {{- $newVolumeClaimTemplateStorageSize := $newVolumeClaimTemplate.spec.resources.requests.storage -}} {{- if not $currentVolumeClaimTemplateSpec -}} {{- $needsRecreation = true -}} {{- else -}} {{- if ne $newVolumeClaimTemplateStorageSize $currentVolumeClaimTemplateSpec.resources.requests.storage -}} {{- $needsRecreation = true -}} {{- $templates = set $templates $newVolumeClaimTemplate.metadata.name $newVolumeClaimTemplateStorageSize -}} {{- end -}} {{- end -}} {{- end -}} {{- end -}} {{- if $needsRecreation -}} apiVersion: batch/v1 kind: Job metadata: name: {{ $newStatefulSet.metadata.name }}-recreate namespace: {{ $newStatefulSet.metadata.namespace }} labels: {{- include "loki.singleBinaryLabels" . | nindent 4 }} app.kubernetes.io/component: statefulset-recreate-job annotations: "helm.sh/hook": pre-upgrade "helm.sh/hook-weight": "-5" "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded spec: ttlSecondsAfterFinished: 300 template: metadata: labels: {{- include "loki.singleBinarySelectorLabels" . | nindent 8 }} app.kubernetes.io/component: statefulset-recreate-job spec: restartPolicy: Never serviceAccountName: {{ $newStatefulSet.metadata.name }}-recreate containers: - name: recreate-statefulset image: {{ include "loki.baseImage" (dict "service" (dict "registry" "docker.io" "repository" "rancher/kubectl" "tag" (.Capabilities.KubeVersion.Version | default "v1.33.0")) "global" .Values.global.image) }} command: - delete - statefulset - --namespace={{ $newStatefulSet.metadata.namespace }} - --cascade=orphan - {{ $newStatefulSet.metadata.name }} {{- range $index := until (int $currentStatefulset.spec.replicas) }} {{- range $template, $size := $templates }} - name: patch-pvc-{{ $template }}-{{ $index }} image: {{ include "loki.baseImage" (dict "service" (dict "registry" "docker.io" "repository" "rancher/kubectl" "tag" ($.Capabilities.KubeVersion.Version | default "v1.33.0")) "global" $.Values.global.image) }} command: - patch - pvc - --namespace={{ $newStatefulSet.metadata.namespace }} - {{ printf "%s-%s-%d" $template $newStatefulSet.metadata.name $index }} - --type='json' - '-p=[{"op": "replace", "path": "/spec/resources/requests/storage", "value": "{{ $size }}"}]' {{- end }} {{- end }} --- apiVersion: v1 kind: ServiceAccount metadata: name: {{ $newStatefulSet.metadata.name }}-recreate namespace: {{ $newStatefulSet.metadata.namespace }} labels: {{- include "loki.singleBinaryLabels" . | nindent 4 }} app.kubernetes.io/component: statefulset-recreate-job annotations: "helm.sh/hook": pre-upgrade "helm.sh/hook-weight": "-10" "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: {{ $newStatefulSet.metadata.name }}-recreate namespace: {{ $newStatefulSet.metadata.namespace }} labels: {{- include "loki.singleBinaryLabels" . | nindent 4 }} app.kubernetes.io/component: statefulset-recreate-job annotations: "helm.sh/hook": pre-upgrade "helm.sh/hook-weight": "-10" "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded rules: - apiGroups: - apps resources: - statefulsets resourceNames: - {{ $newStatefulSet.metadata.name }} verbs: - delete {{- if $templates }} - apiGroups: - v1 resources: - persistentvolumeclaims resourceNames: {{- range $index := until (int $currentStatefulset.spec.replicas) }} {{- range $template := $templates | keys }} - {{ printf "%s-%s-%d" $template $newStatefulSet.metadata.name $index }} {{- end }} {{- end }} verbs: - patch {{- end }} --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: {{ $newStatefulSet.metadata.name }}-recreate namespace: {{ $newStatefulSet.metadata.namespace }} labels: {{- include "loki.singleBinaryLabels" . | nindent 4 }} app.kubernetes.io/component: statefulset-recreate-job annotations: "helm.sh/hook": pre-upgrade "helm.sh/hook-weight": "-10" "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded subjects: - kind: ServiceAccount name: {{ $newStatefulSet.metadata.name }}-recreate namespace: {{ $newStatefulSet.metadata.namespace }} roleRef: kind: Role name: {{ $newStatefulSet.metadata.name }}-recreate apiGroup: rbac.authorization.k8s.io {{- end -}} {{- end -}} {{- end -}}