2025-08-24 00:09:37 +03:00

162 lines
5.1 KiB
Smarty

{{/* Returns pod affinity */}}
{{/* Call this template:
{{ include "tc.v1.common.lib.pod.affinity" (dict "rootCtx" $ "objectData" $objectData) }}
rootCtx: The root context of the chart.
objectData: The object data to be used to render the Pod.
*/}}
{{- define "tc.v1.common.lib.pod.affinity" -}}
{{- $rootCtx := .rootCtx -}}
{{- $objectData := .objectData -}}
{{- $affinity := dict -}}
{{/* Initialize from the "global" option */}}
{{- with $rootCtx.Values.podOptions.affinity -}}
{{- $affinity = . -}}
{{- end -}}
{{/* Override with pods option */}}
{{- with $objectData.podSpec.affinity -}}
{{- $affinity = . -}}
{{- end -}}
{{/* If default affinity is enabled and its one of this types, then merge it with user input */}}
{{- $validTypes := (list "Deployment" "StatefulSet") -}}
{{- if and (mustHas $objectData.type $validTypes) $rootCtx.Values.podOptions.defaultAffinity }}
{{- $defaultAffinity := (include "tc.v1.common.lib.pod.defaultAffinity" (dict "rootCtx" $rootCtx "objectData" $objectData) | fromYaml) -}}
{{- $defaultAffinity = $defaultAffinity | default dict -}}
{{/* Merge user input overwriting the default */}}
{{- $affinity = mustMergeOverwrite $defaultAffinity $affinity -}}
{{- end -}}
{{- include "tc.v1.common.lib.pod.affinity.validation" (dict "rootCtx" $rootCtx "objectData" $affinity) -}}
{{- if $affinity.nodeAffinity }}
nodeAffinity:
{{- fail "TODO: not implemented" -}}
{{- end -}}
{{- if $affinity.podAffinity }}
podAffinity:
{{- include "tc.v1.common.lib.pod.podAffinityOrPodAntiAffinity" (dict "rootCtx" $rootCtx "data" $affinity.podAffinity) | nindent 2 -}}
{{- end -}}
{{- if $affinity.podAntiAffinity }}
podAntiAffinity:
{{- include "tc.v1.common.lib.pod.podAffinityOrPodAntiAffinity" (dict "rootCtx" $rootCtx "data" $affinity.podAntiAffinity) | nindent 2 -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.lib.pod.podAffinityOrPodAntiAffinity" -}}
{{- $rootCtx := .rootCtx -}}
{{- $data := .data -}}
{{- if $data -}}
{{- if $data.requiredDuringSchedulingIgnoredDuringExecution }}
requiredDuringSchedulingIgnoredDuringExecution:
{{- range $term := $data.requiredDuringSchedulingIgnoredDuringExecution }}
- {{ include "tc.v1.common.lib.pod.podAffinityTerm" (dict "rootCtx" $rootCtx "data" $term) | trim | nindent 6 }}
{{- end -}}
{{- end -}}
{{- if $data.preferredDuringSchedulingIgnoredDuringExecution }}
preferredDuringSchedulingIgnoredDuringExecution:
{{- range $term := $data.preferredDuringSchedulingIgnoredDuringExecution }}
- weight: {{ $term.weight }}
podAffinityTerm:
{{- include "tc.v1.common.lib.pod.podAffinityTerm" (dict "rootCtx" $rootCtx "data" $term.podAffinityTerm) | nindent 10 }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.lib.pod.podAffinityTerm" -}}
{{- $rootCtx := .rootCtx -}}
{{- $data := .data -}}
{{- if $data }}
topologyKey: {{ $data.topologyKey }}
{{- if $data.matchLabelKeys }}
matchLabelKeys:
{{- range $data.matchLabelKeys }}
- {{ . }}
{{- end -}}
{{- end -}}
{{- if $data.mismatchLabelKeys }}
mismatchLabelKeys:
{{- range $data.mismatchLabelKeys }}
- {{ . }}
{{- end -}}
{{- end -}}
{{- if $data.namespaces }}
namespaces:
{{- range $data.namespaces }}
- {{ . }}
{{- end -}}
{{- end -}}
{{- if $data.labelSelector }}
labelSelector:
{{- include "tc.v1.common.lib.pod.labelSelector" (dict "rootCtx" $rootCtx "data" $data.labelSelector) | nindent 2 -}}
{{- end -}}
{{- if $data.namespaceSelector }}
namespaceSelector:
{{- include "tc.v1.common.lib.pod.labelSelector" (dict "rootCtx" $rootCtx "data" $data.namespaceSelector) | nindent 2 -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.lib.pod.labelSelector" -}}
{{- $rootCtx := .rootCtx -}}
{{- $data := .data }}
{{- if $data.matchExpressions -}}
matchExpressions:
{{- range $expression := $data.matchExpressions }}
- key: {{ $expression.key }}
operator: {{ $expression.operator }}
{{- if mustHas $expression.operator (list "In" "NotIn") }}
values:
{{- range $expression.values }}
- {{ . }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- if $data.matchLabels -}}
matchLabels:
{{- range $key, $value := $data.matchLabels }}
{{ $key }}: {{ $value }}
{{- end -}}
{{- end -}}
{{- end -}}
{{- define "tc.v1.common.lib.pod.defaultAffinity" -}}
{{- $rootCtx := .rootCtx -}}
{{- $objectData := .objectData -}}
{{- $selectedVolumes := (include "tc.v1.common.lib.pod.volumes.selected" (dict "rootCtx" $rootCtx "objectData" $objectData)) | fromJson }}
{{- $names := list -}}
{{- range $volume := $selectedVolumes.pvc -}}
{{- $names = mustAppend $names $volume.shortName -}}
{{- end }}
{{- if $names }}
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: truecharts.org/pvc
operator: In
values:
- {{ $names | join "_" }}
{{- end -}}
{{- end -}}