Skip to content

Commit

Permalink
Update Providers to ignore unrecognized ProviderSpecificProperty's
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinfrommelt committed Aug 31, 2024
1 parent 1d227fa commit c4fcd5c
Show file tree
Hide file tree
Showing 13 changed files with 327 additions and 90 deletions.
55 changes: 55 additions & 0 deletions endpoint/provider_specific_property_filter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
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 endpoint

import (
"strings"
)

type ProviderSpecificPropertyFilter struct {
// Names of the provider specific properties to match
Names []string
// Prefixes of the provider specific properties to match
Prefixes []string
}

// Match checks whether a ProviderSpecificProperty.Name can be found in the
// ProviderSpecificPropertyFilter.
func (pf ProviderSpecificPropertyFilter) Match(name string) bool {
for _, pfName := range pf.Names {
if pfName == name {
return true
}
}
for _, prefix := range pf.Prefixes {
if strings.HasPrefix(name, prefix) {
return true
}
}
return false
}

// Filter removes all ProviderSpecificProperty's that don't match from every endpoint.
func (pf ProviderSpecificPropertyFilter) Filter(endpoints []*Endpoint) {
for _, ep := range endpoints {
for _, providerSpecific := range ep.ProviderSpecific {
if !pf.Match(providerSpecific.Name) {
ep.DeleteProviderSpecificProperty(providerSpecific.Name)
}
}
}
}
20 changes: 13 additions & 7 deletions provider/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ const (
sameZoneAlias = "same-zone"
)

var awsProviderSpecificPropertyFilter = endpoint.ProviderSpecificPropertyFilter{
Names: []string{providerSpecificAlias},
Prefixes: []string{"aws/"},
}

// see: https://docs.aws.amazon.com/general/latest/gr/elb.html
var canonicalHostedZones = map[string]string{
// Application Load Balancers and Classic Load Balancers
Expand Down Expand Up @@ -296,6 +301,9 @@ func NewAWSProvider(awsConfig AWSConfig, clients map[string]Route53API) (*AWSPro
dryRun: awsConfig.DryRun,
zonesCache: &zonesListCache{duration: awsConfig.ZoneCacheDuration},
failedChangesQueue: make(map[string]Route53Changes),
BaseProvider: provider.BaseProvider{
ProviderSpecificPropertyFilter: awsProviderSpecificPropertyFilter,
},
}

return provider, nil
Expand Down Expand Up @@ -726,6 +734,11 @@ func (p *AWSProvider) newChanges(action string, endpoints []*endpoint.Endpoint)
// Example: CNAME endpoints pointing to ELBs will have a `alias` provider-specific property
// added to match the endpoints generated from existing alias records in Route53.
func (p *AWSProvider) AdjustEndpoints(endpoints []*endpoint.Endpoint) ([]*endpoint.Endpoint, error) {
endpoints, err := p.BaseProvider.AdjustEndpoints(endpoints)
if err != nil {
return endpoints, err
}

for _, ep := range endpoints {
alias := false

Expand Down Expand Up @@ -766,13 +779,6 @@ func (p *AWSProvider) AdjustEndpoints(endpoints []*endpoint.Endpoint) ([]*endpoi
} else {
ep.DeleteProviderSpecificProperty(providerSpecificEvaluateTargetHealth)
}

// Remove non-AWS provider specific properties
for _, providerSpecific := range ep.ProviderSpecific {
if providerSpecific.Name != providerSpecificAlias && providerSpecific.Name[0:4] != "aws/" {
ep.DeleteProviderSpecificProperty(providerSpecific.Name)
}
}
}
return endpoints, nil
}
Expand Down
3 changes: 3 additions & 0 deletions provider/aws/aws_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1920,6 +1920,9 @@ func newAWSProviderWithTagFilter(t *testing.T, domainFilter endpoint.DomainFilte
dryRun: false,
zonesCache: &zonesListCache{duration: 1 * time.Minute},
failedChangesQueue: make(map[string]Route53Changes),
BaseProvider: provider.BaseProvider{
ProviderSpecificPropertyFilter: awsProviderSpecificPropertyFilter,
},
}

createAWSZone(t, provider, &route53.HostedZone{
Expand Down
13 changes: 13 additions & 0 deletions provider/cloudflare/cloudflare.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,13 @@ const (
cloudFlareUpdate = "UPDATE"
// defaultCloudFlareRecordTTL 1 = automatic
defaultCloudFlareRecordTTL = 1
providerSpecificProxied = "external-dns.alpha.kubernetes.io/cloudflare-proxied"
)

var cloudflareProviderSpecificPropertyFilter = endpoint.ProviderSpecificPropertyFilter{
Names: []string{providerSpecificProxied},
}

// We have to use pointers to bools now, as the upstream cloudflare-go library requires them
// see: https://github.com/cloudflare/cloudflare-go/pull/595

Expand Down Expand Up @@ -192,6 +197,9 @@ func NewCloudFlareProvider(domainFilter endpoint.DomainFilter, zoneIDFilter prov
proxiedByDefault: proxiedByDefault,
DryRun: dryRun,
DNSRecordsPerPage: dnsRecordsPerPage,
BaseProvider: provider.BaseProvider{
ProviderSpecificPropertyFilter: cloudflareProviderSpecificPropertyFilter,
},
}
return provider, nil
}
Expand Down Expand Up @@ -392,6 +400,11 @@ func (p *CloudFlareProvider) submitChanges(ctx context.Context, changes []*cloud

// AdjustEndpoints modifies the endpoints as needed by the specific provider
func (p *CloudFlareProvider) AdjustEndpoints(endpoints []*endpoint.Endpoint) ([]*endpoint.Endpoint, error) {
endpoints, err := p.BaseProvider.AdjustEndpoints(endpoints)
if err != nil {
return endpoints, err
}

adjustedEndpoints := []*endpoint.Endpoint{}
for _, e := range endpoints {
proxied := shouldBeProxied(e, p.proxiedByDefault)
Expand Down
Loading

0 comments on commit c4fcd5c

Please sign in to comment.