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

POWERDNS: Some minor fixes for ALIAS and TXTMulti and integration testing (#1065)

* POWERDNS: Some minor fixes for ALIAS and integration testing
* POWERDNS: Readd missing error handling
This commit is contained in:
Jan-Philipp Benecke
2021-03-01 13:09:49 +01:00
committed by GitHub
parent 54bca37900
commit 06a1cc3d38
4 changed files with 42 additions and 14 deletions

View File

@ -45,6 +45,7 @@ jobs:
- DIGITALOCEAN - DIGITALOCEAN
- GANDI_V5 - GANDI_V5
- INWX - INWX
- POWERDNS
# Bring-Your-Own-Secrets: # Bring-Your-Own-Secrets:
# To reduce the risk of secrets being logged by third-parties, secrets # To reduce the risk of secrets being logged by third-parties, secrets
# come from the account of the fork. For example, the PR submitted by # come from the account of the fork. For example, the PR submitted by
@ -108,6 +109,11 @@ jobs:
INWX_DOMAIN: ${{ secrets.INWX_DOMAIN }} INWX_DOMAIN: ${{ secrets.INWX_DOMAIN }}
INWX_PASSWORD: ${{ secrets.INWX_PASSWORD }} INWX_PASSWORD: ${{ secrets.INWX_PASSWORD }}
INWX_USER: ${{ secrets.INWX_USER }} INWX_USER: ${{ secrets.INWX_USER }}
#
POWERDNS_DOMAIN: ${{ secrets.POWERDNS_DOMAIN }}
POWERDNS_APIURL: ${{ secrets.POWERDNS_APIURL }}
POWERDNS_APIKEY: ${{ secrets.POWERDNS_APIKEY }}
POWERDNS_SERVERNAME: ${{ secrets.POWERDNS_SERVERNAME }}
steps: steps:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@v2 uses: actions/checkout@v2

View File

@ -142,9 +142,10 @@
"domain": "$OVH_DOMAIN" "domain": "$OVH_DOMAIN"
}, },
"POWERDNS": { "POWERDNS": {
"apikey": "$POWERDNS_APIKEY", "apiKey": "$POWERDNS_APIKEY",
"apiurl": "$POWERDNS_APIURL", "apiUrl": "$POWERDNS_APIURL",
"servername": "$POWERDNS_SERVERNAME" "serverName": "$POWERDNS_SERVERNAME",
"domain": "$POWERDNS_DOMAIN"
}, },
"ROUTE53": { "ROUTE53": {
"KeyId": "$ROUTE53_KEY_ID", "KeyId": "$ROUTE53_KEY_ID",

View File

@ -27,6 +27,8 @@ type Differ interface {
// ChangedGroups performs a diff more appropriate for providers with a "RecordSet" model, where all records with the same name and type are grouped. // ChangedGroups performs a diff more appropriate for providers with a "RecordSet" model, where all records with the same name and type are grouped.
// Individual record changes are often not useful in such scenarios. Instead we return a map of record keys to a list of change descriptions within that group. // Individual record changes are often not useful in such scenarios. Instead we return a map of record keys to a list of change descriptions within that group.
ChangedGroups(existing []*models.RecordConfig) (map[models.RecordKey][]string, error) ChangedGroups(existing []*models.RecordConfig) (map[models.RecordKey][]string, error)
// ChangedGroupsDeleteFirst is the same as ChangedGroups but it sorts the deletions to the first postion
ChangedGroupsDeleteFirst(existing []*models.RecordConfig) (map[models.RecordKey][]string, error)
} }
// New is a constructor for a Differ. // New is a constructor for a Differ.
@ -262,14 +264,14 @@ func CorrectionLess(c []*models.Correction, i, j int) bool {
func (d *differ) ChangedGroups(existing []*models.RecordConfig) (map[models.RecordKey][]string, error) { func (d *differ) ChangedGroups(existing []*models.RecordConfig) (map[models.RecordKey][]string, error) {
changedKeys := map[models.RecordKey][]string{} changedKeys := map[models.RecordKey][]string{}
_, create, delete, modify, err := d.IncrementalDiff(existing) _, create, toDelete, modify, err := d.IncrementalDiff(existing)
if err != nil { if err != nil {
return nil, err return nil, err
} }
for _, c := range create { for _, c := range create {
changedKeys[c.Desired.Key()] = append(changedKeys[c.Desired.Key()], c.String()) changedKeys[c.Desired.Key()] = append(changedKeys[c.Desired.Key()], c.String())
} }
for _, d := range delete { for _, d := range toDelete {
changedKeys[d.Existing.Key()] = append(changedKeys[d.Existing.Key()], d.String()) changedKeys[d.Existing.Key()] = append(changedKeys[d.Existing.Key()], d.String())
} }
for _, m := range modify { for _, m := range modify {
@ -278,6 +280,24 @@ func (d *differ) ChangedGroups(existing []*models.RecordConfig) (map[models.Reco
return changedKeys, nil return changedKeys, nil
} }
func (d *differ) ChangedGroupsDeleteFirst(existing []*models.RecordConfig) (map[models.RecordKey][]string, error) {
changedKeys := map[models.RecordKey][]string{}
_, create, toDelete, modify, err := d.IncrementalDiff(existing)
if err != nil {
return nil, err
}
for _, d := range toDelete {
changedKeys[d.Existing.Key()] = append(changedKeys[d.Existing.Key()], d.String())
}
for _, c := range create {
changedKeys[c.Desired.Key()] = append(changedKeys[c.Desired.Key()], c.String())
}
for _, m := range modify {
changedKeys[m.Desired.Key()] = append(changedKeys[m.Desired.Key()], m.String())
}
return changedKeys, nil
}
// DebugKeyMapMap debug prints the results from ChangedGroups. // DebugKeyMapMap debug prints the results from ChangedGroups.
func DebugKeyMapMap(note string, m map[models.RecordKey][]string) { func DebugKeyMapMap(note string, m map[models.RecordKey][]string) {
// The output isn't pretty but it is useful. // The output isn't pretty but it is useful.

View File

@ -3,7 +3,6 @@ package powerdns
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"net/http" "net/http"
"strings" "strings"
@ -18,7 +17,7 @@ import (
) )
var features = providers.DocumentationNotes{ var features = providers.DocumentationNotes{
providers.CanUseAlias: providers.Can(), providers.CanUseAlias: providers.Can("Needs to be enabled in PowerDNS first", "https://doc.powerdns.com/authoritative/guides/alias.html"),
providers.CanUseCAA: providers.Can(), providers.CanUseCAA: providers.Can(),
providers.CanUsePTR: providers.Can(), providers.CanUsePTR: providers.Can(),
providers.CanUseSRV: providers.Can(), providers.CanUseSRV: providers.Can(),
@ -28,6 +27,9 @@ var features = providers.DocumentationNotes{
providers.DocCreateDomains: providers.Can(), providers.DocCreateDomains: providers.Can(),
providers.DocOfficiallySupported: providers.Cannot(), providers.DocOfficiallySupported: providers.Cannot(),
providers.CanGetZones: providers.Can(), providers.CanGetZones: providers.Can(),
providers.CanUseTXTMulti: providers.Can(),
providers.DocDualHost: providers.Can(),
providers.CanUseNAPTR: providers.Can(),
} }
func init() { func init() {
@ -153,7 +155,7 @@ func (api *powerdnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*m
models.PostProcessRecords(curRecords) models.PostProcessRecords(curRecords)
// create record diff by group // create record diff by group
keysToUpdate, err := (diff.New(dc)).ChangedGroups(curRecords) keysToUpdate, err := (diff.New(dc)).ChangedGroupsDeleteFirst(curRecords)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -173,6 +175,7 @@ func (api *powerdnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*m
}, },
}) })
} else { } else {
// needs to be a create or update
ttl := desiredRecords[label][0].TTL ttl := desiredRecords[label][0].TTL
records := []zones.Record{} records := []zones.Record{}
for _, recordContent := range desiredRecords[label] { for _, recordContent := range desiredRecords[label] {
@ -240,6 +243,8 @@ func toRecordConfig(domain string, r zones.Record, ttl int, name string, rtype s
content := r.Content content := r.Content
switch rtype { switch rtype {
case "ALIAS":
return rc, rc.SetTarget(r.Content)
case "CNAME", "NS": case "CNAME", "NS":
return rc, rc.SetTarget(dnsutil.AddOrigin(content, domain)) return rc, rc.SetTarget(dnsutil.AddOrigin(content, domain))
case "CAA": case "CAA":
@ -248,12 +253,8 @@ func toRecordConfig(domain string, r zones.Record, ttl int, name string, rtype s
return rc, rc.SetTargetMXString(content) return rc, rc.SetTargetMXString(content)
case "SRV": case "SRV":
return rc, rc.SetTargetSRVString(content) return rc, rc.SetTargetSRVString(content)
case "TXT": case "NAPTR":
// Remove quotes if it is a TXT record. return rc, rc.SetTargetNAPTRString(content)
if !strings.HasPrefix(content, `"`) || !strings.HasSuffix(content, `"`) {
return nil, errors.New("unexpected lack of quotes in TXT record from PowerDNS")
}
return rc, rc.SetTargetTXT(content[1 : len(content)-1])
default: default:
return rc, rc.PopulateFromString(rtype, content, domain) return rc, rc.PopulateFromString(rtype, content, domain)
} }