From 829adc138e273fcdc0c56d5b10a017bdc2c3adc2 Mon Sep 17 00:00:00 2001 From: Philip O'Toole Date: Thu, 16 Feb 2017 21:00:01 -0800 Subject: [PATCH] Bring code into line with actual disco service --- disco/client.go | 18 +++++++++---- disco/client_test.go | 64 ++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/disco/client.go b/disco/client.go index 0b49f0a3..fc8f2a95 100644 --- a/disco/client.go +++ b/disco/client.go @@ -5,6 +5,7 @@ import ( "bytes" "encoding/json" "errors" + "fmt" "io/ioutil" "net/http" "runtime" @@ -13,6 +14,12 @@ import ( // Nodes represents a set of nodes currently registered at the configured Discovery URL. type Nodes []string +type DiscoResponse struct { + CreatedAt string `json:"created_at"` + DiscoID string `json:"disco_id"` + Nodes []string `json:"nodes"` +} + // Client provides a Discovery Service client. type Client struct { url string @@ -32,7 +39,7 @@ func (c *Client) URL() string { // Register attempts to register with the Discovery Service, using the given // address. -func (c *Client) Register(addr string) (Nodes, error) { +func (c *Client) Register(id, addr string) (*DiscoResponse, error) { m := map[string]string{ "addr": addr, "GOOS": runtime.GOOS, @@ -43,7 +50,8 @@ func (c *Client) Register(addr string) (Nodes, error) { return nil, err } - resp, err := http.Post(c.url, "application-type/json", bytes.NewReader(b)) + url := fmt.Sprintf("%s/%s", c.url, id) + resp, err := http.Post(url, "application-type/json", bytes.NewReader(b)) if err != nil { return nil, err } @@ -58,10 +66,10 @@ func (c *Client) Register(addr string) (Nodes, error) { return nil, errors.New(resp.Status) } - nodes := Nodes{} - if err := json.Unmarshal(b, &nodes); err != nil { + disco := &DiscoResponse{} + if err := json.Unmarshal(b, disco); err != nil { return nil, err } - return nodes, nil + return disco, nil } diff --git a/disco/client_test.go b/disco/client_test.go index 906cdeb1..2f25febe 100644 --- a/disco/client_test.go +++ b/disco/client_test.go @@ -31,7 +31,7 @@ func Test_ClientRegisterBadRequest(t *testing.T) { defer ts.Close() c := New(ts.URL) - _, err := c.Register("http://127.0.0.1") + _, err := c.Register("1234", "http://127.0.0.1") if err == nil { t.Fatalf("failed to receive error on 400 from server") } @@ -47,7 +47,7 @@ func Test_ClientRegisterNotFound(t *testing.T) { defer ts.Close() c := New(ts.URL) - _, err := c.Register("http://127.0.0.1") + _, err := c.Register("1234", "http://127.0.0.1") if err == nil { t.Fatalf("failed to receive error on 404 from server") } @@ -63,7 +63,7 @@ func Test_ClientRegisterForbidden(t *testing.T) { defer ts.Close() c := New(ts.URL) - _, err := c.Register("http://127.0.0.1") + _, err := c.Register("1234", "http://127.0.0.1") if err == nil { t.Fatalf("failed to receive error on 403 from server") } @@ -75,6 +75,10 @@ func Test_ClientRegisterRequestOK(t *testing.T) { t.Fatalf("Client did not use POST") } + if r.URL.String() != "/1234" { + t.Fatalf("Request URL is wrong, got: %s", r.URL.String()) + } + b, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatalf("failed to read request from client: %s", err.Error()) @@ -95,36 +99,17 @@ func Test_ClientRegisterRequestOK(t *testing.T) { t.Fatalf("incorrect GOOS supplied by client: %s", m["GOARCH"]) } - fmt.Fprintln(w, `[]`) + fmt.Fprintln(w, `{"created_at": "2017-02-17 04:49:05.079125", "disco_id": "68d6c7cc-f4cc-11e6-a170-2e79ea0be7b1", "nodes": ["http://127.0.0.1"]}`) })) defer ts.Close() c := New(ts.URL) - nodes, err := c.Register("http://127.0.0.1") + disco, err := c.Register("1234", "http://127.0.0.1") if err != nil { t.Fatalf("failed to register: %s", err.Error()) } - if len(nodes) != 0 { - t.Fatalf("failed to receive empty list of nodes, got %v", nodes) - } -} - -func Test_ClientRegisterLeaderOK(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - t.Fatalf("Client did not use POST") - } - fmt.Fprintln(w, `[]`) - })) - defer ts.Close() - - c := New(ts.URL) - nodes, err := c.Register("http://127.0.0.1") - if err != nil { - t.Fatalf("failed to register: %s", err.Error()) - } - if len(nodes) != 0 { - t.Fatalf("failed to receive empty list of nodes, got %v", nodes) + if len(disco.Nodes) != 1 { + t.Fatalf("failed to receive correct list of nodes, got %v", disco.Nodes) } } @@ -133,20 +118,20 @@ func Test_ClientRegisterFollowerOK(t *testing.T) { if r.Method != "POST" { t.Fatalf("Client did not use POST") } - fmt.Fprintln(w, `["http://1.1.1.1"]`) + fmt.Fprintln(w, `{"created_at": "2017-02-17 04:49:05.079125", "disco_id": "68d6c7cc-f4cc-11e6-a170-2e79ea0be7b1", "nodes": ["http://1.1.1.1", "http://2.2.2.2"]}`) })) defer ts.Close() c := New(ts.URL) - nodes, err := c.Register("http://2.2.2.2") + disco, err := c.Register("1234", "http://2.2.2.2") if err != nil { t.Fatalf("failed to register: %s", err.Error()) } - if len(nodes) != 1 { + if len(disco.Nodes) != 2 { t.Fatalf("failed to receive non-empty list of nodes") } - if nodes[0] != `http://1.1.1.1` { - t.Fatalf("got incorrect node, got %v", nodes[0]) + if disco.Nodes[0] != `http://1.1.1.1` { + t.Fatalf("got incorrect node, got %v", disco.Nodes[0]) } } @@ -155,22 +140,25 @@ func Test_ClientRegisterFollowerMultiOK(t *testing.T) { if r.Method != "POST" { t.Fatalf("Client did not use POST") } - fmt.Fprintln(w, `["http://1.1.1.1", "http://2.2.2.2"]`) + fmt.Fprintln(w, `{"created_at": "2017-02-17 04:49:05.079125", "disco_id": "68d6c7cc-f4cc-11e6-a170-2e79ea0be7b1", "nodes": ["http://1.1.1.1", "http://2.2.2.2", "http://3.3.3.3"]}`) })) defer ts.Close() c := New(ts.URL) - nodes, err := c.Register("http://3.3.3.3") + disco, err := c.Register("1234", "http://3.3.3.3") if err != nil { t.Fatalf("failed to register: %s", err.Error()) } - if len(nodes) != 2 { + if len(disco.Nodes) != 3 { t.Fatalf("failed to receive non-empty list of nodes") } - if nodes[0] != `http://1.1.1.1` { - t.Fatalf("got incorrect first node, got %v", nodes[0]) + if disco.Nodes[0] != `http://1.1.1.1` { + t.Fatalf("got incorrect first node, got %v", disco.Nodes[0]) + } + if disco.Nodes[1] != `http://2.2.2.2` { + t.Fatalf("got incorrect second node, got %v", disco.Nodes[1]) } - if nodes[1] != `http://2.2.2.2` { - t.Fatalf("got incorrect second node, got %v", nodes[1]) + if disco.Nodes[2] != `http://3.3.3.3` { + t.Fatalf("got incorrect third node, got %v", disco.Nodes[1]) } }