diff --git a/test/e2e/kubeproxy.go b/test/e2e/kubeproxy.go index 9b9b5afc435..2949d009a22 100644 --- a/test/e2e/kubeproxy.go +++ b/test/e2e/kubeproxy.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned" + "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util/wait" ) @@ -471,7 +472,18 @@ func (config *KubeProxyTestConfig) deleteNetProxyPod() { pod := config.endpointPods[0] config.getPodClient().Delete(pod.Name, nil) config.endpointPods = config.endpointPods[1:] - time.Sleep(5 * time.Second) // wait for kube-proxy to catch up with the pod being deleted. + // wait for pod being deleted. + err := waitForPodToDisappear(config.f.Client, config.f.Namespace.Name, pod.Name, labels.Everything(), time.Second, util.ForeverTestTimeout) + if err != nil { + Failf("Failed to delete %s pod: %v", pod.Name, err) + } + // wait for endpoint being removed. + err = waitForServiceEndpointsNum(config.f.Client, config.f.Namespace.Name, nodePortServiceName, len(config.endpointPods), time.Second, util.ForeverTestTimeout) + if err != nil { + Failf("Failed to remove endpoint from service: %s", nodePortServiceName) + } + // wait for kube-proxy to catch up with the pod being deleted. + time.Sleep(5 * time.Second) } func (config *KubeProxyTestConfig) createPod(pod *api.Pod) *api.Pod { diff --git a/test/e2e/util.go b/test/e2e/util.go index 5745cb08381..d24a6973ff7 100644 --- a/test/e2e/util.go +++ b/test/e2e/util.go @@ -641,11 +641,8 @@ func waitForRCPodOnNode(c *client.Client, ns, rcName, node string) (*api.Pod, er return p, err } -// waitForRCPodToDisappear returns nil if the pod from the given replication controller (described by rcName) no longer exists. -// In case of failure or too long waiting time, an error is returned. -func waitForRCPodToDisappear(c *client.Client, ns, rcName, podName string) error { - label := labels.SelectorFromSet(labels.Set(map[string]string{"name": rcName})) - return wait.Poll(20*time.Second, 5*time.Minute, func() (bool, error) { +func waitForPodToDisappear(c *client.Client, ns, podName string, label labels.Selector, interval, timeout time.Duration) error { + return wait.Poll(interval, timeout, func() (bool, error) { Logf("Waiting for pod %s to disappear", podName) pods, err := c.Pods(ns).List(label, fields.Everything()) if err != nil { @@ -666,6 +663,13 @@ func waitForRCPodToDisappear(c *client.Client, ns, rcName, podName string) error }) } +// waitForRCPodToDisappear returns nil if the pod from the given replication controller (described by rcName) no longer exists. +// In case of failure or too long waiting time, an error is returned. +func waitForRCPodToDisappear(c *client.Client, ns, rcName, podName string) error { + label := labels.SelectorFromSet(labels.Set(map[string]string{"name": rcName})) + return waitForPodToDisappear(c, ns, podName, label, 20*time.Second, 5*time.Minute) +} + // waitForService waits until the service appears (exist == true), or disappears (exist == false) func waitForService(c *client.Client, namespace, name string, exist bool, interval, timeout time.Duration) error { err := wait.Poll(interval, timeout, func() (bool, error) { @@ -695,6 +699,32 @@ func waitForService(c *client.Client, namespace, name string, exist bool, interv return nil } +//waitForServiceEndpointsNum waits until the amount of endpoints that implement service to expectNum. +func waitForServiceEndpointsNum(c *client.Client, namespace, serviceName string, expectNum int, interval, timeout time.Duration) error { + return wait.Poll(interval, timeout, func() (bool, error) { + Logf("Waiting for amount of service:%s endpoints to %d", serviceName, expectNum) + list, err := c.Endpoints(namespace).List(labels.Everything()) + if err != nil { + return false, err + } + + for _, e := range list.Items { + if e.Name == serviceName && countEndpointsNum(&e) == expectNum { + return true, nil + } + } + return false, nil + }) +} + +func countEndpointsNum(e *api.Endpoints) int { + num := 0 + for _, sub := range e.Subsets { + num += len(sub.Addresses) + } + return num +} + // waitForReplicationController waits until the RC appears (exist == true), or disappears (exist == false) func waitForReplicationController(c *client.Client, namespace, name string, exist bool, interval, timeout time.Duration) error { err := wait.Poll(interval, timeout, func() (bool, error) {