@@ -298,3 +298,127 @@ Cluster name that shows up in dashboard metrics
298
298
{ {- define " tempo.clusterName" -} }
299
299
{ { (include " tempo.calculatedConfig" . | fromYaml).cluster_name | default .Release.Name } }
300
300
{ {- end -} }
301
+
302
+ { {- define " tempo.statefulset.recreateOnSizeChangeHook" -} }
303
+ { {- $renderedStatefulSets := list -} }
304
+ { {- range $renderedStatefulSet := include (print .context.Template.BasePath .pathToStatefulsetTemplate) .context | splitList " ---" -} }
305
+ { {- with $renderedStatefulSet | fromYaml -} }
306
+ { {- $renderedStatefulSets = append $renderedStatefulSets . -} }
307
+ { {- end } }
308
+ { {- end -} }
309
+ { {- if $renderedStatefulSets } }
310
+ { {- range $newStatefulSet := $renderedStatefulSets -} }
311
+ { {- if $newStatefulSet .spec.volumeClaimTemplates } }
312
+ { {- $currentStatefulset := lookup $newStatefulSet .apiVersion $newStatefulSet .kind $newStatefulSet .metadata.namespace $newStatefulSet .metadata.name -} }
313
+ { {- $needsRecreation := false -} }
314
+ { {- if $currentStatefulset -} }
315
+ { {- if ne (len $newStatefulSet .spec.volumeClaimTemplates) (len $currentStatefulset .spec.volumeClaimTemplates) -} }
316
+ { {- $needsRecreation = true -} }
317
+ { {- else -} }
318
+ { {- range $index , $newVolumeClaimTemplate := $newStatefulSet .spec.volumeClaimTemplates -} }
319
+ { {- $currentVolumeClaimTemplateSpec := dict -} }
320
+ { {- range $oldVolumeClaimTemplate := $currentStatefulset .spec.volumeClaimTemplates -} }
321
+ { {- if eq $oldVolumeClaimTemplate .metadata.name $newVolumeClaimTemplate .metadata.name -} }
322
+ { {- $currentVolumeClaimTemplateSpec = $oldVolumeClaimTemplate .spec -} }
323
+ { {- end -} }
324
+ { {- end } }
325
+ { {- if or (not $currentVolumeClaimTemplateSpec ) (ne $newVolumeClaimTemplate .spec.resources.requests.storage $currentVolumeClaimTemplateSpec .resources.requests.storage) -} }
326
+ { {- $needsRecreation = true -} }
327
+ { {- end -} }
328
+ { {- end -} }
329
+ { {- end -} }
330
+ { {- end -} }
331
+ { {- if $needsRecreation } }
332
+ apiVersion: batch/v1
333
+ kind: Job
334
+ metadata:
335
+ name: { { $newStatefulSet .metadata.name } }-recreate
336
+ namespace: { { $newStatefulSet .metadata.namespace } }
337
+ labels:
338
+ { {- $newStatefulSet .metadata.labels | toYaml | nindent 4 } }
339
+ app.kubernetes.io/component: statefulset-recreate-job
340
+ annotations:
341
+ "helm.sh/hook": pre-upgrade
342
+ "helm.sh/hook-weight": "-5"
343
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
344
+ spec:
345
+ ttlSecondsAfterFinished: 300
346
+ template:
347
+ metadata:
348
+ name: { { $newStatefulSet .metadata.name } }-recreate
349
+ labels:
350
+ { {- $newStatefulSet .metadata.labels | toYaml | nindent 8 } }
351
+ spec:
352
+ serviceAccountName: { { $newStatefulSet .metadata.name } }-recreate
353
+ restartPolicy: OnFailure
354
+ containers:
355
+ - name: recreate
356
+ image: { { printf " %s/rancher/kubectl:%s" (coalesce $.context.Values.global.image.registry " docker.io" ) $.context.Capabilities.KubeVersion.Version } }
357
+ command:
358
+ - kubectl
359
+ - delete
360
+ - statefulset
361
+ - { { $newStatefulSet .metadata.name } }
362
+ - --cascade=orphan
363
+ ---
364
+ apiVersion: v1
365
+ kind: ServiceAccount
366
+ metadata:
367
+ name: { { $newStatefulSet .metadata.name } }-recreate
368
+ namespace: { { $newStatefulSet .metadata.namespace } }
369
+ labels:
370
+ { {- $newStatefulSet .metadata.labels | toYaml | nindent 4 } }
371
+ app.kubernetes.io/component: statefulset-recreate-job
372
+ annotations:
373
+ "helm.sh/hook": pre-upgrade
374
+ "helm.sh/hook-weight": "-10"
375
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
376
+ ---
377
+ apiVersion: rbac.authorization.k8s.io/v1
378
+ kind: Role
379
+ metadata:
380
+ name: { { $newStatefulSet .metadata.name } }-recreate
381
+ namespace: { { $newStatefulSet .metadata.namespace } }
382
+ labels:
383
+ { {- $newStatefulSet .metadata.labels | toYaml | nindent 4 } }
384
+ app.kubernetes.io/component: statefulset-recreate-job
385
+ annotations:
386
+ "helm.sh/hook": pre-upgrade
387
+ "helm.sh/hook-weight": "-10"
388
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
389
+ rules:
390
+ - apiGroups:
391
+ - apps
392
+ resources:
393
+ - statefulsets
394
+ resourceNames:
395
+ - { { $newStatefulSet .metadata.name } }
396
+ verbs:
397
+ - delete
398
+ ---
399
+ apiVersion: rbac.authorization.k8s.io/v1
400
+ kind: RoleBinding
401
+ metadata:
402
+ name: { { $newStatefulSet .metadata.name } }-recreate
403
+ namespace: { { $newStatefulSet .metadata.namespace } }
404
+ labels:
405
+ { {- $newStatefulSet .metadata.labels | toYaml | nindent 4 } }
406
+ app.kubernetes.io/component: statefulset-recreate-job
407
+ annotations:
408
+ "helm.sh/hook": pre-upgrade
409
+ "helm.sh/hook-weight": "-10"
410
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
411
+ subjects:
412
+ - kind: ServiceAccount
413
+ name: { { $newStatefulSet .metadata.name } }-recreate
414
+ namespace: { { $newStatefulSet .metadata.namespace } }
415
+ roleRef:
416
+ kind: Role
417
+ name: { { $newStatefulSet .metadata.name } }-recreate
418
+ apiGroup: rbac.authorization.k8s.io
419
+ ---
420
+ { {- end } }
421
+ { { end } }
422
+ { { end } }
423
+ { { end } }
424
+ { {- end -} }
0 commit comments