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"
|
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)
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
@ -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"
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
@ -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"
|
@ -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 {
|
@ -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"
|
@ -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"
|
@ -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"
|
@ -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)
|
@ -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)
|
@ -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"
|
@ -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"
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
@ -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"
|
@ -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
|
@ -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"
|
@ -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
|
@ -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"
|
@ -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{}
|
@ -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"
|
@ -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")
|
@ -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"
|
@ -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) {
|
@ -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"
|
@ -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
|
||||||
|
}
|
@ -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"
|
@ -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,
|
@ -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"
|
@ -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
|
||||||
}
|
}
|
@ -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"
|
@ -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"
|
@ -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"
|
@ -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 {
|
@ -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"
|
@ -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{}
|
@ -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"
|
@ -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{}
|
@ -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"
|
@ -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)
|
@ -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"
|
@ -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)
|
@ -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"
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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{}
|
@ -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"
|
@ -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"
|
@ -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"
|
@ -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
|
||||||
|
@ -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)
|
@ -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"
|
@ -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)
|
@ -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"
|
@ -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))
|
||||||
|
|
@ -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"
|
@ -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)
|
@ -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"
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user