@@ -43,7 +43,13 @@ var _ = Describe("NodeMonitor Controller", func() {
43
43
Expect (k8sClient .Create (ctx , node )).To (Succeed ())
44
44
node = getNode (nodeName )
45
45
node .Status .Capacity = nodeGPUs
46
+ node .Status .Conditions = append (node .Status .Conditions , v1.NodeCondition {
47
+ Type : v1 .NodeReady ,
48
+ Status : v1 .ConditionTrue ,
49
+ })
46
50
Expect (k8sClient .Status ().Update (ctx , node )).To (Succeed ())
51
+ node .Spec .Taints = []v1.Taint {}
52
+ Expect (k8sClient .Update (ctx , node )).To (Succeed ())
47
53
}
48
54
49
55
deleteNode := func (nodeName string ) {
@@ -106,6 +112,62 @@ var _ = Describe("NodeMonitor Controller", func() {
106
112
Expect (err ).NotTo (HaveOccurred ())
107
113
Expect (noExecuteNodes ).Should (BeEmpty ())
108
114
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
+
109
171
deleteNode (node1Name .Name )
110
172
deleteNode (node2Name .Name )
111
173
})
0 commit comments