Skip to content

Commit 5b00997

Browse files
committed
deflake nodelease test
1 parent 18cc115 commit 5b00997

File tree

1 file changed

+35
-28
lines changed

1 file changed

+35
-28
lines changed

test/e2e/common/node_lease.go

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -101,20 +101,37 @@ var _ = framework.KubeDescribe("NodeLease", func() {
101101
By("verify NodeStatus report period is longer than lease duration")
102102
// NodeStatus is reported from node to master when there is some change or
103103
// 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()
107108
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)
112132
}
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())
118135

119136
By("verify node is still in ready status even though node status report is infrequent")
120137
// This check on node status is only meaningful when this e2e test is
@@ -128,22 +145,12 @@ var _ = framework.KubeDescribe("NodeLease", func() {
128145
})
129146
})
130147

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
147154
}
148155

149156
func expectLease(lease *coordv1beta1.Lease, nodeName string) error {

0 commit comments

Comments
 (0)