Skip to content

Commit 5181b3f

Browse files
authored
chore(cloudflare): migrate DNSRecord to new lib struct (#5762)
1 parent 9e0acd0 commit 5181b3f

File tree

3 files changed

+342
-215
lines changed

3 files changed

+342
-215
lines changed

provider/cloudflare/cloudflare.go

Lines changed: 74 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
cloudflarev0 "github.com/cloudflare/cloudflare-go"
3232
"github.com/cloudflare/cloudflare-go/v5"
3333
"github.com/cloudflare/cloudflare-go/v5/addressing"
34+
"github.com/cloudflare/cloudflare-go/v5/dns"
3435
"github.com/cloudflare/cloudflare-go/v5/option"
3536
"github.com/cloudflare/cloudflare-go/v5/zones"
3637
log "github.com/sirupsen/logrus"
@@ -75,7 +76,7 @@ type DNSRecordIndex struct {
7576
Content string
7677
}
7778

78-
type DNSRecordsMap map[DNSRecordIndex]cloudflarev0.DNSRecord
79+
type DNSRecordsMap map[DNSRecordIndex]dns.RecordResponse
7980

8081
// for faster getCustomHostname() lookup
8182
type CustomHostnameIndex struct {
@@ -109,8 +110,8 @@ type cloudFlareDNS interface {
109110
ZoneIDByName(zoneName string) (string, error)
110111
ListZones(ctx context.Context, params zones.ZoneListParams) autoPager[zones.Zone]
111112
GetZone(ctx context.Context, zoneID string) (*zones.Zone, error)
112-
ListDNSRecords(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.ListDNSRecordsParams) ([]cloudflarev0.DNSRecord, *cloudflarev0.ResultInfo, error)
113-
CreateDNSRecord(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.CreateDNSRecordParams) (cloudflarev0.DNSRecord, error)
113+
ListDNSRecords(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.ListDNSRecordsParams) ([]dns.RecordResponse, *cloudflarev0.ResultInfo, error)
114+
CreateDNSRecord(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.CreateDNSRecordParams) (dns.RecordResponse, error)
114115
DeleteDNSRecord(ctx context.Context, rc *cloudflarev0.ResourceContainer, recordID string) error
115116
UpdateDNSRecord(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.UpdateDNSRecordParams) error
116117
ListDataLocalizationRegionalHostnames(ctx context.Context, params addressing.RegionalHostnameListParams) autoPager[addressing.RegionalHostnameListResponse]
@@ -147,12 +148,18 @@ func (z zoneService) ZoneIDByName(zoneName string) (string, error) {
147148
return "", fmt.Errorf("zone %q not found in CloudFlare account - verify the zone exists and API credentials have access to it", zoneName)
148149
}
149150

150-
func (z zoneService) CreateDNSRecord(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.CreateDNSRecordParams) (cloudflarev0.DNSRecord, error) {
151-
return z.serviceV0.CreateDNSRecord(ctx, rc, rp)
151+
func (z zoneService) CreateDNSRecord(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.CreateDNSRecordParams) (dns.RecordResponse, error) {
152+
record, err := z.serviceV0.CreateDNSRecord(ctx, rc, rp)
153+
return dnsRecordResponseFromLegacyDNSRecord(record), err
152154
}
153155

154-
func (z zoneService) ListDNSRecords(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.ListDNSRecordsParams) ([]cloudflarev0.DNSRecord, *cloudflarev0.ResultInfo, error) {
155-
return z.serviceV0.ListDNSRecords(ctx, rc, rp)
156+
func (z zoneService) ListDNSRecords(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.ListDNSRecordsParams) ([]dns.RecordResponse, *cloudflarev0.ResultInfo, error) {
157+
records, info, err := z.serviceV0.ListDNSRecords(ctx, rc, rp)
158+
convertedRecords := make([]dns.RecordResponse, 0, len(records))
159+
for _, record := range records {
160+
convertedRecords = append(convertedRecords, dnsRecordResponseFromLegacyDNSRecord(record))
161+
}
162+
return convertedRecords, info, err
156163
}
157164

158165
func (z zoneService) UpdateDNSRecord(ctx context.Context, rc *cloudflarev0.ResourceContainer, rp cloudflarev0.UpdateDNSRecordParams) error {
@@ -250,7 +257,7 @@ type CloudFlareProvider struct {
250257
// cloudFlareChange differentiates between ChangeActions
251258
type cloudFlareChange struct {
252259
Action changeAction
253-
ResourceRecord cloudflarev0.DNSRecord
260+
ResourceRecord dns.RecordResponse
254261
RegionalHostname regionalHostname
255262
CustomHostnames map[string]cloudflarev0.CustomHostname
256263
CustomHostnamesPrev []string
@@ -263,13 +270,15 @@ type RecordParamsTypes interface {
263270

264271
// updateDNSRecordParam is a function that returns the appropriate Record Param based on the cloudFlareChange passed in
265272
func updateDNSRecordParam(cfc cloudFlareChange) cloudflarev0.UpdateDNSRecordParams {
273+
priority := uint16(cfc.ResourceRecord.Priority)
274+
266275
params := cloudflarev0.UpdateDNSRecordParams{
267276
Name: cfc.ResourceRecord.Name,
268-
TTL: cfc.ResourceRecord.TTL,
269-
Proxied: cfc.ResourceRecord.Proxied,
270-
Type: cfc.ResourceRecord.Type,
277+
TTL: int(cfc.ResourceRecord.TTL),
278+
Proxied: &cfc.ResourceRecord.Proxied,
279+
Type: string(cfc.ResourceRecord.Type),
271280
Content: cfc.ResourceRecord.Content,
272-
Priority: cfc.ResourceRecord.Priority,
281+
Priority: &priority,
273282
Comment: cloudflarev0.StringPtr(cfc.ResourceRecord.Comment),
274283
}
275284

@@ -278,13 +287,15 @@ func updateDNSRecordParam(cfc cloudFlareChange) cloudflarev0.UpdateDNSRecordPara
278287

279288
// getCreateDNSRecordParam is a function that returns the appropriate Record Param based on the cloudFlareChange passed in
280289
func getCreateDNSRecordParam(cfc cloudFlareChange) cloudflarev0.CreateDNSRecordParams {
290+
priority := uint16(cfc.ResourceRecord.Priority)
291+
281292
params := cloudflarev0.CreateDNSRecordParams{
282293
Name: cfc.ResourceRecord.Name,
283-
TTL: cfc.ResourceRecord.TTL,
284-
Proxied: cfc.ResourceRecord.Proxied,
285-
Type: cfc.ResourceRecord.Type,
294+
TTL: int(cfc.ResourceRecord.TTL),
295+
Proxied: &cfc.ResourceRecord.Proxied,
296+
Type: string(cfc.ResourceRecord.Type),
286297
Content: cfc.ResourceRecord.Content,
287-
Priority: cfc.ResourceRecord.Priority,
298+
Priority: &priority,
288299
Comment: cfc.ResourceRecord.Comment,
289300
}
290301

@@ -534,7 +545,7 @@ func (p *CloudFlareProvider) submitCustomHostnameChanges(ctx context.Context, zo
534545

535546
switch change.Action {
536547
case cloudFlareUpdate:
537-
if recordTypeCustomHostnameSupported[change.ResourceRecord.Type] {
548+
if recordTypeCustomHostnameSupported[string(change.ResourceRecord.Type)] {
538549
add, remove, _ := provider.Difference(change.CustomHostnamesPrev, slices.Collect(maps.Keys(change.CustomHostnames)))
539550

540551
for _, changeCH := range remove {
@@ -561,7 +572,7 @@ func (p *CloudFlareProvider) submitCustomHostnameChanges(ctx context.Context, zo
561572
}
562573
case cloudFlareDelete:
563574
for _, changeCH := range change.CustomHostnames {
564-
if recordTypeCustomHostnameSupported[change.ResourceRecord.Type] && changeCH.Hostname != "" {
575+
if recordTypeCustomHostnameSupported[string(change.ResourceRecord.Type)] && changeCH.Hostname != "" {
565576
log.WithFields(logFields).Infof("Deleting custom hostname %q", changeCH.Hostname)
566577
if ch, err := getCustomHostname(chs, changeCH.Hostname); err == nil {
567578
chID := ch.ID
@@ -577,7 +588,7 @@ func (p *CloudFlareProvider) submitCustomHostnameChanges(ctx context.Context, zo
577588
}
578589
case cloudFlareCreate:
579590
for _, changeCH := range change.CustomHostnames {
580-
if recordTypeCustomHostnameSupported[change.ResourceRecord.Type] && changeCH.Hostname != "" {
591+
if recordTypeCustomHostnameSupported[string(change.ResourceRecord.Type)] && changeCH.Hostname != "" {
581592
log.WithFields(logFields).Infof("Creating custom hostname %q", changeCH.Hostname)
582593
if ch, err := getCustomHostname(chs, changeCH.Hostname); err == nil {
583594
if changeCH.CustomOriginServer == ch.CustomOriginServer {
@@ -769,8 +780,8 @@ func (p *CloudFlareProvider) changesByZone(zones []zones.Zone, changeSet []*clou
769780
return changes
770781
}
771782

772-
func (p *CloudFlareProvider) getRecordID(records DNSRecordsMap, record cloudflarev0.DNSRecord) string {
773-
if zoneRecord, ok := records[DNSRecordIndex{Name: record.Name, Type: record.Type, Content: record.Content}]; ok {
783+
func (p *CloudFlareProvider) getRecordID(records DNSRecordsMap, record dns.RecordResponse) string {
784+
if zoneRecord, ok := records[DNSRecordIndex{Name: record.Name, Type: string(record.Type), Content: record.Content}]; ok {
774785
return zoneRecord.ID
775786
}
776787
return ""
@@ -795,11 +806,11 @@ func (p *CloudFlareProvider) newCustomHostname(customHostname string, origin str
795806
}
796807

797808
func (p *CloudFlareProvider) newCloudFlareChange(action changeAction, ep *endpoint.Endpoint, target string, current *endpoint.Endpoint) (*cloudFlareChange, error) {
798-
ttl := defaultTTL
809+
ttl := dns.TTL(defaultTTL)
799810
proxied := shouldBeProxied(ep, p.proxiedByDefault)
800811

801812
if ep.RecordTTL.IsConfigured() {
802-
ttl = int(ep.RecordTTL)
813+
ttl = dns.TTL(ep.RecordTTL)
803814
}
804815

805816
prevCustomHostnames := []string{}
@@ -824,26 +835,24 @@ func (p *CloudFlareProvider) newCloudFlareChange(action changeAction, ep *endpoi
824835
comment = p.DNSRecordsConfig.trimAndValidateComment(ep.DNSName, comment, p.ZoneHasPaidPlan)
825836
}
826837

827-
priority := (*uint16)(nil)
838+
var priority float64
828839
if ep.RecordType == "MX" {
829840
mxRecord, err := endpoint.NewMXRecord(target)
830841
if err != nil {
831842
return &cloudFlareChange{}, fmt.Errorf("failed to parse MX record target %q: %w", target, err)
832843
} else {
833-
priority = mxRecord.GetPriority()
844+
priority = float64(*mxRecord.GetPriority())
834845
target = *mxRecord.GetHost()
835846
}
836847
}
837848

838849
return &cloudFlareChange{
839850
Action: action,
840-
ResourceRecord: cloudflarev0.DNSRecord{
841-
Name: ep.DNSName,
842-
TTL: ttl,
843-
// We have to use pointers to bools now, as the upstream cloudflare-go library requires them
844-
// see: https://github.com/cloudflare/cloudflare-go/pull/595
845-
Proxied: &proxied,
846-
Type: ep.RecordType,
851+
ResourceRecord: dns.RecordResponse{
852+
Name: ep.DNSName,
853+
TTL: ttl,
854+
Proxied: proxied,
855+
Type: dns.RecordResponseType(ep.RecordType),
847856
Content: target,
848857
Comment: comment,
849858
Priority: priority,
@@ -854,8 +863,8 @@ func (p *CloudFlareProvider) newCloudFlareChange(action changeAction, ep *endpoi
854863
}, nil
855864
}
856865

857-
func newDNSRecordIndex(r cloudflarev0.DNSRecord) DNSRecordIndex {
858-
return DNSRecordIndex{Name: r.Name, Type: r.Type, Content: r.Content}
866+
func newDNSRecordIndex(r dns.RecordResponse) DNSRecordIndex {
867+
return DNSRecordIndex{Name: r.Name, Type: string(r.Type), Content: r.Content}
859868
}
860869

861870
// listDNSRecordsWithAutoPagination performs automatic pagination of results on requests to cloudflare.ListDNSRecords with custom per_page values
@@ -964,16 +973,16 @@ func (p *CloudFlareProvider) groupByNameAndTypeWithCustomHostnames(records DNSRe
964973
var endpoints []*endpoint.Endpoint
965974

966975
// group supported records by name and type
967-
groups := map[string][]cloudflarev0.DNSRecord{}
976+
groups := map[string][]dns.RecordResponse{}
968977

969978
for _, r := range records {
970-
if !p.SupportedAdditionalRecordTypes(r.Type) {
979+
if !p.SupportedAdditionalRecordTypes(string(r.Type)) {
971980
continue
972981
}
973982

974-
groupBy := r.Name + r.Type
983+
groupBy := r.Name + string(r.Type)
975984
if _, ok := groups[groupBy]; !ok {
976-
groups[groupBy] = []cloudflarev0.DNSRecord{}
985+
groups[groupBy] = []dns.RecordResponse{}
977986
}
978987

979988
groups[groupBy] = append(groups[groupBy], r)
@@ -994,20 +1003,17 @@ func (p *CloudFlareProvider) groupByNameAndTypeWithCustomHostnames(records DNSRe
9941003
targets := make([]string, len(records))
9951004
for i, record := range records {
9961005
if records[i].Type == "MX" {
997-
targets[i] = fmt.Sprintf("%v %v", *record.Priority, record.Content)
1006+
targets[i] = fmt.Sprintf("%v %v", record.Priority, record.Content)
9981007
} else {
9991008
targets[i] = record.Content
10001009
}
10011010
}
10021011
e := endpoint.NewEndpointWithTTL(
10031012
records[0].Name,
1004-
records[0].Type,
1013+
string(records[0].Type),
10051014
endpoint.TTL(records[0].TTL),
10061015
targets...)
1007-
proxied := false
1008-
if records[0].Proxied != nil {
1009-
proxied = *records[0].Proxied
1010-
}
1016+
proxied := records[0].Proxied
10111017
if e == nil {
10121018
continue
10131019
}
@@ -1036,3 +1042,27 @@ func (p *CloudFlareProvider) SupportedAdditionalRecordTypes(recordType string) b
10361042
return provider.SupportedRecordType(recordType)
10371043
}
10381044
}
1045+
1046+
func dnsRecordResponseFromLegacyDNSRecord(record cloudflarev0.DNSRecord) dns.RecordResponse {
1047+
var priority float64
1048+
if record.Priority != nil {
1049+
priority = float64(*record.Priority)
1050+
}
1051+
1052+
return dns.RecordResponse{
1053+
CreatedOn: record.CreatedOn,
1054+
ModifiedOn: record.ModifiedOn,
1055+
Type: dns.RecordResponseType(record.Type),
1056+
Name: record.Name,
1057+
Content: record.Content,
1058+
Meta: record.Meta,
1059+
Data: record.Data,
1060+
ID: record.ID,
1061+
Priority: priority,
1062+
TTL: dns.TTL(record.TTL),
1063+
Proxied: record.Proxied != nil && *record.Proxied,
1064+
Proxiable: record.Proxiable,
1065+
Comment: record.Comment,
1066+
Tags: record.Tags,
1067+
}
1068+
}

0 commit comments

Comments
 (0)