diff --git a/engine/resources/cloudflare_dns.go b/engine/resources/cloudflare_dns.go index 5d224e95..bdaf7d51 100644 --- a/engine/resources/cloudflare_dns.go +++ b/engine/resources/cloudflare_dns.go @@ -269,6 +269,7 @@ func (obj *CloudflareDNSRes) Cmp(r engine.Res) error { return fmt.Errorf("apitoken differs") } + // check how this being a pointer influences this check if obj.Proxied != res.Proxied { return fmt.Errorf("proxied values differ") } @@ -300,4 +301,212 @@ func (obj *CloudflareDNSRes) Cmp(r engine.Res) error { if obj.zoneID != res.zoneID { return fmt.Errorf("zoneid differs") } + + if obj.Content != res.Content { + return fmt.Errorf("content param differs") + } + + // check how this being a pointer influences this check + if obj.Priority != res.Priority { + return fmt.Errorf("the priority param differs") + } + + return nil +} + +func (obj *CloudflareDNSRes) buildRecordParam() dns.RecordNewParamsBodyUnion { + ttl := dns.TTL(obj.TTL) + + switch obj.Type { + case "A": + param := dns.ARecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.ARecordTypeA), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + case "AAAA": + param := dns.AAAARecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.AAAARecordTypeAAAA), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + case "CNAME": + param := dns.CNAMERecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.CNAMERecordTypeCNAME), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + case "MX": + param := dns.MXRecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.MXRecordTypeMX), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Priority != nil { // required for MX record + param.Priority = cloudflare.F(*obj.Priority) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + case "TXT": + param := dns.TXTRecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.TXTRecordTypeTXT), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + case "NS": + param := dns.NSRecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.NSRecordTypeNS), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + case "SRV": + param := dns.SRVRecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.SRVRecordTypeSRV), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Priority != nil { + param.Priority = cloudflare.F(*obj.Priority) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + case "PTR": + param := dns.PTRRecordParam{ + Name: cloudflare.F(obj.RecordName), + Type: cloudflare.F(dns.PTRRecordTypePTR), + Content: cloudflare.F(obj.Content), + TTL: cloudflare.F(ttl), + } + if obj.Proxied != nil { + param.Proxied = cloudflare.F(*obj.Proxied) + } + if obj.Comment != "" { + param.Comment = cloudflare.F(obj.Comment) + } + return param + + default: // we should return something else here, need to investigate + + } +} + +func (obj *CloudflareDNSRes) createRecord(ctx context.Context) error { + recordParams := obj.buildRecordParam() + + createParams := dns.RecordNewParams{ + ZoneID: cloudflare.F(obj.zoneID), + Body: recordParams, + } + + _, err := obj.client.DNS.Records.New(ctx, createParams) + if err != nil { + return errwrap.Wrapf(err, "failed to create dns record") + } + + return nil +} + +func (obj *CloudflareDNSRes) updateRecord(ctx context.Context, recordID string) error { + recordParams := obj.buildRecordParam() + + editParams := dns.RecordEditParams{ + ZoneID: cloudflare.F(obj.zoneID), + Body: recordParams, + } + + _, err := obj.client.DNS.Records.Edit(ctx, recordID, editParams) + if err != nil { + return errwrap.Wrapf(err, "failed to update dns record") + } + + return nil +} + +func (obj *CloudflareDNSRes) needsUpdate(record dns.Record) bool { + if obj.Content != record.Content { + return true + } + + if obj.TTL != int64(record.TTL) { + return true + } + + if obj.Proxied != nil && record.Proxied != nil { + if *obj.Proxied != *record.Proxied { + return true + } + } + + if obj.Priority != nil && record.Priority != nil { + if *obj.Priority != *record.Priority { + return true + } + } + + if obj.Comment != record.Comment { + return true + } + + // TODO add more checks? + + return false }