From e44aa65378acf6a8de40afe119b1a9269b01da13 Mon Sep 17 00:00:00 2001 From: Greg Sidelinger Date: Tue, 12 Dec 2023 17:41:01 +0000 Subject: [PATCH 1/6] Update rfc2136 provider to send zone updates one zone at a time Signed-off-by: Greg Sidelinger --- provider/rfc2136/rfc2136.go | 77 +++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/provider/rfc2136/rfc2136.go b/provider/rfc2136/rfc2136.go index 8353bc2d9..db2598c29 100644 --- a/provider/rfc2136/rfc2136.go +++ b/provider/rfc2136/rfc2136.go @@ -256,7 +256,11 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes for c, chunk := range chunkBy(changes.Create, r.batchChangeSize) { log.Debugf("Processing batch %d of create changes", c) - m := new(dns.Msg) + m := make(map[string]*dns.Msg) + for _, z := range r.zoneNames { + z = dns.Fqdn(z) + m[z] = new(dns.Msg) + } for _, ep := range chunk { if !r.domainFilter.Match(ep.DNSName) { log.Debugf("Skipping record %s because it was filtered out by the specified --domain-filter", ep.DNSName) @@ -265,18 +269,21 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes zone := findMsgZone(ep, r.zoneNames) r.krb5Realm = strings.ToUpper(zone) - m.SetUpdate(zone) + m[zone].SetUpdate(zone) - r.AddRecord(m, ep) + r.AddRecord(m[zone], ep) } // only send if there are records available - if len(m.Ns) > 0 { - err := r.actions.SendMessage(m) - if err != nil { - log.Errorf("RFC2136 update failed: %v", err) - errors = append(errors, err) - continue + for _, z := range r.zoneNames { + z = dns.Fqdn(z) + if len(m[z].Ns) > 0 { + err := r.actions.SendMessage(m[z]) + if err != nil { + log.Errorf("RFC2136 update failed: %v", err) + errors = append(errors, err) + continue + } } } } @@ -284,7 +291,11 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes for c, chunk := range chunkBy(changes.UpdateNew, r.batchChangeSize) { log.Debugf("Processing batch %d of update changes", c) - m := new(dns.Msg) + m := make(map[string]*dns.Msg) + for _, z := range r.zoneNames { + z = dns.Fqdn(z) + m[z] = new(dns.Msg) + } for i, ep := range chunk { if !r.domainFilter.Match(ep.DNSName) { @@ -294,18 +305,21 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes zone := findMsgZone(ep, r.zoneNames) r.krb5Realm = strings.ToUpper(zone) - m.SetUpdate(zone) + m[zone].SetUpdate(zone) - r.UpdateRecord(m, changes.UpdateOld[i], ep) + r.UpdateRecord(m[zone], changes.UpdateOld[i], ep) } // only send if there are records available - if len(m.Ns) > 0 { - err := r.actions.SendMessage(m) - if err != nil { - log.Errorf("RFC2136 update failed: %v", err) - errors = append(errors, err) - continue + for _, z := range r.zoneNames { + z = dns.Fqdn(z) + if len(m[z].Ns) > 0 { + err := r.actions.SendMessage(m[z]) + if err != nil { + log.Errorf("RFC2136 update failed: %v", err) + errors = append(errors, err) + continue + } } } } @@ -313,8 +327,11 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes for c, chunk := range chunkBy(changes.Delete, r.batchChangeSize) { log.Debugf("Processing batch %d of delete changes", c) - m := new(dns.Msg) - + m := make(map[string]*dns.Msg) + for _, z := range r.zoneNames { + z = dns.Fqdn(z) + m[z] = new(dns.Msg) + } for _, ep := range chunk { if !r.domainFilter.Match(ep.DNSName) { log.Debugf("Skipping record %s because it was filtered out by the specified --domain-filter", ep.DNSName) @@ -323,20 +340,24 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes zone := findMsgZone(ep, r.zoneNames) r.krb5Realm = strings.ToUpper(zone) - m.SetUpdate(zone) + m[zone].SetUpdate(zone) - r.RemoveRecord(m, ep) + r.RemoveRecord(m[zone], ep) } // only send if there are records available - if len(m.Ns) > 0 { - err := r.actions.SendMessage(m) - if err != nil { - log.Errorf("RFC2136 update failed: %v", err) - errors = append(errors, err) - continue + for _, z := range r.zoneNames { + z = dns.Fqdn(z) + if len(m[z].Ns) > 0 { + err := r.actions.SendMessage(m[z]) + if err != nil { + log.Errorf("RFC2136 update failed: %v", err) + errors = append(errors, err) + continue + } } } + } if len(errors) > 0 { From 1418a3ace3c8c600ab258db9c31c7821533e10f4 Mon Sep 17 00:00:00 2001 From: Greg Sidelinger Date: Wed, 20 Dec 2023 13:56:40 +0000 Subject: [PATCH 2/6] Update the rfc2136 mutlizone fix to support the default root zone Add some tests for rfc2136 multizones Signed-off-by: Greg Sidelinger --- provider/rfc2136/rfc2136.go | 24 ++--- provider/rfc2136/rfc2136_test.go | 171 ++++++++++++++++++++++++++++++- 2 files changed, 182 insertions(+), 13 deletions(-) diff --git a/provider/rfc2136/rfc2136.go b/provider/rfc2136/rfc2136.go index db2598c29..f63e33eaa 100644 --- a/provider/rfc2136/rfc2136.go +++ b/provider/rfc2136/rfc2136.go @@ -257,6 +257,7 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes log.Debugf("Processing batch %d of create changes", c) m := make(map[string]*dns.Msg) + m["."] = new(dns.Msg) // Add the root zone for _, z := range r.zoneNames { z = dns.Fqdn(z) m[z] = new(dns.Msg) @@ -275,10 +276,9 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes } // only send if there are records available - for _, z := range r.zoneNames { - z = dns.Fqdn(z) - if len(m[z].Ns) > 0 { - err := r.actions.SendMessage(m[z]) + for _, z := range m { + if len(z.Ns) > 0 { + err := r.actions.SendMessage(z) if err != nil { log.Errorf("RFC2136 update failed: %v", err) errors = append(errors, err) @@ -292,6 +292,7 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes log.Debugf("Processing batch %d of update changes", c) m := make(map[string]*dns.Msg) + m["."] = new(dns.Msg) // Add the root zone for _, z := range r.zoneNames { z = dns.Fqdn(z) m[z] = new(dns.Msg) @@ -311,10 +312,9 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes } // only send if there are records available - for _, z := range r.zoneNames { - z = dns.Fqdn(z) - if len(m[z].Ns) > 0 { - err := r.actions.SendMessage(m[z]) + for _, z := range m { + if len(z.Ns) > 0 { + err := r.actions.SendMessage(z) if err != nil { log.Errorf("RFC2136 update failed: %v", err) errors = append(errors, err) @@ -328,6 +328,7 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes log.Debugf("Processing batch %d of delete changes", c) m := make(map[string]*dns.Msg) + m["."] = new(dns.Msg) // Add the root zone for _, z := range r.zoneNames { z = dns.Fqdn(z) m[z] = new(dns.Msg) @@ -346,10 +347,9 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes } // only send if there are records available - for _, z := range r.zoneNames { - z = dns.Fqdn(z) - if len(m[z].Ns) > 0 { - err := r.actions.SendMessage(m[z]) + for _, z := range m { + if len(z.Ns) > 0 { + err := r.actions.SendMessage(z) if err != nil { log.Errorf("RFC2136 update failed: %v", err) errors = append(errors, err) diff --git a/provider/rfc2136/rfc2136_test.go b/provider/rfc2136/rfc2136_test.go index 26f3d7186..11947b575 100644 --- a/provider/rfc2136/rfc2136_test.go +++ b/provider/rfc2136/rfc2136_test.go @@ -19,6 +19,7 @@ package rfc2136 import ( "context" "fmt" + "regexp" "strings" "testing" "time" @@ -47,7 +48,7 @@ func newStub() *rfc2136Stub { } func (r *rfc2136Stub) SendMessage(msg *dns.Msg) error { - log.Info(msg.String()) + zone := extractZoneFromMessage(msg.String()) lines := extractUpdateSectionFromMessage(msg) for _, line := range lines { // break at first empty line @@ -57,6 +58,11 @@ func (r *rfc2136Stub) SendMessage(msg *dns.Msg) error { line = strings.Replace(line, "\t", " ", -1) log.Info(line) + log.Infof("zone=%s", zone) + record := strings.Split(line, " ")[0] + if !strings.HasSuffix(record, zone) { + return fmt.Errorf("Message contains updates outside of it's zone. zone=%v record=%v", zone, record) + } if strings.Contains(line, " NONE ") { r.updateMsgs = append(r.updateMsgs, msg) @@ -98,12 +104,28 @@ func createRfc2136StubProvider(stub *rfc2136Stub) (provider.Provider, error) { return NewRfc2136Provider("", 0, nil, false, "key", "secret", "hmac-sha512", true, endpoint.DomainFilter{}, false, 300*time.Second, false, "", "", "", 50, stub) } +func createRfc2136StubProviderWithZones(stub *rfc2136Stub) (provider.Provider, error) { + zones := []string{"foo.com", "foobar.com"} + return NewRfc2136Provider("", 0, zones, false, "key", "secret", "hmac-sha512", true, endpoint.DomainFilter{}, false, 300*time.Second, false, "", "", "", 50, stub) +} + +func createRfc2136StubProviderWithZonesFilters(stub *rfc2136Stub) (provider.Provider, error) { + zones := []string{"foo.com", "foobar.com"} + return NewRfc2136Provider("", 0, zones, false, "key", "secret", "hmac-sha512", true, endpoint.DomainFilter{Filters: zones}, false, 300*time.Second, false, "", "", "", 50, stub) +} + func extractUpdateSectionFromMessage(msg fmt.Stringer) []string { const searchPattern = "UPDATE SECTION:" updateSectionOffset := strings.Index(msg.String(), searchPattern) return strings.Split(strings.TrimSpace(msg.String()[updateSectionOffset+len(searchPattern):]), "\n") } +func extractZoneFromMessage(msg string) string { + re := regexp.MustCompile(`ZONE SECTION:\n;(?P[\.,\-,\w,\d]+)\t`) + matches := re.FindStringSubmatch(msg) + return matches[re.SubexpIndex("ZONE")] +} + // TestRfc2136GetRecordsMultipleTargets simulates a single record with multiple targets. func TestRfc2136GetRecordsMultipleTargets(t *testing.T) { stub := newStub() @@ -154,6 +176,32 @@ func TestRfc2136GetRecords(t *testing.T) { assert.True(t, contains(recs, "v2.foo.com")) } +// Make sure the test version of SendMessage raises an error +// if a zone update ever contains records outside of it's zone +// as the TestRfc2136ApplyChanges tests all assume this +func TestRfc2136SendMessage(t *testing.T) { + stub := newStub() + + m := new(dns.Msg) + m.SetUpdate("foo.com.") + rr, err := dns.NewRR(fmt.Sprintf("%s %d %s %s", "v1.foo.com.", 0, "A", "1.2.3.4")) + m.Insert([]dns.RR{rr}) + + err = stub.SendMessage(m) + assert.NoError(t, err) + + rr, err = dns.NewRR(fmt.Sprintf("%s %d %s %s", "v1.bar.com.", 0, "A", "1.2.3.4")) + m.Insert([]dns.RR{rr}) + + err = stub.SendMessage(m) + assert.Error(t, err) + + m.SetUpdate(".") + err = stub.SendMessage(m) + assert.NoError(t, err) +} + +// These tests are use the . root zone with no filters func TestRfc2136ApplyChanges(t *testing.T) { stub := newStub() provider, err := createRfc2136StubProvider(stub) @@ -210,6 +258,127 @@ func TestRfc2136ApplyChanges(t *testing.T) { assert.True(t, strings.Contains(stub.updateMsgs[1].String(), "v2.foobar.com")) } +// These tests all use the foo.com and foobar.com zones with no filters +func TestRfc2136ApplyChangesWithZones(t *testing.T) { + stub := newStub() + provider, err := createRfc2136StubProviderWithZones(stub) + assert.NoError(t, err) + + p := &plan.Changes{ + Create: []*endpoint.Endpoint{ + { + DNSName: "v1.foo.com", + RecordType: "A", + Targets: []string{"1.2.3.4"}, + RecordTTL: endpoint.TTL(400), + }, + { + DNSName: "v1.foobar.com", + RecordType: "TXT", + Targets: []string{"boom"}, + }, + { + DNSName: "ns.foobar.com", + RecordType: "NS", + Targets: []string{"boom"}, + }, + }, + Delete: []*endpoint.Endpoint{ + { + DNSName: "v2.foo.com", + RecordType: "A", + Targets: []string{"1.2.3.4"}, + }, + { + DNSName: "v2.foobar.com", + RecordType: "TXT", + Targets: []string{"boom2"}, + }, + }, + } + + err = provider.ApplyChanges(context.Background(), p) + assert.NoError(t, err) + + assert.Equal(t, 3, len(stub.createMsgs)) + assert.True(t, strings.Contains(stub.createMsgs[0].String(), "v1.foo.com")) + assert.True(t, strings.Contains(stub.createMsgs[0].String(), "1.2.3.4")) + + assert.True(t, strings.Contains(stub.createMsgs[1].String(), "v1.foobar.com")) + assert.True(t, strings.Contains(stub.createMsgs[1].String(), "boom")) + + assert.True(t, strings.Contains(stub.createMsgs[2].String(), "ns.foobar.com")) + assert.True(t, strings.Contains(stub.createMsgs[2].String(), "boom")) + + assert.Equal(t, 2, len(stub.updateMsgs)) + assert.True(t, strings.Contains(stub.updateMsgs[0].String(), "v2.foo.com")) + assert.True(t, strings.Contains(stub.updateMsgs[1].String(), "v2.foobar.com")) +} + +// These tests use the foo.com and foobar.com zones and with filters set to both zones +func TestRfc2136ApplyChangesWithZonesFilters(t *testing.T) { + stub := newStub() + provider, err := createRfc2136StubProviderWithZonesFilters(stub) + assert.NoError(t, err) + + p := &plan.Changes{ + Create: []*endpoint.Endpoint{ + { + DNSName: "v1.foo.com", + RecordType: "A", + Targets: []string{"1.2.3.4"}, + RecordTTL: endpoint.TTL(400), + }, + { + DNSName: "v1.foobar.com", + RecordType: "TXT", + Targets: []string{"boom"}, + }, + { + DNSName: "ns.foobar.com", + RecordType: "NS", + Targets: []string{"boom"}, + }, + { + DNSName: "filtered-out.foo.bar", + RecordType: "A", + Targets: []string{"1.2.3.4"}, + RecordTTL: endpoint.TTL(400), + }, + }, + Delete: []*endpoint.Endpoint{ + { + DNSName: "v2.foo.com", + RecordType: "A", + Targets: []string{"1.2.3.4"}, + }, + { + DNSName: "v2.foobar.com", + RecordType: "TXT", + Targets: []string{"boom2"}, + }, + }, + } + + err = provider.ApplyChanges(context.Background(), p) + assert.NoError(t, err) + + assert.Equal(t, 3, len(stub.createMsgs)) + assert.True(t, strings.Contains(stub.createMsgs[0].String(), "v1.foo.com")) + assert.True(t, strings.Contains(stub.createMsgs[0].String(), "1.2.3.4")) + + assert.True(t, strings.Contains(stub.createMsgs[1].String(), "v1.foobar.com")) + assert.True(t, strings.Contains(stub.createMsgs[1].String(), "boom")) + + assert.True(t, strings.Contains(stub.createMsgs[2].String(), "ns.foobar.com")) + assert.True(t, strings.Contains(stub.createMsgs[2].String(), "boom")) + + assert.Equal(t, 2, len(stub.updateMsgs)) + assert.True(t, strings.Contains(stub.updateMsgs[0].String(), "v2.foo.com")) + assert.True(t, strings.Contains(stub.updateMsgs[1].String(), "v2.foobar.com")) + +} + func TestRfc2136ApplyChangesWithDifferentTTLs(t *testing.T) { stub := newStub() From 7427c8ed3f3d84a5e64452010d59c574327e8b3c Mon Sep 17 00:00:00 2001 From: Greg Sidelinger Date: Wed, 20 Dec 2023 14:00:31 +0000 Subject: [PATCH 3/6] Only log zone once for the SendMessage Signed-off-by: Greg Sidelinger --- provider/rfc2136/rfc2136_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/rfc2136/rfc2136_test.go b/provider/rfc2136/rfc2136_test.go index 11947b575..acc11a630 100644 --- a/provider/rfc2136/rfc2136_test.go +++ b/provider/rfc2136/rfc2136_test.go @@ -49,6 +49,7 @@ func newStub() *rfc2136Stub { func (r *rfc2136Stub) SendMessage(msg *dns.Msg) error { zone := extractZoneFromMessage(msg.String()) + log.Infof("zone=%s", zone) lines := extractUpdateSectionFromMessage(msg) for _, line := range lines { // break at first empty line @@ -58,7 +59,6 @@ func (r *rfc2136Stub) SendMessage(msg *dns.Msg) error { line = strings.Replace(line, "\t", " ", -1) log.Info(line) - log.Infof("zone=%s", zone) record := strings.Split(line, " ")[0] if !strings.HasSuffix(record, zone) { return fmt.Errorf("Message contains updates outside of it's zone. zone=%v record=%v", zone, record) From 35dc1fc0b98a4c1d6a9dd5b65046a6822a7d3039 Mon Sep 17 00:00:00 2001 From: Greg Sidelinger Date: Wed, 20 Dec 2023 16:26:39 +0000 Subject: [PATCH 4/6] Update rfc2136 test suite to deal with ording when dealing with multi zones Signed-off-by: Greg Sidelinger --- provider/rfc2136/rfc2136_test.go | 69 ++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/provider/rfc2136/rfc2136_test.go b/provider/rfc2136/rfc2136_test.go index acc11a630..a143ef7b0 100644 --- a/provider/rfc2136/rfc2136_test.go +++ b/provider/rfc2136/rfc2136_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "regexp" + "sort" "strings" "testing" "time" @@ -47,8 +48,22 @@ func newStub() *rfc2136Stub { } } +func getSortedChanges(msgs []*dns.Msg) []string { + r := []string{} + for _, d := range msgs { + // only care about section after the ZONE SECTION: as the id: needs stripped out in order to sort and grantee the order when sorting + r = append(r, strings.Split(d.String(), "ZONE SECTION:")[1]) + } + sort.Strings(r) + return r +} + func (r *rfc2136Stub) SendMessage(msg *dns.Msg) error { zone := extractZoneFromMessage(msg.String()) + // Make sure the zone starts with . to make sure HasSuffix does not match forbar.com for zone bar.com + if !strings.HasPrefix(zone, ".") { + zone = "." + zone + } log.Infof("zone=%s", zone) lines := extractUpdateSectionFromMessage(msg) for _, line := range lines { @@ -61,7 +76,9 @@ func (r *rfc2136Stub) SendMessage(msg *dns.Msg) error { log.Info(line) record := strings.Split(line, " ")[0] if !strings.HasSuffix(record, zone) { - return fmt.Errorf("Message contains updates outside of it's zone. zone=%v record=%v", zone, record) + err := fmt.Errorf("Message contains updates outside of it's zone. zone=%v record=%v", zone, record) + log.Error(err) + return err } if strings.Contains(line, " NONE ") { @@ -259,6 +276,7 @@ func TestRfc2136ApplyChanges(t *testing.T) { } // These tests all use the foo.com and foobar.com zones with no filters +// createMsgs and updateMsgs need sorted when are are used func TestRfc2136ApplyChangesWithZones(t *testing.T) { stub := newStub() provider, err := createRfc2136StubProviderWithZones(stub) @@ -301,21 +319,28 @@ func TestRfc2136ApplyChangesWithZones(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 3, len(stub.createMsgs)) - assert.True(t, strings.Contains(stub.createMsgs[0].String(), "v1.foo.com")) - assert.True(t, strings.Contains(stub.createMsgs[0].String(), "1.2.3.4")) + createMsgs := getSortedChanges(stub.createMsgs) + assert.Equal(t, 3, len(createMsgs)) - assert.True(t, strings.Contains(stub.createMsgs[1].String(), "v1.foobar.com")) - assert.True(t, strings.Contains(stub.createMsgs[1].String(), "boom")) + assert.True(t, strings.Contains(createMsgs[0], "v1.foo.com")) + assert.True(t, strings.Contains(createMsgs[0], "1.2.3.4")) - assert.True(t, strings.Contains(stub.createMsgs[2].String(), "ns.foobar.com")) - assert.True(t, strings.Contains(stub.createMsgs[2].String(), "boom")) + assert.True(t, strings.Contains(createMsgs[1], "v1.foobar.com")) + assert.True(t, strings.Contains(createMsgs[1], "boom")) + + assert.True(t, strings.Contains(createMsgs[2], "ns.foobar.com")) + assert.True(t, strings.Contains(createMsgs[2], "boom")) assert.Equal(t, 2, len(stub.updateMsgs)) - assert.True(t, strings.Contains(stub.updateMsgs[0].String(), "v2.foo.com")) - assert.True(t, strings.Contains(stub.updateMsgs[1].String(), "v2.foobar.com")) + updateMsgs := getSortedChanges(stub.updateMsgs) + assert.Equal(t, 2, len(updateMsgs)) + + assert.True(t, strings.Contains(updateMsgs[0], "v2.foo.com")) + assert.True(t, strings.Contains(updateMsgs[1], "v2.foobar.com")) } // These tests use the foo.com and foobar.com zones and with filters set to both zones +// createMsgs and updateMsgs need sorted when are are used func TestRfc2136ApplyChangesWithZonesFilters(t *testing.T) { stub := newStub() provider, err := createRfc2136StubProviderWithZonesFilters(stub) @@ -364,18 +389,28 @@ func TestRfc2136ApplyChangesWithZonesFilters(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 3, len(stub.createMsgs)) - assert.True(t, strings.Contains(stub.createMsgs[0].String(), "v1.foo.com")) - assert.True(t, strings.Contains(stub.createMsgs[0].String(), "1.2.3.4")) + createMsgs := getSortedChanges(stub.createMsgs) + assert.Equal(t, 3, len(createMsgs)) - assert.True(t, strings.Contains(stub.createMsgs[1].String(), "v1.foobar.com")) - assert.True(t, strings.Contains(stub.createMsgs[1].String(), "boom")) + assert.True(t, strings.Contains(createMsgs[0], "v1.foo.com")) + assert.True(t, strings.Contains(createMsgs[0], "1.2.3.4")) - assert.True(t, strings.Contains(stub.createMsgs[2].String(), "ns.foobar.com")) - assert.True(t, strings.Contains(stub.createMsgs[2].String(), "boom")) + assert.True(t, strings.Contains(createMsgs[1], "v1.foobar.com")) + assert.True(t, strings.Contains(createMsgs[1], "boom")) + + assert.True(t, strings.Contains(createMsgs[2], "ns.foobar.com")) + assert.True(t, strings.Contains(createMsgs[2], "boom")) + + for _, s := range createMsgs { + assert.False(t, strings.Contains(s, "filtered-out.foo.bar")) + } assert.Equal(t, 2, len(stub.updateMsgs)) - assert.True(t, strings.Contains(stub.updateMsgs[0].String(), "v2.foo.com")) - assert.True(t, strings.Contains(stub.updateMsgs[1].String(), "v2.foobar.com")) + updateMsgs := getSortedChanges(stub.updateMsgs) + assert.Equal(t, 2, len(updateMsgs)) + + assert.True(t, strings.Contains(updateMsgs[0], "v2.foo.com")) + assert.True(t, strings.Contains(updateMsgs[1], "v2.foobar.com")) } From 2b4aa56169188166a9ade9cb684f8326658422f0 Mon Sep 17 00:00:00 2001 From: Greg Sidelinger Date: Wed, 20 Dec 2023 18:45:16 +0000 Subject: [PATCH 5/6] Cleanup extra whitespace to make the linter happy Signed-off-by: Greg Sidelinger --- provider/rfc2136/rfc2136.go | 1 - 1 file changed, 1 deletion(-) diff --git a/provider/rfc2136/rfc2136.go b/provider/rfc2136/rfc2136.go index f63e33eaa..ad3652115 100644 --- a/provider/rfc2136/rfc2136.go +++ b/provider/rfc2136/rfc2136.go @@ -357,7 +357,6 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes } } } - } if len(errors) > 0 { From 8e9a4169a5df7ebf265de47d514e4c037d288c76 Mon Sep 17 00:00:00 2001 From: Greg Sidelinger Date: Tue, 2 Jan 2024 14:12:20 +0000 Subject: [PATCH 6/6] Cleanup error msgs Signed-off-by: Greg Sidelinger --- provider/rfc2136/rfc2136.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/provider/rfc2136/rfc2136.go b/provider/rfc2136/rfc2136.go index ad3652115..c0671c994 100644 --- a/provider/rfc2136/rfc2136.go +++ b/provider/rfc2136/rfc2136.go @@ -278,9 +278,8 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes // only send if there are records available for _, z := range m { if len(z.Ns) > 0 { - err := r.actions.SendMessage(z) - if err != nil { - log.Errorf("RFC2136 update failed: %v", err) + if err := r.actions.SendMessage(z); err != nil { + log.Errorf("RFC2136 create record failed: %v", err) errors = append(errors, err) continue } @@ -314,9 +313,8 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes // only send if there are records available for _, z := range m { if len(z.Ns) > 0 { - err := r.actions.SendMessage(z) - if err != nil { - log.Errorf("RFC2136 update failed: %v", err) + if err := r.actions.SendMessage(z); err != nil { + log.Errorf("RFC2136 update record failed: %v", err) errors = append(errors, err) continue } @@ -349,9 +347,8 @@ func (r rfc2136Provider) ApplyChanges(ctx context.Context, changes *plan.Changes // only send if there are records available for _, z := range m { if len(z.Ns) > 0 { - err := r.actions.SendMessage(z) - if err != nil { - log.Errorf("RFC2136 update failed: %v", err) + if err := r.actions.SendMessage(z); err != nil { + log.Errorf("RFC2136 delete record failed: %v", err) errors = append(errors, err) continue }