From b969d921d6c28fb33c2b1b75f01de54475e88cdd Mon Sep 17 00:00:00 2001 From: James Phillips Date: Tue, 14 Mar 2017 10:43:43 -0700 Subject: [PATCH] Makes the raft_vsn optional in Serf tags to support older servers. --- consul/agent/server.go | 11 +++--- consul/agent/server_test.go | 69 ++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/consul/agent/server.go b/consul/agent/server.go index 6510f34eab..749465224c 100644 --- a/consul/agent/server.go +++ b/consul/agent/server.go @@ -86,10 +86,13 @@ func IsConsulServer(m serf.Member) (bool, *Server) { return false, nil } - raft_vsn_str := m.Tags["raft_vsn"] - raft_vsn, err := strconv.Atoi(raft_vsn_str) - if err != nil { - return false, nil + raft_vsn := 0 + raft_vsn_str, ok := m.Tags["raft_vsn"] + if ok { + raft_vsn, err = strconv.Atoi(raft_vsn_str) + if err != nil { + return false, nil + } } addr := &net.TCPAddr{IP: m.Addr, Port: port} diff --git a/consul/agent/server_test.go b/consul/agent/server_test.go index 06321c7e2f..f94c29cb02 100644 --- a/consul/agent/server_test.go +++ b/consul/agent/server_test.go @@ -60,6 +60,7 @@ func TestIsConsulServer(t *testing.T) { "dc": "east-aws", "port": "10000", "vsn": "1", + "expect": "3", "raft_vsn": "3", }, } @@ -76,7 +77,7 @@ func TestIsConsulServer(t *testing.T) { if parts.Bootstrap { t.Fatalf("unexpected bootstrap") } - if parts.Expect != 0 { + if parts.Expect != 3 { t.Fatalf("bad: %v", parts.Expect) } if parts.RaftVersion != 3 { @@ -114,3 +115,69 @@ func TestIsConsulServer(t *testing.T) { t.Fatalf("unexpected ok server") } } + +func TestIsConsulServer_Optional(t *testing.T) { + m := serf.Member{ + Name: "foo", + Addr: net.IP([]byte{127, 0, 0, 1}), + Tags: map[string]string{ + "role": "consul", + "id": "asdf", + "dc": "east-aws", + "port": "10000", + "vsn": "1", + // raft_vsn and expect are optional and should default + // to zero. + }, + } + ok, parts := agent.IsConsulServer(m) + if !ok || parts.Datacenter != "east-aws" || parts.Port != 10000 { + t.Fatalf("bad: %v %v", ok, parts) + } + if parts.Name != "foo" { + t.Fatalf("bad: %v", parts) + } + if parts.ID != "asdf" { + t.Fatalf("bad: %v", parts.ID) + } + if parts.Bootstrap { + t.Fatalf("unexpected bootstrap") + } + if parts.Expect != 0 { + t.Fatalf("bad: %v", parts.Expect) + } + if parts.RaftVersion != 0 { + t.Fatalf("bad: %v", parts.RaftVersion) + } + m.Tags["bootstrap"] = "1" + m.Tags["disabled"] = "1" + ok, parts = agent.IsConsulServer(m) + if !ok { + t.Fatalf("expected a valid consul server") + } + if !parts.Bootstrap { + t.Fatalf("expected bootstrap") + } + if parts.Addr.String() != "127.0.0.1:10000" { + t.Fatalf("bad addr: %v", parts.Addr) + } + if parts.Version != 1 { + t.Fatalf("bad: %v", parts) + } + m.Tags["expect"] = "3" + delete(m.Tags, "bootstrap") + delete(m.Tags, "disabled") + ok, parts = agent.IsConsulServer(m) + if !ok || parts.Expect != 3 { + t.Fatalf("bad: %v", parts.Expect) + } + if parts.Bootstrap { + t.Fatalf("unexpected bootstrap") + } + + delete(m.Tags, "role") + ok, parts = agent.IsConsulServer(m) + if ok { + t.Fatalf("unexpected ok server") + } +}