From f12d4bb8d68d482d0bdf9d0aa9c747f2b5f5d620 Mon Sep 17 00:00:00 2001 From: Vatsalya Goel Date: Tue, 18 Feb 2020 20:35:13 +0400 Subject: [PATCH] Implement Get Zone for Azure DNS (#631) * Implement Get Zone for Azure DNS * Internalize getExistingRecord --- docs/_includes/matrix.html | 4 +- providers/azuredns/azureDnsProvider.go | 85 ++++++++++++++++++-------- 2 files changed, 63 insertions(+), 26 deletions(-) diff --git a/docs/_includes/matrix.html b/docs/_includes/matrix.html index 4e0f78bc5..875336fc9 100644 --- a/docs/_includes/matrix.html +++ b/docs/_includes/matrix.html @@ -907,8 +907,8 @@ - - + + diff --git a/providers/azuredns/azureDnsProvider.go b/providers/azuredns/azureDnsProvider.go index 2a55d4a5e..67dd967fb 100644 --- a/providers/azuredns/azureDnsProvider.go +++ b/providers/azuredns/azureDnsProvider.go @@ -62,23 +62,33 @@ var features = providers.DocumentationNotes{ providers.CanUseNAPTR: providers.Cannot(), providers.CanUseSSHFP: providers.Cannot(), providers.CanUseTLSA: providers.Cannot(), - providers.CanGetZones: providers.Unimplemented(), + providers.CanGetZones: providers.Can(), } func init() { providers.RegisterDomainServiceProviderType("AZURE_DNS", newAzureDnsDsp, features) } -func (a *azureDnsProvider) getZones() error { - a.zones = make(map[string]*adns.Zone) - +func (a *azureDnsProvider) getExistingZones() (*adns.ZoneListResult, error) { ctx, cancel := context.WithTimeout(context.Background(), 6000*time.Second) defer cancel() zonesIterator, zonesErr := a.zonesClient.ListByResourceGroupComplete(ctx, *a.resourceGroup, to.Int32Ptr(100)) if zonesErr != nil { - return zonesErr + return nil, zonesErr } zonesResult := zonesIterator.Response() + return &zonesResult, nil +} + +func (a *azureDnsProvider) getZones() error { + a.zones = make(map[string]*adns.Zone) + + zonesResult, err := a.getExistingZones() + + if err != nil { + return err + } + for _, z := range *zonesResult.Value { zone := z domain := strings.TrimSuffix(*z.Name, ".") @@ -111,12 +121,51 @@ func (a *azureDnsProvider) GetNameservers(domain string) ([]*models.Nameserver, return ns, nil } +func (a *azureDnsProvider) ListZones() ([]string, error) { + zonesResult, err := a.getExistingZones() + + if err != nil { + return nil, err + } + + var zones []string + + for _, z := range *zonesResult.Value { + domain := strings.TrimSuffix(*z.Name, ".") + zones = append(zones, domain) + } + + return zones, nil +} + // GetZoneRecords gets the records of a zone and returns them in RecordConfig format. -func (client *azureDnsProvider) GetZoneRecords(domain string) (models.Records, error) { - return nil, fmt.Errorf("not implemented") - // This enables the get-zones subcommand. - // Implement this by extracting the code from GetDomainCorrections into - // a single function. For most providers this should be relatively easy. +func (a *azureDnsProvider) GetZoneRecords(domain string) (models.Records, error) { + existingRecords, _, _, err := a.getExistingRecords(domain) + if err != nil { + return nil, err + } + return existingRecords, nil +} + +func (a *azureDnsProvider) getExistingRecords(domain string) (models.Records, []*adns.RecordSet, string, error) { + zone, ok := a.zones[domain] + if !ok { + return nil, nil, "", errNoExist{domain} + } + var zoneName string + zoneName = *zone.Name + records, err := a.fetchRecordSets(zoneName) + if err != nil { + return nil, nil, "", err + } + + var existingRecords models.Records + for _, set := range records { + existingRecords = append(existingRecords, nativeToRecords(set, zoneName)...) + } + + models.PostProcessRecords(existingRecords) + return existingRecords, records, zoneName, nil } func (a *azureDnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correction, error) { @@ -127,24 +176,12 @@ func (a *azureDnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod } var corrections []*models.Correction - zone, ok := a.zones[dc.Name] - if !ok { - return nil, errNoExist{dc.Name} - } - var zoneName string - zoneName = *zone.Name - records, err := a.fetchRecordSets(zoneName) + + existingRecords, records, zoneName, err := a.getExistingRecords(dc.Name) if err != nil { return nil, err } - var existingRecords []*models.RecordConfig - for _, set := range records { - existingRecords = append(existingRecords, nativeToRecords(set, dc.Name)...) - } - - models.PostProcessRecords(existingRecords) - differ := diff.New(dc) namesToUpdate := differ.ChangedGroups(existingRecords)