Skip to content

vultr: Modernize record conversion - #4583

Merged
TomOnTime merged 7 commits into
release_candidate_v5from
mod_vultr
Jul 27, 2026
Merged

vultr: Modernize record conversion#4583
TomOnTime merged 7 commits into
release_candidate_v5from
mod_vultr

Conversation

@TomOnTime

Copy link
Copy Markdown
Collaborator

Dear @pgaskin. I could use your help. I'm doing upgrades to the code base and I have no way to test your provider. Please run the integration test and let me know the result. How to run integration tests is here: https://docs.dnscontrol.org/developer-info/integration-tests

Summary

  • replace legacy RecordConfig construction and target setters with record factories
  • pass the domain configuration into Vultr record conversion
  • preserve the existing IDNA, quoting, and round-trip behavior

Testing

  • ../../bin/is_modern.sh (Steps 1-7 clean)
  • go test ./providers/vultr
  • bin/generate-all.sh
  • go test ./...

@TomOnTime
TomOnTime requested a review from pgaskin July 22, 2026 17:36
@TomOnTime
TomOnTime marked this pull request as ready for review July 23, 2026 04:26
@pgaskin

pgaskin commented Jul 24, 2026

Copy link
Copy Markdown
Member

I've been a little busy recently, but I'll review this on Saturday.

@TomOnTime

Copy link
Copy Markdown
Collaborator Author

Sounds good! I've added some TODO comments with suggestions. Please try them one at a time and let me know which works best.

Thanks!

@pgaskin

pgaskin commented Jul 26, 2026

Copy link
Copy Markdown
Member

Integration tests as of 7d60892:

Details
=== RUN   TestDNSProviders
Testing Profile="VULTR" (TYPE="VULTR")
=== RUN   TestDNSProviders/example-dnscontrol.com
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/00:A:Create_A
=== RUN   TestDNSProviders/example-dnscontrol.com/00:A:Change_A_target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#01
=== RUN   TestDNSProviders/example-dnscontrol.com/01:Apex:Create_A
=== RUN   TestDNSProviders/example-dnscontrol.com/01:Apex:Change_A_target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#02
=== RUN   TestDNSProviders/example-dnscontrol.com/02:Protocol-Wildcard:Create_wildcard
=== RUN   TestDNSProviders/example-dnscontrol.com/02:Protocol-Wildcard:Delete_wildcard
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#03
=== RUN   TestDNSProviders/example-dnscontrol.com/03:AAAA:Create_AAAA
=== RUN   TestDNSProviders/example-dnscontrol.com/03:AAAA:Change_AAAA_target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#04
=== RUN   TestDNSProviders/example-dnscontrol.com/04:CNAME:Create_a_CNAME
=== RUN   TestDNSProviders/example-dnscontrol.com/04:CNAME:Change_CNAME_target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#05
=== RUN   TestDNSProviders/example-dnscontrol.com/05:CNAME-short:Create_a_CNAME
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#06
=== RUN   TestDNSProviders/example-dnscontrol.com/06:MX:Create_MX_apex
=== RUN   TestDNSProviders/example-dnscontrol.com/06:MX:Change_MX_apex
=== RUN   TestDNSProviders/example-dnscontrol.com/06:MX:Create_MX
=== RUN   TestDNSProviders/example-dnscontrol.com/06:MX:Change_MX_target
=== RUN   TestDNSProviders/example-dnscontrol.com/06:MX:Change_MX_p
=== RUN   TestDNSProviders/example-dnscontrol.com/07:RP_***SKIPPED(CanUseRP_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/08:RP_***SKIPPED(CanUseRP_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#07
=== RUN   TestDNSProviders/example-dnscontrol.com/09:TXT:Create_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/09:TXT:Change_TXT_target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#08
=== RUN   TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:CreateManyAtLabel
=== RUN   TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Create_an_A_record
=== RUN   TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Add_at_label1
=== RUN   TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Add_at_label2
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#09
=== RUN   TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:CreateManyTypesAtLabel
=== RUN   TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Create_an_A_record
=== RUN   TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Add_Type_At_Label
=== RUN   TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Add_Type_At_Label#01
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#10
=== RUN   TestDNSProviders/example-dnscontrol.com/12:Attl:Create_Arc
=== RUN   TestDNSProviders/example-dnscontrol.com/12:Attl:Change_TTL
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#11
=== RUN   TestDNSProviders/example-dnscontrol.com/13:TTL:Start
=== RUN   TestDNSProviders/example-dnscontrol.com/13:TTL:Change_a_ttl
=== RUN   TestDNSProviders/example-dnscontrol.com/13:TTL:Change_single_target_from_set
=== RUN   TestDNSProviders/example-dnscontrol.com/13:TTL:Change_all_ttls
    helpers_integration_test.go:255: {"error":"Unable to update record: The new record's TTL (400) must match the TTL of existing records (300)","status":400}
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#12
=== RUN   TestDNSProviders/example-dnscontrol.com/14:add_to_label_and_change_orig_ttl:Setup
=== RUN   TestDNSProviders/example-dnscontrol.com/14:add_to_label_and_change_orig_ttl:Add_at_same_label,_new_ttl
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#13
=== RUN   TestDNSProviders/example-dnscontrol.com/15:TypeChange:Create_A
=== RUN   TestDNSProviders/example-dnscontrol.com/15:TypeChange:Change_to_MX
=== RUN   TestDNSProviders/example-dnscontrol.com/15:TypeChange:Change_back_to_A
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#14
=== RUN   TestDNSProviders/example-dnscontrol.com/16:TypeChangeHard:Create_a_CNAME
=== RUN   TestDNSProviders/example-dnscontrol.com/16:TypeChangeHard:Change_to_A_record
=== RUN   TestDNSProviders/example-dnscontrol.com/16:TypeChangeHard:Change_back_to_CNAME
=== RUN   TestDNSProviders/example-dnscontrol.com/17:HTTPS_***SKIPPED(CanUseHTTPS_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/18:HTTPS-Ech_***SKIPPED(CanUseHTTPS_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/19:SVCB_***SKIPPED(CanUseSVCB_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/20:SVCB-Ech_***SKIPPED(CanUseSVCB_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#15
=== RUN   TestDNSProviders/example-dnscontrol.com/21:CNAME:Record_pointing_to_@
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#16
=== RUN   TestDNSProviders/example-dnscontrol.com/22:ApexMX:Record_pointing_to_@
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#17
=== RUN   TestDNSProviders/example-dnscontrol.com/23:NullMX:create
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[mx has null target]' ::"23:NullMX")
=== RUN   TestDNSProviders/example-dnscontrol.com/23:NullMX:unnull
=== RUN   TestDNSProviders/example-dnscontrol.com/23:NullMX:renull
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[mx has null target]' ::"23:NullMX")
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#18
=== RUN   TestDNSProviders/example-dnscontrol.com/24:NullMXApex:create
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[mx has null target]' ::"24:NullMXApex")
=== RUN   TestDNSProviders/example-dnscontrol.com/24:NullMXApex:unnull
=== RUN   TestDNSProviders/example-dnscontrol.com/24:NullMXApex:renull
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[mx has null target]' ::"24:NullMXApex")
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#19
=== RUN   TestDNSProviders/example-dnscontrol.com/25:NS:NS_for_subdomain
=== RUN   TestDNSProviders/example-dnscontrol.com/25:NS:Dual_NS_for_subdomain
=== RUN   TestDNSProviders/example-dnscontrol.com/25:NS:NS_Record_pointing_to_@
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#20
=== RUN   TestDNSProviders/example-dnscontrol.com/26:NS_only_APEX:Single_NS_at_apex
=== RUN   TestDNSProviders/example-dnscontrol.com/26:NS_only_APEX:Dual_NS_at_apex
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#21
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_0-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_254-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_255-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_256-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_509-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_510-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_511-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_764-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_765-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_766-byte_TXT
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_single-quote
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_backtick
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_dq-1interior
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring contains doublequotes]' ::"27:complex TXT")
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_2_dq-2interior
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring contains doublequotes]' ::"27:complex TXT")
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_dq-left
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring contains doublequotes]' ::"27:complex TXT")
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_dq-right
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[txtstring contains doublequotes]' ::"27:complex TXT")
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_semicolon
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_semicolon_ws
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_interior_ws
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_trailing_ws
=== RUN   TestDNSProviders/example-dnscontrol.com/27:complex_TXT:Create_a_TXT/SPF
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#22
=== RUN   TestDNSProviders/example-dnscontrol.com/28:TXT_backslashes:TXT_with_backslashs
    helpers_integration_test.go:272: Expected 0 corrections on second run, but found 4.
    helpers_integration_test.go:274: UNEXPECTED #0: ± MODIFY fooosbs1.example-dnscontrol.com TXT ("1backslash" ttl=300) -> ("1back\\slash" ttl=300); Vultr RecordID: 12105ec5-0d4c-462d-8f17-4c3e35a9484e
    helpers_integration_test.go:274: UNEXPECTED #1: ± MODIFY fooosbs2.example-dnscontrol.com TXT ("2back\\slash" ttl=300) -> ("2back\\\\slash" ttl=300); Vultr RecordID: acac92a3-e06d-47c6-b111-7754be4a3a51
    helpers_integration_test.go:274: UNEXPECTED #2: ± MODIFY fooosbs3.example-dnscontrol.com TXT ("3back\\slash" ttl=300) -> ("3back\\\\\\slash" ttl=300); Vultr RecordID: e2fff166-7e1b-454f-a03f-48abce0c6a57
    helpers_integration_test.go:274: UNEXPECTED #3: ± MODIFY fooosbs4.example-dnscontrol.com TXT ("4back\\\\slash" ttl=300) -> ("4back\\\\\\\\slash" ttl=300); Vultr RecordID: f4acfc7e-9168-42ad-a635-4c086fd8731f
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#23
=== RUN   TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Create_CAPS
=== RUN   TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Downcase_label
=== RUN   TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Downcase_target
=== RUN   TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Upcase_both
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#24
=== RUN   TestDNSProviders/example-dnscontrol.com/30:testByLabel:initial
=== RUN   TestDNSProviders/example-dnscontrol.com/30:testByLabel:changeOne
=== RUN   TestDNSProviders/example-dnscontrol.com/30:testByLabel:deleteOne
=== RUN   TestDNSProviders/example-dnscontrol.com/30:testByLabel:addOne
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#25
=== RUN   TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:initial
=== RUN   TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:changeOne
=== RUN   TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:deleteOne
=== RUN   TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:addOne
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#26
=== RUN   TestDNSProviders/example-dnscontrol.com/32:IDNA:Internationalized_name
=== RUN   TestDNSProviders/example-dnscontrol.com/32:IDNA:Change_IDN
=== RUN   TestDNSProviders/example-dnscontrol.com/32:IDNA:Chinese_label
=== RUN   TestDNSProviders/example-dnscontrol.com/32:IDNA:Internationalized_CNAME_Target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#27
=== RUN   TestDNSProviders/example-dnscontrol.com/33:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#28
=== RUN   TestDNSProviders/example-dnscontrol.com/34:pager101:99_records
=== RUN   TestDNSProviders/example-dnscontrol.com/34:pager101:100_records
=== RUN   TestDNSProviders/example-dnscontrol.com/34:pager101:101_records
=== RUN   TestDNSProviders/example-dnscontrol.com/35:pager601_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/36:pager1201_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/37:batchRecordswithOthers_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#29
=== RUN   TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_record
=== RUN   TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_change_tag
=== RUN   TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_change_target
=== RUN   TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_change_flag
=== RUN   TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_many_records
=== RUN   TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_whitespace
    helpers_integration_test.go:225: ***SKIPPED(PROVIDER DOES NOT SUPPORT '[caa target contains whitespace]' ::"38:CAA")
=== RUN   TestDNSProviders/example-dnscontrol.com/39:LOC_***SKIPPED(CanUseLOC_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/40:NAPTR_***SKIPPED(CanUseNAPTR_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/41:PTR_***SKIPPED(CanUsePTR_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/42:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#30
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:SRV_record
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Second_SRV_record,_same_prio
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:3_SRV
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Delete_one
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Target
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Priority
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Weight
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Port
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/43:SRV:Null_Target
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#31
=== RUN   TestDNSProviders/example-dnscontrol.com/44:SRV:Create_SRV333
=== RUN   TestDNSProviders/example-dnscontrol.com/44:SRV:Change_TTL999
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#32
=== RUN   TestDNSProviders/example-dnscontrol.com/45:SSHFP:SSHFP_record
=== RUN   TestDNSProviders/example-dnscontrol.com/45:SSHFP:SSHFP_change_algorithm
=== RUN   TestDNSProviders/example-dnscontrol.com/45:SSHFP:SSHFP_change_fingerprint_and_type
=== RUN   TestDNSProviders/example-dnscontrol.com/46:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/47:DS_***SKIPPED(CanUseDS_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/48:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/49:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/50:DHCID_***SKIPPED(CanUseDHCID_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/51:DNAME_***SKIPPED(CanUseDNAME_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/52:DNSKEY_***SKIPPED(CanUseDNSKEY_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/53:ALIAS_on_apex_***SKIPPED(CanUseAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/54:ALIAS_to_nonfqdn_***SKIPPED(CanUseAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/55:ALIAS_on_subdomain_***SKIPPED(CanUseAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/56:AZURE_ALIAS_A_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/57:AZURE_ALIAS_CNAME_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/58:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/59:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/60:R53_ALIAS_CNAME_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/61:R53_ALIAS_Loop_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/62:R53_alias_pre-existing_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/63:R53_alias_evaluate_target_health_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/64:R53_B3493_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/65:R53_B3493_REV_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/66:R53_WEIGHT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/67:R53_WEIGHT_CNAME_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/68:R53_WEIGHT_MIXED_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/69:TENCENTDNS_LINE_WEIGHT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/70:CLOUDFLAREAPI_SINGLE_REDIRECT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/71:CF_PROXY_A_create_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/72:CF_PROXY_A_off_to_on_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/73:CF_PROXY_A_on_to_off_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/74:CF_PROXY_CNAME_create_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/75:CF_PROXY_CNAME_off_to_on_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/76:CF_PROXY_CNAME_on_to_off_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/77:CF_CNAME_FLATTEN_create_***SKIPPED(excluded_by_alltrue([false]))***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/78:CF_CNAME_FLATTEN_off_to_on_***SKIPPED(excluded_by_alltrue([false]))***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/79:CF_CNAME_FLATTEN_on_to_off_***SKIPPED(excluded_by_alltrue([false]))***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/80:CF_COMMENT_create_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/81:CF_TAGS_create_***SKIPPED(excluded_by_alltrue([false]))***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/82:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/83:ADGUARDHOME_A_PASSTHROUGH_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/84:ADGUARDHOME_AAAA_PASSTHROUGH_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/85:MIKROTIK_FWD_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/86:MIKROTIK_NXDOMAIN_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/87:MIKROTIK_METADATA_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/88:VERCEL_CAA_whitespace_-_cansignhttpexchanges_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#33
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label,type
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#01
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label,type,target
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#02
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_type
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#03
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_type,target
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#04
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_target
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#05
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_manytypes
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#06
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label,type,target=*
=== RUN   TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#07
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#34
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_label
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_label,type
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#01
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_label,type,target
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#02
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_type
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#03
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_type,target
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#04
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_target
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#05
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_manytypes
=== RUN   TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#06
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#35
=== RUN   TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:ignore_unsafe_apex
=== RUN   TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:ignore_unsafe_label
=== RUN   TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:VERIFY_PREVIOUS#01
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#36
=== RUN   TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:ignore_label=foo.*
=== RUN   TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:ignore_label=foo.bat,type
=== RUN   TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:VERIFY_PREVIOUS#01
=== RUN   TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:ignore_target=*.domain
=== RUN   TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:VERIFY_PREVIOUS#02
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#37
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByZone
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByLabel
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS#01
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByRecordSet
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS#02
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByRecord
=== RUN   TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS#03
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#38
=== RUN   TestDNSProviders/example-dnscontrol.com/94:IGNORE_TARGET_b2285:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/94:IGNORE_TARGET_b2285:Add_a_new_record_-_ignoring_test.foo.com.
=== RUN   TestDNSProviders/example-dnscontrol.com/94:IGNORE_TARGET_b2285:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#39
=== RUN   TestDNSProviders/example-dnscontrol.com/95:IGNORE_everything_b2822:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/95:IGNORE_everything_b2822:ignore_them_all
=== RUN   TestDNSProviders/example-dnscontrol.com/95:IGNORE_everything_b2822:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#40
=== RUN   TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:Create_some_records
=== RUN   TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:ignore
=== RUN   TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:VERIFY_PREVIOUS
=== RUN   TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:Verify_nothing_changed
=== RUN   TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:VERIFY_PREVIOUS#01
=== RUN   TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:ignore_with_change
=== RUN   TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:VERIFY_PREVIOUS#02
=== RUN   TestDNSProviders/example-dnscontrol.com/97:structured_TXT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/98:structured_TXT_as_native_records_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/99:CLOUDNS_geodns_tests_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/100:PORKBUN_url_forwarding_tests_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/101:GCORE_metadata_tests_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/102:NAMECHEAP_url_redirect_records_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/103:OPENPGPKEY_***SKIPPED(CanUseOPENPGPKEY_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/104:SMIMEA_***SKIPPED(CanUseSMIMEA_not_supported)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/105:Bunny_DNS_Pull_Zone_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/106:HEDNS_DYNAMIC_A_lifecycle_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/107:HEDNS_DYNAMIC_AAAA+TXT_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/108:HEDNS_DDNS_KEY_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/109:HEDNS_DYNAMIC_mixed_records_***SKIPPED(disabled_by_only)***:Empty
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#41
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#42
=== RUN   TestDNSProviders/example-dnscontrol.com/111:final:final
=== RUN   TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#43
=== RUN   TestDNSProviders/example-dnscontrol.com/112:final:final
--- FAIL: TestDNSProviders (167.86s)
    --- FAIL: TestDNSProviders/example-dnscontrol.com (167.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty (0.95s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/00:A:Create_A (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/00:A:Change_A_target (0.58s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#01 (0.45s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/01:Apex:Create_A (0.68s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/01:Apex:Change_A_target (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#02 (0.42s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/02:Protocol-Wildcard:Create_wildcard (0.89s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/02:Protocol-Wildcard:Delete_wildcard (0.55s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#03 (0.38s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/03:AAAA:Create_AAAA (0.59s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/03:AAAA:Change_AAAA_target (0.57s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#04 (0.42s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/04:CNAME:Create_a_CNAME (0.59s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/04:CNAME:Change_CNAME_target (0.56s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#05 (0.37s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/05:CNAME-short:Create_a_CNAME (0.80s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#06 (0.64s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/06:MX:Create_MX_apex (0.55s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/06:MX:Change_MX_apex (0.55s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/06:MX:Create_MX (0.75s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/06:MX:Change_MX_target (0.63s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/06:MX:Change_MX_p (0.52s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/07:RP_***SKIPPED(CanUseRP_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/08:RP_***SKIPPED(CanUseRP_not_supported)***:Empty (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#07 (0.37s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/09:TXT:Create_TXT (0.59s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/09:TXT:Change_TXT_target (0.62s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#08 (0.38s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:CreateManyAtLabel (0.94s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Empty (0.81s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Create_an_A_record (0.68s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Add_at_label1 (0.56s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/10:ManyAtOnce:Add_at_label2 (0.57s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#09 (0.89s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:CreateManyTypesAtLabel (0.95s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Empty (0.79s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Create_an_A_record (0.56s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Add_Type_At_Label (0.69s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/11:manyTypesAtOnce:Add_Type_At_Label#01 (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#10 (0.78s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/12:Attl:Create_Arc (0.60s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/12:Attl:Change_TTL (0.52s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#11 (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/13:TTL:Start (0.95s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/13:TTL:Change_a_ttl (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/13:TTL:Change_single_target_from_set (0.54s)
        --- FAIL: TestDNSProviders/example-dnscontrol.com/13:TTL:Change_all_ttls (0.55s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#12 (0.83s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/14:add_to_label_and_change_orig_ttl:Setup (0.62s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/14:add_to_label_and_change_orig_ttl:Add_at_same_label,_new_ttl (0.69s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#13 (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/15:TypeChange:Create_A (0.52s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/15:TypeChange:Change_to_MX (0.68s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/15:TypeChange:Change_back_to_A (0.77s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#14 (0.38s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/16:TypeChangeHard:Create_a_CNAME (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/16:TypeChangeHard:Change_to_A_record (0.73s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/16:TypeChangeHard:Change_back_to_CNAME (0.78s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/17:HTTPS_***SKIPPED(CanUseHTTPS_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/18:HTTPS-Ech_***SKIPPED(CanUseHTTPS_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/19:SVCB_***SKIPPED(CanUseSVCB_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/20:SVCB-Ech_***SKIPPED(CanUseSVCB_not_supported)***:Empty (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#15 (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/21:CNAME:Record_pointing_to_@ (0.66s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#16 (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/22:ApexMX:Record_pointing_to_@ (0.72s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#17 (0.65s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/23:NullMX:create (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/23:NullMX:unnull (1.27s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/23:NullMX:renull (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#18 (0.95s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/24:NullMXApex:create (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/24:NullMXApex:unnull (1.04s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/24:NullMXApex:renull (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#19 (0.91s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/25:NS:NS_for_subdomain (0.64s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/25:NS:Dual_NS_for_subdomain (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/25:NS:NS_Record_pointing_to_@ (1.08s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#20 (0.68s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/26:NS_only_APEX:Single_NS_at_apex (0.60s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/26:NS_only_APEX:Dual_NS_at_apex (0.58s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#21 (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_0-byte_TXT (0.55s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_254-byte_TXT (0.75s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_255-byte_TXT (0.67s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_256-byte_TXT (0.78s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_509-byte_TXT (0.68s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_510-byte_TXT (0.69s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_511-byte_TXT (0.74s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_764-byte_TXT (0.73s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_765-byte_TXT (0.81s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:a_766-byte_TXT (0.68s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_single-quote (0.74s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_backtick (0.72s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_dq-1interior (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_2_dq-2interior (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_dq-left (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_1_dq-right (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_semicolon (0.67s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_with_semicolon_ws (0.72s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_interior_ws (0.82s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:TXT_trailing_ws (0.71s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/27:complex_TXT:Create_a_TXT/SPF (0.70s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#22 (0.34s)
        --- FAIL: TestDNSProviders/example-dnscontrol.com/28:TXT_backslashes:TXT_with_backslashs (1.13s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#23 (0.87s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Create_CAPS (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Downcase_label (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Downcase_target (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/29:Case_Sensitivity:Upcase_both (0.51s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#24 (0.52s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/30:testByLabel:initial (0.70s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/30:testByLabel:changeOne (0.49s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/30:testByLabel:deleteOne (0.52s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/30:testByLabel:addOne (0.48s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#25 (0.52s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:initial (1.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:changeOne (0.48s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:deleteOne (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/31:testByRecordSet:addOne (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#26 (1.09s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/32:IDNA:Internationalized_name (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/32:IDNA:Change_IDN (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/32:IDNA:Chinese_label (0.76s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/32:IDNA:Internationalized_CNAME_Target (0.78s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#27 (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/33:IDNAs_in_CNAME_targets:IDN_CNAME_AND_Target (0.48s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#28 (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/34:pager101:99_records (19.18s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/34:pager101:100_records (0.85s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/34:pager101:101_records (0.98s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/35:pager601_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/36:pager1201_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/37:batchRecordswithOthers_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#29 (19.99s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_record (0.49s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_change_tag (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_change_target (0.51s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_change_flag (0.47s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_many_records (0.59s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/38:CAA:CAA_whitespace (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/39:LOC_***SKIPPED(CanUseLOC_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/40:NAPTR_***SKIPPED(CanUseNAPTR_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/41:PTR_***SKIPPED(CanUsePTR_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/42:SOA_***SKIPPED(CanUseSOA_not_supported)***:Empty (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#30 (0.38s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:SRV_record (0.52s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Second_SRV_record,_same_prio (0.48s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:3_SRV (0.60s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Delete_one (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Target (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Priority (0.49s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Weight (0.49s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Change_Port (0.55s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Empty (0.64s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/43:SRV:Null_Target (0.50s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#31 (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/44:SRV:Create_SRV333 (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/44:SRV:Change_TTL999 (0.62s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#32 (0.36s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/45:SSHFP:SSHFP_record (0.51s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/45:SSHFP:SSHFP_change_algorithm (0.49s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/45:SSHFP:SSHFP_change_fingerprint_and_type (0.51s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/46:TLSA_***SKIPPED(CanUseTLSA_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/47:DS_***SKIPPED(CanUseDS_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/48:DS_(children_only)_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/49:DS_(children_only)_CLOUDNS_***SKIPPED(CanUseDSForChildren_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/50:DHCID_***SKIPPED(CanUseDHCID_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/51:DNAME_***SKIPPED(CanUseDNAME_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/52:DNSKEY_***SKIPPED(CanUseDNSKEY_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/53:ALIAS_on_apex_***SKIPPED(CanUseAlias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/54:ALIAS_to_nonfqdn_***SKIPPED(CanUseAlias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/55:ALIAS_on_subdomain_***SKIPPED(CanUseAlias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/56:AZURE_ALIAS_A_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/57:AZURE_ALIAS_CNAME_***SKIPPED(CanUseAzureAlias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/58:R53_ALIAS2_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/59:R53_ALIAS_ORDER_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/60:R53_ALIAS_CNAME_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/61:R53_ALIAS_Loop_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/62:R53_alias_pre-existing_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/63:R53_alias_evaluate_target_health_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/64:R53_B3493_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/65:R53_B3493_REV_***SKIPPED(CanUseRoute53Alias_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/66:R53_WEIGHT_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/67:R53_WEIGHT_CNAME_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/68:R53_WEIGHT_MIXED_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/69:TENCENTDNS_LINE_WEIGHT_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/70:CLOUDFLAREAPI_SINGLE_REDIRECT_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/71:CF_PROXY_A_create_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/72:CF_PROXY_A_off_to_on_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/73:CF_PROXY_A_on_to_off_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/74:CF_PROXY_CNAME_create_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/75:CF_PROXY_CNAME_off_to_on_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/76:CF_PROXY_CNAME_on_to_off_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/77:CF_CNAME_FLATTEN_create_***SKIPPED(excluded_by_alltrue([false]))***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/78:CF_CNAME_FLATTEN_off_to_on_***SKIPPED(excluded_by_alltrue([false]))***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/79:CF_CNAME_FLATTEN_on_to_off_***SKIPPED(excluded_by_alltrue([false]))***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/80:CF_COMMENT_create_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/81:CF_TAGS_create_***SKIPPED(excluded_by_alltrue([false]))***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/82:CF_WORKER_ROUTE_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/83:ADGUARDHOME_A_PASSTHROUGH_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/84:ADGUARDHOME_AAAA_PASSTHROUGH_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/85:MIKROTIK_FWD_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/86:MIKROTIK_NXDOMAIN_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/87:MIKROTIK_METADATA_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/88:VERCEL_CAA_whitespace_-_cansignhttpexchanges_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#33 (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:Create_some_records (1.26s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS (0.31s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label,type (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#01 (0.38s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label,type,target (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#02 (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_type (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#03 (0.30s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_type,target (0.31s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#04 (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_target (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#05 (0.40s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_manytypes (0.37s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#06 (0.36s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:ignore_label,type,target=* (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/89:IGNORE_main:VERIFY_PREVIOUS#07 (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#34 (1.20s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:Create_some_records (1.24s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_label (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_label,type (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#01 (0.37s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_label,type,target (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#02 (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_type (0.38s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#03 (0.40s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_type,target (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#04 (0.39s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_target (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#05 (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:apex_manytypes (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/90:IGNORE_apex:VERIFY_PREVIOUS#06 (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#35 (1.10s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:Create_some_records (1.14s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:ignore_unsafe_apex (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:VERIFY_PREVIOUS (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:ignore_unsafe_label (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/91:IGNORE_unsafe:VERIFY_PREVIOUS#01 (0.39s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#36 (0.88s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:Create_some_records (1.30s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:ignore_label=foo.* (0.37s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:VERIFY_PREVIOUS (0.42s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:ignore_label=foo.bat,type (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:VERIFY_PREVIOUS#01 (0.31s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:ignore_target=*.domain (0.40s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/92:IGNORE_wilds:VERIFY_PREVIOUS#02 (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#37 (1.20s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:Create_some_records (1.95s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByZone (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS (0.31s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByLabel (0.49s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS#01 (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByRecordSet (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS#02 (0.39s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:IGNORE_change_ByRecord (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/93:IGNORE_with_modify:VERIFY_PREVIOUS#03 (0.38s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#38 (1.87s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/94:IGNORE_TARGET_b2285:Create_some_records (0.69s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/94:IGNORE_TARGET_b2285:Add_a_new_record_-_ignoring_test.foo.com. (0.16s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/94:IGNORE_TARGET_b2285:VERIFY_PREVIOUS (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#39 (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/95:IGNORE_everything_b2822:Create_some_records (1.14s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/95:IGNORE_everything_b2822:ignore_them_all (0.34s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/95:IGNORE_everything_b2822:VERIFY_PREVIOUS (0.33s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#40 (0.94s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:Create_some_records (0.78s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:ignore (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:VERIFY_PREVIOUS (0.35s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:Verify_nothing_changed (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:VERIFY_PREVIOUS#01 (0.32s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:ignore_with_change (0.54s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/96:IGNORE_w/change_b3227:VERIFY_PREVIOUS#02 (0.33s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/97:structured_TXT_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/98:structured_TXT_as_native_records_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/99:CLOUDNS_geodns_tests_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/100:PORKBUN_url_forwarding_tests_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/101:GCORE_metadata_tests_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/102:NAMECHEAP_url_redirect_records_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/103:OPENPGPKEY_***SKIPPED(CanUseOPENPGPKEY_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/104:SMIMEA_***SKIPPED(CanUseSMIMEA_not_supported)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/105:Bunny_DNS_Pull_Zone_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/106:HEDNS_DYNAMIC_A_lifecycle_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/107:HEDNS_DYNAMIC_AAAA+TXT_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/108:HEDNS_DDNS_KEY_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- SKIP: TestDNSProviders/example-dnscontrol.com/109:HEDNS_DYNAMIC_mixed_records_***SKIPPED(disabled_by_only)***:Empty (0.00s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#41 (0.53s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#42 (0.18s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/111:final:final (0.55s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/Clean_Slate:Empty#43 (0.36s)
        --- PASS: TestDNSProviders/example-dnscontrol.com/112:final:final (0.52s)
=== RUN   TestMakeTests
--- PASS: TestMakeTests (0.01s)
=== RUN   TestDualProviders
Testing Profile="VULTR" (TYPE="VULTR")
    provider_test.go:29: Skipping.  DocDualHost == Cannot
--- SKIP: TestDualProviders (0.30s)
=== RUN   TestNameserverDots
Testing Profile="VULTR" (TYPE="VULTR")
    provider_test.go:116: Skipping.  DocDualHost == Cannot
--- SKIP: TestNameserverDots (0.15s)
=== RUN   TestDuplicateNameservers
Testing Profile="VULTR" (TYPE="VULTR")
    provider_test.go:148: Skipping.  DocDualHost == Cannot
--- SKIP: TestDuplicateNameservers (0.14s)
FAIL
FAIL    github.com/DNSControl/dnscontrol/v5/integrationTest     168.479s
FAIL

Will look at the TODOs and failures now.

@pgaskin

pgaskin commented Jul 26, 2026

Copy link
Copy Markdown
Member

To work around the Change all ttls failure, all records with the same name must be deleted and recreated with the new ttl if different from the old one.

The TXT backslashes appear to be an API quirk on Vultr's side where they seemingly parse the provided TXT value with something like the following (based on experimenting with it):

  • Trim all leading/trailing whitespace (you can still put this within the value, but only if it's double-quoted).
  • If there is a double-quote immediately at the beginning or the end, but not both, error with Record data must be enclosed in quotes.
  • If there is a double-quote immediately at both the beginning and end, remove them.
  • If there are any double-quotes left, error with Quotes may only appear at the beginning and end of the data.
  • All remaining characters are interpreted literally, including backslashes.

The TXT value is always returned surrounded with double-quotes, and with backslashes appearing literally within them.

@pgaskin

pgaskin commented Jul 26, 2026

Copy link
Copy Markdown
Member
  • Commented IDNA code is not required (I still want to double-check this, though).
  • TXT leading space test can be uncommented.
  • Commented TXT code is need to be uncommented, will also improve the comment.
  • Needs a workaround for the TTL issue.

I will PR these changes.

@pgaskin

pgaskin commented Jul 26, 2026

Copy link
Copy Markdown
Member

Thinking about the TTL issue a bit more:

  • TTLs must match for name-type pairs.
  • It does not seem possible to update any TTL without removing all records with that name and type.

@pgaskin

pgaskin commented Jul 26, 2026

Copy link
Copy Markdown
Member

Is

Ttl: int64(recs[0].TTL), // diff2 assures all TTLs in a ReceordSet are the same.
actually true?

There does seem to be

func checkRecordSetHasMultipleTTLs(records []*models.RecordConfig) (errs []error) {
, but this only emits a warning.

The gandiv5, huaweiclod, and gcore providers seem to just warn and use the smallest TTL, as implied by the comment in checkRecordSetHasMultipleTTLs.

The gcloud handling seems to differ from the others I spot-checked.

@pgaskin pgaskin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

* vultr: Resolve TODOs

* vultr: Properly handle TTL changes

* vultr: Fix null MX handling

* vultr: Update audit

* vultr: Also reject CAA records with an empty target

* vultr: Simplify GetZoneRecords

* vultr: Implement ListZones

* vultr: Drop unused field

* vultr: Use github.com/vultr/govultr/v3

* vultr: Implement AutoDNSSEC

* vultr: Verified concurrency
@TomOnTime
TomOnTime requested a review from cafferata as a code owner July 27, 2026 01:20
@TomOnTime

Copy link
Copy Markdown
Collaborator Author

Is

Ttl: int64(recs[0].TTL), // diff2 assures all TTLs in a ReceordSet are the same.

actually true?

Good catch! That comment is wrong. I'll correct it.

@TomOnTime

Copy link
Copy Markdown
Collaborator Author

Great work! I'm merging this. Please look for v5.0.0-rc3 and test again and/or test release_candidate_v5 branch.

Thanks!

@TomOnTime
TomOnTime merged commit 823586c into release_candidate_v5 Jul 27, 2026
24 checks passed
@TomOnTime
TomOnTime deleted the mod_vultr branch July 27, 2026 01:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

3 participants