diff --git a/providers/websupport/auditrecords_test.go b/providers/websupport/auditrecords_test.go index 114ca871c3..979c66b3fb 100644 --- a/providers/websupport/auditrecords_test.go +++ b/providers/websupport/auditrecords_test.go @@ -7,35 +7,33 @@ import ( ) func makeRC(rtype, label, target string) *models.RecordConfig { - rc := &models.RecordConfig{Type: rtype} - rc.SetLabel(label, "example.com") + dc := models.MustNewDomainConfig("example.com") switch rtype { case "TXT": - _ = rc.SetTargetTXT(target) + return dc.MustNewRecordConfig(label, 0, rtype, target) case "MX": - _ = rc.SetTargetMX(10, target) + return dc.MustNewRecordConfig(label, 0, rtype, 10, target) case "SRV": - _ = rc.SetTargetSRV(0, 0, 443, target) + return dc.MustNewRecordConfig(label, 0, rtype, 0, 0, 443, target) default: - _ = rc.SetTarget(target) + return dc.MustNewRecordConfig(label, 0, rtype, target) } - return rc } func TestAuditRecords(t *testing.T) { tests := []struct { name string - records []*models.RecordConfig + records models.Records wantCount int }{ { name: "empty", - records: []*models.RecordConfig{}, + records: models.Records{}, wantCount: 0, }, { name: "supported types are fine", - records: []*models.RecordConfig{ + records: models.Records{ makeRC("A", "@", "1.2.3.4"), makeRC("AAAA", "@", "::1"), makeRC("CNAME", "www", "example.net."), @@ -47,17 +45,17 @@ func TestAuditRecords(t *testing.T) { }, { name: "NS is rejected (API silently drops it)", - records: []*models.RecordConfig{makeRC("NS", "deleg", "ns1.example.net.")}, + records: models.Records{makeRC("NS", "deleg", "ns1.example.net.")}, wantCount: 1, }, { name: "empty TXT is rejected", - records: []*models.RecordConfig{makeRC("TXT", "@", "")}, + records: models.Records{makeRC("TXT", "@", "")}, wantCount: 1, }, { name: "SRV with null target is rejected", - records: []*models.RecordConfig{makeRC("SRV", "_sip._tcp", ".")}, + records: models.Records{makeRC("SRV", "_sip._tcp", ".")}, wantCount: 1, }, } diff --git a/providers/websupport/convert.go b/providers/websupport/convert.go index 9cf4578ca6..a66db2e755 100644 --- a/providers/websupport/convert.go +++ b/providers/websupport/convert.go @@ -43,52 +43,56 @@ func toNative(rc *models.RecordConfig) (nativeRecord, error) { switch rc.Type { case "MX": - r.Content = trimDot(rc.GetTargetField()) - r.Priority = intPtr(rc.MxPreference) + f := rc.AsMX() + r.Priority = intPtr(f.Preference) + r.Content = trimDot(f.Mx) + // r.Content = trimDot(rc.GetTargetField()) + // r.Priority = intPtr(rc.MxPreference) case "SRV": - r.Content = trimDot(rc.GetTargetField()) - r.Priority = intPtr(rc.SrvPriority) - r.Weight = intPtr(rc.SrvWeight) - r.Port = intPtr(rc.SrvPort) + f := rc.AsSRV() + r.Priority = intPtr(f.Priority) + r.Weight = intPtr(f.Weight) + r.Port = intPtr(f.Port) + r.Content = trimDot(f.Target) case "TXT": r.Content = rc.GetTargetTXTJoined() case "CNAME": - r.Content = trimDot(rc.GetTargetField()) + f := rc.AsCNAME() + r.Content = trimDot(f.Target) default: r.Content = rc.GetTargetField() + // TODO(tlim): Try this instead. + //r.Content = rc.GetRDATA().String() } return r, nil } // toRecordConfig converts a WebSupport native record into a dnscontrol RecordConfig. -func toRecordConfig(domain string, n nativeRecord) (*models.RecordConfig, error) { - rc := &models.RecordConfig{ - Type: n.Type, - TTL: n.TTL, - Original: n, - } - rc.SetLabelFromFQDN(n.Name, domain) - +func toRecordConfig(dc *models.DomainConfig, n nativeRecord) (*models.RecordConfig, error) { content := n.Content if fqdnTypes[n.Type] { content = ensureDot(content) } + label := dc.LabelFromFQDNNoDot(n.Name) + ttl := n.TTL + var rc *models.RecordConfig var err error switch n.Type { case "MX": - err = rc.SetTargetMX(derefInt(n.Priority), content) + rc, err = dc.NewRecordConfig(label, ttl, n.Type, derefInt(n.Priority), content) case "SRV": - err = rc.SetTargetSRV(derefInt(n.Priority), derefInt(n.Weight), derefInt(n.Port), content) + rc, err = dc.NewRecordConfig(label, ttl, n.Type, derefInt(n.Priority), derefInt(n.Weight), derefInt(n.Port), content) case "TXT": - err = rc.SetTargetTXT(n.Content) + rc, err = dc.NewRecordConfig(label, ttl, n.Type, n.Content) default: - err = rc.SetTarget(content) + rc, err = dc.NewRecordConfig(label, ttl, n.Type, content) } if err != nil { return nil, fmt.Errorf("WEBSUPPORT: %s record %q: %w", n.Type, n.Name, err) } + rc.Original = n return rc, nil } diff --git a/providers/websupport/convert_test.go b/providers/websupport/convert_test.go index e3df5c1c5a..909a25c4fa 100644 --- a/providers/websupport/convert_test.go +++ b/providers/websupport/convert_test.go @@ -8,12 +8,10 @@ import ( const testDomain = "example.com" -func mkRC(t *testing.T, rtype, label string, build func(rc *models.RecordConfig)) *models.RecordConfig { +func mkRC(t *testing.T, rtype, label string, args ...any) *models.RecordConfig { t.Helper() - rc := &models.RecordConfig{Type: rtype, TTL: 3600} - rc.SetLabel(label, testDomain) - build(rc) - return rc + dc := models.MustNewDomainConfig(testDomain) + return dc.MustNewRecordConfig(label, 3600, rtype, args...) } func TestRoundTrip(t *testing.T) { @@ -26,42 +24,42 @@ func TestRoundTrip(t *testing.T) { }{ { name: "A apex", - rc: mkRC(t, "A", "@", func(rc *models.RecordConfig) { _ = rc.SetTarget("1.2.3.4") }), + rc: mkRC(t, "A", "@", "1.2.3.4"), wantType: "A", wantName: "@", wantContent: "1.2.3.4", }, { name: "CNAME strips trailing dot", - rc: mkRC(t, "CNAME", "www", func(rc *models.RecordConfig) { _ = rc.SetTarget("ghs.example.net.") }), + rc: mkRC(t, "CNAME", "www", "ghs.example.net."), wantType: "CNAME", wantName: "www", wantContent: "ghs.example.net", }, { name: "MX", - rc: mkRC(t, "MX", "@", func(rc *models.RecordConfig) { _ = rc.SetTargetMX(10, "mail.example.com.") }), + rc: mkRC(t, "MX", "@", 10, "mail.example.com."), wantType: "MX", wantName: "@", wantContent: "mail.example.com", }, { name: "SRV", - rc: mkRC(t, "SRV", "_sip._tcp", func(rc *models.RecordConfig) { _ = rc.SetTargetSRV(10, 20, 5060, "sip.example.com.") }), + rc: mkRC(t, "SRV", "_sip._tcp", 10, 20, 5060, "sip.example.com."), wantType: "SRV", wantName: "_sip._tcp", wantContent: "sip.example.com", }, { name: "AAAA", - rc: mkRC(t, "AAAA", "ipv6", func(rc *models.RecordConfig) { _ = rc.SetTarget("2a00:4b40:aaaa:2001::6") }), + rc: mkRC(t, "AAAA", "ipv6", "2a00:4b40:aaaa:2001::6"), wantType: "AAAA", wantName: "ipv6", wantContent: "2a00:4b40:aaaa:2001::6", }, { name: "TXT", - rc: mkRC(t, "TXT", "@", func(rc *models.RecordConfig) { _ = rc.SetTargetTXT("hello world") }), + rc: mkRC(t, "TXT", "@", "hello world"), wantType: "TXT", wantName: "@", wantContent: "hello world", @@ -89,11 +87,12 @@ func TestRoundTrip(t *testing.T) { // even though writes use the relative label. n.ID = 42 n.Name = tc.rc.GetLabelFQDN() - rc2, err := toRecordConfig(testDomain, n) + dc := models.MustNewDomainConfig(testDomain) + rc2, err := toRecordConfig(dc, n) if err != nil { t.Fatalf("toRecordConfig: %v", err) } - if got, want := rc2.GetTargetCombined(), tc.rc.GetTargetCombined(); got != want { + if got, want := rc2.String(), tc.rc.String(); got != want { t.Errorf("round-trip target = %q, want %q", got, want) } if rc2.Type != tc.rc.Type { diff --git a/providers/websupport/records.go b/providers/websupport/records.go index 2f7f6b9af7..cb1ea1e89c 100644 --- a/providers/websupport/records.go +++ b/providers/websupport/records.go @@ -21,7 +21,7 @@ func (c *websupportProvider) GetZoneRecords(dc *models.DomainConfig) (models.Rec recs := make(models.Records, 0, len(nativeRecs)) for _, n := range nativeRecs { - rc, err := toRecordConfig(dc.Name, n) + rc, err := toRecordConfig(dc, n) if err != nil { return nil, err }