@@ -3051,3 +3051,104 @@ func TestQueueBackoffProperties(t *testing.T) {
30513051 assert .Equal (t , uint64 (0 ), leaf3 .GetMaxAppUnschedAskBackoff ())
30523052 assert .Equal (t , 30 * time .Second , leaf3 .GetBackoffDelay ())
30533053}
3054+
3055+ func TestGetSchedulingOrder (t * testing.T ) {
3056+ // create the root
3057+ root , err := createRootQueue (nil )
3058+ root .sortType = policies .FifoSortPolicy
3059+ assert .NilError (t , err , "queue create failed" )
3060+
3061+ // setup queue hierarchy
3062+ parent1 , err := createManagedQueue (root , "parent1" , true , nil )
3063+ parent1 .sortType = policies .FifoSortPolicy
3064+ assert .NilError (t , err , "failed to create parent1 queue" )
3065+ parent2 , err := createManagedQueue (root , "parent2" , true , nil )
3066+ assert .NilError (t , err , "failed to create parent2 queue" )
3067+
3068+ leaf1 , err := createManagedQueue (parent1 , "leaf1" , false , nil )
3069+ assert .NilError (t , err , "failed to create leaf1 queue" )
3070+ leaf2 , err := createManagedQueue (parent1 , "leaf2" , false , nil )
3071+ assert .NilError (t , err , "failed to create leaf2 queue" )
3072+ leaf3 , err := createManagedQueue (parent2 , "leaf3" , false , nil )
3073+ assert .NilError (t , err , "failed to create leaf3 queue" )
3074+
3075+ // resource for asks
3076+ res , err := resources .NewResourceFromConf (map [string ]string {"first" : "1" })
3077+ assert .NilError (t , err , "failed to create basic resource" )
3078+
3079+ // App1 in leaf1 with pending resources
3080+ app1 := newApplication ("app1" , "default" , leaf1 .QueuePath )
3081+ app1 .queue = leaf1
3082+ leaf1 .AddApplication (app1 )
3083+ err = app1 .AddAllocationAsk (newAllocationAsk ("alloc-1" , "app1" , res ))
3084+ assert .NilError (t , err , "failed to add allocation ask to app1" )
3085+ leaf1 .incPendingResource (res )
3086+
3087+ // App2 in leaf1 with no pending resources
3088+ app2 := newApplication ("app2" , "default" , leaf1 .QueuePath )
3089+ app2 .queue = leaf1
3090+ leaf1 .AddApplication (app2 )
3091+
3092+ // App3 in leaf2 with pending resources
3093+ app3 := newApplication ("app3" , "default" , leaf2 .QueuePath )
3094+ app3 .queue = leaf2
3095+ leaf2 .AddApplication (app3 )
3096+ err = app3 .AddAllocationAsk (newAllocationAsk ("alloc-3" , "app3" , res ))
3097+ assert .NilError (t , err , "failed to add allocation ask to app3" )
3098+ leaf2 .incPendingResource (res )
3099+
3100+ // App4 in leaf3 with pending resources, but cannot run
3101+ app4 := newApplication ("app4" , "default" , leaf3 .QueuePath )
3102+ app4 .queue = leaf3
3103+ leaf3 .AddApplication (app4 )
3104+ err = app4 .AddAllocationAsk (newAllocationAsk ("alloc-4" , "app4" , res ))
3105+ assert .NilError (t , err , "failed to add allocation ask to app4" )
3106+ leaf3 .incPendingResource (res )
3107+ // Make app4 not runnable by setting queue to full
3108+ leaf3 .maxRunningApps = 1
3109+ leaf3 .runningApps = 1
3110+
3111+ // Get scheduling order from root
3112+ order := root .GetSchedulingOrder ()
3113+
3114+ // Expected order based on FIFO:
3115+ // 1. parent1 -> leaf1 (app1)
3116+ // 2. parent1 -> leaf2 (app3)
3117+ // 3. parent2 -> leaf3 (no apps, because app4 is not runnable but queue has pending)
3118+ assert .Equal (t , len (order ), 3 , "incorrect number of scheduling order entries" )
3119+
3120+ // Entry 1: leaf1
3121+ assert .Equal (t , order [0 ].QueueName , "root.parent1.leaf1" )
3122+ assert .Equal (t , len (order [0 ].ApplicationIDs ), 1 , "leaf1 should have one app" )
3123+ assert .Equal (t , order [0 ].ApplicationIDs [0 ], "app1" )
3124+
3125+ // Entry 2: leaf2
3126+ assert .Equal (t , order [1 ].QueueName , "root.parent1.leaf2" )
3127+ assert .Equal (t , len (order [1 ].ApplicationIDs ), 1 , "leaf2 should have one app" )
3128+ assert .Equal (t , order [1 ].ApplicationIDs [0 ], "app3" )
3129+
3130+ // Entry 3: leaf3
3131+ assert .Equal (t , order [2 ].QueueName , "root.parent2.leaf3" )
3132+ assert .Equal (t , len (order [2 ].ApplicationIDs ), 0 , "leaf3 should have no runnable apps" )
3133+
3134+ // Test a leaf queue directly
3135+ order = leaf1 .GetSchedulingOrder ()
3136+ assert .Equal (t , len (order ), 1 , "direct call on leaf1 failed" )
3137+ assert .Equal (t , order [0 ].QueueName , "root.parent1.leaf1" )
3138+ assert .Equal (t , len (order [0 ].ApplicationIDs ), 1 )
3139+ assert .Equal (t , order [0 ].ApplicationIDs [0 ], "app1" )
3140+
3141+ // Test a leaf queue with no pending resources
3142+ leaf4 , err := createManagedQueue (parent2 , "leaf4" , false , nil )
3143+ assert .NilError (t , err , "failed to create leaf4" )
3144+ order = leaf4 .GetSchedulingOrder ()
3145+ assert .Equal (t , len (order ), 0 , "leaf queue with no pending resources should return nil/empty" )
3146+
3147+ // Test a parent with no pending children
3148+ parent3 , err := createManagedQueue (root , "parent3" , true , nil )
3149+ assert .NilError (t , err , "failed to create parent3" )
3150+ _ , err = createManagedQueue (parent3 , "leaf5" , false , nil )
3151+ assert .NilError (t , err , "failed to create leaf5" )
3152+ order = parent3 .GetSchedulingOrder ()
3153+ assert .Equal (t , len (order ), 0 , "parent with no pending children should return empty" )
3154+ }
0 commit comments