Revision: Rename to 'maglevd'; Refactor config structure
This commit is contained in:
@@ -15,22 +15,31 @@ import (
|
||||
)
|
||||
|
||||
func makeTestChecker(ctx context.Context) *checker.Checker {
|
||||
cfg := &config.Frontend{
|
||||
HealthCheckNetns: "test",
|
||||
HealthChecker: config.HealthCheckerConfig{TransitionHistory: 5},
|
||||
VIPs: map[string]config.VIP{
|
||||
cfg := &config.Config{
|
||||
HealthChecker: config.HealthCheckerConfig{TransitionHistory: 5},
|
||||
HealthChecks: map[string]config.HealthCheck{
|
||||
"icmp": {
|
||||
Type: "icmp",
|
||||
Interval: time.Hour, // long interval: probes won't fire during tests
|
||||
Timeout: time.Second,
|
||||
Fall: 3,
|
||||
Rise: 2,
|
||||
},
|
||||
},
|
||||
Backends: map[string]config.Backend{
|
||||
"be0": {
|
||||
Address: net.ParseIP("10.0.0.2"),
|
||||
HealthCheck: "icmp",
|
||||
Enabled: true,
|
||||
Weight: 100,
|
||||
},
|
||||
},
|
||||
Frontends: map[string]config.Frontend{
|
||||
"web": {
|
||||
Address: net.ParseIP("192.0.2.1"),
|
||||
Protocol: "tcp",
|
||||
Port: 80,
|
||||
Backends: []net.IP{net.ParseIP("10.0.0.2")},
|
||||
HealthCheck: config.HealthCheck{
|
||||
Type: "icmp",
|
||||
Interval: time.Hour, // long interval: probes won't fire during tests
|
||||
Timeout: time.Second,
|
||||
Fall: 3,
|
||||
Rise: 2,
|
||||
},
|
||||
Backends: []string{"be0"},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -41,14 +50,14 @@ func makeTestChecker(ctx context.Context) *checker.Checker {
|
||||
return c
|
||||
}
|
||||
|
||||
func startTestServer(t *testing.T, c *checker.Checker) (HealthCheckerClient, func()) {
|
||||
func startTestServer(t *testing.T, c *checker.Checker) (MaglevClient, func()) {
|
||||
t.Helper()
|
||||
lis, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatalf("listen: %v", err)
|
||||
}
|
||||
srv := grpc.NewServer()
|
||||
RegisterHealthCheckerServer(srv, NewServer(c))
|
||||
RegisterMaglevServer(srv, NewServer(c))
|
||||
go srv.Serve(lis) //nolint:errcheck
|
||||
|
||||
conn, err := grpc.NewClient(lis.Addr().String(),
|
||||
@@ -56,13 +65,13 @@ func startTestServer(t *testing.T, c *checker.Checker) (HealthCheckerClient, fun
|
||||
if err != nil {
|
||||
t.Fatalf("dial: %v", err)
|
||||
}
|
||||
return NewHealthCheckerClient(conn), func() {
|
||||
return NewMaglevClient(conn), func() {
|
||||
conn.Close()
|
||||
srv.Stop()
|
||||
}
|
||||
}
|
||||
|
||||
func TestListVIPs(t *testing.T) {
|
||||
func TestListFrontends(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
@@ -70,16 +79,16 @@ func TestListVIPs(t *testing.T) {
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
resp, err := client.ListVIPs(ctx, &ListVIPsRequest{})
|
||||
resp, err := client.ListFrontends(ctx, &ListFrontendsRequest{})
|
||||
if err != nil {
|
||||
t.Fatalf("ListVIPs: %v", err)
|
||||
t.Fatalf("ListFrontends: %v", err)
|
||||
}
|
||||
if len(resp.VipNames) != 1 || resp.VipNames[0] != "web" {
|
||||
t.Errorf("ListVIPs: got %v, want [web]", resp.VipNames)
|
||||
if len(resp.FrontendNames) != 1 || resp.FrontendNames[0] != "web" {
|
||||
t.Errorf("ListFrontends: got %v, want [web]", resp.FrontendNames)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetVIP(t *testing.T) {
|
||||
func TestGetFrontend(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
@@ -87,19 +96,22 @@ func TestGetVIP(t *testing.T) {
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
info, err := client.GetVIP(ctx, &GetVIPRequest{VipName: "web"})
|
||||
info, err := client.GetFrontend(ctx, &GetFrontendRequest{Name:"web"})
|
||||
if err != nil {
|
||||
t.Fatalf("GetVIP: %v", err)
|
||||
t.Fatalf("GetFrontend: %v", err)
|
||||
}
|
||||
if info.Address != "192.0.2.1" {
|
||||
t.Errorf("GetVIP address: got %q, want 192.0.2.1", info.Address)
|
||||
t.Errorf("GetFrontend address: got %q, want 192.0.2.1", info.Address)
|
||||
}
|
||||
if info.Port != 80 {
|
||||
t.Errorf("GetVIP port: got %d, want 80", info.Port)
|
||||
t.Errorf("GetFrontend port: got %d, want 80", info.Port)
|
||||
}
|
||||
if len(info.BackendNames) != 1 || info.BackendNames[0] != "be0" {
|
||||
t.Errorf("GetFrontend backend_names: got %v, want [be0]", info.BackendNames)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetVIPNotFound(t *testing.T) {
|
||||
func TestGetFrontendNotFound(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
@@ -107,9 +119,26 @@ func TestGetVIPNotFound(t *testing.T) {
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
_, err := client.GetVIP(ctx, &GetVIPRequest{VipName: "nope"})
|
||||
_, err := client.GetFrontend(ctx, &GetFrontendRequest{Name:"nope"})
|
||||
if err == nil {
|
||||
t.Error("expected error for unknown VIP")
|
||||
t.Error("expected error for unknown frontend")
|
||||
}
|
||||
}
|
||||
|
||||
func TestListBackends(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
c := makeTestChecker(ctx)
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
resp, err := client.ListBackends(ctx, &ListBackendsRequest{})
|
||||
if err != nil {
|
||||
t.Fatalf("ListBackends: %v", err)
|
||||
}
|
||||
if len(resp.BackendNames) != 1 || resp.BackendNames[0] != "be0" {
|
||||
t.Errorf("ListBackends: got %v, want [be0]", resp.BackendNames)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,16 +150,36 @@ func TestGetBackend(t *testing.T) {
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
info, err := client.GetBackend(ctx, &GetBackendRequest{
|
||||
VipName: "web",
|
||||
BackendAddress: "10.0.0.2",
|
||||
})
|
||||
info, err := client.GetBackend(ctx, &GetBackendRequest{Name:"be0"})
|
||||
if err != nil {
|
||||
t.Fatalf("GetBackend: %v", err)
|
||||
}
|
||||
if info.State != health.StateUnknown.String() {
|
||||
t.Errorf("initial state: got %q, want unknown", info.State)
|
||||
}
|
||||
if !info.Enabled {
|
||||
t.Error("expected enabled=true")
|
||||
}
|
||||
if info.Weight != 100 {
|
||||
t.Errorf("weight: got %d, want 100", info.Weight)
|
||||
}
|
||||
if info.Healthcheck != "icmp" {
|
||||
t.Errorf("healthcheck: got %q, want icmp", info.Healthcheck)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetBackendNotFound(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
c := makeTestChecker(ctx)
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
_, err := client.GetBackend(ctx, &GetBackendRequest{Name:"nope"})
|
||||
if err == nil {
|
||||
t.Error("expected error for unknown backend")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPauseResumeBackend(t *testing.T) {
|
||||
@@ -141,10 +190,7 @@ func TestPauseResumeBackend(t *testing.T) {
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
info, err := client.PauseBackend(ctx, &PauseResumeRequest{
|
||||
VipName: "web",
|
||||
BackendAddress: "10.0.0.2",
|
||||
})
|
||||
info, err := client.PauseBackend(ctx, &PauseResumeRequest{Name:"be0"})
|
||||
if err != nil {
|
||||
t.Fatalf("PauseBackend: %v", err)
|
||||
}
|
||||
@@ -152,10 +198,7 @@ func TestPauseResumeBackend(t *testing.T) {
|
||||
t.Errorf("after pause: got %q, want paused", info.State)
|
||||
}
|
||||
|
||||
info, err = client.ResumeBackend(ctx, &PauseResumeRequest{
|
||||
VipName: "web",
|
||||
BackendAddress: "10.0.0.2",
|
||||
})
|
||||
info, err = client.ResumeBackend(ctx, &PauseResumeRequest{Name:"be0"})
|
||||
if err != nil {
|
||||
t.Fatalf("ResumeBackend: %v", err)
|
||||
}
|
||||
@@ -164,7 +207,7 @@ func TestPauseResumeBackend(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestWatchTransitions(t *testing.T) {
|
||||
func TestListHealthChecks(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
@@ -172,17 +215,68 @@ func TestWatchTransitions(t *testing.T) {
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
stream, err := client.WatchTransitions(ctx, &WatchRequest{})
|
||||
resp, err := client.ListHealthChecks(ctx, &ListHealthChecksRequest{})
|
||||
if err != nil {
|
||||
t.Fatalf("WatchTransitions: %v", err)
|
||||
t.Fatalf("ListHealthChecks: %v", err)
|
||||
}
|
||||
if len(resp.Names) != 1 || resp.Names[0] != "icmp" {
|
||||
t.Errorf("ListHealthChecks: got %v, want [icmp]", resp.Names)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetHealthCheck(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
c := makeTestChecker(ctx)
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
info, err := client.GetHealthCheck(ctx, &GetHealthCheckRequest{Name: "icmp"})
|
||||
if err != nil {
|
||||
t.Fatalf("GetHealthCheck: %v", err)
|
||||
}
|
||||
if info.Type != "icmp" {
|
||||
t.Errorf("type: got %q, want icmp", info.Type)
|
||||
}
|
||||
if info.Fall != 3 || info.Rise != 2 {
|
||||
t.Errorf("fall/rise: got %d/%d, want 3/2", info.Fall, info.Rise)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetHealthCheckNotFound(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
c := makeTestChecker(ctx)
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
_, err := client.GetHealthCheck(ctx, &GetHealthCheckRequest{Name: "nope"})
|
||||
if err == nil {
|
||||
t.Error("expected error for unknown healthcheck")
|
||||
}
|
||||
}
|
||||
|
||||
func TestWatchBackendEvents(t *testing.T) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
c := makeTestChecker(ctx)
|
||||
client, cleanup := startTestServer(t, c)
|
||||
defer cleanup()
|
||||
|
||||
stream, err := client.WatchBackendEvents(ctx, &WatchRequest{})
|
||||
if err != nil {
|
||||
t.Fatalf("WatchBackendEvents: %v", err)
|
||||
}
|
||||
|
||||
// Should receive the current state for web:10.0.0.2 immediately.
|
||||
// Should receive the current state for be0 immediately.
|
||||
ev, err := stream.Recv()
|
||||
if err != nil {
|
||||
t.Fatalf("Recv: %v", err)
|
||||
}
|
||||
if ev.VipName != "web" || ev.BackendAddress != "10.0.0.2" {
|
||||
t.Errorf("initial event: vip=%q backend=%q", ev.VipName, ev.BackendAddress)
|
||||
if ev.BackendName != "be0" {
|
||||
t.Errorf("initial event: backend=%q, want be0", ev.BackendName)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user