diff --git a/discovery/client.go b/discovery/client.go new file mode 100644 index 0000000000..fde7ace444 --- /dev/null +++ b/discovery/client.go @@ -0,0 +1,40 @@ +package discovery + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" +) + +const DISCOVERY_URL = "https://discovery-stage.hub.docker.com/v1" + +// FetchSlaves returns the slaves for the discovery service at the specified endpoint +func FetchSlaves(token string) ([]string, error) { + resp, err := http.Get(fmt.Sprintf("%s/%s/%s", DISCOVERY_URL, "clusters", token)) + if err != nil { + return nil, err + } + + if resp.Body != nil { + defer resp.Body.Close() + } + + var addrs []string + if resp.StatusCode == http.StatusOK { + if err := json.NewDecoder(resp.Body).Decode(&addrs); err != nil { + return nil, err + } + } + + return addrs, nil +} + +// RegisterSlave adds a new slave identified by the slaveID into the discovery service +// the default TTL is 30 secs +func RegisterSlave(addr, token string) error { + buf := strings.NewReader(addr) + + _, err := http.Post(fmt.Sprintf("%s/%s/%s", DISCOVERY_URL, "clusters", token), "application/json", buf) + return err +} diff --git a/discovery/client_test.go b/discovery/client_test.go new file mode 100644 index 0000000000..260c48fd4d --- /dev/null +++ b/discovery/client_test.go @@ -0,0 +1,27 @@ +package discovery + +import "testing" + +func TestRegisterLocal(t *testing.T) { + expected := "127.0.0.1:2675" + if err := RegisterSlave(expected, "TEST_TOKEN"); err != nil { + t.Fatal(err) + } + + addrs, err := FetchSlaves("TEST_TOKEN") + if err != nil { + t.Fatal(err) + } + + if len(addrs) != 1 { + t.Fatalf("expected addr len == 1, got len = %d", len(addrs)) + } + + if addrs[0] != expected { + t.Fatalf("expected addr %q but received %q", expected, addrs[0]) + } + + if err = RegisterSlave(expected, "TEST_TOKEN"); err != nil { + t.Fatal(err) + } +}