Browse Source

etcdhttp: return 404 when removing nonexistent member

Jonathan Boulle 11 years ago
parent
commit
19881b2f15
2 changed files with 31 additions and 6 deletions
  1. 7 4
      etcdserver/etcdhttp/client.go
  2. 24 2
      etcdserver/etcdhttp/client_test.go

+ 7 - 4
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()))
 			writeError(w, httptypes.NewHTTPError(http.StatusBadRequest, err.Error()))
 			return
 			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)
 			log.Printf("etcdhttp: error removing node %x: %v", id, err)
 			writeError(w, err)
 			writeError(w, err)
-			return
+		default:
+			w.WriteHeader(http.StatusNoContent)
 		}
 		}
-		w.WriteHeader(http.StatusNoContent)
 	}
 	}
 }
 }
 
 

+ 24 - 2
etcdserver/etcdhttp/client_test.go

@@ -762,7 +762,7 @@ func TestServeMembersFail(t *testing.T) {
 			http.StatusInternalServerError,
 			http.StatusInternalServerError,
 		},
 		},
 		{
 		{
-			// etcdserver.RemoveMember error
+			// etcdserver.RemoveMember error with arbitrary server error
 			&http.Request{
 			&http.Request{
 				URL:    mustNewURL(t, path.Join(membersPrefix, "1")),
 				URL:    mustNewURL(t, path.Join(membersPrefix, "1")),
 				Method: "DELETE",
 				Method: "DELETE",
@@ -774,7 +774,29 @@ func TestServeMembersFail(t *testing.T) {
 			http.StatusInternalServerError,
 			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{
 			&http.Request{
 				URL:    mustNewURL(t, membersPrefix),
 				URL:    mustNewURL(t, membersPrefix),
 				Method: "DELETE",
 				Method: "DELETE",