From 63fa2a626a9fb39e7d457bfc1c6a4e088e9fdf1e Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Wed, 22 Oct 2014 16:44:44 -0700 Subject: [PATCH] etcdserver: admin PUT returns the json representation of the newly created member --- etcdserver/cluster_store_test.go | 2 +- etcdserver/etcdhttp/http.go | 4 ++++ etcdserver/etcdhttp/http_test.go | 18 ++++++++++++++---- etcdserver/member.go | 4 ++-- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/etcdserver/cluster_store_test.go b/etcdserver/cluster_store_test.go index b26d187d1..11b561b6e 100644 --- a/etcdserver/cluster_store_test.go +++ b/etcdserver/cluster_store_test.go @@ -47,7 +47,7 @@ func TestClusterStoreAdd(t *testing.T) { params: []interface{}{ path.Join(storeMembersPrefix, "1", "attributes"), false, - `{"Name":"node1","ClientURLs":null}`, + `{"Name":"node1"}`, false, store.Permanent, }, diff --git a/etcdserver/etcdhttp/http.go b/etcdserver/etcdhttp/http.go index a67912e3c..1214c8172 100644 --- a/etcdserver/etcdhttp/http.go +++ b/etcdserver/etcdhttp/http.go @@ -185,7 +185,11 @@ func (h serverHandler) serveAdminMembers(w http.ResponseWriter, r *http.Request) return } log.Printf("etcdhttp: added node %x with peer urls %v", m.ID, raftAttr.PeerURLs) + w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) + if err := json.NewEncoder(w).Encode(m); err != nil { + log.Printf("etcdhttp: %v", err) + } case "DELETE": idStr := strings.TrimPrefix(r.URL.Path, adminMembersPrefix) id, err := strconv.ParseUint(idStr, 16, 64) diff --git a/etcdserver/etcdhttp/http_test.go b/etcdserver/etcdhttp/http_test.go index b890d4ecd..339e928a8 100644 --- a/etcdserver/etcdhttp/http_test.go +++ b/etcdserver/etcdhttp/http_test.go @@ -1553,14 +1553,24 @@ func TestServeAdminMembersPut(t *testing.T) { if rw.Code != wcode { t.Errorf("code=%d, want %d", rw.Code, wcode) } - g := rw.Body.String() - if g != "" { - t.Errorf("got body=%q, want %q", g, "") - } wm := etcdserver.Member{ ID: 3064321551348478165, RaftAttributes: raftAttr, } + + wb, err := json.Marshal(wm) + if err != nil { + t.Fatal(err) + } + wct := "application/json" + if gct := rw.Header().Get("Content-Type"); gct != wct { + t.Errorf("content-type = %s, want %s", gct, wct) + } + g := rw.Body.String() + w := string(wb) + "\n" + if g != w { + t.Errorf("got body=%q, want %q", g, w) + } wactions := []action{{name: "AddMember", params: []interface{}{wm}}} if !reflect.DeepEqual(s.actions, wactions) { t.Errorf("actions = %+v, want %+v", s.actions, wactions) diff --git a/etcdserver/member.go b/etcdserver/member.go index 5d66e243a..5a2ca54d0 100644 --- a/etcdserver/member.go +++ b/etcdserver/member.go @@ -37,8 +37,8 @@ type RaftAttributes struct { // Attributes represents all the non-raft related attributes of an etcd member. type Attributes struct { - Name string - ClientURLs []string + Name string `json:",omitempty"` + ClientURLs []string `json:",omitempty"` } type Member struct {