Repository: redhat-developer/service-binding-operator
Pull request #321 (2020-02-07 12:51:29)

Replace BindingStatus field with Kubernetes compatible conditions
Refer https://issues.redhat.com/browse/APPSVC-321


In case of success:-
```
status:
  applicationObjects:
  - service-binding-demo/nodejs-rest-http-crud-git
  bindingStatus: BindingSuccess
  conditions:
  - lastHeartbeatTime: "2020-01-28T10:30:15Z"
    lastTransitionTime: "2020-01-28T10:30:15Z"
    status: "True"
    type: Ready
  secret: node-todo-git
```
Note- Reason and message has been omitted here, as in case of success it is not necessary.

In case of failure, it can happen like below
```
status:
  conditions:
  - lastHeartbeatTime: "2020-01-28T11:57:18Z"
    lastTransitionTime: "2020-01-28T11:56:58Z"
    message: 'binding service selectors are empty'
    reason: EmptyBackingServiceSelectors
    status: "False"
    type: Ready
```
The above status is `False` when we do not provide the `backingServiceSelectors` in the service binding request. Other failure conditions have been mentioned in the JIRA above

openshift-ci-robot: @Avni-Sharma: 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>
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: @Avni-Sharma: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/unit | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1013) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/unit | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1013) | `/test unit`
ci/prow/e2e | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1100) | `/test e2e`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/unit | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1013) | `/test unit`
ci/prow/e2e | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1100) | `/test e2e`
ci/prow/lint | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1046) | `/test lint`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1100) | `/test e2e`
ci/prow/lint | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1046) | `/test lint`
ci/prow/unit | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1026) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/lint | 1357617899c200747371f8e28da87521364c5870 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1046) | `/test lint`
ci/prow/unit | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1026) | `/test unit`
ci/prow/e2e | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1113) | `/test e2e`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/unit | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1026) | `/test unit`
ci/prow/e2e | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1113) | `/test e2e`
ci/prow/lint | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1061) | `/test lint`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/unit | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1026) | `/test unit`
ci/prow/e2e | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1113) | `/test e2e`
ci/prow/lint | 8e70bcdb025334ae8d18fdc334d7c5cd0ba311a9 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1062) | `/test lint`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1113) | `/test e2e`
ci/prow/lint | 8e70bcdb025334ae8d18fdc334d7c5cd0ba311a9 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1062) | `/test lint`
ci/prow/unit | 8e70bcdb025334ae8d18fdc334d7c5cd0ba311a9 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1027) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1113) | `/test e2e`
ci/prow/unit | 8e70bcdb025334ae8d18fdc334d7c5cd0ba311a9 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1027) | `/test unit`
ci/prow/lint | 795ca256267cb60534d53de70d896d085362c25e | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1065) | `/test lint`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e | b4304343ddc933707273821ddca5ce11a3fad205 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1113) | `/test e2e`
ci/prow/lint | 795ca256267cb60534d53de70d896d085362c25e | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1065) | `/test lint`
ci/prow/unit | 795ca256267cb60534d53de70d896d085362c25e | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1030) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/lint | 795ca256267cb60534d53de70d896d085362c25e | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1065) | `/test lint`
ci/prow/unit | 795ca256267cb60534d53de70d896d085362c25e | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1030) | `/test unit`
ci/prow/e2e | 795ca256267cb60534d53de70d896d085362c25e | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1117) | `/test e2e`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: Having this makes things look pretty in the UI

![image](https://user-images.githubusercontent.com/545280/74387764-78477100-4dc7-11ea-8709-b37dc2c13c97.png)

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/e2e | 795ca256267cb60534d53de70d896d085362c25e | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1117) | `/test e2e`
ci/prow/unit | ccf50f171aa21aa4f6ea944d5c6ae59323c87468 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1041) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
codecov[bot]: # [Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321?src=pr&el=h1) Report
> :exclamation: No coverage uploaded for pull request base (`master@795ca25`). [Click here to learn what that means](https://docs.codecov.io/docs/error-reference#section-missing-base-commit).
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321/graphs/tree.svg?width=650&token=CICBeVWlrC&height=150&src=pr)](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321?src=pr&el=tree)

```diff
@@            Coverage Diff            @@
##             master     #321   +/-   ##
=========================================
  Coverage          ?   52.51%           
=========================================
  Files             ?       21           
  Lines             ?     1474           
  Branches          ?        0           
=========================================
  Hits              ?      774           
  Misses            ?      567           
  Partials          ?      133
```


| [Impacted Files](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pkg/controller/servicebindingrequest/reconciler.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321/diff?src=pr&el=tree#diff-cGtnL2NvbnRyb2xsZXIvc2VydmljZWJpbmRpbmdyZXF1ZXN0L3JlY29uY2lsZXIuZ28=) | `50.31% <100%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321?src=pr&el=footer). Last update [795ca25...238a162](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/321?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.4-unit | f3314a343de614d8364104f95c469abf389d1eae | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-4.4-unit/9) | `/test 4.4-unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.4-unit | f3314a343de614d8364104f95c469abf389d1eae | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-4.4-unit/9) | `/test 4.4-unit`
ci/prow/unit | f3314a343de614d8364104f95c469abf389d1eae | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1055) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.4-unit | f3314a343de614d8364104f95c469abf389d1eae | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-4.4-unit/9) | `/test 4.4-unit`
ci/prow/unit | f3314a343de614d8364104f95c469abf389d1eae | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1055) | `/test unit`
ci/prow/e2e | f3314a343de614d8364104f95c469abf389d1eae | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-e2e/1143) | `/test e2e`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.4-e2e | 9c8320db7b48b07ceb1ce0ce0b624f0ddc533429 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-4.4-e2e/11) | `/test 4.4-e2e`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->
isutton: /retest 
openshift-ci-robot: @Avni-Sharma: 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>
openshift-ci-robot: @Avni-Sharma: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.4-e2e | 9c8320db7b48b07ceb1ce0ce0b624f0ddc533429 | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-4.4-e2e/19) | `/test 4.4-e2e`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following test **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/lint | 6aa7bce0caa03a71c5d98d300a8564cfed26febf | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1109) | `/test lint`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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: @Avni-Sharma: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/lint | 6aa7bce0caa03a71c5d98d300a8564cfed26febf | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-lint/1109) | `/test lint`
ci/prow/unit | 6aa7bce0caa03a71c5d98d300a8564cfed26febf | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/321/pull-ci-redhat-developer-service-binding-operator-master-unit/1074) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=321). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:Avni-Sharma). Please help us cut down on flakes by [linking to](https://github.com/kubernetes/community/blob/master/contributors/devel/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/redhat-developer/service-binding-operator/issues?q=is:issue+is:open) when you hit one in your PR.

<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 -->

Patch:
diff --git a/examples/multiple_services/README.md b/examples/multiple_services/README.md
index cdfd1f44..34f7bc47 100644
--- a/examples/multiple_services/README.md
+++ b/examples/multiple_services/README.md
@@ -80,7 +80,7 @@ kind: EtcdCluster
 metadata:
  name: etcd-demo
 spec:
- size: 5
+ size: 3
  version: "3.2.13"
 ```
 
diff --git a/go.mod b/go.mod
index 295a17bc..19d24589 100644
--- a/go.mod
+++ b/go.mod
@@ -9,6 +9,7 @@ require (
 	github.com/go-openapi/spec v0.19.4
 	github.com/google/go-containerregistry v0.0.0-20191218175032-34fb8ff33bed // indirect
 	github.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible
+	github.com/openshift/custom-resource-status v0.0.0-20190822192428-e62f2f3b79f3
 	github.com/operator-backing-service-samples/postgresql-operator v0.0.0-20191023140509-5c3697ed3069
 	github.com/operator-framework/operator-lifecycle-manager v0.0.0-20191115003340-16619cd27fa5
 	github.com/operator-framework/operator-sdk v0.15.2
diff --git a/go.sum b/go.sum
index 29e59c2a..9ff25860 100644
--- a/go.sum
+++ b/go.sum
@@ -568,6 +568,9 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM
 github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runc v1.0.0-rc2.0.20190611121236-6cc515888830/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
 github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
+
+github.com/openshift/custom-resource-status v0.0.0-20190822192428-e62f2f3b79f3 h1:XuAys09+XqT5/FjdR23G/UtbBLII89dFe9XIi73EKIQ=
+github.com/openshift/custom-resource-status v0.0.0-20190822192428-e62f2f3b79f3/go.mod h1:GDjWl0tX6FNIj82vIxeudWeSx2Ff6nDZ8uJn0ohUFvo=
 github.com/opencontainers/selinux v1.2.2/go.mod h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs=
 github.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible h1:6il8W875Oq9vycPkRV5TteLP9IfMEX3lyOl5yN+CtdI=
 github.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY=
@@ -696,6 +699,7 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM
 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
 github.com/storageos/go-api v0.0.0-20180912212459-343b3eff91fc/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
diff --git a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
index b0fbdd72..e8857536 100644
--- a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
+++ b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
@@ -1,6 +1,7 @@
 package v1alpha1
 
 import (
+	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
@@ -48,6 +49,8 @@ type ServiceBindingRequestSpec struct {
 type ServiceBindingRequestStatus struct {
 	// BindingStatus is the status of the service binding request.
 	BindingStatus string `json:"bindingStatus,omitempty"`
+	// Conditions describes the state of the operator's reconciliation functionality.
+	Conditions []conditionsv1.Condition `json:"conditions,omitempty"`
 	// Secret is the name of the intermediate secret
 	Secret string `json:"secret,omitempty"`
 	// ApplicationObjects contains all the application objects filtered by label
diff --git a/pkg/conditions/conditions.go b/pkg/conditions/conditions.go
new file mode 100644
index 00000000..1b989824
--- /dev/null
+++ b/pkg/conditions/conditions.go
@@ -0,0 +1,10 @@
+package conditions
+
+import (
+	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
+)
+
+const (
+	// BindingReady indicates that the binding succeeded
+	BindingReady conditionsv1.ConditionType = "Ready"
+)
diff --git a/pkg/controller/servicebindingrequest/binder.go b/pkg/controller/servicebindingrequest/binder.go
index 3543555d..6f939772 100644
--- a/pkg/controller/servicebindingrequest/binder.go
+++ b/pkg/controller/servicebindingrequest/binder.go
@@ -2,18 +2,19 @@ package servicebindingrequest
 
 import (
 	"context"
+	"errors"
 	"fmt"
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/runtime/schema"
 	"time"
 
 	"gotest.tools/assert/cmp"
 	corev1 "k8s.io/api/core/v1"
-	"k8s.io/apimachinery/pkg/api/errors"
+	k8serror "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-	"k8s.io/apimachinery/pkg/fields"
-	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
 	"k8s.io/client-go/dynamic"
 	"sigs.k8s.io/controller-runtime/pkg/client"
@@ -43,6 +44,8 @@ type Binder struct {
 	logger     *log.Log                        // logger instance
 }
 
+var EmptyApplicationSelectorErr = errors.New("application ResourceRef or MatchLabel not found")
+
 // search objects based in Kind/APIVersion, which contain the labels defined in ApplicationSelector.
 func (b *Binder) search() (*unstructured.UnstructuredList, error) {
 	ns := b.sbr.GetNamespace()
@@ -67,7 +70,7 @@ func (b *Binder) search() (*unstructured.UnstructuredList, error) {
 			LabelSelector: labels.Set(matchLabels).String(),
 		}
 	} else {
-		return nil, fmt.Errorf("application ResourceRef or MatchLabel not found")
+		return nil, EmptyApplicationSelectorErr
 	}
 
 	objList, err := b.dynClient.Resource(gvr).Namespace(ns).List(opts)
@@ -77,7 +80,7 @@ func (b *Binder) search() (*unstructured.UnstructuredList, error) {
 
 	// Return fake NotFound error explicitly to ensure requeue when objList(^) is empty.
 	if len(objList.Items) == 0 {
-		return nil, errors.NewNotFound(
+		return nil, k8serror.NewNotFound(
 			gvr.GroupResource(),
 			b.sbr.Spec.ApplicationSelector.GroupVersionResource.Resource,
 		)
diff --git a/pkg/controller/servicebindingrequest/binding.go b/pkg/controller/servicebindingrequest/binding.go
index 81a7cd75..87d77aac 100644
--- a/pkg/controller/servicebindingrequest/binding.go
+++ b/pkg/controller/servicebindingrequest/binding.go
@@ -5,8 +5,10 @@ import (
 	"errors"
 	"fmt"
 
+	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
 	"gotest.tools/assert/cmp"
-	"k8s.io/apimachinery/pkg/apis/meta/v1"
+	corev1 "k8s.io/api/core/v1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/types"
@@ -15,24 +17,30 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/pkg/conditions"
 	"github.com/redhat-developer/service-binding-operator/pkg/converter"
 	"github.com/redhat-developer/service-binding-operator/pkg/log"
 )
 
 const (
-	// bindingInProgress binding is in progress
-	bindingInProgress = "InProgress"
-	// bindingFail binding has failed
-	bindingFail = "Fail"
+	// BindingSuccess binding has succeeded
+	BindingSuccess = "BindingSuccess"
+	// BindingFail binding has failed
+	BindingFail = "BindingFail"
+	//Finalizer annotation used in finalizer steps
+	Finalizer = "finalizer.servicebindingrequest.openshift.io"
 	// time in seconds to wait before requeuing requests
 	requeueAfter int64 = 45
-	// Finalizer annotation used in finalizer steps
-	Finalizer = "finalizer.servicebindingrequest.openshift.io"
 )
 
 // GroupVersion represents the service binding request resource's group version.
 var GroupVersion = v1alpha1.SchemeGroupVersion.WithResource(ServiceBindingRequestResource)
 
+// message converts the error to string for the Message field in the Status condition
+func (b *ServiceBinder) message(err error) string {
+	return err.Error()
+}
+
 // ServiceBinderOptions is BuildServiceBinder arguments.
 type ServiceBinderOptions struct {
 	Logger                 *log.Log
@@ -60,7 +68,7 @@ type ServiceBinder struct {
 	Logger *log.Log
 	// Objects is a list of additional unstructured objects related to the Service Binding Request.
 	Objects []*unstructured.Unstructured
-	// SBR is the ServiceBindingRequest associated with binding..
+	// SBR is the ServiceBindingRequest associated with binding.
 	SBR *v1alpha1.ServiceBindingRequest
 	// Secret is the Secret associated with the Service Binding Request.
 	Secret *Secret
@@ -68,7 +76,8 @@ type ServiceBinder struct {
 
 // updateServiceBindingRequest execute update API call on a SBR request. It can return errors from
 // this action.
-func (b *ServiceBinder) updateServiceBindingRequest(
+func updateServiceBindingRequest(
+	dynClient dynamic.Interface,
 	sbr *v1alpha1.ServiceBindingRequest,
 ) (*v1alpha1.ServiceBindingRequest, error) {
 	u, err := converter.ToUnstructured(sbr)
@@ -76,10 +85,11 @@ func (b *ServiceBinder) updateServiceBindingRequest(
 		return nil, err
 	}
 
-	u, err = b.DynClient.
+	nsClient := dynClient.
 		Resource(GroupVersion).
-		Namespace(sbr.GetNamespace()).
-		Update(u, v1.UpdateOptions{})
+		Namespace(sbr.GetNamespace())
+
+	u, err = nsClient.Update(u, v1.UpdateOptions{})
 
 	if err != nil {
 		return nil, err
@@ -89,9 +99,18 @@ func (b *ServiceBinder) updateServiceBindingRequest(
 	if err != nil {
 		return nil, err
 	}
+
 	return sbr, nil
 }
 
+// updateServiceBindingRequest execute update API call on a SBR request. It can return errors from
+// this action.
+func (b *ServiceBinder) updateServiceBindingRequest(
+	sbr *v1alpha1.ServiceBindingRequest,
+) (*v1alpha1.ServiceBindingRequest, error) {
+	return updateServiceBindingRequest(b.DynClient, sbr)
+}
+
 // Unbind removes the relationship between a Service Binding Request and its related objects.
 func (b *ServiceBinder) Unbind() (reconcile.Result, error) {
 	logger := b.Logger.WithName("Unbind")
@@ -122,6 +141,35 @@ func (b *ServiceBinder) Unbind() (reconcile.Result, error) {
 	return Done()
 }
 
+// UpdateServiceBindingRequestStatus execute update API call on a SBR Status. It can return errors from
+// this action.
+func updateServiceBindingRequestStatus(
+	dynClient dynamic.Interface,
+	sbr *v1alpha1.ServiceBindingRequest,
+) (*v1alpha1.ServiceBindingRequest, error) {
+	u, err := converter.ToUnstructured(sbr)
+	if err != nil {
+		return nil, err
+	}
+
+	nsClient := dynClient.
+		Resource(GroupVersion).
+		Namespace(sbr.GetNamespace())
+
+	u, err = nsClient.UpdateStatus(u, v1.UpdateOptions{})
+
+	if err != nil {
+		return nil, err
+	}
+
+	err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, sbr)
+	if err != nil {
+		return nil, err
+	}
+
+	return sbr, nil
+}
+
 // updateStatusServiceBindingRequest updates the Service Binding Request's status field.
 func (b *ServiceBinder) updateStatusServiceBindingRequest(
 	sbr *v1alpha1.ServiceBindingRequest,
@@ -138,24 +186,7 @@ func (b *ServiceBinder) updateStatusServiceBindingRequest(
 	// coping status over informed object
 	sbr.Status = *sbrStatus
 
-	// converting object into unstructured
-	u, err := converter.ToUnstructured(sbr)
-	if err != nil {
-		return nil, err
-	}
-
-	gr := v1alpha1.SchemeGroupVersion.WithResource(ServiceBindingRequestResource)
-	resourceClient := b.DynClient.Resource(gr).Namespace(sbr.GetNamespace())
-	u, err = resourceClient.UpdateStatus(u, v1.UpdateOptions{})
-	if err != nil {
-		return nil, err
-	}
-
-	err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, sbr)
-	if err != nil {
-		return nil, err
-	}
-	return sbr, nil
+	return updateServiceBindingRequestStatus(b.DynClient, sbr)
 }
 
 // onError comprise the update of ServiceBindingRequest status to set error flag, and inspect
@@ -166,17 +197,22 @@ func (b *ServiceBinder) onError(
 	sbrStatus *v1alpha1.ServiceBindingRequestStatus,
 	objs []*unstructured.Unstructured,
 ) (reconcile.Result, error) {
-	sbrStatus.BindingStatus = bindingFail
 
 	if objs != nil {
-		sbrStatus.BindingStatus = BindingSuccess
 		b.setApplicationObjects(sbrStatus, objs)
 	}
-
-	_, errStatus := b.updateStatusServiceBindingRequest(sbr, sbrStatus)
+	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+		Type:    conditions.BindingReady,
+		Status:  corev1.ConditionFalse,
+		Reason:  BindingFail,
+		Message: b.message(err),
+	})
+	sbrStatus.BindingStatus = BindingFail
+	newSbr, errStatus := b.updateStatusServiceBindingRequest(sbr, sbrStatus)
 	if errStatus != nil {
 		return RequeueError(errStatus)
 	}
+	b.SBR = newSbr
 
 	return RequeueOnNotFound(err, requeueAfter)
 }
@@ -191,9 +227,6 @@ func (b *ServiceBinder) Bind() (reconcile.Result, error) {
 		b.Logger.Error(err, "On saving secret data..")
 		return b.onError(err, b.SBR, sbrStatus, nil)
 	}
-
-	// update status information
-	sbrStatus.BindingStatus = bindingInProgress
 	sbrStatus.Secret = secretObj.GetName()
 
 	updatedObjects, err := b.Binder.Bind()
@@ -201,9 +234,6 @@ func (b *ServiceBinder) Bind() (reconcile.Result, error) {
 		b.Logger.Error(err, "On binding application.")
 		return b.onError(err, b.SBR, sbrStatus, updatedObjects)
 	}
-
-	// saving on status the list of objects that have been touched
-	sbrStatus.BindingStatus = BindingSuccess
 	b.setApplicationObjects(sbrStatus, updatedObjects)
 
 	// annotating objects related to binding
@@ -213,6 +243,12 @@ func (b *ServiceBinder) Bind() (reconcile.Result, error) {
 		return b.onError(err, b.SBR, sbrStatus, updatedObjects)
 	}
 
+	sbrStatus.BindingStatus = BindingSuccess
+	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+		Type:   conditions.BindingReady,
+		Status: corev1.ConditionTrue,
+	})
+
 	// updating status of request instance
 	sbr, err := b.updateStatusServiceBindingRequest(b.SBR, sbrStatus)
 	if err != nil {
diff --git a/pkg/controller/servicebindingrequest/common.go b/pkg/controller/servicebindingrequest/common.go
index 59842179..1cc9925b 100644
--- a/pkg/controller/servicebindingrequest/common.go
+++ b/pkg/controller/servicebindingrequest/common.go
@@ -27,7 +27,7 @@ func RequeueOnNotFound(err error, requeueAfter int64) (reconcile.Result, error)
 	if errors.IsNotFound(err) {
 		return Requeue(nil, requeueAfter)
 	}
-	return Requeue(err, requeueAfter)
+	return NoRequeue(err)
 }
 
 // RequeueOnConflict in case of conflict error, returning the error with requeue, otherwise Done.
diff --git a/pkg/controller/servicebindingrequest/planner.go b/pkg/controller/servicebindingrequest/planner.go
index 6a4ef392..dd386f7e 100644
--- a/pkg/controller/servicebindingrequest/planner.go
+++ b/pkg/controller/servicebindingrequest/planner.go
@@ -2,6 +2,7 @@ package servicebindingrequest
 
 import (
 	"context"
+	"errors"
 
 	"k8s.io/apimachinery/pkg/api/meta"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -64,6 +65,8 @@ func (p *Planner) searchCRD(gvk schema.GroupVersionKind) (*unstructured.Unstruct
 	return p.client.Resource(CRDGVR).Get(crdName, metav1.GetOptions{})
 }
 
+var EmptyBackingServiceSelectorsErr = errors.New("backing service selectors are empty")
+
 // Plan by retrieving the necessary resources related to binding a service backend.
 func (p *Planner) Plan() (*Plan, error) {
 	ns := p.sbr.GetNamespace()
@@ -72,6 +75,10 @@ func (p *Planner) Plan() (*Plan, error) {
 		selectors = append(selectors, p.sbr.Spec.BackingServiceSelector)
 	}
 
+	if len(selectors) == 0 {
+		return nil, EmptyBackingServiceSelectorsErr
+	}
+
 	relatedResources := make([]*RelatedResource, 0)
 	for _, s := range selectors {
 		bssGVK := schema.GroupVersionKind{Kind: s.Kind, Version: s.Version, Group: s.Group}
diff --git a/pkg/controller/servicebindingrequest/reconciler.go b/pkg/controller/servicebindingrequest/reconciler.go
index 431dd4a5..c6f574dd 100644
--- a/pkg/controller/servicebindingrequest/reconciler.go
+++ b/pkg/controller/servicebindingrequest/reconciler.go
@@ -1,6 +1,9 @@
 package servicebindingrequest
 
 import (
+	v1 "github.com/openshift/custom-resource-status/conditions/v1"
+	"github.com/redhat-developer/service-binding-operator/pkg/conditions"
+	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/apimachinery/pkg/types"
@@ -19,10 +22,6 @@ type Reconciler struct {
 	scheme    *runtime.Scheme   // api scheme
 }
 
-const (
-	BindingSuccess = "Success"
-)
-
 // reconcilerLog local logger instance
 var reconcilerLog = log.NewLog("reconciler")
 
@@ -145,6 +144,26 @@ func (r *Reconciler) Reconcile(request reconcile.Request) (reconcile.Result, err
 	bm, err := BuildServiceBinder(options)
 	if err != nil {
 		logger.Error(err, "Creating binding context")
+		if err == EmptyBackingServiceSelectorsErr || err == EmptyApplicationSelectorErr {
+			// TODO: find or create an error type containing suitable information to be propagated
+			var reason string
+			if err == EmptyBackingServiceSelectorsErr {
+				reason = "EmptyBackingServiceSelectors"
+			} else {
+				reason = "EmptyApplicationSelector"
+			}
+
+			v1.SetStatusCondition(&sbr.Status.Conditions, v1.Condition{
+				Type:    conditions.BindingReady,
+				Status:  corev1.ConditionFalse,
+				Reason:  reason,
+				Message: err.Error(),
+			})
+			_, updateErr := updateServiceBindingRequestStatus(r.dynClient, sbr)
+			if updateErr == nil {
+				return Done()
+			}
+		}
 		return RequeueError(err)
 	}
 
diff --git a/vendor/github.com/openshift/custom-resource-status/LICENSE b/vendor/github.com/openshift/custom-resource-status/LICENSE
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/vendor/github.com/openshift/custom-resource-status/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/vendor/github.com/openshift/custom-resource-status/conditions/v1/_doc.go b/vendor/github.com/openshift/custom-resource-status/conditions/v1/_doc.go
new file mode 100644
index 00000000..b657efea
--- /dev/null
+++ b/vendor/github.com/openshift/custom-resource-status/conditions/v1/_doc.go
@@ -0,0 +1,9 @@
+// +k8s:deepcopy-gen=package,register
+// +k8s:defaulter-gen=TypeMeta
+// +k8s:openapi-gen=true
+
+// Package v1 provides version v1 of the types and functions necessary to
+// manage and inspect a slice of conditions. It is opinionated in the
+// condition types provided but leaves it to the user to define additional
+// types as necessary.
+package v1
diff --git a/vendor/github.com/openshift/custom-resource-status/conditions/v1/conditions.go b/vendor/github.com/openshift/custom-resource-status/conditions/v1/conditions.go
new file mode 100644
index 00000000..d32c48d9
--- /dev/null
+++ b/vendor/github.com/openshift/custom-resource-status/conditions/v1/conditions.go
@@ -0,0 +1,82 @@
+package v1
+
+import (
+	"time"
+
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// SetStatusCondition sets the corresponding condition in conditions to newCondition.
+func SetStatusCondition(conditions *[]Condition, newCondition Condition) {
+	if conditions == nil {
+		conditions = &[]Condition{}
+	}
+	existingCondition := FindStatusCondition(*conditions, newCondition.Type)
+	if existingCondition == nil {
+		newCondition.LastTransitionTime = metav1.NewTime(time.Now())
+		newCondition.LastHeartbeatTime = metav1.NewTime(time.Now())
+		*conditions = append(*conditions, newCondition)
+		return
+	}
+
+	if existingCondition.Status != newCondition.Status {
+		existingCondition.Status = newCondition.Status
+		existingCondition.LastTransitionTime = metav1.NewTime(time.Now())
+	}
+
+	existingCondition.Reason = newCondition.Reason
+	existingCondition.Message = newCondition.Message
+	existingCondition.LastHeartbeatTime = metav1.NewTime(time.Now())
+}
+
+// RemoveStatusCondition removes the corresponding conditionType from conditions.
+func RemoveStatusCondition(conditions *[]Condition, conditionType ConditionType) {
+	if conditions == nil {
+		return
+	}
+	newConditions := []Condition{}
+	for _, condition := range *conditions {
+		if condition.Type != conditionType {
+			newConditions = append(newConditions, condition)
+		}
+	}
+
+	*conditions = newConditions
+}
+
+// FindStatusCondition finds the conditionType in conditions.
+func FindStatusCondition(conditions []Condition, conditionType ConditionType) *Condition {
+	for i := range conditions {
+		if conditions[i].Type == conditionType {
+			return &conditions[i]
+		}
+	}
+
+	return nil
+}
+
+// IsStatusConditionTrue returns true when the conditionType is present and set to `corev1.ConditionTrue`
+func IsStatusConditionTrue(conditions []Condition, conditionType ConditionType) bool {
+	return IsStatusConditionPresentAndEqual(conditions, conditionType, corev1.ConditionTrue)
+}
+
+// IsStatusConditionFalse returns true when the conditionType is present and set to `corev1.ConditionFalse`
+func IsStatusConditionFalse(conditions []Condition, conditionType ConditionType) bool {
+	return IsStatusConditionPresentAndEqual(conditions, conditionType, corev1.ConditionFalse)
+}
+
+// IsStatusConditionUnknown returns true when the conditionType is present and set to `corev1.ConditionUnknown`
+func IsStatusConditionUnknown(conditions []Condition, conditionType ConditionType) bool {
+	return IsStatusConditionPresentAndEqual(conditions, conditionType, corev1.ConditionUnknown)
+}
+
+// IsStatusConditionPresentAndEqual returns true when conditionType is present and equal to status.
+func IsStatusConditionPresentAndEqual(conditions []Condition, conditionType ConditionType, status corev1.ConditionStatus) bool {
+	for _, condition := range conditions {
+		if condition.Type == conditionType {
+			return condition.Status == status
+		}
+	}
+	return false
+}
diff --git a/vendor/github.com/openshift/custom-resource-status/conditions/v1/types.go b/vendor/github.com/openshift/custom-resource-status/conditions/v1/types.go
new file mode 100644
index 00000000..950678fb
--- /dev/null
+++ b/vendor/github.com/openshift/custom-resource-status/conditions/v1/types.go
@@ -0,0 +1,51 @@
+package v1
+
+import (
+	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// Condition represents the state of the operator's
+// reconciliation functionality.
+// +k8s:deepcopy-gen=true
+type Condition struct {
+	Type ConditionType `json:"type" description:"type of condition ie. Available|Progressing|Degraded."`
+
+	Status corev1.ConditionStatus `json:"status" description:"status of the condition, one of True, False, Unknown"`
+
+	// +optional
+	Reason string `json:"reason,omitempty" description:"one-word CamelCase reason for the condition's last transition"`
+
+	// +optional
+	Message string `json:"message,omitempty" description:"human-readable message indicating details about last transition"`
+
+	// +optional
+	LastHeartbeatTime metav1.Time `json:"lastHeartbeatTime" description:"last time we got an update on a given condition"`
+
+	// +optional
+	LastTransitionTime metav1.Time `json:"lastTransitionTime" description:"last time the condition transit from one status to another"`
+}
+
+// ConditionType is the state of the operator's reconciliation functionality.
+type ConditionType string
+
+const (
+	// ConditionAvailable indicates that the resources maintained by the operator,
+	// is functional and available in the cluster.
+	ConditionAvailable ConditionType = "Available"
+
+	// ConditionProgressing indicates that the operator is actively making changes to the resources maintained by the
+	// operator
+	ConditionProgressing ConditionType = "Progressing"
+
+	// ConditionDegraded indicates that the resources maintained by the operator are not functioning completely.
+	// An example of a degraded state would be if not all pods in a deployment were running.
+	// It may still be available, but it is degraded
+	ConditionDegraded ConditionType = "Degraded"
+
+	// ConditionUpgradeable indicates whether the resources maintained by the operator are in a state that is safe to upgrade.
+	// When `False`, the resources maintained by the operator should not be upgraded and the
+	// message field should contain a human readable description of what the administrator should do to
+	// allow the operator to successfully update the resources maintained by the operator.
+	ConditionUpgradeable ConditionType = "Upgradeable"
+)
diff --git a/vendor/github.com/openshift/custom-resource-status/conditions/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/custom-resource-status/conditions/v1/zz_generated.deepcopy.go
new file mode 100644
index 00000000..bbbbf863
--- /dev/null
+++ b/vendor/github.com/openshift/custom-resource-status/conditions/v1/zz_generated.deepcopy.go
@@ -0,0 +1,23 @@
+// +build !ignore_autogenerated
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package v1
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Condition) DeepCopyInto(out *Condition) {
+	*out = *in
+	in.LastHeartbeatTime.DeepCopyInto(&out.LastHeartbeatTime)
+	in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime)
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Condition.
+func (in *Condition) DeepCopy() *Condition {
+	if in == nil {
+		return nil
+	}
+	out := new(Condition)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 83ce6f34..0f05d75e 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -124,6 +124,8 @@ github.com/modern-go/reflect2
 # github.com/openshift/api v3.9.1-0.20190924102528-32369d4db2ad+incompatible
 github.com/openshift/api/apps/v1
 github.com/openshift/api/route/v1
+# github.com/openshift/custom-resource-status v0.0.0-20190822192428-e62f2f3b79f3
+github.com/openshift/custom-resource-status/conditions/v1
 # github.com/operator-backing-service-samples/postgresql-operator v0.0.0-20191023140509-5c3697ed3069
 github.com/operator-backing-service-samples/postgresql-operator/pkg/apis
 github.com/operator-backing-service-samples/postgresql-operator/pkg/apis/postgresql/v1alpha1


Test patch:
diff --git a/pkg/controller/servicebindingrequest/binder_test.go b/pkg/controller/servicebindingrequest/binder_test.go
index e5f517b4..7469c995 100644
--- a/pkg/controller/servicebindingrequest/binder_test.go
+++ b/pkg/controller/servicebindingrequest/binder_test.go
@@ -300,19 +300,11 @@ func TestKnativeServicesContractWithBinder(t *testing.T) {
 
 	require.NotNil(t, binder)
 
-	updatedObjects, err := binder.Bind()
-	require.NoError(t, err)
-	require.Len(t, updatedObjects, 1)
-
-	containersPath := []string{"spec", "template", "spec", "containers"}
-	containers, found, err := unstructured.NestedSlice(updatedObjects[0].Object, containersPath...)
-	require.NoError(t, err)
-	require.True(t, found)
-	require.Len(t, containers, 1)
-
-	c := corev1.Container{}
-	u := containers[0].(map[string]interface{})
-	err = runtime.DefaultUnstructuredConverter.FromUnstructured(u, &c)
-	require.NoError(t, err)
-	require.Equal(t, name, c.EnvFrom[0].SecretRef.Name)
+	t.Run("Knative service contract with service binding operator", func(t *testing.T) {
+		list, err := binder.search()
+		assert.Nil(t, err)
+		assert.Equal(t, 1, len(list.Items))
+
+	})
+
 }
diff --git a/pkg/controller/servicebindingrequest/binding_test.go b/pkg/controller/servicebindingrequest/binding_test.go
index 1f936e32..8affeb5b 100644
--- a/pkg/controller/servicebindingrequest/binding_test.go
+++ b/pkg/controller/servicebindingrequest/binding_test.go
@@ -1,6 +1,9 @@
 package servicebindingrequest
 
 import (
+	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
+	"github.com/redhat-developer/service-binding-operator/pkg/conditions"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	"testing"
 
 	"github.com/stretchr/testify/require"
@@ -26,6 +29,13 @@ func TestServiceBinder_Bind(t *testing.T) {
 		name     string
 	}
 
+	type wantedCondition struct {
+		Type    conditionsv1.ConditionType
+		Status  corev1.ConditionStatus
+		Reason  string
+		Message string
+	}
+
 	// args are the test arguments
 	type args struct {
 		// options inform the test how to build the ServiceBinder.
@@ -34,9 +44,14 @@ func TestServiceBinder_Bind(t *testing.T) {
 		wantBuildErr error
 		// wantErr informs the test an error is wanted at ServiceBinder's bind phase.
 		wantErr error
-		// wantedActions informs the test all the actions that should have been issued by
+		// wantActions informs the test all the actions that should have been issued by
 		// ServiceBinder.
-		wantedActions []wantedAction
+		wantActions []wantedAction
+		// wantConditions informs the test the conditions that should have been issued
+		// by ServiceBinder.
+		wantConditions []wantedCondition
+
+		wantResult *reconcile.Result
 	}
 
 	// assertBind exercises the bind functionality
@@ -55,10 +70,11 @@ func TestServiceBinder_Bind(t *testing.T) {
 			if args.wantErr != nil {
 				require.Error(t, err)
 				require.Equal(t, args.wantErr, err)
-				require.Nil(t, res)
 			} else {
 				require.NoError(t, err)
-				require.NotNil(t, res)
+			}
+			if args.wantResult != nil {
+				require.Equal(t, &args.wantResult, res)
 			}
 
 			// extract actions from the dynamic client, regardless of the bind status; it is expected
@@ -68,11 +84,39 @@ func TestServiceBinder_Bind(t *testing.T) {
 			actions := dynClient.Actions()
 			require.NotNil(t, actions)
 
+			if len(args.wantConditions) > 0 {
+				// proceed to find whether conditions match wanted conditions
+				for _, c := range args.wantConditions {
+					for _, cond := range sb.SBR.Status.Conditions {
+						expected := conditionsv1.Condition{}
+						got := conditionsv1.Condition{}
+						if len(c.Type) > 0 {
+							expected.Type = c.Type
+							got.Type = cond.Type
+						}
+						if len(c.Status) > 0 {
+							expected.Status = c.Status
+							got.Status = cond.Status
+						}
+						if len(c.Reason) > 0 {
+							expected.Reason = c.Reason
+							got.Reason = cond.Reason
+						}
+						if len(c.Message) > 0 {
+							expected.Message = c.Message
+							got.Message = cond.Message
+						}
+
+						require.Equal(t, expected, got)
+					}
+				}
+			}
+
 			// regardless of the result, verify the actions expected by the reconciliation
 			// process have been issued if user has specified wanted actions
-			if len(args.wantedActions) > 0 {
+			if len(args.wantActions) > 0 {
 				// proceed to find whether actions match wanted actions
-				for _, w := range args.wantedActions {
+				for _, w := range args.wantActions {
 					var match bool
 					// search for each wanted action in the slice of actions issued by ServiceBinder
 					for _, a := range actions {
@@ -225,6 +269,57 @@ func TestServiceBinder_Bind(t *testing.T) {
 	}
 	f.AddMockResource(sbrMultipleServices)
 
+	sbrEmptyAppSelector := &v1alpha1.ServiceBindingRequest{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: "apps.openshift.io/v1alpha1",
+			Kind:       "ServiceBindingRequest",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name: "empty-app-selector",
+		},
+		Spec: v1alpha1.ServiceBindingRequestSpec{
+			ApplicationSelector: v1alpha1.ApplicationSelector{},
+			BackingServiceSelectors: []v1alpha1.BackingServiceSelector{
+				{
+					GroupVersionKind: metav1.GroupVersionKind{
+						Group:   db1.GetObjectKind().GroupVersionKind().Group,
+						Version: db1.GetObjectKind().GroupVersionKind().Version,
+						Kind:    db1.GetObjectKind().GroupVersionKind().Kind,
+					},
+					ResourceRef: db1.GetName(),
+				},
+			},
+		},
+		Status: v1alpha1.ServiceBindingRequestStatus{},
+	}
+	f.AddMockResource(sbrEmptyAppSelector)
+
+	sbrEmptyBackingServiceSelector := &v1alpha1.ServiceBindingRequest{
+		TypeMeta: metav1.TypeMeta{
+			APIVersion: "apps.openshift.io/v1alpha1",
+			Kind:       "ServiceBindingRequest",
+		},
+		ObjectMeta: metav1.ObjectMeta{
+			Name: "empty-bss",
+		},
+		Spec: v1alpha1.ServiceBindingRequestSpec{
+			ApplicationSelector: v1alpha1.ApplicationSelector{
+				LabelSelector: &metav1.LabelSelector{
+					MatchLabels: matchLabels,
+				},
+				GroupVersionResource: metav1.GroupVersionResource{
+					Group:    d.GetObjectKind().GroupVersionKind().Group,
+					Version:  d.GetObjectKind().GroupVersionKind().Version,
+					Resource: "deployments",
+				},
+				ResourceRef: d.GetName(),
+			},
+			BackingServiceSelectors: []v1alpha1.BackingServiceSelector{},
+		},
+		Status: v1alpha1.ServiceBindingRequestStatus{},
+	}
+	f.AddMockResource(sbrEmptyBackingServiceSelector)
+
 	logger := log.NewLog("service-binder")
 	t.Run("single bind golden path", assertBind(args{
 		options: &ServiceBinderOptions{
@@ -235,7 +330,13 @@ func TestServiceBinder_Bind(t *testing.T) {
 			SBR:                    sbrSingleService,
 			Client:                 f.FakeClient(),
 		},
-		wantedActions: []wantedAction{
+		wantConditions: []wantedCondition{
+			{
+				Type:   conditions.BindingReady,
+				Status: corev1.ConditionTrue,
+			},
+		},
+		wantActions: []wantedAction{
 			{
 				resource: "servicebindingrequests",
 				verb:     "update",
@@ -263,6 +364,52 @@ func TestServiceBinder_Bind(t *testing.T) {
 			SBR:                    sbrSingleService,
 			Client:                 f.FakeClient(),
 		},
+		wantConditions: []wantedCondition{
+			{
+				Type:   conditions.BindingReady,
+				Status: corev1.ConditionTrue,
+			},
+		},
+	}))
+
+	t.Run("empty applicationSelector", assertBind(args{
+		options: &ServiceBinderOptions{
+			Logger:                 logger,
+			DynClient:              f.FakeDynClient(),
+			DetectBindingResources: true,
+			EnvVarPrefix:           "",
+			SBR:                    sbrEmptyAppSelector,
+			Client:                 f.FakeClient(),
+		},
+		wantErr: EmptyApplicationSelectorErr,
+		wantConditions: []wantedCondition{
+			{
+				Type:    conditions.BindingReady,
+				Status:  corev1.ConditionFalse,
+				Reason:  BindingFail,
+				Message: EmptyApplicationSelectorErr.Error(),
+			},
+		},
+	}))
+
+	t.Run("empty backingServiceSelector", assertBind(args{
+		options: &ServiceBinderOptions{
+			Logger:                 logger,
+			DynClient:              f.FakeDynClient(),
+			DetectBindingResources: true,
+			EnvVarPrefix:           "",
+			SBR:                    sbrEmptyBackingServiceSelector,
+			Client:                 f.FakeClient(),
+		},
+		wantBuildErr: EmptyBackingServiceSelectorsErr,
+		wantConditions: []wantedCondition{
+			{
+				Type:    conditions.BindingReady,
+				Status:  corev1.ConditionFalse,
+				Reason:  BindingFail,
+				Message: EmptyBackingServiceSelectorsErr.Error(),
+			},
+		},
 	}))
 
 	// Missing SBR returns an InvalidOptionsErr
@@ -287,7 +434,13 @@ func TestServiceBinder_Bind(t *testing.T) {
 			SBR:                    sbrMultipleServices,
 			Client:                 f.FakeClient(),
 		},
-		wantedActions: []wantedAction{
+		wantConditions: []wantedCondition{
+			{
+				Type:   conditions.BindingReady,
+				Status: corev1.ConditionTrue,
+			},
+		},
+		wantActions: []wantedAction{
 			{
 				resource: "servicebindingrequests",
 				verb:     "update",
diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go
index e6c81163..58c911e0 100644
--- a/pkg/controller/servicebindingrequest/reconciler_test.go
+++ b/pkg/controller/servicebindingrequest/reconciler_test.go
@@ -89,7 +89,7 @@ func TestApplicationSelectorByName(t *testing.T) {
 		sbrOutput, err := reconciler.getServiceBindingRequest(namespacedName)
 		require.NoError(t, err)
 
-		require.Equal(t, "Success", sbrOutput.Status.BindingStatus)
+		require.Equal(t, BindingSuccess, sbrOutput.Status.BindingStatus)
 		require.Equal(t, 1, len(sbrOutput.Status.ApplicationObjects))
 		expectedStatus := fmt.Sprintf("%s/%s", reconcilerNs, reconcilerName)
 		require.Equal(t, expectedStatus, sbrOutput.Status.ApplicationObjects[0])
@@ -136,7 +136,7 @@ func TestReconcilerReconcileUsingSecret(t *testing.T) {
 		sbrOutput, err := reconciler.getServiceBindingRequest(namespacedName)
 		require.NoError(t, err)
 
-		require.Equal(t, "Success", sbrOutput.Status.BindingStatus)
+		require.Equal(t, "BindingSuccess", sbrOutput.Status.BindingStatus)
 		require.Equal(t, reconcilerName, sbrOutput.Status.Secret)
 
 		require.Equal(t, 1, len(sbrOutput.Status.ApplicationObjects))