@@ -212,6 +212,110 @@ func TestUpdateNodes(t *testing.T) {
212212 ctx .updateNode (& oldNode , & newNode )
213213}
214214
215+ func TestAddCordonedNodeDoesNotEnable (t * testing.T ) {
216+ ctx , apiProvider := initContextAndAPIProviderForTest ()
217+ dispatcher .Start ()
218+ defer dispatcher .UnregisterAllEventHandlers ()
219+ defer dispatcher .Stop ()
220+
221+ actions := make ([]si.NodeInfo_ActionFromRM , 0 )
222+ apiProvider .MockSchedulerAPIUpdateNodeFn (func (request * si.NodeRequest ) error {
223+ for _ , node := range request .Nodes {
224+ actions = append (actions , node .Action )
225+ if node .Action == si .NodeInfo_CREATE_DRAIN {
226+ dispatcher .Dispatch (CachedSchedulerNodeEvent {
227+ NodeID : node .NodeID ,
228+ Event : NodeAccepted ,
229+ })
230+ }
231+ }
232+ return nil
233+ })
234+
235+ node := v1.Node {
236+ ObjectMeta : apis.ObjectMeta {
237+ Name : Host1 ,
238+ Namespace : "default" ,
239+ UID : uid1 ,
240+ },
241+ Spec : v1.NodeSpec {
242+ Unschedulable : true ,
243+ },
244+ }
245+
246+ ctx .addNode (& node )
247+
248+ assert .Equal (t , len (actions ), 1 )
249+ assert .Equal (t , actions [0 ], si .NodeInfo_CREATE_DRAIN )
250+ }
251+
252+ func TestUpdateNodeSchedulability (t * testing.T ) {
253+ ctx , apiProvider := initContextAndAPIProviderForTest ()
254+ dispatcher .Start ()
255+ defer dispatcher .UnregisterAllEventHandlers ()
256+ defer dispatcher .Stop ()
257+
258+ actions := make ([]si.NodeInfo_ActionFromRM , 0 )
259+ apiProvider .MockSchedulerAPIUpdateNodeFn (func (request * si.NodeRequest ) error {
260+ for _ , node := range request .Nodes {
261+ actions = append (actions , node .Action )
262+ if node .Action == si .NodeInfo_CREATE_DRAIN {
263+ dispatcher .Dispatch (CachedSchedulerNodeEvent {
264+ NodeID : node .NodeID ,
265+ Event : NodeAccepted ,
266+ })
267+ }
268+ }
269+ return nil
270+ })
271+
272+ node := v1.Node {
273+ ObjectMeta : apis.ObjectMeta {
274+ Name : Host1 ,
275+ Namespace : "default" ,
276+ UID : uid1 ,
277+ },
278+ }
279+
280+ ctx .addNode (& node )
281+ assert .Equal (t , len (actions ), 2 )
282+ assert .Equal (t , actions [0 ], si .NodeInfo_CREATE_DRAIN )
283+ assert .Equal (t , actions [1 ], si .NodeInfo_DRAIN_TO_SCHEDULABLE )
284+
285+ cordoned := node .DeepCopy ()
286+ cordoned .Spec .Unschedulable = true
287+ ctx .updateNode (& node , cordoned )
288+ assert .Equal (t , len (actions ), 3 )
289+ assert .Equal (t , actions [2 ], si .NodeInfo_DRAIN_NODE )
290+
291+ cordonedCopy := cordoned .DeepCopy ()
292+ ctx .updateNode (cordoned , cordonedCopy )
293+ assert .Equal (t , len (actions ), 3 )
294+
295+ uncordoned := cordoned .DeepCopy ()
296+ uncordoned .Spec .Unschedulable = false
297+ ctx .updateNode (cordoned , uncordoned )
298+ assert .Equal (t , len (actions ), 4 )
299+ assert .Equal (t , actions [3 ], si .NodeInfo_DRAIN_TO_SCHEDULABLE )
300+ }
301+
302+ func TestFilterSchedulableNodes (t * testing.T ) {
303+ node1 := & v1.Node {
304+ ObjectMeta : apis.ObjectMeta {Name : Host1 },
305+ }
306+ node2 := & v1.Node {
307+ ObjectMeta : apis.ObjectMeta {Name : Host2 },
308+ Spec : v1.NodeSpec {
309+ Unschedulable : true ,
310+ },
311+ }
312+
313+ nodes := filterSchedulableNodes ([]* v1.Node {node1 , nil , node2 })
314+
315+ assert .Equal (t , len (nodes ), 1 )
316+ assert .Equal (t , nodes [0 ].Name , Host1 )
317+ }
318+
215319func TestDeleteNodes (t * testing.T ) {
216320 ctx , apiProvider := initContextAndAPIProviderForTest ()
217321 dispatcher .Start ()
@@ -2000,6 +2104,47 @@ func TestInitializeState(t *testing.T) {
20002104 assert .Assert (t , task3 == nil , "pod3 was found" )
20012105}
20022106
2107+ func TestInitializeStateDoesNotEnableCordonedNodes (t * testing.T ) {
2108+ context , apiProvider := initContextAndAPIProviderForTest ()
2109+ apiProvider .RunEventHandler ()
2110+ nodeLister , ok := apiProvider .GetAPIs ().NodeInformer .Lister ().(* test.NodeListerMock )
2111+ assert .Assert (t , ok , "unable to get mock node lister" )
2112+
2113+ dispatcher .Start ()
2114+ defer dispatcher .UnregisterAllEventHandlers ()
2115+ defer dispatcher .Stop ()
2116+
2117+ actionsByNode := make (map [string ][]si.NodeInfo_ActionFromRM )
2118+ apiProvider .MockSchedulerAPIUpdateNodeFn (func (request * si.NodeRequest ) error {
2119+ for _ , node := range request .Nodes {
2120+ actionsByNode [node .NodeID ] = append (actionsByNode [node .NodeID ], node .Action )
2121+ if node .Action == si .NodeInfo_CREATE_DRAIN {
2122+ dispatcher .Dispatch (CachedSchedulerNodeEvent {
2123+ NodeID : node .NodeID ,
2124+ Event : NodeAccepted ,
2125+ })
2126+ }
2127+ }
2128+ return nil
2129+ })
2130+
2131+ schedulableNode := nodeForTest (nodeName1 , "10G" , "4" )
2132+ cordonedNode := nodeForTest (nodeName2 , "10G" , "4" )
2133+ cordonedNode .Spec .Unschedulable = true
2134+ nodeLister .AddNode (schedulableNode )
2135+ nodeLister .AddNode (cordonedNode )
2136+
2137+ err := context .InitializeState ()
2138+ assert .NilError (t , err , "InitializeState failed" )
2139+
2140+ assert .Assert (t , context .schedulerCache .GetNode (nodeName1 ) != nil , "schedulable node was not cached" )
2141+ assert .Assert (t , context .schedulerCache .GetNode (nodeName2 ) != nil , "cordoned node was not cached" )
2142+
2143+ cordonedActions := actionsByNode [nodeName2 ]
2144+ assert .Equal (t , len (cordonedActions ), 1 )
2145+ assert .Equal (t , cordonedActions [0 ], si .NodeInfo_CREATE_DRAIN )
2146+ }
2147+
20032148func TestPodAdoption (t * testing.T ) {
20042149 ctx , apiProvider := initContextAndAPIProviderForTest ()
20052150 dispatcher .Start ()
0 commit comments