mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-05 17:16:59 +02:00
restructures the providers (build only)
Signed-off-by: Raffaele Di Fazio <difazio.raffaele@gmail.com>
This commit is contained in:
parent
4c7c3be807
commit
db4224c705
102
main.go
102
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)
|
||||
}
|
||||
|
@ -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) {
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package akamai
|
||||
|
||||
import (
|
||||
"bytes"
|
@ -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
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package alibabacloud
|
||||
|
||||
import (
|
||||
"context"
|
@ -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 {
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package aws
|
||||
|
||||
import (
|
||||
"context"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package awssd
|
||||
|
||||
import (
|
||||
"context"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package awssd
|
||||
|
||||
import (
|
||||
"context"
|
@ -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)
|
@ -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)
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package azure
|
||||
|
||||
import (
|
||||
"context"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package azure
|
||||
|
||||
import (
|
||||
"context"
|
@ -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
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package cloudflare
|
||||
|
||||
import (
|
||||
"context"
|
@ -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
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package coredns
|
||||
|
||||
import (
|
||||
"context"
|
@ -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
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package designate
|
||||
|
||||
import (
|
||||
"context"
|
@ -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{}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package digitalocean
|
||||
|
||||
import (
|
||||
"context"
|
@ -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")
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package dnsimple
|
||||
|
||||
import (
|
||||
"context"
|
@ -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) {
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package dyn
|
||||
|
||||
import (
|
||||
"errors"
|
@ -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
|
||||
}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package exoscale
|
||||
|
||||
import (
|
||||
"context"
|
@ -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,
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package google
|
||||
|
||||
import (
|
||||
"fmt"
|
@ -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
|
||||
}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package infoblox
|
||||
|
||||
import (
|
||||
"context"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package inmemory
|
||||
|
||||
import (
|
||||
"context"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package inmemory
|
||||
|
||||
import (
|
||||
"context"
|
@ -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 {
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package linode
|
||||
|
||||
import (
|
||||
"context"
|
@ -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{}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package ns1
|
||||
|
||||
import (
|
||||
"context"
|
@ -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{}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package oci
|
||||
|
||||
import (
|
||||
"context"
|
@ -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)
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package ovh
|
||||
|
||||
import (
|
||||
"context"
|
@ -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)
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package pdns
|
||||
|
||||
import (
|
||||
"context"
|
@ -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
|
||||
}
|
||||
|
@ -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{}
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package rcode0
|
||||
|
||||
import (
|
||||
"context"
|
@ -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"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package rdns
|
||||
|
||||
import (
|
||||
"context"
|
@ -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
|
||||
|
@ -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)
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package rfc2136
|
||||
|
||||
import (
|
||||
"context"
|
@ -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)
|
@ -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"
|
@ -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))
|
||||
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package vinyldns
|
||||
|
||||
import (
|
||||
"context"
|
@ -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)
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package provider
|
||||
package vultr
|
||||
|
||||
import (
|
||||
"context"
|
@ -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
|
||||
}
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user