@@ -332,3 +332,54 @@ def test_process_running_benches_on_server(self, mock_get):
332332 self .assertEqual (
333333 len (agent_job_created ), 1
334334 ) # Benches marked as archived, so agent job should be created to force remove zombie benches
335+
336+ def test_server_with_more_memory_is_shortlisted_for_new_benches_and_incident_created_against_shortlisted_server_with_insufficient_memory (
337+ self ,
338+ ):
339+ """The server with higher available memory must be selected (use_for_new_benches=1)."""
340+ from press .press .doctype .cluster .test_cluster import create_test_cluster
341+ from press .press .doctype .incident .incident import Incident
342+ from press .press .doctype .server .server import _refresh_bench_pool_and_raise_capacity_incidents
343+
344+ self .cluster = create_test_cluster ("Default" , public = True )
345+ # Two servers in the same cluster with different memory levels
346+ self .low_mem_server = create_test_server (cluster = self .cluster .name , public = True )
347+ self .high_mem_server = create_test_server (cluster = self .cluster .name , public = True )
348+
349+ memory_map = {
350+ self .low_mem_server .name : 200 * 1024 * 1024 , # 200 MiB
351+ self .high_mem_server .name : 500 * 1024 * 1024 , # 500 MiB
352+ }
353+
354+ _refresh_bench_pool_and_raise_capacity_incidents (
355+ server_names = [self .low_mem_server .name , self .high_mem_server .name ],
356+ servers_by_cluster = {self .cluster .name : [self .low_mem_server .name , self .high_mem_server .name ]},
357+ memory_map = memory_map ,
358+ )
359+
360+ self .assertEqual (frappe .db .get_value ("Server" , self .high_mem_server .name , "use_for_new_benches" ), 1 )
361+ self .assertEqual (frappe .db .get_value ("Server" , self .low_mem_server .name , "use_for_new_benches" ), 0 )
362+
363+ # Set both servers below threshold; high_mem_server is still the best candidate
364+ memory_map = {
365+ self .low_mem_server .name : 50 * 1024 * 1024 , # 50 MiB
366+ self .high_mem_server .name : 100 * 1024 * 1024 , # 100 MiB — best, but still < 300 MiB
367+ }
368+
369+ with patch .object (Incident , "after_insert" , new = Mock ()):
370+ _refresh_bench_pool_and_raise_capacity_incidents (
371+ server_names = [self .low_mem_server .name , self .high_mem_server .name ],
372+ servers_by_cluster = {self .cluster .name : [self .low_mem_server .name , self .high_mem_server .name ]},
373+ memory_map = memory_map ,
374+ )
375+
376+ incidents = frappe .get_all (
377+ "Incident" ,
378+ {
379+ "cluster" : self .cluster .name ,
380+ "subject" : f"Insufficient bench capacity in cluster { self .cluster .name } " ,
381+ },
382+ ["name" , "server" ],
383+ )
384+ self .assertEqual (len (incidents ), 1 )
385+ self .assertEqual (incidents [0 ].server , self .high_mem_server .name )
0 commit comments