fix(ovh): correct handling of records deletion (#5450)

Signed-off-by: Romain Beuque <556072+rbeuque74@users.noreply.github.com>
This commit is contained in:
Romain Beuque 2025-06-08 11:24:22 +02:00 committed by GitHub
parent f55be38b45
commit 226c45e766
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 12 deletions

View File

@ -539,12 +539,14 @@ func (p OVHProvider) newOvhChangeCreateDelete(action int, endpoints []*endpoint.
if len(toDeleteIds) > 0 { if len(toDeleteIds) > 0 {
// Copy the records because we need to mutate the list. // Copy the records because we need to mutate the list.
existingRecords = slices.Clone(existingRecords) newExistingRecords := make([]ovhRecord, 0, len(existingRecords)-len(toDeleteIds))
alreadyRemoved := 0 for id := range existingRecords {
for _, id := range toDeleteIds { if slices.Contains(toDeleteIds, id) {
existingRecords = slices.Delete(existingRecords, id-alreadyRemoved, id-alreadyRemoved+1) continue
alreadyRemoved++ }
newExistingRecords = append(newExistingRecords, existingRecords[id])
} }
existingRecords = newExistingRecords
} }
return ovhChanges, existingRecords return ovhChanges, existingRecords
@ -615,7 +617,7 @@ func (p OVHProvider) newOvhChangeUpdate(endpointsOld []*endpoint.Endpoint, endpo
} }
} }
toInsertTargetToDelete := []int{} createChangeConvertedToUpdateChange := []int{}
for i, target := range toInsertTarget { for i, target := range toInsertTarget {
if len(oldRecords) == 0 { if len(oldRecords) == 0 {
break break
@ -637,11 +639,17 @@ func (p OVHProvider) newOvhChangeUpdate(endpointsOld []*endpoint.Endpoint, endpo
} }
p.formatCNAMETarget(&change) p.formatCNAMETarget(&change)
changes = append(changes, 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 { if len(toInsertTarget) > 0 {
for _, target := range toInsertTarget { for _, target := range toInsertTarget {

View File

@ -390,18 +390,18 @@ func TestOvhNewChange(t *testing.T) {
// Delete change // Delete change
endpoints = []*endpoint.Endpoint{ 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{ 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: 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"}}}, {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) changes, _ = provider.newOvhChangeCreateDelete(ovhDelete, endpoints, "example.net", records)
td.Cmp(t, changes, []ovhChange{ 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: 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: 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 // Create change with CNAME relative