diff --git a/main.go b/main.go index a09e21d47..871ec1c97 100644 --- a/main.go +++ b/main.go @@ -28,6 +28,32 @@ import ( log "github.com/sirupsen/logrus" _ "k8s.io/client-go/plugin/pkg/client/auth" + "sigs.k8s.io/external-dns/provider/akamai" + "sigs.k8s.io/external-dns/provider/alibabacloud" + "sigs.k8s.io/external-dns/provider/aws" + "sigs.k8s.io/external-dns/provider/awssd" + "sigs.k8s.io/external-dns/provider/azure" + "sigs.k8s.io/external-dns/provider/cloudflare" + "sigs.k8s.io/external-dns/provider/coredns" + "sigs.k8s.io/external-dns/provider/designate" + "sigs.k8s.io/external-dns/provider/digitalocean" + "sigs.k8s.io/external-dns/provider/dnsimple" + "sigs.k8s.io/external-dns/provider/dyn" + "sigs.k8s.io/external-dns/provider/exoscale" + "sigs.k8s.io/external-dns/provider/google" + "sigs.k8s.io/external-dns/provider/infoblox" + "sigs.k8s.io/external-dns/provider/inmemory" + "sigs.k8s.io/external-dns/provider/linode" + "sigs.k8s.io/external-dns/provider/ns1" + "sigs.k8s.io/external-dns/provider/oci" + "sigs.k8s.io/external-dns/provider/ovh" + "sigs.k8s.io/external-dns/provider/pdns" + "sigs.k8s.io/external-dns/provider/rcode0" + "sigs.k8s.io/external-dns/provider/rdns" + "sigs.k8s.io/external-dns/provider/rfc2136" + "sigs.k8s.io/external-dns/provider/transip" + "sigs.k8s.io/external-dns/provider/vinyldns" + "sigs.k8s.io/external-dns/provider/vultr" "sigs.k8s.io/external-dns/controller" "sigs.k8s.io/external-dns/endpoint" @@ -123,8 +149,8 @@ func main() { var p provider.Provider switch cfg.Provider { case "akamai": - p = provider.NewAkamaiProvider( - provider.AkamaiConfig{ + p = akamai.NewAkamaiProvider( + akamai.AkamaiConfig{ DomainFilter: domainFilter, ZoneIDFilter: zoneIDFilter, ServiceConsumerDomain: cfg.AkamaiServiceConsumerDomain, @@ -135,10 +161,10 @@ func main() { }, ) case "alibabacloud": - p, err = provider.NewAlibabaCloudProvider(cfg.AlibabaCloudConfigFile, domainFilter, zoneIDFilter, cfg.AlibabaCloudZoneType, cfg.DryRun) + p, err = alibabacloud.NewAlibabaCloudProvider(cfg.AlibabaCloudConfigFile, domainFilter, zoneIDFilter, cfg.AlibabaCloudZoneType, cfg.DryRun) case "aws": - p, err = provider.NewAWSProvider( - provider.AWSConfig{ + p, err = aws.NewAWSProvider( + aws.AWSConfig{ DomainFilter: domainFilter, ZoneIDFilter: zoneIDFilter, ZoneTypeFilter: zoneTypeFilter, @@ -158,32 +184,32 @@ func main() { log.Infof("Registry \"%s\" cannot be used with AWS Cloud Map. Switching to \"aws-sd\".", cfg.Registry) cfg.Registry = "aws-sd" } - p, err = provider.NewAWSSDProvider(domainFilter, cfg.AWSZoneType, cfg.AWSAssumeRole, cfg.DryRun) + p, err = awssd.NewAWSSDProvider(domainFilter, cfg.AWSZoneType, cfg.AWSAssumeRole, cfg.DryRun) case "azure-dns", "azure": - p, err = provider.NewAzureProvider(cfg.AzureConfigFile, domainFilter, zoneIDFilter, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.DryRun) + p, err = azure.NewAzureProvider(cfg.AzureConfigFile, domainFilter, zoneIDFilter, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.DryRun) case "azure-private-dns": - p, err = provider.NewAzurePrivateDNSProvider(domainFilter, zoneIDFilter, cfg.AzureResourceGroup, cfg.AzureSubscriptionID, cfg.DryRun) + p, err = azure.NewAzurePrivateDNSProvider(domainFilter, zoneIDFilter, cfg.AzureResourceGroup, cfg.AzureSubscriptionID, cfg.DryRun) case "vinyldns": - p, err = provider.NewVinylDNSProvider(domainFilter, zoneIDFilter, cfg.DryRun) + p, err = vinyldns.NewVinylDNSProvider(domainFilter, zoneIDFilter, cfg.DryRun) case "vultr": - p, err = provider.NewVultrProvider(domainFilter, cfg.DryRun) + p, err = vultr.NewVultrProvider(domainFilter, cfg.DryRun) case "cloudflare": - p, err = provider.NewCloudFlareProvider(domainFilter, zoneIDFilter, cfg.CloudflareZonesPerPage, cfg.CloudflareProxied, cfg.DryRun) + p, err = cloudflare.NewCloudFlareProvider(domainFilter, zoneIDFilter, cfg.CloudflareZonesPerPage, cfg.CloudflareProxied, cfg.DryRun) case "rcodezero": - p, err = provider.NewRcodeZeroProvider(domainFilter, cfg.DryRun, cfg.RcodezeroTXTEncrypt) + p, err = rcode0.NewRcodeZeroProvider(domainFilter, cfg.DryRun, cfg.RcodezeroTXTEncrypt) case "google": - p, err = provider.NewGoogleProvider(ctx, cfg.GoogleProject, domainFilter, zoneIDFilter, cfg.GoogleBatchChangeSize, cfg.GoogleBatchChangeInterval, cfg.DryRun) + p, err = google.NewGoogleProvider(ctx, cfg.GoogleProject, domainFilter, zoneIDFilter, cfg.GoogleBatchChangeSize, cfg.GoogleBatchChangeInterval, cfg.DryRun) case "digitalocean": - p, err = provider.NewDigitalOceanProvider(ctx, domainFilter, cfg.DryRun) + p, err = digitalocean.NewDigitalOceanProvider(ctx, domainFilter, cfg.DryRun) case "ovh": - p, err = provider.NewOVHProvider(ctx, domainFilter, cfg.OVHEndpoint, cfg.DryRun) + p, err = ovh.NewOVHProvider(ctx, domainFilter, cfg.OVHEndpoint, cfg.DryRun) case "linode": - p, err = provider.NewLinodeProvider(domainFilter, cfg.DryRun, externaldns.Version) + p, err = linode.NewLinodeProvider(domainFilter, cfg.DryRun, externaldns.Version) case "dnsimple": - p, err = provider.NewDnsimpleProvider(domainFilter, zoneIDFilter, cfg.DryRun) + p, err = dnsimple.NewDnsimpleProvider(domainFilter, zoneIDFilter, cfg.DryRun) case "infoblox": - p, err = provider.NewInfobloxProvider( - provider.InfobloxConfig{ + p, err = infoblox.NewInfobloxProvider( + infoblox.InfobloxConfig{ DomainFilter: domainFilter, ZoneIDFilter: zoneIDFilter, Host: cfg.InfobloxGridHost, @@ -198,8 +224,8 @@ func main() { }, ) case "dyn": - p, err = provider.NewDynProvider( - provider.DynConfig{ + p, err = dyn.NewDynProvider( + dyn.DynConfig{ DomainFilter: domainFilter, ZoneIDFilter: zoneIDFilter, DryRun: cfg.DryRun, @@ -211,29 +237,29 @@ func main() { }, ) case "coredns", "skydns": - p, err = provider.NewCoreDNSProvider(domainFilter, cfg.CoreDNSPrefix, cfg.DryRun) + p, err = coredns.NewCoreDNSProvider(domainFilter, cfg.CoreDNSPrefix, cfg.DryRun) case "rdns": - p, err = provider.NewRDNSProvider( - provider.RDNSConfig{ + p, err = rdns.NewRDNSProvider( + rdns.RDNSConfig{ DomainFilter: domainFilter, DryRun: cfg.DryRun, }, ) case "exoscale": - p, err = provider.NewExoscaleProvider(cfg.ExoscaleEndpoint, cfg.ExoscaleAPIKey, cfg.ExoscaleAPISecret, cfg.DryRun, provider.ExoscaleWithDomain(domainFilter), provider.ExoscaleWithLogging()), nil + p, err = exoscale.NewExoscaleProvider(cfg.ExoscaleEndpoint, cfg.ExoscaleAPIKey, cfg.ExoscaleAPISecret, cfg.DryRun, exoscale.ExoscaleWithDomain(domainFilter), exoscale.ExoscaleWithLogging()), nil case "inmemory": - p, err = provider.NewInMemoryProvider(provider.InMemoryInitZones(cfg.InMemoryZones), provider.InMemoryWithDomain(domainFilter), provider.InMemoryWithLogging()), nil + p, err = inmemory.NewInMemoryProvider(inmemory.InMemoryInitZones(cfg.InMemoryZones), inmemory.InMemoryWithDomain(domainFilter), inmemory.InMemoryWithLogging()), nil case "designate": - p, err = provider.NewDesignateProvider(domainFilter, cfg.DryRun) + p, err = designate.NewDesignateProvider(domainFilter, cfg.DryRun) case "pdns": - p, err = provider.NewPDNSProvider( + p, err = pdns.NewPDNSProvider( ctx, - provider.PDNSConfig{ + pdns.PDNSConfig{ DomainFilter: domainFilter, DryRun: cfg.DryRun, Server: cfg.PDNSServer, APIKey: cfg.PDNSAPIKey, - TLSConfig: provider.TLSConfig{ + TLSConfig: pdns.TLSConfig{ TLSEnabled: cfg.PDNSTLSEnabled, CAFilePath: cfg.TLSCA, ClientCertFilePath: cfg.TLSClientCert, @@ -242,16 +268,16 @@ func main() { }, ) case "oci": - var config *provider.OCIConfig - config, err = provider.LoadOCIConfig(cfg.OCIConfigFile) + var config *oci.OCIConfig + config, err = oci.LoadOCIConfig(cfg.OCIConfigFile) if err == nil { - p, err = provider.NewOCIProvider(*config, domainFilter, zoneIDFilter, cfg.DryRun) + p, err = oci.NewOCIProvider(*config, domainFilter, zoneIDFilter, cfg.DryRun) } case "rfc2136": - p, err = provider.NewRfc2136Provider(cfg.RFC2136Host, cfg.RFC2136Port, cfg.RFC2136Zone, cfg.RFC2136Insecure, cfg.RFC2136TSIGKeyName, cfg.RFC2136TSIGSecret, cfg.RFC2136TSIGSecretAlg, cfg.RFC2136TAXFR, domainFilter, cfg.DryRun, cfg.RFC2136MinTTL, nil) + p, err = rfc2136.NewRfc2136Provider(cfg.RFC2136Host, cfg.RFC2136Port, cfg.RFC2136Zone, cfg.RFC2136Insecure, cfg.RFC2136TSIGKeyName, cfg.RFC2136TSIGSecret, cfg.RFC2136TSIGSecretAlg, cfg.RFC2136TAXFR, domainFilter, cfg.DryRun, cfg.RFC2136MinTTL, nil) case "ns1": - p, err = provider.NewNS1Provider( - provider.NS1Config{ + p, err = ns1.NewNS1Provider( + ns1.NS1Config{ DomainFilter: domainFilter, ZoneIDFilter: zoneIDFilter, NS1Endpoint: cfg.NS1Endpoint, @@ -260,7 +286,7 @@ func main() { }, ) case "transip": - p, err = provider.NewTransIPProvider(cfg.TransIPAccountName, cfg.TransIPPrivateKeyFile, domainFilter, cfg.DryRun) + p, err = transip.NewTransIPProvider(cfg.TransIPAccountName, cfg.TransIPPrivateKeyFile, domainFilter, cfg.DryRun) default: log.Fatalf("unknown dns provider: %s", cfg.Provider) } @@ -275,7 +301,7 @@ func main() { case "txt": r, err = registry.NewTXTRegistry(p, cfg.TXTPrefix, cfg.TXTOwnerID, cfg.TXTCacheInterval) case "aws-sd": - r, err = registry.NewAWSSDRegistry(p.(*provider.AWSSDProvider), cfg.TXTOwnerID) + r, err = registry.NewAWSSDRegistry(p.(*awssd.AWSSDProvider), cfg.TXTOwnerID) default: log.Fatalf("unknown registry: %s", cfg.Registry) } diff --git a/provider/akamai.go b/provider/akamai/akamai.go similarity index 94% rename from provider/akamai.go rename to provider/akamai/akamai.go index fe5e0aab1..9e3c72088 100644 --- a/provider/akamai.go +++ b/provider/akamai/akamai.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package akamai import ( "bytes" @@ -30,6 +30,7 @@ import ( log "github.com/sirupsen/logrus" "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) type akamaiClient interface { @@ -50,7 +51,7 @@ func (*akamaiOpenClient) Do(config edgegrid.Config, req *http.Request) (*http.Re // AkamaiConfig clarifies the method signature type AkamaiConfig struct { DomainFilter endpoint.DomainFilter - ZoneIDFilter ZoneIDFilter + ZoneIDFilter provider.ZoneIDFilter ServiceConsumerDomain string ClientToken string ClientSecret string @@ -61,7 +62,7 @@ type AkamaiConfig struct { // AkamaiProvider implements the DNS provider for Akamai. type AkamaiProvider struct { domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter config edgegrid.Config dryRun bool client akamaiClient @@ -226,7 +227,7 @@ func (p *AkamaiProvider) Records(context.Context) (endpoints []*endpoint.Endpoin // ApplyChanges applies a given set of changes in a given zone. func (p *AkamaiProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) error { - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} zones, err := p.fetchZones() if err != nil { log.Warnf("No zones to fetch endpoints from!") @@ -289,7 +290,7 @@ func (p *AkamaiProvider) newAkamaiRecord(dnsName, recordType string, targets ... } } -func (p *AkamaiProvider) createRecords(zoneNameIDMapper zoneIDName, endpoints []*endpoint.Endpoint) (created []*endpoint.Endpoint, failed []*endpoint.Endpoint) { +func (p *AkamaiProvider) createRecords(zoneNameIDMapper provider.ZoneIDName, endpoints []*endpoint.Endpoint) (created []*endpoint.Endpoint, failed []*endpoint.Endpoint) { for _, endpoint := range endpoints { if !p.domainFilter.Match(endpoint.DNSName) { @@ -320,7 +321,7 @@ func (p *AkamaiProvider) createRecords(zoneNameIDMapper zoneIDName, endpoints [] return created, failed } -func (p *AkamaiProvider) deleteRecords(zoneNameIDMapper zoneIDName, endpoints []*endpoint.Endpoint) (deleted []*endpoint.Endpoint, failed []*endpoint.Endpoint) { +func (p *AkamaiProvider) deleteRecords(zoneNameIDMapper provider.ZoneIDName, endpoints []*endpoint.Endpoint) (deleted []*endpoint.Endpoint, failed []*endpoint.Endpoint) { for _, endpoint := range endpoints { if !p.domainFilter.Match(endpoint.DNSName) { @@ -349,7 +350,7 @@ func (p *AkamaiProvider) deleteRecords(zoneNameIDMapper zoneIDName, endpoints [] return deleted, failed } -func (p *AkamaiProvider) updateNewRecords(zoneNameIDMapper zoneIDName, endpoints []*endpoint.Endpoint) (updated []*endpoint.Endpoint, failed []*endpoint.Endpoint) { +func (p *AkamaiProvider) updateNewRecords(zoneNameIDMapper provider.ZoneIDName, endpoints []*endpoint.Endpoint) (updated []*endpoint.Endpoint, failed []*endpoint.Endpoint) { for _, endpoint := range endpoints { if !p.domainFilter.Match(endpoint.DNSName) { diff --git a/provider/akamai_test.go b/provider/akamai/akamai_test.go similarity index 99% rename from provider/akamai_test.go rename to provider/akamai/akamai_test.go index 525c283bf..bc336e8d6 100644 --- a/provider/akamai_test.go +++ b/provider/akamai/akamai_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package akamai import ( "bytes" diff --git a/provider/alibaba_cloud.go b/provider/alibabacloud/alibaba_cloud.go similarity index 98% rename from provider/alibaba_cloud.go rename to provider/alibabacloud/alibaba_cloud.go index eb78bc987..79a8351ff 100644 --- a/provider/alibaba_cloud.go +++ b/provider/alibabacloud/alibaba_cloud.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package alibabacloud import ( "context" @@ -33,6 +33,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -67,7 +68,7 @@ type AlibabaCloudPrivateZoneAPI interface { // AlibabaCloudProvider implements the DNS provider for Alibaba Cloud. type AlibabaCloudProvider struct { domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter // Private Zone only + zoneIDFilter provider.ZoneIDFilter // Private Zone only MaxChangeCount int EvaluateTargetHealth bool AssumeRole string @@ -93,7 +94,7 @@ type alibabaCloudConfig struct { // NewAlibabaCloudProvider creates a new Alibaba Cloud provider. // // Returns the provider or an error if a provider could not be created. -func NewAlibabaCloudProvider(configFile string, domainFilter endpoint.DomainFilter, zoneIDFileter ZoneIDFilter, zoneType string, dryRun bool) (*AlibabaCloudProvider, error) { +func NewAlibabaCloudProvider(configFile string, domainFilter endpoint.DomainFilter, zoneIDFileter provider.ZoneIDFilter, zoneType string, dryRun bool) (*AlibabaCloudProvider, error) { cfg := alibabaCloudConfig{} if configFile != "" { contents, err := ioutil.ReadFile(configFile) @@ -457,7 +458,7 @@ func (p *AlibabaCloudProvider) getDomainRecords(domainName string) ([]alidns.Rec continue } - if !supportedRecordType(recordType) { + if !provider.SupportedRecordType(recordType) { continue } @@ -802,7 +803,7 @@ func (p *AlibabaCloudProvider) getPrivateZones() (map[string]*alibabaPrivateZone recordType := record.Type - if !supportedRecordType(recordType) { + if !provider.SupportedRecordType(recordType) { continue } diff --git a/provider/alibaba_cloud_test.go b/provider/alibabacloud/alibaba_cloud_test.go similarity index 99% rename from provider/alibaba_cloud_test.go rename to provider/alibabacloud/alibaba_cloud_test.go index 6ed419ead..387867850 100644 --- a/provider/alibaba_cloud_test.go +++ b/provider/alibabacloud/alibaba_cloud_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package alibabacloud import ( "context" diff --git a/provider/aws.go b/provider/aws/aws.go similarity index 98% rename from provider/aws.go rename to provider/aws/aws.go index 50e983040..91961c9e1 100644 --- a/provider/aws.go +++ b/provider/aws/aws.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package aws import ( "context" @@ -34,6 +34,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -121,20 +122,20 @@ type AWSProvider struct { // only consider hosted zones managing domains ending in this suffix domainFilter endpoint.DomainFilter // filter hosted zones by id - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter // filter hosted zones by type (e.g. private or public) - zoneTypeFilter ZoneTypeFilter + zoneTypeFilter provider.ZoneTypeFilter // filter hosted zones by tags - zoneTagFilter ZoneTagFilter + zoneTagFilter provider.ZoneTagFilter preferCNAME bool } // AWSConfig contains configuration to create a new AWS provider. type AWSConfig struct { DomainFilter endpoint.DomainFilter - ZoneIDFilter ZoneIDFilter - ZoneTypeFilter ZoneTypeFilter - ZoneTagFilter ZoneTagFilter + ZoneIDFilter provider.ZoneIDFilter + ZoneTypeFilter provider.ZoneTypeFilter + ZoneTagFilter provider.ZoneTagFilter BatchChangeSize int BatchChangeInterval time.Duration EvaluateTargetHealth bool @@ -266,7 +267,7 @@ func (p *AWSProvider) records(ctx context.Context, zones map[string]*route53.Hos // TODO(linki, ownership): Remove once ownership system is in place. // See: https://github.com/kubernetes-sigs/external-dns/pull/122/files/74e2c3d3e237411e619aefc5aab694742001cdec#r109863370 - if !supportedRecordType(aws.StringValue(r.Type)) { + if !provider.SupportedRecordType(aws.StringValue(r.Type)) { continue } @@ -377,7 +378,7 @@ func (p *AWSProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) e return err } - records, ok := ctx.Value(RecordsContextKey).([]*endpoint.Endpoint) + records, ok := ctx.Value(provider.RecordsContextKey).([]*endpoint.Endpoint) if !ok { var err error records, err = p.records(ctx, zones) @@ -662,7 +663,7 @@ func changesByZone(zones map[string]*route53.HostedZone, changeSet []*route53.Ch } for _, c := range changeSet { - hostname := ensureTrailingDot(aws.StringValue(c.ResourceRecordSet.Name)) + hostname := provider.EnsureTrailingDot(aws.StringValue(c.ResourceRecordSet.Name)) zones := suitableZones(hostname, zones) if len(zones) == 0 { diff --git a/provider/aws_test.go b/provider/aws/aws_test.go similarity index 99% rename from provider/aws_test.go rename to provider/aws/aws_test.go index 199154de4..a81229406 100644 --- a/provider/aws_test.go +++ b/provider/aws/aws_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package aws import ( "context" diff --git a/provider/aws_sd.go b/provider/awssd/aws_sd.go similarity index 99% rename from provider/aws_sd.go rename to provider/awssd/aws_sd.go index 149d8e41e..15eb64c52 100644 --- a/provider/aws_sd.go +++ b/provider/awssd/aws_sd.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package awssd import ( "context" diff --git a/provider/aws_sd_test.go b/provider/awssd/aws_sd_test.go similarity index 99% rename from provider/aws_sd_test.go rename to provider/awssd/aws_sd_test.go index 9e85cddf5..53addc2fc 100644 --- a/provider/aws_sd_test.go +++ b/provider/awssd/aws_sd_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package awssd import ( "context" diff --git a/provider/azure.go b/provider/azure/azure.go similarity index 97% rename from provider/azure.go rename to provider/azure/azure.go index dc58a778a..6fb819f88 100644 --- a/provider/azure.go +++ b/provider/azure/azure.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package azure import ( "context" @@ -34,6 +34,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -67,7 +68,7 @@ type RecordSetsClient interface { // AzureProvider implements the DNS provider for Microsoft's Azure cloud platform. type AzureProvider struct { domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter dryRun bool resourceGroup string userAssignedIdentityClientID string @@ -78,7 +79,7 @@ type AzureProvider struct { // NewAzureProvider creates a new Azure provider. // // Returns the provider or an error if a provider could not be created. -func NewAzureProvider(configFile string, domainFilter endpoint.DomainFilter, zoneIDFilter ZoneIDFilter, resourceGroup string, userAssignedIdentityClientID string, dryRun bool) (*AzureProvider, error) { +func NewAzureProvider(configFile string, domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, resourceGroup string, userAssignedIdentityClientID string, dryRun bool) (*AzureProvider, error) { contents, err := ioutil.ReadFile(configFile) if err != nil { return nil, fmt.Errorf("failed to read Azure config file '%s': %v", configFile, err) @@ -199,7 +200,7 @@ func (p *AzureProvider) Records(ctx context.Context) (endpoints []*endpoint.Endp return true } recordType := strings.TrimPrefix(*recordSet.Type, "Microsoft.Network/dnszones/") - if !supportedRecordType(recordType) { + if !provider.SupportedRecordType(recordType) { return true } name := formatAzureDNSName(*recordSet.Name, *zone.Name) @@ -300,7 +301,7 @@ func (p *AzureProvider) mapChanges(zones []dns.Zone, changes *plan.Changes) (azu ignored := map[string]bool{} deleted := azureChangeMap{} updated := azureChangeMap{} - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { if z.Name != nil { zoneNameIDMapper.Add(*z.Name, *z.Name) diff --git a/provider/azure_private_dns.go b/provider/azure/azure_private_dns.go similarity index 97% rename from provider/azure_private_dns.go rename to provider/azure/azure_private_dns.go index 61588bee8..f4c8fd0a1 100644 --- a/provider/azure_private_dns.go +++ b/provider/azure/azure_private_dns.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package azure import ( "context" @@ -29,6 +29,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) // PrivateZonesClient is an interface of privatedns.PrivateZoneClient that can be stubbed for testing. @@ -46,7 +47,7 @@ type PrivateRecordSetsClient interface { // AzurePrivateDNSProvider implements the DNS provider for Microsoft's Azure Private DNS service type AzurePrivateDNSProvider struct { domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter dryRun bool subscriptionID string resourceGroup string @@ -57,7 +58,7 @@ type AzurePrivateDNSProvider struct { // NewAzurePrivateDNSProvider creates a new Azure Private DNS provider. // // Returns the provider or an error if a provider could not be created. -func NewAzurePrivateDNSProvider(domainFilter endpoint.DomainFilter, zoneIDFilter ZoneIDFilter, resourceGroup string, subscriptionID string, dryRun bool) (*AzurePrivateDNSProvider, error) { +func NewAzurePrivateDNSProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, resourceGroup string, subscriptionID string, dryRun bool) (*AzurePrivateDNSProvider, error) { authorizer, err := auth.NewAuthorizerFromEnvironment() if err != nil { return nil, err @@ -208,7 +209,7 @@ func (p *AzurePrivateDNSProvider) mapChanges(zones []privatedns.PrivateZone, cha ignored := map[string]bool{} deleted := azurePrivateDNSChangeMap{} updated := azurePrivateDNSChangeMap{} - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { if z.Name != nil { zoneNameIDMapper.Add(*z.Name, *z.Name) diff --git a/provider/azure_privatedns_test.go b/provider/azure/azure_privatedns_test.go similarity index 99% rename from provider/azure_privatedns_test.go rename to provider/azure/azure_privatedns_test.go index df2499080..db1b188c1 100644 --- a/provider/azure_privatedns_test.go +++ b/provider/azure/azure_privatedns_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package azure import ( "context" diff --git a/provider/azure_test.go b/provider/azure/azure_test.go similarity index 99% rename from provider/azure_test.go rename to provider/azure/azure_test.go index 45de8244e..6c1466009 100644 --- a/provider/azure_test.go +++ b/provider/azure/azure_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package azure import ( "context" diff --git a/provider/cloudflare.go b/provider/cloudflare/cloudflare.go similarity index 97% rename from provider/cloudflare.go rename to provider/cloudflare/cloudflare.go index 5fbf19351..2edbaf624 100644 --- a/provider/cloudflare.go +++ b/provider/cloudflare/cloudflare.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package cloudflare import ( "context" @@ -29,6 +29,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" "sigs.k8s.io/external-dns/source" ) @@ -103,7 +104,7 @@ type CloudFlareProvider struct { Client cloudFlareDNS // only consider hosted zones managing domains ending in this suffix domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter proxiedByDefault bool DryRun bool PaginationOptions cloudflare.PaginationOptions @@ -116,7 +117,7 @@ type cloudFlareChange struct { } // NewCloudFlareProvider initializes a new CloudFlare DNS based Provider. -func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter ZoneIDFilter, zonesPerPage int, proxiedByDefault bool, dryRun bool) (*CloudFlareProvider, error) { +func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, zonesPerPage int, proxiedByDefault bool, dryRun bool) (*CloudFlareProvider, error) { // initialize via chosen auth method and returns new API object var ( config *cloudflare.API @@ -273,7 +274,7 @@ func (p *CloudFlareProvider) submitChanges(ctx context.Context, changes []*cloud // changesByZone separates a multi-zone change into a single change per zone. func (p *CloudFlareProvider) changesByZone(zones []cloudflare.Zone, changeSet []*cloudFlareChange) map[string][]*cloudFlareChange { changes := make(map[string][]*cloudFlareChange) - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { zoneNameIDMapper.Add(z.ID, z.Name) @@ -368,7 +369,7 @@ func groupByNameAndType(records []cloudflare.DNSRecord) []*endpoint.Endpoint { groups := map[string][]cloudflare.DNSRecord{} for _, r := range records { - if !supportedRecordType(r.Type) { + if !provider.SupportedRecordType(r.Type) { continue } diff --git a/provider/cloudflare_test.go b/provider/cloudflare/cloudflare_test.go similarity index 99% rename from provider/cloudflare_test.go rename to provider/cloudflare/cloudflare_test.go index 93ed53d29..ccefba797 100644 --- a/provider/cloudflare_test.go +++ b/provider/cloudflare/cloudflare_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package cloudflare import ( "context" diff --git a/provider/coredns.go b/provider/coredns/coredns.go similarity index 99% rename from provider/coredns.go rename to provider/coredns/coredns.go index fc4dc9188..b101369a4 100644 --- a/provider/coredns.go +++ b/provider/coredns/coredns.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package coredns import ( "context" @@ -35,6 +35,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) func init() { @@ -244,7 +245,7 @@ func newETCDClient() (coreDNSClient, error) { } // NewCoreDNSProvider is a CoreDNS provider constructor -func NewCoreDNSProvider(domainFilter endpoint.DomainFilter, prefix string, dryRun bool) (Provider, error) { +func NewCoreDNSProvider(domainFilter endpoint.DomainFilter, prefix string, dryRun bool) (provider.Provider, error) { client, err := newETCDClient() if err != nil { return nil, err diff --git a/provider/coredns_test.go b/provider/coredns/coredns_test.go similarity index 99% rename from provider/coredns_test.go rename to provider/coredns/coredns_test.go index 380563e49..84f124ac5 100644 --- a/provider/coredns_test.go +++ b/provider/coredns/coredns_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package coredns import ( "context" diff --git a/provider/designate.go b/provider/designate/designate.go similarity index 99% rename from provider/designate.go rename to provider/designate/designate.go index 5d878dfb3..f6b4e51ad 100644 --- a/provider/designate.go +++ b/provider/designate/designate.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package designate import ( "context" @@ -35,6 +35,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/pkg/tlsutils" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -234,7 +235,7 @@ type designateProvider struct { } // NewDesignateProvider is a factory function for OpenStack designate providers -func NewDesignateProvider(domainFilter endpoint.DomainFilter, dryRun bool) (Provider, error) { +func NewDesignateProvider(domainFilter endpoint.DomainFilter, dryRun bool) (provider.Provider, error) { client, err := newDesignateClient() if err != nil { return nil, err diff --git a/provider/designate_test.go b/provider/designate/designate_test.go similarity index 99% rename from provider/designate_test.go rename to provider/designate/designate_test.go index a37225c2f..943dc4057 100644 --- a/provider/designate_test.go +++ b/provider/designate/designate_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package designate import ( "context" diff --git a/provider/digital_ocean.go b/provider/digitalocean/digital_ocean.go similarity index 98% rename from provider/digital_ocean.go rename to provider/digitalocean/digital_ocean.go index 1426baee3..9cad43f0a 100644 --- a/provider/digital_ocean.go +++ b/provider/digitalocean/digital_ocean.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package digitalocean import ( "context" @@ -28,6 +28,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -107,7 +108,7 @@ func (p *DigitalOceanProvider) Records(ctx context.Context) ([]*endpoint.Endpoin } for _, r := range records { - if supportedRecordType(r.Type) { + if provider.SupportedRecordType(r.Type) { name := r.Name + "." + zone.Name // root name is identified by @ and should be @@ -314,7 +315,7 @@ func (p *DigitalOceanProvider) getRecordID(records []godo.DomainRecord, record g // digitalOceanchangesByZone separates a multi-zone change into a single change per zone. func digitalOceanChangesByZone(zones []godo.Domain, changeSet []*DigitalOceanChange) map[string][]*DigitalOceanChange { changes := make(map[string][]*DigitalOceanChange) - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { zoneNameIDMapper.Add(z.Name, z.Name) changes[z.Name] = []*DigitalOceanChange{} diff --git a/provider/digital_ocean_test.go b/provider/digitalocean/digital_ocean_test.go similarity index 99% rename from provider/digital_ocean_test.go rename to provider/digitalocean/digital_ocean_test.go index 2d4740ffb..590f143e1 100644 --- a/provider/digital_ocean_test.go +++ b/provider/digitalocean/digital_ocean_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package digitalocean import ( "context" diff --git a/provider/dnsimple.go b/provider/dnsimple/dnsimple.go similarity index 98% rename from provider/dnsimple.go rename to provider/dnsimple/dnsimple.go index 77ef974e9..8969e1ea8 100644 --- a/provider/dnsimple.go +++ b/provider/dnsimple/dnsimple.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package dnsimple import ( "context" @@ -28,6 +28,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const dnsimpleRecordTTL = 3600 // Default TTL of 1 hour if not set (DNSimple's default) @@ -88,7 +89,7 @@ type dnsimpleProvider struct { identity identityService accountID string domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter dryRun bool } @@ -104,7 +105,7 @@ const ( ) // NewDnsimpleProvider initializes a new Dnsimple based provider -func NewDnsimpleProvider(domainFilter endpoint.DomainFilter, zoneIDFilter ZoneIDFilter, dryRun bool) (Provider, error) { +func NewDnsimpleProvider(domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, dryRun bool) (provider.Provider, error) { oauthToken := os.Getenv("DNSIMPLE_OAUTH") if len(oauthToken) == 0 { return nil, fmt.Errorf("No dnsimple oauth token provided") diff --git a/provider/dnsimple_test.go b/provider/dnsimple/dnsimple_test.go similarity index 99% rename from provider/dnsimple_test.go rename to provider/dnsimple/dnsimple_test.go index ec87f4ba1..600c0ad3d 100644 --- a/provider/dnsimple_test.go +++ b/provider/dnsimple/dnsimple_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package dnsimple import ( "context" diff --git a/provider/dyn.go b/provider/dyn/dyn.go similarity index 98% rename from provider/dyn.go rename to provider/dyn/dyn.go index 5829623de..bea6d9675 100644 --- a/provider/dyn.go +++ b/provider/dyn/dyn.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package dyn import ( "context" @@ -31,6 +31,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -57,7 +58,7 @@ func unixNow() int64 { // DynConfig hold connection parameters to dyn.com and internal state type DynConfig struct { DomainFilter endpoint.DomainFilter - ZoneIDFilter ZoneIDFilter + ZoneIDFilter provider.ZoneIDFilter DryRun bool CustomerName string Username string @@ -141,7 +142,7 @@ type ZonePublishResponse struct { } // NewDynProvider initializes a new Dyn Provider. -func NewDynProvider(config DynConfig) (Provider, error) { +func NewDynProvider(config DynConfig) (provider.Provider, error) { return &dynProviderState{ DynConfig: config, ZoneSnapshot: &ZoneSnapshot{ @@ -404,7 +405,7 @@ func (d *dynProviderState) buildLinkToRecord(ep *endpoint.Endpoint) string { return "" } var matchingZone = "" - for _, zone := range d.ZoneIDFilter.zoneIDs { + for _, zone := range d.ZoneIDFilter.ZoneIDs { // FIXME this should not access directly the ZoneIDs if strings.HasSuffix(ep.DNSName, zone) { matchingZone = zone break @@ -460,7 +461,7 @@ func (d *dynProviderState) login() (*dynect.Client, error) { // the zones we are allowed to touch. Currently only exact matches are considered, not all // zones with the given suffix func (d *dynProviderState) zones(client *dynect.Client) []string { - return d.ZoneIDFilter.zoneIDs + return d.ZoneIDFilter.ZoneIDs // FIXME this should not access directly the ZoneIDs, no other provider does } func (d *dynProviderState) buildRecordRequest(ep *endpoint.Endpoint) (string, *dynect.RecordRequest) { diff --git a/provider/dyn_test.go b/provider/dyn/dyn_test.go similarity index 99% rename from provider/dyn_test.go rename to provider/dyn/dyn_test.go index 766a275cd..89bce9174 100644 --- a/provider/dyn_test.go +++ b/provider/dyn/dyn_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package dyn import ( "errors" diff --git a/provider/exoscale.go b/provider/exoscale/exoscale.go similarity index 87% rename from provider/exoscale.go rename to provider/exoscale/exoscale.go index 636ded342..a37c4f51a 100644 --- a/provider/exoscale.go +++ b/provider/exoscale/exoscale.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package exoscale import ( "context" @@ -257,3 +257,39 @@ func (f *zoneFilter) EndpointZoneID(endpoint *endpoint.Endpoint, zones map[int64 } return matchZoneID, name } + +// TODO see if we need tests for this, I copied over the dyn provider. Another option is to make this a helper function +func merge(updateOld, updateNew []*endpoint.Endpoint) []*endpoint.Endpoint { + findMatch := func(template *endpoint.Endpoint) *endpoint.Endpoint { + for _, new := range updateNew { + if template.DNSName == new.DNSName && + template.RecordType == new.RecordType { + return new + } + } + return nil + } + + var result []*endpoint.Endpoint + for _, old := range updateOld { + matchingNew := findMatch(old) + if matchingNew == nil { + // no match, shouldn't happen + continue + } + + if !matchingNew.Targets.Same(old.Targets) { + // new target: always update, TTL will be overwritten too if necessary + result = append(result, matchingNew) + continue + } + + if matchingNew.RecordTTL != 0 && matchingNew.RecordTTL != old.RecordTTL { + // same target, but new non-zero TTL set in k8s, must update + // probably would happen only if there is a bug in the code calling the provider + result = append(result, matchingNew) + } + } + + return result +} diff --git a/provider/exoscale_test.go b/provider/exoscale/exoscale_test.go similarity index 99% rename from provider/exoscale_test.go rename to provider/exoscale/exoscale_test.go index 7a33bd9a1..2c99ce457 100644 --- a/provider/exoscale_test.go +++ b/provider/exoscale/exoscale_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package exoscale import ( "context" diff --git a/provider/google.go b/provider/google/google.go similarity index 95% rename from provider/google.go rename to provider/google/google.go index 59245bc8f..9a023c169 100644 --- a/provider/google.go +++ b/provider/google/google.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package google import ( "context" @@ -33,6 +33,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -109,7 +110,7 @@ type GoogleProvider struct { // only consider hosted zones managing domains ending in this suffix domainFilter endpoint.DomainFilter // only consider hosted zones ending with this zone id - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter // A client for managing resource record sets resourceRecordSetsClient resourceRecordSetsClientInterface // A client for managing hosted zones @@ -121,7 +122,7 @@ type GoogleProvider struct { } // NewGoogleProvider initializes a new Google CloudDNS based Provider. -func NewGoogleProvider(ctx context.Context, project string, domainFilter endpoint.DomainFilter, zoneIDFilter ZoneIDFilter, batchChangeSize int, batchChangeInterval time.Duration, dryRun bool) (*GoogleProvider, error) { +func NewGoogleProvider(ctx context.Context, project string, domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, batchChangeSize int, batchChangeInterval time.Duration, dryRun bool) (*GoogleProvider, error) { gcloud, err := google.DefaultClient(ctx, dns.NdevClouddnsReadwriteScope) if err != nil { return nil, err @@ -209,7 +210,7 @@ func (p *GoogleProvider) Records(ctx context.Context) (endpoints []*endpoint.End f := func(resp *dns.ResourceRecordSetsListResponse) error { for _, r := range resp.Rrsets { - if !supportedRecordType(r.Type) { + if !provider.SupportedRecordType(r.Type) { continue } endpoints = append(endpoints, endpoint.NewEndpointWithTTL(r.Name, r.Type, endpoint.TTL(r.Ttl), r.Rrdatas...)) @@ -398,7 +399,7 @@ func batchChange(change *dns.Change, batchSize int) []*dns.Change { // separateChange separates a multi-zone change into a single change per zone. func separateChange(zones map[string]*dns.ManagedZone, change *dns.Change) map[string]*dns.Change { changes := make(map[string]*dns.Change) - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { zoneNameIDMapper[z.Name] = z.DnsName changes[z.Name] = &dns.Change{ @@ -407,7 +408,7 @@ func separateChange(zones map[string]*dns.ManagedZone, change *dns.Change) map[s } } for _, a := range change.Additions { - if zoneName, _ := zoneNameIDMapper.FindZone(ensureTrailingDot(a.Name)); zoneName != "" { + if zoneName, _ := zoneNameIDMapper.FindZone(provider.EnsureTrailingDot(a.Name)); zoneName != "" { changes[zoneName].Additions = append(changes[zoneName].Additions, a) } else { log.Warnf("No matching zone for record addition: %s %s %s %d", a.Name, a.Type, a.Rrdatas, a.Ttl) @@ -415,7 +416,7 @@ func separateChange(zones map[string]*dns.ManagedZone, change *dns.Change) map[s } for _, d := range change.Deletions { - if zoneName, _ := zoneNameIDMapper.FindZone(ensureTrailingDot(d.Name)); zoneName != "" { + if zoneName, _ := zoneNameIDMapper.FindZone(provider.EnsureTrailingDot(d.Name)); zoneName != "" { changes[zoneName].Deletions = append(changes[zoneName].Deletions, d) } else { log.Warnf("No matching zone for record deletion: %s %s %s %d", d.Name, d.Type, d.Rrdatas, d.Ttl) @@ -440,7 +441,7 @@ func newRecord(ep *endpoint.Endpoint) *dns.ResourceRecordSet { targets := make([]string, len(ep.Targets)) copy(targets, []string(ep.Targets)) if ep.RecordType == endpoint.RecordTypeCNAME { - targets[0] = ensureTrailingDot(targets[0]) + targets[0] = provider.EnsureTrailingDot(targets[0]) } // no annotation results in a Ttl of 0, default to 300 for backwards-compatibility @@ -450,7 +451,7 @@ func newRecord(ep *endpoint.Endpoint) *dns.ResourceRecordSet { } return &dns.ResourceRecordSet{ - Name: ensureTrailingDot(ep.DNSName), + Name: provider.EnsureTrailingDot(ep.DNSName), Rrdatas: targets, Ttl: ttl, Type: ep.RecordType, diff --git a/provider/google_test.go b/provider/google/google_test.go similarity index 99% rename from provider/google_test.go rename to provider/google/google_test.go index 3da1fe772..2e6c3bea9 100644 --- a/provider/google_test.go +++ b/provider/google/google_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package google import ( "fmt" diff --git a/provider/infoblox.go b/provider/infoblox/infoblox.go similarity index 99% rename from provider/infoblox.go rename to provider/infoblox/infoblox.go index 73277685c..9ece8d6a6 100644 --- a/provider/infoblox.go +++ b/provider/infoblox/infoblox.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package infoblox import ( "context" @@ -29,12 +29,13 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) // InfobloxConfig clarifies the method signature type InfobloxConfig struct { DomainFilter endpoint.DomainFilter - ZoneIDFilter ZoneIDFilter + ZoneIDFilter provider.ZoneIDFilter Host string Port int Username string @@ -50,7 +51,7 @@ type InfobloxConfig struct { type InfobloxProvider struct { client ibclient.IBConnector domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter view string dryRun bool } diff --git a/provider/infoblox_test.go b/provider/infoblox/infoblox_test.go similarity index 99% rename from provider/infoblox_test.go rename to provider/infoblox/infoblox_test.go index bf0f91c4a..693ee3f53 100644 --- a/provider/infoblox_test.go +++ b/provider/infoblox/infoblox_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package infoblox import ( "context" diff --git a/provider/inmemory.go b/provider/inmemory/inmemory.go similarity index 99% rename from provider/inmemory.go rename to provider/inmemory/inmemory.go index e3c7ad964..740252882 100644 --- a/provider/inmemory.go +++ b/provider/inmemory/inmemory.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package inmemory import ( "context" diff --git a/provider/inmemory_test.go b/provider/inmemory/inmemory_test.go similarity index 99% rename from provider/inmemory_test.go rename to provider/inmemory/inmemory_test.go index bb13cb354..74260cbe6 100644 --- a/provider/inmemory_test.go +++ b/provider/inmemory/inmemory_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package inmemory import ( "context" diff --git a/provider/linode.go b/provider/linode/linode.go similarity index 98% rename from provider/linode.go rename to provider/linode/linode.go index b93acc344..e8096afbd 100644 --- a/provider/linode.go +++ b/provider/linode/linode.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package linode import ( "context" @@ -30,6 +30,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) // LinodeDomainClient interface to ease testing @@ -126,7 +127,7 @@ func (p *LinodeProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, err } for _, r := range records { - if supportedRecordType(string(r.Type)) { + if provider.SupportedRecordType(string(r.Type)) { name := fmt.Sprintf("%s.%s", r.Name, zone.Domain) // root name is identified by the empty string and should be @@ -267,7 +268,7 @@ func (p *LinodeProvider) ApplyChanges(ctx context.Context, changes *plan.Changes zonesByID := make(map[string]*linodego.Domain) - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { zoneNameIDMapper.Add(strconv.Itoa(z.ID), z.Domain) @@ -491,7 +492,7 @@ func (p *LinodeProvider) ApplyChanges(ctx context.Context, changes *plan.Changes }) } -func endpointsByZone(zoneNameIDMapper zoneIDName, endpoints []*endpoint.Endpoint) map[string][]*endpoint.Endpoint { +func endpointsByZone(zoneNameIDMapper provider.ZoneIDName, endpoints []*endpoint.Endpoint) map[string][]*endpoint.Endpoint { endpointsByZone := make(map[string][]*endpoint.Endpoint) for _, ep := range endpoints { diff --git a/provider/linode_test.go b/provider/linode/linode_test.go similarity index 99% rename from provider/linode_test.go rename to provider/linode/linode_test.go index 82e21e127..572a1f8cb 100644 --- a/provider/linode_test.go +++ b/provider/linode/linode_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package linode import ( "context" diff --git a/provider/ns1.go b/provider/ns1/ns1.go similarity index 97% rename from provider/ns1.go rename to provider/ns1/ns1.go index 3d72efa9a..a30254cd6 100644 --- a/provider/ns1.go +++ b/provider/ns1/ns1.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package ns1 import ( "context" @@ -30,6 +30,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -85,7 +86,7 @@ func (n NS1DomainService) ListZones() ([]*dns.Zone, *http.Response, error) { // NS1Config passes cli args to the NS1Provider type NS1Config struct { DomainFilter endpoint.DomainFilter - ZoneIDFilter ZoneIDFilter + ZoneIDFilter provider.ZoneIDFilter NS1Endpoint string NS1IgnoreSSL bool DryRun bool @@ -95,7 +96,7 @@ type NS1Config struct { type NS1Provider struct { client NS1DomainClient domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter dryRun bool } @@ -158,7 +159,7 @@ func (p *NS1Provider) Records(ctx context.Context) ([]*endpoint.Endpoint, error) } for _, record := range zoneData.Records { - if supportedRecordType(record.Type) { + if provider.SupportedRecordType(record.Type) { endpoints = append(endpoints, endpoint.NewEndpointWithTTL( record.Domain, record.Type, @@ -299,7 +300,7 @@ func newNS1Changes(action string, endpoints []*endpoint.Endpoint) []*ns1Change { // ns1ChangesByZone separates a multi-zone change into a single change per zone. func ns1ChangesByZone(zones []*dns.Zone, changeSets []*ns1Change) map[string][]*ns1Change { changes := make(map[string][]*ns1Change) - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { zoneNameIDMapper.Add(z.Zone, z.Zone) changes[z.Zone] = []*ns1Change{} diff --git a/provider/ns1_test.go b/provider/ns1/ns1_test.go similarity index 99% rename from provider/ns1_test.go rename to provider/ns1/ns1_test.go index 6758aea71..dcd22829c 100644 --- a/provider/ns1_test.go +++ b/provider/ns1/ns1_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package ns1 import ( "context" diff --git a/provider/oci.go b/provider/oci/oci.go similarity index 96% rename from provider/oci.go rename to provider/oci/oci.go index ba2c3ae5e..34a6b72c8 100644 --- a/provider/oci.go +++ b/provider/oci/oci.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package oci import ( "context" @@ -29,6 +29,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ociRecordTTL = 300 @@ -56,7 +57,7 @@ type OCIProvider struct { cfg OCIConfig domainFilter endpoint.DomainFilter - zoneIDFilter ZoneIDFilter + zoneIDFilter provider.ZoneIDFilter dryRun bool } @@ -83,7 +84,7 @@ func LoadOCIConfig(path string) (*OCIConfig, error) { } // NewOCIProvider initialises a new OCI DNS based Provider. -func NewOCIProvider(cfg OCIConfig, domainFilter endpoint.DomainFilter, zoneIDFilter ZoneIDFilter, dryRun bool) (*OCIProvider, error) { +func NewOCIProvider(cfg OCIConfig, domainFilter endpoint.DomainFilter, zoneIDFilter provider.ZoneIDFilter, dryRun bool) (*OCIProvider, error) { var client ociDNSClient client, err := dns.NewDnsClientWithConfigurationProvider(common.NewRawConfigurationProvider( cfg.Auth.TenancyID, @@ -177,7 +178,7 @@ func (p *OCIProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, error) } for _, record := range resp.Items { - if !supportedRecordType(*record.Rtype) { + if !provider.SupportedRecordType(*record.Rtype) { continue } endpoints = append(endpoints, @@ -252,7 +253,7 @@ func newRecordOperation(ep *endpoint.Endpoint, opType dns.RecordOperationOperati targets := make([]string, len(ep.Targets)) copy(targets, []string(ep.Targets)) if ep.RecordType == endpoint.RecordTypeCNAME { - targets[0] = ensureTrailingDot(targets[0]) + targets[0] = provider.EnsureTrailingDot(targets[0]) } rdata := strings.Join(targets, " ") @@ -274,7 +275,7 @@ func newRecordOperation(ep *endpoint.Endpoint, opType dns.RecordOperationOperati func operationsByZone(zones map[string]dns.ZoneSummary, ops []dns.RecordOperation) map[string][]dns.RecordOperation { changes := make(map[string][]dns.RecordOperation) - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { zoneNameIDMapper.Add(*z.Id, *z.Name) changes[*z.Id] = []dns.RecordOperation{} diff --git a/provider/oci_test.go b/provider/oci/oci_test.go similarity index 99% rename from provider/oci_test.go rename to provider/oci/oci_test.go index decaa7469..e87f1188e 100644 --- a/provider/oci_test.go +++ b/provider/oci/oci_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package oci import ( "context" diff --git a/provider/ovh.go b/provider/ovh/ovh.go similarity index 98% rename from provider/ovh.go rename to provider/ovh/ovh.go index a53231969..fb0a0d4cc 100644 --- a/provider/ovh.go +++ b/provider/ovh/ovh.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package ovh import ( "context" @@ -28,6 +28,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -237,7 +238,7 @@ func (p *OVHProvider) record(zone *string, id uint64, records chan<- ovhRecord) if err := p.client.Get(fmt.Sprintf("/domain/zone/%s/record/%d", *zone, id), &record); err != nil { return err } - if supportedRecordType(record.FieldType) { + if provider.SupportedRecordType(record.FieldType) { log.Debugf("OVH: Record %d for %s is %+v", id, *zone, record) records <- record } @@ -278,7 +279,7 @@ func ovhGroupByNameAndType(records []ovhRecord) []*endpoint.Endpoint { } func newOvhChange(action int, endpoints []*endpoint.Endpoint, zones []string, records []ovhRecord) []ovhChange { - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} ovhChanges := make([]ovhChange, 0, countTargets(endpoints)) for _, zone := range zones { zoneNameIDMapper.Add(zone, zone) diff --git a/provider/ovh_test.go b/provider/ovh/ovh_test.go similarity index 99% rename from provider/ovh_test.go rename to provider/ovh/ovh_test.go index 2f2b793c0..54323e9a8 100644 --- a/provider/ovh_test.go +++ b/provider/ovh/ovh_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package ovh import ( "context" diff --git a/provider/pdns.go b/provider/pdns/pdns.go similarity index 98% rename from provider/pdns.go rename to provider/pdns/pdns.go index fc1eff564..fa9d4e3b7 100644 --- a/provider/pdns.go +++ b/provider/pdns/pdns.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package pdns import ( "bytes" @@ -35,6 +35,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/pkg/tlsutils" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) type pdnsChangeType string @@ -310,7 +311,7 @@ func (p *PDNSProvider) ConvertEndpointsToZones(eps []*endpoint.Endpoint, changet zone.Rrsets = []pgo.RrSet{} for i := 0; i < len(endpoints); { ep := endpoints[i] - dnsname := ensureTrailingDot(ep.DNSName) + dnsname := provider.EnsureTrailingDot(ep.DNSName) if dnsname == zone.Name || strings.HasSuffix(dnsname, "."+zone.Name) { // The assumption here is that there will only ever be one target // per (ep.DNSName, ep.RecordType) tuple, which holds true for @@ -318,7 +319,7 @@ func (p *PDNSProvider) ConvertEndpointsToZones(eps []*endpoint.Endpoint, changet records := []pgo.Record{} for _, t := range ep.Targets { if "CNAME" == ep.RecordType { - t = ensureTrailingDot(t) + t = provider.EnsureTrailingDot(t) } records = append(records, pgo.Record{Content: t}) @@ -365,7 +366,7 @@ func (p *PDNSProvider) ConvertEndpointsToZones(eps []*endpoint.Endpoint, changet for _, zone := range residualZones { for i := 0; i < len(endpoints); { ep := endpoints[i] - dnsname := ensureTrailingDot(ep.DNSName) + dnsname := provider.EnsureTrailingDot(ep.DNSName) if dnsname == zone.Name || strings.HasSuffix(dnsname, "."+zone.Name) { // "pop" endpoint if it's matched to a residual zone... essentially a no-op log.Debugf("Ignoring Endpoint because it was matched to a zone that was not specified within Domain Filter(s): %s", dnsname) diff --git a/provider/pdns_test.go b/provider/pdns/pdns_test.go similarity index 99% rename from provider/pdns_test.go rename to provider/pdns/pdns_test.go index 6248cad06..83b91fce9 100644 --- a/provider/pdns_test.go +++ b/provider/pdns/pdns_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package pdns import ( "context" diff --git a/provider/provider.go b/provider/provider.go index fcd12018c..c16bab748 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -42,8 +42,8 @@ func (k *contextKey) String() string { return "provider context value " + k.name // type []*endpoint.Endpoint. var RecordsContextKey = &contextKey{"records"} -// ensureTrailingDot ensures that the hostname receives a trailing dot if it hasn't already. -func ensureTrailingDot(hostname string) string { +// EnsureTrailingDot ensures that the hostname receives a trailing dot if it hasn't already. +func EnsureTrailingDot(hostname string) string { if net.ParseIP(hostname) != nil { return hostname } diff --git a/provider/rcode0.go b/provider/rcode0/rcode0.go similarity index 98% rename from provider/rcode0.go rename to provider/rcode0/rcode0.go index 0577be000..11bac1bda 100644 --- a/provider/rcode0.go +++ b/provider/rcode0/rcode0.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package rcode0 import ( "context" @@ -28,6 +28,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) // RcodeZeroProvider implements the DNS provider for RcodeZero Anycast DNS. @@ -115,7 +116,7 @@ func (p *RcodeZeroProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, for _, r := range rrset { - if supportedRecordType(r.Type) { + if provider.SupportedRecordType(r.Type) { if p.TXTEncrypt && (p.Key != nil) && strings.EqualFold(r.Type, "TXT") { p.Client.RRSet.DecryptTXT(p.Key, r) @@ -156,7 +157,7 @@ func (p *RcodeZeroProvider) ApplyChanges(ctx context.Context, changes *plan.Chan func rcodezeroChangesByZone(zones []*rc0.Zone, changeSet []*rc0.RRSetChange) map[string][]*rc0.RRSetChange { changes := make(map[string][]*rc0.RRSetChange) - zoneNameIDMapper := zoneIDName{} + zoneNameIDMapper := provider.ZoneIDName{} for _, z := range zones { zoneNameIDMapper.Add(z.Domain, z.Domain) changes[z.Domain] = []*rc0.RRSetChange{} diff --git a/provider/rcode0_test.go b/provider/rcode0/rcode0_test.go similarity index 99% rename from provider/rcode0_test.go rename to provider/rcode0/rcode0_test.go index dda94e2f7..f380ec8e3 100644 --- a/provider/rcode0_test.go +++ b/provider/rcode0/rcode0_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package rcode0 import ( "context" diff --git a/provider/rdns.go b/provider/rdns/rdns.go similarity index 99% rename from provider/rdns.go rename to provider/rdns/rdns.go index 6bbda693e..197430b24 100644 --- a/provider/rdns.go +++ b/provider/rdns/rdns.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package rdns import ( "context" @@ -38,6 +38,7 @@ import ( ) const ( + etcdTimeout = 5 * time.Second rdnsMaxHosts = 10 rdnsOriginalLabel = "originalText" rdnsPrefix = "/rdnsv3" diff --git a/provider/rdns_test.go b/provider/rdns/rdns_test.go similarity index 99% rename from provider/rdns_test.go rename to provider/rdns/rdns_test.go index de66c21c3..450834313 100644 --- a/provider/rdns_test.go +++ b/provider/rdns/rdns_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package rdns import ( "context" diff --git a/provider/recordfilter.go b/provider/recordfilter.go index 8b5c31178..487595a64 100644 --- a/provider/recordfilter.go +++ b/provider/recordfilter.go @@ -16,9 +16,9 @@ limitations under the License. package provider -// supportedRecordType returns true only for supported record types. +// SupportedRecordType returns true only for supported record types. // Currently A, CNAME, SRV, and TXT record types are supported. -func supportedRecordType(recordType string) bool { +func SupportedRecordType(recordType string) bool { switch recordType { case "A", "CNAME", "SRV", "TXT": return true diff --git a/provider/rfc2136.go b/provider/rfc2136/rfc2136.go similarity index 98% rename from provider/rfc2136.go rename to provider/rfc2136/rfc2136.go index f5262ab4f..77c92464c 100644 --- a/provider/rfc2136.go +++ b/provider/rfc2136/rfc2136.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package rfc2136 import ( "context" @@ -30,6 +30,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) // rfc2136 provider type @@ -65,7 +66,7 @@ type rfc2136Actions interface { } // NewRfc2136Provider is a factory function for OpenStack rfc2136 providers -func NewRfc2136Provider(host string, port int, zoneName string, insecure bool, keyName string, secret string, secretAlg string, axfr bool, domainFilter endpoint.DomainFilter, dryRun bool, minTTL time.Duration, actions rfc2136Actions) (Provider, error) { +func NewRfc2136Provider(host string, port int, zoneName string, insecure bool, keyName string, secret string, secretAlg string, axfr bool, domainFilter endpoint.DomainFilter, dryRun bool, minTTL time.Duration, actions rfc2136Actions) (provider.Provider, error) { secretAlgChecked, ok := tsigAlgs[secretAlg] if !ok && !insecure { return nil, errors.Errorf("%s is not supported TSIG algorithm", secretAlg) diff --git a/provider/rfc2136_test.go b/provider/rfc2136/rfc2136_test.go similarity index 99% rename from provider/rfc2136_test.go rename to provider/rfc2136/rfc2136_test.go index ad932ca75..afa2538e1 100644 --- a/provider/rfc2136_test.go +++ b/provider/rfc2136/rfc2136_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package rfc2136 import ( "context" diff --git a/provider/transip.go b/provider/transip/transip.go similarity index 92% rename from provider/transip.go rename to provider/transip/transip.go index b95d90468..5f4941a95 100644 --- a/provider/transip.go +++ b/provider/transip/transip.go @@ -1,4 +1,20 @@ -package provider +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package transip import ( "context" @@ -12,6 +28,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -72,7 +89,7 @@ func (p *TransIPProvider) ApplyChanges(ctx context.Context, changes *plan.Change return err } - zoneNameMapper := zoneIDName{} + zoneNameMapper := provider.ZoneIDName{} zonesByName := make(map[string]transip.Domain) updatedZones := make(map[string]bool) for _, zone := range zones { @@ -232,7 +249,7 @@ func (p *TransIPProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, er // go over all zones and their DNS entries and create endpoints for them for _, zone := range zones { for _, r := range zone.DNSEntries { - if !supportedRecordType(string(r.Type)) { + if !provider.SupportedRecordType(string(r.Type)) { continue } @@ -360,7 +377,7 @@ func (p *TransIPProvider) addEndpointToEntries(ep *endpoint.Endpoint, zone trans // zoneForZoneName returns the zone mapped to given name or error if zone could // not be found -func (p *TransIPProvider) zoneForZoneName(name string, m zoneIDName, z map[string]transip.Domain) (transip.Domain, error) { +func (p *TransIPProvider) zoneForZoneName(name string, m provider.ZoneIDName, z map[string]transip.Domain) (transip.Domain, error) { _, zoneName := m.FindZone(name) if zoneName == "" { return transip.Domain{}, fmt.Errorf("could not find zoneName for %s", name) diff --git a/provider/transip_test.go b/provider/transip/transip_test.go similarity index 90% rename from provider/transip_test.go rename to provider/transip/transip_test.go index 960c57b6c..76e090b78 100644 --- a/provider/transip_test.go +++ b/provider/transip/transip_test.go @@ -1,4 +1,20 @@ -package provider +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package transip import ( "testing" diff --git a/provider/vinyldns.go b/provider/vinyldns/vinyldns.go similarity index 97% rename from provider/vinyldns.go rename to provider/vinyldns/vinyldns.go index 20a4e2f4f..1f293ec62 100644 --- a/provider/vinyldns.go +++ b/provider/vinyldns/vinyldns.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package vinyldns import ( "context" @@ -27,6 +27,7 @@ import ( "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -48,7 +49,7 @@ type vinyldnsZoneInterface interface { type vinyldnsProvider struct { client vinyldnsZoneInterface - zoneFilter ZoneIDFilter + zoneFilter provider.ZoneIDFilter domainFilter endpoint.DomainFilter dryRun bool } @@ -59,7 +60,7 @@ type vinyldnsChange struct { } // NewVinylDNSProvider provides support for VinylDNS records -func NewVinylDNSProvider(domainFilter endpoint.DomainFilter, zoneFilter ZoneIDFilter, dryRun bool) (Provider, error) { +func NewVinylDNSProvider(domainFilter endpoint.DomainFilter, zoneFilter provider.ZoneIDFilter, dryRun bool) (provider.Provider, error) { _, ok := os.LookupEnv("VINYLDNS_ACCESS_KEY") if !ok { return nil, fmt.Errorf("no vinyldns access key found") @@ -97,7 +98,7 @@ func (p *vinyldnsProvider) Records(ctx context.Context) (endpoints []*endpoint.E } for _, r := range records { - if supportedRecordType(r.Type) { + if provider.SupportedRecordType(r.Type) { recordsCount := len(r.Records) log.Debugf(fmt.Sprintf("%s.%s.%d.%s", r.Name, r.Type, recordsCount, zone.Name)) diff --git a/provider/vinyldns_test.go b/provider/vinyldns/vinyldns_test.go similarity index 99% rename from provider/vinyldns_test.go rename to provider/vinyldns/vinyldns_test.go index 4a42ee3b6..168253544 100644 --- a/provider/vinyldns_test.go +++ b/provider/vinyldns/vinyldns_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package vinyldns import ( "context" diff --git a/provider/vultr.go b/provider/vultr/vultr.go similarity index 98% rename from provider/vultr.go rename to provider/vultr/vultr.go index 869ace7c3..58e8cf912 100644 --- a/provider/vultr.go +++ b/provider/vultr/vultr.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package vultr import ( "context" @@ -27,6 +27,7 @@ import ( "github.com/vultr/govultr" "sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/plan" + "sigs.k8s.io/external-dns/provider" ) const ( @@ -93,7 +94,7 @@ func (p *VultrProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, erro } for _, r := range records { - if supportedRecordType(r.Type) { + if provider.SupportedRecordType(r.Type) { name := fmt.Sprintf("%s.%s", r.Name, zone.Domain) // root name is identified by the empty string and should be @@ -236,7 +237,7 @@ func newVultrChanges(action string, endpoints []*endpoint.Endpoint) []*VultrChan func seperateChangesByZone(zones []govultr.DNSDomain, changes []*VultrChanges) map[string][]*VultrChanges { change := make(map[string][]*VultrChanges) - zoneNameID := zoneIDName{} + zoneNameID := provider.ZoneIDName{} for _, z := range zones { zoneNameID.Add(z.Domain, z.Domain) diff --git a/provider/vultr_test.go b/provider/vultr/vultr_test.go similarity index 99% rename from provider/vultr_test.go rename to provider/vultr/vultr_test.go index 73bd0e02a..6487657b6 100644 --- a/provider/vultr_test.go +++ b/provider/vultr/vultr_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package provider +package vultr import ( "context" diff --git a/provider/zone_id_filter.go b/provider/zone_id_filter.go index 066d622f6..39c3d9289 100644 --- a/provider/zone_id_filter.go +++ b/provider/zone_id_filter.go @@ -20,7 +20,7 @@ import "strings" // ZoneIDFilter holds a list of zone ids to filter by type ZoneIDFilter struct { - zoneIDs []string + ZoneIDs []string // FIXME this was temporarily put as public to allow the dyn provider to compile } // NewZoneIDFilter returns a new ZoneIDFilter given a list of zone ids @@ -31,11 +31,11 @@ func NewZoneIDFilter(zoneIDs []string) ZoneIDFilter { // Match checks whether a zone matches one of the provided zone ids func (f ZoneIDFilter) Match(zoneID string) bool { // An empty filter includes all zones. - if len(f.zoneIDs) == 0 { + if len(f.ZoneIDs) == 0 { return true } - for _, id := range f.zoneIDs { + for _, id := range f.ZoneIDs { if strings.HasSuffix(zoneID, id) { return true } diff --git a/provider/zonefinder.go b/provider/zonefinder.go index 6eed20423..18396000b 100644 --- a/provider/zonefinder.go +++ b/provider/zonefinder.go @@ -18,13 +18,13 @@ package provider import "strings" -type zoneIDName map[string]string +type ZoneIDName map[string]string -func (z zoneIDName) Add(zoneID, zoneName string) { +func (z ZoneIDName) Add(zoneID, zoneName string) { z[zoneID] = zoneName } -func (z zoneIDName) FindZone(hostname string) (suitableZoneID, suitableZoneName string) { +func (z ZoneIDName) FindZone(hostname string) (suitableZoneID, suitableZoneName string) { for zoneID, zoneName := range z { if hostname == zoneName || strings.HasSuffix(hostname, "."+zoneName) { if suitableZoneName == "" || len(zoneName) > len(suitableZoneName) {