diff --git a/command/agent/http.go b/command/agent/http.go index 681e19ff3..1478c9d5a 100644 --- a/command/agent/http.go +++ b/command/agent/http.go @@ -109,7 +109,7 @@ func (s *HTTPServer) registerHandlers(enableDebug bool) { s.mux.HandleFunc("/v1/agent/force-leave", s.wrap(s.AgentForceLeaveRequest)) s.mux.HandleFunc("/v1/agent/servers", s.wrap(s.AgentServersRequest)) - s.mux.HandleFunc("/v1/regions", s.wrap(s.RegionsListRequest)) + s.mux.HandleFunc("/v1/regions", s.wrap(s.RegionListRequest)) s.mux.HandleFunc("/v1/status/leader", s.wrap(s.StatusLeaderRequest)) s.mux.HandleFunc("/v1/status/peers", s.wrap(s.StatusPeersRequest)) diff --git a/command/agent/region_endpoint_test.go b/command/agent/region_endpoint_test.go new file mode 100644 index 000000000..006c7a159 --- /dev/null +++ b/command/agent/region_endpoint_test.go @@ -0,0 +1,29 @@ +package agent + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestHTTP_RegionList(t *testing.T) { + httpTest(t, nil, func(s *TestServer) { + // Make the HTTP request + req, err := http.NewRequest("GET", "/v1/regions", nil) + if err != nil { + t.Fatalf("err: %v", err) + } + respW := httptest.NewRecorder() + + // Make the request + obj, err := s.Server.RegionListRequest(respW, req) + if err != nil { + t.Fatalf("err: %v", err) + } + + out := obj.([]string) + if len(out) != 1 || out[0] != "global" { + t.Fatalf("unexpected regions: %#v", out) + } + }) +} diff --git a/command/agent/regions_endpoint.go b/command/agent/regions_endpoint.go index c7f7f1330..538adefb4 100644 --- a/command/agent/regions_endpoint.go +++ b/command/agent/regions_endpoint.go @@ -6,7 +6,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" ) -func (s *HTTPServer) RegionsListRequest(resp http.ResponseWriter, req *http.Request) (interface{}, error) { +func (s *HTTPServer) RegionListRequest(resp http.ResponseWriter, req *http.Request) (interface{}, error) { if req.Method != "GET" { return nil, CodedError(405, ErrInvalidMethod) } diff --git a/nomad/regions_endpoint_test.go b/nomad/regions_endpoint_test.go new file mode 100644 index 000000000..cca212427 --- /dev/null +++ b/nomad/regions_endpoint_test.go @@ -0,0 +1,46 @@ +package nomad + +import ( + "fmt" + "testing" + + "github.com/hashicorp/net-rpc-msgpackrpc" + "github.com/hashicorp/nomad/nomad/structs" + "github.com/hashicorp/nomad/testutil" +) + +func TestRegionList(t *testing.T) { + // Make the servers + s1 := testServer(t, func(c *Config) { + c.Region = "region1" + }) + defer s1.Shutdown() + codec := rpcClient(t, s1) + + s2 := testServer(t, func(c *Config) { + c.Region = "region2" + }) + defer s2.Shutdown() + + // Join the servers + s2Addr := fmt.Sprintf("127.0.0.1:%d", + s2.config.SerfConfig.MemberlistConfig.BindPort) + if n, err := s1.Join([]string{s2Addr}); err != nil || n != 1 { + t.Fatalf("Failed joining: %v (%d joined)", err, n) + } + + // Query the regions list + testutil.WaitForResult(func() (bool, error) { + var arg structs.GenericRequest + var out []string + if err := msgpackrpc.CallWithCodec(codec, "Region.List", &arg, &out); err != nil { + t.Fatalf("err: %v", err) + } + if len(out) != 2 || out[0] != "region1" || out[1] != "region2" { + t.Fatalf("unexpected regions: %v", out) + } + return true, nil + }, func(err error) { + t.Fatalf("err: %v", err) + }) +} diff --git a/nomad/server_test.go b/nomad/server_test.go index b35d293cb..1ee4e7a65 100644 --- a/nomad/server_test.go +++ b/nomad/server_test.go @@ -7,6 +7,8 @@ import ( "sync/atomic" "testing" "time" + + "github.com/hashicorp/nomad/testutil" ) var nextPort uint32 = 15000 @@ -86,3 +88,34 @@ func TestServer_RPC(t *testing.T) { t.Fatalf("err: %v", err) } } + +func TestServer_Regions(t *testing.T) { + // Make the servers + s1 := testServer(t, func(c *Config) { + c.Region = "region1" + }) + defer s1.Shutdown() + + s2 := testServer(t, func(c *Config) { + c.Region = "region2" + }) + defer s2.Shutdown() + + // Join them together + s2Addr := fmt.Sprintf("127.0.0.1:%d", + s2.config.SerfConfig.MemberlistConfig.BindPort) + if n, err := s1.Join([]string{s2Addr}); err != nil || n != 1 { + t.Fatalf("Failed joining: %v (%d joined)", err, n) + } + + // Try listing the regions + testutil.WaitForResult(func() (bool, error) { + out := s1.Regions() + if len(out) != 2 || out[0] != "region1" || out[1] != "region2" { + return false, fmt.Errorf("unexpected regions: %v", out) + } + return true, nil + }, func(err error) { + t.Fatalf("err: %v", err) + }) +}