diff --git a/agent/coordinate_endpoint_test.go b/agent/coordinate_endpoint_test.go index 74da244c0..b18ddf738 100644 --- a/agent/coordinate_endpoint_test.go +++ b/agent/coordinate_endpoint_test.go @@ -249,3 +249,49 @@ func TestCoordinate_Node(t *testing.T) { t.Fatalf("bad: %v", coordinates) } } + +func TestCoordinate_Update(t *testing.T) { + t.Parallel() + a := NewTestAgent(t.Name(), "") + defer a.Shutdown() + + // Register the node. + reg := structs.RegisterRequest{ + Datacenter: "dc1", + Node: "foo", + Address: "127.0.0.1", + } + var reply struct{} + if err := a.RPC("Catalog.Register", ®, &reply); err != nil { + t.Fatalf("err: %s", err) + } + + // Update the coordinates and wait for it to complete. + coord := coordinate.NewCoordinate(coordinate.DefaultConfig()) + coord.Height = -5.0 + body := structs.CoordinateUpdateRequest{ + Datacenter: "dc1", + Node: "foo", + Coord: coord, + } + req, _ := http.NewRequest("PUT", "/v1/coordinate/update", jsonReader(body)) + resp := httptest.NewRecorder() + _, err := a.srv.CoordinateUpdate(resp, req) + if err != nil { + t.Fatalf("err: %v", err) + } + time.Sleep(300 * time.Millisecond) + + // Query back and check the coordinates are present. + args := structs.NodeSpecificRequest{Node: "foo", Datacenter: "dc1"} + var coords structs.IndexedCoordinates + if err := a.RPC("Coordinate.Node", &args, &coords); err != nil { + t.Fatalf("err: %s", err) + } + + coordinates := coords.Coordinates + if len(coordinates) != 1 || + coordinates[0].Node != "foo" { + t.Fatalf("bad: %v", coordinates) + } +} diff --git a/api/coordinate_test.go b/api/coordinate_test.go index a91d1869b..7dc72ca12 100644 --- a/api/coordinate_test.go +++ b/api/coordinate_test.go @@ -3,7 +3,11 @@ package api import ( "testing" + "time" + "github.com/hashicorp/consul/testutil/retry" + "github.com/hashicorp/serf/coordinate" + "github.com/pascaldekloe/goe/verify" ) func TestAPI_CoordinateDatacenters(t *testing.T) { @@ -11,9 +15,9 @@ func TestAPI_CoordinateDatacenters(t *testing.T) { c, s := makeClient(t) defer s.Stop() - coordinate := c.Coordinate() + coord := c.Coordinate() retry.Run(t, func(r *retry.R) { - datacenters, err := coordinate.Datacenters() + datacenters, err := coord.Datacenters() if err != nil { r.Fatal(err) } @@ -29,9 +33,9 @@ func TestAPI_CoordinateNodes(t *testing.T) { c, s := makeClient(t) defer s.Stop() - coordinate := c.Coordinate() + coord := c.Coordinate() retry.Run(t, func(r *retry.R) { - _, _, err := coordinate.Nodes(nil) + _, _, err := coord.Nodes(nil) if err != nil { r.Fatal(err) } @@ -48,9 +52,9 @@ func TestAPI_CoordinateNode(t *testing.T) { c, s := makeClient(t) defer s.Stop() - coordinate := c.Coordinate() + coord := c.Coordinate() retry.Run(t, func(r *retry.R) { - _, _, err := coordinate.Node(s.Config.NodeName, nil) + _, _, err := coord.Node(s.Config.NodeName, nil) if err != nil { r.Fatal(err) } @@ -61,3 +65,42 @@ func TestAPI_CoordinateNode(t *testing.T) { // get an error. }) } + +func TestAPI_CoordinateUpdate(t *testing.T) { + t.Parallel() + c, s := makeClient(t) + defer s.Stop() + + node := "foo" + _, err := c.Catalog().Register(&CatalogRegistration{ + Node: node, + Address: "1.1.1.1", + }, nil) + if err != nil { + t.Fatal(err) + } + + coord := c.Coordinate() + newCoord := coordinate.NewCoordinate(coordinate.DefaultConfig()) + newCoord.Height = 0.5 + entry := &CoordinateEntry{ + Node: node, + Coord: newCoord, + } + _, err = coord.Update(entry, nil) + if err != nil { + t.Fatal(err) + } + + retryer := &retry.Timer{Timeout: 10 * time.Second, Wait: 1 * time.Second} + retry.RunWith(retryer, t, func(r *retry.R) { + coords, _, err := coord.Node(node, nil) + if err != nil { + r.Fatal(err) + } + if len(coords) != 1 { + r.Fatalf("bad: %v", coords) + } + verify.Values(r, "", coords[0], entry) + }) +}