Skip to content

fix: include AAAA recordsets in Records() - #1

Merged
mojansch merged 2 commits into
mainfrom
fix/aaaa-recordset-support
Jul 29, 2026
Merged

fix: include AAAA recordsets in Records()#1
mojansch merged 2 commits into
mainfrom
fix/aaaa-recordset-support

Conversation

@mojansch

Copy link
Copy Markdown
Member

Summary

  • Records() only ever returned A, TXT, and CNAME recordsets from Designate — any existing AAAA recordset was invisible to external-dns's planner.
  • Result: once an AAAA record already existed, external-dns believed it was always missing and retried CreateRecordSet on every sync, failing forever with 409 duplicate_recordset. Observed in production as ~80k consecutive failed reconciles over 56+ days.
  • ApplyChanges/CreateRecordSet never had this restriction — Designate accepted AAAA records fine, it's purely a gap in the read-back path.

Changes

  • internal/designate/provider/provider.go: add endpoint.RecordTypeAAAA to the type allowlist in Records().
  • internal/designate/provider/provider_test.go: extend TestDesignateRecords with an AAAA recordset case.
  • .github/workflows/devstack.yml: add an integration check that seeds an AAAA recordset directly in Designate and asserts the webhook's GET /records reports it back. The existing checks only exercise A/TXT since external-dns's fake source never emits AAAA, so they wouldn't have caught this.

Test plan

  • go test ./... passes locally
  • go build ./... passes locally
  • CI (lint/build/test + devstack integration) green on this PR

mojansch added 2 commits July 29, 2026 14:49
Records() only ever returned A, TXT and CNAME recordsets from Designate.
Any existing AAAA recordset was invisible to external-dns's planner, so
it treated it as permanently missing and retried CreateRecordSet every
sync interval, failing forever with 409 duplicate_recordset once the
record already existed.

Also adds a devstack integration check that seeds an AAAA recordset
directly in Designate and asserts the webhook's GET /records reports it
back. The existing checks only ever exercise A/TXT since external-dns's
fake source never emits AAAA, so they wouldn't have caught this bug.
external-dns's endpoint.NewEndpointWithTTL trims the trailing dot from
DNSName, so the /records response has "aaaa-webhook-test.example.com"
without a trailing dot, not "aaaa-webhook-test.example.com.". The AAAA
fix itself was correct - confirmed by the actual CI run, which showed
the record present in the response before this assertion rejected it.
@mojansch
mojansch merged commit 34a8bc7 into main Jul 29, 2026
3 checks passed
@mojansch
mojansch deleted the fix/aaaa-recordset-support branch July 29, 2026 14:16
@mojansch
mojansch restored the fix/aaaa-recordset-support branch July 31, 2026 14:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant