From ef77161ab0e521a6c65e31e84848e20dad3a5923 Mon Sep 17 00:00:00 2001 From: Christian Simon Date: Thu, 16 May 2019 14:06:13 +0100 Subject: [PATCH] Google zones should be filter by their ID and Name Before we only filter by the zone ID, which is an integer value, that is not exposed in the GCP Console and by the related terraform resource. This allows to filter by either ID or Name whatever matches. --- provider/google.go | 2 +- provider/google_test.go | 57 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/provider/google.go b/provider/google.go index 67033fc72..3ba73354f 100644 --- a/provider/google.go +++ b/provider/google.go @@ -161,7 +161,7 @@ func (p *GoogleProvider) Zones() (map[string]*dns.ManagedZone, error) { f := func(resp *dns.ManagedZonesListResponse) error { for _, zone := range resp.ManagedZones { - if p.domainFilter.Match(zone.DnsName) && p.zoneIDFilter.Match(fmt.Sprintf("%v", zone.Id)) { + if p.domainFilter.Match(zone.DnsName) && (p.zoneIDFilter.Match(fmt.Sprintf("%v", zone.Id)) || p.zoneIDFilter.Match(fmt.Sprintf("%v", zone.Name))) { zones[zone.Name] = zone log.Debugf("Matched %s (zone: %s)", zone.DnsName, zone.Name) } else { diff --git a/provider/google_test.go b/provider/google_test.go index f4f15b5ab..a45d81cab 100644 --- a/provider/google_test.go +++ b/provider/google_test.go @@ -192,6 +192,28 @@ func hasTrailingDot(target string) bool { return strings.HasSuffix(target, ".") } +func TestGoogleZonesIDFilter(t *testing.T) { + provider := newGoogleProviderZoneOverlap(t, NewDomainFilter([]string{"cluster.local."}), NewZoneIDFilter([]string{"10002"}), false, []*endpoint.Endpoint{}) + + zones, err := provider.Zones() + require.NoError(t, err) + + validateZones(t, zones, map[string]*dns.ManagedZone{ + "internal-2": {Name: "internal-2", DnsName: "cluster.local.", Id: 10002}, + }) +} + +func TestGoogleZonesNameFilter(t *testing.T) { + provider := newGoogleProviderZoneOverlap(t, NewDomainFilter([]string{"cluster.local."}), NewZoneIDFilter([]string{"internal-2"}), false, []*endpoint.Endpoint{}) + + zones, err := provider.Zones() + require.NoError(t, err) + + validateZones(t, zones, map[string]*dns.ManagedZone{ + "internal-2": {Name: "internal-2", DnsName: "cluster.local.", Id: 10002}, + }) +} + func TestGoogleZones(t *testing.T) { provider := newGoogleProvider(t, NewDomainFilter([]string{"ext-dns-test-2.gcp.zalan.do."}), NewZoneIDFilter([]string{""}), false, []*endpoint.Endpoint{}) @@ -562,6 +584,41 @@ func validateChangeRecord(t *testing.T, record *dns.ResourceRecordSet, expected assert.Equal(t, expected.Type, record.Type) } +func newGoogleProviderZoneOverlap(t *testing.T, domainFilter DomainFilter, zoneIDFilter ZoneIDFilter, dryRun bool, records []*endpoint.Endpoint) *GoogleProvider { + provider := &GoogleProvider{ + project: "zalando-external-dns-test", + dryRun: false, + domainFilter: domainFilter, + zoneIDFilter: zoneIDFilter, + resourceRecordSetsClient: &mockResourceRecordSetsClient{}, + managedZonesClient: &mockManagedZonesClient{}, + changesClient: &mockChangesClient{}, + } + + createZone(t, provider, &dns.ManagedZone{ + Name: "internal-1", + DnsName: "cluster.local.", + Id: 10001, + }) + + createZone(t, provider, &dns.ManagedZone{ + Name: "internal-2", + DnsName: "cluster.local.", + Id: 10002, + }) + + createZone(t, provider, &dns.ManagedZone{ + Name: "internal-3", + DnsName: "cluster.local.", + Id: 10003, + }) + + provider.dryRun = dryRun + + return provider + +} + func newGoogleProvider(t *testing.T, domainFilter DomainFilter, zoneIDFilter ZoneIDFilter, dryRun bool, records []*endpoint.Endpoint) *GoogleProvider { provider := &GoogleProvider{ project: "zalando-external-dns-test",