@@ -101,20 +101,37 @@ var _ = framework.KubeDescribe("NodeLease", func() {
101
101
By ("verify NodeStatus report period is longer than lease duration" )
102
102
// NodeStatus is reported from node to master when there is some change or
103
103
// enough time has passed. So for here, keep checking the time diff
104
- // between 2 NodeStatus report, until it is longer than lease duration (
105
- // the same as nodeMonitorGracePeriod).
106
- heartbeatTime := getNextReadyConditionHeartbeatTime (f .ClientSet , nodeName , metav1.Time {})
104
+ // between 2 NodeStatus report, until it is longer than lease duration
105
+ // (the same as nodeMonitorGracePeriod), or it doesn't change for at least leaseDuration
106
+ lastHeartbeatTime := getReadyConditionHeartbeatTime (f .ClientSet , nodeName )
107
+ lastObserved := time .Now ()
107
108
Eventually (func () error {
108
- nextHeartbeatTime := getNextReadyConditionHeartbeatTime (f .ClientSet , nodeName , heartbeatTime )
109
-
110
- if nextHeartbeatTime .Time .After (heartbeatTime .Time .Add (leaseDuration )) {
111
- return nil
109
+ currentHeartbeatTime := getReadyConditionHeartbeatTime (f .ClientSet , nodeName )
110
+ currentObserved := time .Now ()
111
+
112
+ switch {
113
+ case currentHeartbeatTime == lastHeartbeatTime :
114
+ if currentObserved .Sub (lastObserved ) > 2 * leaseDuration {
115
+ // heartbeat hasn't changed while watching for at least 2*leaseDuration, success!
116
+ framework .Logf ("node status heartbeat is unchanged for %s, was waiting for at least %s, success!" , currentObserved .Sub (lastObserved ), 2 * leaseDuration )
117
+ return nil
118
+ }
119
+ framework .Logf ("node status heartbeat is unchanged for %s, waiting for %s" , currentObserved .Sub (lastObserved ), 2 * leaseDuration )
120
+ return fmt .Errorf ("node status heartbeat is unchanged for %s, waiting for %s" , currentObserved .Sub (lastObserved ), 2 * leaseDuration )
121
+
122
+ case currentHeartbeatTime != lastHeartbeatTime :
123
+ if currentHeartbeatTime .Sub (lastHeartbeatTime ) > leaseDuration {
124
+ // heartbeat time changed, but the diff was greater than leaseDuration, success!
125
+ framework .Logf ("node status heartbeat changed in %s, was waiting for at least %s, success!" , currentHeartbeatTime .Sub (lastHeartbeatTime ), leaseDuration )
126
+ return nil
127
+ }
128
+ lastHeartbeatTime = currentHeartbeatTime
129
+ lastObserved = currentObserved
130
+ framework .Logf ("node status heartbeat changed in %s, waiting for %s" , currentHeartbeatTime .Sub (lastHeartbeatTime ), leaseDuration )
131
+ return fmt .Errorf ("node status heartbeat changed in %s, waiting for %s" , currentHeartbeatTime .Sub (lastHeartbeatTime ), leaseDuration )
112
132
}
113
- heartbeatTime = nextHeartbeatTime
114
- return fmt .Errorf ("node status report period is shorter than lease duration" )
115
-
116
- // Enter next round immediately.
117
- }, 5 * time .Minute , time .Nanosecond ).Should (BeNil ())
133
+ return nil
134
+ }, 5 * time .Minute , time .Second ).Should (BeNil ())
118
135
119
136
By ("verify node is still in ready status even though node status report is infrequent" )
120
137
// This check on node status is only meaningful when this e2e test is
@@ -128,22 +145,12 @@ var _ = framework.KubeDescribe("NodeLease", func() {
128
145
})
129
146
})
130
147
131
- func getNextReadyConditionHeartbeatTime (clientSet clientset.Interface , nodeName string , prevHeartbeatTime metav1.Time ) metav1.Time {
132
- var newHeartbeatTime metav1.Time
133
- Eventually (func () error {
134
- node , err := clientSet .CoreV1 ().Nodes ().Get (nodeName , metav1.GetOptions {})
135
- if err != nil {
136
- return err
137
- }
138
- _ , readyCondition := testutils .GetNodeCondition (& node .Status , corev1 .NodeReady )
139
- Expect (readyCondition .Status ).To (Equal (corev1 .ConditionTrue ))
140
- newHeartbeatTime = readyCondition .LastHeartbeatTime
141
- if prevHeartbeatTime .Before (& newHeartbeatTime ) {
142
- return nil
143
- }
144
- return fmt .Errorf ("heartbeat has not changed yet" )
145
- }, 5 * time .Minute , 5 * time .Second ).Should (BeNil ())
146
- return newHeartbeatTime
148
+ func getReadyConditionHeartbeatTime (clientSet clientset.Interface , nodeName string ) time.Time {
149
+ node , err := clientSet .CoreV1 ().Nodes ().Get (nodeName , metav1.GetOptions {})
150
+ Expect (err ).To (BeNil ())
151
+ _ , readyCondition := testutils .GetNodeCondition (& node .Status , corev1 .NodeReady )
152
+ Expect (readyCondition .Status ).To (Equal (corev1 .ConditionTrue ))
153
+ return readyCondition .LastHeartbeatTime .Time
147
154
}
148
155
149
156
func expectLease (lease * coordv1beta1.Lease , nodeName string ) error {
0 commit comments