@@ -43,7 +43,13 @@ var _ = Describe("NodeMonitor Controller", func() {
4343 Expect (k8sClient .Create (ctx , node )).To (Succeed ())
4444 node = getNode (nodeName )
4545 node .Status .Capacity = nodeGPUs
46+ node .Status .Conditions = append (node .Status .Conditions , v1.NodeCondition {
47+ Type : v1 .NodeReady ,
48+ Status : v1 .ConditionTrue ,
49+ })
4650 Expect (k8sClient .Status ().Update (ctx , node )).To (Succeed ())
51+ node .Spec .Taints = []v1.Taint {}
52+ Expect (k8sClient .Update (ctx , node )).To (Succeed ())
4753 }
4854
4955 deleteNode := func (nodeName string ) {
@@ -106,6 +112,62 @@ var _ = Describe("NodeMonitor Controller", func() {
106112 Expect (err ).NotTo (HaveOccurred ())
107113 Expect (noExecuteNodes ).Should (BeEmpty ())
108114
115+ By ("A Node tainted as unreachable is detected as unscheduable" )
116+ node = getNode (node1Name .Name )
117+ node .Spec .Taints = append (node .Spec .Taints , v1.Taint {Key : "node.kubernetes.io/unreachable" , Effect : v1 .TaintEffectNoExecute })
118+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
119+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
120+ Expect (err ).NotTo (HaveOccurred ())
121+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
122+ Expect (err ).NotTo (HaveOccurred ())
123+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
124+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
125+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
126+
127+ By ("Repeated reconcile does not change map" )
128+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
129+ Expect (err ).NotTo (HaveOccurred ())
130+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
131+ Expect (err ).NotTo (HaveOccurred ())
132+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
133+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
134+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
135+
136+ By ("Removing the taint updates unhealthyNodes" )
137+ node .Spec .Taints = []v1.Taint {}
138+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
139+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
140+ Expect (err ).NotTo (HaveOccurred ())
141+ Expect (noScheduleNodes ).Should (BeEmpty ())
142+
143+ By ("A Node tainted as not-read is detected as unscheduable" )
144+ node = getNode (node1Name .Name )
145+ node .Spec .Taints = append (node .Spec .Taints , v1.Taint {Key : "node.kubernetes.io/not-ready" , Effect : v1 .TaintEffectNoExecute })
146+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
147+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
148+ Expect (err ).NotTo (HaveOccurred ())
149+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
150+ Expect (err ).NotTo (HaveOccurred ())
151+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
152+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
153+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
154+
155+ By ("Repeated reconcile does not change map" )
156+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
157+ Expect (err ).NotTo (HaveOccurred ())
158+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
159+ Expect (err ).NotTo (HaveOccurred ())
160+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
161+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
162+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
163+
164+ By ("Removing the taint updates unhealthyNodes" )
165+ node .Spec .Taints = []v1.Taint {}
166+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
167+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
168+ Expect (err ).NotTo (HaveOccurred ())
169+ Expect (noScheduleNodes ).Should (BeEmpty ())
170+
109171 deleteNode (node1Name .Name )
110172 deleteNode (node2Name .Name )
111173 })
0 commit comments