diff --git a/endpoint/endpoint.go b/endpoint/endpoint.go index bb082e2a5..07bd3ea4b 100644 --- a/endpoint/endpoint.go +++ b/endpoint/endpoint.go @@ -71,7 +71,7 @@ func (t Targets) Swap(i, j int) { t[i], t[j] = t[j], t[i] } -// Same compares to Targets and returns true if they are completely identical +// Same compares to Targets and returns true if they are identical (case-insensitive) func (t Targets) Same(o Targets) bool { if len(t) != len(o) { return false @@ -80,7 +80,7 @@ func (t Targets) Same(o Targets) bool { sort.Stable(o) for i, e := range t { - if e != o[i] { + if !strings.EqualFold(e, o[i]) { return false } } diff --git a/endpoint/endpoint_test.go b/endpoint/endpoint_test.go index 18a79a02c..05104adbf 100644 --- a/endpoint/endpoint_test.go +++ b/endpoint/endpoint_test.go @@ -40,6 +40,7 @@ func TestTargetsSame(t *testing.T) { {""}, {"1.2.3.4"}, {"8.8.8.8", "8.8.4.4"}, + {"example.org", "EXAMPLE.ORG"}, } for _, d := range tests { diff --git a/plan/plan_test.go b/plan/plan_test.go index 18b889143..d402f0eb2 100644 --- a/plan/plan_test.go +++ b/plan/plan_test.go @@ -30,6 +30,7 @@ type PlanTestSuite struct { suite.Suite fooV1Cname *endpoint.Endpoint fooV2Cname *endpoint.Endpoint + fooV2CnameUppercase *endpoint.Endpoint fooV2TXT *endpoint.Endpoint fooV2CnameNoLabel *endpoint.Endpoint fooV3CnameSameResource *endpoint.Endpoint @@ -77,6 +78,14 @@ func (suite *PlanTestSuite) SetupTest() { endpoint.ResourceLabelKey: "ingress/default/foo-v2", }, } + suite.fooV2CnameUppercase = &endpoint.Endpoint{ + DNSName: "foo", + Targets: endpoint.Targets{"V2"}, + RecordType: "CNAME", + Labels: map[string]string{ + endpoint.ResourceLabelKey: "ingress/default/foo-v2", + }, + } suite.fooV2TXT = &endpoint.Endpoint{ DNSName: "foo", RecordType: "TXT", @@ -452,6 +461,27 @@ func (suite *PlanTestSuite) TestIgnoreTXT() { validateEntries(suite.T(), changes.Delete, expectedDelete) } +func (suite *PlanTestSuite) TestIgnoreTargetCase() { + current := []*endpoint.Endpoint{suite.fooV2Cname} + desired := []*endpoint.Endpoint{suite.fooV2CnameUppercase} + expectedCreate := []*endpoint.Endpoint{} + expectedUpdateOld := []*endpoint.Endpoint{} + expectedUpdateNew := []*endpoint.Endpoint{} + expectedDelete := []*endpoint.Endpoint{} + + p := &Plan{ + Policies: []Policy{&SyncPolicy{}}, + Current: current, + Desired: desired, + } + + changes := p.Calculate().Changes + validateEntries(suite.T(), changes.Create, expectedCreate) + validateEntries(suite.T(), changes.UpdateNew, expectedUpdateNew) + validateEntries(suite.T(), changes.UpdateOld, expectedUpdateOld) + validateEntries(suite.T(), changes.Delete, expectedDelete) +} + func (suite *PlanTestSuite) TestRemoveEndpoint() { current := []*endpoint.Endpoint{suite.fooV1Cname, suite.bar192A} desired := []*endpoint.Endpoint{suite.fooV1Cname}