179 lines
3.8 KiB
Go
179 lines
3.8 KiB
Go
|
package consul
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/hashicorp/consul/consul/structs"
|
||
|
"os"
|
||
|
"testing"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
func TestLeader_RegisterMember(t *testing.T) {
|
||
|
dir1, s1 := testServer(t)
|
||
|
defer os.RemoveAll(dir1)
|
||
|
defer s1.Shutdown()
|
||
|
|
||
|
dir2, c1 := testClient(t)
|
||
|
defer os.RemoveAll(dir2)
|
||
|
defer c1.Shutdown()
|
||
|
|
||
|
// Wait until we have a leader
|
||
|
time.Sleep(100 * time.Millisecond)
|
||
|
|
||
|
// Try to join
|
||
|
addr := fmt.Sprintf("127.0.0.1:%d",
|
||
|
s1.config.SerfLANConfig.MemberlistConfig.BindPort)
|
||
|
if _, err := c1.JoinLAN([]string{addr}); err != nil {
|
||
|
t.Fatalf("err: %v", err)
|
||
|
}
|
||
|
|
||
|
// Wait for registration
|
||
|
time.Sleep(10 * time.Millisecond)
|
||
|
|
||
|
// Should be registered
|
||
|
state := s1.fsm.State()
|
||
|
found, _ := state.GetNode(c1.config.NodeName)
|
||
|
if !found {
|
||
|
t.Fatalf("client not registered")
|
||
|
}
|
||
|
|
||
|
// Should have a check
|
||
|
checks := state.NodeChecks(c1.config.NodeName)
|
||
|
if len(checks) != 1 {
|
||
|
t.Fatalf("client missing check")
|
||
|
}
|
||
|
if checks[0].CheckID != serfCheckID {
|
||
|
t.Fatalf("bad check: %v", checks[0])
|
||
|
}
|
||
|
if checks[0].Name != serfCheckName {
|
||
|
t.Fatalf("bad check: %v", checks[0])
|
||
|
}
|
||
|
if checks[0].Status != structs.HealthPassing {
|
||
|
t.Fatalf("bad check: %v", checks[0])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestLeader_FailedMember(t *testing.T) {
|
||
|
dir1, s1 := testServer(t)
|
||
|
defer os.RemoveAll(dir1)
|
||
|
defer s1.Shutdown()
|
||
|
|
||
|
dir2, c1 := testClient(t)
|
||
|
defer os.RemoveAll(dir2)
|
||
|
defer c1.Shutdown()
|
||
|
|
||
|
// Wait until we have a leader
|
||
|
time.Sleep(100 * time.Millisecond)
|
||
|
|
||
|
// Try to join
|
||
|
addr := fmt.Sprintf("127.0.0.1:%d",
|
||
|
s1.config.SerfLANConfig.MemberlistConfig.BindPort)
|
||
|
if _, err := c1.JoinLAN([]string{addr}); err != nil {
|
||
|
t.Fatalf("err: %v", err)
|
||
|
}
|
||
|
|
||
|
// Fail the member
|
||
|
c1.Shutdown()
|
||
|
|
||
|
// Wait for failure detection
|
||
|
time.Sleep(500 * time.Millisecond)
|
||
|
|
||
|
// Should be registered
|
||
|
state := s1.fsm.State()
|
||
|
found, _ := state.GetNode(c1.config.NodeName)
|
||
|
if !found {
|
||
|
t.Fatalf("client not registered")
|
||
|
}
|
||
|
|
||
|
// Should have a check
|
||
|
checks := state.NodeChecks(c1.config.NodeName)
|
||
|
if len(checks) != 1 {
|
||
|
t.Fatalf("client missing check")
|
||
|
}
|
||
|
if checks[0].CheckID != serfCheckID {
|
||
|
t.Fatalf("bad check: %v", checks[0])
|
||
|
}
|
||
|
if checks[0].Name != serfCheckName {
|
||
|
t.Fatalf("bad check: %v", checks[0])
|
||
|
}
|
||
|
if checks[0].Status != structs.HealthCritical {
|
||
|
t.Fatalf("bad check: %v", checks[0])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestLeader_LeftMember(t *testing.T) {
|
||
|
dir1, s1 := testServer(t)
|
||
|
defer os.RemoveAll(dir1)
|
||
|
defer s1.Shutdown()
|
||
|
|
||
|
dir2, c1 := testClient(t)
|
||
|
defer os.RemoveAll(dir2)
|
||
|
defer c1.Shutdown()
|
||
|
|
||
|
// Wait until we have a leader
|
||
|
time.Sleep(100 * time.Millisecond)
|
||
|
|
||
|
// Try to join
|
||
|
addr := fmt.Sprintf("127.0.0.1:%d",
|
||
|
s1.config.SerfLANConfig.MemberlistConfig.BindPort)
|
||
|
if _, err := c1.JoinLAN([]string{addr}); err != nil {
|
||
|
t.Fatalf("err: %v", err)
|
||
|
}
|
||
|
|
||
|
// Wait for registration
|
||
|
time.Sleep(10 * time.Millisecond)
|
||
|
|
||
|
// Should be registered
|
||
|
state := s1.fsm.State()
|
||
|
found, _ := state.GetNode(c1.config.NodeName)
|
||
|
if !found {
|
||
|
t.Fatalf("client not registered")
|
||
|
}
|
||
|
|
||
|
// Node should leave
|
||
|
c1.Leave()
|
||
|
c1.Shutdown()
|
||
|
|
||
|
// Wait for failure detection
|
||
|
time.Sleep(500 * time.Millisecond)
|
||
|
|
||
|
// Should be deregistered
|
||
|
found, _ = state.GetNode(c1.config.NodeName)
|
||
|
if found {
|
||
|
t.Fatalf("client registered")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestLeader_Reconcile(t *testing.T) {
|
||
|
dir1, s1 := testServer(t)
|
||
|
defer os.RemoveAll(dir1)
|
||
|
defer s1.Shutdown()
|
||
|
|
||
|
dir2, c1 := testClient(t)
|
||
|
defer os.RemoveAll(dir2)
|
||
|
defer c1.Shutdown()
|
||
|
|
||
|
// Join before we have a leader, this should cause a reconcile!
|
||
|
addr := fmt.Sprintf("127.0.0.1:%d",
|
||
|
s1.config.SerfLANConfig.MemberlistConfig.BindPort)
|
||
|
if _, err := c1.JoinLAN([]string{addr}); err != nil {
|
||
|
t.Fatalf("err: %v", err)
|
||
|
}
|
||
|
|
||
|
// Should not be registered
|
||
|
state := s1.fsm.State()
|
||
|
found, _ := state.GetNode(c1.config.NodeName)
|
||
|
if found {
|
||
|
t.Fatalf("client registered")
|
||
|
}
|
||
|
|
||
|
// Wait for leader
|
||
|
time.Sleep(100 * time.Millisecond)
|
||
|
|
||
|
// Should be registered
|
||
|
found, _ = state.GetNode(c1.config.NodeName)
|
||
|
if !found {
|
||
|
t.Fatalf("client not registered")
|
||
|
}
|
||
|
}
|