mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-01-10 01:18:30 +08:00
"Target" RecordConfig should not be exported (#1061)
* Unexport RecordConfig.Target * Fix tests * HEDNS: Fix usage of target field to resolve TXT handling (#1067) Co-authored-by: Robert Blenkinsopp <robert@blenkinsopp.net>
This commit is contained in:
parent
3e5e976766
commit
21e85e6528
22 changed files with 454 additions and 219 deletions
|
@ -12,8 +12,8 @@ func TestR53Test_1(t *testing.T) {
|
|||
Type: "R53_ALIAS",
|
||||
Name: "foo",
|
||||
NameFQDN: "foo.domain.tld",
|
||||
Target: "bar",
|
||||
}
|
||||
rec.SetTarget("bar")
|
||||
rec.R53Alias = make(map[string]string)
|
||||
rec.R53Alias["type"] = "A"
|
||||
w := `R53_ALIAS('foo', 'A', 'bar')`
|
||||
|
@ -27,8 +27,8 @@ func TestR53Test_1ttl(t *testing.T) {
|
|||
Type: "R53_ALIAS",
|
||||
Name: "foo",
|
||||
NameFQDN: "foo.domain.tld",
|
||||
Target: "bar",
|
||||
}
|
||||
rec.SetTarget("bar")
|
||||
rec.R53Alias = make(map[string]string)
|
||||
rec.R53Alias["type"] = "A"
|
||||
w := `R53_ALIAS('foo', 'A', 'bar', TTL(321))`
|
||||
|
@ -42,8 +42,8 @@ func TestR53Test_2(t *testing.T) {
|
|||
Type: "R53_ALIAS",
|
||||
Name: "foo",
|
||||
NameFQDN: "foo.domain.tld",
|
||||
Target: "bar",
|
||||
}
|
||||
rec.SetTarget("bar")
|
||||
rec.R53Alias = make(map[string]string)
|
||||
rec.R53Alias["type"] = "A"
|
||||
rec.R53Alias["zone_id"] = "blarg"
|
||||
|
@ -58,8 +58,8 @@ func TestR53Test_2ttl(t *testing.T) {
|
|||
Type: "R53_ALIAS",
|
||||
Name: "foo",
|
||||
NameFQDN: "foo.domain.tld",
|
||||
Target: "bar",
|
||||
}
|
||||
rec.SetTarget("bar")
|
||||
rec.R53Alias = make(map[string]string)
|
||||
rec.R53Alias["type"] = "A"
|
||||
rec.R53Alias["zone_id"] = "blarg"
|
||||
|
|
4
go.mod
4
go.mod
|
@ -42,7 +42,8 @@ require (
|
|||
github.com/hashicorp/vault/api v1.0.4
|
||||
github.com/hexonet/go-sdk v3.5.1+incompatible
|
||||
github.com/jarcoal/httpmock v1.0.8 // indirect
|
||||
github.com/juju/testing v0.0.0-20210302031854-2c7ee8570c07 // indirect
|
||||
github.com/jinzhu/copier v0.2.5
|
||||
github.com/juju/testing v0.0.0-20201216035041-2be42bba85f3 // indirect
|
||||
github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b // indirect
|
||||
github.com/miekg/dns v1.1.35
|
||||
github.com/mitchellh/mapstructure v1.4.1 // indirect
|
||||
|
@ -56,6 +57,7 @@ require (
|
|||
github.com/pierrec/lz4 v2.6.0+incompatible // indirect
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/pquerna/otp v1.3.0
|
||||
github.com/qdm12/reprint v0.0.0-20200326205758-722754a53494
|
||||
github.com/renier/xmlrpc v0.0.0-20191022213033-ce560eccbd00 // indirect
|
||||
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
|
|
33
go.sum
33
go.sum
|
@ -14,7 +14,6 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ
|
|||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
|
||||
cloud.google.com/go v0.74.0 h1:kpgPA77kSSbjSs+fWHkPTxQ6J5Z2Qkruo5jfXEkHxNQ=
|
||||
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
|
||||
cloud.google.com/go v0.78.0 h1:oKpsiyKMfVpwR3zSAkQixGzlVE5ovitBuO0qSmCf0bI=
|
||||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
|
||||
|
@ -40,7 +39,6 @@ github.com/Azure/azure-sdk-for-go v52.1.0+incompatible h1:TJRZiz8oejMIgMkYXWIQz1
|
|||
github.com/Azure/azure-sdk-for-go v52.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
||||
github.com/Azure/go-autorest/autorest v0.11.17 h1:2zCdHwNgRH+St1J+ZMf66xI8aLr/5KMy+wWLH97zwYM=
|
||||
github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
|
||||
github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM=
|
||||
github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
|
||||
|
@ -58,7 +56,6 @@ github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPu
|
|||
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
||||
github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk=
|
||||
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
|
||||
github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE=
|
||||
github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
||||
github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
|
||||
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
||||
|
@ -93,7 +90,6 @@ github.com/bhendo/go-powershell v0.0.0-20190719160123-219e7fb4e41e h1:KCjb01YiNo
|
|||
github.com/bhendo/go-powershell v0.0.0-20190719160123-219e7fb4e41e/go.mod h1:f7vw6ObmmNcyFQLhZX9eUGBJGpnwTJFDvVjqZxIxHWY=
|
||||
github.com/billputer/go-namecheap v0.0.0-20170915210158-0c7adb0710f8 h1:sIv3xbwhhAG94a62Q/rrSBtrWcXiYgldNOeqifyKSgo=
|
||||
github.com/billputer/go-namecheap v0.0.0-20170915210158-0c7adb0710f8/go.mod h1:bqqNsI2akL+lLWyApkYY0cxquWPKwEBU0Wd3chi3TEg=
|
||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
|
||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
|
||||
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||
|
@ -111,7 +107,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
|
|||
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
|
||||
github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
|
||||
github.com/daaku/go.zipexe v1.0.1 h1:wV4zMsDOI2SZ2m7Tdz1Ps96Zrx+TzaK15VbUaGozw0M=
|
||||
github.com/daaku/go.zipexe v1.0.1/go.mod h1:5xWogtqlYnfBXkSB1o9xysukNP9GTvaNkqzUZbt3Bw8=
|
||||
|
@ -232,7 +227,6 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv
|
|||
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
|
||||
|
@ -274,12 +268,13 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:
|
|||
github.com/jarcoal/httpmock v1.0.8 h1:8kI16SoO6LQKgPE7PvQuV+YuD/inwHd7fOOe2zMbo4k=
|
||||
github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/jinzhu/copier v0.2.5 h1:Spb+3hARaAN5eeGvqS1YAZflyIz3hCgh6HgvIlDi7U0=
|
||||
github.com/jinzhu/copier v0.2.5/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
|
||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
|
@ -295,15 +290,13 @@ github.com/juju/httpprof v0.0.0-20141217160036-14bf14c30767/go.mod h1:+MaLYz4Pum
|
|||
github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
|
||||
github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e h1:FdDd7bdI6cjq5vaoYlK1mfQYfF9sF2VZw8VEZMsl5t8=
|
||||
github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
|
||||
github.com/juju/mgo/v2 v2.0.0-20210302023703-70d5d206e208 h1:/WiCm+Vpj87e4QWuWwPD/bNE9kDrWCLvPBHOQNcG2+A=
|
||||
github.com/juju/mgo/v2 v2.0.0-20210302023703-70d5d206e208/go.mod h1:0OChplkvPTZ174D2FYZXg4IB9hbEwyHkD+zT+/eK+Fg=
|
||||
github.com/juju/mutex v0.0.0-20171110020013-1fe2a4bf0a3a/go.mod h1:Y3oOzHH8CQ0Ppt0oCKJ2JFO81/EsWenH5AEqigLH+yY=
|
||||
github.com/juju/retry v0.0.0-20151029024821-62c620325291/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4=
|
||||
github.com/juju/retry v0.0.0-20180821225755-9058e192b216/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4=
|
||||
github.com/juju/testing v0.0.0-20180402130637-44801989f0f7/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
|
||||
github.com/juju/testing v0.0.0-20190723135506-ce30eb24acd2/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
|
||||
github.com/juju/testing v0.0.0-20210302031854-2c7ee8570c07 h1:6QA3rIUc3TBPbv8zWa2KQ2TWn6gsn1EU0UhwRi6kOhA=
|
||||
github.com/juju/testing v0.0.0-20210302031854-2c7ee8570c07/go.mod h1:7lxZW0B50+xdGFkvhAb8bwAGt6IU87JB1H9w4t8MNVM=
|
||||
github.com/juju/testing v0.0.0-20201216035041-2be42bba85f3 h1:ram7cW6jDPTu6cv9xDMwa+tO7RsO4BdsubxrJ4EEw+E=
|
||||
github.com/juju/testing v0.0.0-20201216035041-2be42bba85f3/go.mod h1:IbSKFoKW0bzmbDZ7rBwF/L3lO3b1bpmOIhTXQl/WJxw=
|
||||
github.com/juju/utils v0.0.0-20180424094159-2000ea4ff043/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk=
|
||||
github.com/juju/utils v0.0.0-20200116185830-d40c2fe10647/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk=
|
||||
github.com/juju/utils/v2 v2.0.0-20200923005554-4646bfea2ef1/go.mod h1:fdlDtQlzundleLLz/ggoYinEt/LmnrpNKcNTABQATNI=
|
||||
|
@ -353,6 +346,8 @@ github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 h1:o6uBwrhM5C8Ll3MAA
|
|||
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8=
|
||||
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4=
|
||||
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc=
|
||||
github.com/nrdcg/goinwx v0.8.1 h1:20EQ/JaGFnSKwiDH2JzjIpicffl3cPk6imJBDqVBVtU=
|
||||
github.com/nrdcg/goinwx v0.8.1/go.mod h1:tILVc10gieBp/5PMvbcYeXM6pVQ+c9jxDZnpaR1UW7c=
|
||||
|
@ -377,6 +372,8 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr
|
|||
github.com/pquerna/otp v1.3.0 h1:oJV/SkzR33anKXwQU3Of42rL4wbrffP4uvUf1SvS5Xs=
|
||||
github.com/pquerna/otp v1.3.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/qdm12/reprint v0.0.0-20200326205758-722754a53494 h1:wSmWgpuccqS2IOfmYrbRiUgv+g37W5suLLLxwwniTSc=
|
||||
github.com/qdm12/reprint v0.0.0-20200326205758-722754a53494/go.mod h1:yipyliwI08eQ6XwDm1fEwKPdF/xdbkiHtrU+1Hg+vc4=
|
||||
github.com/renier/xmlrpc v0.0.0-20191022213033-ce560eccbd00 h1:mKU5SDtoxNCBexJlsba8dNKN8SoDNMibWxVEowW1fig=
|
||||
github.com/renier/xmlrpc v0.0.0-20191022213033-ce560eccbd00/go.mod h1:gRAiPF5C5Nd0eyyRdqIu9qTiFSoZzpTq727b5B8fkkU=
|
||||
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=
|
||||
|
@ -430,7 +427,6 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
|||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0=
|
||||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
|
||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
|
@ -442,7 +438,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
|||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g=
|
||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
|
@ -468,7 +463,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
|
|||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
|
||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||
|
@ -515,7 +509,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
|
|||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew=
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
|
@ -539,7 +532,6 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
|
|||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
|
||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -590,7 +582,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
|
|||
golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
|
||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
|
@ -715,7 +706,6 @@ google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6D
|
|||
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes=
|
||||
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705 h1:PYBmACG+YEv8uQPW0r1kJj8tR+gkF0UWq7iFdUezwEw=
|
||||
|
@ -736,7 +726,6 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
|
|||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||
google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI=
|
||||
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
|
||||
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||
google.golang.org/grpc v1.36.0 h1:o1bcQ6imQMIOpdrO3SWf2z5RV72WbDwdXuK0MDlc8As=
|
||||
|
@ -756,10 +745,9 @@ gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUy
|
|||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U=
|
||||
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/errgo.v1 v1.0.0-20161222125816-442357a80af5/go.mod h1:u0ALmqvLRxLI95fkdCEWrE6mhWYZW1aMOJHp5YXLHTg=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/h2non/gock.v1 v1.0.14 h1:fTeu9fcUvSnLNacYvYI54h+1/XEteDyHvrVCZEEEYNM=
|
||||
|
@ -779,7 +767,6 @@ gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76
|
|||
gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
|
||||
gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170712054546-1be3d31502d6/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
|
|
@ -9,14 +9,13 @@ import (
|
|||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/miekg/dns/dnsutil"
|
||||
|
||||
"github.com/StackExchange/dnscontrol/v3/models"
|
||||
"github.com/StackExchange/dnscontrol/v3/pkg/nameservers"
|
||||
"github.com/StackExchange/dnscontrol/v3/pkg/normalize"
|
||||
"github.com/StackExchange/dnscontrol/v3/providers"
|
||||
_ "github.com/StackExchange/dnscontrol/v3/providers/_all"
|
||||
"github.com/StackExchange/dnscontrol/v3/providers/config"
|
||||
"github.com/miekg/dns/dnsutil"
|
||||
)
|
||||
|
||||
var providerToRun = flag.String("provider", "", "Provider to run")
|
||||
|
@ -149,13 +148,6 @@ func testPermitted(t *testing.T, p string, f TestGroup) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
//func makeClearFilter() *TestCase {
|
||||
// tc := tc("Empty")
|
||||
// tc.ChangeFilter = true
|
||||
// return tc
|
||||
//}
|
||||
|
||||
// desc := fmt.Sprintf("%d: %s", i, tst.Desc)
|
||||
// makeChanges runs one set of DNS record tests. Returns true on success.
|
||||
func makeChanges(t *testing.T, prv providers.DNSServiceProvider, dc *models.DomainConfig, tst *TestCase, desc string, expectChanges bool, origConfig map[string]string) bool {
|
||||
domainName := dc.Name
|
||||
|
@ -328,39 +320,29 @@ type TestGroup struct {
|
|||
|
||||
type TestCase struct {
|
||||
Desc string
|
||||
Records []*rec
|
||||
Records []*models.RecordConfig
|
||||
IgnoredNames []string
|
||||
IgnoredTargets []*models.IgnoreTarget
|
||||
}
|
||||
|
||||
type rec models.RecordConfig
|
||||
|
||||
func (r *rec) GetLabel() string {
|
||||
return r.Name
|
||||
}
|
||||
|
||||
func (r *rec) SetLabel(label, domain string) {
|
||||
func SetLabel(r *models.RecordConfig, label, domain string) {
|
||||
r.Name = label
|
||||
r.NameFQDN = dnsutil.AddOrigin(label, "**current-domain**")
|
||||
}
|
||||
|
||||
func (r *rec) SetTarget(target string) {
|
||||
r.Target = target
|
||||
}
|
||||
|
||||
func a(name, target string) *rec {
|
||||
func a(name, target string) *models.RecordConfig {
|
||||
return makeRec(name, target, "A")
|
||||
}
|
||||
|
||||
func cname(name, target string) *rec {
|
||||
func cname(name, target string) *models.RecordConfig {
|
||||
return makeRec(name, target, "CNAME")
|
||||
}
|
||||
|
||||
func alias(name, target string) *rec {
|
||||
func alias(name, target string) *models.RecordConfig {
|
||||
return makeRec(name, target, "ALIAS")
|
||||
}
|
||||
|
||||
func r53alias(name, aliasType, target string) *rec {
|
||||
func r53alias(name, aliasType, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "R53_ALIAS")
|
||||
r.R53Alias = map[string]string{
|
||||
"type": aliasType,
|
||||
|
@ -368,7 +350,7 @@ func r53alias(name, aliasType, target string) *rec {
|
|||
return r
|
||||
}
|
||||
|
||||
func azureAlias(name, aliasType, target string) *rec {
|
||||
func azureAlias(name, aliasType, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "AZURE_ALIAS")
|
||||
r.AzureAlias = map[string]string{
|
||||
"type": aliasType,
|
||||
|
@ -376,33 +358,33 @@ func azureAlias(name, aliasType, target string) *rec {
|
|||
return r
|
||||
}
|
||||
|
||||
func cfRedir(pattern, target string) *rec {
|
||||
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) *rec {
|
||||
func cfRedirTemp(pattern, target string) *models.RecordConfig {
|
||||
t := fmt.Sprintf("%s,%s", pattern, target)
|
||||
r := makeRec("@", t, "CF_TEMP_REDIRECT")
|
||||
return r
|
||||
}
|
||||
|
||||
func ns(name, target string) *rec {
|
||||
func ns(name, target string) *models.RecordConfig {
|
||||
return makeRec(name, target, "NS")
|
||||
}
|
||||
|
||||
func mx(name string, prio uint16, target string) *rec {
|
||||
func mx(name string, prio uint16, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "MX")
|
||||
r.MxPreference = prio
|
||||
return r
|
||||
}
|
||||
|
||||
func ptr(name, target string) *rec {
|
||||
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) *rec {
|
||||
func naptr(name string, order uint16, preference uint16, flags string, service string, regexp string, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "NAPTR")
|
||||
r.NaptrOrder = order
|
||||
r.NaptrPreference = preference
|
||||
|
@ -412,7 +394,7 @@ func naptr(name string, order uint16, preference uint16, flags string, service s
|
|||
return r
|
||||
}
|
||||
|
||||
func ds(name string, keyTag uint16, algorithm, digestType uint8, digest string) *rec {
|
||||
func ds(name string, keyTag uint16, algorithm, digestType uint8, digest string) *models.RecordConfig {
|
||||
r := makeRec(name, "", "DS")
|
||||
r.DsKeyTag = keyTag
|
||||
r.DsAlgorithm = algorithm
|
||||
|
@ -421,7 +403,7 @@ func ds(name string, keyTag uint16, algorithm, digestType uint8, digest string)
|
|||
return r
|
||||
}
|
||||
|
||||
func srv(name string, priority, weight, port uint16, target string) *rec {
|
||||
func srv(name string, priority, weight, port uint16, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "SRV")
|
||||
r.SrvPriority = priority
|
||||
r.SrvWeight = weight
|
||||
|
@ -429,35 +411,35 @@ func srv(name string, priority, weight, port uint16, target string) *rec {
|
|||
return r
|
||||
}
|
||||
|
||||
func sshfp(name string, algorithm uint8, fingerprint uint8, target string) *rec {
|
||||
func sshfp(name string, algorithm uint8, fingerprint uint8, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "SSHFP")
|
||||
r.SshfpAlgorithm = algorithm
|
||||
r.SshfpFingerprint = fingerprint
|
||||
return r
|
||||
}
|
||||
|
||||
func txt(name, target string) *rec {
|
||||
func txt(name, target string) *models.RecordConfig {
|
||||
// FYI: This must match the algorithm in pkg/js/helpers.js TXT.
|
||||
r := makeRec(name, target, "TXT")
|
||||
r.TxtStrings = []string{target}
|
||||
return r
|
||||
}
|
||||
|
||||
func txtmulti(name string, target []string) *rec {
|
||||
func txtmulti(name string, target []string) *models.RecordConfig {
|
||||
// FYI: This must match the algorithm in pkg/js/helpers.js TXT.
|
||||
r := makeRec(name, target[0], "TXT")
|
||||
r.TxtStrings = target
|
||||
return r
|
||||
}
|
||||
|
||||
func caa(name string, tag string, flag uint8, target string) *rec {
|
||||
func caa(name string, tag string, flag uint8, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "CAA")
|
||||
r.CaaFlag = flag
|
||||
r.CaaTag = tag
|
||||
return r
|
||||
}
|
||||
|
||||
func tlsa(name string, usage, selector, matchingtype uint8, target string) *rec {
|
||||
func tlsa(name string, usage, selector, matchingtype uint8, target string) *models.RecordConfig {
|
||||
r := makeRec(name, target, "TLSA")
|
||||
r.TlsaUsage = usage
|
||||
r.TlsaSelector = selector
|
||||
|
@ -465,40 +447,41 @@ func tlsa(name string, usage, selector, matchingtype uint8, target string) *rec
|
|||
return r
|
||||
}
|
||||
|
||||
func ignoreName(name string) *rec {
|
||||
r := &rec{
|
||||
func ignoreName(name string) *models.RecordConfig {
|
||||
r := &models.RecordConfig{
|
||||
Type: "IGNORE_NAME",
|
||||
}
|
||||
r.SetLabel(name, "**current-domain**")
|
||||
SetLabel(r, name, "**current-domain**")
|
||||
return r
|
||||
}
|
||||
|
||||
func ignoreTarget(name string, typ string) *rec {
|
||||
r := &rec{
|
||||
Type: "IGNORE_TARGET",
|
||||
Target: typ,
|
||||
func ignoreTarget(name string, typ string) *models.RecordConfig {
|
||||
r := &models.RecordConfig{
|
||||
Type: "IGNORE_TARGET",
|
||||
}
|
||||
r.SetLabel(name, "**current-domain**")
|
||||
r.SetTarget(typ)
|
||||
SetLabel(r, name, "**current-domain**")
|
||||
return r
|
||||
}
|
||||
|
||||
func makeRec(name, target, typ string) *rec {
|
||||
r := &rec{
|
||||
func makeRec(name, target, typ string) *models.RecordConfig {
|
||||
r := &models.RecordConfig{
|
||||
Type: typ,
|
||||
TTL: 300,
|
||||
}
|
||||
r.SetLabel(name, "**current-domain**")
|
||||
SetLabel(r, name, "**current-domain**")
|
||||
r.SetTarget(target)
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *rec) ttl(t uint32) *rec {
|
||||
//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) []*rec {
|
||||
recs := []*rec{}
|
||||
func manyA(namePattern, target string, n int) []*models.RecordConfig {
|
||||
recs := []*models.RecordConfig{}
|
||||
for i := 0; i < n; i++ {
|
||||
recs = append(recs, makeRec(fmt.Sprintf(namePattern, i), target, "A"))
|
||||
}
|
||||
|
@ -536,18 +519,19 @@ func testgroup(desc string, items ...interface{}) *TestGroup {
|
|||
return group
|
||||
}
|
||||
|
||||
func tc(desc string, recs ...*rec) *TestCase {
|
||||
var records []*rec
|
||||
func tc(desc string, recs ...*models.RecordConfig) *TestCase {
|
||||
var records []*models.RecordConfig
|
||||
var ignoredNames []string
|
||||
var ignoredTargets []*models.IgnoreTarget
|
||||
for _, r := range recs {
|
||||
if r.Type == "IGNORE_NAME" {
|
||||
ignoredNames = append(ignoredNames, r.GetLabel())
|
||||
} else if r.Type == "IGNORE_TARGET" {
|
||||
ignoredTargets = append(ignoredTargets, &models.IgnoreTarget{
|
||||
rec := &models.IgnoreTarget{
|
||||
Pattern: r.GetLabel(),
|
||||
Type: r.Target,
|
||||
})
|
||||
Type: r.GetTargetField(),
|
||||
}
|
||||
ignoredTargets = append(ignoredTargets, rec)
|
||||
} else {
|
||||
records = append(records, r)
|
||||
}
|
||||
|
@ -645,11 +629,11 @@ func makeTests(t *testing.T) []*TestGroup {
|
|||
tc("Change it", a("@", "1.2.3.4")),
|
||||
tc("Add another", a("@", "1.2.3.4"), a("www", "1.2.3.4")),
|
||||
tc("Add another(same name)", a("@", "1.2.3.4"), a("www", "1.2.3.4"), a("www", "5.6.7.8")),
|
||||
tc("Change a ttl", a("@", "1.2.3.4").ttl(1000), a("www", "1.2.3.4"), a("www", "5.6.7.8")),
|
||||
tc("Change single target from set", a("@", "1.2.3.4").ttl(1000), a("www", "2.2.2.2"), a("www", "5.6.7.8")),
|
||||
tc("Change all ttls", a("@", "1.2.3.4").ttl(500), a("www", "2.2.2.2").ttl(400), a("www", "5.6.7.8").ttl(400)),
|
||||
tc("Delete one", a("@", "1.2.3.4").ttl(500), a("www", "5.6.7.8").ttl(400)),
|
||||
tc("Add back and change ttl", a("www", "5.6.7.8").ttl(700), a("www", "1.2.3.4").ttl(700)),
|
||||
tc("Change a ttl", ttl(a("@", "1.2.3.4"), 1000), a("www", "1.2.3.4"), a("www", "5.6.7.8")),
|
||||
tc("Change single target from set", ttl(a("@", "1.2.3.4"), 1000), a("www", "2.2.2.2"), a("www", "5.6.7.8")),
|
||||
tc("Change all ttls", ttl(a("@", "1.2.3.4"), 500), ttl(a("www", "2.2.2.2"), 400), ttl(a("www", "5.6.7.8"), 400)),
|
||||
tc("Delete one", ttl(a("@", "1.2.3.4"), 500), ttl(a("www", "5.6.7.8"), 400)),
|
||||
tc("Add back and change ttl", ttl(a("www", "5.6.7.8"), 700), ttl(a("www", "1.2.3.4"), 700)),
|
||||
tc("Change targets and ttls", a("www", "1.1.1.1"), a("www", "2.2.2.2")),
|
||||
),
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ func TestRR(t *testing.T) {
|
|||
Type: "A",
|
||||
Name: "foo",
|
||||
NameFQDN: "foo.example.com",
|
||||
Target: "1.2.3.4",
|
||||
target: "1.2.3.4",
|
||||
TTL: 0,
|
||||
MxPreference: 0,
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ func TestRR(t *testing.T) {
|
|||
Type: "CAA",
|
||||
Name: "@",
|
||||
NameFQDN: "example.com",
|
||||
Target: "mailto:test@example.com",
|
||||
target: "mailto:test@example.com",
|
||||
TTL: 300,
|
||||
CaaTag: "iodef",
|
||||
CaaFlag: 1,
|
||||
|
@ -38,7 +38,7 @@ func TestRR(t *testing.T) {
|
|||
Type: "TLSA",
|
||||
Name: "@",
|
||||
NameFQDN: "_443._tcp.example.com",
|
||||
Target: "abcdef0123456789",
|
||||
target: "abcdef0123456789",
|
||||
TTL: 300,
|
||||
TlsaUsage: 0,
|
||||
TlsaSelector: 0,
|
||||
|
@ -53,8 +53,8 @@ func TestRR(t *testing.T) {
|
|||
|
||||
func TestDowncase(t *testing.T) {
|
||||
dc := DomainConfig{Records: Records{
|
||||
&RecordConfig{Type: "MX", Name: "lower", Target: "targetmx"},
|
||||
&RecordConfig{Type: "MX", Name: "UPPER", Target: "TARGETMX"},
|
||||
&RecordConfig{Type: "MX", Name: "lower", target: "targetmx"},
|
||||
&RecordConfig{Type: "MX", Name: "UPPER", target: "TARGETMX"},
|
||||
}}
|
||||
downcase(dc.Records)
|
||||
if !dc.Records.HasRecordTypeName("MX", "lower") {
|
||||
|
|
|
@ -3,6 +3,7 @@ package models
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/qdm12/reprint"
|
||||
"golang.org/x/net/idna"
|
||||
)
|
||||
|
||||
|
@ -34,21 +35,19 @@ type DomainConfig struct {
|
|||
// Copy returns a deep copy of the DomainConfig.
|
||||
func (dc *DomainConfig) Copy() (*DomainConfig, error) {
|
||||
newDc := &DomainConfig{}
|
||||
// provider instances are interfaces that gob hates if you don't register them.
|
||||
// and the specific types are not gob encodable since nothing is exported.
|
||||
// should find a better solution for this now.
|
||||
//
|
||||
// current strategy: remove everything, gob copy it. Then set both to stored copy.
|
||||
reg := dc.RegistrarInstance
|
||||
dnsps := dc.DNSProviderInstances
|
||||
dc.RegistrarInstance = nil
|
||||
dc.DNSProviderInstances = nil
|
||||
err := copyObj(dc, newDc)
|
||||
dc.RegistrarInstance = reg
|
||||
newDc.RegistrarInstance = reg
|
||||
dc.DNSProviderInstances = dnsps
|
||||
newDc.DNSProviderInstances = dnsps
|
||||
err := reprint.FromTo(dc, newDc) // Deep copy
|
||||
return newDc, err
|
||||
|
||||
// NB(tlim): The old version of this copied the structure by gob-encoding
|
||||
// and decoding it. gob doesn't like the dc.RegisterInstance or
|
||||
// dc.DNSProviderInstances fields, so we saved a temporary copy of those,
|
||||
// nil'ed out the original, did the gob copy, and then manually copied those
|
||||
// fields using the temp variables we saved. It looked like:
|
||||
//reg, dnsps := dc.RegistrarInstance, dc.DNSProviderInstances
|
||||
//dc.RegistrarInstance, dc.DNSProviderInstances = nil, nil
|
||||
// (perform the copy)
|
||||
//dc.RegistrarInstance, dc.DNSProviderInstances = reg, dnsps
|
||||
//newDc.RegistrarInstance, newDc.DNSProviderInstances = reg, dnsps
|
||||
}
|
||||
|
||||
// Filter removes all records that don't match the filter f.
|
||||
|
|
124
models/record.go
124
models/record.go
|
@ -1,13 +1,16 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/miekg/dns/dnsutil"
|
||||
"github.com/qdm12/reprint"
|
||||
)
|
||||
|
||||
// RecordConfig stores a DNS record.
|
||||
|
@ -54,7 +57,7 @@ import (
|
|||
// NOTE: Eventually we will unexport Name/NameFQDN. Please start using
|
||||
// the setters (SetLabel/SetLabelFromFQDN) and getters (GetLabel/GetLabelFQDN).
|
||||
// as they will always work.
|
||||
// Target:
|
||||
// target:
|
||||
// This is the host or IP address of the record, with
|
||||
// the other related parameters (weight, priority, etc.) stored in individual
|
||||
// fields.
|
||||
|
@ -69,13 +72,16 @@ import (
|
|||
// rec.Label() == "@" // Is this record at the apex?
|
||||
//
|
||||
type RecordConfig struct {
|
||||
Type string `json:"type"` // All caps rtype name.
|
||||
Name string `json:"name"` // The short name. See above.
|
||||
SubDomain string `json:"subdomain,omitempty"`
|
||||
NameFQDN string `json:"-"` // Must end with ".$origin". See above.
|
||||
Target string `json:"target"` // If a name, must end with "."
|
||||
TTL uint32 `json:"ttl,omitempty"`
|
||||
Metadata map[string]string `json:"meta,omitempty"`
|
||||
Type string `json:"type"` // All caps rtype name.
|
||||
Name string `json:"name"` // The short name. See above.
|
||||
SubDomain string `json:"subdomain,omitempty"`
|
||||
NameFQDN string `json:"-"` // Must end with ".$origin". See above.
|
||||
target string // If a name, must end with "."
|
||||
TTL uint32 `json:"ttl,omitempty"`
|
||||
Metadata map[string]string `json:"meta,omitempty"`
|
||||
Original interface{} `json:"-"` // Store pointer to provider-specific record object. Used in diffing.
|
||||
|
||||
// If you add a field to this struct, also add it to the list on MarshalJSON.
|
||||
MxPreference uint16 `json:"mxpreference,omitempty"`
|
||||
SrvPriority uint16 `json:"srvpriority,omitempty"`
|
||||
SrvWeight uint16 `json:"srvweight,omitempty"`
|
||||
|
@ -105,14 +111,100 @@ type RecordConfig struct {
|
|||
TxtStrings []string `json:"txtstrings,omitempty"` // TxtStrings stores all strings (including the first). Target stores only the first one.
|
||||
R53Alias map[string]string `json:"r53_alias,omitempty"`
|
||||
AzureAlias map[string]string `json:"azure_alias,omitempty"`
|
||||
}
|
||||
|
||||
Original interface{} `json:"-"` // Store pointer to provider-specific record object. Used in diffing.
|
||||
// MarshalJSON marshals RecordConfig.
|
||||
func (rc *RecordConfig) MarshalJSON() ([]byte, error) {
|
||||
recj := &struct {
|
||||
RecordConfig
|
||||
Target string `json:"target"`
|
||||
}{
|
||||
RecordConfig: *rc,
|
||||
Target: rc.GetTargetField(),
|
||||
}
|
||||
j, err := json.Marshal(*recj)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return j, nil
|
||||
}
|
||||
|
||||
// UnmarshalJSON unmarshals RecordConfig.
|
||||
func (rc *RecordConfig) UnmarshalJSON(b []byte) error {
|
||||
recj := &struct {
|
||||
Target string `json:"target"`
|
||||
|
||||
Type string `json:"type"` // All caps rtype name.
|
||||
Name string `json:"name"` // The short name. See above.
|
||||
SubDomain string `json:"subdomain,omitempty"`
|
||||
NameFQDN string `json:"-"` // Must end with ".$origin". See above.
|
||||
target string // If a name, must end with "."
|
||||
TTL uint32 `json:"ttl,omitempty"`
|
||||
Metadata map[string]string `json:"meta,omitempty"`
|
||||
Original interface{} `json:"-"` // Store pointer to provider-specific record object. Used in diffing.
|
||||
|
||||
MxPreference uint16 `json:"mxpreference,omitempty"`
|
||||
SrvPriority uint16 `json:"srvpriority,omitempty"`
|
||||
SrvWeight uint16 `json:"srvweight,omitempty"`
|
||||
SrvPort uint16 `json:"srvport,omitempty"`
|
||||
CaaTag string `json:"caatag,omitempty"`
|
||||
CaaFlag uint8 `json:"caaflag,omitempty"`
|
||||
DsKeyTag uint16 `json:"dskeytag,omitempty"`
|
||||
DsAlgorithm uint8 `json:"dsalgorithm,omitempty"`
|
||||
DsDigestType uint8 `json:"dsdigesttype,omitempty"`
|
||||
DsDigest string `json:"dsdigest,omitempty"`
|
||||
NaptrOrder uint16 `json:"naptrorder,omitempty"`
|
||||
NaptrPreference uint16 `json:"naptrpreference,omitempty"`
|
||||
NaptrFlags string `json:"naptrflags,omitempty"`
|
||||
NaptrService string `json:"naptrservice,omitempty"`
|
||||
NaptrRegexp string `json:"naptrregexp,omitempty"`
|
||||
SshfpAlgorithm uint8 `json:"sshfpalgorithm,omitempty"`
|
||||
SshfpFingerprint uint8 `json:"sshfpfingerprint,omitempty"`
|
||||
SoaMbox string `json:"soambox,omitempty"`
|
||||
SoaSerial uint32 `json:"soaserial,omitempty"`
|
||||
SoaRefresh uint32 `json:"soarefresh,omitempty"`
|
||||
SoaRetry uint32 `json:"soaretry,omitempty"`
|
||||
SoaExpire uint32 `json:"soaexpire,omitempty"`
|
||||
SoaMinttl uint32 `json:"soaminttl,omitempty"`
|
||||
TlsaUsage uint8 `json:"tlsausage,omitempty"`
|
||||
TlsaSelector uint8 `json:"tlsaselector,omitempty"`
|
||||
TlsaMatchingType uint8 `json:"tlsamatchingtype,omitempty"`
|
||||
TxtStrings []string `json:"txtstrings,omitempty"` // TxtStrings stores all strings (including the first). Target stores only the first one.
|
||||
R53Alias map[string]string `json:"r53_alias,omitempty"`
|
||||
AzureAlias map[string]string `json:"azure_alias,omitempty"`
|
||||
// NB(tlim): If anyone can figure out how to do this without listing all
|
||||
// the fields, please let us know!
|
||||
}{}
|
||||
if err := json.Unmarshal(b, &recj); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Copy the exported fields.
|
||||
copier.CopyWithOption(&rc, &recj, copier.Option{IgnoreEmpty: true, DeepCopy: true})
|
||||
// Set each unexported field.
|
||||
rc.SetTarget(recj.Target)
|
||||
|
||||
// Some sanity checks:
|
||||
if recj.Type != rc.Type {
|
||||
panic("DEBUG: TYPE NOT COPIED\n")
|
||||
}
|
||||
if recj.Type == "" {
|
||||
panic("DEBUG: TYPE BLANK\n")
|
||||
}
|
||||
if recj.Name != rc.Name {
|
||||
panic("DEBUG: NAME NOT COPIED\n")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Copy returns a deep copy of a RecordConfig.
|
||||
func (rc *RecordConfig) Copy() (*RecordConfig, error) {
|
||||
newR := &RecordConfig{}
|
||||
err := copyObj(rc, newR)
|
||||
// Copy the exported fields.
|
||||
err := reprint.FromTo(rc, newR) // Deep copy
|
||||
// Set each unexported field.
|
||||
newR.target = rc.target
|
||||
return newR, err
|
||||
}
|
||||
|
||||
|
@ -129,7 +221,9 @@ func (rc *RecordConfig) SetLabel(short, origin string) {
|
|||
panic(fmt.Errorf("origin (%s) is not supposed to end with a dot", origin))
|
||||
}
|
||||
if strings.HasSuffix(short, ".") {
|
||||
panic(fmt.Errorf("short (%s) is not supposed to end with a dot", origin))
|
||||
if short != "**current-domain**" {
|
||||
panic(fmt.Errorf("short (%s) is not supposed to end with a dot", origin))
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(tlim): We should add more validation here or in a separate validation
|
||||
|
@ -198,7 +292,7 @@ func (rc *RecordConfig) GetLabelFQDN() string {
|
|||
func (rc *RecordConfig) ToDiffable(extraMaps ...map[string]string) string {
|
||||
content := fmt.Sprintf("%v ttl=%d", rc.GetTargetCombined(), rc.TTL)
|
||||
if rc.Type == "SOA" {
|
||||
content = fmt.Sprintf("%s %v %d %d %d %d ttl=%d", rc.Target, rc.SoaMbox, rc.SoaRefresh, rc.SoaRetry, rc.SoaExpire, rc.SoaMinttl, rc.TTL)
|
||||
content = fmt.Sprintf("%s %v %d %d %d %d ttl=%d", rc.target, rc.SoaMbox, rc.SoaRefresh, rc.SoaRetry, rc.SoaExpire, rc.SoaMinttl, rc.TTL)
|
||||
// SoaSerial is not used in comparison
|
||||
}
|
||||
for _, valueMap := range extraMaps {
|
||||
|
@ -406,13 +500,13 @@ func downcase(recs []*RecordConfig) {
|
|||
switch r.Type { // #rtype_variations
|
||||
case "ANAME", "CNAME", "DS", "MX", "NS", "PTR", "NAPTR", "SRV":
|
||||
// These record types have a target that is case insensitive, so we downcase it.
|
||||
r.Target = strings.ToLower(r.Target)
|
||||
r.target = strings.ToLower(r.target)
|
||||
case "A", "AAAA", "ALIAS", "CAA", "IMPORT_TRANSFORM", "TLSA", "TXT", "SSHFP", "CF_REDIRECT", "CF_TEMP_REDIRECT":
|
||||
// These record types have a target that is case sensitive, or is an IP address. We leave them alone.
|
||||
// Do nothing.
|
||||
case "SOA":
|
||||
if r.Target != "DEFAULT_NOT_SET." {
|
||||
r.Target = strings.ToLower(r.Target) // .Target stores the Ns
|
||||
if r.target != "DEFAULT_NOT_SET." {
|
||||
r.target = strings.ToLower(r.target) // .target stores the Ns
|
||||
}
|
||||
if r.SoaMbox != "DEFAULT_NOT_SET." {
|
||||
r.SoaMbox = strings.ToLower(r.SoaMbox)
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package models
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestHasRecordTypeName(t *testing.T) {
|
||||
x := &RecordConfig{
|
||||
|
@ -49,3 +52,184 @@ func TestKey(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRecordConfig_Copy(t *testing.T) {
|
||||
type fields struct {
|
||||
Type string
|
||||
Name string
|
||||
SubDomain string
|
||||
NameFQDN string
|
||||
target string
|
||||
TTL uint32
|
||||
Metadata map[string]string
|
||||
MxPreference uint16
|
||||
SrvPriority uint16
|
||||
SrvWeight uint16
|
||||
SrvPort uint16
|
||||
CaaTag string
|
||||
CaaFlag uint8
|
||||
DsKeyTag uint16
|
||||
DsAlgorithm uint8
|
||||
DsDigestType uint8
|
||||
DsDigest string
|
||||
NaptrOrder uint16
|
||||
NaptrPreference uint16
|
||||
NaptrFlags string
|
||||
NaptrService string
|
||||
NaptrRegexp string
|
||||
SshfpAlgorithm uint8
|
||||
SshfpFingerprint uint8
|
||||
SoaMbox string
|
||||
SoaSerial uint32
|
||||
SoaRefresh uint32
|
||||
SoaRetry uint32
|
||||
SoaExpire uint32
|
||||
SoaMinttl uint32
|
||||
TlsaUsage uint8
|
||||
TlsaSelector uint8
|
||||
TlsaMatchingType uint8
|
||||
TxtStrings []string
|
||||
R53Alias map[string]string
|
||||
AzureAlias map[string]string
|
||||
Original interface{}
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
want *RecordConfig
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "only",
|
||||
fields: fields{
|
||||
Type: "type",
|
||||
Name: "name",
|
||||
SubDomain: "sub",
|
||||
NameFQDN: "namef",
|
||||
target: "targette",
|
||||
TTL: 12345,
|
||||
Metadata: map[string]string{"me": "ah", "da": "ta"},
|
||||
MxPreference: 123,
|
||||
SrvPriority: 223,
|
||||
SrvWeight: 345,
|
||||
SrvPort: 456,
|
||||
CaaTag: "caata",
|
||||
CaaFlag: 100,
|
||||
DsKeyTag: 12341,
|
||||
DsAlgorithm: 99,
|
||||
DsDigestType: 98,
|
||||
DsDigest: "dsdig",
|
||||
NaptrOrder: 10000,
|
||||
NaptrPreference: 12220,
|
||||
NaptrFlags: "naptrfl",
|
||||
NaptrService: "naptrser",
|
||||
NaptrRegexp: "naptrreg",
|
||||
SshfpAlgorithm: 4,
|
||||
SshfpFingerprint: 5,
|
||||
SoaMbox: "soambox",
|
||||
SoaSerial: 456789,
|
||||
SoaRefresh: 192000,
|
||||
SoaRetry: 293293,
|
||||
SoaExpire: 3434343,
|
||||
SoaMinttl: 34234324,
|
||||
TlsaUsage: 1,
|
||||
TlsaSelector: 2,
|
||||
TlsaMatchingType: 3,
|
||||
TxtStrings: []string{"one", "two", "three"},
|
||||
R53Alias: map[string]string{"a": "eh", "b": "bee"},
|
||||
AzureAlias: map[string]string{"az": "az", "ure": "your"},
|
||||
//Original interface{},
|
||||
},
|
||||
want: &RecordConfig{
|
||||
Type: "type",
|
||||
Name: "name",
|
||||
SubDomain: "sub",
|
||||
NameFQDN: "namef",
|
||||
target: "targette",
|
||||
TTL: 12345,
|
||||
Metadata: map[string]string{"me": "ah", "da": "ta"},
|
||||
MxPreference: 123,
|
||||
SrvPriority: 223,
|
||||
SrvWeight: 345,
|
||||
SrvPort: 456,
|
||||
CaaTag: "caata",
|
||||
CaaFlag: 100,
|
||||
DsKeyTag: 12341,
|
||||
DsAlgorithm: 99,
|
||||
DsDigestType: 98,
|
||||
DsDigest: "dsdig",
|
||||
NaptrOrder: 10000,
|
||||
NaptrPreference: 12220,
|
||||
NaptrFlags: "naptrfl",
|
||||
NaptrService: "naptrser",
|
||||
NaptrRegexp: "naptrreg",
|
||||
SshfpAlgorithm: 4,
|
||||
SshfpFingerprint: 5,
|
||||
SoaMbox: "soambox",
|
||||
SoaSerial: 456789,
|
||||
SoaRefresh: 192000,
|
||||
SoaRetry: 293293,
|
||||
SoaExpire: 3434343,
|
||||
SoaMinttl: 34234324,
|
||||
TlsaUsage: 1,
|
||||
TlsaSelector: 2,
|
||||
TlsaMatchingType: 3,
|
||||
TxtStrings: []string{"one", "two", "three"},
|
||||
R53Alias: map[string]string{"a": "eh", "b": "bee"},
|
||||
AzureAlias: map[string]string{"az": "az", "ure": "your"},
|
||||
//Original interface{},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
rc := &RecordConfig{
|
||||
Type: tt.fields.Type,
|
||||
Name: tt.fields.Name,
|
||||
SubDomain: tt.fields.SubDomain,
|
||||
NameFQDN: tt.fields.NameFQDN,
|
||||
target: tt.fields.target,
|
||||
TTL: tt.fields.TTL,
|
||||
Metadata: tt.fields.Metadata,
|
||||
MxPreference: tt.fields.MxPreference,
|
||||
SrvPriority: tt.fields.SrvPriority,
|
||||
SrvWeight: tt.fields.SrvWeight,
|
||||
SrvPort: tt.fields.SrvPort,
|
||||
CaaTag: tt.fields.CaaTag,
|
||||
CaaFlag: tt.fields.CaaFlag,
|
||||
DsKeyTag: tt.fields.DsKeyTag,
|
||||
DsAlgorithm: tt.fields.DsAlgorithm,
|
||||
DsDigestType: tt.fields.DsDigestType,
|
||||
DsDigest: tt.fields.DsDigest,
|
||||
NaptrOrder: tt.fields.NaptrOrder,
|
||||
NaptrPreference: tt.fields.NaptrPreference,
|
||||
NaptrFlags: tt.fields.NaptrFlags,
|
||||
NaptrService: tt.fields.NaptrService,
|
||||
NaptrRegexp: tt.fields.NaptrRegexp,
|
||||
SshfpAlgorithm: tt.fields.SshfpAlgorithm,
|
||||
SshfpFingerprint: tt.fields.SshfpFingerprint,
|
||||
SoaMbox: tt.fields.SoaMbox,
|
||||
SoaSerial: tt.fields.SoaSerial,
|
||||
SoaRefresh: tt.fields.SoaRefresh,
|
||||
SoaRetry: tt.fields.SoaRetry,
|
||||
SoaExpire: tt.fields.SoaExpire,
|
||||
SoaMinttl: tt.fields.SoaMinttl,
|
||||
TlsaUsage: tt.fields.TlsaUsage,
|
||||
TlsaSelector: tt.fields.TlsaSelector,
|
||||
TlsaMatchingType: tt.fields.TlsaMatchingType,
|
||||
TxtStrings: tt.fields.TxtStrings,
|
||||
R53Alias: tt.fields.R53Alias,
|
||||
AzureAlias: tt.fields.AzureAlias,
|
||||
Original: tt.fields.Original,
|
||||
}
|
||||
got, err := rc.Copy()
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("RecordConfig.Copy() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("RecordConfig.Copy() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
/* .Target is kind of a mess.
|
||||
/* .target is kind of a mess.
|
||||
For simple rtypes it is the record's value. (i.e. for an A record
|
||||
it is the IP address).
|
||||
For complex rtypes (like an MX record has a preference and a value)
|
||||
|
@ -26,7 +26,7 @@ func (rc *RecordConfig) GetTargetField() string {
|
|||
if rc.HasFormatIdenticalToTXT() {
|
||||
return strings.Join(rc.TxtStrings, "")
|
||||
}
|
||||
return rc.Target
|
||||
return rc.target
|
||||
}
|
||||
|
||||
// // GetTargetSingle returns the target for types that have a single value target
|
||||
|
@ -35,15 +35,15 @@ func (rc *RecordConfig) GetTargetField() string {
|
|||
// if rc.Type == "MX" || rc.Type == "SRV" || rc.Type == "CAA" || rc.Type == "TLSA" || rc.Type == "TXT" {
|
||||
// panic("TargetSingle called on a type with a multi-parameter rtype.")
|
||||
// }
|
||||
// return rc.Target
|
||||
// return rc.target
|
||||
// }
|
||||
|
||||
// GetTargetIP returns the net.IP stored in Target.
|
||||
// GetTargetIP returns the net.IP stored in .target.
|
||||
func (rc *RecordConfig) GetTargetIP() net.IP {
|
||||
if rc.Type != "A" && rc.Type != "AAAA" {
|
||||
panic(fmt.Errorf("GetTargetIP called on an inappropriate rtype (%s)", rc.Type))
|
||||
}
|
||||
return net.ParseIP(rc.Target)
|
||||
return net.ParseIP(rc.target)
|
||||
}
|
||||
|
||||
// GetTargetCombined returns a string with the various fields combined.
|
||||
|
@ -54,15 +54,15 @@ func (rc *RecordConfig) GetTargetCombined() string {
|
|||
switch rc.Type { // #rtype_variations
|
||||
case "R53_ALIAS":
|
||||
// Differentiate between multiple R53_ALIASs on the same label.
|
||||
return fmt.Sprintf("%s atype=%s zone_id=%s", rc.Target, rc.R53Alias["type"], rc.R53Alias["zone_id"])
|
||||
return fmt.Sprintf("%s atype=%s zone_id=%s", rc.target, rc.R53Alias["type"], rc.R53Alias["zone_id"])
|
||||
case "AZURE_ALIAS":
|
||||
// Differentiate between multiple AZURE_ALIASs on the same label.
|
||||
return fmt.Sprintf("%s atype=%s", rc.Target, rc.AzureAlias["type"])
|
||||
return fmt.Sprintf("%s atype=%s", rc.target, rc.AzureAlias["type"])
|
||||
case "SOA":
|
||||
return fmt.Sprintf("%s %v %d %d %d %d %d", rc.Target, rc.SoaMbox, rc.SoaSerial, rc.SoaRefresh, rc.SoaRetry, rc.SoaExpire, rc.SoaMinttl)
|
||||
return fmt.Sprintf("%s %v %d %d %d %d %d", rc.target, rc.SoaMbox, rc.SoaSerial, rc.SoaRefresh, rc.SoaRetry, rc.SoaExpire, rc.SoaMinttl)
|
||||
default:
|
||||
// Just return the target.
|
||||
return rc.Target
|
||||
return rc.target
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -87,7 +87,7 @@ func (rc *RecordConfig) GetTargetSortable() string {
|
|||
|
||||
// GetTargetDebug returns a string with the various fields spelled out.
|
||||
func (rc *RecordConfig) GetTargetDebug() string {
|
||||
content := fmt.Sprintf("%s %s %s %d", rc.Type, rc.NameFQDN, rc.Target, rc.TTL)
|
||||
content := fmt.Sprintf("%s %s %s %d", rc.Type, rc.NameFQDN, rc.target, rc.TTL)
|
||||
switch rc.Type { // #rtype_variations
|
||||
case "A", "AAAA", "CNAME", "NS", "PTR", "TXT":
|
||||
// Nothing special.
|
||||
|
@ -98,7 +98,7 @@ func (rc *RecordConfig) GetTargetDebug() string {
|
|||
case "MX":
|
||||
content += fmt.Sprintf(" pref=%d", rc.MxPreference)
|
||||
case "SOA":
|
||||
content = fmt.Sprintf("%s ns=%v mbox=%v serial=%v refresh=%v retry=%v expire=%v minttl=%v", rc.Type, rc.Target, rc.SoaMbox, rc.SoaSerial, rc.SoaRefresh, rc.SoaRetry, rc.SoaExpire, rc.SoaMinttl)
|
||||
content = fmt.Sprintf("%s ns=%v mbox=%v serial=%v refresh=%v retry=%v expire=%v minttl=%v", rc.Type, rc.target, rc.SoaMbox, rc.SoaSerial, rc.SoaRefresh, rc.SoaRetry, rc.SoaExpire, rc.SoaMinttl)
|
||||
case "SRV":
|
||||
content += fmt.Sprintf(" srvpriority=%d srvweight=%d srvport=%d", rc.SrvPriority, rc.SrvWeight, rc.SrvPort)
|
||||
case "SSHFP":
|
||||
|
@ -124,7 +124,7 @@ func (rc *RecordConfig) GetTargetDebug() string {
|
|||
|
||||
// SetTarget sets the target, assuming that the rtype is appropriate.
|
||||
func (rc *RecordConfig) SetTarget(target string) error {
|
||||
rc.Target = target
|
||||
rc.target = target
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/gob"
|
||||
)
|
||||
|
||||
func copyObj(input interface{}, output interface{}) error {
|
||||
buf := &bytes.Buffer{}
|
||||
enc := gob.NewEncoder(buf)
|
||||
dec := gob.NewDecoder(buf)
|
||||
if err := enc.Encode(input); err != nil {
|
||||
return err
|
||||
}
|
||||
return dec.Decode(output)
|
||||
}
|
|
@ -61,7 +61,7 @@ func (d *differ) content(r *models.RecordConfig) string {
|
|||
// results are generated. Once we have confidence, this function will go away.
|
||||
content := fmt.Sprintf("%v ttl=%d", r.GetTargetCombined(), r.TTL)
|
||||
if r.Type == "SOA" {
|
||||
content = fmt.Sprintf("%s %v %d %d %d %d ttl=%d", r.Target, r.SoaMbox, r.SoaRefresh, r.SoaRetry, r.SoaExpire, r.SoaMinttl, r.TTL) // SoaSerial is not used in comparison
|
||||
content = fmt.Sprintf("%s %v %d %d %d %d ttl=%d", r.GetTargetField(), r.SoaMbox, r.SoaRefresh, r.SoaRetry, r.SoaExpire, r.SoaMinttl, r.TTL) // SoaSerial is not used in comparison
|
||||
}
|
||||
var allMaps []map[string]string
|
||||
for _, f := range d.extraValues {
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
{
|
||||
"type": "TXT",
|
||||
"name": "d",
|
||||
"target": "bonie",
|
||||
"target": "bonieclyde",
|
||||
"txtstrings": [
|
||||
"bonie",
|
||||
"clyde"
|
||||
|
@ -43,7 +43,7 @@
|
|||
{
|
||||
"type": "TXT",
|
||||
"name": "e",
|
||||
"target": "straw",
|
||||
"target": "strawwoodbrick",
|
||||
"txtstrings": [
|
||||
"straw",
|
||||
"wood",
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
{
|
||||
"type": "TXT",
|
||||
"name": "dkimtest2",
|
||||
"target": "this string is 255 bytes long.hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnKZogtjOlHoeY8iZ5o5brlPOsj/a2Q9Bopu1kHxlxrdw7tZVL9FzUMngiIYGrl8dbP7Rvk7TLMoxHxVkRZPBtIpsKIab/gOUoPLQVYbrAmzyguHYBwAApi3H/pvjUsK8+XF0dKY17AR96lokAPqvfBaUb+DSx8zNw2hrYWYVqvCtnxHUGEUhT1bTlEZBptH3j",
|
||||
"target": "this string is 255 bytes long.hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnKZogtjOlHoeY8iZ5o5brlPOsj/a2Q9Bopu1kHxlxrdw7tZVL9FzUMngiIYGrl8dbP7Rvk7TLMoxHxVkRZPBtIpsKIab/gOUoPLQVYbrAmzyguHYBwAApi3H/pvjUsK8+XF0dKY17AR96lokAPqvfBaUb+DSx8zNw2hrYWYVqvCtnxHUGEUhT1bTlEZBptH3jthis is the remainder. it is 156 bytes long.mOhl2JmbsFKy+RoMTwbkk0/meRvcEFWLHkr4MSgbnie6OpQvM4Y51+kO6DUVr3rwjrdVO9wpFt+n/hdQ92TNif17RMJtE5AGaQ6BN3yJQIDAQAB;",
|
||||
"txtstrings": [
|
||||
"this string is 255 bytes long.hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnKZogtjOlHoeY8iZ5o5brlPOsj/a2Q9Bopu1kHxlxrdw7tZVL9FzUMngiIYGrl8dbP7Rvk7TLMoxHxVkRZPBtIpsKIab/gOUoPLQVYbrAmzyguHYBwAApi3H/pvjUsK8+XF0dKY17AR96lokAPqvfBaUb+DSx8zNw2hrYWYVqvCtnxHUGEUhT1bTlEZBptH3j",
|
||||
"this is the remainder. it is 156 bytes long.mOhl2JmbsFKy+RoMTwbkk0/meRvcEFWLHkr4MSgbnie6OpQvM4Y51+kO6DUVr3rwjrdVO9wpFt+n/hdQ92TNif17RMJtE5AGaQ6BN3yJQIDAQAB;"
|
||||
|
|
|
@ -495,24 +495,24 @@ func (a *azurednsProvider) recordToNative(recordKey models.RecordKey, recordConf
|
|||
if recordSet.ARecords == nil {
|
||||
recordSet.ARecords = &[]adns.ARecord{}
|
||||
}
|
||||
*recordSet.ARecords = append(*recordSet.ARecords, adns.ARecord{Ipv4Address: to.StringPtr(rec.Target)})
|
||||
*recordSet.ARecords = append(*recordSet.ARecords, adns.ARecord{Ipv4Address: to.StringPtr(rec.GetTargetField())})
|
||||
case "AAAA":
|
||||
if recordSet.AaaaRecords == nil {
|
||||
recordSet.AaaaRecords = &[]adns.AaaaRecord{}
|
||||
}
|
||||
*recordSet.AaaaRecords = append(*recordSet.AaaaRecords, adns.AaaaRecord{Ipv6Address: to.StringPtr(rec.Target)})
|
||||
*recordSet.AaaaRecords = append(*recordSet.AaaaRecords, adns.AaaaRecord{Ipv6Address: to.StringPtr(rec.GetTargetField())})
|
||||
case "CNAME":
|
||||
recordSet.CnameRecord = &adns.CnameRecord{Cname: to.StringPtr(rec.Target)}
|
||||
recordSet.CnameRecord = &adns.CnameRecord{Cname: to.StringPtr(rec.GetTargetField())}
|
||||
case "NS":
|
||||
if recordSet.NsRecords == nil {
|
||||
recordSet.NsRecords = &[]adns.NsRecord{}
|
||||
}
|
||||
*recordSet.NsRecords = append(*recordSet.NsRecords, adns.NsRecord{Nsdname: to.StringPtr(rec.Target)})
|
||||
*recordSet.NsRecords = append(*recordSet.NsRecords, adns.NsRecord{Nsdname: to.StringPtr(rec.GetTargetField())})
|
||||
case "PTR":
|
||||
if recordSet.PtrRecords == nil {
|
||||
recordSet.PtrRecords = &[]adns.PtrRecord{}
|
||||
}
|
||||
*recordSet.PtrRecords = append(*recordSet.PtrRecords, adns.PtrRecord{Ptrdname: to.StringPtr(rec.Target)})
|
||||
*recordSet.PtrRecords = append(*recordSet.PtrRecords, adns.PtrRecord{Ptrdname: to.StringPtr(rec.GetTargetField())})
|
||||
case "TXT":
|
||||
if recordSet.TxtRecords == nil {
|
||||
recordSet.TxtRecords = &[]adns.TxtRecord{}
|
||||
|
@ -525,20 +525,20 @@ func (a *azurednsProvider) recordToNative(recordKey models.RecordKey, recordConf
|
|||
if recordSet.MxRecords == nil {
|
||||
recordSet.MxRecords = &[]adns.MxRecord{}
|
||||
}
|
||||
*recordSet.MxRecords = append(*recordSet.MxRecords, adns.MxRecord{Exchange: to.StringPtr(rec.Target), Preference: to.Int32Ptr(int32(rec.MxPreference))})
|
||||
*recordSet.MxRecords = append(*recordSet.MxRecords, adns.MxRecord{Exchange: to.StringPtr(rec.GetTargetField()), Preference: to.Int32Ptr(int32(rec.MxPreference))})
|
||||
case "SRV":
|
||||
if recordSet.SrvRecords == nil {
|
||||
recordSet.SrvRecords = &[]adns.SrvRecord{}
|
||||
}
|
||||
*recordSet.SrvRecords = append(*recordSet.SrvRecords, adns.SrvRecord{Target: to.StringPtr(rec.Target), Port: to.Int32Ptr(int32(rec.SrvPort)), Weight: to.Int32Ptr(int32(rec.SrvWeight)), Priority: to.Int32Ptr(int32(rec.SrvPriority))})
|
||||
*recordSet.SrvRecords = append(*recordSet.SrvRecords, adns.SrvRecord{Target: to.StringPtr(rec.GetTargetField()), Port: to.Int32Ptr(int32(rec.SrvPort)), Weight: to.Int32Ptr(int32(rec.SrvWeight)), Priority: to.Int32Ptr(int32(rec.SrvPriority))})
|
||||
case "CAA":
|
||||
if recordSet.CaaRecords == nil {
|
||||
recordSet.CaaRecords = &[]adns.CaaRecord{}
|
||||
}
|
||||
*recordSet.CaaRecords = append(*recordSet.CaaRecords, adns.CaaRecord{Value: to.StringPtr(rec.Target), Tag: to.StringPtr(rec.CaaTag), Flags: to.Int32Ptr(int32(rec.CaaFlag))})
|
||||
*recordSet.CaaRecords = append(*recordSet.CaaRecords, adns.CaaRecord{Value: to.StringPtr(rec.GetTargetField()), Tag: to.StringPtr(rec.CaaTag), Flags: to.Int32Ptr(int32(rec.CaaFlag))})
|
||||
case "AZURE_ALIAS_A", "AZURE_ALIAS_AAAA", "AZURE_ALIAS_CNAME":
|
||||
*recordSet.Type = rec.AzureAlias["type"]
|
||||
recordSet.TargetResource = &adns.SubResource{ID: to.StringPtr(rec.Target)}
|
||||
recordSet.TargetResource = &adns.SubResource{ID: to.StringPtr(rec.GetTargetField())}
|
||||
default:
|
||||
return nil, adns.A, fmt.Errorf("rc.String rtype %v unimplemented", recordKey.Type) // ands.A is a placeholder
|
||||
}
|
||||
|
|
|
@ -8,6 +8,11 @@ import (
|
|||
"github.com/StackExchange/dnscontrol/v3/models"
|
||||
)
|
||||
|
||||
func mkRC(target string, rec *models.RecordConfig) *models.RecordConfig {
|
||||
rec.SetTarget(target)
|
||||
return rec
|
||||
}
|
||||
|
||||
func Test_makeSoa(t *testing.T) {
|
||||
origin := "example.com"
|
||||
var tests = []struct {
|
||||
|
@ -20,58 +25,58 @@ func Test_makeSoa(t *testing.T) {
|
|||
{
|
||||
// If everything is blank, the hard-coded defaults should kick in.
|
||||
&SoaInfo{"", "", 0, 0, 0, 0, 0, models.DefaultTTL},
|
||||
&models.RecordConfig{Target: "", SoaMbox: "", SoaSerial: 0, SoaRefresh: 0, SoaRetry: 0, SoaExpire: 0, SoaMinttl: 0},
|
||||
&models.RecordConfig{Target: "", SoaMbox: "", SoaSerial: 0, SoaRefresh: 0, SoaRetry: 0, SoaExpire: 0, SoaMinttl: 0},
|
||||
&models.RecordConfig{Target: "DEFAULT_NOT_SET.", SoaMbox: "DEFAULT_NOT_SET.", SoaSerial: 1, SoaRefresh: 3600, SoaRetry: 600, SoaExpire: 604800, SoaMinttl: 1440},
|
||||
mkRC("", &models.RecordConfig{SoaMbox: "", SoaSerial: 0, SoaRefresh: 0, SoaRetry: 0, SoaExpire: 0, SoaMinttl: 0}),
|
||||
mkRC("", &models.RecordConfig{SoaMbox: "", SoaSerial: 0, SoaRefresh: 0, SoaRetry: 0, SoaExpire: 0, SoaMinttl: 0}),
|
||||
mkRC("DEFAULT_NOT_SET.", &models.RecordConfig{SoaMbox: "DEFAULT_NOT_SET.", SoaSerial: 1, SoaRefresh: 3600, SoaRetry: 600, SoaExpire: 604800, SoaMinttl: 1440}),
|
||||
2019022300,
|
||||
},
|
||||
{
|
||||
// If everything is filled, leave the desired values in place.
|
||||
&SoaInfo{"ns.example.com", "root.example.com", 1, 2, 3, 4, 5, models.DefaultTTL},
|
||||
&models.RecordConfig{Target: "a", SoaMbox: "aa", SoaSerial: 10, SoaRefresh: 11, SoaRetry: 12, SoaExpire: 13, SoaMinttl: 14},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "bb", SoaSerial: 15, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "bb", SoaSerial: 15, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19},
|
||||
mkRC("a", &models.RecordConfig{SoaMbox: "aa", SoaSerial: 10, SoaRefresh: 11, SoaRetry: 12, SoaExpire: 13, SoaMinttl: 14}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "bb", SoaSerial: 15, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "bb", SoaSerial: 15, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19}),
|
||||
2019022300,
|
||||
},
|
||||
{
|
||||
// Test incrementing serial.
|
||||
&SoaInfo{"ns.example.com", "root.example.com", 1, 2, 3, 4, 5, models.DefaultTTL},
|
||||
&models.RecordConfig{Target: "a", SoaMbox: "aa", SoaSerial: 2019022301, SoaRefresh: 11, SoaRetry: 12, SoaExpire: 13, SoaMinttl: 14},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "bb", SoaSerial: 0, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "bb", SoaSerial: 2019022301, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19},
|
||||
mkRC("a", &models.RecordConfig{SoaMbox: "aa", SoaSerial: 2019022301, SoaRefresh: 11, SoaRetry: 12, SoaExpire: 13, SoaMinttl: 14}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "bb", SoaSerial: 0, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "bb", SoaSerial: 2019022301, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19}),
|
||||
2019022302,
|
||||
},
|
||||
{
|
||||
// Test incrementing serial_2.
|
||||
&SoaInfo{"ns.example.com", "root.example.com", 1, 2, 3, 4, 5, models.DefaultTTL},
|
||||
&models.RecordConfig{Target: "a", SoaMbox: "aa", SoaSerial: 0, SoaRefresh: 11, SoaRetry: 12, SoaExpire: 13, SoaMinttl: 14},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "bb", SoaSerial: 2019022304, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "bb", SoaSerial: 2019022304, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19},
|
||||
mkRC("a", &models.RecordConfig{SoaMbox: "aa", SoaSerial: 0, SoaRefresh: 11, SoaRetry: 12, SoaExpire: 13, SoaMinttl: 14}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "bb", SoaSerial: 2019022304, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "bb", SoaSerial: 2019022304, SoaRefresh: 16, SoaRetry: 17, SoaExpire: 18, SoaMinttl: 19}),
|
||||
2019022305,
|
||||
},
|
||||
{
|
||||
// If there are gaps in existing or desired, fill in as appropriate.
|
||||
&SoaInfo{"ns.example.com", "root.example.com", 1, 2, 3, 4, 5, models.DefaultTTL},
|
||||
&models.RecordConfig{Target: "", SoaMbox: "aa", SoaSerial: 0, SoaRefresh: 11, SoaRetry: 0, SoaExpire: 13, SoaMinttl: 0},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "", SoaSerial: 15, SoaRefresh: 0, SoaRetry: 17, SoaExpire: 0, SoaMinttl: 19},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "aa", SoaSerial: 15, SoaRefresh: 11, SoaRetry: 17, SoaExpire: 13, SoaMinttl: 19},
|
||||
mkRC("", &models.RecordConfig{SoaMbox: "aa", SoaSerial: 0, SoaRefresh: 11, SoaRetry: 0, SoaExpire: 13, SoaMinttl: 0}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "", SoaSerial: 15, SoaRefresh: 0, SoaRetry: 17, SoaExpire: 0, SoaMinttl: 19}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "aa", SoaSerial: 15, SoaRefresh: 11, SoaRetry: 17, SoaExpire: 13, SoaMinttl: 19}),
|
||||
2019022300,
|
||||
},
|
||||
{
|
||||
// Gaps + existing==nil
|
||||
&SoaInfo{"ns.example.com", "root.example.com", 1, 2, 3, 4, 5, models.DefaultTTL},
|
||||
nil,
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "", SoaSerial: 15, SoaRefresh: 0, SoaRetry: 17, SoaExpire: 0, SoaMinttl: 19},
|
||||
&models.RecordConfig{Target: "b", SoaMbox: "root.example.com", SoaSerial: 15, SoaRefresh: 2, SoaRetry: 17, SoaExpire: 4, SoaMinttl: 19},
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "", SoaSerial: 15, SoaRefresh: 0, SoaRetry: 17, SoaExpire: 0, SoaMinttl: 19}),
|
||||
mkRC("b", &models.RecordConfig{SoaMbox: "root.example.com", SoaSerial: 15, SoaRefresh: 2, SoaRetry: 17, SoaExpire: 4, SoaMinttl: 19}),
|
||||
2019022300,
|
||||
},
|
||||
{
|
||||
// Gaps + desired==nil
|
||||
// NB(tom): In the code as of 2020-02-23, desired will never be nil.
|
||||
&SoaInfo{"ns.example.com", "root.example.com", 1, 2, 3, 4, 5, models.DefaultTTL},
|
||||
&models.RecordConfig{Target: "", SoaMbox: "aa", SoaSerial: 0, SoaRefresh: 11, SoaRetry: 0, SoaExpire: 13, SoaMinttl: 0},
|
||||
mkRC("", &models.RecordConfig{SoaMbox: "aa", SoaSerial: 0, SoaRefresh: 11, SoaRetry: 0, SoaExpire: 13, SoaMinttl: 0}),
|
||||
nil,
|
||||
&models.RecordConfig{Target: "ns.example.com", SoaMbox: "aa", SoaSerial: 1, SoaRefresh: 11, SoaRetry: 3, SoaExpire: 13, SoaMinttl: 5},
|
||||
mkRC("ns.example.com", &models.RecordConfig{SoaMbox: "aa", SoaSerial: 1, SoaRefresh: 11, SoaRetry: 3, SoaExpire: 13, SoaMinttl: 5}),
|
||||
2019022300,
|
||||
},
|
||||
}
|
||||
|
@ -115,8 +120,8 @@ func areEqualSoa(r1, r2 *models.RecordConfig) bool {
|
|||
fmt.Printf("ERROR: name %q != %q\n", r1.Name, r2.Name)
|
||||
return false
|
||||
}
|
||||
if r1.Target != r2.Target {
|
||||
fmt.Printf("ERROR: target %q != %q\n", r1.Target, r2.Target)
|
||||
if r1.GetTargetField() != r2.GetTargetField() {
|
||||
fmt.Printf("ERROR: target %q != %q\n", r1, r2.GetTargetField())
|
||||
return false
|
||||
}
|
||||
if r1.SoaMbox != r2.SoaMbox {
|
||||
|
|
|
@ -277,7 +277,7 @@ func toReq(rc *models.RecordConfig) (requestParams, error) {
|
|||
case "CAA":
|
||||
req["caa_flag"] = strconv.Itoa(int(rc.CaaFlag))
|
||||
req["caa_type"] = rc.CaaTag
|
||||
req["caa_value"] = rc.Target
|
||||
req["caa_value"] = rc.GetTargetField()
|
||||
case "TLSA":
|
||||
req["tlsa_usage"] = strconv.Itoa(int(rc.TlsaUsage))
|
||||
req["tlsa_selector"] = strconv.Itoa(int(rc.TlsaSelector))
|
||||
|
|
|
@ -162,7 +162,7 @@ func (c *exoscaleProvider) createRecordFunc(rc *models.RecordConfig, domainName
|
|||
name := rc.GetLabel()
|
||||
|
||||
if rc.Type == "MX" {
|
||||
target = rc.Target
|
||||
target = rc.GetTargetField()
|
||||
}
|
||||
|
||||
if rc.Type == "NS" && (name == "@" || name == "") {
|
||||
|
@ -210,7 +210,7 @@ func (c *exoscaleProvider) updateRecordFunc(old *egoscale.DNSRecord, rc *models.
|
|||
name := rc.GetLabel()
|
||||
|
||||
if rc.Type == "MX" {
|
||||
target = rc.Target
|
||||
target = rc.GetTargetField()
|
||||
}
|
||||
|
||||
if rc.Type == "NS" && (name == "@" || name == "") {
|
||||
|
|
|
@ -297,7 +297,10 @@ func (c *hednsProvider) GetZoneRecords(domain string) (models.Records, error) {
|
|||
RecordName: parser.parseStringElement(element.Find(".dns_view")),
|
||||
RecordID: parser.parseIntAttr(element, "id"),
|
||||
},
|
||||
Target: parser.parseStringAttr(element.Find("td:nth-child(7)"), "data"),
|
||||
}
|
||||
data := parser.parseStringAttr(element.Find("td:nth-child(7)"), "data")
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
priority := parser.parseIntElement(element.Find("td:nth-child(6)"))
|
||||
|
@ -313,24 +316,20 @@ func (c *hednsProvider) GetZoneRecords(domain string) (models.Records, error) {
|
|||
|
||||
rc.SetLabelFromFQDN(rc.Original.(Record).RecordName, domain)
|
||||
|
||||
// dns.he.net omits the trailing "." on the hostnames for certain MX records
|
||||
if rc.Type == "MX" {
|
||||
rc.Target += "."
|
||||
}
|
||||
|
||||
switch rc.Type {
|
||||
case "ALIAS":
|
||||
err = rc.SetTarget(rc.Target)
|
||||
err = rc.SetTarget(data)
|
||||
case "MX":
|
||||
err = rc.SetTargetMX(uint16(priority), rc.Target)
|
||||
// dns.he.net omits the trailing "." on the hostnames for MX records
|
||||
err = rc.SetTargetMX(uint16(priority), data + ".")
|
||||
case "SRV":
|
||||
err = rc.SetTargetSRVPriorityString(uint16(priority), rc.Target)
|
||||
err = rc.SetTargetSRVPriorityString(uint16(priority), data)
|
||||
case "SPF":
|
||||
// Convert to TXT record as SPF is deprecated
|
||||
rc.Type = "TXT"
|
||||
fallthrough
|
||||
default:
|
||||
err = rc.PopulateFromString(rc.Type, rc.Target, domain)
|
||||
err = rc.PopulateFromString(rc.Type, data, domain)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
@ -562,10 +561,10 @@ func (c *hednsProvider) editZoneRecord(rc *models.RecordConfig, create bool) err
|
|||
switch rc.Type {
|
||||
case "MX":
|
||||
values.Set("Priority", strconv.FormatUint(uint64(rc.MxPreference), 10))
|
||||
values.Set("Content", rc.Target)
|
||||
values.Set("Content", rc.GetTargetField())
|
||||
case "SRV":
|
||||
values.Del("Content")
|
||||
values.Set("Target", rc.Target)
|
||||
values.Set("Target", rc.GetTargetField())
|
||||
values.Set("Priority", strconv.FormatUint(uint64(rc.SrvPriority), 10))
|
||||
values.Set("Weight", strconv.FormatUint(uint64(rc.SrvWeight), 10))
|
||||
values.Set("Port", strconv.FormatUint(uint64(rc.SrvPort), 10))
|
||||
|
|
|
@ -245,7 +245,7 @@ func (n *HXClient) createRecordString(rc *models.RecordConfig, domain string) (s
|
|||
case "A", "AAAA", "ANAME", "CNAME", "MX", "NS", "PTR":
|
||||
// nothing
|
||||
case "TLSA":
|
||||
record.Answer = fmt.Sprintf(`%v %v %v %s`, rc.TlsaUsage, rc.TlsaSelector, rc.TlsaMatchingType, rc.Target)
|
||||
record.Answer = fmt.Sprintf(`%v %v %v %s`, rc.TlsaUsage, rc.TlsaSelector, rc.TlsaMatchingType, rc.GetTargetField())
|
||||
case "CAA":
|
||||
record.Answer = fmt.Sprintf(`%v %s "%s"`, rc.CaaFlag, rc.CaaTag, record.Answer)
|
||||
case "TXT":
|
||||
|
|
|
@ -112,28 +112,28 @@ func Test_generatePSZoneDump(t *testing.T) {
|
|||
func Test_generatePSModify(t *testing.T) {
|
||||
|
||||
recA1 := &models.RecordConfig{
|
||||
Type: "A",
|
||||
Name: "@",
|
||||
Target: "1.2.3.4",
|
||||
Type: "A",
|
||||
Name: "@",
|
||||
}
|
||||
recA1.SetTarget("1.2.3.4")
|
||||
recA2 := &models.RecordConfig{
|
||||
Type: "A",
|
||||
Name: "@",
|
||||
Target: "10.20.30.40",
|
||||
Type: "A",
|
||||
Name: "@",
|
||||
}
|
||||
recA2.SetTarget("10.20.30.40")
|
||||
|
||||
recMX1 := &models.RecordConfig{
|
||||
Type: "MX",
|
||||
Name: "@",
|
||||
Target: "foo.com.",
|
||||
MxPreference: 5,
|
||||
}
|
||||
recMX1.SetTarget("foo.com.")
|
||||
recMX2 := &models.RecordConfig{
|
||||
Type: "MX",
|
||||
Name: "@",
|
||||
Target: "foo2.com.",
|
||||
MxPreference: 50,
|
||||
}
|
||||
recMX2.SetTarget("foo2.com.")
|
||||
|
||||
type args struct {
|
||||
domain string
|
||||
|
|
|
@ -132,7 +132,7 @@ func fromRecordConfig(in *models.RecordConfig) *record {
|
|||
rc.Destination = strings.TrimSuffix(in.GetTargetField(), ".")
|
||||
rc.Priority = strconv.Itoa(int(in.MxPreference))
|
||||
case "SRV":
|
||||
rc.Destination = strconv.Itoa(int(in.SrvPriority)) + " " + strconv.Itoa(int(in.SrvWeight)) + " " + strconv.Itoa(int(in.SrvPort)) + " " + in.Target
|
||||
rc.Destination = strconv.Itoa(int(in.SrvPriority)) + " " + strconv.Itoa(int(in.SrvWeight)) + " " + strconv.Itoa(int(in.SrvPort)) + " " + in.GetTargetField()
|
||||
case "CAA":
|
||||
rc.Destination = strconv.Itoa(int(in.CaaFlag)) + " " + in.CaaTag + " \"" + in.GetTargetField() + "\""
|
||||
case "TLSA":
|
||||
|
|
|
@ -18,10 +18,10 @@ import (
|
|||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"unicode"
|
||||
|
||||
testifyrequire "github.com/stretchr/testify/require"
|
||||
"github.com/tdewolff/minify"
|
||||
minjson "github.com/tdewolff/minify/json"
|
||||
)
|
||||
|
@ -180,11 +180,8 @@ func TestYamlRead(t *testing.T) {
|
|||
//fmt.Printf("DEBUG: EXPECTED=%s\n", string(expectedJSON))
|
||||
//fmt.Printf("DEBUG: ACTUAL =%s\n", string(actualJSON))
|
||||
|
||||
if strings.TrimSpace(string(expectedJSON)) != strings.TrimSpace(string(actualJSON)) {
|
||||
t.Error("Expected and actual json don't match")
|
||||
t.Log("Expected:", string(expectedJSON))
|
||||
t.Log("Actual :", string(actualJSON))
|
||||
}
|
||||
es, as := string(expectedJSON), string(actualJSON)
|
||||
testifyrequire.JSONEqf(t, es, as, "EXPECTING %q = \n```\n%s\n```", expectedFile, as)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue