agent: refactor: make address translation part of the agent

pull/3241/head
Frank Schroeder 8 years ago committed by Frank Schröder
parent bd03f8a8ed
commit 63447a0cf3

@ -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

@ -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
}

@ -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 {

@ -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 {

@ -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))
}
}

Loading…
Cancel
Save