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 {
// 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 {

View File

@ -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