@@ -17,6 +17,7 @@ limitations under the License.
17
17
package scheduling
18
18
19
19
import (
20
+ "fmt"
20
21
"time"
21
22
22
23
"github.com/onsi/ginkgo"
@@ -29,20 +30,23 @@ import (
29
30
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
30
31
)
31
32
33
+ var (
34
+ timeout = 10 * time .Minute
35
+ waitTime = 2 * time .Second
36
+ )
37
+
32
38
// SIGDescribe annotates the test with the SIG label.
33
39
func SIGDescribe (text string , body func ()) bool {
34
40
return ginkgo .Describe ("[sig-scheduling] " + text , body )
35
41
}
36
42
37
43
// WaitForStableCluster waits until all existing pods are scheduled and returns their amount.
38
44
func WaitForStableCluster (c clientset.Interface , masterNodes sets.String ) int {
39
- timeout := 10 * time .Minute
40
45
startTime := time .Now ()
41
-
42
46
// Wait for all pods to be scheduled.
43
- allScheduledPods , allNotScheduledPods := getFilteredPods (c , masterNodes , metav1 .NamespaceAll )
47
+ allScheduledPods , allNotScheduledPods := getScheduledAndUnscheduledPods (c , masterNodes , metav1 .NamespaceAll )
44
48
for len (allNotScheduledPods ) != 0 {
45
- time .Sleep (2 * time . Second )
49
+ time .Sleep (waitTime )
46
50
if startTime .Add (timeout ).Before (time .Now ()) {
47
51
framework .Logf ("Timed out waiting for the following pods to schedule" )
48
52
for _ , p := range allNotScheduledPods {
@@ -51,22 +55,57 @@ func WaitForStableCluster(c clientset.Interface, masterNodes sets.String) int {
51
55
framework .Failf ("Timed out after %v waiting for stable cluster." , timeout )
52
56
break
53
57
}
54
- allScheduledPods , allNotScheduledPods = getFilteredPods (c , masterNodes , metav1 .NamespaceAll )
58
+ allScheduledPods , allNotScheduledPods = getScheduledAndUnscheduledPods (c , masterNodes , metav1 .NamespaceAll )
55
59
}
56
60
return len (allScheduledPods )
57
61
}
58
62
59
- // getFilteredPods lists scheduled and not scheduled pods in the given namespace, with succeeded and failed pods filtered out.
60
- func getFilteredPods (c clientset.Interface , masterNodes sets.String , ns string ) (scheduledPods , notScheduledPods []v1.Pod ) {
63
+ // WaitForPodsToBeDeleted waits until pods that are terminating to get deleted.
64
+ func WaitForPodsToBeDeleted (c clientset.Interface ) {
65
+ startTime := time .Now ()
66
+ deleting := getDeletingPods (c , metav1 .NamespaceAll )
67
+ for len (deleting ) != 0 {
68
+ if startTime .Add (timeout ).Before (time .Now ()) {
69
+ framework .Logf ("Pods still not deleted" )
70
+ for _ , p := range deleting {
71
+ framework .Logf ("%v/%v" , p .Namespace , p .Name )
72
+ }
73
+ framework .Failf ("Timed out after %v waiting for pods to be deleted" , timeout )
74
+ break
75
+ }
76
+ time .Sleep (waitTime )
77
+ deleting = getDeletingPods (c , metav1 .NamespaceAll )
78
+ }
79
+ }
80
+
81
+ // getScheduledAndUnscheduledPods lists scheduled and not scheduled pods in the given namespace, with succeeded and failed pods filtered out.
82
+ func getScheduledAndUnscheduledPods (c clientset.Interface , masterNodes sets.String , ns string ) (scheduledPods , notScheduledPods []v1.Pod ) {
61
83
pods , err := c .CoreV1 ().Pods (ns ).List (metav1.ListOptions {})
62
- framework .ExpectNoError (err , "listing all pods in kube-system namespace while waiting for stable cluster" )
84
+ framework .ExpectNoError (err , fmt . Sprintf ( "listing all pods in namespace %q while waiting for stable cluster" , ns ) )
63
85
// API server returns also Pods that succeeded. We need to filter them out.
64
86
filteredPods := make ([]v1.Pod , 0 , len (pods .Items ))
65
- for _ , pod := range pods .Items {
66
- if pod . Status . Phase != v1 . PodSucceeded && pod . Status . Phase != v1 . PodFailed {
67
- filteredPods = append (filteredPods , pod )
87
+ for _ , p := range pods .Items {
88
+ if ! podTerminated ( p ) {
89
+ filteredPods = append (filteredPods , p )
68
90
}
69
91
}
70
92
pods .Items = filteredPods
71
93
return e2epod .GetPodsScheduled (masterNodes , pods )
72
94
}
95
+
96
+ // getDeletingPods returns whether there are any pods marked for deletion.
97
+ func getDeletingPods (c clientset.Interface , ns string ) []v1.Pod {
98
+ pods , err := c .CoreV1 ().Pods (ns ).List (metav1.ListOptions {})
99
+ framework .ExpectNoError (err , fmt .Sprintf ("listing all pods in namespace %q while waiting for pods to terminate" , ns ))
100
+ var deleting []v1.Pod
101
+ for _ , p := range pods .Items {
102
+ if p .ObjectMeta .DeletionTimestamp != nil && ! podTerminated (p ) {
103
+ deleting = append (deleting , p )
104
+ }
105
+ }
106
+ return deleting
107
+ }
108
+
109
+ func podTerminated (p v1.Pod ) bool {
110
+ return p .Status .Phase == v1 .PodSucceeded || p .Status .Phase == v1 .PodFailed
111
+ }
0 commit comments