mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Fix the etcd version check and have it return the version string.
This commit is contained in:
parent
bdb307cc46
commit
c38c6f0dad
@ -17,6 +17,7 @@ limitations under the License.
|
|||||||
package tools
|
package tools
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@ -24,7 +25,6 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
||||||
@ -418,20 +418,35 @@ func (h *EtcdHelper) AtomicUpdate(key string, ptrToType runtime.Object, ignoreNo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkEtcd(host string) error {
|
// 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) {
|
||||||
response, err := http.Get(host + "/version")
|
response, err := http.Get(host + "/version")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", "", err
|
||||||
}
|
}
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(response.Body)
|
body, err := ioutil.ReadAll(response.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", "", err
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(string(body), "etcd") {
|
|
||||||
return fmt.Errorf("unknown server: %s", string(body))
|
var dat map[string]interface{}
|
||||||
|
if err := json.Unmarshal(body, &dat); err != nil {
|
||||||
|
return "", "", fmt.Errorf("unknown server: %s", string(body))
|
||||||
}
|
}
|
||||||
return nil
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
func startEtcd() (*exec.Cmd, error) {
|
func startEtcd() (*exec.Cmd, error) {
|
||||||
@ -444,7 +459,7 @@ func startEtcd() (*exec.Cmd, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewEtcdClientStartServerIfNecessary(server string) (EtcdClient, error) {
|
func NewEtcdClientStartServerIfNecessary(server string) (EtcdClient, error) {
|
||||||
err := checkEtcd(server)
|
_, _, err := GetEtcdVersion(server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Infof("Failed to find etcd, attempting to start.")
|
glog.Infof("Failed to find etcd, attempting to start.")
|
||||||
_, err := startEtcd()
|
_, err := startEtcd()
|
||||||
|
@ -19,6 +19,8 @@ package tools
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
@ -29,6 +31,7 @@ import (
|
|||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
|
||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
||||||
"github.com/coreos/go-etcd/etcd"
|
"github.com/coreos/go-etcd/etcd"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TestResource struct {
|
type TestResource struct {
|
||||||
@ -608,3 +611,48 @@ func TestAtomicUpdate_CreateCollision(t *testing.T) {
|
|||||||
t.Errorf("Some of the writes were lost. Stored value: %d", stored.Value)
|
t.Errorf("Some of the writes were lost. Stored value: %d", stored.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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\"}")
|
||||||
|
}))
|
||||||
|
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, "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.Nil(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetEtcdVersion_ErrorStatus(t *testing.T) {
|
||||||
|
testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.WriteHeader(http.StatusServiceUnavailable)
|
||||||
|
}))
|
||||||
|
defer testServer.Close()
|
||||||
|
|
||||||
|
var err error
|
||||||
|
_, _, err = GetEtcdVersion(testServer.URL)
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user