diff --git a/command/reload.go b/command/reload.go new file mode 100644 index 0000000000..c956eaf096 --- /dev/null +++ b/command/reload.go @@ -0,0 +1,56 @@ +package command + +import ( + "flag" + "fmt" + "github.com/mitchellh/cli" + "strings" +) + +// ReloadCommand is a Command implementation that instructs +// the Consul agent to reload configurations +type ReloadCommand struct { + Ui cli.Ui +} + +func (c *ReloadCommand) Help() string { + helpText := ` +Usage: consul reload + + Causes the agent to reload configurations. This can be used instead + of sending the SIGHUP signal to the agent. + +Options: + + -rpc-addr=127.0.0.1:8400 RPC address of the Consul agent. +` + return strings.TrimSpace(helpText) +} + +func (c *ReloadCommand) Run(args []string) int { + cmdFlags := flag.NewFlagSet("reload", flag.ContinueOnError) + cmdFlags.Usage = func() { c.Ui.Output(c.Help()) } + rpcAddr := RPCAddrFlag(cmdFlags) + if err := cmdFlags.Parse(args); err != nil { + return 1 + } + + client, err := RPCClient(*rpcAddr) + if err != nil { + c.Ui.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err)) + return 1 + } + defer client.Close() + + if err := client.Reload(); err != nil { + c.Ui.Error(fmt.Sprintf("Error reloading: %s", err)) + return 1 + } + + c.Ui.Output("Configuration reload triggered") + return 0 +} + +func (c *ReloadCommand) Synopsis() string { + return "Triggers the agent to reload configuration files" +} diff --git a/command/reload_test.go b/command/reload_test.go new file mode 100644 index 0000000000..f34c987496 --- /dev/null +++ b/command/reload_test.go @@ -0,0 +1,29 @@ +package command + +import ( + "github.com/mitchellh/cli" + "strings" + "testing" +) + +func TestReloadCommand_implements(t *testing.T) { + var _ cli.Command = &ReloadCommand{} +} + +func TestReloadCommandRun(t *testing.T) { + a1 := testAgent(t) + defer a1.Shutdown() + + ui := new(cli.MockUi) + c := &ReloadCommand{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(), "reload triggered") { + t.Fatalf("bad: %#v", ui.OutputWriter.String()) + } +} diff --git a/commands.go b/commands.go index 069c61fc3e..1bb6af8941 100644 --- a/commands.go +++ b/commands.go @@ -68,6 +68,12 @@ func init() { }, nil }, + "reload": func() (cli.Command, error) { + return &command.ReloadCommand{ + Ui: ui, + }, nil + }, + "version": func() (cli.Command, error) { return &command.VersionCommand{ Revision: GitCommit,