diff --git a/consul/server_test.go b/consul/server_test.go index 0932a1f32d..2029e42345 100644 --- a/consul/server_test.go +++ b/consul/server_test.go @@ -216,6 +216,105 @@ func TestServer_JoinWAN(t *testing.T) { }) } +func TestServer_JoinSeparateLanAndWanAddresses(t *testing.T) { + dir1, s1 := testServer(t) + defer os.RemoveAll(dir1) + defer s1.Shutdown() + + dir2, s2 := testServerWithConfig(t, func(c *Config) { + c.NodeName = "s2" + c.Datacenter = "dc2" + // This wan address will be expected to be seen on s1 + c.SerfWANConfig.MemberlistConfig.AdvertiseAddr = "127.0.0.2" + // This lan address will be expected to be seen on s3 + c.SerfLANConfig.MemberlistConfig.AdvertiseAddr = "127.0.0.3" + }) + + defer os.RemoveAll(dir2) + defer s2.Shutdown() + + dir3, s3 := testServerDC(t, "dc2") + defer os.RemoveAll(dir3) + defer s3.Shutdown() + + // Join s2 to s1 on wan + addrs1 := fmt.Sprintf("127.0.0.1:%d", + s1.config.SerfWANConfig.MemberlistConfig.BindPort) + if _, err := s2.JoinWAN([]string{addrs1}); err != nil { + t.Fatalf("err: %v", err) + } + + // Join s3 to s2 on lan + addrs2 := fmt.Sprintf("127.0.0.1:%d", + s2.config.SerfLANConfig.MemberlistConfig.BindPort) + if _, err := s3.JoinLAN([]string{addrs2}); err != nil { + t.Fatalf("err: %v", err) + } + + // Check the WAN members on s1 + testutil.WaitForResult(func() (bool, error) { + return len(s1.WANMembers()) == 2, nil + }, func(err error) { + t.Fatalf("bad len") + }) + + // Check the WAN members on s2 + testutil.WaitForResult(func() (bool, error) { + return len(s2.WANMembers()) == 2, nil + }, func(err error) { + t.Fatalf("bad len") + }) + + // Check the LAN members on s2 + testutil.WaitForResult(func() (bool, error) { + return len(s2.LANMembers()) == 2, nil + }, func(err error) { + t.Fatalf("bad len") + }) + + // Check the LAN members on s3 + testutil.WaitForResult(func() (bool, error) { + return len(s3.LANMembers()) == 2, nil + }, func(err error) { + t.Fatalf("bad len") + }) + + // Check the remoteConsuls has both + if len(s1.remoteConsuls) != 2 { + t.Fatalf("remote consul missing") + } + + if len(s2.remoteConsuls) != 2 { + t.Fatalf("remote consul missing") + } + + if len(s2.localConsuls) != 2 { + t.Fatalf("local consul fellow s3 for s2 missing") + } + + // Get and check the wan address of s2 from s1 + var s2WanAddr string + for _, member := range s1.WANMembers() { + if member.Name == "s2.dc2" { + s2WanAddr = member.Addr.String() + } + } + if s2WanAddr != "127.0.0.2" { + t.Fatalf("s1 sees s2 on a wrong address: %s, expecting: %s", s2WanAddr, "127.0.0.2") + } + + // Get and check the lan address of s2 from s3 + var s2LanAddr string + for _, lanmember := range s3.LANMembers() { + if lanmember.Name == "s2" { + s2LanAddr = lanmember.Addr.String() + } + } + if s2LanAddr != "127.0.0.3" { + t.Fatalf("s3 sees s2 on a wrong address: %s, expecting: %s", s2LanAddr, "127.0.0.3") + } +} + func TestServer_LeaveLeader(t *testing.T) { dir1, s1 := testServer(t) defer os.RemoveAll(dir1)