-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Import external dns plan package and txt registry
Move the external-dns plan package into this repo along with the txt registry. To ease development we will initially just work off a copy of the relevant external-dns code in this repo. When we have a solution that works for us we will look into how we can submit that back to external-dns. Code is copied, unmodified where possible, from the v0.14.1 version of external-dns. https://github.com/kubernetes-sigs/external-dns/tree/v0.14.1
- Loading branch information
Showing
14 changed files
with
4,407 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,10 +5,13 @@ go 1.21 | |
require ( | ||
github.com/aws/aws-sdk-go v1.44.311 | ||
github.com/go-logr/logr v1.3.0 | ||
github.com/google/uuid v1.3.1 | ||
github.com/goombaio/namegenerator v0.0.0-20181006234301-989e774b106e | ||
github.com/onsi/ginkgo/v2 v2.13.2 | ||
github.com/onsi/gomega v1.30.0 | ||
github.com/prometheus/client_golang v1.17.0 | ||
github.com/sirupsen/logrus v1.9.3 | ||
github.com/stretchr/testify v1.8.4 | ||
google.golang.org/api v0.134.0 | ||
k8s.io/api v0.28.3 | ||
k8s.io/apimachinery v0.28.3 | ||
|
@@ -48,7 +51,6 @@ require ( | |
github.com/google/gofuzz v1.2.0 // indirect | ||
github.com/google/pprof v0.0.0-20221212185716-aee1124e3a93 // indirect | ||
github.com/google/s2a-go v0.1.4 // indirect | ||
github.com/google/uuid v1.3.1 // indirect | ||
github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect | ||
github.com/googleapis/gax-go/v2 v2.12.0 // indirect | ||
github.com/imdario/mergo v0.3.16 // indirect | ||
|
@@ -64,11 +66,11 @@ require ( | |
github.com/openshift/api v0.0.0-20230607130528-611114dca681 // indirect | ||
github.com/openshift/client-go v0.0.0-20230607134213-3cd0021bbee3 // indirect | ||
github.com/pkg/errors v0.9.1 // indirect | ||
github.com/pmezard/go-difflib v1.0.0 // indirect | ||
github.com/projectcontour/contour v1.25.2 // indirect | ||
github.com/prometheus/client_model v0.5.0 // indirect | ||
github.com/prometheus/common v0.45.0 // indirect | ||
github.com/prometheus/procfs v0.12.0 // indirect | ||
github.com/sirupsen/logrus v1.9.3 // indirect | ||
github.com/spf13/pflag v1.0.5 // indirect | ||
go.opencensus.io v0.24.0 // indirect | ||
go.uber.org/multierr v1.11.0 // indirect | ||
|
@@ -104,8 +106,6 @@ require ( | |
sigs.k8s.io/yaml v1.4.0 // indirect | ||
) | ||
|
||
replace sigs.k8s.io/external-dns => github.com/kuadrant/external-dns v0.0.0-20240315162317-073094ed9bea | ||
|
||
// To Update with changes from v0.14.0_kuadrant run: | ||
// go mod edit --replace sigs.k8s.io/external-dns=github.com/kuadrant/[email protected]_kuadrant | ||
// go mod tidy | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
/* | ||
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 plan | ||
|
||
import ( | ||
"sort" | ||
|
||
log "github.com/sirupsen/logrus" | ||
|
||
"sigs.k8s.io/external-dns/endpoint" | ||
) | ||
|
||
// ConflictResolver is used to make a decision in case of two or more different kubernetes resources | ||
// are trying to acquire same DNS name | ||
type ConflictResolver interface { | ||
ResolveCreate(candidates []*endpoint.Endpoint) *endpoint.Endpoint | ||
ResolveUpdate(current *endpoint.Endpoint, candidates []*endpoint.Endpoint) *endpoint.Endpoint | ||
ResolveRecordTypes(key planKey, row *planTableRow) map[string]*domainEndpoints | ||
} | ||
|
||
// PerResource allows only one resource to own a given dns name | ||
type PerResource struct{} | ||
|
||
// ResolveCreate is invoked when dns name is not owned by any resource | ||
// ResolveCreate takes "minimal" (string comparison of Target) endpoint to acquire the DNS record | ||
func (s PerResource) ResolveCreate(candidates []*endpoint.Endpoint) *endpoint.Endpoint { | ||
var min *endpoint.Endpoint | ||
for _, ep := range candidates { | ||
if min == nil || s.less(ep, min) { | ||
min = ep | ||
} | ||
} | ||
return min | ||
} | ||
|
||
// ResolveUpdate is invoked when dns name is already owned by "current" endpoint | ||
// ResolveUpdate uses "current" record as base and updates it accordingly with new version of same resource | ||
// if it doesn't exist then pick min | ||
func (s PerResource) ResolveUpdate(current *endpoint.Endpoint, candidates []*endpoint.Endpoint) *endpoint.Endpoint { | ||
currentResource := current.Labels[endpoint.ResourceLabelKey] // resource which has already acquired the DNS | ||
// TODO: sort candidates only needed because we can still have two endpoints from same resource here. We sort for consistency | ||
// TODO: remove once single endpoint can have multiple targets | ||
sort.SliceStable(candidates, func(i, j int) bool { | ||
return s.less(candidates[i], candidates[j]) | ||
}) | ||
for _, ep := range candidates { | ||
if ep.Labels[endpoint.ResourceLabelKey] == currentResource { | ||
return ep | ||
} | ||
} | ||
return s.ResolveCreate(candidates) | ||
} | ||
|
||
// ResolveRecordTypes attempts to detect and resolve record type conflicts in desired | ||
// endpoints for a domain. For eample if the there is more than 1 candidate and at lease one | ||
// of them is a CNAME. Per [RFC 1034 3.6.2] domains that contain a CNAME can not contain any | ||
// other record types. The default policy will prefer A and AAAA record types when a conflict is | ||
// detected (consistent with [endpoint.Targets.Less]). | ||
// | ||
// [RFC 1034 3.6.2]: https://datatracker.ietf.org/doc/html/rfc1034#autoid-15 | ||
func (s PerResource) ResolveRecordTypes(key planKey, row *planTableRow) map[string]*domainEndpoints { | ||
// no conflicts if only a single desired record type for the domain | ||
if len(row.candidates) <= 1 { | ||
return row.records | ||
} | ||
|
||
cname := false | ||
other := false | ||
for _, c := range row.candidates { | ||
if c.RecordType == endpoint.RecordTypeCNAME { | ||
cname = true | ||
} else { | ||
other = true | ||
} | ||
|
||
if cname && other { | ||
break | ||
} | ||
} | ||
|
||
// conflict was found, remove candiates of non-preferred record types | ||
if cname && other { | ||
log.Infof("Domain %s contains conflicting record type candidates; discarding CNAME record", key.dnsName) | ||
records := map[string]*domainEndpoints{} | ||
for recordType, recs := range row.records { | ||
// policy is to prefer the non-CNAME record types when a conflict is found | ||
if recordType == endpoint.RecordTypeCNAME { | ||
// discard candidates of conflicting records | ||
// keep currect so they can be deleted | ||
records[recordType] = &domainEndpoints{ | ||
current: recs.current, | ||
candidates: []*endpoint.Endpoint{}, | ||
} | ||
} else { | ||
records[recordType] = recs | ||
} | ||
} | ||
|
||
return records | ||
} | ||
|
||
// no conflict, return all records types | ||
return row.records | ||
} | ||
|
||
// less returns true if endpoint x is less than y | ||
func (s PerResource) less(x, y *endpoint.Endpoint) bool { | ||
return x.Targets.IsLess(y.Targets) | ||
} | ||
|
||
// TODO: with cross-resource/cross-cluster setup alternative variations of ConflictResolver can be used |
Oops, something went wrong.