@@ -66,6 +66,16 @@ type Reconciler[T any] struct {
66
66
cluster cluster.Cluster
67
67
reconciler StateHandler [T ]
68
68
unstructuredGVK schema.GroupVersionKind
69
+ supportReapply bool
70
+ }
71
+
72
+ type ReconcilerOptionFn [T any ] func (* Reconciler [T ]) * Reconciler [T ]
73
+
74
+ func WithReapplySupport [T any ](supportReapply bool ) ReconcilerOptionFn [T ] {
75
+ return func (r * Reconciler [T ]) * Reconciler [T ] {
76
+ r .supportReapply = supportReapply
77
+ return r
78
+ }
69
79
}
70
80
71
81
type UnstructuredStateReconciler = StateHandler [unstructured.Unstructured ]
@@ -74,10 +84,14 @@ type ControllerSetupBuilder = ctrlrtbuilder.TypedBuilder[reconcile.Request]
74
84
75
85
type SetupManagerOption func (builder * ControllerSetupBuilder ) * ControllerSetupBuilder
76
86
77
- func NewStateReconciler [T any ](target StateHandler [T ]) * Reconciler [T ] {
78
- return & Reconciler [T ]{
87
+ func NewStateReconciler [T any ](target StateHandler [T ], options ... ReconcilerOptionFn [ T ] ) * Reconciler [T ] {
88
+ r := & Reconciler [T ]{
79
89
reconciler : target ,
80
90
}
91
+ for _ , opt := range options {
92
+ r = opt (r )
93
+ }
94
+ return r
81
95
}
82
96
83
97
func NewUnstructuredStateReconciler (target UnstructuredStateReconciler , gvk schema.GroupVersionKind ) * Reconciler [unstructured.Unstructured ] {
@@ -287,20 +301,30 @@ func (r *Reconciler[T]) ReconcileState(ctx context.Context, t *T) (Result, error
287
301
result .NextState = state .StateInitial
288
302
}
289
303
304
+ if r .supportReapply {
305
+ err := r .reconcileReapply (ctx , obj , result , err )
306
+ if err != nil {
307
+ return Result {}, fmt .Errorf ("failed to reconcile reapply: %w" , err )
308
+ }
309
+ }
310
+
311
+ return result , err
312
+ }
313
+
314
+ func (r * Reconciler [T ]) reconcileReapply (ctx context.Context , obj client.Object , result Result , err error ) error {
290
315
isReapplyState := result .NextState == state .StateImported ||
291
316
result .NextState == state .StateCreated ||
292
317
result .NextState == state .StateUpdated
293
318
294
319
if isReapplyState && result .RequeueAfter == 0 && err == nil {
295
320
requeueAfter , err := PatchReapplyTimestamp (ctx , r .cluster .GetClient (), obj )
296
321
if err != nil {
297
- return Result {} , err
322
+ return fmt . Errorf ( "failed to patch reapply timestamp: %w" , err )
298
323
}
299
324
300
325
result .RequeueAfter = requeueAfter
301
326
}
302
-
303
- return result , err
327
+ return nil
304
328
}
305
329
306
330
func getObservedGeneration (obj client.Object , prevStatusConditions []metav1.Condition , nextState state.ResourceState ) int64 {
0 commit comments