package api import ( "github.com/hashicorp/serf/coordinate" ) // CoordinateEntry represents a node and its associated network coordinate. type CoordinateEntry struct { Node string Coord *coordinate.Coordinate } // CoordinateDatacenterMap has the coordinates for servers in a given datacenter // and area. Network coordinates are only compatible within the same area. type CoordinateDatacenterMap struct { Datacenter string AreaID string Coordinates []CoordinateEntry } // Coordinate can be used to query the coordinate endpoints type Coordinate struct { c *Client } // Coordinate returns a handle to the coordinate endpoints func (c *Client) Coordinate() *Coordinate { return &Coordinate{c} } // Datacenters is used to return the coordinates of all the servers in the WAN // pool. func (c *Coordinate) Datacenters() ([]*CoordinateDatacenterMap, error) { r := c.c.newRequest("GET", "/v1/coordinate/datacenters") _, resp, err := requireOK(c.c.doRequest(r)) if err != nil { return nil, err } defer resp.Body.Close() var out []*CoordinateDatacenterMap if err := decodeBody(resp, &out); err != nil { return nil, err } return out, nil } // Nodes is used to return the coordinates of all the nodes in the LAN pool. func (c *Coordinate) Nodes(q *QueryOptions) ([]*CoordinateEntry, *QueryMeta, error) { r := c.c.newRequest("GET", "/v1/coordinate/nodes") r.setQueryOptions(q) rtt, resp, err := requireOK(c.c.doRequest(r)) if err != nil { return nil, nil, err } defer resp.Body.Close() qm := &QueryMeta{} parseQueryMeta(resp, qm) qm.RequestTime = rtt var out []*CoordinateEntry if err := decodeBody(resp, &out); err != nil { return nil, nil, err } return out, qm, nil }