Skip to content

Commit a4522f0

Browse files
authored
chore(domainfilter): use pointer receivers for DomainFilter (kubernetes-sigs#5546)
* refactor(domainfilter): use pointer receivers for DomainFilter * refactor(domainfilter): complete pointer type consistency across providers
1 parent e24f88c commit a4522f0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+148
-154
lines changed

controller/controller_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type mockProvider struct {
4545

4646
type filteredMockProvider struct {
4747
provider.BaseProvider
48-
domainFilter endpoint.DomainFilter
48+
domainFilter *endpoint.DomainFilter
4949
RecordsStore []*endpoint.Endpoint
5050
RecordsCallCount int
5151
ApplyChangesCalls []*plan.Changes
@@ -328,7 +328,7 @@ func TestShouldRunOnce(t *testing.T) {
328328
assert.True(t, ctrl.ShouldRunOnce(now))
329329
}
330330

331-
func testControllerFiltersDomains(t *testing.T, configuredEndpoints []*endpoint.Endpoint, domainFilter endpoint.DomainFilter, providerEndpoints []*endpoint.Endpoint, expectedChanges []*plan.Changes) {
331+
func testControllerFiltersDomains(t *testing.T, configuredEndpoints []*endpoint.Endpoint, domainFilter *endpoint.DomainFilter, providerEndpoints []*endpoint.Endpoint, expectedChanges []*plan.Changes) {
332332
t.Helper()
333333
cfg := externaldns.NewConfig()
334334
cfg.ManagedDNSRecordTypes = []string{endpoint.RecordTypeA, endpoint.RecordTypeAAAA, endpoint.RecordTypeCNAME}
@@ -402,7 +402,7 @@ func TestWhenNoFilterControllerConsidersAllComain(t *testing.T) {
402402
Targets: endpoint.Targets{"8.8.8.8"},
403403
},
404404
},
405-
endpoint.DomainFilter{},
405+
&endpoint.DomainFilter{},
406406
[]*endpoint.Endpoint{
407407
{
408408
DNSName: "some-record.used.tld",

controller/execute.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func Execute() {
145145
func buildProvider(
146146
ctx context.Context,
147147
cfg *externaldns.Config,
148-
domainFilter endpoint.DomainFilter,
148+
domainFilter *endpoint.DomainFilter,
149149
) (provider.Provider, error) {
150150
var p provider.Provider
151151
var err error
@@ -339,7 +339,7 @@ func buildProvider(
339339
return p, err
340340
}
341341

342-
func buildController(cfg *externaldns.Config, src source.Source, p provider.Provider, filter endpoint.DomainFilter) (*Controller, error) {
342+
func buildController(cfg *externaldns.Config, src source.Source, p provider.Provider, filter *endpoint.DomainFilter) (*Controller, error) {
343343
policy, ok := plan.Policies[cfg.Policy]
344344
if !ok {
345345
return nil, fmt.Errorf("unknown policy: %s", cfg.Policy)
@@ -429,7 +429,7 @@ func buildSource(ctx context.Context, cfg *externaldns.Config) (source.Source, e
429429
}
430430

431431
// RegexDomainFilter overrides DomainFilter
432-
func createDomainFilter(cfg *externaldns.Config) endpoint.DomainFilter {
432+
func createDomainFilter(cfg *externaldns.Config) *endpoint.DomainFilter {
433433
if cfg.RegexDomainFilter != nil && cfg.RegexDomainFilter.String() != "" {
434434
return endpoint.NewRegexDomainFilter(cfg.RegexDomainFilter, cfg.RegexDomainExclusion)
435435
} else {

controller/execute_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func TestCreateDomainFilter(t *testing.T) {
134134
tests := []struct {
135135
name string
136136
cfg *externaldns.Config
137-
expectedDomainFilter endpoint.DomainFilter
137+
expectedDomainFilter *endpoint.DomainFilter
138138
isConfigured bool
139139
}{
140140
{

endpoint/domain_filter.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,23 +80,26 @@ func prepareFilters(filters []string) []string {
8080
}
8181

8282
// NewDomainFilterWithExclusions returns a new DomainFilter, given a list of matches and exclusions
83-
func NewDomainFilterWithExclusions(domainFilters []string, excludeDomains []string) DomainFilter {
84-
return DomainFilter{Filters: prepareFilters(domainFilters), exclude: prepareFilters(excludeDomains)}
83+
func NewDomainFilterWithExclusions(domainFilters []string, excludeDomains []string) *DomainFilter {
84+
return &DomainFilter{Filters: prepareFilters(domainFilters), exclude: prepareFilters(excludeDomains)}
8585
}
8686

8787
// NewDomainFilter returns a new DomainFilter given a comma separated list of domains
88-
func NewDomainFilter(domainFilters []string) DomainFilter {
89-
return DomainFilter{Filters: prepareFilters(domainFilters)}
88+
func NewDomainFilter(domainFilters []string) *DomainFilter {
89+
return &DomainFilter{Filters: prepareFilters(domainFilters)}
9090
}
9191

9292
// NewRegexDomainFilter returns a new DomainFilter given a regular expression
93-
func NewRegexDomainFilter(regexDomainFilter *regexp.Regexp, regexDomainExclusion *regexp.Regexp) DomainFilter {
94-
return DomainFilter{regex: regexDomainFilter, regexExclusion: regexDomainExclusion}
93+
func NewRegexDomainFilter(regexDomainFilter *regexp.Regexp, regexDomainExclusion *regexp.Regexp) *DomainFilter {
94+
return &DomainFilter{regex: regexDomainFilter, regexExclusion: regexDomainExclusion}
9595
}
9696

9797
// Match checks whether a domain can be found in the DomainFilter.
9898
// RegexFilter takes precedence over Filters
99-
func (df DomainFilter) Match(domain string) bool {
99+
func (df *DomainFilter) Match(domain string) bool {
100+
if df == nil {
101+
return true // nil filter matches everything
102+
}
100103
if df.regex != nil && df.regex.String() != "" || df.regexExclusion != nil && df.regexExclusion.String() != "" {
101104
return matchRegex(df.regex, df.regexExclusion, domain)
102105
}
@@ -145,7 +148,10 @@ func matchRegex(regex *regexp.Regexp, negativeRegex *regexp.Regexp, domain strin
145148
}
146149

147150
// IsConfigured returns true if any inclusion or exclusion rules have been specified.
148-
func (df DomainFilter) IsConfigured() bool {
151+
func (df *DomainFilter) IsConfigured() bool {
152+
if df == nil {
153+
return false // nil filter is not configured
154+
}
149155
if df.regex != nil && df.regex.String() != "" {
150156
return true
151157
} else if df.regexExclusion != nil && df.regexExclusion.String() != "" {
@@ -154,7 +160,14 @@ func (df DomainFilter) IsConfigured() bool {
154160
return len(df.Filters) > 0 || len(df.exclude) > 0
155161
}
156162

157-
func (df DomainFilter) MarshalJSON() ([]byte, error) {
163+
func (df *DomainFilter) MarshalJSON() ([]byte, error) {
164+
if df == nil {
165+
// compatibility with nil DomainFilter
166+
return json.Marshal(domainFilterSerde{
167+
Include: nil,
168+
Exclude: nil,
169+
})
170+
}
158171
if df.regex != nil || df.regexExclusion != nil {
159172
var include, exclude string
160173
if df.regex != nil {
@@ -184,7 +197,7 @@ func (df *DomainFilter) UnmarshalJSON(b []byte) error {
184197
}
185198

186199
if deserialized.RegexInclude == "" && deserialized.RegexExclude == "" {
187-
*df = NewDomainFilterWithExclusions(deserialized.Include, deserialized.Exclude)
200+
*df = *NewDomainFilterWithExclusions(deserialized.Include, deserialized.Exclude)
188201
return nil
189202
}
190203

@@ -205,11 +218,14 @@ func (df *DomainFilter) UnmarshalJSON(b []byte) error {
205218
return fmt.Errorf("invalid regexExclude: %w", err)
206219
}
207220
}
208-
*df = NewRegexDomainFilter(include, exclude)
221+
*df = *NewRegexDomainFilter(include, exclude)
209222
return nil
210223
}
211224

212-
func (df DomainFilter) MatchParent(domain string) bool {
225+
func (df *DomainFilter) MatchParent(domain string) bool {
226+
if df == nil {
227+
return true // nil filter matches everything
228+
}
213229
if matchFilter(df.exclude, domain, false) {
214230
return false
215231
}

endpoint/domain_filter_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -701,22 +701,22 @@ func TestDomainFilterDeserializeError(t *testing.T) {
701701
}
702702
}
703703

704-
func assertSerializes[T any](t *testing.T, domainFilter DomainFilter, expectedSerialization map[string]T) {
704+
func assertSerializes[T any](t *testing.T, domainFilter *DomainFilter, expectedSerialization map[string]T) {
705705
serialized, err := json.Marshal(domainFilter)
706706
assert.NoError(t, err, "serializing")
707707
expected, err := json.Marshal(expectedSerialization)
708708
require.NoError(t, err)
709709
assert.JSONEq(t, string(expected), string(serialized), "json serialization")
710710
}
711711

712-
func deserialize[T any](t *testing.T, serialized map[string]T) DomainFilter {
712+
func deserialize[T any](t *testing.T, serialized map[string]T) *DomainFilter {
713713
inJson, err := json.Marshal(serialized)
714714
require.NoError(t, err)
715715
var deserialized DomainFilter
716716
err = json.Unmarshal(inJson, &deserialized)
717717
assert.NoError(t, err, "deserializing")
718718

719-
return deserialized
719+
return &deserialized
720720
}
721721

722722
func TestDomainFilterMatchParent(t *testing.T) {

plan/plan_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ func (suite *PlanTestSuite) TestDomainFiltersInitial() {
902902
Policies: []Policy{&SyncPolicy{}},
903903
Current: current,
904904
Desired: desired,
905-
DomainFilter: endpoint.MatchAllDomainFilters{&domainFilter},
905+
DomainFilter: endpoint.MatchAllDomainFilters{domainFilter},
906906
ManagedRecords: []string{endpoint.RecordTypeA, endpoint.RecordTypeCNAME},
907907
}
908908

@@ -926,7 +926,7 @@ func (suite *PlanTestSuite) TestDomainFiltersUpdate() {
926926
Policies: []Policy{&SyncPolicy{}},
927927
Current: current,
928928
Desired: desired,
929-
DomainFilter: endpoint.MatchAllDomainFilters{&domainFilter},
929+
DomainFilter: endpoint.MatchAllDomainFilters{domainFilter},
930930
ManagedRecords: []string{endpoint.RecordTypeA, endpoint.RecordTypeCNAME},
931931
}
932932

provider/akamai/akamai.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ type AkamaiDNSService interface {
5151
}
5252

5353
type AkamaiConfig struct {
54-
DomainFilter endpoint.DomainFilter
54+
DomainFilter *endpoint.DomainFilter
5555
ZoneIDFilter provider.ZoneIDFilter
5656
ServiceConsumerDomain string
5757
ClientToken string
@@ -68,7 +68,7 @@ type AkamaiConfig struct {
6868
type AkamaiProvider struct {
6969
provider.BaseProvider
7070
// Edgedns zones to filter on
71-
domainFilter endpoint.DomainFilter
71+
domainFilter *endpoint.DomainFilter
7272
// Contract Ids to filter on
7373
zoneIDFilter provider.ZoneIDFilter
7474
// Edgegrid library configuration

provider/akamai/akamai_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func newStub() *edgednsStub {
4949
}
5050
}
5151

52-
func createAkamaiStubProvider(stub *edgednsStub, domfilter endpoint.DomainFilter, idfilter provider.ZoneIDFilter) (*AkamaiProvider, error) {
52+
func createAkamaiStubProvider(stub *edgednsStub, domfilter *endpoint.DomainFilter, idfilter provider.ZoneIDFilter) (*AkamaiProvider, error) {
5353
akamaiConfig := AkamaiConfig{
5454
DomainFilter: domfilter,
5555
ZoneIDFilter: idfilter,
@@ -153,7 +153,7 @@ func (r *edgednsStub) UpdateRecord(record *dns.RecordBody, zone string, recLock
153153
// Test FetchZones
154154
func TestFetchZonesZoneIDFilter(t *testing.T) {
155155
stub := newStub()
156-
domfilter := endpoint.DomainFilter{}
156+
domfilter := &endpoint.DomainFilter{}
157157
idfilter := provider.NewZoneIDFilter([]string{"Test"})
158158
c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
159159
assert.NoError(t, err)
@@ -186,7 +186,7 @@ func TestFetchZonesEmpty(t *testing.T) {
186186
// TestAkamaiRecords tests record endpoint
187187
func TestAkamaiRecords(t *testing.T) {
188188
stub := newStub()
189-
domfilter := endpoint.DomainFilter{}
189+
domfilter := &endpoint.DomainFilter{}
190190
idfilter := provider.ZoneIDFilter{}
191191
c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
192192
require.NoError(t, err)
@@ -221,7 +221,7 @@ func TestAkamaiRecords(t *testing.T) {
221221

222222
func TestAkamaiRecordsEmpty(t *testing.T) {
223223
stub := newStub()
224-
domfilter := endpoint.DomainFilter{}
224+
domfilter := &endpoint.DomainFilter{}
225225
idfilter := provider.NewZoneIDFilter([]string{"Nonexistent"})
226226
c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
227227
require.NoError(t, err)
@@ -265,7 +265,7 @@ func TestAkamaiRecordsFilters(t *testing.T) {
265265
// (p AkamaiProvider) createRecordsets(zoneNameIDMapper provider.ZoneIDName, endpoints []*endpoint.Endpoint) error
266266
func TestCreateRecords(t *testing.T) {
267267
stub := newStub()
268-
domfilter := endpoint.DomainFilter{}
268+
domfilter := &endpoint.DomainFilter{}
269269
idfilter := provider.ZoneIDFilter{}
270270
c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
271271
assert.NoError(t, err)
@@ -281,7 +281,7 @@ func TestCreateRecords(t *testing.T) {
281281

282282
func TestCreateRecordsDomainFilter(t *testing.T) {
283283
stub := newStub()
284-
domfilter := endpoint.DomainFilter{}
284+
domfilter := &endpoint.DomainFilter{}
285285
idfilter := provider.ZoneIDFilter{}
286286
c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
287287
assert.NoError(t, err)
@@ -299,7 +299,7 @@ func TestCreateRecordsDomainFilter(t *testing.T) {
299299
// TestDeleteRecords validate delete
300300
func TestDeleteRecords(t *testing.T) {
301301
stub := newStub()
302-
domfilter := endpoint.DomainFilter{}
302+
domfilter := &endpoint.DomainFilter{}
303303
idfilter := provider.ZoneIDFilter{}
304304
c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
305305
assert.NoError(t, err)
@@ -333,7 +333,7 @@ func TestDeleteRecordsDomainFilter(t *testing.T) {
333333
// Test record update func
334334
func TestUpdateRecords(t *testing.T) {
335335
stub := newStub()
336-
domfilter := endpoint.DomainFilter{}
336+
domfilter := &endpoint.DomainFilter{}
337337
idfilter := provider.ZoneIDFilter{}
338338
c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
339339
require.NoError(t, err)

provider/alibabacloud/alibaba_cloud.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ type AlibabaCloudPrivateZoneAPI interface {
7070
// AlibabaCloudProvider implements the DNS provider for Alibaba Cloud.
7171
type AlibabaCloudProvider struct {
7272
provider.BaseProvider
73-
domainFilter endpoint.DomainFilter
73+
domainFilter *endpoint.DomainFilter
7474
zoneIDFilter provider.ZoneIDFilter // Private Zone only
7575
MaxChangeCount int
7676
EvaluateTargetHealth bool
@@ -97,7 +97,7 @@ type alibabaCloudConfig struct {
9797
// NewAlibabaCloudProvider creates a new Alibaba Cloud provider.
9898
//
9999
// Returns the provider or an error if a provider could not be created.
100-
func NewAlibabaCloudProvider(configFile string, domainFilter endpoint.DomainFilter, zoneIDFileter provider.ZoneIDFilter, zoneType string, dryRun bool) (*AlibabaCloudProvider, error) {
100+
func NewAlibabaCloudProvider(configFile string, domainFilter *endpoint.DomainFilter, zoneIDFileter provider.ZoneIDFilter, zoneType string, dryRun bool) (*AlibabaCloudProvider, error) {
101101
cfg := alibabaCloudConfig{}
102102
if configFile != "" {
103103
contents, err := os.ReadFile(configFile)

provider/aws/aws.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ type AWSProvider struct {
279279
batchChangeInterval time.Duration
280280
evaluateTargetHealth bool
281281
// only consider hosted zones managing domains ending in this suffix
282-
domainFilter endpoint.DomainFilter
282+
domainFilter *endpoint.DomainFilter
283283
// filter hosted zones by id
284284
zoneIDFilter provider.ZoneIDFilter
285285
// filter hosted zones by type (e.g. private or public)
@@ -296,7 +296,7 @@ type AWSProvider struct {
296296

297297
// AWSConfig contains configuration to create a new AWS provider.
298298
type AWSConfig struct {
299-
DomainFilter endpoint.DomainFilter
299+
DomainFilter *endpoint.DomainFilter
300300
ZoneIDFilter provider.ZoneIDFilter
301301
ZoneTypeFilter provider.ZoneTypeFilter
302302
ZoneTagFilter provider.ZoneTagFilter
@@ -624,7 +624,7 @@ func (p *AWSProvider) GetDomainFilter() endpoint.DomainFilterInterface {
624624
zones, err := p.Zones(context.Background())
625625
if err != nil {
626626
log.Errorf("failed to list zones: %v", err)
627-
return endpoint.DomainFilter{}
627+
return &endpoint.DomainFilter{}
628628
}
629629
zoneNames := []string(nil)
630630
for _, z := range zones {

0 commit comments

Comments
 (0)