diff --git a/cluster/addons/dns/kube2sky/kube2sky.go b/cluster/addons/dns/kube2sky/kube2sky.go index 3ac6e4f92e7..fb9152754ca 100644 --- a/cluster/addons/dns/kube2sky/kube2sky.go +++ b/cluster/addons/dns/kube2sky/kube2sky.go @@ -106,7 +106,7 @@ func mutateEtcdOrDie(mutator func() error) { func newEtcdClient() (client *etcd.Client) { maxConnectRetries := 12 for maxConnectRetries > 0 { - if _, _, err := tools.GetEtcdVersion(*etcd_server); err != nil { + if _, err := tools.GetEtcdVersion(*etcd_server); err != nil { log.Fatalf("Failed to connect to etcd server: %v, error: %v", *etcd_server, err) if maxConnectRetries > 0 { log.Println("Retrying request after 5 second sleep.") @@ -120,13 +120,25 @@ func newEtcdClient() (client *etcd.Client) { break } } - client = etcd.NewClient([]string{*etcd_server}) - if client == nil { - return nil + // loop until we have > 0 machines && machines[0] != "" + timeout := false + go func() { + <-time.After(10 * time.Second) + timeout = true + }() + for !timeout { + client = etcd.NewClient([]string{*etcd_server}) + if client == nil { + return nil + } + client.SyncCluster() + machines := client.GetCluster() + if len(machines) > 0 && len(machines[0]) > 0 { + return client + } } - client.SyncCluster() - - return client + log.Fatal("Timed out waiting for correct response from etcd server") + return nil } // TODO: evaluate using pkg/client/clientcmd diff --git a/cluster/addons/dns/skydns-rc.yaml.in b/cluster/addons/dns/skydns-rc.yaml.in index fb1c703e999..1d024a34e17 100644 --- a/cluster/addons/dns/skydns-rc.yaml.in +++ b/cluster/addons/dns/skydns-rc.yaml.in @@ -21,15 +21,17 @@ desiredState: dnsPolicy: "Default" # Don't use cluster DNS. containers: - name: etcd - image: quay.io/coreos/etcd:v2.0.3 + image: gcr.io/google_containers/etcd:2.0.9 command: [ - # entrypoint = "/etcd", - "-listen-client-urls=http://0.0.0.0:2379,http://0.0.0.0:4001", + "/usr/local/bin/etcd", + "--addr", + "127.0.0.1:4001", + "--bind-addr", + "127.0.0.1:4001", "-initial-cluster-token=skydns-etcd", - "-advertise-client-urls=http://127.0.0.1:4001", ] - name: kube2sky - image: gcr.io/google_containers/kube2sky:1.2 + image: gcr.io/google_containers/kube2sky:1.3 volumeMounts: - name: dns-token mountPath: /etc/dns_token diff --git a/pkg/tools/etcd_helper.go b/pkg/tools/etcd_helper.go index a3ba4122e05..dd540a78eae 100644 --- a/pkg/tools/etcd_helper.go +++ b/pkg/tools/etcd_helper.go @@ -17,7 +17,6 @@ limitations under the License. package tools import ( - "encoding/json" "errors" "fmt" "io/ioutil" @@ -509,35 +508,22 @@ func (h *EtcdHelper) PrefixEtcdKey(key string) string { return path.Join("/", h.PathPrefix, key) } -// GetEtcdVersion performs a version check against the provided Etcd server, returning a triplet -// of the release version, internal version, and error (if any). -func GetEtcdVersion(host string) (releaseVersion, internalVersion string, err error) { +// GetEtcdVersion performs a version check against the provided Etcd server, +// returning the string response, and error (if any). +func GetEtcdVersion(host string) (string, error) { response, err := http.Get(host + "/version") if err != nil { - return "", "", err + return "", err } defer response.Body.Close() - - body, err := ioutil.ReadAll(response.Body) + if response.StatusCode != http.StatusOK { + return "", fmt.Errorf("Unsuccessful response from server: %v", err) + } + versionBytes, err := ioutil.ReadAll(response.Body) if err != nil { - return "", "", err + return "", err } - - var dat map[string]interface{} - if err := json.Unmarshal(body, &dat); err != nil { - return "", "", fmt.Errorf("unknown server: %s", string(body)) - } - if obj := dat["releaseVersion"]; obj != nil { - if s, ok := obj.(string); ok { - releaseVersion = s - } - } - if obj := dat["internalVersion"]; obj != nil { - if s, ok := obj.(string); ok { - internalVersion = s - } - } - return + return string(versionBytes), nil } func startEtcd() (*exec.Cmd, error) { @@ -550,7 +536,7 @@ func startEtcd() (*exec.Cmd, error) { } func NewEtcdClientStartServerIfNecessary(server string) (EtcdClient, error) { - _, _, err := GetEtcdVersion(server) + _, err := GetEtcdVersion(server) if err != nil { glog.Infof("Failed to find etcd, attempting to start.") _, err := startEtcd() diff --git a/pkg/tools/etcd_helper_test.go b/pkg/tools/etcd_helper_test.go index 3f010a24597..ff0ece9e429 100644 --- a/pkg/tools/etcd_helper_test.go +++ b/pkg/tools/etcd_helper_test.go @@ -685,35 +685,16 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) { func TestGetEtcdVersion_ValidVersion(t *testing.T) { testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "{\"releaseVersion\":\"2.0.3\",\"internalVersion\":\"2\"}") + fmt.Fprint(w, "etcd 2.0.9") })) defer testServer.Close() - var relVersion string - var intVersion string + var version string var err error - if relVersion, intVersion, err = GetEtcdVersion(testServer.URL); err != nil { + if version, err = GetEtcdVersion(testServer.URL); err != nil { t.Errorf("Unexpected error: %v", err) } - assert.Equal(t, "2.0.3", relVersion, "Unexpected external version") - assert.Equal(t, "2", intVersion, "Unexpected internal version") - assert.Nil(t, err) -} - -func TestGetEtcdVersion_UnknownVersion(t *testing.T) { - testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "{\"unknownAttribute\":\"foobar\",\"internalVersion\":\"2\"}") - })) - defer testServer.Close() - - var relVersion string - var intVersion string - var err error - if relVersion, intVersion, err = GetEtcdVersion(testServer.URL); err != nil { - t.Errorf("Unexpected error: %v", err) - } - assert.Equal(t, "", relVersion, "Unexpected external version") - assert.Equal(t, "2", intVersion, "Unexpected internal version") + assert.Equal(t, "etcd 2.0.9", version, "Unexpected version") assert.Nil(t, err) } @@ -723,8 +704,12 @@ func TestGetEtcdVersion_ErrorStatus(t *testing.T) { })) defer testServer.Close() - var err error - _, _, err = GetEtcdVersion(testServer.URL) + _, err := GetEtcdVersion(testServer.URL) + assert.NotNil(t, err) +} + +func TestGetEtcdVersion_NotListening(t *testing.T) { + _, err := GetEtcdVersion("http://127.0.0.1:4001") assert.NotNil(t, err) }