in pkg/options/gotmpl/go_template_applier.go [102:161]
func (m *applier) applyOptions(obj *unstructured.Unstructured, ref bundle.ComponentReference, opts options.JSONOptions) ([]*unstructured.Unstructured, error) {
objTmpl := &bundle.ObjectTemplate{}
err := converter.FromUnstructured(obj).ToObject(objTmpl)
if err != nil {
return nil, err
}
if objTmpl.OptionsSchema != nil {
opts, err = openapi.ApplyDefaults(opts, objTmpl.OptionsSchema)
if err != nil {
return nil, fmt.Errorf("applying schema defaults for object template named %q: %v", obj.GetName(), err)
}
}
tmplFuncs := make(map[string]interface{})
useSafeYAMLTemplater := m.useSafeYAMLTemplater
if internal.HasSafeYAMLAnnotation(objTmpl.ObjectMeta) {
useSafeYAMLTemplater = true
}
tmpl, err := internal.NewTemplater(ref.ComponentName+"-"+obj.GetName(), objTmpl.Template, tmplFuncs, useSafeYAMLTemplater)
if err != nil {
return nil, fmt.Errorf("error parsing template for object %q: %v", obj.GetName(), err)
}
for _, goTmplOpt := range m.goTmplOptions {
tmpl.Option(goTmplOpt)
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, opts)
if err != nil {
return nil, fmt.Errorf("error executing template for object %v: %v", obj.GetName(), err)
}
// performed by go-yaml: https://godoc.org/gopkg.in/yaml.v2
var out []*unstructured.Unstructured
yamlStr := buf.String()
if multiDoc.MatchString(yamlStr) {
docs := multiDoc.Split(string(yamlStr), -1)
for _, doc := range docs {
if onlyWhitespace.MatchString(doc) {
continue
}
uns, err := converter.FromYAMLString(doc).ToUnstructured()
if err != nil {
return nil, err
}
out = append(out, uns)
}
} else {
uns, err := converter.FromYAMLString(yamlStr).ToUnstructured()
if err != nil {
return nil, err
}
out = append(out, uns)
}
return out, err
}