@@ -10,19 +10,30 @@ import (
1010 meta "k8s.io/apimachinery/pkg/apis/meta/v1"
1111 "k8s.io/apimachinery/pkg/runtime"
1212 "k8s.io/apimachinery/pkg/runtime/schema"
13+ "k8s.io/client-go/kubernetes"
1314 "k8s.io/client-go/kubernetes/fake"
1415 clienttesting "k8s.io/client-go/testing"
1516)
1617
1718const (
18- ns = "coolNamespace"
19- nodeName = "coolNode"
20- podName = "coolPod"
21- daemonsetName = "coolDaemonSet"
19+ ns = "coolNamespace"
20+
21+ nodeName = "coolNode"
22+ podName = "coolPod"
23+
24+ daemonsetName = "coolDaemonSet"
25+ deploymentName = "coolDeployment"
26+ kindDeployment = "Deployment"
27+ )
28+
29+ var (
30+ _ CordonDrainer = (* APICordonDrainer )(nil )
31+ _ CordonDrainer = (* NoopCordonDrainer )(nil )
2232)
2333
2434var podGracePeriodSeconds int64 = 10
2535var isController = true
36+ var errExploded = errors .New ("kaboom" )
2637
2738type reactor struct {
2839 verb string
@@ -41,6 +52,14 @@ func (r reactor) Fn() clienttesting.ReactionFunc {
4152 }
4253}
4354
55+ func newFakeClientSet (rs ... reactor ) kubernetes.Interface {
56+ cs := & fake.Clientset {}
57+ for _ , r := range rs {
58+ cs .AddReactor (r .verb , r .resource , r .Fn ())
59+ }
60+ return cs
61+ }
62+
4463func TestCordon (t * testing.T ) {
4564 cases := []struct {
4665 name string
@@ -274,18 +293,22 @@ func TestDrain(t *testing.T) {
274293 },
275294 },
276295 {
277- name : "FilterMirrorPod " ,
296+ name : "PodDoesNotPassFilter " ,
278297 node : & core.Node {ObjectMeta : meta.ObjectMeta {Name : nodeName }},
298+ options : []APICordonDrainerOption {WithPodFilter (func (p core.Pod ) (bool , error ) {
299+ if p .GetName () == "lamePod" {
300+ // This pod does not pass the filter.
301+ return false , nil
302+ }
303+ return true , nil
304+ })},
279305 reactions : []reactor {
280306 reactor {
281307 verb : "list" ,
282308 resource : "pods" ,
283309 ret : & core.PodList {Items : []core.Pod {
310+ core.Pod {ObjectMeta : meta.ObjectMeta {Name : "lamePod" }},
284311 core.Pod {ObjectMeta : meta.ObjectMeta {Name : podName }},
285- core.Pod {ObjectMeta : meta.ObjectMeta {
286- Name : "mirrorPod" ,
287- Annotations : map [string ]string {core .MirrorPodAnnotationKey : "true" },
288- }},
289312 }},
290313 },
291314 reactor {
@@ -301,23 +324,20 @@ func TestDrain(t *testing.T) {
301324 },
302325 },
303326 {
304- name : "FilterDaemonSetPod " ,
327+ name : "PodFilterErrors " ,
305328 node : & core.Node {ObjectMeta : meta.ObjectMeta {Name : nodeName }},
329+ options : []APICordonDrainerOption {WithPodFilter (func (p core.Pod ) (bool , error ) {
330+ if p .GetName () == "explodeyPod" {
331+ return false , errExploded
332+ }
333+ return true , nil
334+ })},
306335 reactions : []reactor {
307336 reactor {
308337 verb : "list" ,
309338 resource : "pods" ,
310339 ret : & core.PodList {Items : []core.Pod {
311- core.Pod {
312- ObjectMeta : meta.ObjectMeta {
313- Name : "daemonsetPod" ,
314- OwnerReferences : []meta.OwnerReference {meta.OwnerReference {
315- Controller : & isController ,
316- Kind : kindDaemonSet ,
317- }},
318- },
319- Spec : core.PodSpec {TerminationGracePeriodSeconds : & podGracePeriodSeconds },
320- },
340+ core.Pod {ObjectMeta : meta.ObjectMeta {Name : "explodeyPod" }},
321341 core.Pod {ObjectMeta : meta.ObjectMeta {Name : podName }},
322342 }},
323343 },
@@ -332,74 +352,7 @@ func TestDrain(t *testing.T) {
332352 err : apierrors .NewNotFound (schema.GroupResource {Resource : "pods" }, podName ),
333353 },
334354 },
335- },
336- {
337- name : "EvictOrphanedDaemonSetPod" ,
338- node : & core.Node {ObjectMeta : meta.ObjectMeta {Name : nodeName }},
339- reactions : []reactor {
340- reactor {
341- verb : "list" ,
342- resource : "pods" ,
343- ret : & core.PodList {Items : []core.Pod {
344- core.Pod {
345- ObjectMeta : meta.ObjectMeta {
346- Name : "orphanedDaemonsetPod" ,
347- Namespace : ns ,
348- OwnerReferences : []meta.OwnerReference {meta.OwnerReference {
349- Controller : & isController ,
350- Kind : kindDaemonSet ,
351- Name : daemonsetName ,
352- }},
353- },
354- Spec : core.PodSpec {TerminationGracePeriodSeconds : & podGracePeriodSeconds },
355- },
356- }},
357- },
358- reactor {
359- verb : "get" ,
360- resource : "daemonsets" ,
361- err : apierrors .NewNotFound (schema.GroupResource {Resource : "daemonsets" }, daemonsetName ),
362- },
363- reactor {
364- verb : "create" ,
365- resource : "pods" ,
366- subresource : "eviction" ,
367- },
368- reactor {
369- verb : "get" ,
370- resource : "pods" ,
371- err : apierrors .NewNotFound (schema.GroupResource {Resource : "pods" }, podName ),
372- },
373- },
374- },
375- {
376- name : "ErrorGettingDaemonset" ,
377- node : & core.Node {ObjectMeta : meta.ObjectMeta {Name : nodeName }},
378- reactions : []reactor {
379- reactor {
380- verb : "list" ,
381- resource : "pods" ,
382- ret : & core.PodList {Items : []core.Pod {
383- core.Pod {
384- ObjectMeta : meta.ObjectMeta {
385- Name : "orphanedDaemonsetPod" ,
386- Namespace : ns ,
387- OwnerReferences : []meta.OwnerReference {meta.OwnerReference {
388- Controller : & isController ,
389- Kind : kindDaemonSet ,
390- Name : daemonsetName ,
391- }},
392- },
393- Spec : core.PodSpec {TerminationGracePeriodSeconds : & podGracePeriodSeconds },
394- },
395- }},
396- },
397- reactor {
398- verb : "get" ,
399- resource : "daemonsets" ,
400- err : errors .New ("nope" ),
401- },
402- },
355+ errFn : func (err error ) bool { return errors .Cause (err ) == errExploded },
403356 },
404357 {
405358 name : "ErrorListingPods" ,
@@ -416,14 +369,8 @@ func TestDrain(t *testing.T) {
416369
417370 for _ , tc := range cases {
418371 t .Run (tc .name , func (t * testing.T ) {
419- c := & fake.Clientset {}
420- for _ , r := range tc .reactions {
421- c .AddReactor (r .verb , r .resource , r .Fn ())
422- }
423-
424- o := tc .options
425- o = append (o , WithPodFilter (NewPodFilters (MirrorPodFilter , NewDaemonSetPodFilter (c ))))
426- d := NewAPICordonDrainer (c , o ... )
372+ c := newFakeClientSet (tc .reactions ... )
373+ d := NewAPICordonDrainer (c , tc .options ... )
427374 if err := d .Drain (tc .node ); err != nil {
428375 for _ , r := range tc .reactions {
429376 if errors .Cause (err ) == r .err {
0 commit comments