fix(iam): merge into the consumer Secret, and retry with a backoff
key-rotation-controller / image (push) Failing after 6s
key-rotation-controller / image (push) Failing after 6s
Two defects that a real rotation exposed:
merge writeSecret replaced the whole Secret map, so every key a consumer
keeps beside the credential disappeared. paperless lost
SOCIALACCOUNT_PROVIDERS_JSON and immich lost config.json; both pods then
failed to start while the rotation reported success.
backoff a Failed attempt returned 0, so the controller retried in a tight loop.
It now waits two minutes and then retries.
All eight objects carry both identifiers ZITADEL needs: the app resource id for the
secret endpoint and the client id for introspection.
Result: seven rotations reach Succeeded with every consumer ready (grafana, comfyui,
argocd, forgejo, paperless, immich, minio). api-gw stays suspended because no workload
exists for it.
This commit is contained in:
@@ -19,10 +19,28 @@ func rotation(last *metav1.Time, activeID string, hours int32) *iamv1.KeyRotatio
|
||||
Status: iamv1.KeyRotationStatus{
|
||||
LastRotation: last,
|
||||
ActiveCredentialID: activeID,
|
||||
Phase: iamv1.PhaseSucceeded,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func TestRequeueAfterBacksOffAfterAFailure(t *testing.T) {
|
||||
now := time.Unix(1_700_000_000, 0)
|
||||
last := metav1.NewTime(now.Add(-1 * time.Minute))
|
||||
r := &Reconciler{Now: func() time.Time { return now }}
|
||||
|
||||
kr := rotation(&last, "key-1", 24)
|
||||
kr.Status.Phase = iamv1.PhaseFailed
|
||||
if got := r.RequeueAfter(kr); got != time.Minute {
|
||||
t.Fatalf("a failed attempt must wait a short backoff, got %s", got)
|
||||
}
|
||||
old := metav1.NewTime(now.Add(-3 * time.Minute))
|
||||
kr.Status.LastRotation = &old
|
||||
if got := r.RequeueAfter(kr); got != 0 {
|
||||
t.Fatalf("after the backoff it must rotate again, got %s", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRequeueAfterRotatesImmediatelyWhenNeverRotated(t *testing.T) {
|
||||
r := &Reconciler{Now: func() time.Time { return time.Unix(1_700_000_000, 0) }}
|
||||
if got := r.RequeueAfter(rotation(nil, "", 24)); got != 0 {
|
||||
|
||||
Reference in New Issue
Block a user