From 4f39eed3bde403bc26520221e610f2f863b4b151 Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Thu, 19 Jan 2017 10:17:56 -0800 Subject: [PATCH] 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 Upstream-commit: 2cd4ba1e56222a938b2edaa7ad7981c9a2bc248f Component: engine --- components/engine/cli/command/container/list.go | 6 ++++++ components/engine/integration-cli/docker_cli_ps_test.go | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/components/engine/cli/command/container/list.go b/components/engine/cli/command/container/list.go index 451c531a8b..e0f4fdf21f 100644 --- a/components/engine/cli/command/container/list.go +++ b/components/engine/cli/command/container/list.go @@ -73,6 +73,12 @@ func (o listOptionsProcessor) Size() bool { return true } +// Label is needed here as it allows the correct pre-processing +// because Label() is a method with arguments +func (o listOptionsProcessor) Label(name string) string { + return "" +} + func buildContainerListOptions(opts *psOptions) (*types.ContainerListOptions, error) { options := &types.ContainerListOptions{ All: opts.all, diff --git a/components/engine/integration-cli/docker_cli_ps_test.go b/components/engine/integration-cli/docker_cli_ps_test.go index 16f0c22765..c0e4034638 100644 --- a/components/engine/integration-cli/docker_cli_ps_test.go +++ b/components/engine/integration-cli/docker_cli_ps_test.go @@ -917,3 +917,10 @@ func (s *DockerSuite) TestPsFilterMissingArgErrorCode(c *check.C) { _, errCode, _ := dockerCmdWithError("ps", "--filter") c.Assert(errCode, checker.Equals, 125) } + +// Test case for 30291 +func (s *DockerSuite) TestPsFormatTemplateWithArg(c *check.C) { + runSleepingContainer(c, "-d", "--name", "top", "--label", "some.label=label.foo-bar") + out, _ := dockerCmd(c, "ps", "--format", `{{.Names}} {{.Label "some.label"}}`) + c.Assert(strings.TrimSpace(out), checker.Equals, "top label.foo-bar") +}