restructures the providers (build only)

Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com>
This commit is contained in:
Raffaele Di Fazio 2020-05-08 13:05:17 +02:00
parent 4c7c3be807
commit db4224c705
59 changed files with 298 additions and 180 deletions

102
main.go
View File

@ -28,6 +28,32 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
_ "k8s.io/client-go/plugin/pkg/client/auth" _ "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/controller"
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
@ -123,8 +149,8 @@ func main() {
var p provider.Provider var p provider.Provider
switch cfg.Provider { switch cfg.Provider {
case "akamai": case "akamai":
p = provider.NewAkamaiProvider( p = akamai.NewAkamaiProvider(
provider.AkamaiConfig{ akamai.AkamaiConfig{
DomainFilter: domainFilter, DomainFilter: domainFilter,
ZoneIDFilter: zoneIDFilter, ZoneIDFilter: zoneIDFilter,
ServiceConsumerDomain: cfg.AkamaiServiceConsumerDomain, ServiceConsumerDomain: cfg.AkamaiServiceConsumerDomain,
@ -135,10 +161,10 @@ func main() {
}, },
) )
case "alibabacloud": 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": case "aws":
p, err = provider.NewAWSProvider( p, err = aws.NewAWSProvider(
provider.AWSConfig{ aws.AWSConfig{
DomainFilter: domainFilter, DomainFilter: domainFilter,
ZoneIDFilter: zoneIDFilter, ZoneIDFilter: zoneIDFilter,
ZoneTypeFilter: zoneTypeFilter, 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) log.Infof("Registry \"%s\" cannot be used with AWS Cloud Map. Switching to \"aws-sd\".", cfg.Registry)
cfg.Registry = "aws-sd" 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": 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": 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": case "vinyldns":
p, err = provider.NewVinylDNSProvider(domainFilter, zoneIDFilter, cfg.DryRun) p, err = vinyldns.NewVinylDNSProvider(domainFilter, zoneIDFilter, cfg.DryRun)
case "vultr": case "vultr":
p, err = provider.NewVultrProvider(domainFilter, cfg.DryRun) p, err = vultr.NewVultrProvider(domainFilter, cfg.DryRun)
case "cloudflare": 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": case "rcodezero":
p, err = provider.NewRcodeZeroProvider(domainFilter, cfg.DryRun, cfg.RcodezeroTXTEncrypt) p, err = rcode0.NewRcodeZeroProvider(domainFilter, cfg.DryRun, cfg.RcodezeroTXTEncrypt)
case "google": 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": case "digitalocean":
p, err = provider.NewDigitalOceanProvider(ctx, domainFilter, cfg.DryRun) p, err = digitalocean.NewDigitalOceanProvider(ctx, domainFilter, cfg.DryRun)
case "ovh": case "ovh":
p, err = provider.NewOVHProvider(ctx, domainFilter, cfg.OVHEndpoint, cfg.DryRun) p, err = ovh.NewOVHProvider(ctx, domainFilter, cfg.OVHEndpoint, cfg.DryRun)
case "linode": case "linode":
p, err = provider.NewLinodeProvider(domainFilter, cfg.DryRun, externaldns.Version) p, err = linode.NewLinodeProvider(domainFilter, cfg.DryRun, externaldns.Version)
case "dnsimple": case "dnsimple":
p, err = provider.NewDnsimpleProvider(domainFilter, zoneIDFilter, cfg.DryRun) p, err = dnsimple.NewDnsimpleProvider(domainFilter, zoneIDFilter, cfg.DryRun)
case "infoblox": case "infoblox":
p, err = provider.NewInfobloxProvider( p, err = infoblox.NewInfobloxProvider(
provider.InfobloxConfig{ infoblox.InfobloxConfig{
DomainFilter: domainFilter, DomainFilter: domainFilter,
ZoneIDFilter: zoneIDFilter, ZoneIDFilter: zoneIDFilter,
Host: cfg.InfobloxGridHost, Host: cfg.InfobloxGridHost,
@ -198,8 +224,8 @@ func main() {
}, },
) )
case "dyn": case "dyn":
p, err = provider.NewDynProvider( p, err = dyn.NewDynProvider(
provider.DynConfig{ dyn.DynConfig{
DomainFilter: domainFilter, DomainFilter: domainFilter,
ZoneIDFilter: zoneIDFilter, ZoneIDFilter: zoneIDFilter,
DryRun: cfg.DryRun, DryRun: cfg.DryRun,
@ -211,29 +237,29 @@ func main() {
}, },
) )
case "coredns", "skydns": case "coredns", "skydns":
p, err = provider.NewCoreDNSProvider(domainFilter, cfg.CoreDNSPrefix, cfg.DryRun) p, err = coredns.NewCoreDNSProvider(domainFilter, cfg.CoreDNSPrefix, cfg.DryRun)
case "rdns": case "rdns":
p, err = provider.NewRDNSProvider( p, err = rdns.NewRDNSProvider(
provider.RDNSConfig{ rdns.RDNSConfig{
DomainFilter: domainFilter, DomainFilter: domainFilter,
DryRun: cfg.DryRun, DryRun: cfg.DryRun,
}, },
) )
case "exoscale": 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": 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": case "designate":
p, err = provider.NewDesignateProvider(domainFilter, cfg.DryRun) p, err = designate.NewDesignateProvider(domainFilter, cfg.DryRun)
case "pdns": case "pdns":
p, err = provider.NewPDNSProvider( p, err = pdns.NewPDNSProvider(
ctx, ctx,
provider.PDNSConfig{ pdns.PDNSConfig{
DomainFilter: domainFilter, DomainFilter: domainFilter,
DryRun: cfg.DryRun, DryRun: cfg.DryRun,
Server: cfg.PDNSServer, Server: cfg.PDNSServer,
APIKey: cfg.PDNSAPIKey, APIKey: cfg.PDNSAPIKey,
TLSConfig: provider.TLSConfig{ TLSConfig: pdns.TLSConfig{
TLSEnabled: cfg.PDNSTLSEnabled, TLSEnabled: cfg.PDNSTLSEnabled,
CAFilePath: cfg.TLSCA, CAFilePath: cfg.TLSCA,
ClientCertFilePath: cfg.TLSClientCert, ClientCertFilePath: cfg.TLSClientCert,
@ -242,16 +268,16 @@ func main() {
}, },
) )
case "oci": case "oci":
var config *provider.OCIConfig var config *oci.OCIConfig
config, err = provider.LoadOCIConfig(cfg.OCIConfigFile) config, err = oci.LoadOCIConfig(cfg.OCIConfigFile)
if err == nil { if err == nil {
p, err = provider.NewOCIProvider(*config, domainFilter, zoneIDFilter, cfg.DryRun) p, err = oci.NewOCIProvider(*config, domainFilter, zoneIDFilter, cfg.DryRun)
} }
case "rfc2136": 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": case "ns1":
p, err = provider.NewNS1Provider( p, err = ns1.NewNS1Provider(
provider.NS1Config{ ns1.NS1Config{
DomainFilter: domainFilter, DomainFilter: domainFilter,
ZoneIDFilter: zoneIDFilter, ZoneIDFilter: zoneIDFilter,
NS1Endpoint: cfg.NS1Endpoint, NS1Endpoint: cfg.NS1Endpoint,
@ -260,7 +286,7 @@ func main() {
}, },
) )
case "transip": 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: default:
log.Fatalf("unknown dns provider: %s", cfg.Provider) log.Fatalf("unknown dns provider: %s", cfg.Provider)
} }
@ -275,7 +301,7 @@ func main() {
case "txt": case "txt":
r, err = registry.NewTXTRegistry(p, cfg.TXTPrefix, cfg.TXTOwnerID, cfg.TXTCacheInterval) r, err = registry.NewTXTRegistry(p, cfg.TXTPrefix, cfg.TXTOwnerID, cfg.TXTCacheInterval)
case "aws-sd": case "aws-sd":
r, err = registry.NewAWSSDRegistry(p.(*provider.AWSSDProvider), cfg.TXTOwnerID) r, err = registry.NewAWSSDRegistry(p.(*awssd.AWSSDProvider), cfg.TXTOwnerID)
default: default:
log.Fatalf("unknown registry: %s", cfg.Registry) log.Fatalf("unknown registry: %s", cfg.Registry)
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package akamai
import ( import (
"bytes" "bytes"
@ -30,6 +30,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
type akamaiClient interface { type akamaiClient interface {
@ -50,7 +51,7 @@ func (*akamaiOpenClient) Do(config edgegrid.Config, req *http.Request) (*http.Re
// AkamaiConfig clarifies the method signature // AkamaiConfig clarifies the method signature
type AkamaiConfig struct { type AkamaiConfig struct {
DomainFilter endpoint.DomainFilter DomainFilter endpoint.DomainFilter
ZoneIDFilter ZoneIDFilter ZoneIDFilter provider.ZoneIDFilter
ServiceConsumerDomain string ServiceConsumerDomain string
ClientToken string ClientToken string
ClientSecret string ClientSecret string
@ -61,7 +62,7 @@ type AkamaiConfig struct {
// AkamaiProvider implements the DNS provider for Akamai. // AkamaiProvider implements the DNS provider for Akamai.
type AkamaiProvider struct { type AkamaiProvider struct {
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
config edgegrid.Config config edgegrid.Config
dryRun bool dryRun bool
client akamaiClient 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. // ApplyChanges applies a given set of changes in a given zone.
func (p *AkamaiProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) error { func (p *AkamaiProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
zones, err := p.fetchZones() zones, err := p.fetchZones()
if err != nil { if err != nil {
log.Warnf("No zones to fetch endpoints from!") 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 { for _, endpoint := range endpoints {
if !p.domainFilter.Match(endpoint.DNSName) { if !p.domainFilter.Match(endpoint.DNSName) {
@ -320,7 +321,7 @@ func (p *AkamaiProvider) createRecords(zoneNameIDMapper zoneIDName, endpoints []
return created, failed 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 { for _, endpoint := range endpoints {
if !p.domainFilter.Match(endpoint.DNSName) { if !p.domainFilter.Match(endpoint.DNSName) {
@ -349,7 +350,7 @@ func (p *AkamaiProvider) deleteRecords(zoneNameIDMapper zoneIDName, endpoints []
return deleted, failed 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 { for _, endpoint := range endpoints {
if !p.domainFilter.Match(endpoint.DNSName) { if !p.domainFilter.Match(endpoint.DNSName) {

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package akamai
import ( import (
"bytes" "bytes"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package alibabacloud
import ( import (
"context" "context"
@ -33,6 +33,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -67,7 +68,7 @@ type AlibabaCloudPrivateZoneAPI interface {
// AlibabaCloudProvider implements the DNS provider for Alibaba Cloud. // AlibabaCloudProvider implements the DNS provider for Alibaba Cloud.
type AlibabaCloudProvider struct { type AlibabaCloudProvider struct {
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter // Private Zone only zoneIDFilter provider.ZoneIDFilter // Private Zone only
MaxChangeCount int MaxChangeCount int
EvaluateTargetHealth bool EvaluateTargetHealth bool
AssumeRole string AssumeRole string
@ -93,7 +94,7 @@ type alibabaCloudConfig struct {
// NewAlibabaCloudProvider creates a new Alibaba Cloud provider. // NewAlibabaCloudProvider creates a new Alibaba Cloud provider.
// //
// Returns the provider or an error if a provider could not be created. // 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{} cfg := alibabaCloudConfig{}
if configFile != "" { if configFile != "" {
contents, err := ioutil.ReadFile(configFile) contents, err := ioutil.ReadFile(configFile)
@ -457,7 +458,7 @@ func (p *AlibabaCloudProvider) getDomainRecords(domainName string) ([]alidns.Rec
continue continue
} }
if !supportedRecordType(recordType) { if !provider.SupportedRecordType(recordType) {
continue continue
} }
@ -802,7 +803,7 @@ func (p *AlibabaCloudProvider) getPrivateZones() (map[string]*alibabaPrivateZone
recordType := record.Type recordType := record.Type
if !supportedRecordType(recordType) { if !provider.SupportedRecordType(recordType) {
continue continue
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package alibabacloud
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package aws
import ( import (
"context" "context"
@ -34,6 +34,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -121,20 +122,20 @@ type AWSProvider struct {
// only consider hosted zones managing domains ending in this suffix // only consider hosted zones managing domains ending in this suffix
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
// filter hosted zones by id // filter hosted zones by id
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
// filter hosted zones by type (e.g. private or public) // filter hosted zones by type (e.g. private or public)
zoneTypeFilter ZoneTypeFilter zoneTypeFilter provider.ZoneTypeFilter
// filter hosted zones by tags // filter hosted zones by tags
zoneTagFilter ZoneTagFilter zoneTagFilter provider.ZoneTagFilter
preferCNAME bool preferCNAME bool
} }
// AWSConfig contains configuration to create a new AWS provider. // AWSConfig contains configuration to create a new AWS provider.
type AWSConfig struct { type AWSConfig struct {
DomainFilter endpoint.DomainFilter DomainFilter endpoint.DomainFilter
ZoneIDFilter ZoneIDFilter ZoneIDFilter provider.ZoneIDFilter
ZoneTypeFilter ZoneTypeFilter ZoneTypeFilter provider.ZoneTypeFilter
ZoneTagFilter ZoneTagFilter ZoneTagFilter provider.ZoneTagFilter
BatchChangeSize int BatchChangeSize int
BatchChangeInterval time.Duration BatchChangeInterval time.Duration
EvaluateTargetHealth bool 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. // TODO(linki, ownership): Remove once ownership system is in place.
// See: https://github.com/kubernetes-sigs/external-dns/pull/122/files/74e2c3d3e237411e619aefc5aab694742001cdec#r109863370 // 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 continue
} }
@ -377,7 +378,7 @@ func (p *AWSProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) e
return err return err
} }
records, ok := ctx.Value(RecordsContextKey).([]*endpoint.Endpoint) records, ok := ctx.Value(provider.RecordsContextKey).([]*endpoint.Endpoint)
if !ok { if !ok {
var err error var err error
records, err = p.records(ctx, zones) records, err = p.records(ctx, zones)
@ -662,7 +663,7 @@ func changesByZone(zones map[string]*route53.HostedZone, changeSet []*route53.Ch
} }
for _, c := range changeSet { for _, c := range changeSet {
hostname := ensureTrailingDot(aws.StringValue(c.ResourceRecordSet.Name)) hostname := provider.EnsureTrailingDot(aws.StringValue(c.ResourceRecordSet.Name))
zones := suitableZones(hostname, zones) zones := suitableZones(hostname, zones)
if len(zones) == 0 { if len(zones) == 0 {

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package aws
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package awssd
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package awssd
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package azure
import ( import (
"context" "context"
@ -34,6 +34,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -67,7 +68,7 @@ type RecordSetsClient interface {
// AzureProvider implements the DNS provider for Microsoft's Azure cloud platform. // AzureProvider implements the DNS provider for Microsoft's Azure cloud platform.
type AzureProvider struct { type AzureProvider struct {
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
dryRun bool dryRun bool
resourceGroup string resourceGroup string
userAssignedIdentityClientID string userAssignedIdentityClientID string
@ -78,7 +79,7 @@ type AzureProvider struct {
// NewAzureProvider creates a new Azure provider. // NewAzureProvider creates a new Azure provider.
// //
// Returns the provider or an error if a provider could not be created. // 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) contents, err := ioutil.ReadFile(configFile)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to read Azure config file '%s': %v", configFile, err) 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 return true
} }
recordType := strings.TrimPrefix(*recordSet.Type, "Microsoft.Network/dnszones/") recordType := strings.TrimPrefix(*recordSet.Type, "Microsoft.Network/dnszones/")
if !supportedRecordType(recordType) { if !provider.SupportedRecordType(recordType) {
return true return true
} }
name := formatAzureDNSName(*recordSet.Name, *zone.Name) 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{} ignored := map[string]bool{}
deleted := azureChangeMap{} deleted := azureChangeMap{}
updated := azureChangeMap{} updated := azureChangeMap{}
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
if z.Name != nil { if z.Name != nil {
zoneNameIDMapper.Add(*z.Name, *z.Name) zoneNameIDMapper.Add(*z.Name, *z.Name)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package azure
import ( import (
"context" "context"
@ -29,6 +29,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "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. // 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 // AzurePrivateDNSProvider implements the DNS provider for Microsoft's Azure Private DNS service
type AzurePrivateDNSProvider struct { type AzurePrivateDNSProvider struct {
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
dryRun bool dryRun bool
subscriptionID string subscriptionID string
resourceGroup string resourceGroup string
@ -57,7 +58,7 @@ type AzurePrivateDNSProvider struct {
// NewAzurePrivateDNSProvider creates a new Azure Private DNS provider. // NewAzurePrivateDNSProvider creates a new Azure Private DNS provider.
// //
// Returns the provider or an error if a provider could not be created. // 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() authorizer, err := auth.NewAuthorizerFromEnvironment()
if err != nil { if err != nil {
return nil, err return nil, err
@ -208,7 +209,7 @@ func (p *AzurePrivateDNSProvider) mapChanges(zones []privatedns.PrivateZone, cha
ignored := map[string]bool{} ignored := map[string]bool{}
deleted := azurePrivateDNSChangeMap{} deleted := azurePrivateDNSChangeMap{}
updated := azurePrivateDNSChangeMap{} updated := azurePrivateDNSChangeMap{}
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
if z.Name != nil { if z.Name != nil {
zoneNameIDMapper.Add(*z.Name, *z.Name) zoneNameIDMapper.Add(*z.Name, *z.Name)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package azure
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package azure
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package cloudflare
import ( import (
"context" "context"
@ -29,6 +29,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
"sigs.k8s.io/external-dns/source" "sigs.k8s.io/external-dns/source"
) )
@ -103,7 +104,7 @@ type CloudFlareProvider struct {
Client cloudFlareDNS Client cloudFlareDNS
// only consider hosted zones managing domains ending in this suffix // only consider hosted zones managing domains ending in this suffix
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
proxiedByDefault bool proxiedByDefault bool
DryRun bool DryRun bool
PaginationOptions cloudflare.PaginationOptions PaginationOptions cloudflare.PaginationOptions
@ -116,7 +117,7 @@ type cloudFlareChange struct {
} }
// NewCloudFlareProvider initializes a new CloudFlare DNS based Provider. // 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 // initialize via chosen auth method and returns new API object
var ( var (
config *cloudflare.API 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. // changesByZone separates a multi-zone change into a single change per zone.
func (p *CloudFlareProvider) changesByZone(zones []cloudflare.Zone, changeSet []*cloudFlareChange) map[string][]*cloudFlareChange { func (p *CloudFlareProvider) changesByZone(zones []cloudflare.Zone, changeSet []*cloudFlareChange) map[string][]*cloudFlareChange {
changes := make(map[string][]*cloudFlareChange) changes := make(map[string][]*cloudFlareChange)
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameIDMapper.Add(z.ID, z.Name) zoneNameIDMapper.Add(z.ID, z.Name)
@ -368,7 +369,7 @@ func groupByNameAndType(records []cloudflare.DNSRecord) []*endpoint.Endpoint {
groups := map[string][]cloudflare.DNSRecord{} groups := map[string][]cloudflare.DNSRecord{}
for _, r := range records { for _, r := range records {
if !supportedRecordType(r.Type) { if !provider.SupportedRecordType(r.Type) {
continue continue
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package cloudflare
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package coredns
import ( import (
"context" "context"
@ -35,6 +35,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
func init() { func init() {
@ -244,7 +245,7 @@ func newETCDClient() (coreDNSClient, error) {
} }
// NewCoreDNSProvider is a CoreDNS provider constructor // 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() client, err := newETCDClient()
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package coredns
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package designate
import ( import (
"context" "context"
@ -35,6 +35,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/pkg/tlsutils" "sigs.k8s.io/external-dns/pkg/tlsutils"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -234,7 +235,7 @@ type designateProvider struct {
} }
// NewDesignateProvider is a factory function for OpenStack designate providers // 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() client, err := newDesignateClient()
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package designate
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package digitalocean
import ( import (
"context" "context"
@ -28,6 +28,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -107,7 +108,7 @@ func (p *DigitalOceanProvider) Records(ctx context.Context) ([]*endpoint.Endpoin
} }
for _, r := range records { for _, r := range records {
if supportedRecordType(r.Type) { if provider.SupportedRecordType(r.Type) {
name := r.Name + "." + zone.Name name := r.Name + "." + zone.Name
// root name is identified by @ and should be // 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. // digitalOceanchangesByZone separates a multi-zone change into a single change per zone.
func digitalOceanChangesByZone(zones []godo.Domain, changeSet []*DigitalOceanChange) map[string][]*DigitalOceanChange { func digitalOceanChangesByZone(zones []godo.Domain, changeSet []*DigitalOceanChange) map[string][]*DigitalOceanChange {
changes := make(map[string][]*DigitalOceanChange) changes := make(map[string][]*DigitalOceanChange)
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameIDMapper.Add(z.Name, z.Name) zoneNameIDMapper.Add(z.Name, z.Name)
changes[z.Name] = []*DigitalOceanChange{} changes[z.Name] = []*DigitalOceanChange{}

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package digitalocean
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package dnsimple
import ( import (
"context" "context"
@ -28,6 +28,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "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) const dnsimpleRecordTTL = 3600 // Default TTL of 1 hour if not set (DNSimple's default)
@ -88,7 +89,7 @@ type dnsimpleProvider struct {
identity identityService identity identityService
accountID string accountID string
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
dryRun bool dryRun bool
} }
@ -104,7 +105,7 @@ const (
) )
// NewDnsimpleProvider initializes a new Dnsimple based provider // 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") oauthToken := os.Getenv("DNSIMPLE_OAUTH")
if len(oauthToken) == 0 { if len(oauthToken) == 0 {
return nil, fmt.Errorf("No dnsimple oauth token provided") return nil, fmt.Errorf("No dnsimple oauth token provided")

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package dnsimple
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package dyn
import ( import (
"context" "context"
@ -31,6 +31,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -57,7 +58,7 @@ func unixNow() int64 {
// DynConfig hold connection parameters to dyn.com and internal state // DynConfig hold connection parameters to dyn.com and internal state
type DynConfig struct { type DynConfig struct {
DomainFilter endpoint.DomainFilter DomainFilter endpoint.DomainFilter
ZoneIDFilter ZoneIDFilter ZoneIDFilter provider.ZoneIDFilter
DryRun bool DryRun bool
CustomerName string CustomerName string
Username string Username string
@ -141,7 +142,7 @@ type ZonePublishResponse struct {
} }
// NewDynProvider initializes a new Dyn Provider. // NewDynProvider initializes a new Dyn Provider.
func NewDynProvider(config DynConfig) (Provider, error) { func NewDynProvider(config DynConfig) (provider.Provider, error) {
return &dynProviderState{ return &dynProviderState{
DynConfig: config, DynConfig: config,
ZoneSnapshot: &ZoneSnapshot{ ZoneSnapshot: &ZoneSnapshot{
@ -404,7 +405,7 @@ func (d *dynProviderState) buildLinkToRecord(ep *endpoint.Endpoint) string {
return "" return ""
} }
var matchingZone = "" 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) { if strings.HasSuffix(ep.DNSName, zone) {
matchingZone = zone matchingZone = zone
break 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 // the zones we are allowed to touch. Currently only exact matches are considered, not all
// zones with the given suffix // zones with the given suffix
func (d *dynProviderState) zones(client *dynect.Client) []string { 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) { func (d *dynProviderState) buildRecordRequest(ep *endpoint.Endpoint) (string, *dynect.RecordRequest) {

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package dyn
import ( import (
"errors" "errors"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package exoscale
import ( import (
"context" "context"
@ -257,3 +257,39 @@ func (f *zoneFilter) EndpointZoneID(endpoint *endpoint.Endpoint, zones map[int64
} }
return matchZoneID, name 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
}

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package exoscale
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package google
import ( import (
"context" "context"
@ -33,6 +33,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -109,7 +110,7 @@ type GoogleProvider struct {
// only consider hosted zones managing domains ending in this suffix // only consider hosted zones managing domains ending in this suffix
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
// only consider hosted zones ending with this zone id // only consider hosted zones ending with this zone id
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
// A client for managing resource record sets // A client for managing resource record sets
resourceRecordSetsClient resourceRecordSetsClientInterface resourceRecordSetsClient resourceRecordSetsClientInterface
// A client for managing hosted zones // A client for managing hosted zones
@ -121,7 +122,7 @@ type GoogleProvider struct {
} }
// NewGoogleProvider initializes a new Google CloudDNS based Provider. // 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) gcloud, err := google.DefaultClient(ctx, dns.NdevClouddnsReadwriteScope)
if err != nil { if err != nil {
return nil, err return nil, err
@ -209,7 +210,7 @@ func (p *GoogleProvider) Records(ctx context.Context) (endpoints []*endpoint.End
f := func(resp *dns.ResourceRecordSetsListResponse) error { f := func(resp *dns.ResourceRecordSetsListResponse) error {
for _, r := range resp.Rrsets { for _, r := range resp.Rrsets {
if !supportedRecordType(r.Type) { if !provider.SupportedRecordType(r.Type) {
continue continue
} }
endpoints = append(endpoints, endpoint.NewEndpointWithTTL(r.Name, r.Type, endpoint.TTL(r.Ttl), r.Rrdatas...)) 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. // 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 { func separateChange(zones map[string]*dns.ManagedZone, change *dns.Change) map[string]*dns.Change {
changes := make(map[string]*dns.Change) changes := make(map[string]*dns.Change)
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameIDMapper[z.Name] = z.DnsName zoneNameIDMapper[z.Name] = z.DnsName
changes[z.Name] = &dns.Change{ 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 { 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) changes[zoneName].Additions = append(changes[zoneName].Additions, a)
} else { } else {
log.Warnf("No matching zone for record addition: %s %s %s %d", a.Name, a.Type, a.Rrdatas, a.Ttl) 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 { 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) changes[zoneName].Deletions = append(changes[zoneName].Deletions, d)
} else { } else {
log.Warnf("No matching zone for record deletion: %s %s %s %d", d.Name, d.Type, d.Rrdatas, d.Ttl) 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)) targets := make([]string, len(ep.Targets))
copy(targets, []string(ep.Targets)) copy(targets, []string(ep.Targets))
if ep.RecordType == endpoint.RecordTypeCNAME { 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 // 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{ return &dns.ResourceRecordSet{
Name: ensureTrailingDot(ep.DNSName), Name: provider.EnsureTrailingDot(ep.DNSName),
Rrdatas: targets, Rrdatas: targets,
Ttl: ttl, Ttl: ttl,
Type: ep.RecordType, Type: ep.RecordType,

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package google
import ( import (
"fmt" "fmt"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package infoblox
import ( import (
"context" "context"
@ -29,12 +29,13 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
// InfobloxConfig clarifies the method signature // InfobloxConfig clarifies the method signature
type InfobloxConfig struct { type InfobloxConfig struct {
DomainFilter endpoint.DomainFilter DomainFilter endpoint.DomainFilter
ZoneIDFilter ZoneIDFilter ZoneIDFilter provider.ZoneIDFilter
Host string Host string
Port int Port int
Username string Username string
@ -50,7 +51,7 @@ type InfobloxConfig struct {
type InfobloxProvider struct { type InfobloxProvider struct {
client ibclient.IBConnector client ibclient.IBConnector
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
view string view string
dryRun bool dryRun bool
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package infoblox
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package inmemory
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package inmemory
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package linode
import ( import (
"context" "context"
@ -30,6 +30,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
// LinodeDomainClient interface to ease testing // LinodeDomainClient interface to ease testing
@ -126,7 +127,7 @@ func (p *LinodeProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, err
} }
for _, r := range records { for _, r := range records {
if supportedRecordType(string(r.Type)) { if provider.SupportedRecordType(string(r.Type)) {
name := fmt.Sprintf("%s.%s", r.Name, zone.Domain) name := fmt.Sprintf("%s.%s", r.Name, zone.Domain)
// root name is identified by the empty string and should be // 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) zonesByID := make(map[string]*linodego.Domain)
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameIDMapper.Add(strconv.Itoa(z.ID), z.Domain) 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) endpointsByZone := make(map[string][]*endpoint.Endpoint)
for _, ep := range endpoints { for _, ep := range endpoints {

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package linode
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package ns1
import ( import (
"context" "context"
@ -30,6 +30,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -85,7 +86,7 @@ func (n NS1DomainService) ListZones() ([]*dns.Zone, *http.Response, error) {
// NS1Config passes cli args to the NS1Provider // NS1Config passes cli args to the NS1Provider
type NS1Config struct { type NS1Config struct {
DomainFilter endpoint.DomainFilter DomainFilter endpoint.DomainFilter
ZoneIDFilter ZoneIDFilter ZoneIDFilter provider.ZoneIDFilter
NS1Endpoint string NS1Endpoint string
NS1IgnoreSSL bool NS1IgnoreSSL bool
DryRun bool DryRun bool
@ -95,7 +96,7 @@ type NS1Config struct {
type NS1Provider struct { type NS1Provider struct {
client NS1DomainClient client NS1DomainClient
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
dryRun bool dryRun bool
} }
@ -158,7 +159,7 @@ func (p *NS1Provider) Records(ctx context.Context) ([]*endpoint.Endpoint, error)
} }
for _, record := range zoneData.Records { for _, record := range zoneData.Records {
if supportedRecordType(record.Type) { if provider.SupportedRecordType(record.Type) {
endpoints = append(endpoints, endpoint.NewEndpointWithTTL( endpoints = append(endpoints, endpoint.NewEndpointWithTTL(
record.Domain, record.Domain,
record.Type, 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. // ns1ChangesByZone separates a multi-zone change into a single change per zone.
func ns1ChangesByZone(zones []*dns.Zone, changeSets []*ns1Change) map[string][]*ns1Change { func ns1ChangesByZone(zones []*dns.Zone, changeSets []*ns1Change) map[string][]*ns1Change {
changes := make(map[string][]*ns1Change) changes := make(map[string][]*ns1Change)
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameIDMapper.Add(z.Zone, z.Zone) zoneNameIDMapper.Add(z.Zone, z.Zone)
changes[z.Zone] = []*ns1Change{} changes[z.Zone] = []*ns1Change{}

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package ns1
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package oci
import ( import (
"context" "context"
@ -29,6 +29,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ociRecordTTL = 300 const ociRecordTTL = 300
@ -56,7 +57,7 @@ type OCIProvider struct {
cfg OCIConfig cfg OCIConfig
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
zoneIDFilter ZoneIDFilter zoneIDFilter provider.ZoneIDFilter
dryRun bool dryRun bool
} }
@ -83,7 +84,7 @@ func LoadOCIConfig(path string) (*OCIConfig, error) {
} }
// NewOCIProvider initialises a new OCI DNS based Provider. // 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 var client ociDNSClient
client, err := dns.NewDnsClientWithConfigurationProvider(common.NewRawConfigurationProvider( client, err := dns.NewDnsClientWithConfigurationProvider(common.NewRawConfigurationProvider(
cfg.Auth.TenancyID, cfg.Auth.TenancyID,
@ -177,7 +178,7 @@ func (p *OCIProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, error)
} }
for _, record := range resp.Items { for _, record := range resp.Items {
if !supportedRecordType(*record.Rtype) { if !provider.SupportedRecordType(*record.Rtype) {
continue continue
} }
endpoints = append(endpoints, endpoints = append(endpoints,
@ -252,7 +253,7 @@ func newRecordOperation(ep *endpoint.Endpoint, opType dns.RecordOperationOperati
targets := make([]string, len(ep.Targets)) targets := make([]string, len(ep.Targets))
copy(targets, []string(ep.Targets)) copy(targets, []string(ep.Targets))
if ep.RecordType == endpoint.RecordTypeCNAME { if ep.RecordType == endpoint.RecordTypeCNAME {
targets[0] = ensureTrailingDot(targets[0]) targets[0] = provider.EnsureTrailingDot(targets[0])
} }
rdata := strings.Join(targets, " ") 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 { func operationsByZone(zones map[string]dns.ZoneSummary, ops []dns.RecordOperation) map[string][]dns.RecordOperation {
changes := make(map[string][]dns.RecordOperation) changes := make(map[string][]dns.RecordOperation)
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameIDMapper.Add(*z.Id, *z.Name) zoneNameIDMapper.Add(*z.Id, *z.Name)
changes[*z.Id] = []dns.RecordOperation{} changes[*z.Id] = []dns.RecordOperation{}

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package oci
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package ovh
import ( import (
"context" "context"
@ -28,6 +28,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( 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 { if err := p.client.Get(fmt.Sprintf("/domain/zone/%s/record/%d", *zone, id), &record); err != nil {
return err return err
} }
if supportedRecordType(record.FieldType) { if provider.SupportedRecordType(record.FieldType) {
log.Debugf("OVH: Record %d for %s is %+v", id, *zone, record) log.Debugf("OVH: Record %d for %s is %+v", id, *zone, record)
records <- 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 { func newOvhChange(action int, endpoints []*endpoint.Endpoint, zones []string, records []ovhRecord) []ovhChange {
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
ovhChanges := make([]ovhChange, 0, countTargets(endpoints)) ovhChanges := make([]ovhChange, 0, countTargets(endpoints))
for _, zone := range zones { for _, zone := range zones {
zoneNameIDMapper.Add(zone, zone) zoneNameIDMapper.Add(zone, zone)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package ovh
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package pdns
import ( import (
"bytes" "bytes"
@ -35,6 +35,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/pkg/tlsutils" "sigs.k8s.io/external-dns/pkg/tlsutils"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
type pdnsChangeType string type pdnsChangeType string
@ -310,7 +311,7 @@ func (p *PDNSProvider) ConvertEndpointsToZones(eps []*endpoint.Endpoint, changet
zone.Rrsets = []pgo.RrSet{} zone.Rrsets = []pgo.RrSet{}
for i := 0; i < len(endpoints); { for i := 0; i < len(endpoints); {
ep := endpoints[i] ep := endpoints[i]
dnsname := ensureTrailingDot(ep.DNSName) dnsname := provider.EnsureTrailingDot(ep.DNSName)
if dnsname == zone.Name || strings.HasSuffix(dnsname, "."+zone.Name) { if dnsname == zone.Name || strings.HasSuffix(dnsname, "."+zone.Name) {
// The assumption here is that there will only ever be one target // The assumption here is that there will only ever be one target
// per (ep.DNSName, ep.RecordType) tuple, which holds true for // 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{} records := []pgo.Record{}
for _, t := range ep.Targets { for _, t := range ep.Targets {
if "CNAME" == ep.RecordType { if "CNAME" == ep.RecordType {
t = ensureTrailingDot(t) t = provider.EnsureTrailingDot(t)
} }
records = append(records, pgo.Record{Content: 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 _, zone := range residualZones {
for i := 0; i < len(endpoints); { for i := 0; i < len(endpoints); {
ep := endpoints[i] ep := endpoints[i]
dnsname := ensureTrailingDot(ep.DNSName) dnsname := provider.EnsureTrailingDot(ep.DNSName)
if dnsname == zone.Name || strings.HasSuffix(dnsname, "."+zone.Name) { if dnsname == zone.Name || strings.HasSuffix(dnsname, "."+zone.Name) {
// "pop" endpoint if it's matched to a residual zone... essentially a no-op // "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) log.Debugf("Ignoring Endpoint because it was matched to a zone that was not specified within Domain Filter(s): %s", dnsname)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package pdns
import ( import (
"context" "context"

View File

@ -42,8 +42,8 @@ func (k *contextKey) String() string { return "provider context value " + k.name
// type []*endpoint.Endpoint. // type []*endpoint.Endpoint.
var RecordsContextKey = &contextKey{"records"} var RecordsContextKey = &contextKey{"records"}
// ensureTrailingDot ensures that the hostname receives a trailing dot if it hasn't already. // EnsureTrailingDot ensures that the hostname receives a trailing dot if it hasn't already.
func ensureTrailingDot(hostname string) string { func EnsureTrailingDot(hostname string) string {
if net.ParseIP(hostname) != nil { if net.ParseIP(hostname) != nil {
return hostname return hostname
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package rcode0
import ( import (
"context" "context"
@ -28,6 +28,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
// RcodeZeroProvider implements the DNS provider for RcodeZero Anycast DNS. // 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 { for _, r := range rrset {
if supportedRecordType(r.Type) { if provider.SupportedRecordType(r.Type) {
if p.TXTEncrypt && (p.Key != nil) && strings.EqualFold(r.Type, "TXT") { if p.TXTEncrypt && (p.Key != nil) && strings.EqualFold(r.Type, "TXT") {
p.Client.RRSet.DecryptTXT(p.Key, r) 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 { func rcodezeroChangesByZone(zones []*rc0.Zone, changeSet []*rc0.RRSetChange) map[string][]*rc0.RRSetChange {
changes := make(map[string][]*rc0.RRSetChange) changes := make(map[string][]*rc0.RRSetChange)
zoneNameIDMapper := zoneIDName{} zoneNameIDMapper := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameIDMapper.Add(z.Domain, z.Domain) zoneNameIDMapper.Add(z.Domain, z.Domain)
changes[z.Domain] = []*rc0.RRSetChange{} changes[z.Domain] = []*rc0.RRSetChange{}

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package rcode0
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package rdns
import ( import (
"context" "context"
@ -38,6 +38,7 @@ import (
) )
const ( const (
etcdTimeout = 5 * time.Second
rdnsMaxHosts = 10 rdnsMaxHosts = 10
rdnsOriginalLabel = "originalText" rdnsOriginalLabel = "originalText"
rdnsPrefix = "/rdnsv3" rdnsPrefix = "/rdnsv3"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package rdns
import ( import (
"context" "context"

View File

@ -16,9 +16,9 @@ limitations under the License.
package provider 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. // Currently A, CNAME, SRV, and TXT record types are supported.
func supportedRecordType(recordType string) bool { func SupportedRecordType(recordType string) bool {
switch recordType { switch recordType {
case "A", "CNAME", "SRV", "TXT": case "A", "CNAME", "SRV", "TXT":
return true return true

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package rfc2136
import ( import (
"context" "context"
@ -30,6 +30,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
// rfc2136 provider type // rfc2136 provider type
@ -65,7 +66,7 @@ type rfc2136Actions interface {
} }
// NewRfc2136Provider is a factory function for OpenStack rfc2136 providers // 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] secretAlgChecked, ok := tsigAlgs[secretAlg]
if !ok && !insecure { if !ok && !insecure {
return nil, errors.Errorf("%s is not supported TSIG algorithm", secretAlg) return nil, errors.Errorf("%s is not supported TSIG algorithm", secretAlg)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package rfc2136
import ( import (
"context" "context"

View File

@ -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 ( import (
"context" "context"
@ -12,6 +28,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -72,7 +89,7 @@ func (p *TransIPProvider) ApplyChanges(ctx context.Context, changes *plan.Change
return err return err
} }
zoneNameMapper := zoneIDName{} zoneNameMapper := provider.ZoneIDName{}
zonesByName := make(map[string]transip.Domain) zonesByName := make(map[string]transip.Domain)
updatedZones := make(map[string]bool) updatedZones := make(map[string]bool)
for _, zone := range zones { 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 // go over all zones and their DNS entries and create endpoints for them
for _, zone := range zones { for _, zone := range zones {
for _, r := range zone.DNSEntries { for _, r := range zone.DNSEntries {
if !supportedRecordType(string(r.Type)) { if !provider.SupportedRecordType(string(r.Type)) {
continue 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 // zoneForZoneName returns the zone mapped to given name or error if zone could
// not be found // 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) _, zoneName := m.FindZone(name)
if zoneName == "" { if zoneName == "" {
return transip.Domain{}, fmt.Errorf("could not find zoneName for %s", name) return transip.Domain{}, fmt.Errorf("could not find zoneName for %s", name)

View File

@ -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 ( import (
"testing" "testing"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package vinyldns
import ( import (
"context" "context"
@ -27,6 +27,7 @@ import (
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -48,7 +49,7 @@ type vinyldnsZoneInterface interface {
type vinyldnsProvider struct { type vinyldnsProvider struct {
client vinyldnsZoneInterface client vinyldnsZoneInterface
zoneFilter ZoneIDFilter zoneFilter provider.ZoneIDFilter
domainFilter endpoint.DomainFilter domainFilter endpoint.DomainFilter
dryRun bool dryRun bool
} }
@ -59,7 +60,7 @@ type vinyldnsChange struct {
} }
// NewVinylDNSProvider provides support for VinylDNS records // 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") _, ok := os.LookupEnv("VINYLDNS_ACCESS_KEY")
if !ok { if !ok {
return nil, fmt.Errorf("no vinyldns access key found") 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 { for _, r := range records {
if supportedRecordType(r.Type) { if provider.SupportedRecordType(r.Type) {
recordsCount := len(r.Records) recordsCount := len(r.Records)
log.Debugf(fmt.Sprintf("%s.%s.%d.%s", r.Name, r.Type, recordsCount, zone.Name)) log.Debugf(fmt.Sprintf("%s.%s.%d.%s", r.Name, r.Type, recordsCount, zone.Name))

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package vinyldns
import ( import (
"context" "context"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package vultr
import ( import (
"context" "context"
@ -27,6 +27,7 @@ import (
"github.com/vultr/govultr" "github.com/vultr/govultr"
"sigs.k8s.io/external-dns/endpoint" "sigs.k8s.io/external-dns/endpoint"
"sigs.k8s.io/external-dns/plan" "sigs.k8s.io/external-dns/plan"
"sigs.k8s.io/external-dns/provider"
) )
const ( const (
@ -93,7 +94,7 @@ func (p *VultrProvider) Records(ctx context.Context) ([]*endpoint.Endpoint, erro
} }
for _, r := range records { for _, r := range records {
if supportedRecordType(r.Type) { if provider.SupportedRecordType(r.Type) {
name := fmt.Sprintf("%s.%s", r.Name, zone.Domain) name := fmt.Sprintf("%s.%s", r.Name, zone.Domain)
// root name is identified by the empty string and should be // 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 { func seperateChangesByZone(zones []govultr.DNSDomain, changes []*VultrChanges) map[string][]*VultrChanges {
change := make(map[string][]*VultrChanges) change := make(map[string][]*VultrChanges)
zoneNameID := zoneIDName{} zoneNameID := provider.ZoneIDName{}
for _, z := range zones { for _, z := range zones {
zoneNameID.Add(z.Domain, z.Domain) zoneNameID.Add(z.Domain, z.Domain)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package provider package vultr
import ( import (
"context" "context"

View File

@ -20,7 +20,7 @@ import "strings"
// ZoneIDFilter holds a list of zone ids to filter by // ZoneIDFilter holds a list of zone ids to filter by
type ZoneIDFilter struct { 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 // 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 // Match checks whether a zone matches one of the provided zone ids
func (f ZoneIDFilter) Match(zoneID string) bool { func (f ZoneIDFilter) Match(zoneID string) bool {
// An empty filter includes all zones. // An empty filter includes all zones.
if len(f.zoneIDs) == 0 { if len(f.ZoneIDs) == 0 {
return true return true
} }
for _, id := range f.zoneIDs { for _, id := range f.ZoneIDs {
if strings.HasSuffix(zoneID, id) { if strings.HasSuffix(zoneID, id) {
return true return true
} }

View File

@ -18,13 +18,13 @@ package provider
import "strings" 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 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 { for zoneID, zoneName := range z {
if hostname == zoneName || strings.HasSuffix(hostname, "."+zoneName) { if hostname == zoneName || strings.HasSuffix(hostname, "."+zoneName) {
if suitableZoneName == "" || len(zoneName) > len(suitableZoneName) { if suitableZoneName == "" || len(zoneName) > len(suitableZoneName) {