create an alias when creord in a zone other than the target

This commit is contained in:
Shchukin Konstantin 2023-01-24 12:10:28 +07:00
parent a18bf2b512
commit 16b8192783
2 changed files with 26 additions and 8 deletions

View File

@ -258,6 +258,7 @@ func NewPDNSProvider(ctx context.Context, config PDNSConfig) (*PDNSProvider, err
func (p *PDNSProvider) convertRRSetToEndpoints(rr pgo.RrSet) (endpoints []*endpoint.Endpoint, _ error) { func (p *PDNSProvider) convertRRSetToEndpoints(rr pgo.RrSet) (endpoints []*endpoint.Endpoint, _ error) {
endpoints = []*endpoint.Endpoint{} endpoints = []*endpoint.Endpoint{}
targets := []string{} targets := []string{}
rrType_ := rr.Type_
for _, record := range rr.Records { for _, record := range rr.Records {
// If a record is "Disabled", it's not supposed to be "visible" // If a record is "Disabled", it's not supposed to be "visible"
@ -265,8 +266,10 @@ func (p *PDNSProvider) convertRRSetToEndpoints(rr pgo.RrSet) (endpoints []*endpo
targets = append(targets, record.Content) targets = append(targets, record.Content)
} }
} }
if rr.Type_ == "ALIAS" {
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(rr.Name, rr.Type_, endpoint.TTL(rr.Ttl), targets...)) rrType_ = "CNAME"
}
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(rr.Name, rrType_, endpoint.TTL(rr.Ttl), targets...))
return endpoints, nil return endpoints, nil
} }
@ -311,16 +314,20 @@ func (p *PDNSProvider) ConvertEndpointsToZones(eps []*endpoint.Endpoint, changet
// per (ep.DNSName, ep.RecordType) tuple, which holds true for // per (ep.DNSName, ep.RecordType) tuple, which holds true for
// external-dns v5.0.0-alpha onwards // external-dns v5.0.0-alpha onwards
records := []pgo.Record{} records := []pgo.Record{}
RecordType_ := ep.RecordType
for _, t := range ep.Targets { for _, t := range ep.Targets {
if ep.RecordType == "CNAME" { if ep.RecordType == "CNAME" || ep.RecordType == "ALIAS" {
t = provider.EnsureTrailingDot(t) t = provider.EnsureTrailingDot(t)
if t != zone.Name && !strings.HasSuffix(t, "."+zone.Name) {
RecordType_ = "ALIAS"
}
} }
records = append(records, pgo.Record{Content: t}) records = append(records, pgo.Record{Content: t})
} }
rrset := pgo.RrSet{ rrset := pgo.RrSet{
Name: dnsname, Name: dnsname,
Type_: ep.RecordType, Type_: RecordType_,
Records: records, Records: records,
Changetype: string(changetype), Changetype: string(changetype),
} }

View File

@ -82,9 +82,19 @@ var (
Type_: "CNAME", Type_: "CNAME",
Ttl: 300, Ttl: 300,
Records: []pgo.Record{ Records: []pgo.Record{
{Content: "example.by.any.other.name.com", Disabled: false, SetPtr: false}, {Content: "example.com.", Disabled: false, SetPtr: false},
}, },
} }
RRSetALIASRecord = pgo.RrSet{
Name: "alias.example.com.",
Type_: "ALIAS",
Ttl: 300,
Records: []pgo.Record{
{Content: "example.by.any.other.name.com.", Disabled: false, SetPtr: false},
},
}
RRSetTXTRecord = pgo.RrSet{ RRSetTXTRecord = pgo.RrSet{
Name: "example.com.", Name: "example.com.",
Type_: "TXT", Type_: "TXT",
@ -129,9 +139,10 @@ var (
} }
endpointsMixedRecords = []*endpoint.Endpoint{ endpointsMixedRecords = []*endpoint.Endpoint{
endpoint.NewEndpointWithTTL("cname.example.com", endpoint.RecordTypeCNAME, endpoint.TTL(300), "example.by.any.other.name.com"), endpoint.NewEndpointWithTTL("cname.example.com", endpoint.RecordTypeCNAME, endpoint.TTL(300), "example.com"),
endpoint.NewEndpointWithTTL("example.com", endpoint.RecordTypeTXT, endpoint.TTL(300), "'would smell as sweet'"), endpoint.NewEndpointWithTTL("example.com", endpoint.RecordTypeTXT, endpoint.TTL(300), "'would smell as sweet'"),
endpoint.NewEndpointWithTTL("example.com", endpoint.RecordTypeA, endpoint.TTL(300), "8.8.8.8", "8.8.4.4", "4.4.4.4"), endpoint.NewEndpointWithTTL("example.com", endpoint.RecordTypeA, endpoint.TTL(300), "8.8.8.8", "8.8.4.4", "4.4.4.4"),
endpoint.NewEndpointWithTTL("alias.example.com", endpoint.RecordTypeCNAME, endpoint.TTL(300), "example.by.any.other.name.com"),
} }
endpointsMultipleZones = []*endpoint.Endpoint{ endpointsMultipleZones = []*endpoint.Endpoint{
@ -215,7 +226,7 @@ var (
Type_: "Zone", Type_: "Zone",
Url: "/api/v1/servers/localhost/zones/example.com.", Url: "/api/v1/servers/localhost/zones/example.com.",
Kind: "Native", Kind: "Native",
Rrsets: []pgo.RrSet{RRSetCNAMERecord, RRSetTXTRecord, RRSetMultipleRecords}, Rrsets: []pgo.RrSet{RRSetCNAMERecord, RRSetTXTRecord, RRSetMultipleRecords, RRSetALIASRecord},
} }
ZoneEmptyToSimplePatch = pgo.Zone{ ZoneEmptyToSimplePatch = pgo.Zone{
@ -909,7 +920,7 @@ func (suite *NewPDNSProviderTestSuite) TestPDNSConvertEndpointsToZones() {
for _, z := range zlist { for _, z := range zlist {
for _, rs := range z.Rrsets { for _, rs := range z.Rrsets {
if "CNAME" == rs.Type_ { if rs.Type_ == "CNAME" {
for _, r := range rs.Records { for _, r := range rs.Records {
assert.Equal(suite.T(), uint8(0x2e), r.Content[len(r.Content)-1]) assert.Equal(suite.T(), uint8(0x2e), r.Content[len(r.Content)-1])
} }