Repository navigation
feat: NEW PROVIDER: MITTWALD (Mittwald mStudio provider) - #4933
Merged
Merged
Conversation
Collaborator
|
Thank you for contributing this new provider, @twiesing ! A few action items before we can merge this PR:
When I see the Github invite accepted and receive the email, I’ll merge this PR. Thanks again! |
TomOnTime
approved these changes
Sep 26, 2026
TomOnTime
left a comment
Collaborator
There was a problem hiding this comment.
Looks good! Thanks for submitting this!
Collaborator
|
Please rebase. |
twiesing
force-pushed
the
feat/mittwald-provider
branch
from
September 26, 2026 14:55
acb68e6 to
7fe1610
Compare
Contributor
Author
|
Rebased onto main. |
Collaborator
|
CC @cafferata The list of providers in README.md is difficult to update and causes a lot of branch conflicts. Can we generate that list instead? |
DNS provider for mittwald mStudio (MITTWALD), using the official client github.com/mittwald/api-client-go. mStudio keeps one DNS zone per name, each with one record set per type (A and AAAA together, CNAME, MX, TXT, SRV, CAA), so changes are made per label with diff2.ByLabel. Record sets that mStudio manages (ingress addresses, mittwald mail exchangers) are neither returned nor touched. The transport keeps requests within the rate limit (X-Ratelimit-*), sends the event of the last write as If-Event-Reached so that reads and writes see it, and repeats 429, 412, 5xx and, after a write, a few 403/404 responses; POST requests are never repeated on errors that may have created something. Integration tests: 217 passed against a test domain.
…ched The API also answers a CNAME on a name with other records with 412. That conflict was repeated like an unprocessed event until the retry budget ran out; now only a 412 of type FailedPrecondition is repeated.
…ing them Like other providers with TTL limits, the desired records get a TTL within 60..86400 before the diff. A and AAAA of one name share one TTL in mStudio; both get the lower of the two, with a warning, so that the next run finds no difference.
…eleting a zone A zone deleted while it has a CAA set leaves the name unable to take a CAA set ever again (mStudio answers 500); unsetting the set first avoids this. A zone with other zones below it is no longer deleted.
GET /v2/domains names the project of a domain in one request; only a domain missing from that list is looked for in the zones of every project, as before. With a token of a user with many projects this saves a request per project.
twiesing
force-pushed
the
feat/mittwald-provider
branch
from
September 27, 2026 13:52
7fe1610 to
8e3bb38
Compare
Contributor
Author
|
Rebased again @TomOnTime 😄 🚀 |
Collaborator
|
Welcome to the team! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
MITTWALD, a DNS provider for mittwald mStudio, built on the official Go clientgithub.com/mittwald/api-client-go.Please create the GitHub label 'provider-MITTWALD'.
How it maps to mStudio
example.com,www.example.com,_dmarc.example.comare separate zones), each with one record set per type: A and AAAA together, CNAME, MX, TXT, SRV, CAA. Corrections are therefore computed withdiff2.ByLabel; a name's zone is created when its first record is added and deleted when its last record is removed.auditrecords.gorejects what the API does not accept: wildcard names, NS, null MX, MX preference above 100, empty TXT, TXT with trailing space, CAA values other than a host name, TTLs outside 60..86400, and more records per set than the API allows.API behaviour handled in the transport (
retry.go)X-Ratelimit-Remaining/X-Ratelimit-Resetand waits for the reset once the limit is used up; a429(which carries no reset information) is repeated with backoff.ETag); every following request sends it asIf-Event-Reached, so reads see the write and writes to a zone just created find it.412is repeated; after a write,403/404are repeated a few times, as mittwald's own client does.5xxare repeated for requests that cannot create anything twice (never forPOST).{}) into severaloneOfalternatives at once; sets are only read when they are not unset (regression test included).Tests
go test ./integrationTest -args -profile MITTWALD): 217 passed, run several times.00000000-…,mittwald-test.example); the replay does not depend on them.go vet,golangci-lint(0 issues),go generate,go mod tidy.I'll maintain the provider (
@twiesing).