@@ -3596,3 +3596,57 @@ func TestTryPlaceHolderAllocateDifferentNodes(t *testing.T) {
3596
3596
// placeholder data remains unchanged until RM confirms the replacement
3597
3597
assertPlaceholderData (t , app , tg1 , 1 , 0 , 0 , res )
3598
3598
}
3599
+
3600
+ func TestTryNodesNoReserve (t * testing.T ) {
3601
+ app := newApplication (appID0 , "default" , "root.default" )
3602
+
3603
+ queue , err := createRootQueue (map [string ]string {"first" : "5" })
3604
+ assert .NilError (t , err , "queue create failed" )
3605
+ app .queue = queue
3606
+
3607
+ res := resources .NewResourceFromMap (map [string ]resources.Quantity {"first" : 5 })
3608
+ ask := newAllocationAsk (aKey , appID0 , res )
3609
+ err = app .AddAllocationAsk (ask )
3610
+ assert .NilError (t , err , "ask should have been added to app" )
3611
+
3612
+ // reserve the allocation on node1
3613
+ node1 := newNode (nodeID1 , map [string ]resources.Quantity {"first" : 5 })
3614
+ err = app .Reserve (node1 , ask )
3615
+ assert .NilError (t , err , "reservation failed" )
3616
+
3617
+ // case 1: node is the reserved node
3618
+ iterator := getNodeIteratorFn (node1 )
3619
+ result := app .tryNodesNoReserve (ask , iterator (), node1 .NodeID )
3620
+ assert .Assert (t , result == nil , "result should be nil since node1 is the reserved node" )
3621
+
3622
+ // case 2: node is unschedulable
3623
+ node2 := newNode (nodeID2 , map [string ]resources.Quantity {"first" : 5 })
3624
+ node2 .schedulable = false
3625
+ iterator = getNodeIteratorFn (node2 )
3626
+ result = app .tryNodesNoReserve (ask , iterator (), node1 .NodeID )
3627
+ assert .Assert (t , result == nil , "result should be nil since node2 is unschedulable" )
3628
+
3629
+ // case 3: node does not have enough resources
3630
+ node3 := newNode (nodeID3 , map [string ]resources.Quantity {"first" : 1 })
3631
+ iterator = getNodeIteratorFn (node3 )
3632
+ result = app .tryNodesNoReserve (ask , iterator (), node1 .NodeID )
3633
+ assert .Assert (t , result == nil , "result should be nil since node3 does not have enough resources" )
3634
+
3635
+ // case 4: node fails predicate
3636
+ mockPlugin := mockCommon .NewPredicatePlugin (false , map [string ]int {nodeID4 : 1 })
3637
+ plugins .RegisterSchedulerPlugin (mockPlugin )
3638
+ defer plugins .UnregisterSchedulerPlugins ()
3639
+ node4 := newNode (nodeID4 , map [string ]resources.Quantity {"first" : 5 })
3640
+ iterator = getNodeIteratorFn (node4 )
3641
+ result = app .tryNodesNoReserve (ask , iterator (), node1 .NodeID )
3642
+ assert .Assert (t , result == nil , "result should be nil since node4 fails predicate" )
3643
+
3644
+ // case 5: success
3645
+ node5 := newNode (nodeID5 , map [string ]resources.Quantity {"first" : 5 })
3646
+ iterator = getNodeIteratorFn (node5 )
3647
+ result = app .tryNodesNoReserve (ask , iterator (), node1 .NodeID )
3648
+ assert .Assert (t , result != nil , "result should not be nil" )
3649
+ assert .Equal (t , node5 .NodeID , result .NodeID , "result should be on node5" )
3650
+ assert .Equal (t , result .ResultType , AllocatedReserved , "result type should be AllocatedReserved" )
3651
+ assert .Equal (t , result .ReservedNodeID , node1 .NodeID , "reserved node should be node1" )
3652
+ }
0 commit comments