|
|
@ -130,3 +130,126 @@ func TestAgentAntiEntropy_Services(t *testing.T) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func TestAgentAntiEntropy_Checks(t *testing.T) { |
|
|
|
|
|
|
|
conf := nextConfig() |
|
|
|
|
|
|
|
dir, agent := makeAgent(t, conf) |
|
|
|
|
|
|
|
defer os.RemoveAll(dir) |
|
|
|
|
|
|
|
defer agent.Shutdown() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Wait for a leader
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Register info
|
|
|
|
|
|
|
|
args := &structs.RegisterRequest{ |
|
|
|
|
|
|
|
Datacenter: "dc1", |
|
|
|
|
|
|
|
Node: agent.config.NodeName, |
|
|
|
|
|
|
|
Address: "127.0.0.1", |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
var out struct{} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exists both, same (noop)
|
|
|
|
|
|
|
|
chk1 := &structs.HealthCheck{ |
|
|
|
|
|
|
|
Node: agent.config.NodeName, |
|
|
|
|
|
|
|
CheckID: "mysql", |
|
|
|
|
|
|
|
Name: "mysql", |
|
|
|
|
|
|
|
Status: structs.HealthPassing, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
agent.AddCheck(chk1) |
|
|
|
|
|
|
|
args.Check = chk1 |
|
|
|
|
|
|
|
if err := agent.RPC("Catalog.Register", args, &out); err != nil { |
|
|
|
|
|
|
|
t.Fatalf("err: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exists both, different (update)
|
|
|
|
|
|
|
|
chk2 := &structs.HealthCheck{ |
|
|
|
|
|
|
|
Node: agent.config.NodeName, |
|
|
|
|
|
|
|
CheckID: "redis", |
|
|
|
|
|
|
|
Name: "redis", |
|
|
|
|
|
|
|
Status: structs.HealthPassing, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
agent.AddCheck(chk2) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chk2_mod := new(structs.HealthCheck) |
|
|
|
|
|
|
|
*chk2_mod = *chk2 |
|
|
|
|
|
|
|
chk2_mod.Status = structs.HealthUnknown |
|
|
|
|
|
|
|
args.Check = chk2_mod |
|
|
|
|
|
|
|
if err := agent.RPC("Catalog.Register", args, &out); err != nil { |
|
|
|
|
|
|
|
t.Fatalf("err: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exists local (create)
|
|
|
|
|
|
|
|
chk3 := &structs.HealthCheck{ |
|
|
|
|
|
|
|
Node: agent.config.NodeName, |
|
|
|
|
|
|
|
CheckID: "web", |
|
|
|
|
|
|
|
Name: "web", |
|
|
|
|
|
|
|
Status: structs.HealthPassing, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
agent.AddCheck(chk3) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exists remote (delete)
|
|
|
|
|
|
|
|
chk4 := &structs.HealthCheck{ |
|
|
|
|
|
|
|
Node: agent.config.NodeName, |
|
|
|
|
|
|
|
CheckID: "lb", |
|
|
|
|
|
|
|
Name: "lb", |
|
|
|
|
|
|
|
Status: structs.HealthPassing, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
args.Check = chk4 |
|
|
|
|
|
|
|
if err := agent.RPC("Catalog.Register", args, &out); err != nil { |
|
|
|
|
|
|
|
t.Fatalf("err: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Trigger anti-entropy run and wait
|
|
|
|
|
|
|
|
agent.RegistrationDone() |
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Verify that we are in sync
|
|
|
|
|
|
|
|
req := structs.NodeSpecificRequest{ |
|
|
|
|
|
|
|
Datacenter: "dc1", |
|
|
|
|
|
|
|
Node: agent.config.NodeName, |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
var checks structs.HealthChecks |
|
|
|
|
|
|
|
if err := agent.RPC("Health.NodeChecks", &req, &checks); err != nil { |
|
|
|
|
|
|
|
t.Fatalf("err: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// We should have 4 services (serf included)
|
|
|
|
|
|
|
|
if len(checks) != 4 { |
|
|
|
|
|
|
|
t.Fatalf("bad: %v", checks) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// All the checks should match
|
|
|
|
|
|
|
|
for _, chk := range checks { |
|
|
|
|
|
|
|
switch chk.CheckID { |
|
|
|
|
|
|
|
case "mysql": |
|
|
|
|
|
|
|
if !reflect.DeepEqual(chk, chk1) { |
|
|
|
|
|
|
|
t.Fatalf("bad: %v %v", chk, chk1) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
case "redis": |
|
|
|
|
|
|
|
if !reflect.DeepEqual(chk, chk2) { |
|
|
|
|
|
|
|
t.Fatalf("bad: %v %v", chk, chk2) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
case "web": |
|
|
|
|
|
|
|
if !reflect.DeepEqual(chk, chk3) { |
|
|
|
|
|
|
|
t.Fatalf("bad: %v %v", chk, chk3) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
case "serfHealth": |
|
|
|
|
|
|
|
// ignore
|
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
t.Fatalf("unexpected check: %v", chk) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check the local state
|
|
|
|
|
|
|
|
if len(agent.state.checks) != 3 { |
|
|
|
|
|
|
|
t.Fatalf("bad: %v", agent.state.checks) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if len(agent.state.checkStatus) != 3 { |
|
|
|
|
|
|
|
t.Fatalf("bad: %v", agent.state.checkStatus) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
for name, status := range agent.state.checkStatus { |
|
|
|
|
|
|
|
if !status.inSync { |
|
|
|
|
|
|
|
t.Fatalf("should be in sync: %v %v", name, status) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|