my-apps/charts/baikal/charts/common/templates/class/_horizontalPodAutoscaler.tpl
2025-08-24 00:09:37 +03:00

193 lines
7.6 KiB
Smarty

{{/*
This template serves as a blueprint for horizontal pod autoscaler objects that are created
using the common library.
*/}}
{{- define "tc.v1.common.class.hpa" -}}
{{- $rootCtx := .rootCtx -}}
{{- $objectData := .objectData }}
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ $objectData.name }}
namespace: {{ include "tc.v1.common.lib.metadata.namespace" (dict "rootCtx" $rootCtx "objectData" $objectData "caller" "VPA") }}
{{- $labels := (mustMerge ($objectData.labels | default dict) (include "tc.v1.common.lib.metadata.allLabels" $rootCtx | fromYaml)) -}}
{{- with (include "tc.v1.common.lib.metadata.render" (dict "rootCtx" $rootCtx "labels" $labels) | trim) }}
labels:
{{- . | nindent 4 }}
{{- end -}}
{{- $annotations := (mustMerge ($objectData.annotations | default dict) (include "tc.v1.common.lib.metadata.allAnnotations" $rootCtx | fromYaml)) -}}
{{- with (include "tc.v1.common.lib.metadata.render" (dict "rootCtx" $rootCtx "annotations" $annotations) | trim) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: {{ $objectData.workload.type }}
name: {{ $objectData.name }}
minReplicas: {{ $objectData.minReplicas }}
maxReplicas: {{ $objectData.maxReplicas }}
{{- if $objectData.metrics }}
metrics:
{{- include "tc.v1.common.class.hpa.metrics" (dict "objectData" $objectData "rootCtx" $rootCtx) | nindent 4 }}
{{- end -}}
{{- if $objectData.behavior }}
behavior:
{{- if $objectData.behavior.scaleUp }}
scaleUp:
{{- include "tc.v1.common.class.hpa.behavior" (dict "objectData" $objectData "rootCtx" $rootCtx "mode" "up") | nindent 4 }}
{{- end -}}
{{- if $objectData.behavior.scaleDown }}
scaleDown:
{{- include "tc.v1.common.class.hpa.behavior" (dict "objectData" $objectData "rootCtx" $rootCtx "mode" "down") | nindent 4 }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.class.hpa.behavior" -}}
{{- $objectData := .objectData -}}
{{- $rootCtx := .rootCtx -}}
{{- $mode := .mode -}}
{{- $key := ternary "scaleUp" "scaleDown" (eq $mode "up") -}}
{{- $behavior := get $objectData.behavior $key -}}
{{- $defaultStabilizationWindowSeconds := ternary 0 300 (eq $mode "up") }}
selectPolicy: {{ $behavior.selectPolicy | default "Max" }}
stabilizationWindowSeconds: {{ $behavior.stabilizationWindowSeconds | default $defaultStabilizationWindowSeconds }}
{{- if $behavior.policies }}
policies:
{{- range $idx, $policy := $behavior.policies }}
- type: {{ $policy.type }}
value: {{ $policy.value }}
periodSeconds: {{ $policy.periodSeconds }}
{{- end }}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.class.hpa.metrics" -}}
{{- $objectData := .objectData -}}
{{- $rootCtx := .rootCtx -}}
{{- range $idx, $metric := $objectData.metrics }}
{{- if eq $metric.type "Resource" }}
{{- include "tc.v1.common.class.hpa.metrics.resource" (dict "objectData" $objectData "rootCtx" $rootCtx "metric" $metric) | nindent 6 }}
{{- else if eq $metric.type "ContainerResource" }}
{{- include "tc.v1.common.class.hpa.metrics.containerResource" (dict "objectData" $objectData "rootCtx" $rootCtx "metric" $metric) | nindent 6 }}
{{- else if eq $metric.type "Pods" }}
{{- include "tc.v1.common.class.hpa.metrics.pods" (dict "objectData" $objectData "rootCtx" $rootCtx "metric" $metric) | nindent 6 }}
{{- else if eq $metric.type "Object" }}
{{- include "tc.v1.common.class.hpa.metrics.object" (dict "objectData" $objectData "rootCtx" $rootCtx "metric" $metric) | nindent 6 }}
{{- else if eq $metric.type "External" }}
{{- include "tc.v1.common.class.hpa.metrics.external" (dict "objectData" $objectData "rootCtx" $rootCtx "metric" $metric) | nindent 6 }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.class.hpa.metrics.resource" -}}
{{- $objectData := .objectData -}}
{{- $rootCtx := .rootCtx }}
- type: Resource
resource:
name: {{ .metric.resource.name }}
target:
type: {{ .metric.resource.target.type }}
{{- if eq .metric.resource.target.type "AverageValue" }}
averageValue: {{ .metric.resource.target.averageValue | quote }}
{{- else if eq .metric.resource.target.type "Utilization" }}
averageUtilization: {{ .metric.resource.target.averageUtilization }}
{{- end -}}
{{- with .metric.resource.target.value }}
value: {{ . | quote }}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.class.hpa.metrics.containerResource" -}}
{{- $objectData := .objectData -}}
{{- $rootCtx := .rootCtx }}
- type: ContainerResource
containerResource:
name: {{ .metric.containerResource.name }}
container: {{ .metric.containerResource.container}}
target:
type: {{ .metric.containerResource.target.type }}
{{- if eq .metric.containerResource.target.type "AverageValue" }}
averageValue: {{ .metric.containerResource.target.averageValue | quote }}
{{- else if eq .metric.containerResource.target.type "Utilization" }}
averageUtilization: {{ .metric.containerResource.target.averageUtilization }}
{{- end -}}
{{- with .metric.containerResource.target.value }}
value: {{ . | quote }}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.class.hpa.metrics.pods" -}}
{{- $objectData := .objectData -}}
{{- $rootCtx := .rootCtx }}
- type: Pods
pods:
target:
type: AverageValue
averageValue: {{ .metric.pods.target.averageValue | quote }}
metric:
name: {{ .metric.pods.metric.name }}
{{- if .metric.pods.metric.selector }}
selector:
matchLabels:
{{- range $key, $value := .metric.pods.metric.selector.matchLabels }}
{{ $key }}: {{ $value | quote }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.class.hpa.metrics.object" -}}
{{- $objectData := .objectData -}}
{{- $rootCtx := .rootCtx }}
- type: Object
object:
target:
type: {{ .metric.object.target.type }}
{{- if eq .metric.object.target.type "Value" }}
value: {{ .metric.object.target.value | quote }}
{{- else if eq .metric.object.target.type "AverageValue" }}
averageValue: {{ .metric.object.target.averageValue | quote }}
{{- end }}
describedObject:
apiVersion: {{ .metric.object.describedObject.apiVersion }}
kind: {{ .metric.object.describedObject.kind }}
name: {{ .metric.object.describedObject.name }}
metric:
name: {{ .metric.object.metric.name }}
{{- if .metric.object.metric.selector }}
selector:
matchLabels:
{{- range $key, $value := .metric.object.metric.selector.matchLabels }}
{{ $key }}: {{ $value | quote }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.class.hpa.metrics.external" -}}
{{- $objectData := .objectData -}}
{{- $rootCtx := .rootCtx }}
- type: External
external:
metric:
name: {{ .metric.external.metric.name }}
{{- if .metric.external.metric.selector }}
selector:
matchLabels:
{{- range $key, $value := .metric.external.metric.selector.matchLabels }}
{{ $key }}: {{ $value | quote }}
{{- end -}}
{{- end }}
target:
type: {{ .metric.external.target.type }}
{{- if eq .metric.external.target.type "Value" }}
value: {{ .metric.external.target.value | quote }}
{{- else if eq .metric.external.target.type "AverageValue" }}
averageValue: {{ .metric.external.target.averageValue | quote }}
{{- end -}}
{{- end -}}