github.com/sl1pm4t/consul@v1.4.5-0.20190325224627-74c31c540f9c/api/catalog.go (about)

     1  package api
     2  
     3  type Weights struct {
     4  	Passing int
     5  	Warning int
     6  }
     7  
     8  type Node struct {
     9  	ID              string
    10  	Node            string
    11  	Address         string
    12  	Datacenter      string
    13  	TaggedAddresses map[string]string
    14  	Meta            map[string]string
    15  	CreateIndex     uint64
    16  	ModifyIndex     uint64
    17  }
    18  
    19  type CatalogService struct {
    20  	ID                       string
    21  	Node                     string
    22  	Address                  string
    23  	Datacenter               string
    24  	TaggedAddresses          map[string]string
    25  	NodeMeta                 map[string]string
    26  	ServiceID                string
    27  	ServiceName              string
    28  	ServiceAddress           string
    29  	ServiceTags              []string
    30  	ServiceMeta              map[string]string
    31  	ServicePort              int
    32  	ServiceWeights           Weights
    33  	ServiceEnableTagOverride bool
    34  	// DEPRECATED (ProxyDestination) - remove the next comment!
    35  	// We forgot to ever add ServiceProxyDestination here so no need to deprecate!
    36  	ServiceProxy *AgentServiceConnectProxyConfig
    37  	CreateIndex  uint64
    38  	Checks       HealthChecks
    39  	ModifyIndex  uint64
    40  }
    41  
    42  type CatalogNode struct {
    43  	Node     *Node
    44  	Services map[string]*AgentService
    45  }
    46  
    47  type CatalogRegistration struct {
    48  	ID              string
    49  	Node            string
    50  	Address         string
    51  	TaggedAddresses map[string]string
    52  	NodeMeta        map[string]string
    53  	Datacenter      string
    54  	Service         *AgentService
    55  	Check           *AgentCheck
    56  	Checks          HealthChecks
    57  	SkipNodeUpdate  bool
    58  }
    59  
    60  type CatalogDeregistration struct {
    61  	Node       string
    62  	Address    string // Obsolete.
    63  	Datacenter string
    64  	ServiceID  string
    65  	CheckID    string
    66  }
    67  
    68  // Catalog can be used to query the Catalog endpoints
    69  type Catalog struct {
    70  	c *Client
    71  }
    72  
    73  // Catalog returns a handle to the catalog endpoints
    74  func (c *Client) Catalog() *Catalog {
    75  	return &Catalog{c}
    76  }
    77  
    78  func (c *Catalog) Register(reg *CatalogRegistration, q *WriteOptions) (*WriteMeta, error) {
    79  	r := c.c.newRequest("PUT", "/v1/catalog/register")
    80  	r.setWriteOptions(q)
    81  	r.obj = reg
    82  	rtt, resp, err := requireOK(c.c.doRequest(r))
    83  	if err != nil {
    84  		return nil, err
    85  	}
    86  	resp.Body.Close()
    87  
    88  	wm := &WriteMeta{}
    89  	wm.RequestTime = rtt
    90  
    91  	return wm, nil
    92  }
    93  
    94  func (c *Catalog) Deregister(dereg *CatalogDeregistration, q *WriteOptions) (*WriteMeta, error) {
    95  	r := c.c.newRequest("PUT", "/v1/catalog/deregister")
    96  	r.setWriteOptions(q)
    97  	r.obj = dereg
    98  	rtt, resp, err := requireOK(c.c.doRequest(r))
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  	resp.Body.Close()
   103  
   104  	wm := &WriteMeta{}
   105  	wm.RequestTime = rtt
   106  
   107  	return wm, nil
   108  }
   109  
   110  // Datacenters is used to query for all the known datacenters
   111  func (c *Catalog) Datacenters() ([]string, error) {
   112  	r := c.c.newRequest("GET", "/v1/catalog/datacenters")
   113  	_, resp, err := requireOK(c.c.doRequest(r))
   114  	if err != nil {
   115  		return nil, err
   116  	}
   117  	defer resp.Body.Close()
   118  
   119  	var out []string
   120  	if err := decodeBody(resp, &out); err != nil {
   121  		return nil, err
   122  	}
   123  	return out, nil
   124  }
   125  
   126  // Nodes is used to query all the known nodes
   127  func (c *Catalog) Nodes(q *QueryOptions) ([]*Node, *QueryMeta, error) {
   128  	r := c.c.newRequest("GET", "/v1/catalog/nodes")
   129  	r.setQueryOptions(q)
   130  	rtt, resp, err := requireOK(c.c.doRequest(r))
   131  	if err != nil {
   132  		return nil, nil, err
   133  	}
   134  	defer resp.Body.Close()
   135  
   136  	qm := &QueryMeta{}
   137  	parseQueryMeta(resp, qm)
   138  	qm.RequestTime = rtt
   139  
   140  	var out []*Node
   141  	if err := decodeBody(resp, &out); err != nil {
   142  		return nil, nil, err
   143  	}
   144  	return out, qm, nil
   145  }
   146  
   147  // Services is used to query for all known services
   148  func (c *Catalog) Services(q *QueryOptions) (map[string][]string, *QueryMeta, error) {
   149  	r := c.c.newRequest("GET", "/v1/catalog/services")
   150  	r.setQueryOptions(q)
   151  	rtt, resp, err := requireOK(c.c.doRequest(r))
   152  	if err != nil {
   153  		return nil, nil, err
   154  	}
   155  	defer resp.Body.Close()
   156  
   157  	qm := &QueryMeta{}
   158  	parseQueryMeta(resp, qm)
   159  	qm.RequestTime = rtt
   160  
   161  	var out map[string][]string
   162  	if err := decodeBody(resp, &out); err != nil {
   163  		return nil, nil, err
   164  	}
   165  	return out, qm, nil
   166  }
   167  
   168  // Service is used to query catalog entries for a given service
   169  func (c *Catalog) Service(service, tag string, q *QueryOptions) ([]*CatalogService, *QueryMeta, error) {
   170  	var tags []string
   171  	if tag != "" {
   172  		tags = []string{tag}
   173  	}
   174  	return c.service(service, tags, q, false)
   175  }
   176  
   177  // Supports multiple tags for filtering
   178  func (c *Catalog) ServiceMultipleTags(service string, tags []string, q *QueryOptions) ([]*CatalogService, *QueryMeta, error) {
   179  	return c.service(service, tags, q, false)
   180  }
   181  
   182  // Connect is used to query catalog entries for a given Connect-enabled service
   183  func (c *Catalog) Connect(service, tag string, q *QueryOptions) ([]*CatalogService, *QueryMeta, error) {
   184  	var tags []string
   185  	if tag != "" {
   186  		tags = []string{tag}
   187  	}
   188  	return c.service(service, tags, q, true)
   189  }
   190  
   191  // Supports multiple tags for filtering
   192  func (c *Catalog) ConnectMultipleTags(service string, tags []string, q *QueryOptions) ([]*CatalogService, *QueryMeta, error) {
   193  	return c.service(service, tags, q, true)
   194  }
   195  
   196  func (c *Catalog) service(service string, tags []string, q *QueryOptions, connect bool) ([]*CatalogService, *QueryMeta, error) {
   197  	path := "/v1/catalog/service/" + service
   198  	if connect {
   199  		path = "/v1/catalog/connect/" + service
   200  	}
   201  	r := c.c.newRequest("GET", path)
   202  	r.setQueryOptions(q)
   203  	if len(tags) > 0 {
   204  		for _, tag := range tags {
   205  			r.params.Add("tag", tag)
   206  		}
   207  	}
   208  	rtt, resp, err := requireOK(c.c.doRequest(r))
   209  	if err != nil {
   210  		return nil, nil, err
   211  	}
   212  	defer resp.Body.Close()
   213  
   214  	qm := &QueryMeta{}
   215  	parseQueryMeta(resp, qm)
   216  	qm.RequestTime = rtt
   217  
   218  	var out []*CatalogService
   219  	if err := decodeBody(resp, &out); err != nil {
   220  		return nil, nil, err
   221  	}
   222  	return out, qm, nil
   223  }
   224  
   225  // Node is used to query for service information about a single node
   226  func (c *Catalog) Node(node string, q *QueryOptions) (*CatalogNode, *QueryMeta, error) {
   227  	r := c.c.newRequest("GET", "/v1/catalog/node/"+node)
   228  	r.setQueryOptions(q)
   229  	rtt, resp, err := requireOK(c.c.doRequest(r))
   230  	if err != nil {
   231  		return nil, nil, err
   232  	}
   233  	defer resp.Body.Close()
   234  
   235  	qm := &QueryMeta{}
   236  	parseQueryMeta(resp, qm)
   237  	qm.RequestTime = rtt
   238  
   239  	var out *CatalogNode
   240  	if err := decodeBody(resp, &out); err != nil {
   241  		return nil, nil, err
   242  	}
   243  	return out, qm, nil
   244  }