162 lines
5.1 KiB
Smarty
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 -}}
|