1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00

DOCS: Update adding-new-rtypes.md (#2164)

Co-authored-by: Tom Limoncelli <tal@whatexit.org>
This commit is contained in:
Paul Dee
2023-03-15 16:16:56 +01:00
committed by GitHub
parent f748a7e5b2
commit 613fe7ad57

View File

@ -16,7 +16,13 @@ Our general philosophy is:
- Anywhere we have a special case for a particular Rtype, we use a `switch` statement and have a `case` for every single record type, usually with a `default:` case that calls `panic()`. This way developers adding a new record type will quickly find where they need to add code (the panic will tell them where). Before we did this, missing implementation code would go unnoticed for months.
- Keep things alphabetical. If you are adding your record type to a case statement, function library, or whatever, please list it alphabetically along with the others when possible.
## Step 1: Update `RecordConfig` in `models/dns.go`
Step 2 requires `stringer`.
```shell
go install golang.org/x/tools/cmd/stringer@latest
```
You may need to symlink stringer into your PATH.
## Step 1: Update `RecordConfig` in `models/record.go`
If the record has any unique fields, add them to `RecordConfig`.
The field name should be the record type, then the field name as
@ -39,6 +45,10 @@ type RecordConfig struct {
}
```
It is important to leave the `omitempty` flag present so that tests for
other record types do not start to fail because your new record types insist on
being present.
## Step 2: Add a capability for the record
You'll need to mark which providers support this record type. The
@ -47,7 +57,22 @@ a minimum.
- Add the capability to the file `dnscontrol/providers/capabilities.go` (look for `CanUseAlias` and add
it to the end of the list.)
- Add this feature to the feature matrix in `dnscontrol/build/generate/featureMatrix.go` (Add it to the variable `matrix` then add it later in the file with a `setCap()` statement.
- Run stringer to auto-update the file `dnscontrol/providers/capability_string.go`
```shell
pushd; cd providers;
stringer -type=Capability
popd
```
alternatively
```shell
pushd; cd providers;
go generate
popd
```
- Add this feature to the feature matrix in `dnscontrol/build/generate/featureMatrix.go` (Add it to the variable `matrix` then add it later in the file with a `setCapability()` statement.
- Add the capability to the list of features that zones are validated
against (i.e. if you want DNSControl to report an error if this
feature is used with a DNS provider that doesn't support it). That's
@ -93,19 +118,9 @@ npm install prettier
node_modules/.bin/prettier --write pkg/js/helpers.js
```
Any time you change `pkg/js/helpers.js`, run `go generate` to regenerate `pkg/js/static.go`.
The dnscontrol `-dev` flag ignores `pkg/js/static.go` and reads
`pkg/js/helpers.js` directly. This is useful when debugging since it
is one less step.
Likewise, if you are debugging `helpers.js` and you can't figure out why
your changes aren't making a difference, it usually means you aren't
running `go generate` after any change, or using the `-dev` flag.
## Step 4: Search for `#rtype_variations`
Anywhere a rtype requires special handling has been marked with a
Anywhere a `rtype` requires special handling has been marked with a
comment that includes the string `#rtype_variations`. Search for
this string and add your new type to this code.
@ -113,6 +128,7 @@ this string and add your new type to this code.
Add at least one test case to the `pkg/js/parse_tests` directory.
Test `013-mx.js` is a very simple one and is good for cloning.
See also `017-txt.js`.
Run these tests via:
@ -176,10 +192,10 @@ properly see a change in priority. We fixed this bug before the
code made it into production.
Line 4: In this example, the next zone adds a second MX record.
To get to this configuration, the provider will have add an
To get to this configuration, the provider will add an
additional MX record to the same label. New tests don't need to do
this kind of test because we're pretty sure that part of the diffing
engine work fine. It is here as an example.
this kind of test because we're pretty sure that that part of the diffing
engine works fine. It is here as an example.
Also notice that some tests include `requires()`, `not()` and `only()`
statements. This is how we restrict tests to certain providers.