Browse code

Fix failure in `docker ps --format` when `.Label` has args

This fix tries to fix the issue in 30279 where `docker ps --format`
fails if `.Label` has args. For example:
```
docker ps --format '{{.ID}}\t{{.Names}}\t{{.Label "some.label"}}'
```

The reason for the failure is that during the preprocessing phase
to detect the existance of `.Size`, the `listOptionsProcessor`
does not has a method of `Label(name string) string`.

This results in the failure of
```
template: :1:24: executing "" at <.Label>: Label is not a method but has arguments
```

This fix fixes the issue by adding needed method of `Label(name string) string`.

This fix fixes 30279.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

Yong Tang authored on 2017/01/20 03:17:56
Showing 2 changed files
... ...
@@ -73,6 +73,12 @@ func (o listOptionsProcessor) Size() bool {
73 73
 	return true
74 74
 }
75 75
 
76
+// Label is needed here as it allows the correct pre-processing
77
+// because Label() is a method with arguments
78
+func (o listOptionsProcessor) Label(name string) string {
79
+	return ""
80
+}
81
+
76 82
 func buildContainerListOptions(opts *psOptions) (*types.ContainerListOptions, error) {
77 83
 	options := &types.ContainerListOptions{
78 84
 		All:     opts.all,
... ...
@@ -917,3 +917,10 @@ func (s *DockerSuite) TestPsFilterMissingArgErrorCode(c *check.C) {
917 917
 	_, errCode, _ := dockerCmdWithError("ps", "--filter")
918 918
 	c.Assert(errCode, checker.Equals, 125)
919 919
 }
920
+
921
+// Test case for 30291
922
+func (s *DockerSuite) TestPsFormatTemplateWithArg(c *check.C) {
923
+	runSleepingContainer(c, "-d", "--name", "top", "--label", "some.label=label.foo-bar")
924
+	out, _ := dockerCmd(c, "ps", "--format", `{{.Names}} {{.Label "some.label"}}`)
925
+	c.Assert(strings.TrimSpace(out), checker.Equals, "top label.foo-bar")
926
+}