package consulapi type Node struct { Node string Address string } type CatalogService struct { Node string Address string ServiceID string ServiceName string ServiceTags []string ServicePort int } type CatalogNode struct { Node *Node Services map[string]*AgentService } type CatalogRegistration struct { Node string Address string Datacenter string Service *AgentService Check *AgentCheck } type CatalogDeregistration struct { Node string Address string Datacenter string ServiceID string CheckID string } // Catalog can be used to query the Catalog endpoints type Catalog struct { c *Client } // Catalog returns a handle to the catalog endpoints func (c *Client) Catalog() *Catalog { return &Catalog{c} } func (c *Catalog) Register(reg *CatalogRegistration, q *WriteOptions) (*WriteMeta, error) { r := c.c.newRequest("PUT", "/v1/catalog/register") r.setWriteOptions(q) r.obj = reg rtt, resp, err := requireOK(c.c.doRequest(r)) if err != nil { return nil, err } resp.Body.Close() wm := &WriteMeta{} wm.RequestTime = rtt return wm, nil } func (c *Catalog) Deregister(dereg *CatalogDeregistration, q *WriteOptions) (*WriteMeta, error) { r := c.c.newRequest("PUT", "/v1/catalog/deregister") r.setWriteOptions(q) r.obj = dereg rtt, resp, err := requireOK(c.c.doRequest(r)) if err != nil { return nil, err } resp.Body.Close() wm := &WriteMeta{} wm.RequestTime = rtt return wm, nil } // Datacenters is used to query for all the known datacenters func (c *Catalog) Datacenters() ([]string, error) { r := c.c.newRequest("GET", "/v1/catalog/datacenters") _, resp, err := requireOK(c.c.doRequest(r)) if err != nil { return nil, err } defer resp.Body.Close() var out []string if err := decodeBody(resp, &out); err != nil { return nil, err } return out, nil } // Nodes is used to query all the known nodes func (c *Catalog) Nodes(q *QueryOptions) ([]*Node, *QueryMeta, error) { r := c.c.newRequest("GET", "/v1/catalog/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 []*Node if err := decodeBody(resp, &out); err != nil { return nil, nil, err } return out, qm, nil } // Services is used to query for all known services func (c *Catalog) Services(q *QueryOptions) (map[string][]string, *QueryMeta, error) { r := c.c.newRequest("GET", "/v1/catalog/services") 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 map[string][]string if err := decodeBody(resp, &out); err != nil { return nil, nil, err } return out, qm, nil } // Service is used to query catalog entries for a given service func (c *Catalog) Service(service, tag string, q *QueryOptions) ([]*CatalogService, *QueryMeta, error) { r := c.c.newRequest("GET", "/v1/catalog/service/"+service) r.setQueryOptions(q) if tag != "" { r.params.Set("tag", tag) } 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 []*CatalogService if err := decodeBody(resp, &out); err != nil { return nil, nil, err } return out, qm, nil } // Node is used to query for service information about a single node func (c *Catalog) Node(node string, q *QueryOptions) (*CatalogNode, *QueryMeta, error) { r := c.c.newRequest("GET", "/v1/catalog/node/"+node) 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 *CatalogNode if err := decodeBody(resp, &out); err != nil { return nil, nil, err } return out, qm, nil }