@@ -45,7 +45,13 @@ var _ = Describe("NodeMonitor Controller", func() {
45
45
Expect (k8sClient .Create (ctx , node )).To (Succeed ())
46
46
node = getNode (nodeName )
47
47
node .Status .Capacity = nodeGPUs
48
+ node .Status .Conditions = append (node .Status .Conditions , v1.NodeCondition {
49
+ Type : v1 .NodeReady ,
50
+ Status : v1 .ConditionTrue ,
51
+ })
48
52
Expect (k8sClient .Status ().Update (ctx , node )).To (Succeed ())
53
+ node .Spec .Taints = []v1.Taint {}
54
+ Expect (k8sClient .Update (ctx , node )).To (Succeed ())
49
55
}
50
56
51
57
deleteNode := func (nodeName string ) {
@@ -117,6 +123,62 @@ var _ = Describe("NodeMonitor Controller", func() {
117
123
Expect (err ).NotTo (HaveOccurred ())
118
124
Expect (len (noExecuteNodes )).Should (Equal (0 ))
119
125
126
+ By ("A Node tainted as unreachable is detected as unscheduable" )
127
+ node = getNode (node1Name .Name )
128
+ node .Spec .Taints = append (node .Spec .Taints , v1.Taint {Key : "node.kubernetes.io/unreachable" , Effect : v1 .TaintEffectNoExecute })
129
+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
130
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
131
+ Expect (err ).NotTo (HaveOccurred ())
132
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
133
+ Expect (err ).NotTo (HaveOccurred ())
134
+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
135
+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
136
+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
137
+
138
+ By ("Repeated reconcile does not change map" )
139
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
140
+ Expect (err ).NotTo (HaveOccurred ())
141
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
142
+ Expect (err ).NotTo (HaveOccurred ())
143
+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
144
+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
145
+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
146
+
147
+ By ("Removing the taint updates unhealthyNodes" )
148
+ node .Spec .Taints = []v1.Taint {}
149
+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
150
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
151
+ Expect (err ).NotTo (HaveOccurred ())
152
+ Expect (noScheduleNodes ).Should (BeEmpty ())
153
+
154
+ By ("A Node tainted as not-read is detected as unscheduable" )
155
+ node = getNode (node1Name .Name )
156
+ node .Spec .Taints = append (node .Spec .Taints , v1.Taint {Key : "node.kubernetes.io/not-ready" , Effect : v1 .TaintEffectNoExecute })
157
+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
158
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
159
+ Expect (err ).NotTo (HaveOccurred ())
160
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
161
+ Expect (err ).NotTo (HaveOccurred ())
162
+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
163
+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
164
+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
165
+
166
+ By ("Repeated reconcile does not change map" )
167
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
168
+ Expect (err ).NotTo (HaveOccurred ())
169
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node2Name })
170
+ Expect (err ).NotTo (HaveOccurred ())
171
+ Expect (noScheduleNodes ).Should (HaveLen (1 ))
172
+ Expect (noScheduleNodes ).Should (HaveKey (node1Name .Name ))
173
+ Expect (noScheduleNodes [node1Name .Name ]).Should (HaveKey (v1 .ResourceName ("nvidia.com/gpu" )))
174
+
175
+ By ("Removing the taint updates unhealthyNodes" )
176
+ node .Spec .Taints = []v1.Taint {}
177
+ Expect (k8sClient .Update (ctx , node )).Should (Succeed ())
178
+ _ , err = nodeMonitor .Reconcile (ctx , reconcile.Request {NamespacedName : node1Name })
179
+ Expect (err ).NotTo (HaveOccurred ())
180
+ Expect (noScheduleNodes ).Should (BeEmpty ())
181
+
120
182
deleteNode (node1Name .Name )
121
183
deleteNode (node2Name .Name )
122
184
})
0 commit comments