From 602e896fb9261c6646eaccc4ad965b794b54513d Mon Sep 17 00:00:00 2001 From: Frank Schroeder Date: Tue, 17 Oct 2017 08:52:50 +0200 Subject: [PATCH] commands: move rtt command to separate pkg --- command/commands.go | 8 +--- command/{ => rtt}/rtt.go | 87 ++++++++++++++++++++--------------- command/{ => rtt}/rtt_test.go | 39 ++++++++-------- 3 files changed, 70 insertions(+), 64 deletions(-) rename command/{ => rtt}/rtt.go (84%) rename command/{ => rtt}/rtt_test.go (90%) diff --git a/command/commands.go b/command/commands.go index fb72255ba..cb704debe 100644 --- a/command/commands.go +++ b/command/commands.go @@ -35,6 +35,7 @@ import ( "github.com/hashicorp/consul/command/operraftlist" "github.com/hashicorp/consul/command/operraftremove" "github.com/hashicorp/consul/command/reload" + "github.com/hashicorp/consul/command/rtt" "github.com/hashicorp/consul/command/validate" "github.com/hashicorp/consul/version" "github.com/mitchellh/cli" @@ -182,12 +183,7 @@ func init() { }, "rtt": func() (cli.Command, error) { - return &RTTCommand{ - BaseCommand: BaseCommand{ - Flags: FlagSetClientHTTP, - UI: ui, - }, - }, nil + return rtt.New(ui), nil }, "snapshot": func() (cli.Command, error) { diff --git a/command/rtt.go b/command/rtt/rtt.go similarity index 84% rename from command/rtt.go rename to command/rtt/rtt.go index 2974df479..ee482eaea 100644 --- a/command/rtt.go +++ b/command/rtt/rtt.go @@ -1,60 +1,57 @@ -package command +package rtt import ( + "flag" "fmt" "strings" + "github.com/hashicorp/consul/command/flags" "github.com/hashicorp/consul/lib" "github.com/hashicorp/serf/coordinate" + "github.com/mitchellh/cli" ) -// RTTCommand is a Command implementation that allows users to query the -// estimated round trip time between nodes using network coordinates. -type RTTCommand struct { - BaseCommand +func New(ui cli.Ui) *cmd { + c := &cmd{UI: ui} + c.init() + return c +} + +type cmd struct { + UI cli.Ui + flags *flag.FlagSet + http *flags.HTTPFlags + usage string // flags wan bool } -func (c *RTTCommand) initFlags() { - c.InitFlagSet() - c.FlagSet.BoolVar(&c.wan, "wan", false, +func (c *cmd) init() { + c.flags = flag.NewFlagSet("", flag.ContinueOnError) + c.flags.BoolVar(&c.wan, "wan", false, "Use WAN coordinates instead of LAN coordinates.") + + c.http = &flags.HTTPFlags{} + flags.Merge(c.flags, c.http.ClientFlags()) + c.usage = flags.Usage(usage, c.flags, c.http.ClientFlags(), nil) } -func (c *RTTCommand) Help() string { - c.initFlags() - return c.HelpCommand(` -Usage: consul rtt [options] node1 [node2] - - Estimates the round trip time between two nodes using Consul's network - coordinate model of the cluster. - - At least one node name is required. If the second node name isn't given, it - is set to the agent's node name. Note that these are node names as known to - Consul as "consul members" would show, not IP addresses. - - By default, the two nodes are assumed to be nodes in the local datacenter - and the LAN coordinates are used. If the -wan option is given, then the WAN - coordinates are used, and the node names must be suffixed by a period and - the datacenter (eg. "myserver.dc1"). - - It is not possible to measure between LAN coordinates and WAN coordinates - because they are maintained by independent Serf gossip areas, so they are - not compatible. - -`) +func (c *cmd) Synopsis() string { + return "Estimates network round trip time between nodes" } -func (c *RTTCommand) Run(args []string) int { - c.initFlags() - if err := c.FlagSet.Parse(args); err != nil { +func (c *cmd) Help() string { + return c.usage +} + +func (c *cmd) Run(args []string) int { + if err := c.flags.Parse(args); err != nil { return 1 } // They must provide at least one node. - nodes := c.FlagSet.Args() + nodes := c.flags.Args() if len(nodes) < 1 || len(nodes) > 2 { c.UI.Error("One or two node names must be specified") c.UI.Error("") @@ -63,7 +60,7 @@ func (c *RTTCommand) Run(args []string) int { } // Create and test the HTTP client. - 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 @@ -185,6 +182,20 @@ SHOW_RTT: return 0 } -func (c *RTTCommand) Synopsis() string { - return "Estimates network round trip time between nodes" -} +const usage = `Usage: consul rtt [options] node1 [node2] + + Estimates the round trip time between two nodes using Consul's network + coordinate model of the cluster. + + At least one node name is required. If the second node name isn't given, it + is set to the agent's node name. Note that these are node names as known to + Consul as "consul members" would show, not IP addresses. + + By default, the two nodes are assumed to be nodes in the local datacenter + and the LAN coordinates are used. If the -wan option is given, then the WAN + coordinates are used, and the node names must be suffixed by a period and + the datacenter (eg. "myserver.dc1"). + + It is not possible to measure between LAN coordinates and WAN coordinates + because they are maintained by independent Serf gossip areas, so they are + not compatible.` diff --git a/command/rtt_test.go b/command/rtt/rtt_test.go similarity index 90% rename from command/rtt_test.go rename to command/rtt/rtt_test.go index 4ab7e75be..bfd6baf55 100644 --- a/command/rtt_test.go +++ b/command/rtt/rtt_test.go @@ -1,4 +1,4 @@ -package command +package rtt import ( "fmt" @@ -12,19 +12,11 @@ import ( "github.com/mitchellh/cli" ) -func testRTTCommand(t *testing.T) (*cli.MockUi, *RTTCommand) { - ui := cli.NewMockUi() - return ui, &RTTCommand{ - BaseCommand: BaseCommand{ - UI: ui, - Flags: FlagSetClientHTTP, - }, - } -} - -func TestRTTCommand_Implements(t *testing.T) { +func TestRTTCommand_noTabs(t *testing.T) { t.Parallel() - var _ cli.Command = &RTTCommand{} + if strings.ContainsRune(New(cli.NewMockUi()).Help(), '\t') { + t.Fatal("usage has tabs") + } } func TestRTTCommand_Run_BadArgs(t *testing.T) { @@ -42,7 +34,8 @@ func TestRTTCommand_Run_BadArgs(t *testing.T) { for _, tt := range tests { t.Run(strings.Join(tt.args, " "), func(t *testing.T) { t.Parallel() - _, c := testRTTCommand(t) + ui := cli.NewMockUi() + c := New(ui) if code := c.Run(tt.args); code != 1 { t.Fatalf("expected return code 1, got %d", code) } @@ -101,7 +94,8 @@ func TestRTTCommand_Run_LAN(t *testing.T) { } // Ask for the RTT of two known nodes - ui, c := testRTTCommand(t) + ui := cli.NewMockUi() + c := New(ui) args := []string{ "-http-addr=" + a.HTTPAddr(), a.Config.NodeName, @@ -123,7 +117,8 @@ func TestRTTCommand_Run_LAN(t *testing.T) { // Default to the agent's node. { - ui, c := testRTTCommand(t) + ui := cli.NewMockUi() + c := New(ui) args := []string{ "-http-addr=" + a.HTTPAddr(), "dogs", @@ -142,7 +137,8 @@ func TestRTTCommand_Run_LAN(t *testing.T) { // Try an unknown node. { - ui, c := testRTTCommand(t) + ui := cli.NewMockUi() + c := New(ui) args := []string{ "-http-addr=" + a.HTTPAddr(), a.Config.NodeName, @@ -165,7 +161,8 @@ func TestRTTCommand_Run_WAN(t *testing.T) { // We can't easily inject WAN coordinates, so we will just query the // node with itself. { - ui, c := testRTTCommand(t) + ui := cli.NewMockUi() + c := New(ui) args := []string{ "-wan", "-http-addr=" + a.HTTPAddr(), @@ -185,7 +182,8 @@ func TestRTTCommand_Run_WAN(t *testing.T) { // Default to the agent's node. { - ui, c := testRTTCommand(t) + ui := cli.NewMockUi() + c := New(ui) args := []string{ "-wan", "-http-addr=" + a.HTTPAddr(), @@ -204,7 +202,8 @@ func TestRTTCommand_Run_WAN(t *testing.T) { // Try an unknown node. { - ui, c := testRTTCommand(t) + ui := cli.NewMockUi() + c := New(ui) args := []string{ "-wan", "-http-addr=" + a.HTTPAddr(),