diff --git a/integrationTest/integration_test.go b/integrationTest/integration_test.go index 783d5f6c5..83d7b0dfa 100644 --- a/integrationTest/integration_test.go +++ b/integrationTest/integration_test.go @@ -381,22 +381,10 @@ func a(name, target string) *models.RecordConfig { return makeRec(name, target, "A") } -func cname(name, target string) *models.RecordConfig { - return makeRec(name, target, "CNAME") -} - func alias(name, target string) *models.RecordConfig { return makeRec(name, target, "ALIAS") } -func r53alias(name, aliasType, target string) *models.RecordConfig { - r := makeRec(name, target, "R53_ALIAS") - r.R53Alias = map[string]string{ - "type": aliasType, - } - return r -} - func azureAlias(name, aliasType, target string) *models.RecordConfig { r := makeRec(name, target, "AZURE_ALIAS") r.AzureAlias = map[string]string{ @@ -405,15 +393,9 @@ func azureAlias(name, aliasType, target string) *models.RecordConfig { return r } -func cfRedir(pattern, target string) *models.RecordConfig { - t := fmt.Sprintf("%s,%s", pattern, target) - r := makeRec("@", t, "CF_REDIRECT") - return r -} - -func cfRedirTemp(pattern, target string) *models.RecordConfig { - t := fmt.Sprintf("%s,%s", pattern, target) - r := makeRec("@", t, "CF_TEMP_REDIRECT") +func caa(name string, tag string, flag uint8, target string) *models.RecordConfig { + r := makeRec(name, target, "CAA") + r.SetTargetCAA(flag, tag, target) return r } @@ -437,31 +419,20 @@ func cfWorkerRoute(pattern, target string) *models.RecordConfig { return r } -func loc(name string, d1 uint8, m1 uint8, s1 float32, ns string, - d2 uint8, m2 uint8, s2 float32, ew string, al int32, sz float32, hp float32, vp float32) *models.RecordConfig { - r := makeRec(name, "", "LOC") - r.SetLOCParams(d1, m1, s1, ns, d2, m2, s2, ew, al, sz, hp, vp) +func cfRedir(pattern, target string) *models.RecordConfig { + t := fmt.Sprintf("%s,%s", pattern, target) + r := makeRec("@", t, "CF_REDIRECT") return r } -func ns(name, target string) *models.RecordConfig { - return makeRec(name, target, "NS") -} - -func mx(name string, prio uint16, target string) *models.RecordConfig { - r := makeRec(name, target, "MX") - r.MxPreference = prio +func cfRedirTemp(pattern, target string) *models.RecordConfig { + t := fmt.Sprintf("%s,%s", pattern, target) + r := makeRec("@", t, "CF_TEMP_REDIRECT") return r } -func ptr(name, target string) *models.RecordConfig { - return makeRec(name, target, "PTR") -} - -func naptr(name string, order uint16, preference uint16, flags string, service string, regexp string, target string) *models.RecordConfig { - r := makeRec(name, target, "NAPTR") - r.SetTargetNAPTR(order, preference, flags, service, regexp, target) - return r +func cname(name, target string) *models.RecordConfig { + return makeRec(name, target, "CNAME") } func ds(name string, keyTag uint16, algorithm, digestType uint8, digest string) *models.RecordConfig { @@ -470,46 +441,6 @@ func ds(name string, keyTag uint16, algorithm, digestType uint8, digest string) return r } -func soa(name string, ns, mbox string, serial, refresh, retry, expire, minttl uint32) *models.RecordConfig { - r := makeRec(name, "", "SOA") - r.SetTargetSOA(ns, mbox, serial, refresh, retry, expire, minttl) - return r -} - -func srv(name string, priority, weight, port uint16, target string) *models.RecordConfig { - r := makeRec(name, target, "SRV") - r.SetTargetSRV(priority, weight, port, target) - return r -} - -func sshfp(name string, algorithm uint8, fingerprint uint8, target string) *models.RecordConfig { - r := makeRec(name, target, "SSHFP") - r.SetTargetSSHFP(algorithm, fingerprint, target) - return r -} - -func txt(name, target string) *models.RecordConfig { - r := makeRec(name, "", "TXT") - r.SetTargetTXT(target) - return r -} - -func caa(name string, tag string, flag uint8, target string) *models.RecordConfig { - r := makeRec(name, target, "CAA") - r.SetTargetCAA(flag, tag, target) - return r -} - -func tlsa(name string, usage, selector, matchingtype uint8, target string) *models.RecordConfig { - r := makeRec(name, target, "TLSA") - r.SetTargetTLSA(usage, selector, matchingtype, target) - return r -} - -func urlfwd(name, target string) *models.RecordConfig { - return makeRec(name, target, "URLFWD") -} - func ignoreName(name string) *models.RecordConfig { r := &models.RecordConfig{ Type: "IGNORE_NAME", @@ -527,6 +458,13 @@ func ignoreTarget(name string, typ string) *models.RecordConfig { return r } +func loc(name string, d1 uint8, m1 uint8, s1 float32, ns string, + d2 uint8, m2 uint8, s2 float32, ew string, al int32, sz float32, hp float32, vp float32) *models.RecordConfig { + r := makeRec(name, "", "LOC") + r.SetLOCParams(d1, m1, s1, ns, d2, m2, s2, ew, al, sz, hp, vp) + return r +} + func makeRec(name, target, typ string) *models.RecordConfig { r := &models.RecordConfig{ Type: typ, @@ -537,12 +475,6 @@ func makeRec(name, target, typ string) *models.RecordConfig { return r } -// func (r *models.RecordConfig) ttl(t uint32) *models.RecordConfig { -func ttl(r *models.RecordConfig, t uint32) *models.RecordConfig { - r.TTL = t - return r -} - func manyA(namePattern, target string, n int) []*models.RecordConfig { recs := []*models.RecordConfig{} for i := 0; i < n; i++ { @@ -551,6 +483,52 @@ func manyA(namePattern, target string, n int) []*models.RecordConfig { return recs } +func mx(name string, prio uint16, target string) *models.RecordConfig { + r := makeRec(name, target, "MX") + r.MxPreference = prio + return r +} + +func ns(name, target string) *models.RecordConfig { + return makeRec(name, target, "NS") +} + +func naptr(name string, order uint16, preference uint16, flags string, service string, regexp string, target string) *models.RecordConfig { + r := makeRec(name, target, "NAPTR") + r.SetTargetNAPTR(order, preference, flags, service, regexp, target) + return r +} + +func ptr(name, target string) *models.RecordConfig { + return makeRec(name, target, "PTR") +} + +func r53alias(name, aliasType, target string) *models.RecordConfig { + r := makeRec(name, target, "R53_ALIAS") + r.R53Alias = map[string]string{ + "type": aliasType, + } + return r +} + +func soa(name string, ns, mbox string, serial, refresh, retry, expire, minttl uint32) *models.RecordConfig { + r := makeRec(name, "", "SOA") + r.SetTargetSOA(ns, mbox, serial, refresh, retry, expire, minttl) + return r +} + +func srv(name string, priority, weight, port uint16, target string) *models.RecordConfig { + r := makeRec(name, target, "SRV") + r.SetTargetSRV(priority, weight, port, target) + return r +} + +func sshfp(name string, algorithm uint8, fingerprint uint8, target string) *models.RecordConfig { + r := makeRec(name, target, "SSHFP") + r.SetTargetSSHFP(algorithm, fingerprint, target) + return r +} + func testgroup(desc string, items ...interface{}) *TestGroup { group := &TestGroup{Desc: desc} for _, item := range items { @@ -613,6 +591,28 @@ func tc(desc string, recs ...*models.RecordConfig) *TestCase { } } +func txt(name, target string) *models.RecordConfig { + r := makeRec(name, "", "TXT") + r.SetTargetTXT(target) + return r +} + +// func (r *models.RecordConfig) ttl(t uint32) *models.RecordConfig { +func ttl(r *models.RecordConfig, t uint32) *models.RecordConfig { + r.TTL = t + return r +} + +func tlsa(name string, usage, selector, matchingtype uint8, target string) *models.RecordConfig { + r := makeRec(name, target, "TLSA") + r.SetTargetTLSA(usage, selector, matchingtype, target) + return r +} + +func urlfwd(name, target string) *models.RecordConfig { + return makeRec(name, target, "URLFWD") +} + func clear(items ...interface{}) *TestCase { return tc("Empty") } diff --git a/models/dnsrr.go b/models/dnsrr.go index 6fbb5e330..2361c7f38 100644 --- a/models/dnsrr.go +++ b/models/dnsrr.go @@ -80,12 +80,12 @@ func RRtoRC(rr dns.RR, origin string) (RecordConfig, error) { err = rc.SetTargetLOC(v.Version, v.Latitude, v.Longitude, v.Altitude, v.Size, v.HorizPre, v.VertPre) case *dns.MX: err = rc.SetTargetMX(v.Preference, v.Mx) + case *dns.NAPTR: + err = rc.SetTargetNAPTR(v.Order, v.Preference, v.Flags, v.Service, v.Regexp, v.Replacement) case *dns.NS: err = rc.SetTarget(v.Ns) case *dns.PTR: err = rc.SetTarget(v.Ptr) - case *dns.NAPTR: - err = rc.SetTargetNAPTR(v.Order, v.Preference, v.Flags, v.Service, v.Regexp, v.Replacement) case *dns.SOA: err = rc.SetTargetSOA(v.Ns, v.Mbox, v.Serial, v.Refresh, v.Retry, v.Expire, v.Minttl) case *dns.SRV: diff --git a/models/record.go b/models/record.go index ef59887f9..f4b550405 100644 --- a/models/record.go +++ b/models/record.go @@ -384,6 +384,10 @@ func (rc *RecordConfig) ToRR() dns.RR { rr.(*dns.A).A = rc.GetTargetIP() case dns.TypeAAAA: rr.(*dns.AAAA).AAAA = rc.GetTargetIP() + case dns.TypeCAA: + rr.(*dns.CAA).Flag = rc.CaaFlag + rr.(*dns.CAA).Tag = rc.CaaTag + rr.(*dns.CAA).Value = rc.GetTargetField() case dns.TypeCNAME: rr.(*dns.CNAME).Target = rc.GetTargetField() case dns.TypeDS: @@ -402,8 +406,9 @@ func (rc *RecordConfig) ToRR() dns.RR { rr.(*dns.LOC).Size = rc.LocSize rr.(*dns.LOC).HorizPre = rc.LocHorizPre rr.(*dns.LOC).VertPre = rc.LocVertPre - case dns.TypePTR: - rr.(*dns.PTR).Ptr = rc.GetTargetField() + case dns.TypeMX: + rr.(*dns.MX).Preference = rc.MxPreference + rr.(*dns.MX).Mx = rc.GetTargetField() case dns.TypeNAPTR: rr.(*dns.NAPTR).Order = rc.NaptrOrder rr.(*dns.NAPTR).Preference = rc.NaptrPreference @@ -411,11 +416,10 @@ func (rc *RecordConfig) ToRR() dns.RR { rr.(*dns.NAPTR).Service = rc.NaptrService rr.(*dns.NAPTR).Regexp = rc.NaptrRegexp rr.(*dns.NAPTR).Replacement = rc.GetTargetField() - case dns.TypeMX: - rr.(*dns.MX).Preference = rc.MxPreference - rr.(*dns.MX).Mx = rc.GetTargetField() case dns.TypeNS: rr.(*dns.NS).Ns = rc.GetTargetField() + case dns.TypePTR: + rr.(*dns.PTR).Ptr = rc.GetTargetField() case dns.TypeSOA: rr.(*dns.SOA).Ns = rc.GetTargetField() rr.(*dns.SOA).Mbox = rc.SoaMbox @@ -424,6 +428,8 @@ func (rc *RecordConfig) ToRR() dns.RR { rr.(*dns.SOA).Retry = rc.SoaRetry rr.(*dns.SOA).Expire = rc.SoaExpire rr.(*dns.SOA).Minttl = rc.SoaMinttl + case dns.TypeSPF: + rr.(*dns.SPF).Txt = rc.TxtStrings case dns.TypeSRV: rr.(*dns.SRV).Priority = rc.SrvPriority rr.(*dns.SRV).Weight = rc.SrvWeight @@ -433,17 +439,11 @@ func (rc *RecordConfig) ToRR() dns.RR { rr.(*dns.SSHFP).Algorithm = rc.SshfpAlgorithm rr.(*dns.SSHFP).Type = rc.SshfpFingerprint rr.(*dns.SSHFP).FingerPrint = rc.GetTargetField() - case dns.TypeCAA: - rr.(*dns.CAA).Flag = rc.CaaFlag - rr.(*dns.CAA).Tag = rc.CaaTag - rr.(*dns.CAA).Value = rc.GetTargetField() case dns.TypeTLSA: rr.(*dns.TLSA).Usage = rc.TlsaUsage rr.(*dns.TLSA).MatchingType = rc.TlsaMatchingType rr.(*dns.TLSA).Selector = rc.TlsaSelector rr.(*dns.TLSA).Certificate = rc.GetTargetField() - case dns.TypeSPF: - rr.(*dns.SPF).Txt = rc.TxtStrings case dns.TypeTXT: rr.(*dns.TXT).Txt = rc.TxtStrings default: diff --git a/pkg/normalize/validate.go b/pkg/normalize/validate.go index 51540eade..98b97a881 100644 --- a/pkg/normalize/validate.go +++ b/pkg/normalize/validate.go @@ -53,6 +53,7 @@ func checkTarget(target string) error { // validateRecordTypes list of valid rec.Type values. Returns true if this is a real DNS record type, false means it is a pseudo-type used internally. func validateRecordTypes(rec *models.RecordConfig, domain string, pTypes []string) error { + // #rtype_variations var validTypes = map[string]bool{ "A": true, "AAAA": true, @@ -707,6 +708,7 @@ func commaSepInts(list []int) string { // the package elsewhere, so that our test suite can look at the list of // capabilities we're checking and make sure that it's up-to-date. var providerCapabilityChecks = []pairTypeCapability{ + // #rtype_variations // If a zone uses rType X, the provider must support capability Y. //{"X", providers.Y}, capabilityCheck("AKAMAICDN", providers.CanUseAKAMAICDN),