From 4fa3987bdce09a331224be85d2f5d276874675d5 Mon Sep 17 00:00:00 2001 From: Preetha Appan Date: Thu, 12 Oct 2017 17:15:13 -0500 Subject: [PATCH] Move members command to its own package --- command/commands.go | 8 +--- command/{ => members}/members.go | 68 +++++++++++++++++---------- command/{ => members}/members_test.go | 37 +++++++-------- 3 files changed, 61 insertions(+), 52 deletions(-) rename command/{ => members}/members.go (81%) rename command/{ => members}/members_test.go (83%) diff --git a/command/commands.go b/command/commands.go index 76812dfb9..8f39012e1 100644 --- a/command/commands.go +++ b/command/commands.go @@ -25,6 +25,7 @@ import ( "github.com/hashicorp/consul/command/leave" "github.com/hashicorp/consul/command/lock" "github.com/hashicorp/consul/command/maint" + "github.com/hashicorp/consul/command/members" "github.com/hashicorp/consul/command/validate" "github.com/hashicorp/consul/version" "github.com/mitchellh/cli" @@ -132,12 +133,7 @@ func init() { }, "members": func() (cli.Command, error) { - return &MembersCommand{ - BaseCommand: BaseCommand{ - Flags: FlagSetClientHTTP, - UI: ui, - }, - }, nil + return members.New(ui), nil }, "monitor": func() (cli.Command, error) { diff --git a/command/members.go b/command/members/members.go similarity index 81% rename from command/members.go rename to command/members/members.go index ec313ed1d..967087957 100644 --- a/command/members.go +++ b/command/members/members.go @@ -1,4 +1,4 @@ -package command +package members import ( "fmt" @@ -7,16 +7,22 @@ import ( "sort" "strings" + "flag" + consulapi "github.com/hashicorp/consul/api" + "github.com/hashicorp/consul/command/flags" "github.com/hashicorp/serf/serf" + "github.com/mitchellh/cli" "github.com/ryanuber/columnize" ) -// MembersCommand is a Command implementation that queries a running +// cmd is a Command implementation that queries a running // Consul agent what members are part of the cluster currently. -type MembersCommand struct { - BaseCommand - +type cmd struct { + UI cli.Ui + usage string + flags *flag.FlagSet + http *flags.HTTPFlags // flags detailed bool wan bool @@ -24,34 +30,37 @@ type MembersCommand struct { segment string } -func (c *MembersCommand) initFlags() { - c.InitFlagSet() - c.FlagSet.BoolVar(&c.detailed, "detailed", false, +func New(ui cli.Ui) *cmd { + c := &cmd{UI: ui} + c.init() + return c +} + +func (c *cmd) init() { + c.flags = flag.NewFlagSet("", flag.ContinueOnError) + c.http = &flags.HTTPFlags{} + flags.Merge(c.flags, c.http.ClientFlags()) + + c.flags.BoolVar(&c.detailed, "detailed", false, "Provides detailed information about nodes.") - c.FlagSet.BoolVar(&c.wan, "wan", false, + c.flags.BoolVar(&c.wan, "wan", false, "If the agent is in server mode, this can be used to return the other "+ "peers in the WAN pool.") - c.FlagSet.StringVar(&c.statusFilter, "status", ".*", + c.flags.StringVar(&c.statusFilter, "status", ".*", "If provided, output is filtered to only nodes matching the regular "+ "expression for status.") - c.FlagSet.StringVar(&c.segment, "segment", consulapi.AllSegments, + c.flags.StringVar(&c.segment, "segment", consulapi.AllSegments, "(Enterprise-only) If provided, output is filtered to only nodes in"+ "the given segment.") + c.usage = flags.Usage(usage, c.flags, c.http.ClientFlags(), nil) } -func (c *MembersCommand) Help() string { - c.initFlags() - return c.HelpCommand(` -Usage: consul members [options] - - Outputs the members of a running Consul agent. - -`) +func (c *cmd) Help() string { + return c.usage } -func (c *MembersCommand) Run(args []string) int { - c.initFlags() - if err := c.FlagSet.Parse(args); err != nil { +func (c *cmd) Run(args []string) int { + if err := c.flags.Parse(args); err != nil { return 1 } @@ -62,7 +71,7 @@ func (c *MembersCommand) Run(args []string) int { return 1 } - client, err := c.HTTPClient() + client, err := c.http.APIClient() if err != nil { c.UI.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err)) return 1 @@ -139,7 +148,7 @@ func (m ByMemberNameAndSegment) Less(i, j int) bool { // standardOutput is used to dump the most useful information about nodes // in a more human-friendly format -func (c *MembersCommand) standardOutput(members []*consulapi.AgentMember) []string { +func (c *cmd) standardOutput(members []*consulapi.AgentMember) []string { result := make([]string, 0, len(members)) header := "Node|Address|Status|Type|Build|Protocol|DC|Segment" result = append(result, header) @@ -176,7 +185,7 @@ func (c *MembersCommand) standardOutput(members []*consulapi.AgentMember) []stri // detailedOutput is used to dump all known information about nodes in // their raw format -func (c *MembersCommand) detailedOutput(members []*consulapi.AgentMember) []string { +func (c *cmd) detailedOutput(members []*consulapi.AgentMember) []string { result := make([]string, 0, len(members)) header := "Node|Address|Status|Tags" result = append(result, header) @@ -204,6 +213,13 @@ func (c *MembersCommand) detailedOutput(members []*consulapi.AgentMember) []stri return result } -func (c *MembersCommand) Synopsis() string { +func (c *cmd) Synopsis() string { return "Lists the members of a Consul cluster" } + +const usage = ` +Usage: consul members [options] + + Outputs the members of a running Consul agent. + +` diff --git a/command/members_test.go b/command/members/members_test.go similarity index 83% rename from command/members_test.go rename to command/members/members_test.go index ae838f495..9c1ff4cd8 100644 --- a/command/members_test.go +++ b/command/members/members_test.go @@ -1,4 +1,4 @@ -package command +package members import ( "fmt" @@ -9,27 +9,15 @@ import ( "github.com/mitchellh/cli" ) -func testMembersCommand(t *testing.T) (*cli.MockUi, *MembersCommand) { - ui := cli.NewMockUi() - return ui, &MembersCommand{ - BaseCommand: BaseCommand{ - UI: ui, - Flags: FlagSetClientHTTP, - }, - } -} - -func TestMembersCommand_implements(t *testing.T) { - t.Parallel() - var _ cli.Command = &MembersCommand{} -} - func TestMembersCommandRun(t *testing.T) { t.Parallel() a := agent.NewTestAgent(t.Name(), ``) defer a.Shutdown() - ui, c := testMembersCommand(t) + ui := cli.NewMockUi() + c := New(ui) + c.flags.SetOutput(ui.ErrorWriter) + args := []string{"-http-addr=" + a.HTTPAddr()} code := c.Run(args) @@ -58,7 +46,10 @@ func TestMembersCommandRun_WAN(t *testing.T) { a := agent.NewTestAgent(t.Name(), ``) defer a.Shutdown() - ui, c := testMembersCommand(t) + ui := cli.NewMockUi() + c := New(ui) + c.flags.SetOutput(ui.ErrorWriter) + args := []string{"-http-addr=" + a.HTTPAddr(), "-wan"} code := c.Run(args) @@ -76,7 +67,10 @@ func TestMembersCommandRun_statusFilter(t *testing.T) { a := agent.NewTestAgent(t.Name(), ``) defer a.Shutdown() - ui, c := testMembersCommand(t) + ui := cli.NewMockUi() + c := New(ui) + c.flags.SetOutput(ui.ErrorWriter) + args := []string{ "-http-addr=" + a.HTTPAddr(), "-status=a.*e", @@ -97,7 +91,10 @@ func TestMembersCommandRun_statusFilter_failed(t *testing.T) { a := agent.NewTestAgent(t.Name(), ``) defer a.Shutdown() - ui, c := testMembersCommand(t) + ui := cli.NewMockUi() + c := New(ui) + c.flags.SetOutput(ui.ErrorWriter) + args := []string{ "-http-addr=" + a.HTTPAddr(), "-status=(fail|left)",