mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-06 17:46:57 +02:00
Merge pull request #3660 from johngmyers/domainfilter
Simplify filter interfaces
This commit is contained in:
commit
b3885c3886
@ -24,41 +24,22 @@ import (
|
|||||||
// DomainFilterInterface defines the interface to select matching domains for a specific provider or runtime
|
// DomainFilterInterface defines the interface to select matching domains for a specific provider or runtime
|
||||||
type DomainFilterInterface interface {
|
type DomainFilterInterface interface {
|
||||||
Match(domain string) bool
|
Match(domain string) bool
|
||||||
IsConfigured() bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type MatchAllDomainFilters []DomainFilterInterface
|
type MatchAllDomainFilters []DomainFilterInterface
|
||||||
|
|
||||||
func (f MatchAllDomainFilters) Match(domain string) bool {
|
func (f MatchAllDomainFilters) Match(domain string) bool {
|
||||||
if !f.IsConfigured() {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, filter := range f {
|
for _, filter := range f {
|
||||||
if filter == nil {
|
if filter == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if filter.IsConfigured() && !filter.Match(domain) {
|
if !filter.Match(domain) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f MatchAllDomainFilters) IsConfigured() bool {
|
|
||||||
if f == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for _, filter := range f {
|
|
||||||
if filter == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if filter.IsConfigured() {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return len(f) > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// DomainFilter holds a lists of valid domain names
|
// DomainFilter holds a lists of valid domain names
|
||||||
type DomainFilter struct {
|
type DomainFilter struct {
|
||||||
// Filters define what domains to match
|
// Filters define what domains to match
|
||||||
|
@ -26,7 +26,6 @@ import (
|
|||||||
// TargetFilterInterface defines the interface to select matching targets for a specific provider or runtime
|
// TargetFilterInterface defines the interface to select matching targets for a specific provider or runtime
|
||||||
type TargetFilterInterface interface {
|
type TargetFilterInterface interface {
|
||||||
Match(target string) bool
|
Match(target string) bool
|
||||||
IsConfigured() bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TargetNetFilter holds a lists of valid target names
|
// TargetNetFilter holds a lists of valid target names
|
||||||
@ -61,11 +60,6 @@ func NewTargetNetFilterWithExclusions(targetFilterNets []string, excludeNets []s
|
|||||||
return TargetNetFilter{FilterNets: prepareTargetFilters(targetFilterNets), excludeNets: prepareTargetFilters(excludeNets)}
|
return TargetNetFilter{FilterNets: prepareTargetFilters(targetFilterNets), excludeNets: prepareTargetFilters(excludeNets)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTargetNetFilter returns a new TargetNetFilter given a comma separated list of targets
|
|
||||||
func NewTargetNetFilter(targetFilterNets []string) TargetNetFilter {
|
|
||||||
return TargetNetFilter{FilterNets: prepareTargetFilters(targetFilterNets)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Match checks whether a target can be found in the TargetNetFilter.
|
// Match checks whether a target can be found in the TargetNetFilter.
|
||||||
func (tf TargetNetFilter) Match(target string) bool {
|
func (tf TargetNetFilter) Match(target string) bool {
|
||||||
return matchTargetNetFilter(tf.FilterNets, target, true) && !matchTargetNetFilter(tf.excludeNets, target, false)
|
return matchTargetNetFilter(tf.FilterNets, target, true) && !matchTargetNetFilter(tf.excludeNets, target, false)
|
||||||
@ -89,11 +83,3 @@ func matchTargetNetFilter(filters []*net.IPNet, target string, emptyval bool) bo
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsConfigured returns true if TargetFilter is configured, false otherwise
|
|
||||||
func (tf TargetNetFilter) IsConfigured() bool {
|
|
||||||
if len(tf.FilterNets) == 1 {
|
|
||||||
return tf.FilterNets[0].Network() != ""
|
|
||||||
}
|
|
||||||
return len(tf.FilterNets) > 0
|
|
||||||
}
|
|
||||||
|
@ -68,19 +68,6 @@ var targetFilterTests = []targetFilterTest{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTargetFilterMatch(t *testing.T) {
|
|
||||||
for i, tt := range targetFilterTests {
|
|
||||||
if len(tt.exclusions) > 0 {
|
|
||||||
t.Logf("NewTargetFilter() doesn't support exclusions - skipping test %+v", tt)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
targetFilter := NewTargetNetFilter(tt.targetFilter)
|
|
||||||
for _, target := range tt.targets {
|
|
||||||
assert.Equal(t, tt.expected, targetFilter.Match(target), "should not fail: %v in test-case #%v", target, i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTargetFilterWithExclusions(t *testing.T) {
|
func TestTargetFilterWithExclusions(t *testing.T) {
|
||||||
for i, tt := range targetFilterTests {
|
for i, tt := range targetFilterTests {
|
||||||
if len(tt.exclusions) == 0 {
|
if len(tt.exclusions) == 0 {
|
||||||
@ -107,47 +94,3 @@ func TestMatchTargetFilterReturnsProperEmptyVal(t *testing.T) {
|
|||||||
assert.Equal(t, true, matchFilter(emptyFilters, "sometarget.com", true))
|
assert.Equal(t, true, matchFilter(emptyFilters, "sometarget.com", true))
|
||||||
assert.Equal(t, false, matchFilter(emptyFilters, "sometarget.com", false))
|
assert.Equal(t, false, matchFilter(emptyFilters, "sometarget.com", false))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTargetFilterIsConfigured(t *testing.T) {
|
|
||||||
for _, tt := range []struct {
|
|
||||||
filters []string
|
|
||||||
exclude []string
|
|
||||||
expected bool
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
[]string{""},
|
|
||||||
[]string{""},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
[]string{" "},
|
|
||||||
[]string{" "},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
[]string{"", ""},
|
|
||||||
[]string{""},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
[]string{"10/8"},
|
|
||||||
[]string{" "},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
[]string{"10.0.0.0/8"},
|
|
||||||
[]string{" "},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
[]string{" 10.0.0.0/8 "},
|
|
||||||
[]string{" ignored "},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
} {
|
|
||||||
t.Run("test IsConfigured", func(t *testing.T) {
|
|
||||||
tf := NewTargetNetFilterWithExclusions(tt.filters, tt.exclude)
|
|
||||||
assert.Equal(t, tt.expected, tf.IsConfigured())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -199,7 +199,7 @@ func (p AkamaiProvider) fetchZones() (akamaiZones, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, zone := range resp.Zones {
|
for _, zone := range resp.Zones {
|
||||||
if p.domainFilter.Match(zone.Zone) || !p.domainFilter.IsConfigured() {
|
if p.domainFilter.Match(zone.Zone) {
|
||||||
filteredZones.Zones = append(filteredZones.Zones, akamaiZone{ContractID: zone.ContractId, Zone: zone.Zone})
|
filteredZones.Zones = append(filteredZones.Zones, akamaiZone{ContractID: zone.ContractId, Zone: zone.Zone})
|
||||||
log.Debugf("Fetched zone: '%s' (ZoneID: %s)", zone.Zone, zone.ContractId)
|
log.Debugf("Fetched zone: '%s' (ZoneID: %s)", zone.Zone, zone.ContractId)
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ func (p *piholeClient) listRecords(ctx context.Context, rtype string) ([]*endpoi
|
|||||||
for _, rec := range data {
|
for _, rec := range data {
|
||||||
name := rec[0]
|
name := rec[0]
|
||||||
target := rec[1]
|
target := rec[1]
|
||||||
if p.cfg.DomainFilter.IsConfigured() && !p.cfg.DomainFilter.Match(name) {
|
if !p.cfg.DomainFilter.Match(name) {
|
||||||
log.Debugf("Skipping %s that does not match domain filter", name)
|
log.Debugf("Skipping %s that does not match domain filter", name)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -195,7 +195,7 @@ type actionResponse struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *piholeClient) apply(ctx context.Context, action string, ep *endpoint.Endpoint) error {
|
func (p *piholeClient) apply(ctx context.Context, action string, ep *endpoint.Endpoint) error {
|
||||||
if p.cfg.DomainFilter.IsConfigured() && !p.cfg.DomainFilter.Match(ep.DNSName) {
|
if !p.cfg.DomainFilter.Match(ep.DNSName) {
|
||||||
log.Debugf("Skipping %s %s that does not match domain filter", action, ep.DNSName)
|
log.Debugf("Skipping %s %s that does not match domain filter", action, ep.DNSName)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ func (p *TencentCloudProvider) getPrivateZones() ([]*privatedns.PrivateZone, err
|
|||||||
|
|
||||||
privateZonesFilter := make([]*privatedns.PrivateZone, 0)
|
privateZonesFilter := make([]*privatedns.PrivateZone, 0)
|
||||||
for _, privateZone := range privateZones {
|
for _, privateZone := range privateZones {
|
||||||
if p.domainFilter.IsConfigured() && !p.domainFilter.Match(*privateZone.Domain) {
|
if !p.domainFilter.Match(*privateZone.Domain) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
privateZonesFilter = append(privateZonesFilter, privateZone)
|
privateZonesFilter = append(privateZonesFilter, privateZone)
|
||||||
|
@ -34,6 +34,9 @@ func (f ZoneIDFilter) Match(zoneID string) bool {
|
|||||||
if len(f.ZoneIDs) == 0 {
|
if len(f.ZoneIDs) == 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
if len(f.ZoneIDs) == 1 && f.ZoneIDs[0] == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
for _, id := range f.ZoneIDs {
|
for _, id := range f.ZoneIDs {
|
||||||
if strings.HasSuffix(zoneID, id) {
|
if strings.HasSuffix(zoneID, id) {
|
||||||
|
Loading…
Reference in New Issue
Block a user