@@ -16,6 +16,7 @@ package node_test
1616import (
1717 "context"
1818 "strconv"
19+ "strings"
1920 "testing"
2021 "time"
2122
@@ -28,9 +29,13 @@ import (
2829 v1 "k8s.io/api/core/v1"
2930 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031 "k8s.io/client-go/kubernetes/fake"
32+ "k8s.io/client-go/tools/record"
3133 "k8s.io/kubectl/pkg/drain"
3234)
3335
36+ // Size of the fakeRecorder buffer
37+ const recorderBufferSize = 10
38+
3439var nodeName = "NAME"
3540
3641func getDrainHelper (client * fake.Clientset ) * drain.Helper {
@@ -61,7 +66,11 @@ func TestDryRun(t *testing.T) {
6166 tNode , err := node .New (config.Config {DryRun : true })
6267 h .Ok (t , err )
6368
64- err = tNode .CordonAndDrain (nodeName , "cordonReason" )
69+ fakeRecorder := record .NewFakeRecorder (recorderBufferSize )
70+ defer close (fakeRecorder .Events )
71+
72+ err = tNode .CordonAndDrain (nodeName , "cordonReason" , fakeRecorder )
73+
6574 h .Ok (t , err )
6675
6776 err = tNode .Cordon (nodeName , "cordonReason" )
@@ -98,6 +107,7 @@ func TestNewFailure(t *testing.T) {
98107}
99108
100109func TestDrainSuccess (t * testing.T ) {
110+ isOwnerController := true
101111 client := fake .NewSimpleClientset ()
102112 _ , err := client .CoreV1 ().Nodes ().Create (
103113 context .Background (),
@@ -106,14 +116,48 @@ func TestDrainSuccess(t *testing.T) {
106116 },
107117 metav1.CreateOptions {})
108118 h .Ok (t , err )
119+
120+ _ , err = client .CoreV1 ().Pods ("default" ).Create (
121+ context .Background (),
122+ & v1.Pod {
123+ ObjectMeta : metav1.ObjectMeta {
124+ GenerateName : "cool-app-pod-" ,
125+ OwnerReferences : []metav1.OwnerReference {
126+ {
127+ APIVersion : "apps/v1" ,
128+ Name : "cool-app" ,
129+ Kind : "ReplicaSet" ,
130+ Controller : & isOwnerController ,
131+ },
132+ },
133+ },
134+ Spec : v1.PodSpec {
135+ NodeName : nodeName ,
136+ },
137+ },
138+ metav1.CreateOptions {})
139+ h .Ok (t , err )
140+
141+ fakeRecorder := record .NewFakeRecorder (recorderBufferSize )
142+
109143 tNode := getNode (t , getDrainHelper (client ))
110- err = tNode .CordonAndDrain (nodeName , "cordonReason" )
144+ err = tNode .CordonAndDrain (nodeName , "cordonReason" , fakeRecorder )
145+ close (fakeRecorder .Events )
111146 h .Ok (t , err )
147+ expectedEventArrived := false
148+ for event := range fakeRecorder .Events {
149+ if strings .Contains (event , "Normal PodEviction Pod evicted due to node drain" ) {
150+ expectedEventArrived = true
151+ }
152+ }
153+ h .Assert (t , expectedEventArrived , "PodEvicted event was not emitted" )
112154}
113155
114156func TestDrainCordonNodeFailure (t * testing.T ) {
157+ fakeRecorder := record .NewFakeRecorder (recorderBufferSize )
158+ defer close (fakeRecorder .Events )
115159 tNode := getNode (t , getDrainHelper (fake .NewSimpleClientset ()))
116- err := tNode .CordonAndDrain (nodeName , "cordonReason" )
160+ err := tNode .CordonAndDrain (nodeName , "cordonReason" , fakeRecorder )
117161 h .Assert (t , true , "Failed to return error on CordonAndDrain failing to cordon node" , err != nil )
118162}
119163
0 commit comments