Jelajahi Sumber

etcd: support v2/machines endpoint

Xiang Li 11 tahun lalu
induk
melakukan
ac44e56ea0
4 mengubah file dengan 63 tambahan dan 1 penghapusan
  1. 3 1
      etcd/etcd.go
  2. 16 0
      etcd/v2_http.go
  3. 44 0
      etcd/v2_http_endpoint_test.go
  4. 0 0
      etcd/v2_http_kv_test.go

+ 3 - 1
etcd/etcd.go

@@ -21,6 +21,7 @@ const (
 
 	v2machineKVPrefix = "/_etcd/machines"
 	v2Prefix          = "/v2/keys"
+	v2machinePrefix   = "/v2/machines"
 
 	raftPrefix = "/raft"
 )
@@ -73,8 +74,9 @@ func New(c *config.Config, id int) *Server {
 
 	m := http.NewServeMux()
 	//m.Handle("/HEAD", handlerErr(s.serveHead))
-	m.Handle("/", handlerErr(s.serveValue))
+	m.Handle(v2Prefix+"/", handlerErr(s.serveValue))
 	m.Handle("/raft", s.t)
+	m.Handle(v2machinePrefix, handlerErr(s.serveMachines))
 	s.Handler = m
 	return s
 }

+ 16 - 0
etcd/v2_http.go

@@ -27,6 +27,22 @@ func (s *Server) serveValue(w http.ResponseWriter, r *http.Request) error {
 	return allow(w, "GET", "PUT", "POST", "DELETE", "HEAD")
 }
 
+func (s *Server) serveMachines(w http.ResponseWriter, r *http.Request) error {
+	if r.Method != "GET" {
+		return allow(w, "GET")
+	}
+	v, err := s.Store.Get(v2machineKVPrefix, false, false)
+	if err != nil {
+		panic(err)
+	}
+	ns := make([]string, len(v.Node.Nodes))
+	for i, n := range v.Node.Nodes {
+		ns[i] = *n.Value
+	}
+	w.Write([]byte(strings.Join(ns, ",")))
+	return nil
+}
+
 type handlerErr func(w http.ResponseWriter, r *http.Request) error
 
 func (eh handlerErr) ServeHTTP(w http.ResponseWriter, r *http.Request) {

+ 44 - 0
etcd/v2_http_endpoint_test.go

@@ -0,0 +1,44 @@
+package etcd
+
+import (
+	"io/ioutil"
+	"net/http"
+	"strings"
+	"testing"
+)
+
+func TestMachinesEndPoint(t *testing.T) {
+	es, hs := buildCluster(3)
+	waitCluster(t, es)
+
+	us := make([]string, len(hs))
+	for i := range hs {
+		us[i] = hs[i].URL
+	}
+	w := strings.Join(us, ",")
+
+	for i := range hs {
+		r, err := http.Get(hs[i].URL + v2machinePrefix)
+		if err != nil {
+			t.Errorf("%v", err)
+			break
+		}
+		b, err := ioutil.ReadAll(r.Body)
+		r.Body.Close()
+		if err != nil {
+			t.Errorf("%v", err)
+			break
+		}
+		if string(b) != w {
+			t.Errorf("machines = %v, want %v", string(b), w)
+		}
+	}
+
+	for i := range es {
+		es[len(es)-i-1].Stop()
+	}
+	for i := range hs {
+		hs[len(hs)-i-1].Close()
+	}
+	afterTest(t)
+}

+ 0 - 0
etcd/v2_http_test.go → etcd/v2_http_kv_test.go