Repository: redhat-developer/service-binding-operator
Pull request #681 (2020-09-21 15:03:29)

Create an overall `Ready` to indicate whether the SBR reconcile is completed successfully #665
According to the discussion in https://github.com/redhat-developer/service-binding-operator/issues/665, we need to add a overall Ready condition to show what is the status of the ServiceBinding CR.

openshift-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **avni-sharma**
You can assign the PR to them by writing `/assign @avni-sharma` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=redhat-developer%2Fservice-binding-operator).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["avni-sharma"]} -->
openshift-ci-robot: Hi @qibobo. Thanks for your PR.

I'm waiting for a [redhat-developer](https://github.com/orgs/redhat-developer/people) member to verify that this patch is reasonable to test. If it is, they should reply with `/ok-to-test` on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should [join the org](https://github.com/orgs/redhat-developer/people) to skip this step.

Once the patch is verified, the new status will be reflected by the `ok-to-test` label.

I understand the commands that are listed [here](https://go.k8s.io/bot-commands?repo=redhat-developer%2Fservice-binding-operator).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>

qibobo: @isutton 
Could you help review this PR?
qibobo: @pedjak done
isutton: /ok-to-test
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-lint | be46321fd6229ee2a39bd3ae34c1c3f103e18852 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-lint/1309043453077753856) | `/test 4.5-lint`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 4bb915cb38540dc46b4366dd899900598caee6f8 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1309052150558494720) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
qibobo: /retest
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 4bb915cb38540dc46b4366dd899900598caee6f8 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1309089862548197376) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 3d8d43d4cfff8a1e61fa48f9ddd4f0e4d84914fd | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1309155756909531136) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
pmacik: /test 4.5-acceptance

openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 3d8d43d4cfff8a1e61fa48f9ddd4f0e4d84914fd | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1309235851837837312) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
qibobo: @Avni-Sharma @isutton @pmacik @pedjak 
The acceptance test is failed, but seems I did not modify the error part. Could you help confirm whether it is the acceptance test problem or the issue of my PR?

```
test/acceptance/features/steps/steps.py:225
      Assertion Failed: 
      Expected: not SBO jq result "{result}" should match "{json_value_regex}"
           but: was <None>
```
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 94100ab6e65594d4f694eff49feae161dc0b33ea | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1309500444761919488) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
sbose78: @qibobo Could you please add a description why this is needed :) ?
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 111b7dc3123d06bdb6c08ed1c22f4ce3d7a92f31 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1310229749351583744) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
qibobo: > @qibobo Could you please add a description why this is needed :) ?

@sbose78 Done. Add the issue that for the discussion of this PR.
openshift-ci-robot: @qibobo: PR needs rebase.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>
pedjak: Does this PR include the work in https://github.com/redhat-developer/service-binding-operator/pull/502 ?
qibobo: > Does this PR include the work in #502 ?

@pedjak 
Both this PR and 502 are not merged yet, so we can not include each other.
pedjak: > Both this PR and 502 are not merged yet, so we can not include each other.

#502 is about handling situation when service is not found. Does your PR cover such situation?
qibobo: > > Both this PR and 502 are not merged yet, so we can not include each other.
> 
> #502 is about handling situation when service is not found. Does your PR cover such situation?

@pedjak 
It does not cover the scenario. In PR 502,  a new ServiceNotFoundReason is introduced, so either my PR got merged first then PR502 should add relevant change, or PR502 got merged first and then I will do the change. Is it reasonable?
pedjak: > It does not cover the scenario. In PR 502, a new ServiceNotFoundReason is introduced, so either my PR got merged first then PR502 should add relevant change, or PR502 got merged first and then I will do the change. Is it reasonable?

@qibobo thanks for the clarification - IMHO your PR should go first.
openshift-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **avni-sharma** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @avni-sharma` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=redhat-developer%2Fservice-binding-operator).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["avni-sharma"]} -->
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-lint | 4444e81abb70e61f1ac8a5bc13c91acb3a800c5a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-lint/1314404820479643648) | `/test 4.5-lint`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci-robot: @qibobo: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-lint | 4444e81abb70e61f1ac8a5bc13c91acb3a800c5a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-lint/1314404820479643648) | `/test 4.5-lint`
ci/prow/4.5-unit | 4444e81abb70e61f1ac8a5bc13c91acb3a800c5a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-unit/1314404820588695552) | `/test 4.5-unit`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
openshift-ci-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | aca8433489b8d2fd3830c7852aaeaa77082e871a | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1314408841818935296) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
qibobo: @pedjak @Avni-Sharma any more comments?
Avni-Sharma: I also think that we can have acceptance tests for `ready` condition. For example https://github.com/redhat-developer/service-binding-operator/blob/master/test/acceptance/features/bindAppToService.feature#L70
qibobo: @Avni-Sharma 
updated.
qibobo: > I also think that we can have acceptance tests for `ready` condition. For example https://github.com/redhat-developer/service-binding-operator/blob/master/test/acceptance/features/bindAppToService.feature#L70

@Avni-Sharma I think they have been added.
openshift-merge-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 7be30afb99cf1cfe544bf59f891f38e7f936873e | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1319563923711594496) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
qibobo: /retest
openshift-merge-robot: @qibobo: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.5-acceptance | 9872ff1cb40df07d6a0184fc5a65f161021d97ce | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/681/pull-ci-redhat-developer-service-binding-operator-master-4.5-acceptance/1321336960010162176) | `/test 4.5-acceptance`

[Full PR test history](https://prow.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=681). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:qibobo).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
qibobo: /retest
Avni-Sharma: > > I also think that we can have acceptance tests for `ready` condition. For example https://github.com/redhat-developer/service-binding-operator/blob/master/test/acceptance/features/bindAppToService.feature#L70
> 
> @Avni-Sharma I think they have been added.

Oh , I meant specifically checking for `Ready` under conditions
qibobo: @Avni-Sharma squashed the commits.
Avni-Sharma: @qibobo Please feel free to create an issue regarding https://github.com/redhat-developer/service-binding-operator/pull/681#discussion_r510158311 . You can perhaps take it up later 
Avni-Sharma: /lgtm
/approve
openshift-ci-robot: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/redhat-developer/service-binding-operator/pull/681#issuecomment-721208917" title="Approved">Avni-Sharma</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=redhat-developer%2Fservice-binding-operator).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/redhat-developer/service-binding-operator/blob/master/OWNERS)~~ [Avni-Sharma]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->

Patch:
diff --git a/pkg/controller/servicebinding/reconciler.go b/pkg/controller/servicebinding/reconciler.go
index 40f5f834..54bcacd2 100644
--- a/pkg/controller/servicebinding/reconciler.go
+++ b/pkg/controller/servicebinding/reconciler.go
@@ -6,6 +6,7 @@ import (
 
 	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
 	corev1 "k8s.io/api/core/v1"
+	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/api/meta"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -15,10 +16,13 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	"github.com/redhat-developer/service-binding-operator/pkg/apis/operators/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	"github.com/redhat-developer/service-binding-operator/pkg/log"
 )
 
 const (
+	// BindingReady indicates that the overall sbr succeeded
+	BindingReady conditionsv1.ConditionType = "Ready"
 	// CollectionReady indicates readiness for collection and persistance of intermediate manifests
 	CollectionReady conditionsv1.ConditionType = "CollectionReady"
 	// InjectionReady indicates readiness to change application manifests to use those intermediate manifests
@@ -32,6 +36,8 @@ const (
 	EmptyApplicationReason = "EmptyApplication"
 	// ApplicationNotFoundReason is used when the application is not found.
 	ApplicationNotFoundReason = "ApplicationNotFound"
+	// ServiceNotFoundReason is used when the service is not found.
+	ServiceNotFoundReason = "ServiceNotFound"
 )
 
 // Reconciler reconciles a ServiceBinding object
@@ -131,10 +137,12 @@ func (r *reconciler) Reconcile(request reconcile.Request) (reconcile.Result, err
 				Message: errEmptyServices.Error(),
 			},
 			conditionsv1.Condition{
-				Type:    InjectionReady,
-				Status:  corev1.ConditionFalse,
-				Reason:  EmptyServiceSelectorsReason,
-				Message: errEmptyServices.Error(),
+				Type:   InjectionReady,
+				Status: corev1.ConditionFalse,
+			},
+			conditionsv1.Condition{
+				Type:   BindingReady,
+				Status: corev1.ConditionFalse,
 			},
 		)
 		if updateErr == nil {
@@ -157,9 +165,30 @@ func (r *reconciler) Reconcile(request reconcile.Request) (reconcile.Result, err
 		r.restMapper,
 	)
 	if err != nil {
+		//handle service not found error
+		if k8serrors.IsNotFound(err) {
+			err = updateSBRConditions(r.dynClient, sbr,
+				conditionsv1.Condition{
+					Type:    CollectionReady,
+					Status:  corev1.ConditionFalse,
+					Reason:  ServiceNotFoundReason,
+					Message: err.Error(),
+				},
+				conditionsv1.Condition{
+					Type:   InjectionReady,
+					Status: corev1.ConditionFalse,
+				},
+				conditionsv1.Condition{
+					Type:   BindingReady,
+					Status: corev1.ConditionFalse,
+				},
+			)
+			if err != nil {
+				logger.Error(err, "Failed to update SBR conditions", "sbr", sbr)
+			}
+		}
 		return requeueError(err)
 	}
-
 	binding, err := buildBinding(
 		r.dynClient,
 		sbr.Spec.CustomEnvVar,
@@ -220,3 +249,21 @@ func (r *reconciler) Reconcile(request reconcile.Request) (reconcile.Result, err
 	logger.Info("Binding applications with intermediary secret...")
 	return sb.bind()
 }
+
+func updateSBRConditions(dynClient dynamic.Interface, sbr *v1alpha1.ServiceBinding, conditions ...conditionsv1.Condition) error {
+	for _, v := range conditions {
+		conditionsv1.SetStatusCondition(&sbr.Status.Conditions, v)
+	}
+	u, err := converter.ToUnstructured(sbr)
+	if err != nil {
+		return err
+	}
+
+	nsClient := dynClient.
+		Resource(groupVersion).
+		Namespace(sbr.GetNamespace())
+
+	_, err = nsClient.UpdateStatus(u, metav1.UpdateOptions{})
+
+	return err
+}
diff --git a/pkg/controller/servicebinding/servicebinder.go b/pkg/controller/servicebinding/servicebinder.go
index 8ca9da24..36c3a912 100644
--- a/pkg/controller/servicebinding/servicebinder.go
+++ b/pkg/controller/servicebinding/servicebinder.go
@@ -238,6 +238,10 @@ func (b *serviceBinder) onError(
 		Reason:  bindingFail,
 		Message: b.message(err),
 	})
+	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+		Type:   BindingReady,
+		Status: corev1.ConditionFalse,
+	})
 	newSbr, errStatus := b.updateStatusServiceBinding(sbr, sbrStatus)
 	if errStatus != nil {
 		return requeueError(errStatus)
@@ -274,14 +278,7 @@ func removeFinalizer(sbr *v1alpha1.ServiceBinding) {
 // handleApplicationError handles scenarios when:
 // 1. application not declared in the Service Binding
 // 2. application not found
-func (b *serviceBinder) handleApplicationError(reason string, applicationError error, sbrStatus *v1alpha1.ServiceBindingStatus) (reconcile.Result, error) {
-	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
-		Type:    InjectionReady,
-		Status:  corev1.ConditionFalse,
-		Reason:  reason,
-		Message: applicationError.Error(),
-	})
-
+func (b *serviceBinder) handleApplicationError(applicationError error, sbrStatus *v1alpha1.ServiceBindingStatus) (reconcile.Result, error) {
 	// updating status of request instance
 	sbr, err := b.updateStatusServiceBinding(b.sbr, sbrStatus)
 	if err != nil {
@@ -320,13 +317,33 @@ func (b *serviceBinder) bind() (reconcile.Result, error) {
 	})
 
 	if isApplicationEmpty(b.sbr.Spec.Application) {
-		return b.handleApplicationError(EmptyApplicationReason, errEmptyApplication, sbrStatus)
+		conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+			Type:    InjectionReady,
+			Status:  corev1.ConditionFalse,
+			Reason:  EmptyApplicationReason,
+			Message: errEmptyApplication.Error(),
+		})
+		conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+			Type:   BindingReady,
+			Status: corev1.ConditionTrue,
+		})
+		return b.handleApplicationError(errEmptyApplication, sbrStatus)
 	}
 	updatedObjects, err := b.binder.bind()
 	if err != nil {
 		b.logger.Error(err, "On binding application.")
 		if errors.Is(err, errApplicationNotFound) {
-			return b.handleApplicationError(ApplicationNotFoundReason, errApplicationNotFound, sbrStatus)
+			conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+				Type:    InjectionReady,
+				Status:  corev1.ConditionFalse,
+				Reason:  ApplicationNotFoundReason,
+				Message: errApplicationNotFound.Error(),
+			})
+			conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+				Type:   BindingReady,
+				Status: corev1.ConditionFalse,
+			})
+			return b.handleApplicationError(errApplicationNotFound, sbrStatus)
 		}
 		return b.onError(err, b.sbr, sbrStatus, nil)
 	}
@@ -336,6 +353,10 @@ func (b *serviceBinder) bind() (reconcile.Result, error) {
 		Type:   InjectionReady,
 		Status: corev1.ConditionTrue,
 	})
+	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+		Type:   BindingReady,
+		Status: corev1.ConditionTrue,
+	})
 
 	// updating status of request instance
 	sbr, err := b.updateStatusServiceBinding(b.sbr, sbrStatus)


Test patch:
diff --git a/pkg/controller/servicebinding/reconciler_test.go b/pkg/controller/servicebinding/reconciler_test.go
index 83e08ae7..6ac0463e 100644
--- a/pkg/controller/servicebinding/reconciler_test.go
+++ b/pkg/controller/servicebinding/reconciler_test.go
@@ -133,6 +133,7 @@ func TestApplicationByName(t *testing.T) {
 
 		requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions)
 		requireConditionPresentAndTrue(t, InjectionReady, sbrOutput.Status.Conditions)
+		requireConditionPresentAndTrue(t, BindingReady, sbrOutput.Status.Conditions)
 
 		require.Equal(t, 1, len(sbrOutput.Status.Applications))
 		expectedStatus := v1alpha1.BoundApplication{
@@ -196,6 +197,7 @@ func TestReconcilerReconcileUsingSecret(t *testing.T) {
 
 		requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions)
 		requireConditionPresentAndTrue(t, InjectionReady, sbrOutput.Status.Conditions)
+		requireConditionPresentAndTrue(t, BindingReady, sbrOutput.Status.Conditions)
 
 		require.Equal(t, reconcilerName, sbrOutput.Status.Secret)
 
@@ -259,6 +261,59 @@ func TestReconcilerReconcileUsingVolumes(t *testing.T) {
 	})
 }
 
+func TestServiceNotFound(t *testing.T) {
+	backingServiceResourceRef := "backingServiceRef"
+	applicationResourceRef := "applicationRef"
+	f := mocks.NewFake(t, reconcilerNs)
+	f.AddMockedUnstructuredServiceBinding(reconcilerName, backingServiceResourceRef, applicationResourceRef, deploymentsGVR, nil)
+	f.AddMockedUnstructuredDatabaseCRD()
+	f.AddMockedUnstructuredDeployment(applicationResourceRef, nil)
+
+	fakeDynClient := f.FakeDynClient()
+	mapper := testutils.BuildTestRESTMapper()
+	r := &reconciler{dynClient: fakeDynClient, restMapper: mapper, scheme: f.S}
+	r.resourceWatcher = newFakeResourceWatcher(mapper)
+
+	// Reconcile without service
+	res, _ := r.Reconcile(reconcileRequest())
+	require.True(t, res.Requeue)
+
+	namespacedName := types.NamespacedName{Namespace: reconcilerNs, Name: reconcilerName}
+	sbrOutput, err := r.getServiceBinding(namespacedName)
+	require.NoError(t, err)
+
+	requireConditionPresentAndFalse(t, CollectionReady, sbrOutput.Status.Conditions)
+	requireConditionPresentAndFalse(t, InjectionReady, sbrOutput.Status.Conditions)
+	requireConditionPresentAndFalse(t, BindingReady, sbrOutput.Status.Conditions)
+	require.Len(t, sbrOutput.Status.Applications, 0)
+
+	// Reconcile with service
+	f.AddMockedUnstructuredDatabaseCR(backingServiceResourceRef)
+	f.AddMockedUnstructuredSecret("db-credentials")
+	fakeDynClient = f.FakeDynClient()
+	r = &reconciler{dynClient: fakeDynClient, restMapper: testutils.BuildTestRESTMapper(), scheme: f.S}
+	r.resourceWatcher = newFakeResourceWatcher(mapper)
+	res, err = r.Reconcile(reconcileRequest())
+	require.NoError(t, err)
+	require.False(t, res.Requeue)
+
+	u, err := fakeDynClient.Resource(deploymentsGVR).Get(applicationResourceRef, metav1.GetOptions{})
+	require.NoError(t, err)
+
+	d := appsv1.Deployment{}
+	err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &d)
+	require.NoError(t, err)
+	sbrOutput2, err := r.getServiceBinding(namespacedName)
+	require.NoError(t, err)
+
+	requireConditionPresentAndTrue(t, CollectionReady, sbrOutput2.Status.Conditions)
+	requireConditionPresentAndTrue(t, InjectionReady, sbrOutput2.Status.Conditions)
+	requireConditionPresentAndTrue(t, BindingReady, sbrOutput2.Status.Conditions)
+
+	require.Equal(t, reconcilerName, sbrOutput2.Status.Secret)
+	require.Equal(t, 1, len(sbrOutput2.Status.Applications))
+}
+
 func TestApplicationNotFound(t *testing.T) {
 	backingServiceResourceRef := "backingService1"
 	matchLabels := map[string]string{
@@ -288,6 +343,7 @@ func TestApplicationNotFound(t *testing.T) {
 
 	requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions)
 	requireConditionPresentAndFalse(t, InjectionReady, sbrOutput.Status.Conditions)
+	requireConditionPresentAndFalse(t, BindingReady, sbrOutput.Status.Conditions)
 	require.Len(t, sbrOutput.Status.Applications, 0)
 
 	// Reconcile with deployment
@@ -310,6 +366,7 @@ func TestApplicationNotFound(t *testing.T) {
 
 	requireConditionPresentAndTrue(t, CollectionReady, sbrOutput2.Status.Conditions)
 	requireConditionPresentAndTrue(t, InjectionReady, sbrOutput2.Status.Conditions)
+	requireConditionPresentAndTrue(t, BindingReady, sbrOutput2.Status.Conditions)
 
 	require.Equal(t, reconcilerName, sbrOutput2.Status.Secret)
 	require.Equal(t, 1, len(sbrOutput2.Status.Applications))
@@ -361,6 +418,7 @@ func TestReconcilerUpdateCredentials(t *testing.T) {
 
 	requireConditionPresentAndTrue(t, CollectionReady, sbrOutput3.Status.Conditions)
 	requireConditionPresentAndTrue(t, InjectionReady, sbrOutput3.Status.Conditions)
+	requireConditionPresentAndTrue(t, BindingReady, sbrOutput3.Status.Conditions)
 
 	require.Equal(t, reconcilerName, sbrOutput3.Status.Secret)
 	require.Equal(t, s.Data["password"], []byte("abc123"))
@@ -420,6 +478,7 @@ func TestReconcilerReconcileWithConflictingAppSelc(t *testing.T) {
 
 		requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions)
 		requireConditionPresentAndTrue(t, InjectionReady, sbrOutput.Status.Conditions)
+		requireConditionPresentAndTrue(t, BindingReady, sbrOutput.Status.Conditions)
 
 		require.Equal(t, reconcilerName, sbrOutput.Status.Secret)
 		require.Len(t, sbrOutput.Status.Applications, 1)
@@ -449,6 +508,32 @@ func TestEmptyApplication(t *testing.T) {
 
 	requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions)
 	requireConditionPresentAndFalse(t, InjectionReady, sbrOutput.Status.Conditions)
+	requireConditionPresentAndTrue(t, BindingReady, sbrOutput.Status.Conditions)
+}
+
+// TestEmptyServiceSelector tests that CollectionReady,InjectionReady and BindingReady are all successfully updated to True when ServiceSelector is empty
+func TestEmptyServiceSelectorAndAllConditionAreSetToFalse(t *testing.T) {
+	applicationResourceRef := "applicationRef"
+	f := mocks.NewFake(t, reconcilerNs)
+	f.AddMockedUnstructuredServiceBindingWithoutService(reconcilerName, applicationResourceRef, deploymentsGVR)
+
+	fakeDynClient := f.FakeDynClient()
+	mapper := testutils.BuildTestRESTMapper()
+	r := &reconciler{dynClient: fakeDynClient, restMapper: mapper, scheme: f.S}
+	r.resourceWatcher = newFakeResourceWatcher(mapper)
+
+	res, err := r.Reconcile(reconcileRequest())
+	require.NoError(t, err)
+	require.False(t, res.Requeue)
+
+	namespacedName := types.NamespacedName{Namespace: reconcilerNs, Name: reconcilerName}
+	sbrOutput, err := r.getServiceBinding(namespacedName)
+	require.NoError(t, err)
+
+	requireConditionPresentAndFalse(t, CollectionReady, sbrOutput.Status.Conditions)
+	requireConditionPresentAndFalse(t, InjectionReady, sbrOutput.Status.Conditions)
+	requireConditionPresentAndFalse(t, BindingReady, sbrOutput.Status.Conditions)
+
 }
 
 func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
@@ -505,6 +590,7 @@ func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
 
 		requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions)
 		requireConditionPresentAndTrue(t, InjectionReady, sbrOutput.Status.Conditions)
+		requireConditionPresentAndTrue(t, BindingReady, sbrOutput.Status.Conditions)
 		require.Equal(t, sbrName1, sbrOutput.Status.Secret)
 		require.Len(t, sbrOutput.Status.Applications, 1)
 		require.True(t, reflect.DeepEqual(expectedStatus, sbrOutput.Status.Applications[0]))
@@ -542,6 +628,7 @@ func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
 
 		requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions)
 		requireConditionPresentAndTrue(t, InjectionReady, sbrOutput.Status.Conditions)
+		requireConditionPresentAndTrue(t, BindingReady, sbrOutput.Status.Conditions)
 		require.Equal(t, sbrName2, sbrOutput.Status.Secret)
 		require.Len(t, sbrOutput.Status.Applications, 1)
 		require.True(t, reflect.DeepEqual(expectedStatus, sbrOutput.Status.Applications[0]))
diff --git a/pkg/controller/servicebinding/servicebinder_test.go b/pkg/controller/servicebinding/servicebinder_test.go
index 94b734a7..d2e0e8ec 100644
--- a/pkg/controller/servicebinding/servicebinder_test.go
+++ b/pkg/controller/servicebinding/servicebinder_test.go
@@ -324,6 +324,41 @@ func TestServiceBinder_Bind(t *testing.T) {
 	}
 	f.AddMockResource(sbrMultipleServices)
 
+	sbrSingleServiceWithNonExistedApp := &v1alpha1.ServiceBinding{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: "operators.coreos.com/v1alpha1",
+			Kind:       "ServiceBinding",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name: "single-sbr-with-non-existed-app",
+		},
+		Spec: v1alpha1.ServiceBindingSpec{
+			Application: &v1alpha1.Application{
+				LabelSelector: &metav1.LabelSelector{
+					MatchLabels: matchLabels,
+				},
+				GroupVersionResource: metav1.GroupVersionResource{
+					Group:    d.GetObjectKind().GroupVersionKind().Group,
+					Version:  d.GetObjectKind().GroupVersionKind().Version,
+					Resource: "deployments",
+				},
+				LocalObjectReference: corev1.LocalObjectReference{Name: "app-not-existed"},
+			},
+			Services: []v1alpha1.Service{
+				{
+					GroupVersionKind: metav1.GroupVersionKind{
+						Group:   db1.GetObjectKind().GroupVersionKind().Group,
+						Version: db1.GetObjectKind().GroupVersionKind().Version,
+						Kind:    db1.GetObjectKind().GroupVersionKind().Kind,
+					},
+					LocalObjectReference: corev1.LocalObjectReference{Name: d.GetName()},
+				},
+			},
+		},
+		Status: v1alpha1.ServiceBindingStatus{},
+	}
+	f.AddMockResource(sbrSingleServiceWithNonExistedApp)
+
 	sbrEmptyAppSelector := &v1alpha1.ServiceBinding{
 		TypeMeta: metav1.TypeMeta{
 			APIVersion: "operators.coreos.com/v1alpha1",
@@ -400,6 +435,10 @@ func TestServiceBinder_Bind(t *testing.T) {
 				Type:   InjectionReady,
 				Status: corev1.ConditionTrue,
 			},
+			{
+				Type:   BindingReady,
+				Status: corev1.ConditionTrue,
+			},
 		},
 		wantActions: []wantedAction{
 			{
@@ -443,6 +482,10 @@ func TestServiceBinder_Bind(t *testing.T) {
 				Type:   InjectionReady,
 				Status: corev1.ConditionTrue,
 			},
+			{
+				Type:   BindingReady,
+				Status: corev1.ConditionTrue,
+			},
 		},
 		wantActions: []wantedAction{
 			{
@@ -487,6 +530,10 @@ func TestServiceBinder_Bind(t *testing.T) {
 				Type:   InjectionReady,
 				Status: corev1.ConditionTrue,
 			},
+			{
+				Type:   BindingReady,
+				Status: corev1.ConditionTrue,
+			},
 		},
 	}))
 
@@ -513,6 +560,40 @@ func TestServiceBinder_Bind(t *testing.T) {
 				Reason:  EmptyApplicationReason,
 				Message: errEmptyApplication.Error(),
 			},
+			{
+				Type:   BindingReady,
+				Status: corev1.ConditionTrue,
+			},
+		},
+	}))
+
+	t.Run("application not found", assertBind(args{
+		options: &serviceBinderOptions{
+			logger:                 logger,
+			dynClient:              f.FakeDynClient(),
+			detectBindingResources: true,
+			sbr:                    sbrSingleServiceWithNonExistedApp,
+			binding: &internalBinding{
+				envVars:    map[string][]byte{},
+				volumeKeys: []string{},
+			},
+			restMapper: testutils.BuildTestRESTMapper(),
+		},
+		wantConditions: []wantedCondition{
+			{
+				Type:   CollectionReady,
+				Status: corev1.ConditionTrue,
+			},
+			{
+				Type:    InjectionReady,
+				Status:  corev1.ConditionFalse,
+				Reason:  ApplicationNotFoundReason,
+				Message: errApplicationNotFound.Error(),
+			},
+			{
+				Type:   BindingReady,
+				Status: corev1.ConditionFalse,
+			},
 		},
 	}))
 
@@ -549,6 +630,10 @@ func TestServiceBinder_Bind(t *testing.T) {
 				Type:   InjectionReady,
 				Status: corev1.ConditionTrue,
 			},
+			{
+				Type:   BindingReady,
+				Status: corev1.ConditionTrue,
+			},
 		},
 		wantActions: []wantedAction{
 			{
diff --git a/test/acceptance/features/bindAppToMultipleServices.feature b/test/acceptance/features/bindAppToMultipleServices.feature
index f95b5100..c9da4b48 100644
--- a/test/acceptance/features/bindAppToMultipleServices.feature
+++ b/test/acceptance/features/bindAppToMultipleServices.feature
@@ -51,8 +51,10 @@ Feature: Bind a single application to multiple services
 
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-1" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-1" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-1" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-2" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-2" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-2" should be changed to "True"
         And "nodejs-app" deployment must contain SBR name "binding-request-1"
         And "nodejs-app" deployment must contain SBR name "binding-request-2"
 
@@ -106,5 +108,6 @@ Feature: Bind a single application to multiple services
 
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-1sbr" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-1sbr" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-1sbr" should be changed to "True"
         And The application env var "BACKEND_HOST_INTERNAL_DB" has value "internal.db.stable.example.com"
         And The application env var "BACKEND_HOST_EXTERNAL_DB" has value "external.db.stable.example.com"
diff --git a/test/acceptance/features/bindAppToService.feature b/test/acceptance/features/bindAppToService.feature
index c23edc19..bbe5a791 100644
--- a/test/acceptance/features/bindAppToService.feature
+++ b/test/acceptance/features/bindAppToService.feature
@@ -33,6 +33,7 @@ Feature: Bind an application to a service
 
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-a-d-s" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-a-d-s" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-a-d-s" should be changed to "True"
         And application should be re-deployed
         And application should be connected to the DB "db-demo-a-d-s"
         And Secret "binding-request-a-d-s" contains "DATABASE_DBNAME" key with value "db-demo-a-d-s"
@@ -69,6 +70,7 @@ Feature: Bind an application to a service
         When DB "db-demo-a-s-d" is running
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-a-s-d" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-a-s-d" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-a-s-d" should be changed to "True"
         And application should be re-deployed
         And application should be connected to the DB "db-demo-a-s-d"
 
@@ -97,6 +99,7 @@ Feature: Bind an application to a service
         When Imported Nodejs application "nodejs-rest-http-crud-d-s-a" is running
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-d-s-a" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-d-s-a" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-d-s-a" should be changed to "True"
         And application should be re-deployed
         And application should be connected to the DB "db-demo-d-s-a"
 
@@ -126,6 +129,7 @@ Feature: Bind an application to a service
         When DB "db-demo-s-a-d" is running
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-s-a-d" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-s-a-d" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-s-a-d" should be changed to "True"
         And application should be re-deployed
         And application should be connected to the DB "db-demo-s-a-d"
 
@@ -154,6 +158,7 @@ Feature: Bind an application to a service
         When Imported Nodejs application "nodejs-rest-http-crud-s-d-a" is running
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-s-d-a" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-s-d-a" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-s-d-a" should be changed to "True"
         And application should be re-deployed
         And application should be connected to the DB "db-demo-s-d-a"
 
@@ -183,6 +188,7 @@ Feature: Bind an application to a service
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-missing-app" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-missing-app" should be changed to "False"
         And jq ".status.conditions[] | select(.type=="InjectionReady").reason" of Service Binding "binding-request-missing-app" should be changed to "ApplicationNotFound"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-missing-app" should be changed to "False"
 
     @negative
     Scenario: Service Binding without application selector
@@ -216,10 +222,10 @@ Feature: Bind an application to a service
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-empty-app" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-empty-app" should be changed to "False"
         And jq ".status.conditions[] | select(.type=="InjectionReady").reason" of Service Binding "binding-request-empty-app" should be changed to "EmptyApplication"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-empty-app" should be changed to "True"
         And Secret "binding-request-empty-app" contains "BACKEND_HOST" key with value "example.common"
         And Secret "binding-request-empty-app" contains "BACKEND_USERNAME" key with value "foo"
 
-
     Scenario: Backend Service status update gets propagated to the binding secret
         Given OLM Operator "backend" is running
         * The Custom Resource is present
@@ -255,7 +261,9 @@ Feature: Bind an application to a service
             """
         * jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend" should be changed to "True"
         * jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend" should be changed to "False"
+        * jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend" should be changed to "True"
         * Secret "binding-request-backend" contains "CustomReady" key with value "<no value>"
+
         # Backend status in "backend-demo" is updated
         When The Custom Resource is present
             """
@@ -305,6 +313,7 @@ Feature: Bind an application to a service
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend-new-spec" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend-new-spec" should be changed to "False"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-new-spec" should be changed to "True"
         And Secret "binding-request-backend-new-spec" contains "BACKEND_HOST" key with value "example.common"
         And Secret "binding-request-backend-new-spec" contains "BACKEND_PORTS_FTP" key with value "22"
         And Secret "binding-request-backend-new-spec" contains "BACKEND_PORTS_TCP" key with value "8080"
@@ -339,6 +348,7 @@ Feature: Bind an application to a service
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-a-d-c" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-a-d-c" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-a-d-c" should be changed to "True"
         And Secret "binding-request-a-d-c" contains "SOME_KEY" key with value "SOME_VALUE:5432:db-demo-a-d-c"
 
     Scenario: Creating binding secret from the definitions managed in OLM operator descriptors
@@ -439,6 +449,7 @@ Feature: Bind an application to a service
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "sbr-csv-secret-cm-descriptors" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "sbr-csv-secret-cm-descriptors" should be changed to "False"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "sbr-csv-secret-cm-descriptors" should be changed to "True"
         And Secret "sbr-csv-secret-cm-descriptors" contains "BACKSERV_DB_HOST" key with value "172.72.2.0"
         And Secret "sbr-csv-secret-cm-descriptors" contains "BACKSERV_DB_PORT" key with value "3306"
         And Secret "sbr-csv-secret-cm-descriptors" contains "BACKSERV_PASSWORD" key with value "secret123"
@@ -515,6 +526,7 @@ Feature: Bind an application to a service
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "sbr-csv-attribute" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "sbr-csv-attribute" should be changed to "False"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "sbr-csv-attribute" should be changed to "True"
         And Secret "sbr-csv-secret-cm-descriptors" contains "BACKSERV_ENV_SVCNAME" key with value "demo-backserv-cr-1"
 
     Scenario: Bind an imported Node.js application to Etcd database
@@ -542,6 +554,7 @@ Feature: Bind an application to a service
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-etcd" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-etcd" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-etcd" should be changed to "True"
         And Application endpoint "/api/todos" is available
 
     @negative
@@ -722,4 +735,5 @@ Feature: Bind an application to a service
 
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-cross-ns-service" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-cross-ns-service" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-cross-ns-service" should be changed to "True"
         And The application env var "BACKEND_HOST_CROSS_NS_SERVICE" has value "cross.ns.service.stable.example.com"
diff --git a/test/acceptance/features/bindAppToServiceAnnotations.feature b/test/acceptance/features/bindAppToServiceAnnotations.feature
index ecf0fa71..34133fa4 100644
--- a/test/acceptance/features/bindAppToServiceAnnotations.feature
+++ b/test/acceptance/features/bindAppToServiceAnnotations.feature
@@ -61,6 +61,7 @@ Feature: Bind an application to a service using annotations
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend-a" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend-a" should be changed to "False"
         And jq ".status.conditions[] | select(.type=="InjectionReady").reason" of Service Binding "binding-request-backend-a" should be changed to "EmptyApplication"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-a" should be changed to "True"
         And Secret "binding-request-backend-a" contains "BACKEND_READY" key with value "true"
         And Secret "binding-request-backend-a" contains "BACKEND_HOST" key with value "example.common"
 
@@ -134,6 +135,7 @@ Feature: Bind an application to a service using annotations
         And The application env var "BACKEND_SPEC_DBNAME" has value "db-demo"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "rsa-2" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "rsa-2" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-a" should be changed to "True"
 
     Scenario: Each value in referred slice of strings from service resource gets injected into app as separate env variable
         Given Generic test application "slos-app" is running
@@ -323,6 +325,7 @@ Feature: Bind an application to a service using annotations
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "slom-binding" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "slom-binding" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-a" should be changed to "True"
         And The application env var "BACKEND_WEBARROWS_PRIMARY" has value "primary.example.com"
         And The application env var "BACKEND_WEBARROWS_SECONDARY" has value "secondary.example.com"
         And The application env var "BACKEND_WEBARROWS_404" has value "black-hole.example.com"
@@ -375,6 +378,7 @@ Feature: Bind an application to a service using annotations
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend-ann-sb" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend-ann-sb" should be changed to "False"
         And jq ".status.conditions[] | select(.type=="InjectionReady").reason" of Service Binding "binding-request-backend-ann-sb" should be changed to "EmptyApplication"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-a" should be changed to "True"
         And Secret "binding-request-backend-ann-sb" contains "BACKEND_READY" key with value "true"
         And Secret "binding-request-backend-ann-sb" contains "BACKEND_HOST" key with value "example.com"
 
@@ -411,6 +415,7 @@ Feature: Bind an application to a service using annotations
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-backend-ann" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-backend-ann" should be changed to "False"
         And jq ".status.conditions[] | select(.type=="InjectionReady").reason" of Service Binding "binding-request-backend-ann" should be changed to "EmptyApplication"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-backend-a" should be changed to "True"
         And Secret "binding-request-backend-ann" is empty
         # Backend metadata.annotations not pertaining to service binding is updated
         When The Custom Resource is present
diff --git a/test/acceptance/features/bindAppToServiceUsingConfigMap.feature b/test/acceptance/features/bindAppToServiceUsingConfigMap.feature
index 5bc58b4d..63b555a7 100644
--- a/test/acceptance/features/bindAppToServiceUsingConfigMap.feature
+++ b/test/acceptance/features/bindAppToServiceUsingConfigMap.feature
@@ -79,6 +79,7 @@ Feature: Bind values from a config map referred in backing service resource
         Then The application env var "BACKEND_CERTIFICATE" has value "certificate value"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "cmsa-1" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "cmsa-1" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "cmsa-1" should be changed to "True"
 
     Scenario: Inject into app all keys from a config map referred within service resource
                 Binding definition is declared on service CRD.
@@ -154,4 +155,5 @@ Feature: Bind values from a config map referred in backing service resource
         And The application env var "BACKEND_CERTIFICATE" has value "certificate value"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "cmsa-2" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "cmsa-2" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "cmsa-2" should be changed to "True"
 
diff --git a/test/acceptance/features/bindAppToServiceUsingSecret.feature b/test/acceptance/features/bindAppToServiceUsingSecret.feature
index 3c356d30..1caceaab 100644
--- a/test/acceptance/features/bindAppToServiceUsingSecret.feature
+++ b/test/acceptance/features/bindAppToServiceUsingSecret.feature
@@ -77,6 +77,7 @@ Feature: Bind values from a config map referred in backing service resource
         Then The application env var "BACKEND_USERNAME" has value "AzureDiamond"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "ssa-1" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "ssa-1" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "ssa-1" should be changed to "True"
 
     Scenario: Inject into app all keys from a secret referred within service resource
             Binding definition is declared on service CRD.
@@ -151,6 +152,7 @@ Feature: Bind values from a config map referred in backing service resource
         And The application env var "BACKEND_PASSWORD" has value "hunter2"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "ssa-2" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "ssa-2" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "ssa-2" should be changed to "True"
 
 
     Scenario: Inject into app a key from a secret referred within service resource
@@ -285,6 +287,7 @@ Feature: Bind values from a config map referred in backing service resource
         Then The application env var "BACKEND_HOST" has value "example.com"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "ssd-1" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "ssd-1" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "ssd-1" should be changed to "True"
 
     Scenario: Inject into app all keys from a secret referred within service resource
                 Binding definition is declared via OLM descriptor.
@@ -420,3 +423,4 @@ Feature: Bind values from a config map referred in backing service resource
         Then The application env var "BACKEND_PASSWORD" has value "hunter2"
         And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "ssd-2" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "ssd-2" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "ssd-2" should be changed to "True"
diff --git a/test/acceptance/features/bindKnativeService.feature b/test/acceptance/features/bindKnativeService.feature
index 24edf33e..d1140784 100644
--- a/test/acceptance/features/bindKnativeService.feature
+++ b/test/acceptance/features/bindKnativeService.feature
@@ -41,5 +41,6 @@ Feature: Bind knative service to a service
       """
     Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-knative" should be changed to "True"
     And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-knative" should be changed to "True"
+    And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-knative" should be changed to "True"
     And deployment must contain intermediate secret "binding-request-knative"
     And application should be connected to the DB "db-demo-knative"
diff --git a/test/acceptance/features/customEnvVar.feature b/test/acceptance/features/customEnvVar.feature
index a409b3ab..bc2f0e1d 100644
--- a/test/acceptance/features/customEnvVar.feature
+++ b/test/acceptance/features/customEnvVar.feature
@@ -48,6 +48,7 @@ Feature: Inject custom env variable into application
     Then The application env var "TAGS" has value "[centos7-12.3 123]"
     And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "custom-env-var-from-sequence" should be changed to "True"
     And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "custom-env-var-from-sequence" should be changed to "True"
+    And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "custom-env-var-from-sequence" should be changed to "True"
 
   Scenario: Map from service resource is injected into application using custom env variables without specifying annotations
     Given OLM Operator "backend" is running
@@ -89,6 +90,7 @@ Feature: Inject custom env variable into application
     Then The application env var "USER_LABELS" has value "map[archive:false environment:demo]"
     And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "custom-env-var-from-map" should be changed to "True"
     And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "custom-env-var-from-map" should be changed to "True"
+    And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "custom-env-var-from-map" should be changed to "True"
 
 
   Scenario: Scalar from service resource is injected into application using custom env variables without specifying annotations
@@ -131,3 +133,4 @@ Feature: Inject custom env variable into application
     Then The application env var "USER_LABELS_ARCHIVE" has value "false"
     And jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "custom-env-var-from-scalar" should be changed to "True"
     And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "custom-env-var-from-scalar" should be changed to "True"
+    And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "custom-env-var-from-scalar" should be changed to "True"
diff --git a/test/acceptance/features/injectSecretAtCustomSchemaPath.feature b/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
index d0af2fe0..77910e13 100644
--- a/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
+++ b/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
@@ -74,6 +74,7 @@ Feature: Insert service binding to a custom location in application resource
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-csp" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-csp" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-csp" should be changed to "True"
         And Secret "binding-request-csp" has been injected in to CR "demo-appconfig-csp" of kind "AppConfig" at path "{.spec.spec.containers[0].envFrom[0].secretRef.name}"
 
     Scenario: Specify secret's path in Service Binding
@@ -113,4 +114,5 @@ Feature: Insert service binding to a custom location in application resource
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-ssp" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-request-ssp" should be changed to "True"
+        And jq ".status.conditions[] | select(.type=="Ready").status" of Service Binding "binding-request-ssp" should be changed to "True"
         And Secret "binding-request-ssp" has been injected in to CR "demo-appconfig-ssp" of kind "AppConfig" at path "{.spec.spec.secret}"
diff --git a/test/mocks/fake.go b/test/mocks/fake.go
index ed5f80fd..0f6e9ebf 100644
--- a/test/mocks/fake.go
+++ b/test/mocks/fake.go
@@ -71,6 +71,19 @@ func (f *Fake) AddMockedUnstructuredServiceBindingWithoutApplication(
 	return sbr
 }
 
+// AddMockedUnstructuredServiceBindingWithoutApplication creates a mock ServiceBinding object
+func (f *Fake) AddMockedUnstructuredServiceBindingWithoutService(
+	name string,
+	applicationResourceRef string,
+	applicationGVR schema.GroupVersionResource,
+) *unstructured.Unstructured {
+	f.S.AddKnownTypes(v1alpha1.SchemeGroupVersion, &v1alpha1.ServiceBinding{})
+	sbr, err := UnstructuredServiceBindingMock(f.ns, name, "", applicationResourceRef, applicationGVR, nil)
+	require.NoError(f.t, err)
+	f.objs = append(f.objs, sbr)
+	return sbr
+}
+
 // AddMockedUnstructuredServiceBinding creates a mock ServiceBinding object
 func (f *Fake) AddMockedUnstructuredServiceBinding(
 	name string,
diff --git a/test/mocks/mocks.go b/test/mocks/mocks.go
index 36923683..e2e0eedd 100644
--- a/test/mocks/mocks.go
+++ b/test/mocks/mocks.go
@@ -463,6 +463,18 @@ func ServiceBindingMock(
 	applicationGVR schema.GroupVersionResource,
 	matchLabels map[string]string,
 ) *v1alpha1.ServiceBinding {
+	var services []v1alpha1.Service
+	if backingServiceResourceRef == "" {
+		services = []v1alpha1.Service{}
+	} else {
+		services = []v1alpha1.Service{
+			{
+				GroupVersionKind:     metav1.GroupVersionKind{Group: CRDName, Version: CRDVersion, Kind: CRDKind},
+				LocalObjectReference: corev1.LocalObjectReference{Name: backingServiceResourceRef},
+				Namespace:            backingServiceNamespace,
+			},
+		}
+	}
 	sbr := &v1alpha1.ServiceBinding{
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: ns,
@@ -481,13 +493,7 @@ func ServiceBindingMock(
 				LabelSelector:        &metav1.LabelSelector{MatchLabels: matchLabels},
 			},
 			DetectBindingResources: &falseBoolPtr,
-			Services: []v1alpha1.Service{
-				{
-					GroupVersionKind:     metav1.GroupVersionKind{Group: CRDName, Version: CRDVersion, Kind: CRDKind},
-					LocalObjectReference: corev1.LocalObjectReference{Name: backingServiceResourceRef},
-					Namespace:            backingServiceNamespace,
-				},
-			},
+			Services:               services,
 		},
 	}
 	return sbr