mirror of https://github.com/hashicorp/consul
Armon Dadgar
11 years ago
6 changed files with 162 additions and 0 deletions
@ -0,0 +1,81 @@
|
||||
package command |
||||
|
||||
import ( |
||||
"flag" |
||||
"fmt" |
||||
"github.com/mitchellh/cli" |
||||
"sort" |
||||
"strings" |
||||
) |
||||
|
||||
// InfoCommand is a Command implementation that queries a running
|
||||
// Consul agent for various debugging statistics for operators
|
||||
type InfoCommand struct { |
||||
Ui cli.Ui |
||||
} |
||||
|
||||
func (i *InfoCommand) Help() string { |
||||
helpText := ` |
||||
Usage: consul info [options] |
||||
|
||||
Provides debugging information for operators |
||||
|
||||
Options: |
||||
|
||||
-rpc-addr=127.0.0.1:8400 RPC address of the Consul agent. |
||||
` |
||||
return strings.TrimSpace(helpText) |
||||
} |
||||
|
||||
func (i *InfoCommand) Run(args []string) int { |
||||
cmdFlags := flag.NewFlagSet("info", flag.ContinueOnError) |
||||
cmdFlags.Usage = func() { i.Ui.Output(i.Help()) } |
||||
rpcAddr := RPCAddrFlag(cmdFlags) |
||||
if err := cmdFlags.Parse(args); err != nil { |
||||
return 1 |
||||
} |
||||
|
||||
client, err := RPCClient(*rpcAddr) |
||||
if err != nil { |
||||
i.Ui.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err)) |
||||
return 1 |
||||
} |
||||
defer client.Close() |
||||
|
||||
stats, err := client.Stats() |
||||
if err != nil { |
||||
i.Ui.Error(fmt.Sprintf("Error querying agent: %s", err)) |
||||
return 1 |
||||
} |
||||
|
||||
// Get the keys in sorted order
|
||||
keys := make([]string, 0, len(stats)) |
||||
for key := range stats { |
||||
keys = append(keys, key) |
||||
} |
||||
sort.Strings(keys) |
||||
|
||||
// Iterate over each top-level key
|
||||
for _, key := range keys { |
||||
i.Ui.Output(key) |
||||
|
||||
// Sort the sub-keys
|
||||
subvals := stats[key] |
||||
subkeys := make([]string, 0, len(subvals)) |
||||
for k := range subvals { |
||||
subkeys = append(subkeys, k) |
||||
} |
||||
sort.Strings(subkeys) |
||||
|
||||
// Iterate over the subkeys
|
||||
for _, subkey := range subkeys { |
||||
val := subvals[subkey] |
||||
i.Ui.Output(fmt.Sprintf("\t%s = %s", subkey, val)) |
||||
} |
||||
} |
||||
return 0 |
||||
} |
||||
|
||||
func (i *InfoCommand) Synopsis() string { |
||||
return "Provides debugging information for operators" |
||||
} |
@ -0,0 +1,30 @@
|
||||
package command |
||||
|
||||
import ( |
||||
"fmt" |
||||
"github.com/mitchellh/cli" |
||||
"strings" |
||||
"testing" |
||||
) |
||||
|
||||
func TestInfoCommand_implements(t *testing.T) { |
||||
var _ cli.Command = &InfoCommand{} |
||||
} |
||||
|
||||
func TestInfoCommandRun(t *testing.T) { |
||||
a1 := testAgent(t) |
||||
defer a1.Shutdown() |
||||
|
||||
ui := new(cli.MockUi) |
||||
c := &InfoCommand{Ui: ui} |
||||
args := []string{"-rpc-addr=" + a1.addr} |
||||
|
||||
code := c.Run(args) |
||||
if code != 0 { |
||||
t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String()) |
||||
} |
||||
|
||||
if !strings.Contains(ui.OutputWriter.String(), "agent") { |
||||
t.Fatalf("bad: %#v", ui.OutputWriter.String()) |
||||
} |
||||
} |
Loading…
Reference in new issue