From 19881b2f1525e8fe1b9bc02ce8d58f06a7f42603 Mon Sep 17 00:00:00 2001 From: Jonathan Boulle Date: Wed, 29 Oct 2014 19:06:41 -0700 Subject: [PATCH] etcdhttp: return 404 when removing nonexistent member --- etcdserver/etcdhttp/client.go | 11 +++++++---- etcdserver/etcdhttp/client_test.go | 26 ++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/etcdserver/etcdhttp/client.go b/etcdserver/etcdhttp/client.go index 1840043a4..7c202767e 100644 --- a/etcdserver/etcdhttp/client.go +++ b/etcdserver/etcdhttp/client.go @@ -212,13 +212,16 @@ func (h *membersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { writeError(w, httptypes.NewHTTPError(http.StatusBadRequest, err.Error())) return } - log.Printf("etcdhttp: remove node %x", id) - if err := h.server.RemoveMember(ctx, id); err != nil { + err = h.server.RemoveMember(ctx, id) + switch { + case err == etcdserver.ErrIDNotFound: + writeError(w, httptypes.NewHTTPError(http.StatusNotFound, fmt.Sprintf("No such member: %s", idStr))) + case err != nil: log.Printf("etcdhttp: error removing node %x: %v", id, err) writeError(w, err) - return + default: + w.WriteHeader(http.StatusNoContent) } - w.WriteHeader(http.StatusNoContent) } } diff --git a/etcdserver/etcdhttp/client_test.go b/etcdserver/etcdhttp/client_test.go index b9ae3eaac..a5abc7403 100644 --- a/etcdserver/etcdhttp/client_test.go +++ b/etcdserver/etcdhttp/client_test.go @@ -762,7 +762,7 @@ func TestServeMembersFail(t *testing.T) { http.StatusInternalServerError, }, { - // etcdserver.RemoveMember error + // etcdserver.RemoveMember error with arbitrary server error &http.Request{ URL: mustNewURL(t, path.Join(membersPrefix, "1")), Method: "DELETE", @@ -774,7 +774,29 @@ func TestServeMembersFail(t *testing.T) { http.StatusInternalServerError, }, { - // etcdserver.RemoveMember error + // etcdserver.RemoveMember error with nonexistent ID + &http.Request{ + URL: mustNewURL(t, path.Join(membersPrefix, "0")), + Method: "DELETE", + }, + &errServer{ + etcdserver.ErrIDNotFound, + }, + + http.StatusNotFound, + }, + { + // etcdserver.RemoveMember error with badly formed ID + &http.Request{ + URL: mustNewURL(t, path.Join(membersPrefix, "bad_id")), + Method: "DELETE", + }, + nil, + + http.StatusBadRequest, + }, + { + // etcdserver.RemoveMember with no ID &http.Request{ URL: mustNewURL(t, membersPrefix), Method: "DELETE",