diff --git a/api/client/inspect/inspector.go b/api/client/inspect/inspector.go index 5de0e43283..b0537e8464 100644 --- a/api/client/inspect/inspector.go +++ b/api/client/inspect/inspector.go @@ -93,13 +93,35 @@ func (i *TemplateInspector) Inspect(typedElement interface{}, rawElement []byte) if rawElement == nil { return fmt.Errorf("Template parsing error: %v", err) } - return i.tryRawInspectFallback(rawElement, err) + return i.tryRawInspectFallback(rawElement) } i.buffer.Write(buffer.Bytes()) i.buffer.WriteByte('\n') return nil } +// tryRawInspectFallback executes the inspect template with a raw interface. +// This allows docker cli to parse inspect structs injected with Swarm fields. +func (i *TemplateInspector) tryRawInspectFallback(rawElement []byte) error { + var raw interface{} + buffer := new(bytes.Buffer) + rdr := bytes.NewReader(rawElement) + dec := json.NewDecoder(rdr) + + if rawErr := dec.Decode(&raw); rawErr != nil { + return fmt.Errorf("unable to read inspect data: %v", rawErr) + } + + tmplMissingKey := i.tmpl.Option("missingkey=error") + if rawErr := tmplMissingKey.Execute(buffer, raw); rawErr != nil { + return fmt.Errorf("Template parsing error: %v", rawErr) + } + + i.buffer.Write(buffer.Bytes()) + i.buffer.WriteByte('\n') + return nil +} + // Flush write the result of inspecting all elements into the output stream. func (i *TemplateInspector) Flush() error { if i.buffer.Len() == 0 { diff --git a/api/client/inspect/inspector_go14.go b/api/client/inspect/inspector_go14.go deleted file mode 100644 index 39a0510c21..0000000000 --- a/api/client/inspect/inspector_go14.go +++ /dev/null @@ -1,40 +0,0 @@ -// +build !go1.5 - -package inspect - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" -) - -// tryeRawInspectFallback executes the inspect template with a raw interface. -// This allows docker cli to parse inspect structs injected with Swarm fields. -// Unfortunately, go 1.4 doesn't fail executing invalid templates when the input is an interface. -// It doesn't allow to modify this behavior either, sending messages to the output. -// We assume that the template is invalid when there is a , if the template was valid -// we'd get or "" values. In that case we fail with the original error raised executing the -// template with the typed input. -func (i *TemplateInspector) tryRawInspectFallback(rawElement []byte, originalErr error) error { - var raw interface{} - buffer := new(bytes.Buffer) - rdr := bytes.NewReader(rawElement) - dec := json.NewDecoder(rdr) - - if rawErr := dec.Decode(&raw); rawErr != nil { - return fmt.Errorf("unable to read inspect data: %v", rawErr) - } - - if rawErr := i.tmpl.Execute(buffer, raw); rawErr != nil { - return fmt.Errorf("Template parsing error: %v", rawErr) - } - - if strings.Contains(buffer.String(), "") { - return fmt.Errorf("Template parsing error: %v", originalErr) - } - - i.buffer.Write(buffer.Bytes()) - i.buffer.WriteByte('\n') - return nil -} diff --git a/api/client/inspect/inspector_go15.go b/api/client/inspect/inspector_go15.go deleted file mode 100644 index b098f4156b..0000000000 --- a/api/client/inspect/inspector_go15.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build go1.5 - -package inspect - -import ( - "bytes" - "encoding/json" - "fmt" -) - -func (i *TemplateInspector) tryRawInspectFallback(rawElement []byte, _ error) error { - var raw interface{} - buffer := new(bytes.Buffer) - rdr := bytes.NewReader(rawElement) - dec := json.NewDecoder(rdr) - - if rawErr := dec.Decode(&raw); rawErr != nil { - return fmt.Errorf("unable to read inspect data: %v", rawErr) - } - - tmplMissingKey := i.tmpl.Option("missingkey=error") - if rawErr := tmplMissingKey.Execute(buffer, raw); rawErr != nil { - return fmt.Errorf("Template parsing error: %v", rawErr) - } - - i.buffer.Write(buffer.Bytes()) - i.buffer.WriteByte('\n') - return nil -}