diff --git a/federation/pkg/federation-controller/util/cluster_util.go b/federation/pkg/federation-controller/util/cluster_util.go index a92c3a829b..5105fa5387 100644 --- a/federation/pkg/federation-controller/util/cluster_util.go +++ b/federation/pkg/federation-controller/util/cluster_util.go @@ -18,21 +18,26 @@ package util import ( "fmt" + "net" + "os" + "time" + "github.com/golang/glog" federation_v1alpha1 "k8s.io/kubernetes/federation/apis/federation/v1alpha1" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/client/restclient" client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api" utilnet "k8s.io/kubernetes/pkg/util/net" - "net" - "os" + "k8s.io/kubernetes/pkg/util/wait" ) const ( KubeAPIQPS = 20.0 KubeAPIBurst = 30 KubeconfigSecretDataKey = "kubeconfig" + getSecretTimeout = 1 * time.Minute ) func BuildClusterConfig(c *federation_v1alpha1.Cluster) (*restclient.Config, error) { @@ -101,9 +106,20 @@ var KubeconfigGetterForSecret = func(secretName string) clientcmd.KubeconfigGett return nil, fmt.Errorf("error in creating in-cluster client: %s", err) } data = []byte{} - secret, err := client.Secrets(namespace).Get(secretName) + var secret *api.Secret + err = wait.PollImmediate(1*time.Second, getSecretTimeout, func() (bool, error) { + secret, err = client.Secrets(namespace).Get(secretName) + if err == nil { + return true, nil + } + glog.Warningf("error in fetching secret: %s", err) + return false, nil + }) if err != nil { - return nil, fmt.Errorf("error in fetching secret: %s", err) + return nil, fmt.Errorf("timed out waiting for secret: %s", err) + } + if secret == nil { + return nil, fmt.Errorf("unexpected: received null secret %s", secretName) } ok := false data, ok = secret.Data[KubeconfigSecretDataKey]