From 33bc5bf6a809755e490d079deaf6fabe5671c8be Mon Sep 17 00:00:00 2001 From: Claudiu Belu Date: Tue, 16 Apr 2019 01:53:18 -0700 Subject: [PATCH] tests: Adds retry to netexec connectivity check The container might start before all the networking plumbing has been sucessfully completed, causing the Kubernetes reachability check to fail. This commit adds a few retries to the connectivity check. --- test/images/nettest/BUILD | 1 + test/images/nettest/nettest.go | 26 +++++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/test/images/nettest/BUILD b/test/images/nettest/BUILD index 1182e4d3dea..931ecf9d91f 100644 --- a/test/images/nettest/BUILD +++ b/test/images/nettest/BUILD @@ -13,6 +13,7 @@ go_library( deps = [ "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", ], diff --git a/test/images/nettest/nettest.go b/test/images/nettest/nettest.go index e2f33f5565e..3b4a1f222db 100644 --- a/test/images/nettest/nettest.go +++ b/test/images/nettest/nettest.go @@ -46,6 +46,7 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/version" clientset "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" ) @@ -217,6 +218,10 @@ func main() { // Find all sibling pods in the service and post to their /write handler. func contactOthers(state *State) { + var ( + versionInfo *version.Info + err error + ) sleepTime := 5 * time.Second // In large cluster getting all endpoints is pretty expensive. // Thus, we will limit ourselves to send on average at most 10 such @@ -241,11 +246,22 @@ func contactOthers(state *State) { if err != nil { log.Fatalf("Unable to create client; error: %v\n", err) } - // Double check that worked by getting the server version. - if v, err := client.Discovery().ServerVersion(); err != nil { - log.Fatalf("Unable to get server version: %v\n", err) - } else { - log.Printf("Server version: %#v\n", v) + + // Try to get the server version until ; we use a timeout because + // the pod might not have immediate network connectivity. + for start := time.Now(); time.Since(start) < timeout; time.Sleep(sleepTime) { + // Double check that worked by getting the server version. + if versionInfo, err = client.Discovery().ServerVersion(); err != nil { + log.Printf("Unable to get server version: %v; retrying.\n", err) + } else { + log.Printf("Server version: %#v\n", versionInfo) + break + } + time.Sleep(1 * time.Second) + } + + if err != nil { + log.Fatalf("Unable to contact Kubernetes: %v\n", err) } for start := time.Now(); time.Since(start) < timeout; time.Sleep(sleepTime) {