Helm 模板.. 值匹配
Helm templating.. values match
想知道是否可以使用值中存在的端口,否则使用 http.. 类似这样的东西;
svc:
app:
ports:
- port: 8080
name: http
- port: 8090
name: metrics
app2:
ports:
- port: 8080
name: http
有些服务通过 http 公开它们的指标,有些服务有指标端口。所以我想将其模板化为类似的东西;
{{ define "app.service.ports" }}
{{ range (index .Values.svc (include "app.refName" .) "ports") }}
- name: {{ .name }}
{{ end }}
{{ end }}
这会正确提取每个端口名称,但我想提取指标(如果存在),否则提取 http.. 有人可以指出正确的方向吗?
Go text/template
语言和 Helm 扩展都无法在像这样的复杂结构中进行通用查找。相反,您需要手动遍历列表并使用变量来记住您所看到的内容。
{{- $ports := index .Values "svc" (include "app.refName" .) "ports" -}}
{{-/* Set up variables to remember what we've seen. Initialize them
to an empty dictionary, which is false in a conditional. -*/}}
{{- $httpPort := dict -}}
{{- $metricsPort := dict -}}
{{-/* Scan the list of ports. */-}}
{{- range $port := range $ports -}}
{{- if eq $port.name "metrics" -}}
{{- $metricsPort = $port -}}
{{- else if eq $port.name "http" -}}
{{- $httpPort = $port -}}
{{- end -}}
{{- end -}}
{{-/* Emit the metrics port if it exists, else the HTTP port. */-}}
{{- coalesce $metricsPort $httpPort | toYaml -}}
在 higher-level 语言中,您可以想象搜索一个列表,并且对于每个字典元素,如果它具有 name
键值 metrics
,则接受它。这通常涉及将 lambda 或匿名函数传递给 find()
函数,而 text/template
语言不支持该功能。
想知道是否可以使用值中存在的端口,否则使用 http.. 类似这样的东西;
svc:
app:
ports:
- port: 8080
name: http
- port: 8090
name: metrics
app2:
ports:
- port: 8080
name: http
有些服务通过 http 公开它们的指标,有些服务有指标端口。所以我想将其模板化为类似的东西;
{{ define "app.service.ports" }}
{{ range (index .Values.svc (include "app.refName" .) "ports") }}
- name: {{ .name }}
{{ end }}
{{ end }}
这会正确提取每个端口名称,但我想提取指标(如果存在),否则提取 http.. 有人可以指出正确的方向吗?
Go text/template
语言和 Helm 扩展都无法在像这样的复杂结构中进行通用查找。相反,您需要手动遍历列表并使用变量来记住您所看到的内容。
{{- $ports := index .Values "svc" (include "app.refName" .) "ports" -}}
{{-/* Set up variables to remember what we've seen. Initialize them
to an empty dictionary, which is false in a conditional. -*/}}
{{- $httpPort := dict -}}
{{- $metricsPort := dict -}}
{{-/* Scan the list of ports. */-}}
{{- range $port := range $ports -}}
{{- if eq $port.name "metrics" -}}
{{- $metricsPort = $port -}}
{{- else if eq $port.name "http" -}}
{{- $httpPort = $port -}}
{{- end -}}
{{- end -}}
{{-/* Emit the metrics port if it exists, else the HTTP port. */-}}
{{- coalesce $metricsPort $httpPort | toYaml -}}
在 higher-level 语言中,您可以想象搜索一个列表,并且对于每个字典元素,如果它具有 name
键值 metrics
,则接受它。这通常涉及将 lambda 或匿名函数传递给 find()
函数,而 text/template
语言不支持该功能。