From fb6deb107791adef1477455b4e3a77a4e65066d9 Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Wed, 5 Jul 2017 13:32:54 -0400 Subject: [PATCH 1/2] Fix stream for 'nothing found in stack' message Signed-off-by: Daniel Nephin --- cli/command/stack/ps.go | 2 +- cli/command/stack/ps_test.go | 13 +++++++++---- cli/command/stack/remove.go | 2 +- cli/command/stack/remove_test.go | 22 +++++++++++++--------- cli/command/stack/services.go | 4 +--- cli/command/stack/services_test.go | 20 +++++++++++--------- 6 files changed, 36 insertions(+), 27 deletions(-) diff --git a/cli/command/stack/ps.go b/cli/command/stack/ps.go index ae9ed0f70a..985d6ee8d8 100644 --- a/cli/command/stack/ps.go +++ b/cli/command/stack/ps.go @@ -58,7 +58,7 @@ func runPS(dockerCli command.Cli, options psOptions) error { } if len(tasks) == 0 { - fmt.Fprintf(dockerCli.Out(), "Nothing found in stack: %s\n", namespace) + fmt.Fprintf(dockerCli.Err(), "Nothing found in stack: %s\n", namespace) return nil } diff --git a/cli/command/stack/ps_test.go b/cli/command/stack/ps_test.go index afda419eb4..7dc766609c 100644 --- a/cli/command/stack/ps_test.go +++ b/cli/command/stack/ps_test.go @@ -53,15 +53,20 @@ func TestStackPsErrors(t *testing.T) { } func TestStackPsEmptyStack(t *testing.T) { - buf := new(bytes.Buffer) - cmd := newPsCommand(test.NewFakeCli(&fakeClient{ + out := new(bytes.Buffer) + stderr := new(bytes.Buffer) + fakeCli := test.NewFakeCli(&fakeClient{ taskListFunc: func(options types.TaskListOptions) ([]swarm.Task, error) { return []swarm.Task{}, nil }, - }, buf)) + }, out) + fakeCli.SetErr(stderr) + cmd := newPsCommand(fakeCli) cmd.SetArgs([]string{"foo"}) + assert.NoError(t, cmd.Execute()) - testutil.EqualNormalizedString(t, testutil.RemoveSpace, buf.String(), "Nothing found in stack: foo") + assert.Equal(t, "", out.String()) + assert.Equal(t, "Nothing found in stack: foo\n", stderr.String()) } func TestStackPsWithQuietOption(t *testing.T) { diff --git a/cli/command/stack/remove.go b/cli/command/stack/remove.go index 20d3ee71db..10a651cc13 100644 --- a/cli/command/stack/remove.go +++ b/cli/command/stack/remove.go @@ -72,7 +72,7 @@ func runRemove(dockerCli command.Cli, opts removeOptions) error { } if len(services)+len(networks)+len(secrets)+len(configs) == 0 { - fmt.Fprintf(dockerCli.Out(), "Nothing found in stack: %s\n", namespace) + fmt.Fprintf(dockerCli.Err(), "Nothing found in stack: %s\n", namespace) continue } diff --git a/cli/command/stack/remove_test.go b/cli/command/stack/remove_test.go index 498416ebe8..a924407af0 100644 --- a/cli/command/stack/remove_test.go +++ b/cli/command/stack/remove_test.go @@ -56,8 +56,9 @@ func TestRemoveStack(t *testing.T) { assert.Equal(t, allConfigIDs, cli.removedConfigs) } -func TestSkipEmptyStack(t *testing.T) { - buf := new(bytes.Buffer) +func TestRemoveStackSkipEmpty(t *testing.T) { + out := new(bytes.Buffer) + stderr := new(bytes.Buffer) allServices := []string{objectName("bar", "service1"), objectName("bar", "service2")} allServiceIDs := buildObjectIDs(allServices) @@ -70,21 +71,24 @@ func TestSkipEmptyStack(t *testing.T) { allConfigs := []string{objectName("bar", "config1")} allConfigIDs := buildObjectIDs(allConfigs) - cli := &fakeClient{ + fakeClient := &fakeClient{ services: allServices, networks: allNetworks, secrets: allSecrets, configs: allConfigs, } - cmd := newRemoveCommand(test.NewFakeCli(cli, buf)) + fakeCli := test.NewFakeCli(fakeClient, out) + fakeCli.SetErr(stderr) + cmd := newRemoveCommand(fakeCli) cmd.SetArgs([]string{"foo", "bar"}) assert.NoError(t, cmd.Execute()) - assert.Contains(t, buf.String(), "Nothing found in stack: foo") - assert.Equal(t, allServiceIDs, cli.removedServices) - assert.Equal(t, allNetworkIDs, cli.removedNetworks) - assert.Equal(t, allSecretIDs, cli.removedSecrets) - assert.Equal(t, allConfigIDs, cli.removedConfigs) + assert.Equal(t, "", out.String()) + assert.Contains(t, stderr.String(), "Nothing found in stack: foo\n") + assert.Equal(t, allServiceIDs, fakeClient.removedServices) + assert.Equal(t, allNetworkIDs, fakeClient.removedNetworks) + assert.Equal(t, allSecretIDs, fakeClient.removedSecrets) + assert.Equal(t, allConfigIDs, fakeClient.removedConfigs) } func TestRemoveContinueAfterError(t *testing.T) { diff --git a/cli/command/stack/services.go b/cli/command/stack/services.go index 5b59c479c6..94fcb8bded 100644 --- a/cli/command/stack/services.go +++ b/cli/command/stack/services.go @@ -51,11 +51,9 @@ func runServices(dockerCli command.Cli, options servicesOptions) error { return err } - out := dockerCli.Out() - // if no services in this stack, print message and exit 0 if len(services) == 0 { - fmt.Fprintf(out, "Nothing found in stack: %s\n", options.namespace) + fmt.Fprintf(dockerCli.Err(), "Nothing found in stack: %s\n", options.namespace) return nil } diff --git a/cli/command/stack/services_test.go b/cli/command/stack/services_test.go index a87174a14d..88408b4cd3 100644 --- a/cli/command/stack/services_test.go +++ b/cli/command/stack/services_test.go @@ -83,17 +83,19 @@ func TestStackServicesErrors(t *testing.T) { } func TestStackServicesEmptyServiceList(t *testing.T) { - buf := new(bytes.Buffer) - cmd := newServicesCommand( - test.NewFakeCli(&fakeClient{ - serviceListFunc: func(options types.ServiceListOptions) ([]swarm.Service, error) { - return []swarm.Service{}, nil - }, - }, buf), - ) + out := new(bytes.Buffer) + stderr := new(bytes.Buffer) + fakeCli := test.NewFakeCli(&fakeClient{ + serviceListFunc: func(options types.ServiceListOptions) ([]swarm.Service, error) { + return []swarm.Service{}, nil + }, + }, out) + fakeCli.SetErr(stderr) + cmd := newServicesCommand(fakeCli) cmd.SetArgs([]string{"foo"}) assert.NoError(t, cmd.Execute()) - testutil.EqualNormalizedString(t, testutil.RemoveSpace, buf.String(), "Nothing found in stack: foo") + assert.Equal(t, "", out.String()) + assert.Equal(t, "Nothing found in stack: foo\n", stderr.String()) } func TestStackServicesWithQuietOption(t *testing.T) { From 0030bfea9fc20475695b256e18b97c9c0d2950e8 Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Wed, 5 Jul 2017 13:40:08 -0400 Subject: [PATCH 2/2] Remove duplication in task formatting. Signed-off-by: Daniel Nephin --- cli/command/node/ps.go | 7 +------ cli/command/service/ps.go | 7 +------ cli/command/stack/ps.go | 7 +------ cli/command/task/print.go | 13 +++++++++++-- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/cli/command/node/ps.go b/cli/command/node/ps.go index 6a586a3bcc..5212e596f3 100644 --- a/cli/command/node/ps.go +++ b/cli/command/node/ps.go @@ -5,7 +5,6 @@ import ( "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" - "github.com/docker/cli/cli/command/formatter" "github.com/docker/cli/cli/command/idresolver" "github.com/docker/cli/cli/command/task" "github.com/docker/cli/opts" @@ -88,11 +87,7 @@ func runPs(dockerCli command.Cli, options psOptions) error { format := options.format if len(format) == 0 { - if dockerCli.ConfigFile() != nil && len(dockerCli.ConfigFile().TasksFormat) > 0 && !options.quiet { - format = dockerCli.ConfigFile().TasksFormat - } else { - format = formatter.TableFormatKey - } + format = task.DefaultFormat(dockerCli.ConfigFile(), options.quiet) } if len(errs) == 0 || len(tasks) != 0 { diff --git a/cli/command/service/ps.go b/cli/command/service/ps.go index 741f6b589f..07dbba7230 100644 --- a/cli/command/service/ps.go +++ b/cli/command/service/ps.go @@ -5,7 +5,6 @@ import ( "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" - "github.com/docker/cli/cli/command/formatter" "github.com/docker/cli/cli/command/idresolver" "github.com/docker/cli/cli/command/node" "github.com/docker/cli/cli/command/task" @@ -65,11 +64,7 @@ func runPS(dockerCli command.Cli, options psOptions) error { format := options.format if len(format) == 0 { - if len(dockerCli.ConfigFile().TasksFormat) > 0 && !options.quiet { - format = dockerCli.ConfigFile().TasksFormat - } else { - format = formatter.TableFormatKey - } + format = task.DefaultFormat(dockerCli.ConfigFile(), options.quiet) } if err := task.Print(ctx, dockerCli, tasks, idresolver.New(client, options.noResolve), !options.noTrunc, options.quiet, format); err != nil { return err diff --git a/cli/command/stack/ps.go b/cli/command/stack/ps.go index 985d6ee8d8..25bd1eee10 100644 --- a/cli/command/stack/ps.go +++ b/cli/command/stack/ps.go @@ -5,7 +5,6 @@ import ( "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" - "github.com/docker/cli/cli/command/formatter" "github.com/docker/cli/cli/command/idresolver" "github.com/docker/cli/cli/command/task" "github.com/docker/cli/opts" @@ -64,11 +63,7 @@ func runPS(dockerCli command.Cli, options psOptions) error { format := options.format if len(format) == 0 { - if len(dockerCli.ConfigFile().TasksFormat) > 0 && !options.quiet { - format = dockerCli.ConfigFile().TasksFormat - } else { - format = formatter.TableFormatKey - } + format = task.DefaultFormat(dockerCli.ConfigFile(), options.quiet) } return task.Print(ctx, dockerCli, tasks, idresolver.New(client, options.noResolve), !options.noTrunc, options.quiet, format) diff --git a/cli/command/task/print.go b/cli/command/task/print.go index 2376ecf803..6526c28beb 100644 --- a/cli/command/task/print.go +++ b/cli/command/task/print.go @@ -4,12 +4,12 @@ import ( "fmt" "sort" - "golang.org/x/net/context" - "github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command/formatter" "github.com/docker/cli/cli/command/idresolver" + "github.com/docker/cli/cli/config/configfile" "github.com/docker/docker/api/types/swarm" + "golang.org/x/net/context" ) type tasksBySlot []swarm.Task @@ -82,3 +82,12 @@ func Print(ctx context.Context, dockerCli command.Cli, tasks []swarm.Task, resol return formatter.TaskWrite(tasksCtx, tasks, names, nodes) } + +// DefaultFormat returns the default format from the config file, or table +// format if nothing is set in the config. +func DefaultFormat(configFile *configfile.ConfigFile, quiet bool) string { + if len(configFile.TasksFormat) > 0 && !quiet { + return configFile.TasksFormat + } + return formatter.TableFormatKey +}