From 60450d09d0f4a86f87cfb3029a0a707a0e3417e5 Mon Sep 17 00:00:00 2001 From: Thomas Maroschik Date: Mon, 8 Jan 2024 14:47:36 +0100 Subject: [PATCH 1/2] fix(pdns): provider implicitly changes CNAME to ALIAS Fixes: https://github.com/kubernetes-sigs/external-dns/issues/3970 --- provider/pdns/pdns.go | 8 ++-- provider/pdns/pdns_test.go | 77 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/provider/pdns/pdns.go b/provider/pdns/pdns.go index 1c83a091e4..771dfaf690 100644 --- a/provider/pdns/pdns.go +++ b/provider/pdns/pdns.go @@ -316,12 +316,14 @@ func (p *PDNSProvider) ConvertEndpointsToZones(eps []*endpoint.Endpoint, changet for _, t := range ep.Targets { if ep.RecordType == "CNAME" || ep.RecordType == "ALIAS" { t = provider.EnsureTrailingDot(t) - if t != zone.Name && !strings.HasSuffix(t, "."+zone.Name) { - RecordType_ = "ALIAS" - } } records = append(records, pgo.Record{Content: t}) } + + if dnsname == zone.Name && ep.RecordType == "CNAME" { + RecordType_ = "ALIAS" + } + rrset := pgo.RrSet{ Name: dnsname, Type_: RecordType_, diff --git a/provider/pdns/pdns_test.go b/provider/pdns/pdns_test.go index 2837ef81ee..01489da9c7 100644 --- a/provider/pdns/pdns_test.go +++ b/provider/pdns/pdns_test.go @@ -178,6 +178,12 @@ var ( endpoint.NewEndpointWithTTL("test.simexample.com", endpoint.RecordTypeA, endpoint.TTL(300), "9.9.9.9"), endpoint.NewEndpointWithTTL("test.simexample.com", endpoint.RecordTypeTXT, endpoint.TTL(300), "\"heritage=external-dns,external-dns/owner=tower-pdns\""), } + endpointsApexRecords = []*endpoint.Endpoint{ + endpoint.NewEndpointWithTTL("cname.example.com", endpoint.RecordTypeTXT, endpoint.TTL(300), "\"heritage=external-dns,external-dns/owner=tower-pdns\""), + endpoint.NewEndpointWithTTL("cname.example.com", endpoint.RecordTypeCNAME, endpoint.TTL(300), "example.by.any.other.name.com"), + endpoint.NewEndpointWithTTL("example.com", endpoint.RecordTypeTXT, endpoint.TTL(300), "\"heritage=external-dns,external-dns/owner=tower-pdns\""), + endpoint.NewEndpointWithTTL("example.com", endpoint.RecordTypeCNAME, endpoint.TTL(300), "example.by.any.other.name.com"), + } ZoneEmpty = pgo.Zone{ // Opaque zone id (string), assigned by the server, should not be interpreted by the application. Guaranteed to be safe for embedding in URLs. @@ -484,6 +490,72 @@ var ( }, } + ZoneEmptyToApexPatch = pgo.Zone{ + Id: "example.com.", + Name: "example.com.", + Type_: "Zone", + Url: "/api/v1/servers/localhost/zones/example.com.", + Kind: "Native", + Rrsets: []pgo.RrSet{ + { + Name: "cname.example.com.", + Type_: "CNAME", + Ttl: 300, + Changetype: "REPLACE", + Records: []pgo.Record{ + { + Content: "example.by.any.other.name.com.", + Disabled: false, + SetPtr: false, + }, + }, + Comments: []pgo.Comment(nil), + }, + { + Name: "cname.example.com.", + Type_: "TXT", + Ttl: 300, + Changetype: "REPLACE", + Records: []pgo.Record{ + { + Content: "\"heritage=external-dns,external-dns/owner=tower-pdns\"", + Disabled: false, + SetPtr: false, + }, + }, + Comments: []pgo.Comment(nil), + }, + { + Name: "example.com.", + Type_: "ALIAS", + Ttl: 300, + Changetype: "REPLACE", + Records: []pgo.Record{ + { + Content: "example.by.any.other.name.com.", + Disabled: false, + SetPtr: false, + }, + }, + Comments: []pgo.Comment(nil), + }, + { + Name: "example.com.", + Type_: "TXT", + Ttl: 300, + Changetype: "REPLACE", + Records: []pgo.Record{ + { + Content: "\"heritage=external-dns,external-dns/owner=tower-pdns\"", + Disabled: false, + SetPtr: false, + }, + }, + Comments: []pgo.Comment(nil), + }, + }, + } + DomainFilterListSingle = endpoint.DomainFilter{ Filters: []string{ "example.com", @@ -871,6 +943,11 @@ func (suite *NewPDNSProviderTestSuite) TestPDNSConvertEndpointsToZones() { } } } + + // Check endpoints of type CNAME are converted to ALIAS on the domain apex + zlist, err = p.ConvertEndpointsToZones(endpointsApexRecords, PdnsReplace) + assert.Nil(suite.T(), err) + assert.Equal(suite.T(), []pgo.Zone{ZoneEmptyToApexPatch}, zlist) } func (suite *NewPDNSProviderTestSuite) TestPDNSConvertEndpointsToZonesPartitionZones() { From 99b7abda7e4949c1bedcd869bce8f8643963dce5 Mon Sep 17 00:00:00 2001 From: Thomas Maroschik Date: Wed, 10 Jan 2024 16:51:09 +0100 Subject: [PATCH 2/2] feat: add debug message to CNAME to ALIAS conversion Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com> --- provider/pdns/pdns.go | 1 + 1 file changed, 1 insertion(+) diff --git a/provider/pdns/pdns.go b/provider/pdns/pdns.go index 771dfaf690..fbc7cc22fa 100644 --- a/provider/pdns/pdns.go +++ b/provider/pdns/pdns.go @@ -321,6 +321,7 @@ func (p *PDNSProvider) ConvertEndpointsToZones(eps []*endpoint.Endpoint, changet } if dnsname == zone.Name && ep.RecordType == "CNAME" { + log.Debugf("Converting APEX record %s from CNAME to ALIAS", dnsname) RecordType_ = "ALIAS" }