Skip to content

Commit 70e3155

Browse files
kerenlahavevyaffe
andauthored
Handle too many requests error from service-manager (#378)
--------- Co-authored-by: Evyatar Yaffe <[email protected]>
1 parent c4a70d5 commit 70e3155

File tree

3 files changed

+20
-17
lines changed

3 files changed

+20
-17
lines changed

controllers/base_controller.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ func (r *BaseReconciler) handleError(ctx context.Context, operationType smClient
349349
return r.markAsNonTransientError(ctx, operationType, err.Error(), resource)
350350
}
351351
if r.isTransientError(smError, log) || shouldIgnoreNonTransient(log, resource, r.Config.IgnoreNonTransientTimeout) {
352-
return r.markAsTransientError(ctx, operationType, smError.Error(), resource)
352+
return r.markAsTransientError(ctx, operationType, smError, resource)
353353
}
354354

355355
return r.markAsNonTransientError(ctx, operationType, smError.Error(), resource)
@@ -372,15 +372,18 @@ func (r *BaseReconciler) markAsNonTransientError(ctx context.Context, operationT
372372
return ctrl.Result{}, nil
373373
}
374374

375-
func (r *BaseReconciler) markAsTransientError(ctx context.Context, operationType smClientTypes.OperationCategory, errMsg string, object api.SAPBTPResource) (ctrl.Result, error) {
375+
func (r *BaseReconciler) markAsTransientError(ctx context.Context, operationType smClientTypes.OperationCategory, err error, object api.SAPBTPResource) (ctrl.Result, error) {
376376
log := GetLogger(ctx)
377-
setInProgressConditions(ctx, operationType, errMsg, object)
378-
log.Info(fmt.Sprintf("operation %s of %s encountered a transient error %s, retrying operation :)", operationType, object.GetControllerName(), errMsg))
379-
if err := r.updateStatus(ctx, object); err != nil {
380-
return ctrl.Result{}, err
377+
//DO NOT REMOVE - 429 error is not reflected to the status
378+
if smError, ok := err.(*sm.ServiceManagerError); !ok || smError.StatusCode != http.StatusTooManyRequests {
379+
setInProgressConditions(ctx, operationType, err.Error(), object)
380+
log.Info(fmt.Sprintf("operation %s of %s encountered a transient error %s, retrying operation :)", operationType, object.GetControllerName(), err.Error()))
381+
if updateErr := r.updateStatus(ctx, object); updateErr != nil {
382+
return ctrl.Result{}, updateErr
383+
}
381384
}
382385

383-
return ctrl.Result{}, fmt.Errorf(errMsg)
386+
return ctrl.Result{}, err
384387
}
385388

386389
func (r *BaseReconciler) removeAnnotation(ctx context.Context, object api.SAPBTPResource, keys ...string) error {

controllers/servicebinding_controller.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,13 @@ func (r *ServiceBindingReconciler) Reconcile(ctx context.Context, req ctrl.Reque
180180

181181
smClient, err := r.getSMClient(ctx, serviceBinding, serviceInstance.Spec.BTPAccessCredentialsSecret)
182182
if err != nil {
183-
return r.markAsTransientError(ctx, Unknown, err.Error(), serviceBinding)
183+
return r.markAsTransientError(ctx, Unknown, err, serviceBinding)
184184
}
185185

186186
smBinding, err := r.getBindingForRecovery(ctx, smClient, serviceBinding)
187187
if err != nil {
188188
log.Error(err, "failed to check binding recovery")
189-
return r.markAsTransientError(ctx, smClientTypes.CREATE, err.Error(), serviceBinding)
189+
return r.markAsTransientError(ctx, smClientTypes.CREATE, err, serviceBinding)
190190
}
191191
if smBinding != nil {
192192
return r.recover(ctx, serviceBinding, smBinding)
@@ -275,7 +275,7 @@ func (r *ServiceBindingReconciler) delete(ctx context.Context, serviceBinding *s
275275
if controllerutil.ContainsFinalizer(serviceBinding, api.FinalizerName) {
276276
smClient, err := r.getSMClient(ctx, serviceBinding, btpAccessCredentialsSecret)
277277
if err != nil {
278-
return r.markAsTransientError(ctx, Unknown, err.Error(), serviceBinding)
278+
return r.markAsTransientError(ctx, Unknown, err, serviceBinding)
279279
}
280280

281281
if len(serviceBinding.Status.BindingID) == 0 {
@@ -338,7 +338,7 @@ func (r *ServiceBindingReconciler) poll(ctx context.Context, serviceBinding *ser
338338

339339
smClient, err := r.getSMClient(ctx, serviceBinding, btpAccessCredentialsSecret)
340340
if err != nil {
341-
return r.markAsTransientError(ctx, Unknown, err.Error(), serviceBinding)
341+
return r.markAsTransientError(ctx, Unknown, err, serviceBinding)
342342
}
343343

344344
status, statusErr := smClient.Status(serviceBinding.Status.OperationURL, nil)
@@ -359,7 +359,7 @@ func (r *ServiceBindingReconciler) poll(ctx context.Context, serviceBinding *ser
359359
}
360360

361361
if status == nil {
362-
return r.markAsTransientError(ctx, serviceBinding.Status.OperationType, fmt.Sprintf("failed to get last operation status of %s", serviceBinding.Name), serviceBinding)
362+
return r.markAsTransientError(ctx, serviceBinding.Status.OperationType, fmt.Errorf("failed to get last operation status of %s", serviceBinding.Name), serviceBinding)
363363
}
364364
switch status.State {
365365
case smClientTypes.INPROGRESS:
@@ -708,7 +708,7 @@ func (r *ServiceBindingReconciler) handleSecretError(ctx context.Context, op smC
708708
if apierrors.ReasonForError(err) == metav1.StatusReasonUnknown {
709709
return r.markAsNonTransientError(ctx, op, err.Error(), binding)
710710
}
711-
return r.markAsTransientError(ctx, op, err.Error(), binding)
711+
return r.markAsTransientError(ctx, op, err, binding)
712712
}
713713

714714
func (r *ServiceBindingReconciler) addInstanceInfo(ctx context.Context, binding *servicesv1.ServiceBinding, credentialsMap map[string][]byte) ([]SecretMetadataProperty, error) {

controllers/serviceinstance_controller.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,15 @@ func (r *ServiceInstanceReconciler) Reconcile(ctx context.Context, req ctrl.Requ
122122
smClient, err := r.getSMClient(ctx, serviceInstance, serviceInstance.Spec.BTPAccessCredentialsSecret)
123123
if err != nil {
124124
log.Error(err, "failed to get sm client")
125-
return r.markAsTransientError(ctx, Unknown, err.Error(), serviceInstance)
125+
return r.markAsTransientError(ctx, Unknown, err, serviceInstance)
126126
}
127127

128128
if serviceInstance.Status.InstanceID == "" {
129129
log.Info("Instance ID is empty, checking if instance exist in SM")
130130
smInstance, err := r.getInstanceForRecovery(ctx, smClient, serviceInstance)
131131
if err != nil {
132132
log.Error(err, "failed to check instance recovery")
133-
return r.markAsTransientError(ctx, Unknown, err.Error(), serviceInstance)
133+
return r.markAsTransientError(ctx, Unknown, err, serviceInstance)
134134
}
135135
if smInstance != nil {
136136
return r.recover(ctx, smClient, serviceInstance, smInstance)
@@ -266,7 +266,7 @@ func (r *ServiceInstanceReconciler) deleteInstance(ctx context.Context, serviceI
266266
smClient, err := r.getSMClient(ctx, serviceInstance, serviceInstance.Spec.BTPAccessCredentialsSecret)
267267
if err != nil {
268268
log.Error(err, "failed to get sm client")
269-
return r.markAsTransientError(ctx, Unknown, err.Error(), serviceInstance)
269+
return r.markAsTransientError(ctx, Unknown, err, serviceInstance)
270270
}
271271
if len(serviceInstance.Status.InstanceID) == 0 {
272272
log.Info("No instance id found validating instance does not exists in SM before removing finalizer")
@@ -348,7 +348,7 @@ func (r *ServiceInstanceReconciler) poll(ctx context.Context, serviceInstance *s
348348
smClient, err := r.getSMClient(ctx, serviceInstance, serviceInstance.Spec.BTPAccessCredentialsSecret)
349349
if err != nil {
350350
log.Error(err, "failed to get sm client")
351-
return r.markAsTransientError(ctx, Unknown, err.Error(), serviceInstance)
351+
return r.markAsTransientError(ctx, Unknown, err, serviceInstance)
352352
}
353353

354354
status, statusErr := smClient.Status(serviceInstance.Status.OperationURL, nil)

0 commit comments

Comments
 (0)