Skip to content

Commit 0ec2ed1

Browse files
authored
feat: Add server registration and unregistration events (minekube#593)
1 parent 809a799 commit 0ec2ed1

3 files changed

Lines changed: 189 additions & 0 deletions

File tree

pkg/edition/java/proxy/events.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,3 +1330,37 @@ func (e *CookieRequestEvent) Allowed() bool { return !e.denied }
13301330

13311331
// SetAllowed sets whether the cookie request is allowed to be forwarded to the client.
13321332
func (e *CookieRequestEvent) SetAllowed(allowed bool) { e.denied = !allowed }
1333+
1334+
//
1335+
//
1336+
//
1337+
//
1338+
//
1339+
1340+
// ServerRegisteredEvent is fired when a backend server is registered with the proxy.
1341+
// This allows plugins to react to dynamically added servers and perform necessary setup.
1342+
type ServerRegisteredEvent struct {
1343+
server RegisteredServer
1344+
}
1345+
1346+
// Server returns the server that was registered.
1347+
func (e *ServerRegisteredEvent) Server() RegisteredServer {
1348+
return e.server
1349+
}
1350+
1351+
//
1352+
//
1353+
//
1354+
//
1355+
//
1356+
1357+
// ServerUnregisteredEvent is fired when a backend server is unregistered from the proxy.
1358+
// This allows plugins to react to removed servers and perform necessary cleanup.
1359+
type ServerUnregisteredEvent struct {
1360+
server ServerInfo
1361+
}
1362+
1363+
// ServerInfo returns the server info of the server that was unregistered.
1364+
func (e *ServerUnregisteredEvent) ServerInfo() ServerInfo {
1365+
return e.server
1366+
}

pkg/edition/java/proxy/proxy.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,10 @@ func (p *Proxy) Register(info ServerInfo) (RegisteredServer, error) {
490490
// so they won't be unregistered during config reloads
491491

492492
p.log.Info("registered new server", "name", info.Name(), "addr", info.Addr())
493+
494+
// Fire ServerRegisteredEvent
495+
p.event.Fire(&ServerRegisteredEvent{server: rs})
496+
493497
return rs, nil
494498
}
495499

@@ -511,6 +515,10 @@ func (p *Proxy) Unregister(info ServerInfo) bool {
511515

512516
p.log.Info("unregistered backend server",
513517
"name", info.Name(), "addr", info.Addr())
518+
519+
// Fire ServerUnregisteredEvent
520+
p.event.Fire(&ServerUnregisteredEvent{server: info})
521+
514522
return true
515523
}
516524

pkg/edition/java/proxy/server_sync_test.go

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,150 @@ func TestServerInfoEqual(t *testing.T) {
328328
})
329329
}
330330
}
331+
332+
// TestServerRegistrationEvents tests that ServerRegisteredEvent and ServerUnregisteredEvent
333+
// are fired when servers are registered and unregistered.
334+
func TestServerRegistrationEvents(t *testing.T) {
335+
eventMgr := event.New()
336+
337+
// Track events
338+
var registeredServers []string
339+
var unregisteredServers []string
340+
341+
// Subscribe to ServerRegisteredEvent
342+
event.Subscribe(eventMgr, 0, func(e *ServerRegisteredEvent) {
343+
registeredServers = append(registeredServers, e.Server().ServerInfo().Name())
344+
})
345+
346+
// Subscribe to ServerUnregisteredEvent
347+
event.Subscribe(eventMgr, 0, func(e *ServerUnregisteredEvent) {
348+
unregisteredServers = append(unregisteredServers, e.ServerInfo().Name())
349+
})
350+
351+
// Create proxy with event manager
352+
cfg := &config.Config{
353+
Servers: map[string]string{},
354+
Lite: liteconfig.Config{Enabled: false},
355+
}
356+
357+
authenticator, err := auth.New(auth.Options{})
358+
if err != nil {
359+
t.Fatalf("Failed to create authenticator: %v", err)
360+
}
361+
362+
proxy := &Proxy{
363+
log: logr.Discard(),
364+
cfg: cfg,
365+
event: eventMgr,
366+
servers: make(map[string]*registeredServer),
367+
configServers: make(map[string]bool),
368+
authenticator: authenticator,
369+
}
370+
371+
// Register a server
372+
serverInfo := NewServerInfo("test-server", mustParseAddr("localhost:25565"))
373+
_, err = proxy.Register(serverInfo)
374+
if err != nil {
375+
t.Fatalf("Failed to register server: %v", err)
376+
}
377+
378+
// Wait for event to process
379+
eventMgr.Wait()
380+
381+
// Verify ServerRegisteredEvent was fired
382+
if len(registeredServers) != 1 {
383+
t.Errorf("Expected 1 registered event, got %d", len(registeredServers))
384+
}
385+
if len(registeredServers) > 0 && registeredServers[0] != "test-server" {
386+
t.Errorf("Expected registered server to be 'test-server', got '%s'", registeredServers[0])
387+
}
388+
389+
// Unregister the server
390+
if !proxy.Unregister(serverInfo) {
391+
t.Fatal("Failed to unregister server")
392+
}
393+
394+
// Wait for event to process
395+
eventMgr.Wait()
396+
397+
// Verify ServerUnregisteredEvent was fired
398+
if len(unregisteredServers) != 1 {
399+
t.Errorf("Expected 1 unregistered event, got %d", len(unregisteredServers))
400+
}
401+
if len(unregisteredServers) > 0 && unregisteredServers[0] != "test-server" {
402+
t.Errorf("Expected unregistered server to be 'test-server', got '%s'", unregisteredServers[0])
403+
}
404+
}
405+
406+
// TestServerRegistrationEventsMultiple tests that events are fired for multiple server operations
407+
func TestServerRegistrationEventsMultiple(t *testing.T) {
408+
eventMgr := event.New()
409+
410+
// Track events
411+
registeredCount := 0
412+
unregisteredCount := 0
413+
414+
// Subscribe to events
415+
event.Subscribe(eventMgr, 0, func(e *ServerRegisteredEvent) {
416+
registeredCount++
417+
})
418+
419+
event.Subscribe(eventMgr, 0, func(e *ServerUnregisteredEvent) {
420+
unregisteredCount++
421+
})
422+
423+
// Create proxy with event manager
424+
cfg := &config.Config{
425+
Servers: map[string]string{},
426+
Lite: liteconfig.Config{Enabled: false},
427+
}
428+
429+
authenticator, err := auth.New(auth.Options{})
430+
if err != nil {
431+
t.Fatalf("Failed to create authenticator: %v", err)
432+
}
433+
434+
proxy := &Proxy{
435+
log: logr.Discard(),
436+
cfg: cfg,
437+
event: eventMgr,
438+
servers: make(map[string]*registeredServer),
439+
configServers: make(map[string]bool),
440+
authenticator: authenticator,
441+
}
442+
443+
// Register multiple servers
444+
servers := []ServerInfo{
445+
NewServerInfo("server1", mustParseAddr("localhost:25565")),
446+
NewServerInfo("server2", mustParseAddr("localhost:25566")),
447+
NewServerInfo("server3", mustParseAddr("localhost:25567")),
448+
}
449+
450+
for _, s := range servers {
451+
_, err := proxy.Register(s)
452+
if err != nil {
453+
t.Fatalf("Failed to register server %s: %v", s.Name(), err)
454+
}
455+
}
456+
457+
eventMgr.Wait()
458+
459+
// Verify all registration events were fired
460+
if registeredCount != 3 {
461+
t.Errorf("Expected 3 registered events, got %d", registeredCount)
462+
}
463+
464+
// Unregister all servers
465+
for _, s := range servers {
466+
if !proxy.Unregister(s) {
467+
t.Errorf("Failed to unregister server %s", s.Name())
468+
}
469+
}
470+
471+
eventMgr.Wait()
472+
473+
// Verify all unregistration events were fired
474+
if unregisteredCount != 3 {
475+
t.Errorf("Expected 3 unregistered events, got %d", unregisteredCount)
476+
}
477+
}

0 commit comments

Comments
 (0)