From 8b12e1aa37f0da714c48eb94758f2a090ea23f17 Mon Sep 17 00:00:00 2001 From: Brian Waldon Date: Wed, 29 Oct 2014 14:35:31 -0700 Subject: [PATCH] client: fill in MembersAPI --- client/members.go | 68 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/client/members.go b/client/members.go index 3e7616cbb..a5fd755be 100644 --- a/client/members.go +++ b/client/members.go @@ -17,6 +17,7 @@ package client import ( + "bytes" "encoding/json" "fmt" "net/http" @@ -54,6 +55,8 @@ func NewMembersAPI(tr *http.Transport, ep string, to time.Duration) (MembersAPI, type MembersAPI interface { List() ([]httptypes.Member, error) + Add(peerURL string) (*httptypes.Member, error) + Remove(mID string) error } type httpMembersAPI struct { @@ -66,11 +69,7 @@ func (m *httpMembersAPI) List() ([]httptypes.Member, error) { return nil, err } - mResponse := httpMembersAPIResponse{ - code: httpresp.StatusCode, - } - - if err := mResponse.err(); err != nil { + if err := assertStatusCode(http.StatusOK, httpresp.StatusCode); err != nil { return nil, err } @@ -82,15 +81,33 @@ func (m *httpMembersAPI) List() ([]httptypes.Member, error) { return []httptypes.Member(mCollection), nil } -type httpMembersAPIResponse struct { - code int +func (m *httpMembersAPI) Add(peerURL string) (*httptypes.Member, error) { + req := &membersAPIActionAdd{peerURL: peerURL} + httpresp, body, err := m.client.doWithTimeout(req) + if err != nil { + return nil, err + } + + if err := assertStatusCode(http.StatusCreated, httpresp.StatusCode); err != nil { + return nil, err + } + + var memb httptypes.Member + if err := json.Unmarshal(body, &memb); err != nil { + return nil, err + } + + return &memb, nil } -func (r *httpMembersAPIResponse) err() (err error) { - if r.code != http.StatusOK { - err = fmt.Errorf("unrecognized status code %d", r.code) +func (m *httpMembersAPI) Remove(memberID string) error { + req := &membersAPIActionRemove{memberID: memberID} + httpresp, _, err := m.client.doWithTimeout(req) + if err != nil { + return err } - return + + return assertStatusCode(http.StatusNoContent, httpresp.StatusCode) } type membersAPIActionList struct{} @@ -99,3 +116,32 @@ func (l *membersAPIActionList) httpRequest(ep url.URL) *http.Request { req, _ := http.NewRequest("GET", ep.String(), nil) return req } + +type membersAPIActionRemove struct { + memberID string +} + +func (d *membersAPIActionRemove) httpRequest(ep url.URL) *http.Request { + ep.Path = path.Join(ep.Path, d.memberID) + req, _ := http.NewRequest("DELETE", ep.String(), nil) + return req +} + +type membersAPIActionAdd struct { + peerURL string +} + +func (a *membersAPIActionAdd) httpRequest(ep url.URL) *http.Request { + m := httptypes.Member{PeerURLs: []string{a.peerURL}} + b, _ := json.Marshal(&m) + req, _ := http.NewRequest("POST", ep.String(), bytes.NewReader(b)) + req.Header.Set("Content-Type", "application/json") + return req +} + +func assertStatusCode(want, got int) (err error) { + if want != got { + err = fmt.Errorf("unexpected status code %d", got) + } + return err +}