在使用text/template包对YAML执行时,确保类型为列表



我正在使用text/template包动态构建我的k8s清单,我几乎成功地为它创建了所需的输出。

由于目标类型是YAML,我希望确保生成的.ownerReferences.secrets类型是作为YAML中的列表类型创建的,即每个条目上都有一个前导-

我期望实现的输出是

---
apiVersion: v1
kind: ServiceAccount
metadata:
name: Foobar
labels:
app: Foobar
ownerReferences:
- uid: 123456789
kind: FoobarOrchestrator
secrets:
- name: thisisasecret1
- name: thisisasecret2

但我的尝试低于

package main
import (
"os"
"text/template"
)
const serviceAccountTemplate = `---
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{.Name}}
{{- if .Labels}}
labels:
{{- end }}
{{- range $key, $value := .Labels }}
{{ $key }}: {{ $value }}
{{- end }}
{{- if .OwnerRef}}
ownerReferences:
{{- end }}
{{- range .OwnerRef }}
uid: {{ .UID }}
kind: {{ .Kind }}
{{- end }}
{{- if .Secrets}}
secrets:
{{- end }}
{{- range $value := .Secrets }}
name: {{ $value }}
{{- end }}
`
func main() {
type OwnerRef struct {
UID  string
Kind string
}
data := struct {
Name     string
Secrets  []string
Labels   map[string]string
OwnerRef []OwnerRef
}{
"dude",
[]string{"thisisasecret1", "thisisasecret2"},
map[string]string{"app": "Foobar"},
[]OwnerRef{OwnerRef{UID: "123456789", Kind: "Foobar"}},
}
t := template.New("t")
t, err := t.Parse(serviceAccountTemplate)
if err != nil {
panic(err)
}
err = t.Execute(os.Stdout, data)
if err != nil {
panic(err)
}
}

我能够生产低于的产品

---
apiVersion: v1
kind: ServiceAccount
metadata:
name: dude
labels:
app: Foobar
ownerReferences:
uid: 123456789
kind: Foobar
secrets:
name: thisisasecret1
name: thisisasecret2

但我想确定的是,如果类型是准确的,可以被合适的YAML解码器接受。

如果能对我现有的模板定义进行任何改进,我也将不胜感激。

游乐场链接-https://go.dev/play/p/EbxcvGcYr9r

要使示例模板输出所需节点的YAML序列,您可以简单地在子节点前面准备-。例如

const serviceAccountTemplate = `
...
{{- if .OwnerRef}}
ownerReferences:
{{- end }}
{{- range .OwnerRef }}
- uid: {{ .UID }}
kind: {{ .Kind }}
{{- end }}
{{- if .Secrets}}
secrets:
{{- end }}
{{- range $value := .Secrets }}
- name: {{ $value }}
{{- end }}
`

https://go.dev/play/p/R86Feu5VZOK


但是text/template中不支持检查正确的YAML语法。如果您需要保证生成的文本是有效的YAML,那么您必须为此编写测试。

但是,就像你想在Go中生成JSON一样,你通常会使用structs和encoding/json,所以对于YAML,你也可以使用struct斯和gopkg.in/yaml.v3来生成一致有效的YAML。

最新更新