diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index bddeeeb3637..e239ed8bba2 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -1165,12 +1165,14 @@ func hasRemainingContent(c clientset.Interface, clientPool dynamic.ClientPool, n } // find out what content is supported on the server - resources, err := c.Discovery().ServerPreferredNamespacedResources() - if err != nil && !isDynamicDiscoveryError(err) { + // Since extension apiserver is not always available, e.g. metrics server sometimes goes down, + // add retry here. + resources, err := waitForServerPreferredNamespacedResources(c.Discovery(), 30*time.Second) + if err != nil { return false, err } groupVersionResources, err := discovery.GroupVersionResources(resources) - if err != nil && !isDynamicDiscoveryError(err) { + if err != nil { return false, err } @@ -5100,3 +5102,25 @@ func DsFromManifest(url string) (*extensions.DaemonSet, error) { } return &controller, nil } + +// waitForServerPreferredNamespacedResources waits until server preferred namespaced resources could be successfully discovered. +// TODO: Fix https://github.com/kubernetes/kubernetes/issues/55768 and remove the following retry. +func waitForServerPreferredNamespacedResources(d discovery.DiscoveryInterface, timeout time.Duration) ([]*metav1.APIResourceList, error) { + Logf("Waiting up to %v for server preferred namespaced resources to be successfully discovered", timeout) + var resources []*metav1.APIResourceList + if err := wait.PollImmediate(Poll, timeout, func() (bool, error) { + var err error + resources, err = d.ServerPreferredNamespacedResources() + if err == nil || isDynamicDiscoveryError(err) { + return true, nil + } + if !discovery.IsGroupDiscoveryFailedError(err) { + return false, err + } + Logf("Error discoverying server preferred namespaced resources: %v, retrying in %v.", err, Poll) + return false, nil + }); err != nil { + return nil, err + } + return resources, nil +}