diff --git a/federation/pkg/federation-controller/util/federated_updater.go b/federation/pkg/federation-controller/util/federated_updater.go index 53044001f90..21bb51221ee 100644 --- a/federation/pkg/federation-controller/util/federated_updater.go +++ b/federation/pkg/federation-controller/util/federated_updater.go @@ -47,6 +47,8 @@ type FederatedUpdater interface { // stopped when it is reached. However the function will return after the timeout // with a non-nil error. Update([]FederatedOperation, time.Duration) error + + UpdateWithOnError([]FederatedOperation, time.Duration, func(FederatedOperation, error)) error } // A function that executes some operation using the passed client and object. @@ -70,6 +72,10 @@ func NewFederatedUpdater(federation FederationView, add, update, del FederatedOp } func (fu *federatedUpdaterImpl) Update(ops []FederatedOperation, timeout time.Duration) error { + return fu.UpdateWithOnError(ops, timeout, nil) +} + +func (fu *federatedUpdaterImpl) UpdateWithOnError(ops []FederatedOperation, timeout time.Duration, onError func(FederatedOperation, error)) error { done := make(chan error, len(ops)) for _, op := range ops { go func(op FederatedOperation) { @@ -90,6 +96,9 @@ func (fu *federatedUpdaterImpl) Update(ops []FederatedOperation, timeout time.Du case OperationTypeDelete: err = fu.deleteFunction(clientset, op.Obj) } + if err != nil && onError != nil { + onError(op, err) + } done <- err }(op) }