@@ -140,6 +140,59 @@ func TestFindNodesToRemove(t *testing.T) {
140
140
141
141
clusterSnapshot := testsnapshot .NewTestSnapshotOrDie (t )
142
142
143
+ topoNode1 := BuildTestNode ("topo-n1" , 1000 , 2000000 )
144
+ topoNode2 := BuildTestNode ("topo-n2" , 1000 , 2000000 )
145
+ topoNode3 := BuildTestNode ("topo-n3" , 1000 , 2000000 )
146
+ topoNode1 .Labels = map [string ]string {"kubernetes.io/hostname" : "topo-n1" }
147
+ topoNode2 .Labels = map [string ]string {"kubernetes.io/hostname" : "topo-n2" }
148
+ topoNode3 .Labels = map [string ]string {"kubernetes.io/hostname" : "topo-n3" }
149
+
150
+ SetNodeReadyState (topoNode1 , true , time.Time {})
151
+ SetNodeReadyState (topoNode2 , true , time.Time {})
152
+ SetNodeReadyState (topoNode3 , true , time.Time {})
153
+
154
+ minDomains := int32 (2 )
155
+ maxSkew := int32 (1 )
156
+ topoConstraint := apiv1.TopologySpreadConstraint {
157
+ MaxSkew : maxSkew ,
158
+ TopologyKey : "kubernetes.io/hostname" ,
159
+ WhenUnsatisfiable : apiv1 .DoNotSchedule ,
160
+ MinDomains : & minDomains ,
161
+ LabelSelector : & metav1.LabelSelector {
162
+ MatchLabels : map [string ]string {
163
+ "app" : "topo-app" ,
164
+ },
165
+ },
166
+ }
167
+
168
+ pod5 := BuildTestPod ("p5" , 100 , 100000 )
169
+ pod5 .Labels = map [string ]string {"app" : "topo-app" }
170
+ pod5 .OwnerReferences = ownerRefs
171
+ pod5 .Spec .NodeName = "topo-n1"
172
+ pod5 .Spec .TopologySpreadConstraints = []apiv1.TopologySpreadConstraint {topoConstraint }
173
+
174
+ pod6 := BuildTestPod ("p6" , 100 , 100000 )
175
+ pod6 .Labels = map [string ]string {"app" : "topo-app" }
176
+ pod6 .OwnerReferences = ownerRefs
177
+ pod6 .Spec .NodeName = "topo-n2"
178
+ pod6 .Spec .TopologySpreadConstraints = []apiv1.TopologySpreadConstraint {topoConstraint }
179
+
180
+ pod7 := BuildTestPod ("p7" , 100 , 100000 )
181
+ pod7 .Labels = map [string ]string {"app" : "topo-app" }
182
+ pod7 .OwnerReferences = ownerRefs
183
+ pod7 .Spec .NodeName = "topo-n3"
184
+ pod7 .Spec .TopologySpreadConstraints = []apiv1.TopologySpreadConstraint {topoConstraint }
185
+
186
+ blocker1 := BuildTestPod ("blocker1" , 100 , 100000 )
187
+ blocker1 .Spec .NodeName = "topo-n2"
188
+ blocker2 := BuildTestPod ("blocker2" , 100 , 100000 )
189
+ blocker2 .Spec .NodeName = "topo-n3"
190
+
191
+ topoNodeToRemove := NodeToBeRemoved {
192
+ Node : topoNode1 ,
193
+ PodsToReschedule : []* apiv1.Pod {pod5 },
194
+ }
195
+
143
196
tests := []findNodesToRemoveTestConfig {
144
197
{
145
198
name : "just an empty node, should be removed" ,
@@ -176,6 +229,17 @@ func TestFindNodesToRemove(t *testing.T) {
176
229
allNodes : []* apiv1.Node {emptyNode , drainableNode , fullNode , nonDrainableNode },
177
230
toRemove : []NodeToBeRemoved {emptyNodeToRemove , drainableNodeToRemove },
178
231
},
232
+ {
233
+ name : "topology spread constraint test - one node should be removable" ,
234
+ pods : []* apiv1.Pod {pod5 , pod6 , pod7 , blocker1 , blocker2 },
235
+ allNodes : []* apiv1.Node {topoNode1 , topoNode2 , topoNode3 },
236
+ candidates : []string {topoNode1 .Name , topoNode2 .Name , topoNode3 .Name },
237
+ toRemove : []NodeToBeRemoved {topoNodeToRemove },
238
+ unremovable : []* UnremovableNode {
239
+ {Node : topoNode2 , Reason : BlockedByPod , BlockingPod : & drain.BlockingPod {Pod : blocker1 , Reason : drain .NotReplicated }},
240
+ {Node : topoNode3 , Reason : BlockedByPod , BlockingPod : & drain.BlockingPod {Pod : blocker2 , Reason : drain .NotReplicated }},
241
+ },
242
+ },
179
243
}
180
244
181
245
for _ , test := range tests {
0 commit comments