diff --git a/server/peer_server.go b/server/peer_server.go index 3b98c2bb1..949151c3e 100644 --- a/server/peer_server.go +++ b/server/peer_server.go @@ -300,6 +300,8 @@ func (s *PeerServer) HTTPHandler() http.Handler { router.HandleFunc("/remove/{name:.+}", s.RemoveHttpHandler) router.HandleFunc("/config", s.getClusterConfigHttpHandler).Methods("GET") router.HandleFunc("/config", s.setClusterConfigHttpHandler).Methods("PUT") + router.HandleFunc("/machines", s.getMachinesHttpHandler).Methods("GET") + router.HandleFunc("/machines/{name}", s.getMachineHttpHandler).Methods("GET") router.HandleFunc("/vote", s.VoteHttpHandler) router.HandleFunc("/log", s.GetLogHttpHandler) router.HandleFunc("/log/append", s.AppendEntriesHttpHandler) diff --git a/server/peer_server_handlers.go b/server/peer_server_handlers.go index e748d6a60..374c78173 100644 --- a/server/peer_server_handlers.go +++ b/server/peer_server_handlers.go @@ -227,6 +227,50 @@ func (ps *PeerServer) setClusterConfigHttpHandler(w http.ResponseWriter, req *ht json.NewEncoder(w).Encode(&ps.clusterConfig) } +// Retrieves a list of peers and proxies. +func (ps *PeerServer) getMachinesHttpHandler(w http.ResponseWriter, req *http.Request) { + machines := make([]*machineMessage, 0) + for _, name := range ps.registry.Peers() { + machines = append(machines, ps.getMachineMessage(name)) + } + for _, name := range ps.registry.Proxies() { + machines = append(machines, ps.getMachineMessage(name)) + } + json.NewEncoder(w).Encode(&machines) +} + +// Retrieve single peer or proxy. +func (ps *PeerServer) getMachineHttpHandler(w http.ResponseWriter, req *http.Request) { + vars := mux.Vars(req) + json.NewEncoder(w).Encode(ps.getMachineMessage(vars["name"])) +} + +func (ps *PeerServer) getMachineMessage(name string) *machineMessage { + if ps.registry.PeerExists(name) { + clientURL, _ := ps.registry.ClientURL(name) + peerURL, _ := ps.registry.PeerURL(name) + return &machineMessage{ + Name: name, + Mode: PeerMode, + ClientURL: clientURL, + PeerURL: peerURL, + } + } + + if ps.registry.ProxyExists(name) { + clientURL, _ := ps.registry.ProxyClientURL(name) + peerURL, _ := ps.registry.ProxyPeerURL(name) + return &machineMessage{ + Name: name, + Mode: ProxyMode, + ClientURL: clientURL, + PeerURL: peerURL, + } + } + + return nil +} + // Response to the name request func (ps *PeerServer) NameHttpHandler(w http.ResponseWriter, req *http.Request) { log.Debugf("[recv] Get %s/name/ ", ps.Config.URL) @@ -272,3 +316,11 @@ func (ps *PeerServer) UpgradeHttpHandler(w http.ResponseWriter, req *http.Reques w.WriteHeader(http.StatusOK) } + +// machineMessage represents information about a peer or proxy in the registry. +type machineMessage struct { + Name string `json:"name"` + Mode Mode `json:"mode"` + ClientURL string `json:"clientURL"` + PeerURL string `json:"peerURL"` +} diff --git a/tests/functional/proxy_test.go b/tests/functional/proxy_test.go index 03de0120d..e3290c688 100644 --- a/tests/functional/proxy_test.go +++ b/tests/functional/proxy_test.go @@ -36,7 +36,7 @@ func TestProxy(t *testing.T) { // Check that all peers and proxies have the value. for i, _ := range etcds { - resp, err := tests.Get(fmt.Sprintf("http://localhost:%d/v2/keys/foo", 4000 + (i+1))) + resp, err := tests.Get(fmt.Sprintf("http://localhost:%d/v2/keys/foo", 4000+(i+1))) if assert.NoError(t, err) { body := tests.ReadBodyJSON(resp) if node, _ := body["node"].(map[string]interface{}); assert.NotNil(t, node) {