diff --git a/command/agent/command.go b/command/agent/command.go index 3b0f7617fa3b..0db0f0b1698e 100644 --- a/command/agent/command.go +++ b/command/agent/command.go @@ -361,6 +361,16 @@ func (c *Command) readConfig() *Config { return nil } + if config.AdvertiseAddr == "0.0.0.0" { + c.UI.Error("Advertise address cannot be 0.0.0.0") + return nil + } + + if config.AdvertiseAddrWan == "0.0.0.0" { + c.UI.Error("Advertise WAN address cannot be 0.0.0.0") + return nil + } + // Compile all the watches for _, params := range config.Watches { // Parse the watches, excluding the handler diff --git a/command/agent/command_test.go b/command/agent/command_test.go index e5c11430b076..cd4cfb2f9d09 100644 --- a/command/agent/command_test.go +++ b/command/agent/command_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "log" "os" + "os/exec" "path/filepath" "reflect" "strings" @@ -50,6 +51,36 @@ func TestValidDatacenter(t *testing.T) { } } +// TestConfigFail should test command line flags that lead to an immediate error. +func TestConfigFail(t *testing.T) { + tests := []struct { + args []string + out string + }{ + { + args: []string{"agent", "-server", "-data-dir", "foo", "-advertise", "0.0.0.0"}, + out: "==> Advertise address cannot be 0.0.0.0\n", + }, + { + args: []string{"agent", "-server", "-data-dir", "foo", "-advertise-wan", "0.0.0.0"}, + out: "==> Advertise WAN address cannot be 0.0.0.0\n", + }, + } + + for _, tt := range tests { + t.Run(strings.Join(tt.args, " "), func(t *testing.T) { + cmd := exec.Command("consul", tt.args...) + b, err := cmd.CombinedOutput() + if got, want := err, "exit status 1"; got == nil || got.Error() != want { + t.Fatalf("got err %q want %q", got, want) + } + if got, want := string(b), tt.out; got != want { + t.Fatalf("got %q want %q", got, want) + } + }) + } +} + func TestRetryJoin(t *testing.T) { dir, agent := makeAgent(t, nextConfig()) defer os.RemoveAll(dir)