Skip to content

Commit 6fc973a

Browse files
committed
Integrate session manager in router
Signed-off-by: VanderChen <vanderchen@outlook.com>
1 parent 0cd7d1a commit 6fc973a

File tree

10 files changed

+385
-1272
lines changed

10 files changed

+385
-1272
lines changed

cmd/router/main.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,10 @@ func main() {
5252
log.Fatalf("Failed to create Router API server: %v", err)
5353
}
5454

55-
// Setup signal handling
56-
ctx, cancel := context.WithCancel(context.Background())
55+
// Setup signal handling with context cancellation
56+
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
5757
defer cancel()
5858

59-
sigCh := make(chan os.Signal, 1)
60-
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
61-
6259
// Start Router API server in goroutine
6360
errCh := make(chan error, 1)
6461
go func() {
@@ -70,10 +67,10 @@ func main() {
7067

7168
// Wait for signal or error
7269
select {
73-
case <-sigCh:
70+
case <-ctx.Done():
7471
log.Println("Received shutdown signal, shutting down gracefully...")
75-
cancel()
76-
time.Sleep(2 * time.Second) // Give server time to shutdown gracefully
72+
// Wait for server to finish shutting down
73+
time.Sleep(2 * time.Second)
7774
case err := <-errCh:
7875
log.Fatalf("Server error: %v", err)
7976
}

pkg/router/apiserver.go

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ import (
55
"fmt"
66
"log"
77
"net/http"
8+
"os"
89
"time"
910

1011
"github.com/gin-gonic/gin"
12+
redisv9 "github.com/redis/go-redis/v9"
13+
"github.com/volcano-sh/agentcube/pkg/redis"
1114
)
1215

1316
// Server is the main structure for Router apiserver
@@ -16,8 +19,26 @@ type Server struct {
1619
engine *gin.Engine
1720
httpServer *http.Server
1821
sessionManager SessionManager
19-
redisManager RedisManager
20-
semaphore chan struct{} // For limiting concurrent requests
22+
redisClient redis.Client
23+
semaphore chan struct{} // For limiting concurrent requests
24+
httpTransport *http.Transport // Reusable HTTP transport for connection pooling
25+
}
26+
27+
// makeRedisOptions creates redis options from environment variables
28+
func makeRedisOptions() (*redisv9.Options, error) {
29+
redisAddr := os.Getenv("REDIS_ADDR")
30+
if redisAddr == "" {
31+
return nil, fmt.Errorf("missing env var REDIS_ADDR")
32+
}
33+
redisPassword := os.Getenv("REDIS_PASSWORD")
34+
if redisPassword == "" {
35+
return nil, fmt.Errorf("missing env var REDIS_PASSWORD")
36+
}
37+
redisOptions := &redisv9.Options{
38+
Addr: redisAddr,
39+
Password: redisPassword,
40+
}
41+
return redisOptions, nil
2142
}
2243

2344
// NewServer creates a new Router API server instance
@@ -43,11 +64,18 @@ func NewServer(config *Config) (*Server, error) {
4364
config.SessionExpireDuration = 3600 // Default 1 hour
4465
}
4566

46-
// Create session manager (using mock implementation)
47-
sessionManager := NewMockSessionManager(config.SandboxEndpoints)
67+
// Initialize Redis client
68+
redisOptions, err := makeRedisOptions()
69+
if err != nil {
70+
return nil, fmt.Errorf("make redis options failed: %w", err)
71+
}
72+
redisClient := redis.NewClient(redisOptions)
4873

49-
// Create Redis manager (using mock implementation)
50-
redisManager := NewMockRedisManager(config.EnableRedis)
74+
// Create session manager with redis client
75+
sessionManager, err := NewSessionManager(redisClient)
76+
if err != nil {
77+
return nil, fmt.Errorf("failed to create session manager: %w", err)
78+
}
5179

5280
// Set Gin mode based on environment
5381
if config.Debug {
@@ -56,11 +84,21 @@ func NewServer(config *Config) (*Server, error) {
5684
gin.SetMode(gin.ReleaseMode)
5785
}
5886

87+
// Create a reusable HTTP transport for connection pooling
88+
httpTransport := &http.Transport{
89+
MaxIdleConns: config.MaxIdleConns,
90+
MaxIdleConnsPerHost: config.MaxConnsPerHost,
91+
IdleConnTimeout: 90 * time.Second,
92+
DisableCompression: false,
93+
ForceAttemptHTTP2: true,
94+
}
95+
5996
server := &Server{
6097
config: config,
6198
sessionManager: sessionManager,
62-
redisManager: redisManager,
99+
redisClient: redisClient,
63100
semaphore: make(chan struct{}, config.MaxConcurrentRequests),
101+
httpTransport: httpTransport,
64102
}
65103

66104
// Setup routes

pkg/router/apiserver_test.go

Lines changed: 83 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,22 @@ package router
22

33
import (
44
"context"
5+
"os"
56
"testing"
67
"time"
78
)
89

910
func TestNewServer(t *testing.T) {
11+
// Set required environment variables for tests
12+
os.Setenv("REDIS_ADDR", "localhost:6379")
13+
os.Setenv("REDIS_PASSWORD", "test-password")
14+
os.Setenv("WORKLOAD_MGR_URL", "http://localhost:8080")
15+
defer func() {
16+
os.Unsetenv("REDIS_ADDR")
17+
os.Unsetenv("REDIS_PASSWORD")
18+
os.Unsetenv("WORKLOAD_MGR_URL")
19+
}()
20+
1021
tests := []struct {
1122
name string
1223
config *Config
@@ -76,9 +87,9 @@ func TestNewServer(t *testing.T) {
7687
t.Error("Session manager was not created")
7788
}
7889

79-
// Verify redis manager was created
80-
if server.redisManager == nil {
81-
t.Error("Redis manager was not created")
90+
// Verify redis client was created
91+
if server.redisClient == nil {
92+
t.Error("Redis client was not created")
8293
}
8394

8495
// Verify semaphore was created with correct capacity
@@ -112,6 +123,16 @@ func TestNewServer(t *testing.T) {
112123
}
113124

114125
func TestServer_DefaultValues(t *testing.T) {
126+
// Set required environment variables for tests
127+
os.Setenv("REDIS_ADDR", "localhost:6379")
128+
os.Setenv("REDIS_PASSWORD", "test-password")
129+
os.Setenv("WORKLOAD_MGR_URL", "http://localhost:8080")
130+
defer func() {
131+
os.Unsetenv("REDIS_ADDR")
132+
os.Unsetenv("REDIS_PASSWORD")
133+
os.Unsetenv("WORKLOAD_MGR_URL")
134+
}()
135+
115136
config := &Config{
116137
Port: "8080",
117138
// Leave other values as zero to test defaults
@@ -145,6 +166,16 @@ func TestServer_DefaultValues(t *testing.T) {
145166
}
146167

147168
func TestServer_ConcurrencyLimitMiddleware(t *testing.T) {
169+
// Set required environment variables for tests
170+
os.Setenv("REDIS_ADDR", "localhost:6379")
171+
os.Setenv("REDIS_PASSWORD", "test-password")
172+
os.Setenv("WORKLOAD_MGR_URL", "http://localhost:8080")
173+
defer func() {
174+
os.Unsetenv("REDIS_ADDR")
175+
os.Unsetenv("REDIS_PASSWORD")
176+
os.Unsetenv("WORKLOAD_MGR_URL")
177+
}()
178+
148179
config := &Config{
149180
Port: "8080",
150181
MaxConcurrentRequests: 2, // Small limit for testing
@@ -168,6 +199,16 @@ func TestServer_ConcurrencyLimitMiddleware(t *testing.T) {
168199
}
169200

170201
func TestServer_SetupRoutes(t *testing.T) {
202+
// Set required environment variables for tests
203+
os.Setenv("REDIS_ADDR", "localhost:6379")
204+
os.Setenv("REDIS_PASSWORD", "test-password")
205+
os.Setenv("WORKLOAD_MGR_URL", "http://localhost:8080")
206+
defer func() {
207+
os.Unsetenv("REDIS_ADDR")
208+
os.Unsetenv("REDIS_PASSWORD")
209+
os.Unsetenv("WORKLOAD_MGR_URL")
210+
}()
211+
171212
config := &Config{
172213
Port: "8080",
173214
}
@@ -187,6 +228,16 @@ func TestServer_SetupRoutes(t *testing.T) {
187228
}
188229

189230
func TestServer_StartContext(t *testing.T) {
231+
// Set required environment variables for tests
232+
os.Setenv("REDIS_ADDR", "localhost:6379")
233+
os.Setenv("REDIS_PASSWORD", "test-password")
234+
os.Setenv("WORKLOAD_MGR_URL", "http://localhost:8080")
235+
defer func() {
236+
os.Unsetenv("REDIS_ADDR")
237+
os.Unsetenv("REDIS_PASSWORD")
238+
os.Unsetenv("WORKLOAD_MGR_URL")
239+
}()
240+
190241
config := &Config{
191242
Port: "0", // Use port 0 to let the OS assign a free port
192243
}
@@ -225,6 +276,16 @@ func TestServer_StartContext(t *testing.T) {
225276
}
226277

227278
func TestServer_TLSConfiguration(t *testing.T) {
279+
// Set required environment variables for tests
280+
os.Setenv("REDIS_ADDR", "localhost:6379")
281+
os.Setenv("REDIS_PASSWORD", "test-password")
282+
os.Setenv("WORKLOAD_MGR_URL", "http://localhost:8080")
283+
defer func() {
284+
os.Unsetenv("REDIS_ADDR")
285+
os.Unsetenv("REDIS_PASSWORD")
286+
os.Unsetenv("WORKLOAD_MGR_URL")
287+
}()
288+
228289
tests := []struct {
229290
name string
230291
config *Config
@@ -294,50 +355,27 @@ func TestServer_TLSConfiguration(t *testing.T) {
294355
}
295356

296357
func TestServer_RedisIntegration(t *testing.T) {
297-
tests := []struct {
298-
name string
299-
enableRedis bool
300-
}{
301-
{
302-
name: "Redis enabled",
303-
enableRedis: true,
304-
},
305-
{
306-
name: "Redis disabled",
307-
enableRedis: false,
308-
},
309-
}
310-
311-
for _, tt := range tests {
312-
t.Run(tt.name, func(t *testing.T) {
313-
config := &Config{
314-
Port: "8080",
315-
EnableRedis: tt.enableRedis,
316-
}
358+
// Set required environment variables for tests
359+
os.Setenv("REDIS_ADDR", "localhost:6379")
360+
os.Setenv("REDIS_PASSWORD", "test-password")
361+
os.Setenv("WORKLOAD_MGR_URL", "http://localhost:8080")
362+
defer func() {
363+
os.Unsetenv("REDIS_ADDR")
364+
os.Unsetenv("REDIS_PASSWORD")
365+
os.Unsetenv("WORKLOAD_MGR_URL")
366+
}()
317367

318-
server, err := NewServer(config)
319-
if err != nil {
320-
t.Fatalf("Failed to create server: %v", err)
321-
}
368+
config := &Config{
369+
Port: "8080",
370+
}
322371

323-
// Verify Redis manager was created
324-
if server.redisManager == nil {
325-
t.Error("Redis manager was not created")
326-
}
372+
server, err := NewServer(config)
373+
if err != nil {
374+
t.Fatalf("Failed to create server: %v", err)
375+
}
327376

328-
// Test Redis manager functionality based on enabled state
329-
err = server.redisManager.UpdateSessionActivity("test-session")
330-
if tt.enableRedis {
331-
if err != nil {
332-
t.Errorf("Expected no error when Redis is enabled, got: %v", err)
333-
}
334-
} else {
335-
// When disabled, UpdateSessionActivity should not return an error
336-
// (it silently skips)
337-
if err != nil {
338-
t.Errorf("Expected no error when Redis is disabled, got: %v", err)
339-
}
340-
}
341-
})
377+
// Verify Redis client was created
378+
if server.redisClient == nil {
379+
t.Error("Redis client was not created")
342380
}
343381
}

0 commit comments

Comments
 (0)