POWERDNS: Zone creation now abides by variant tags (#3830)

This commit is contained in:
Elvis Ratzlaff 2025-11-05 11:33:47 -03:00 committed by GitHub
parent 8f13dd1030
commit a1e74eb11f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
36 changed files with 47 additions and 45 deletions

View file

@ -56,7 +56,7 @@ func CreateDomains(args CreateDomainsArgs) error {
for _, provider := range domain.DNSProviderInstances {
if creator, ok := provider.Driver.(providers.ZoneCreator); ok {
fmt.Println(" -", provider.Name)
err := creator.EnsureZoneExists(domain.Name)
err := creator.EnsureZoneExists(domain.Name, domain.Metadata)
if err != nil {
fmt.Printf("Error creating domain: %s\n", err)
}

View file

@ -493,7 +493,7 @@ func oneZonePopulate(zone *models.DomainConfig, zc *cmdZoneCache) error {
var errs []error
// Loop over all the providers configured for that zone:
for _, provider := range zone.DNSProviderInstances {
populateCorrections, err := generatePopulateCorrections(provider, zone.Name, zc)
populateCorrections, err := generatePopulateCorrections(provider, zone, zc)
if err != nil {
errs = append(errs, err)
}
@ -645,7 +645,7 @@ func writeReport(report string, reportItems []*ReportItem) error {
return nil
}
func generatePopulateCorrections(provider *models.DNSProviderInstance, zoneName string, zcache *cmdZoneCache) ([]*models.Correction, error) {
func generatePopulateCorrections(provider *models.DNSProviderInstance, zone *models.DomainConfig, zcache *cmdZoneCache) ([]*models.Correction, error) {
lister, ok := provider.Driver.(providers.ZoneLister)
if !ok {
return nil, nil // We can't generate a list. No corrections are possible.
@ -658,7 +658,7 @@ func generatePopulateCorrections(provider *models.DNSProviderInstance, zoneName
}
zones := *z
aceZoneName, _ := idna.ToASCII(zoneName)
aceZoneName, _ := idna.ToASCII(zone.Name)
if slices.Contains(zones, aceZoneName) {
return nil, nil // zone exists. Nothing to do.
}
@ -671,7 +671,7 @@ func generatePopulateCorrections(provider *models.DNSProviderInstance, zoneName
return []*models.Correction{{
Msg: fmt.Sprintf("Ensuring zone %q exists in %q", aceZoneName, provider.Name),
F: func() error { return creator.EnsureZoneExists(aceZoneName) },
F: func() error { return creator.EnsureZoneExists(aceZoneName, zone.Metadata) },
}}, nil
}

View file

@ -99,7 +99,7 @@ func newEdgeDNSDSP(config map[string]string, metadata json.RawMessage) (provider
}
// EnsureZoneExists creates a zone if it does not exist
func (a *edgeDNSProvider) EnsureZoneExists(domain string) error {
func (a *edgeDNSProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if zoneDoesExist(domain) {
printer.Debugf("Zone %s already exists\n", domain)
return nil

View file

@ -250,7 +250,7 @@ func (api *autoDNSProvider) GetZoneRecords(domain string, meta map[string]string
return existingRecords, nil
}
func (api *autoDNSProvider) EnsureZoneExists(domain string) error {
func (api *autoDNSProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
// try to get zone
_, err := api.getZone(domain)

View file

@ -691,7 +691,7 @@ func (a *azurednsProvider) fetchRecordSets(zoneName string) ([]*adns.RecordSet,
return records, nil
}
func (a *azurednsProvider) EnsureZoneExists(domain string) error {
func (a *azurednsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if _, ok := a.zones[domain]; ok {
return nil
}

View file

@ -523,7 +523,7 @@ func (a *azurednsProvider) fetchRecordSets(zoneName string) ([]*adns.RecordSet,
return records, nil
}
func (a *azurednsProvider) EnsureZoneExists(domain string) error {
func (a *azurednsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if _, ok := a.zones[domain]; ok {
return nil
}

View file

@ -16,7 +16,7 @@ func (b *bunnydnsProvider) ListZones() ([]string, error) {
return zoneNames, nil
}
func (b *bunnydnsProvider) EnsureZoneExists(domain string) error {
func (b *bunnydnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
_, err := b.findZoneByDomain(domain)
if err == nil {
return nil

View file

@ -898,7 +898,7 @@ func getProxyMetadata(r *models.RecordConfig) map[string]string {
}
// EnsureZoneExists creates a zone if it does not exist
func (c *cloudflareProvider) EnsureZoneExists(domain string) error {
func (c *cloudflareProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if ok, err := c.zoneCache.HasZone(domain); err != nil || ok {
return err
}

View file

@ -284,7 +284,7 @@ func (c *cloudnsProvider) GetZoneRecords(domain string, meta map[string]string)
}
// EnsureZoneExists creates a zone if it does not exist
func (c *cloudnsProvider) EnsureZoneExists(domain string) error {
func (c *cloudnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if _, ok, err := c.fetchDomainIndex(domain); err != nil {
return err
} else if ok { // zone already exists

View file

@ -3,7 +3,7 @@ package cnr
// EnsureZoneExists returns an error
// * if access to dnszone is not allowed (not authorized) or
// * if it doesn't exist and creating it fails
func (n *Client) EnsureZoneExists(domain string) error {
func (n *Client) EnsureZoneExists(domain string, metadata map[string]string) error {
command := map[string]interface{}{
"COMMAND": "AddDNSZone",
"DNSZONE": domain,

View file

@ -196,7 +196,7 @@ func (n *Client) getRecords(domain string) ([]*Record, error) {
if r.GetCode() == 545 {
// If dns zone does not exist create a new one automatically
if !isNoPopulate() {
err := n.EnsureZoneExists(domain)
err := n.EnsureZoneExists(domain, nil)
if err != nil {
return nil, err
}

View file

@ -123,7 +123,7 @@ func (c *desecProvider) GetZoneRecords(domain string, meta map[string]string) (m
}
// EnsureZoneExists creates a zone if it does not exist
func (c *desecProvider) EnsureZoneExists(domain string) error {
func (c *desecProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
_, ok, err := c.searchDomainIndex(domain)
if err != nil {
return err

View file

@ -95,7 +95,7 @@ func init() {
}
// EnsureZoneExists creates a zone if it does not exist
func (api *digitaloceanProvider) EnsureZoneExists(domain string) error {
func (api *digitaloceanProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
retry:
ctx := context.Background()
_, resp, err := api.client.Domains.Get(ctx, domain)

View file

@ -191,7 +191,7 @@ func (api *dnsMadeEasyProvider) GetZoneRecordsCorrections(dc *models.DomainConfi
}
// EnsureZoneExists creates a zone if it does not exist
func (api *dnsMadeEasyProvider) EnsureZoneExists(domain string) error {
func (api *dnsMadeEasyProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
exists, err := api.domainExists(domain)
if err != nil {
return err

View file

@ -81,7 +81,7 @@ func init() {
}
// EnsureZoneExists creates a zone if it does not exist
func (c *exoscaleProvider) EnsureZoneExists(domain string) error {
func (c *exoscaleProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
_, err := c.findDomainByName(domain)
return err

View file

@ -157,7 +157,7 @@ func (p *fortigateProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, e
Msg: msg,
F: func() error {
if err := p.EnsureZoneExists(dc.Name); err != nil {
if err := p.EnsureZoneExists(dc.Name, dc.Metadata); err != nil {
return err
}
@ -170,7 +170,7 @@ func (p *fortigateProvider) GetZoneRecordsCorrections(dc *models.DomainConfig, e
}
// Zone Existence Check & Creation
func (p *fortigateProvider) EnsureZoneExists(domain string) error {
func (p *fortigateProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
var probe struct{ Results []any }
err := p.client.do("GET", "system/dns-database/"+domain, nil, nil, &probe)

View file

@ -446,7 +446,7 @@ func (g *gcloudProvider) getRecords(domain string) ([]*gdns.ResourceRecordSet, e
return sets, nil
}
func (g *gcloudProvider) EnsureZoneExists(domain string) error {
func (g *gcloudProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
z, err := g.getZone(domain)
if err != nil {
if _, ok := err.(errNoExist); !ok {

View file

@ -113,7 +113,7 @@ func (c *gcoreProvider) GetZoneRecords(domain string, meta map[string]string) (m
}
// EnsureZoneExists creates a zone if it does not exist
func (c *gcoreProvider) EnsureZoneExists(domain string) error {
func (c *gcoreProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
zones, err := c.provider.Zones(c.ctx)
if err != nil {
return err

View file

@ -167,7 +167,7 @@ func (c *hednsProvider) ListZones() ([]string, error) {
}
// EnsureZoneExists creates a zone if it does not exist
func (c *hednsProvider) EnsureZoneExists(domain string) error {
func (c *hednsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
domains, err := c.ListZones()
if err != nil {
return err

View file

@ -58,7 +58,7 @@ func New(settings map[string]string, _ json.RawMessage) (providers.DNSServicePro
}
// EnsureZoneExists creates a zone if it does not exist
func (api *hetznerProvider) EnsureZoneExists(domain string) error {
func (api *hetznerProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if ok, err := api.zoneCache.HasZone(domain); err != nil || ok {
return err
}

View file

@ -3,7 +3,7 @@ package hexonet
// EnsureZoneExists returns an error
// * if access to dnszone is not allowed (not authorized) or
// * if it doesn't exist and creating it fails
func (n *HXClient) EnsureZoneExists(domain string) error {
func (n *HXClient) EnsureZoneExists(domain string, metadata map[string]string) error {
r := n.client.Request(map[string]interface{}{
"COMMAND": "StatusDNSZone",
"DNSZONE": domain + ".",

View file

@ -357,7 +357,7 @@ func (hp *hostingdeProvider) GetRegistrarCorrections(dc *models.DomainConfig) ([
return nil, nil
}
func (hp *hostingdeProvider) EnsureZoneExists(domain string) error {
func (hp *hostingdeProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
_, err := hp.getZoneConfig(domain)
if errors.Is(err, errZoneNotFound) {
if err := hp.createZone(domain); err != nil {

View file

@ -8,7 +8,7 @@ import (
)
// EnsureZoneExists creates a zone if it does not exist
func (c *huaweicloudProvider) EnsureZoneExists(domain string) error {
func (c *huaweicloudProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if err := c.getZones(); err != nil {
return err
}

View file

@ -519,7 +519,7 @@ func (api *inwxAPI) fetchRegistrationNSSet(domain string) []string {
}
// EnsureZoneExists creates a zone if it does not exist
func (api *inwxAPI) EnsureZoneExists(domain string) error {
func (api *inwxAPI) EnsureZoneExists(domain string, metadata map[string]string) error {
if api.domainIndex == nil { // only pull the data once.
if err := api.fetchNameserverDomains(); err != nil {
return err

View file

@ -7,7 +7,7 @@ import (
)
// EnsureZoneExists creates a zone if it doesn't exist.
func (api *jokerProvider) EnsureZoneExists(domain string) error {
func (api *jokerProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
// For Joker, all domains you manage automatically have DNS zones available
// We just need to verify we can access the zone
_, body, err := api.makeRequest("dns-zone-get", url.Values{"domain": {domain}})

View file

@ -210,7 +210,7 @@ func (l *luadnsProvider) makeDeleteCorrection(deleterec *models.RecordConfig, zo
}
// EnsureZoneExists creates a zone if it does not exist
func (l *luadnsProvider) EnsureZoneExists(domain string) error {
func (l *luadnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if l.zones == nil {
if err := l.fetchDomainList(); err != nil {
return err

View file

@ -40,7 +40,7 @@ func (n *nsone) GetZone(domain string) (*dns.Zone, error) {
}
}
func (n *nsone) EnsureZoneExists(domain string) error {
func (n *nsone) EnsureZoneExists(domain string, metadata map[string]string) error {
// This enables the create-domains subcommand
zone := dns.NewZone(domain)

View file

@ -114,7 +114,7 @@ func (o *oracleProvider) ListZones() ([]string, error) {
}
// EnsureZoneExists creates a zone if it does not exist
func (o *oracleProvider) EnsureZoneExists(domain string) error {
func (o *oracleProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()

View file

@ -64,8 +64,9 @@ func (dsp *powerdnsProvider) GetZoneRecordsCorrections(dc *models.DomainConfig,
}
// EnsureZoneExists creates a zone if it does not exist
func (dsp *powerdnsProvider) EnsureZoneExists(domain string) error {
if _, err := dsp.client.Zones().GetZone(context.Background(), dsp.ServerName, canonical(domain)); err != nil {
func (dsp *powerdnsProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
domainVariant := dsp.zoneName(domain, metadata[models.DomainTag])
if _, err := dsp.client.Zones().GetZone(context.Background(), dsp.ServerName, domainVariant); err != nil {
if e, ok := err.(pdnshttp.ErrUnexpectedStatus); ok {
if e.StatusCode != http.StatusNotFound {
return err
@ -76,7 +77,7 @@ func (dsp *powerdnsProvider) EnsureZoneExists(domain string) error {
}
_, err := dsp.client.Zones().CreateZone(context.Background(), dsp.ServerName, zones.Zone{
Name: canonical(domain),
Name: domainVariant,
Type: zones.ZoneTypeZone,
DNSSec: dsp.DNSSecOnCreate,
Nameservers: dsp.DefaultNS,

View file

@ -40,7 +40,7 @@ func (dsp *powerdnsProvider) getDNSSECCorrections(dc *models.DomainConfig) ([]*m
{
Msg: "Disable DNSSEC",
F: func() error {
return dsp.client.Cryptokeys().DeleteCryptokey(context.Background(), dsp.ServerName, dc.Name, keyID)
return dsp.client.Cryptokeys().DeleteCryptokey(context.Background(), dsp.ServerName, domainVariant, keyID)
},
},
}, nil
@ -52,7 +52,7 @@ func (dsp *powerdnsProvider) getDNSSECCorrections(dc *models.DomainConfig) ([]*m
{
Msg: "Enable DNSSEC",
F: func() (err error) {
_, err = dsp.client.Cryptokeys().CreateCryptokey(context.Background(), dsp.ServerName, dc.Name, cryptokeys.Cryptokey{
_, err = dsp.client.Cryptokeys().CreateCryptokey(context.Background(), dsp.ServerName, domainVariant, cryptokeys.Cryptokey{
KeyType: "csk",
Active: true,
Published: true,

View file

@ -68,10 +68,11 @@ type powerdnsProvider struct {
// so dnscontrol "example.com!internal" becomes powerdns "example.com..internal"
// See https://doc.powerdns.com/authoritative/views.html
func (dsp *powerdnsProvider) zoneName(domain string, tag string) string {
if dsp.UseViews && tag == "" {
return canonical(domain) + "." + tag
base := canonical(domain)
if dsp.UseViews && tag != "" {
return base + "." + tag
}
return canonical(domain)
return base
}
// newDSP initializes a PowerDNS DNSServiceProvider.

View file

@ -22,7 +22,7 @@ type DNSServiceProvider interface {
// ZoneCreator should be implemented by providers that have the ability to create zones
// (used for automatically creating zones if they don't exist)
type ZoneCreator interface {
EnsureZoneExists(domain string) error
EnsureZoneExists(domain string, metadata map[string]string) error
}
// ZoneLister should be implemented by providers that have the

View file

@ -314,7 +314,7 @@ func parsePriority(priority int) int {
return priority
}
func (api *realtimeregisterAPI) EnsureZoneExists(domain string) error {
func (api *realtimeregisterAPI) EnsureZoneExists(domain string, metadata map[string]string) error {
exists, err := api.zoneExists(domain)
if err != nil {
return err

View file

@ -646,7 +646,7 @@ func unescape(s *string) string {
return name
}
func (r *route53Provider) EnsureZoneExists(domain string) error {
func (r *route53Provider) EnsureZoneExists(domain string, metadata map[string]string) error {
if err := r.getZones(); err != nil {
return err
}

View file

@ -17,7 +17,7 @@ func (s *sakuracloudProvider) ListZones() ([]string, error) {
}
// EnsureZoneExists creates a zone if it does not exist
func (s *sakuracloudProvider) EnsureZoneExists(domain string) error {
func (s *sakuracloudProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
itemMap, err := s.api.GetCommonServiceItemMap()
if err != nil {
return err

View file

@ -181,7 +181,7 @@ func (api *vultrProvider) GetNameservers(domain string) ([]*models.Nameserver, e
}
// EnsureZoneExists creates a zone if it does not exist
func (api *vultrProvider) EnsureZoneExists(domain string) error {
func (api *vultrProvider) EnsureZoneExists(domain string, metadata map[string]string) error {
if ok, err := api.isDomainInAccount(domain); err != nil {
return err
} else if ok {