mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 03:41:45 +00:00
Merge pull request #2504 from lavalamp/fix3
add test and more helpful error message
This commit is contained in:
commit
15fa958dce
@ -361,9 +361,10 @@ func (h *HumanReadablePrinter) PrintObj(obj runtime.Object, output io.Writer) er
|
||||
|
||||
// TemplatePrinter is an implementation of ResourcePrinter which formats data with a Go Template.
|
||||
type TemplatePrinter struct {
|
||||
template *template.Template
|
||||
version string
|
||||
convertor runtime.ObjectConvertor
|
||||
rawTemplate string
|
||||
template *template.Template
|
||||
version string
|
||||
convertor runtime.ObjectConvertor
|
||||
}
|
||||
|
||||
func NewTemplatePrinter(tmpl []byte, asVersion string, convertor runtime.ObjectConvertor) (*TemplatePrinter, error) {
|
||||
@ -371,7 +372,12 @@ func NewTemplatePrinter(tmpl []byte, asVersion string, convertor runtime.ObjectC
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &TemplatePrinter{t, asVersion, convertor}, nil
|
||||
return &TemplatePrinter{
|
||||
rawTemplate: string(tmpl),
|
||||
template: t,
|
||||
version: asVersion,
|
||||
convertor: convertor,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// PrintObj formats the obj with the Go Template.
|
||||
@ -388,7 +394,10 @@ func (p *TemplatePrinter) PrintObj(obj runtime.Object, w io.Writer) error {
|
||||
if err := json.Unmarshal(data, &out); err != nil {
|
||||
return err
|
||||
}
|
||||
return p.template.Execute(w, out)
|
||||
if err = p.template.Execute(w, out); err != nil {
|
||||
return fmt.Errorf("error executing template '%v': '%v'\n----data----\n%#v\n", p.rawTemplate, err, out)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func tabbedString(f func(io.Writer) error) (string, error) {
|
||||
|
@ -288,3 +288,45 @@ func TestTemplateEmitsVersionedObjects(t *testing.T) {
|
||||
t.Errorf("Expected %v, got %v", e, a)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPrinters(t *testing.T) {
|
||||
om := func(name string) api.ObjectMeta { return api.ObjectMeta{Name: name} }
|
||||
templatePrinter, err := NewTemplatePrinter([]byte("{{.name}}"), testapi.Version(), api.Scheme)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
templatePrinter2, err := NewTemplatePrinter([]byte("{{len .items}}"), testapi.Version(), api.Scheme)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
printers := map[string]ResourcePrinter{
|
||||
"humanReadable": NewHumanReadablePrinter(true),
|
||||
"humanReadableHeaders": NewHumanReadablePrinter(false),
|
||||
"json": &JSONPrinter{testapi.Version(), api.Scheme},
|
||||
"yaml": &YAMLPrinter{testapi.Version(), api.Scheme},
|
||||
"template": templatePrinter,
|
||||
"template2": templatePrinter2,
|
||||
}
|
||||
objects := map[string]runtime.Object{
|
||||
"pod": &api.Pod{ObjectMeta: om("pod")},
|
||||
"emptyPodList": &api.PodList{},
|
||||
"nonEmptyPodList": &api.PodList{Items: []api.Pod{{}}},
|
||||
}
|
||||
// map of printer name to set of objects it should fail on.
|
||||
expectedErrors := map[string]util.StringSet{
|
||||
"template2": util.NewStringSet("pod", "emptyPodList"),
|
||||
}
|
||||
|
||||
for pName, p := range printers {
|
||||
for oName, obj := range objects {
|
||||
b := &bytes.Buffer{}
|
||||
if err := p.PrintObj(obj, b); err != nil {
|
||||
if set, found := expectedErrors[pName]; found && set.Has(oName) {
|
||||
// expected error
|
||||
continue
|
||||
}
|
||||
t.Errorf("printer '%v', object '%v'; error: '%v'", pName, oName, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user