diff --git a/backend/routers/backend.py b/backend/routers/backend.py index de19d70..3463bc4 100644 --- a/backend/routers/backend.py +++ b/backend/routers/backend.py @@ -193,10 +193,13 @@ async def get_backends(cluster_id: Optional[int] = None, include_inactive: bool ``` ## Load Balancing Methods - - **roundrobin**: Each server used in turn + - **roundrobin**: Each server used in turn (default) - **leastconn**: Server with least connections - **source**: Based on source IP hash - **uri**: Based on URI hash + - **static-rr**: Static round-robin (no dynamic weight) + - **random**: Random server selection (HAProxy 1.9+) + - **first**: First server with available slots """ try: conn = await get_database_connection() diff --git a/backend/utils/haproxy_config_parser.py b/backend/utils/haproxy_config_parser.py index 48b7e52..f5be3cb 100644 --- a/backend/utils/haproxy_config_parser.py +++ b/backend/utils/haproxy_config_parser.py @@ -563,10 +563,35 @@ class HAProxyConfigParser: if mode_match: backend.mode = mode_match.group(1).lower() - # Parse balance method + # Parse balance method with validation balance_match = re.match(r'^balance\s+(\S+)', line, re.IGNORECASE) if balance_match: - backend.balance_method = balance_match.group(1) + balance_value = balance_match.group(1).lower() + + # HAProxy supported balance algorithms + supported_balance_methods = [ + 'roundrobin', # Each server used in turn + 'static-rr', # Static round-robin (no dynamic weight) + 'leastconn', # Server with least connections + 'first', # First server with available slots + 'source', # Based on source IP hash + 'uri', # Based on URI hash + 'url_param', # Based on URL parameter + 'hdr', # Based on HTTP header + 'random', # Random server selection (HAProxy 1.9+) + 'rdp-cookie', # Based on RDP cookie + ] + + if balance_value in supported_balance_methods: + backend.balance_method = balance_value + else: + # Unknown balance method - use default and warn + self.warnings.append( + f"Backend '{name}': Unknown balance method '{balance_value}' detected. " + f"Supported methods: {', '.join(supported_balance_methods)}. " + f"Using default 'roundrobin' instead." + ) + backend.balance_method = 'roundrobin' # Parse timeout directives timeout_connect_match = re.match(r'^timeout\s+connect\s+(\d+)(ms|s|m|h)?', line, re.IGNORECASE) diff --git a/frontend/src/components/BackendServers.js b/frontend/src/components/BackendServers.js index 2288a2e..4675be3 100644 --- a/frontend/src/components/BackendServers.js +++ b/frontend/src/components/BackendServers.js @@ -1614,6 +1614,8 @@ const BackendServers = () => { + +