@@ -214,4 +214,88 @@ spec:
214214 }).Should (Succeed ())
215215 })
216216 })
217+
218+ Context ("Scheduling filter" , Ordered , func () {
219+ var nodeName string
220+
221+ BeforeAll (func () {
222+ By ("getting Kind node name" )
223+ out , err := utils .Run (exec .Command ("kubectl" , "get" , "nodes" ,
224+ "-o" , "jsonpath={.items[0].metadata.name}" ))
225+ Expect (err ).NotTo (HaveOccurred ())
226+ nodeName = strings .TrimSpace (out )
227+ Expect (nodeName ).NotTo (BeEmpty ())
228+
229+ By ("removing control-plane taint so scheduler can use the node" )
230+ _ , _ = utils .Run (exec .Command ("kubectl" , "taint" , "nodes" , nodeName ,
231+ "node-role.kubernetes.io/control-plane:NoSchedule-" ))
232+
233+ By ("labeling node imp/enabled=true" )
234+ _ , err = utils .Run (exec .Command ("kubectl" , "label" , "node" , nodeName ,
235+ "imp/enabled=true" , "--overwrite" ))
236+ Expect (err ).NotTo (HaveOccurred ())
237+ })
238+
239+ AfterAll (func () {
240+ By ("removing imp/enabled label" )
241+ _ , _ = utils .Run (exec .Command ("kubectl" , "label" , "node" , nodeName ,
242+ "imp/enabled-" ))
243+ })
244+
245+ AfterEach (func () {
246+ for _ , name := range []string {"e2e-sched-cordon" , "e2e-sched-notoleration" , "e2e-sched-toleration" } {
247+ _ , _ = utils .Run (exec .Command ("kubectl" , "delete" , "impvm" , name ,
248+ "-n" , "default" , "--ignore-not-found" ))
249+ }
250+ _ , _ = utils .Run (exec .Command ("kubectl" , "uncordon" , nodeName ))
251+ _ , _ = utils .Run (exec .Command ("kubectl" , "taint" , "nodes" , nodeName ,
252+ "e2e-test=blocked:NoSchedule-" ))
253+ })
254+
255+ It ("keeps VM Pending on cordoned node, schedules after uncordon" , func () {
256+ By ("cordoning the node" )
257+ _ , err := utils .Run (exec .Command ("kubectl" , "cordon" , nodeName ))
258+ Expect (err ).NotTo (HaveOccurred ())
259+
260+ By ("creating ImpVM e2e-sched-cordon" )
261+ manifest := `
262+ apiVersion: imp.dev/v1alpha1
263+ kind: ImpVM
264+ metadata:
265+ name: e2e-sched-cordon
266+ namespace: default
267+ spec:
268+ classRef:
269+ name: small
270+ image: ghcr.io/syscode-labs/test:latest
271+ lifecycle: ephemeral
272+ `
273+ applyCmd := exec .Command ("kubectl" , "apply" , "-f" , "-" )
274+ applyCmd .Stdin = strings .NewReader (manifest )
275+ _ , err = utils .Run (applyCmd )
276+ Expect (err ).NotTo (HaveOccurred ())
277+
278+ By ("verifying VM stays Pending (no nodeName) while node is cordoned" )
279+ Consistently (func (g Gomega ) {
280+ getCmd := exec .Command ("kubectl" , "get" , "impvm" , "e2e-sched-cordon" ,
281+ "-n" , "default" , "-o" , "jsonpath={.spec.nodeName}" )
282+ out , getErr := utils .Run (getCmd )
283+ g .Expect (getErr ).NotTo (HaveOccurred ())
284+ g .Expect (strings .TrimSpace (out )).To (BeEmpty ())
285+ }, 20 * time .Second , time .Second ).Should (Succeed ())
286+
287+ By ("uncordoning the node" )
288+ _ , err = utils .Run (exec .Command ("kubectl" , "uncordon" , nodeName ))
289+ Expect (err ).NotTo (HaveOccurred ())
290+
291+ By ("verifying VM gets scheduled (nodeName set)" )
292+ Eventually (func (g Gomega ) {
293+ getCmd := exec .Command ("kubectl" , "get" , "impvm" , "e2e-sched-cordon" ,
294+ "-n" , "default" , "-o" , "jsonpath={.spec.nodeName}" )
295+ out , getErr := utils .Run (getCmd )
296+ g .Expect (getErr ).NotTo (HaveOccurred ())
297+ g .Expect (strings .TrimSpace (out )).NotTo (BeEmpty ())
298+ }).Should (Succeed ())
299+ })
300+ })
217301})
0 commit comments