diff --git a/provider/consulcatalog/consul_catalog.go b/provider/consulcatalog/consul_catalog.go index 381bea080..a437dac71 100644 --- a/provider/consulcatalog/consul_catalog.go +++ b/provider/consulcatalog/consul_catalog.go @@ -38,10 +38,11 @@ type Provider struct { // Service represent a Consul service. type Service struct { - Name string - Tags []string - Nodes []string - Ports []int + Name string + Tags []string + Nodes []string + Addresses []string + Ports []int } type serviceUpdate struct { @@ -188,6 +189,7 @@ func (p *Provider) watchCatalogServices(stopCh <-chan struct{}, watchCh chan<- m nodesID := getServiceIds(nodes) ports := getServicePorts(nodes) + addresses := getServiceAddresses(nodes) if service, ok := current[key]; ok { service.Tags = value @@ -195,10 +197,11 @@ func (p *Provider) watchCatalogServices(stopCh <-chan struct{}, watchCh chan<- m service.Ports = ports } else { service := Service{ - Name: key, - Tags: value, - Nodes: nodesID, - Ports: ports, + Name: key, + Tags: value, + Nodes: nodesID, + Addresses: addresses, + Ports: ports, } current[key] = service } @@ -338,6 +341,10 @@ func hasServiceChanged(current map[string]Service, previous map[string]Service) if len(addedTagsKeys) > 0 || len(removedTagsKeys) > 0 { return true } + addedAddressesKeys, removedAddressesKeys := getChangedStringKeys(value.Addresses, prevValue.Addresses) + if len(addedAddressesKeys) > 0 || len(removedAddressesKeys) > 0 { + return true + } addedPortsKeys, removedPortsKeys := getChangedIntKeys(value.Ports, prevValue.Ports) if len(addedPortsKeys) > 0 || len(removedPortsKeys) > 0 { return true @@ -383,6 +390,14 @@ func getServicePorts(services []*api.CatalogService) []int { return servicePorts } +func getServiceAddresses(services []*api.CatalogService) []string { + var serviceAddresses []string + for _, service := range services { + serviceAddresses = append(serviceAddresses, service.ServiceAddress) + } + return serviceAddresses +} + func (p *Provider) healthyNodes(service string) (catalogUpdate, error) { health := p.client.Health() data, _, err := health.Service(service, "", true, &api.QueryOptions{}) diff --git a/provider/consulcatalog/consul_catalog_test.go b/provider/consulcatalog/consul_catalog_test.go index f03eb5f8f..70ede6d67 100644 --- a/provider/consulcatalog/consul_catalog_test.go +++ b/provider/consulcatalog/consul_catalog_test.go @@ -637,6 +637,24 @@ func TestHasServiceChanged(t *testing.T) { }, expected: true, }, + { + desc: "Change detected on addresses", + current: map[string]Service{ + "foo-service": { + Name: "foo", + Nodes: []string{"node1"}, + Addresses: []string{"127.0.0.1"}, + }, + }, + previous: map[string]Service{ + "foo-service": { + Name: "foo", + Nodes: []string{"node1"}, + Addresses: []string{"127.0.0.2"}, + }, + }, + expected: true, + }, { desc: "No Change detected", current: map[string]Service{