// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package api import ( "strings" "testing" "time" "github.com/hashicorp/serf/coordinate" "github.com/stretchr/testify/require" "github.com/hashicorp/consul/sdk/testutil/retry" ) func TestAPI_CoordinateDatacenters(t *testing.T) { t.Parallel() c, s := makeClient(t) defer s.Stop() coord := c.Coordinate() retry.Run(t, func(r *retry.R) { datacenters, err := coord.Datacenters() if err != nil { r.Fatal(err) } if len(datacenters) == 0 { r.Fatalf("Bad: %v", datacenters) } }) } func TestAPI_CoordinateNodes(t *testing.T) { t.Parallel() c, s := makeClient(t) defer s.Stop() coord := c.Coordinate() retry.Run(t, func(r *retry.R) { _, _, err := coord.Nodes(nil) if err != nil { r.Fatal(err) } // There's not a good way to populate coordinates without // waiting for them to calculate and update, so the best // we can do is call the endpoint and make sure we don't // get an error. }) } func TestAPI_CoordinateNode(t *testing.T) { t.Parallel() c, s := makeClient(t) defer s.Stop() coord := c.Coordinate() retry.Run(t, func(r *retry.R) { _, _, err := coord.Node(s.Config.NodeName, nil) if err != nil && !strings.Contains(err.Error(), "Unexpected response code: 404") { r.Fatal(err) } // There's not a good way to populate coordinates without // waiting for them to calculate and update, so the best // we can do is call the endpoint and make sure we don't // get an error. }) } func TestAPI_CoordinateUpdate(t *testing.T) { t.Parallel() c, s := makeClient(t) defer s.Stop() s.WaitForSerfCheck(t) 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, Partition: defaultPartition, Coord: newCoord, } _, err = coord.Update(entry, nil) if err != nil { t.Fatal(err) } retryer := &retry.Timer{Timeout: 5 * 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) } require.Equal(r, entry, coords[0]) }) }