From 2ba01d2dd92598e1b33b5e04092b2bb340e8b252 Mon Sep 17 00:00:00 2001 From: Ryan Uber Date: Fri, 11 Sep 2015 17:02:56 -0700 Subject: [PATCH] api: add status endpoint --- api/status.go | 32 ++++++++++++++++++++++++++++++++ api/status_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 api/status.go create mode 100644 api/status_test.go diff --git a/api/status.go b/api/status.go new file mode 100644 index 000000000..4972d5b2b --- /dev/null +++ b/api/status.go @@ -0,0 +1,32 @@ +package api + +// Status is used to query the status-related endpoints. +type Status struct { + client *Client +} + +// Status returns a handle on the status endpoints. +func (c *Client) Status() *Status { + return &Status{client: c} +} + +// Leader is used to query for the current cluster leader. +func (s *Status) Leader() (string, error) { + var resp string + _, err := s.client.query("/v1/status/leader", &resp, nil) + if err != nil { + return "", err + } + return resp, nil +} + +// Peers is used to query the addresses of the server peers +// in the cluster. +func (s *Status) Peers() ([]string, error) { + var resp []string + _, err := s.client.query("/v1/status/peers", &resp, nil) + if err != nil { + return nil, err + } + return resp, nil +} diff --git a/api/status_test.go b/api/status_test.go new file mode 100644 index 000000000..ec2688a22 --- /dev/null +++ b/api/status_test.go @@ -0,0 +1,41 @@ +package api + +import ( + "testing" + + "github.com/hashicorp/nomad/testutil" +) + +func TestStatus_Leader(t *testing.T) { + c, s := makeClient(t, nil, nil) + defer s.Stop() + status := c.Status() + + // Query for leader status should return a result + out, err := status.Leader() + if err != nil { + t.Fatalf("err: %s", err) + } + if out == "" { + t.Fatalf("expected leader, got: %q", out) + } +} + +func TestStatus_Leader_NoLeader(t *testing.T) { + // Start a server without bootstrap mode. This prevents + // the leadership from being acquired. + c, s := makeClient(t, nil, func(c *testutil.TestServerConfig) { + c.Server.Bootstrap = false + }) + defer s.Stop() + status := c.Status() + + // Query for leader status should return nothing. + out, err := status.Leader() + if err != nil { + t.Fatalf("err: %s", err) + } + if out != "" { + t.Fatalf("expected no leader, got: %q", out) + } +}