keep existing PDB conditions when updating status

When the disruption controller updates the PDB status, it removes all conditions from the new status object and then re-adds the sufficient pods condition. Unfortunately, this behavior removes conditions set by other controllers, leading to multiple consecutive updates.
Therefore, this commit ensures that conditions are preserved during updates.
This commit is contained in:
Daniel Henkel 2023-11-27 09:35:37 +01:00
parent 221897d751
commit 2e388dd7e9
No known key found for this signature in database
GPG Key ID: 8F09D08AF000A94E
2 changed files with 32 additions and 0 deletions

View File

@ -994,6 +994,7 @@ func (dc *DisruptionController) updatePdbStatus(ctx context.Context, pdb *policy
DisruptionsAllowed: disruptionsAllowed, DisruptionsAllowed: disruptionsAllowed,
DisruptedPods: disruptedPods, DisruptedPods: disruptedPods,
ObservedGeneration: pdb.Generation, ObservedGeneration: pdb.Generation,
Conditions: newPdb.Status.Conditions,
} }
pdbhelper.UpdateDisruptionAllowedCondition(newPdb) pdbhelper.UpdateDisruptionAllowedCondition(newPdb)

View File

@ -1565,6 +1565,37 @@ func TestStalePodDisruption(t *testing.T) {
} }
} }
func TestKeepExistingPDBConditionDuringSync(t *testing.T) {
_, ctx := ktesting.NewTestContext(t)
dc, ps := newFakeDisruptionController(ctx)
pdb, pdbName := newMinAvailablePodDisruptionBudget(t, intstr.FromInt32(3))
pdb.Spec.Selector = &metav1.LabelSelector{}
pdb.Status.Conditions = append(pdb.Status.Conditions, metav1.Condition{
Type: "ExistingTestCondition",
Status: metav1.ConditionTrue,
Message: "This is a test condition",
Reason: "Test",
LastTransitionTime: metav1.Now(),
})
add(t, dc.pdbStore, pdb)
if err := dc.sync(ctx, pdbName); err != nil {
t.Fatalf("Failed to sync PDB: %v", err)
}
ps.VerifyPdbStatus(t, pdbName, 0, 0, 3, 0, map[string]metav1.Time{})
actualPDB := ps.Get(pdbName)
condition := apimeta.FindStatusCondition(actualPDB.Status.Conditions, "ExistingTestCondition")
if len(actualPDB.Status.Conditions) != 2 {
t.Fatalf("Expected 2 conditions, but got %d", len(actualPDB.Status.Conditions))
}
if condition == nil {
t.Fatalf("Expected ExistingTestCondition condition, but didn't find it")
}
}
// waitForCacheCount blocks until the given cache store has the desired number // waitForCacheCount blocks until the given cache store has the desired number
// of items in it. This will return an error if the condition is not met after a // of items in it. This will return an error if the condition is not met after a
// 10 second timeout. // 10 second timeout.