From 63447a0cf351dede25b7efaa9f1b75d455bcdf6d Mon Sep 17 00:00:00 2001 From: Frank Schroeder Date: Fri, 30 Jun 2017 21:42:53 +0200 Subject: [PATCH] agent: refactor: make address translation part of the agent --- agent/catalog_endpoint.go | 6 +++--- agent/dns.go | 6 +++--- agent/health_endpoint.go | 2 +- agent/prepared_query_endpoint.go | 2 +- agent/translate_addr.go | 25 ++++++++++--------------- 5 files changed, 18 insertions(+), 23 deletions(-) diff --git a/agent/catalog_endpoint.go b/agent/catalog_endpoint.go index 325c23e578..34da83fa74 100644 --- a/agent/catalog_endpoint.go +++ b/agent/catalog_endpoint.go @@ -74,7 +74,7 @@ func (s *HTTPServer) CatalogNodes(resp http.ResponseWriter, req *http.Request) ( if err := s.agent.RPC("Catalog.ListNodes", &args, &out); err != nil { return nil, err } - translateAddresses(s.agent.config, args.Datacenter, out.Nodes) + s.agent.TranslateAddresses(args.Datacenter, out.Nodes) // Use empty list instead of nil if out.Nodes == nil { @@ -134,7 +134,7 @@ func (s *HTTPServer) CatalogServiceNodes(resp http.ResponseWriter, req *http.Req if err := s.agent.RPC("Catalog.ServiceNodes", &args, &out); err != nil { return nil, err } - translateAddresses(s.agent.config, args.Datacenter, out.ServiceNodes) + s.agent.TranslateAddresses(args.Datacenter, out.ServiceNodes) // Use empty list instead of nil if out.ServiceNodes == nil { @@ -170,7 +170,7 @@ func (s *HTTPServer) CatalogNodeServices(resp http.ResponseWriter, req *http.Req return nil, err } if out.NodeServices != nil && out.NodeServices.Node != nil { - translateAddresses(s.agent.config, args.Datacenter, out.NodeServices.Node) + s.agent.TranslateAddresses(args.Datacenter, out.NodeServices.Node) } // Use empty list instead of nil diff --git a/agent/dns.go b/agent/dns.go index dbceb17964..e8bf650a4a 100644 --- a/agent/dns.go +++ b/agent/dns.go @@ -414,7 +414,7 @@ RPC: // Add the node record n := out.NodeServices.Node edns := req.IsEdns0() != nil - addr := translateAddress(d.agent.config, datacenter, n.Address, n.TaggedAddresses) + addr := d.agent.TranslateAddress(datacenter, n.Address, n.TaggedAddresses) records := d.formatNodeRecord(out.NodeServices.Node, addr, req.Question[0].Name, qType, d.config.NodeTTL, edns) if records != nil { @@ -784,7 +784,7 @@ func (d *DNSServer) serviceNodeRecords(dc string, nodes structs.CheckServiceNode for _, node := range nodes { // Start with the translated address but use the service address, // if specified. - addr := translateAddress(d.agent.config, dc, node.Node.Address, node.Node.TaggedAddresses) + addr := d.agent.TranslateAddress(dc, node.Node.Address, node.Node.TaggedAddresses) if node.Service.Address != "" { addr = node.Service.Address } @@ -841,7 +841,7 @@ func (d *DNSServer) serviceSRVRecords(dc string, nodes structs.CheckServiceNodes // Start with the translated address but use the service address, // if specified. - addr := translateAddress(d.agent.config, dc, node.Node.Address, node.Node.TaggedAddresses) + addr := d.agent.TranslateAddress(dc, node.Node.Address, node.Node.TaggedAddresses) if node.Service.Address != "" { addr = node.Service.Address } diff --git a/agent/health_endpoint.go b/agent/health_endpoint.go index d877ca9298..1e46956e42 100644 --- a/agent/health_endpoint.go +++ b/agent/health_endpoint.go @@ -171,7 +171,7 @@ func (s *HTTPServer) HealthServiceNodes(resp http.ResponseWriter, req *http.Requ } // Translate addresses after filtering so we don't waste effort. - translateAddresses(s.agent.config, args.Datacenter, out.Nodes) + s.agent.TranslateAddresses(args.Datacenter, out.Nodes) // Use empty list instead of nil if out.Nodes == nil { diff --git a/agent/prepared_query_endpoint.go b/agent/prepared_query_endpoint.go index ed93733299..60a68074b2 100644 --- a/agent/prepared_query_endpoint.go +++ b/agent/prepared_query_endpoint.go @@ -122,7 +122,7 @@ func (s *HTTPServer) preparedQueryExecute(id string, resp http.ResponseWriter, r // a query can fail over to a different DC than where the execute request // was sent to. That's why we use the reply's DC and not the one from // the args. - translateAddresses(s.agent.config, reply.Datacenter, reply.Nodes) + s.agent.TranslateAddresses(reply.Datacenter, reply.Nodes) // Use empty list instead of nil. if reply.Nodes == nil { diff --git a/agent/translate_addr.go b/agent/translate_addr.go index 425e1a3a83..8c3fc4ef98 100644 --- a/agent/translate_addr.go +++ b/agent/translate_addr.go @@ -6,11 +6,11 @@ import ( "github.com/hashicorp/consul/agent/consul/structs" ) -// translateAddress is used to provide the final, translated address for a node, +// TranslateAddress is used to provide the final, translated address for a node, // depending on how the agent and the other node are configured. The dc // parameter is the dc the datacenter this node is from. -func translateAddress(config *Config, dc string, addr string, taggedAddresses map[string]string) string { - if config.TranslateWanAddrs && (config.Datacenter != dc) { +func (a *Agent) TranslateAddress(dc string, addr string, taggedAddresses map[string]string) string { + if a.config.TranslateWanAddrs && (a.config.Datacenter != dc) { wanAddr := taggedAddresses["wan"] if wanAddr != "" { addr = wanAddr @@ -19,10 +19,10 @@ func translateAddress(config *Config, dc string, addr string, taggedAddresses ma return addr } -// translateAddresses translates addresses in the given structure into the +// TranslateAddresses translates addresses in the given structure into the // final, translated address, depending on how the agent and the other node are // configured. The dc parameter is the datacenter this structure is from. -func translateAddresses(config *Config, dc string, subj interface{}) { +func (a *Agent) TranslateAddresses(dc string, subj interface{}) { // CAUTION - SUBTLE! An agent running on a server can, in some cases, // return pointers directly into the immutable state store for // performance (it's via the in-memory RPC mechanism). It's never safe @@ -34,7 +34,7 @@ func translateAddresses(config *Config, dc string, subj interface{}) { // done. This also happens to skip looking at any of the incoming // structure for the common case of not needing to translate, so it will // skip a lot of work if no translation needs to be done. - if !config.TranslateWanAddrs || (config.Datacenter == dc) { + if !a.config.TranslateWanAddrs || (a.config.Datacenter == dc) { return } @@ -44,24 +44,19 @@ func translateAddresses(config *Config, dc string, subj interface{}) { switch v := subj.(type) { case structs.CheckServiceNodes: for _, entry := range v { - entry.Node.Address = translateAddress(config, dc, - entry.Node.Address, entry.Node.TaggedAddresses) + entry.Node.Address = a.TranslateAddress(dc, entry.Node.Address, entry.Node.TaggedAddresses) } case *structs.Node: - v.Address = translateAddress(config, dc, - v.Address, v.TaggedAddresses) + v.Address = a.TranslateAddress(dc, v.Address, v.TaggedAddresses) case structs.Nodes: for _, node := range v { - node.Address = translateAddress(config, dc, - node.Address, node.TaggedAddresses) + node.Address = a.TranslateAddress(dc, node.Address, node.TaggedAddresses) } case structs.ServiceNodes: for _, entry := range v { - entry.Address = translateAddress(config, dc, - entry.Address, entry.TaggedAddresses) + entry.Address = a.TranslateAddress(dc, entry.Address, entry.TaggedAddresses) } default: panic(fmt.Errorf("Unhandled type passed to address translator: %#v", subj)) - } }