From ac44e56ea0b5468e86db86bd99b6274fd85ed361 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 7 Jul 2014 12:08:49 -0700 Subject: [PATCH] etcd: support v2/machines endpoint --- etcd/etcd.go | 4 +- etcd/v2_http.go | 16 +++++++ etcd/v2_http_endpoint_test.go | 44 ++++++++++++++++++++ etcd/{v2_http_test.go => v2_http_kv_test.go} | 0 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 etcd/v2_http_endpoint_test.go rename etcd/{v2_http_test.go => v2_http_kv_test.go} (100%) diff --git a/etcd/etcd.go b/etcd/etcd.go index 62f683718..8ab598863 100644 --- a/etcd/etcd.go +++ b/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 } diff --git a/etcd/v2_http.go b/etcd/v2_http.go index aa678618b..e8c724f8e 100644 --- a/etcd/v2_http.go +++ b/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) { diff --git a/etcd/v2_http_endpoint_test.go b/etcd/v2_http_endpoint_test.go new file mode 100644 index 000000000..03db95e73 --- /dev/null +++ b/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) +} diff --git a/etcd/v2_http_test.go b/etcd/v2_http_kv_test.go similarity index 100% rename from etcd/v2_http_test.go rename to etcd/v2_http_kv_test.go