mirror of https://github.com/hashicorp/consul
agent: /v1/catalog/connect/:service
parent
e01914a025
commit
fd33b76ec2
|
@ -217,6 +217,55 @@ RETRY_ONCE:
|
||||||
return out.ServiceNodes, nil
|
return out.ServiceNodes, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *HTTPServer) CatalogConnectServiceNodes(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
||||||
|
metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_connect_service_nodes"}, 1,
|
||||||
|
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
|
||||||
|
if req.Method != "GET" {
|
||||||
|
return nil, MethodNotAllowedError{req.Method, []string{"GET"}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set default DC
|
||||||
|
args := structs.ServiceSpecificRequest{Connect: true}
|
||||||
|
s.parseSource(req, &args.Source)
|
||||||
|
args.NodeMetaFilters = s.parseMetaFilter(req)
|
||||||
|
if done := s.parse(resp, req, &args.Datacenter, &args.QueryOptions); done {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pull out the service name
|
||||||
|
args.ServiceName = strings.TrimPrefix(req.URL.Path, "/v1/catalog/connect/")
|
||||||
|
if args.ServiceName == "" {
|
||||||
|
resp.WriteHeader(http.StatusBadRequest)
|
||||||
|
fmt.Fprint(resp, "Missing service name")
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make the RPC request
|
||||||
|
var out structs.IndexedServiceNodes
|
||||||
|
defer setMeta(resp, &out.QueryMeta)
|
||||||
|
if err := s.agent.RPC("Catalog.ServiceNodes", &args, &out); err != nil {
|
||||||
|
metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_connect_service_nodes"}, 1,
|
||||||
|
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
s.agent.TranslateAddresses(args.Datacenter, out.ServiceNodes)
|
||||||
|
|
||||||
|
// Use empty list instead of nil
|
||||||
|
if out.ServiceNodes == nil {
|
||||||
|
out.ServiceNodes = make(structs.ServiceNodes, 0)
|
||||||
|
}
|
||||||
|
for i, s := range out.ServiceNodes {
|
||||||
|
if s.ServiceTags == nil {
|
||||||
|
clone := *s
|
||||||
|
clone.ServiceTags = make([]string, 0)
|
||||||
|
out.ServiceNodes[i] = &clone
|
||||||
|
}
|
||||||
|
}
|
||||||
|
metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_connect_service_nodes"}, 1,
|
||||||
|
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
|
||||||
|
return out.ServiceNodes, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *HTTPServer) CatalogNodeServices(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
func (s *HTTPServer) CatalogNodeServices(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
||||||
metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_node_services"}, 1,
|
metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_node_services"}, 1,
|
||||||
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
|
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
|
||||||
|
|
|
@ -775,6 +775,30 @@ func TestCatalogServiceNodes_ConnectProxy(t *testing.T) {
|
||||||
assert.Equal(structs.ServiceKindConnectProxy, nodes[0].ServiceKind)
|
assert.Equal(structs.ServiceKindConnectProxy, nodes[0].ServiceKind)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCatalogConnectServiceNodes_good(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert := assert.New(t)
|
||||||
|
a := NewTestAgent(t.Name(), "")
|
||||||
|
defer a.Shutdown()
|
||||||
|
|
||||||
|
// Register
|
||||||
|
args := structs.TestRegisterRequestProxy(t)
|
||||||
|
var out struct{}
|
||||||
|
assert.Nil(a.RPC("Catalog.Register", args, &out))
|
||||||
|
|
||||||
|
req, _ := http.NewRequest("GET", fmt.Sprintf(
|
||||||
|
"/v1/catalog/connect/%s", args.Service.ProxyDestination), nil)
|
||||||
|
resp := httptest.NewRecorder()
|
||||||
|
obj, err := a.srv.CatalogConnectServiceNodes(resp, req)
|
||||||
|
assert.Nil(err)
|
||||||
|
assertIndex(t, resp)
|
||||||
|
|
||||||
|
nodes := obj.(structs.ServiceNodes)
|
||||||
|
assert.Len(nodes, 1)
|
||||||
|
assert.Equal(structs.ServiceKindConnectProxy, nodes[0].ServiceKind)
|
||||||
|
}
|
||||||
|
|
||||||
func TestCatalogNodeServices(t *testing.T) {
|
func TestCatalogNodeServices(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
a := NewTestAgent(t.Name(), "")
|
a := NewTestAgent(t.Name(), "")
|
||||||
|
|
|
@ -33,6 +33,7 @@ func init() {
|
||||||
registerEndpoint("/v1/agent/service/deregister/", []string{"PUT"}, (*HTTPServer).AgentDeregisterService)
|
registerEndpoint("/v1/agent/service/deregister/", []string{"PUT"}, (*HTTPServer).AgentDeregisterService)
|
||||||
registerEndpoint("/v1/agent/service/maintenance/", []string{"PUT"}, (*HTTPServer).AgentServiceMaintenance)
|
registerEndpoint("/v1/agent/service/maintenance/", []string{"PUT"}, (*HTTPServer).AgentServiceMaintenance)
|
||||||
registerEndpoint("/v1/catalog/register", []string{"PUT"}, (*HTTPServer).CatalogRegister)
|
registerEndpoint("/v1/catalog/register", []string{"PUT"}, (*HTTPServer).CatalogRegister)
|
||||||
|
registerEndpoint("/v1/catalog/connect/", []string{"GET"}, (*HTTPServer).CatalogConnectServiceNodes)
|
||||||
registerEndpoint("/v1/catalog/deregister", []string{"PUT"}, (*HTTPServer).CatalogDeregister)
|
registerEndpoint("/v1/catalog/deregister", []string{"PUT"}, (*HTTPServer).CatalogDeregister)
|
||||||
registerEndpoint("/v1/catalog/datacenters", []string{"GET"}, (*HTTPServer).CatalogDatacenters)
|
registerEndpoint("/v1/catalog/datacenters", []string{"GET"}, (*HTTPServer).CatalogDatacenters)
|
||||||
registerEndpoint("/v1/catalog/nodes", []string{"GET"}, (*HTTPServer).CatalogNodes)
|
registerEndpoint("/v1/catalog/nodes", []string{"GET"}, (*HTTPServer).CatalogNodes)
|
||||||
|
|
Loading…
Reference in New Issue