Skip to content

Commit

Permalink
review
Browse files Browse the repository at this point in the history
  • Loading branch information
kerenlahav committed Dec 18, 2023
1 parent a2a4865 commit c7b6f66
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 12 deletions.
4 changes: 3 additions & 1 deletion controllers/base_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package controllers

import (
"context"
"errors"
"fmt"
"net/http"

Expand Down Expand Up @@ -344,7 +345,8 @@ func isTransientStatusCode(StatusCode int) bool {

func (r *BaseReconciler) handleError(ctx context.Context, operationType smClientTypes.OperationCategory, err error, resource api.SAPBTPResource) (ctrl.Result, error) {
log := GetLogger(ctx)
smError, ok := err.(*sm.ServiceManagerError)
var smError *sm.ServiceManagerError
ok := errors.As(err, &smError)
if !ok {
log.Info("unable to cast error to SM error, will be treated as non transient")
return r.markAsNonTransientError(ctx, operationType, err.Error(), resource)
Expand Down
24 changes: 17 additions & 7 deletions controllers/serviceinstance_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,21 @@ func (r *ServiceInstanceReconciler) Reconcile(ctx context.Context, req ctrl.Requ
}
}

if meta.IsStatusConditionPresentAndEqual(serviceInstance.GetConditions(), api.ConditionSucceeded, metav1.ConditionFalse) &&
serviceInstance.IsIgnoreNonTransientAnnotationExistAndValid(log, r.Config.IgnoreNonTransientTimeout) {
operation := smClientTypes.CREATE
if len(serviceInstance.Status.InstanceID) > 0 {
operation = smClientTypes.UPDATE
}
setInProgressConditions(ctx, operation, "", serviceInstance)
conditions := serviceInstance.GetConditions()
if len(conditions) > 0 {
meta.RemoveStatusCondition(&conditions, api.ConditionFailed)
}
serviceInstance.SetConditions(conditions)
r.Status().Update(ctx, serviceInstance)

Check failure on line 95 in controllers/serviceinstance_controller.go

View workflow job for this annotation

GitHub Actions / Build

Error return value of `(sigs.k8s.io/controller-runtime/pkg/client.SubResourceWriter).Update` is not checked (errcheck)
}

if isFinalState(ctx, serviceInstance, r.Config.IgnoreNonTransientTimeout) {
if len(serviceInstance.Status.HashedSpec) == 0 {
updateHashedSpecValue(serviceInstance)
Expand Down Expand Up @@ -558,10 +573,7 @@ func isFinalState(ctx context.Context, serviceInstance *servicesv1.ServiceInstan
log.Info("instance is not in final state, sync operation is in progress")
return false
}
if isInRetry(serviceInstance, log, nonTransientTimeout) {
log.Info("instance is not in final state, IgnoreNonTransientErrorAnnotation exist")
return false
}

if sharingUpdateRequired(serviceInstance) {
log.Info("instance is not in final state, need to sync sharing status")
if len(serviceInstance.Status.HashedSpec) == 0 {
Expand Down Expand Up @@ -593,9 +605,7 @@ func updateRequired(serviceInstance *servicesv1.ServiceInstance, log logr.Logger
if cond != nil && cond.Reason == UpdateInProgress { //in case of transient error occurred
return true
}
if serviceInstance.IsIgnoreNonTransientAnnotationExistAndValid(log, nonTransientTimeout) {
return true
}

return getSpecHash(serviceInstance) != serviceInstance.Status.HashedSpec
}

Expand Down
7 changes: 4 additions & 3 deletions controllers/serviceinstance_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,18 +251,18 @@ var _ = Describe("ServiceInstance controller", func() {
Context("first with 400 status then success", func() {
errMessage := "failed to provision instance"
BeforeEach(func() {
fakeClient.ProvisionReturns(nil, &sm.ServiceManagerError{
fakeClient.ProvisionReturnsOnCall(0, nil, &sm.ServiceManagerError{
StatusCode: http.StatusBadRequest,
Description: errMessage,
})
fakeClient.ProvisionReturnsOnCall(2, &sm.ProvisionResponse{InstanceID: fakeInstanceID}, nil)
fakeClient.ProvisionReturnsOnCall(1, &sm.ProvisionResponse{InstanceID: fakeInstanceID}, nil)
})

It("should have failure condition", func() {
serviceInstance = createInstance(ctx, instanceSpec, false)
waitForResourceCondition(ctx, serviceInstance, api.ConditionFailed, metav1.ConditionTrue, CreateFailed, errMessage)
})
It("ignoreNonTransientErrorAnnotation should have failure condition after timeout", func() {
It("ignoreNonTransientErrorAnnotation should remove the annotation once succeeded", func() {
serviceInstance = createInstanceWithAnnotation(ctx, instanceSpec, ignoreNonTransientErrorAnnotation, false)
waitForResourceCondition(ctx, serviceInstance, api.ConditionSucceeded, metav1.ConditionTrue, Created, "")
waitForResourceAnnotationRemove(ctx, serviceInstance, api.IgnoreNonTransientErrorAnnotation, api.IgnoreNonTransientErrorTimestampAnnotation)
Expand All @@ -280,6 +280,7 @@ var _ = Describe("ServiceInstance controller", func() {
serviceInstance = createInstanceWithAnnotation(ctx, instanceSpec, ignoreNonTransientErrorAnnotation, false)
waitForResourceCondition(ctx, serviceInstance, api.ConditionFailed, metav1.ConditionTrue, CreateFailed, errMessage)
waitForResourceAnnotationRemove(ctx, serviceInstance, api.IgnoreNonTransientErrorAnnotation, api.IgnoreNonTransientErrorTimestampAnnotation)
waitForResourceCondition(ctx, serviceInstance, api.ConditionFailed, metav1.ConditionTrue, CreateFailed, errMessage)
sinceCreate := time.Since(serviceInstance.GetCreationTimestamp().Time)
Expect(sinceCreate > ignoreNonTransientTimeout)
})
Expand Down
2 changes: 1 addition & 1 deletion controllers/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ const (
interval = time.Millisecond * 50
syncPeriod = time.Millisecond * 250
pollInterval = time.Millisecond * 250
ignoreNonTransientTimeout = time.Second * 1
ignoreNonTransientTimeout = time.Second * 10

fakeBindingID = "fake-binding-id"
bindingTestNamespace = "test-namespace"
Expand Down

0 comments on commit c7b6f66

Please sign in to comment.