1
0
Fork 0

Bring code into line with actual disco service

master
Philip O'Toole 8 years ago
parent 5452b7d470
commit 829adc138e

@ -5,6 +5,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"runtime" "runtime"
@ -13,6 +14,12 @@ import (
// Nodes represents a set of nodes currently registered at the configured Discovery URL. // Nodes represents a set of nodes currently registered at the configured Discovery URL.
type Nodes []string 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. // Client provides a Discovery Service client.
type Client struct { type Client struct {
url string url string
@ -32,7 +39,7 @@ func (c *Client) URL() string {
// Register attempts to register with the Discovery Service, using the given // Register attempts to register with the Discovery Service, using the given
// address. // address.
func (c *Client) Register(addr string) (Nodes, error) { func (c *Client) Register(id, addr string) (*DiscoResponse, error) {
m := map[string]string{ m := map[string]string{
"addr": addr, "addr": addr,
"GOOS": runtime.GOOS, "GOOS": runtime.GOOS,
@ -43,7 +50,8 @@ func (c *Client) Register(addr string) (Nodes, error) {
return nil, err 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 { if err != nil {
return nil, err return nil, err
} }
@ -58,10 +66,10 @@ func (c *Client) Register(addr string) (Nodes, error) {
return nil, errors.New(resp.Status) return nil, errors.New(resp.Status)
} }
nodes := Nodes{} disco := &DiscoResponse{}
if err := json.Unmarshal(b, &nodes); err != nil { if err := json.Unmarshal(b, disco); err != nil {
return nil, err return nil, err
} }
return nodes, nil return disco, nil
} }

@ -31,7 +31,7 @@ func Test_ClientRegisterBadRequest(t *testing.T) {
defer ts.Close() defer ts.Close()
c := New(ts.URL) c := New(ts.URL)
_, err := c.Register("http://127.0.0.1") _, err := c.Register("1234", "http://127.0.0.1")
if err == nil { if err == nil {
t.Fatalf("failed to receive error on 400 from server") t.Fatalf("failed to receive error on 400 from server")
} }
@ -47,7 +47,7 @@ func Test_ClientRegisterNotFound(t *testing.T) {
defer ts.Close() defer ts.Close()
c := New(ts.URL) c := New(ts.URL)
_, err := c.Register("http://127.0.0.1") _, err := c.Register("1234", "http://127.0.0.1")
if err == nil { if err == nil {
t.Fatalf("failed to receive error on 404 from server") t.Fatalf("failed to receive error on 404 from server")
} }
@ -63,7 +63,7 @@ func Test_ClientRegisterForbidden(t *testing.T) {
defer ts.Close() defer ts.Close()
c := New(ts.URL) c := New(ts.URL)
_, err := c.Register("http://127.0.0.1") _, err := c.Register("1234", "http://127.0.0.1")
if err == nil { if err == nil {
t.Fatalf("failed to receive error on 403 from server") 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") 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) b, err := ioutil.ReadAll(r.Body)
if err != nil { if err != nil {
t.Fatalf("failed to read request from client: %s", err.Error()) 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"]) 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() defer ts.Close()
c := New(ts.URL) 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 { if err != nil {
t.Fatalf("failed to register: %s", err.Error()) t.Fatalf("failed to register: %s", err.Error())
} }
if len(nodes) != 0 { if len(disco.Nodes) != 1 {
t.Fatalf("failed to receive empty list of nodes, got %v", nodes) t.Fatalf("failed to receive correct list of nodes, got %v", disco.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)
} }
} }
@ -133,20 +118,20 @@ func Test_ClientRegisterFollowerOK(t *testing.T) {
if r.Method != "POST" { if r.Method != "POST" {
t.Fatalf("Client did not use 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() defer ts.Close()
c := New(ts.URL) 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 { if err != nil {
t.Fatalf("failed to register: %s", err.Error()) 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") t.Fatalf("failed to receive non-empty list of nodes")
} }
if nodes[0] != `http://1.1.1.1` { if disco.Nodes[0] != `http://1.1.1.1` {
t.Fatalf("got incorrect node, got %v", nodes[0]) t.Fatalf("got incorrect node, got %v", disco.Nodes[0])
} }
} }
@ -155,22 +140,25 @@ func Test_ClientRegisterFollowerMultiOK(t *testing.T) {
if r.Method != "POST" { if r.Method != "POST" {
t.Fatalf("Client did not use 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() defer ts.Close()
c := New(ts.URL) 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 { if err != nil {
t.Fatalf("failed to register: %s", err.Error()) 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") t.Fatalf("failed to receive non-empty list of nodes")
} }
if nodes[0] != `http://1.1.1.1` { if disco.Nodes[0] != `http://1.1.1.1` {
t.Fatalf("got incorrect first node, got %v", nodes[0]) 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` { if disco.Nodes[2] != `http://3.3.3.3` {
t.Fatalf("got incorrect second node, got %v", nodes[1]) t.Fatalf("got incorrect third node, got %v", disco.Nodes[1])
} }
} }

Loading…
Cancel
Save