diff --git a/provider/ovh/ovh.go b/provider/ovh/ovh.go index 6dd2f1ab0..f09ae247c 100644 --- a/provider/ovh/ovh.go +++ b/provider/ovh/ovh.go @@ -539,12 +539,14 @@ func (p OVHProvider) newOvhChangeCreateDelete(action int, endpoints []*endpoint. if len(toDeleteIds) > 0 { // Copy the records because we need to mutate the list. - existingRecords = slices.Clone(existingRecords) - alreadyRemoved := 0 - for _, id := range toDeleteIds { - existingRecords = slices.Delete(existingRecords, id-alreadyRemoved, id-alreadyRemoved+1) - alreadyRemoved++ + newExistingRecords := make([]ovhRecord, 0, len(existingRecords)-len(toDeleteIds)) + for id := range existingRecords { + if slices.Contains(toDeleteIds, id) { + continue + } + newExistingRecords = append(newExistingRecords, existingRecords[id]) } + existingRecords = newExistingRecords } return ovhChanges, existingRecords @@ -615,7 +617,7 @@ func (p OVHProvider) newOvhChangeUpdate(endpointsOld []*endpoint.Endpoint, endpo } } - toInsertTargetToDelete := []int{} + createChangeConvertedToUpdateChange := []int{} for i, target := range toInsertTarget { if len(oldRecords) == 0 { break @@ -637,11 +639,17 @@ func (p OVHProvider) newOvhChangeUpdate(endpointsOld []*endpoint.Endpoint, endpo } p.formatCNAMETarget(&change) changes = append(changes, change) - toInsertTargetToDelete = append(toInsertTargetToDelete, i) + createChangeConvertedToUpdateChange = append(createChangeConvertedToUpdateChange, i) } - for _, i := range toInsertTargetToDelete { - toInsertTarget = slices.Delete(toInsertTarget, i, i+1) + + newToInsertTarget := make([]string, 0, len(toInsertTarget)-len(createChangeConvertedToUpdateChange)) + for i := range toInsertTarget { + if slices.Contains(createChangeConvertedToUpdateChange, i) { + continue + } + newToInsertTarget = append(newToInsertTarget, toInsertTarget[i]) } + toInsertTarget = newToInsertTarget if len(toInsertTarget) > 0 { for _, target := range toInsertTarget { diff --git a/provider/ovh/ovh_test.go b/provider/ovh/ovh_test.go index 49444bf4b..96b2129ab 100644 --- a/provider/ovh/ovh_test.go +++ b/provider/ovh/ovh_test.go @@ -390,18 +390,18 @@ func TestOvhNewChange(t *testing.T) { // Delete change endpoints = []*endpoint.Endpoint{ - {DNSName: "ovh.example.net", RecordType: "A", Targets: []string{"203.0.113.42", "203.0.113.42", "203.0.113.42"}}, + {DNSName: "ovh.example.net", RecordType: "A", Targets: []string{"203.0.113.42", "203.0.113.42", "203.0.113.43"}}, } records := []ovhRecord{ - {ID: 42, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", Target: "203.0.113.42"}}}, + {ID: 42, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", Target: "203.0.113.43"}}}, {ID: 43, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", Target: "203.0.113.42"}}}, {ID: 44, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", Target: "203.0.113.42"}}}, } changes, _ = provider.newOvhChangeCreateDelete(ovhDelete, endpoints, "example.net", records) td.Cmp(t, changes, []ovhChange{ - {Action: ovhDelete, ovhRecord: ovhRecord{ID: 42, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", TTL: defaultTTL, Target: "203.0.113.42"}}}}, {Action: ovhDelete, ovhRecord: ovhRecord{ID: 43, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", TTL: defaultTTL, Target: "203.0.113.42"}}}}, {Action: ovhDelete, ovhRecord: ovhRecord{ID: 44, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", TTL: defaultTTL, Target: "203.0.113.42"}}}}, + {Action: ovhDelete, ovhRecord: ovhRecord{ID: 42, Zone: "example.net", ovhRecordFields: ovhRecordFields{FieldType: "A", ovhRecordFieldUpdate: ovhRecordFieldUpdate{SubDomain: "ovh", TTL: defaultTTL, Target: "203.0.113.43"}}}}, }) // Create change with CNAME relative