Repository: redhat-developer/service-binding-operator
Pull request #851 (2021-01-27 17:32:10)

Use k8s api condition type for status.conditions
Condition type got available in 1.19 API. Hence, we can drop the usage of
github.com/openshift/custom-resource-status library.

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 **pedjak** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @pedjak` 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":["pedjak"]} -->
openshift-ci[bot]: @pedjak: The following test **failed**, say `/retest` to rerun all failed tests:

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

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

<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[bot]: @pedjak: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 233c188169b1c72a35acb4332e33187468fc1625 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1354482842758811648) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 233c188169b1c72a35acb4332e33187468fc1625 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1354482842800754688) | `/test 4.7-acceptance`

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

<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[bot]: @pedjak: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 233c188169b1c72a35acb4332e33187468fc1625 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1354482842758811648) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 9d86788c99444a1fb51ccb26b21f9ffaebffe575 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1354522169052237824) | `/test 4.7-acceptance`

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

<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[bot]: @pedjak: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 9d86788c99444a1fb51ccb26b21f9ffaebffe575 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1354522169052237824) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 9d86788c99444a1fb51ccb26b21f9ffaebffe575 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1354522169027072000) | `/test 4.6-acceptance`

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

<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[bot]: @pedjak: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 9d86788c99444a1fb51ccb26b21f9ffaebffe575 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1354522169027072000) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | efd1bde66d39ff750e07d0b01e98de5bd31bcd6c | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/851/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1354834564849078272) | `/test 4.7-acceptance`

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

<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 -->
pedjak: /retest
codecov[bot]: # [Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/851?src=pr&el=h1) Report
> Merging [#851](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/851?src=pr&el=desc) (efd1bde) into [master](https://codecov.io/gh/redhat-developer/service-binding-operator/commit/9e101177245beeee585b0e8d596538a01d5e7db3?el=desc) (9e10117) will **increase** coverage by `0.35%`.
> The diff coverage is `89.13%`.

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

```diff
@@            Coverage Diff             @@
##           master     #851      +/-   ##
==========================================
+ Coverage   61.11%   61.47%   +0.35%     
==========================================
  Files          25       25              
  Lines        1893     1918      +25     
==========================================
+ Hits         1157     1179      +22     
- Misses        565      568       +3     
  Partials      171      171              
```


| [Impacted Files](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/851?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [controllers/servicebinder.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/851/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvc2VydmljZWJpbmRlci5nbw==) | `64.97% <82.75%> (+1.11%)` | :arrow_up: |
| [controllers/reconciler.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/851/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvcmVjb25jaWxlci5nbw==) | `75.00% <100.00%> (+1.86%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/851?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/851?src=pr&el=footer). Last update [9e10117...efd1bde](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/851?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

akashshinde: /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/851#issuecomment-769692931" title="Approved">akashshinde</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)~~ [akashshinde]

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/api/v1alpha1/servicebinding_types.go b/api/v1alpha1/servicebinding_types.go
index a99c42ea..271c8fc8 100644
--- a/api/v1alpha1/servicebinding_types.go
+++ b/api/v1alpha1/servicebinding_types.go
@@ -17,19 +17,18 @@ limitations under the License.
 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"
 )
 
 const (
 	// BindingReady indicates that the overall sbr succeeded
-	BindingReady conditionsv1.ConditionType = "Ready"
+	BindingReady string = "Ready"
 	// CollectionReady indicates readiness for collection and persistance of intermediate manifests
-	CollectionReady conditionsv1.ConditionType = "CollectionReady"
+	CollectionReady string = "CollectionReady"
 	// InjectionReady indicates readiness to change application manifests to use those intermediate manifests
 	// If status is true, it indicates that the binding succeeded
-	InjectionReady conditionsv1.ConditionType = "InjectionReady"
+	InjectionReady string = "InjectionReady"
 	// EmptyServiceSelectorsReason is used when the ServiceBinding has empty
 	// services.
 	EmptyServiceSelectorsReason = "EmptyServiceSelectors"
@@ -40,6 +39,8 @@ const (
 	ApplicationNotFoundReason = "ApplicationNotFound"
 	// ServiceNotFoundReason is used when the service is not found.
 	ServiceNotFoundReason = "ServiceNotFound"
+
+	BindingInjectedReason = "BindingInjected"
 )
 
 // ServiceBindingSpec defines the desired state of ServiceBinding
@@ -93,7 +94,11 @@ type Mapping struct {
 // +k8s:openapi-gen=true
 type ServiceBindingStatus struct {
 	// Conditions describes the state of the operator's reconciliation functionality.
-	Conditions []conditionsv1.Condition `json:"conditions"`
+	// +patchMergeKey=type
+	// +patchStrategy=merge
+	// +listType=map
+	// +listMapKey=type
+	Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"`
 	// Secret is the name of the intermediate secret
 	Secret string `json:"secret"`
 	// Applications contain all the applications filtered by name or label
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index 52a61d4b..f2a8dc7a 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -21,8 +21,7 @@ limitations under the License.
 package v1alpha1
 
 import (
-	"github.com/openshift/custom-resource-status/conditions/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
 	runtime "k8s.io/apimachinery/pkg/runtime"
 )
 
@@ -32,7 +31,7 @@ func (in *Application) DeepCopyInto(out *Application) {
 	out.LocalObjectReference = in.LocalObjectReference
 	if in.LabelSelector != nil {
 		in, out := &in.LabelSelector, &out.LabelSelector
-		*out = new(metav1.LabelSelector)
+		*out = new(v1.LabelSelector)
 		(*in).DeepCopyInto(*out)
 	}
 	out.GroupVersionResource = in.GroupVersionResource
diff --git a/config/crd/bases/operators.coreos.com_servicebindings.yaml b/config/crd/bases/operators.coreos.com_servicebindings.yaml
index 80633ca7..08ce63cc 100644
--- a/config/crd/bases/operators.coreos.com_servicebindings.yaml
+++ b/config/crd/bases/operators.coreos.com_servicebindings.yaml
@@ -230,35 +230,80 @@ spec:
                 description: Conditions describes the state of the operator's reconciliation
                   functionality.
                 items:
-                  description: Condition represents the state of the operator's reconciliation
-                    functionality.
+                  description: "Condition contains details for one aspect of the current
+                    state of this API Resource. --- This struct is intended for direct
+                    use as an array at the field path .status.conditions.  For example,
+                    type FooStatus struct{     // Represents the observations of a
+                    foo's current state.     // Known .status.conditions.type are:
+                    \"Available\", \"Progressing\", and \"Degraded\"     // +patchMergeKey=type
+                    \    // +patchStrategy=merge     // +listType=map     // +listMapKey=type
+                    \    Conditions []metav1.Condition `json:\"conditions,omitempty\"
+                    patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
+                    \n     // other fields }"
                   properties:
-                    lastHeartbeatTime:
-                      format: date-time
-                      type: string
                     lastTransitionTime:
+                      description: lastTransitionTime is the last time the condition
+                        transitioned from one status to another. This should be when
+                        the underlying condition changed.  If that is not known, then
+                        using the time when the API field changed is acceptable.
                       format: date-time
                       type: string
                     message:
+                      description: message is a human readable message indicating
+                        details about the transition. This may be an empty string.
+                      maxLength: 32768
                       type: string
+                    observedGeneration:
+                      description: observedGeneration represents the .metadata.generation
+                        that the condition was set based upon. For instance, if .metadata.generation
+                        is currently 12, but the .status.conditions[x].observedGeneration
+                        is 9, the condition is out of date with respect to the current
+                        state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
                     reason:
+                      description: reason contains a programmatic identifier indicating
+                        the reason for the condition's last transition. Producers
+                        of specific condition types may define expected values and
+                        meanings for this field, and whether the values are considered
+                        a guaranteed API. The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
                       type: string
                     status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
                       type: string
                     type:
-                      description: ConditionType is the state of the operator's reconciliation
-                        functionality.
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                        --- Many .condition.type values are consistent across resources
+                        like Available, but because arbitrary conditions can be useful
+                        (see .node.status.conditions), the ability to deconflict is
+                        important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
                       type: string
                   required:
+                  - lastTransitionTime
+                  - message
+                  - reason
                   - status
                   - type
                   type: object
                 type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               secret:
                 description: Secret is the name of the intermediate secret
                 type: string
             required:
-            - conditions
             - secret
             type: object
         required:
diff --git a/controllers/reconciler.go b/controllers/reconciler.go
index ac26dd50..087ccbf2 100644
--- a/controllers/reconciler.go
+++ b/controllers/reconciler.go
@@ -3,9 +3,8 @@ package controllers
 import (
 	"context"
 	"errors"
+	"k8s.io/apimachinery/pkg/api/meta"
 
-	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
-	corev1 "k8s.io/api/core/v1"
 	k8serrors "k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
@@ -87,19 +86,21 @@ func (r *ServiceBindingReconciler) doReconcile(request reconcile.Request) (recon
 		_, updateErr := updateServiceBindingStatus(
 			r.dynClient,
 			sbr,
-			conditionsv1.Condition{
+			metav1.Condition{
 				Type:    v1alpha1.CollectionReady,
-				Status:  corev1.ConditionFalse,
+				Status:  metav1.ConditionFalse,
 				Reason:  v1alpha1.EmptyServiceSelectorsReason,
 				Message: errEmptyServices.Error(),
 			},
-			conditionsv1.Condition{
+			metav1.Condition{
 				Type:   v1alpha1.InjectionReady,
-				Status: corev1.ConditionFalse,
+				Reason: v1alpha1.EmptyServiceSelectorsReason,
+				Status: metav1.ConditionFalse,
 			},
-			conditionsv1.Condition{
+			metav1.Condition{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionFalse,
+				Reason: v1alpha1.EmptyServiceSelectorsReason,
+				Status: metav1.ConditionFalse,
 			},
 		)
 		if updateErr == nil {
@@ -125,19 +126,21 @@ func (r *ServiceBindingReconciler) doReconcile(request reconcile.Request) (recon
 		//handle service not found error
 		if k8serrors.IsNotFound(err) {
 			err = updateSBRConditions(r.dynClient, sbr,
-				conditionsv1.Condition{
+				metav1.Condition{
 					Type:    v1alpha1.CollectionReady,
-					Status:  corev1.ConditionFalse,
+					Status:  metav1.ConditionFalse,
 					Reason:  v1alpha1.ServiceNotFoundReason,
 					Message: err.Error(),
 				},
-				conditionsv1.Condition{
+				metav1.Condition{
 					Type:   v1alpha1.InjectionReady,
-					Status: corev1.ConditionFalse,
+					Reason: v1alpha1.ServiceNotFoundReason,
+					Status: metav1.ConditionFalse,
 				},
-				conditionsv1.Condition{
+				metav1.Condition{
 					Type:   v1alpha1.BindingReady,
-					Status: corev1.ConditionFalse,
+					Reason: v1alpha1.ServiceNotFoundReason,
+					Status: metav1.ConditionFalse,
 				},
 			)
 			if err != nil {
@@ -223,9 +226,9 @@ func (r *ServiceBindingReconciler) doReconcile(request reconcile.Request) (recon
 	return sb.bind()
 }
 
-func updateSBRConditions(dynClient dynamic.Interface, sbr *v1alpha1.ServiceBinding, conditions ...conditionsv1.Condition) error {
+func updateSBRConditions(dynClient dynamic.Interface, sbr *v1alpha1.ServiceBinding, conditions ...metav1.Condition) error {
 	for _, v := range conditions {
-		conditionsv1.SetStatusCondition(&sbr.Status.Conditions, v)
+		meta.SetStatusCondition(&sbr.Status.Conditions, v)
 	}
 	u, err := converter.ToUnstructured(sbr)
 	if err != nil {
diff --git a/controllers/servicebinder.go b/controllers/servicebinder.go
index a3d22cdc..c44317ab 100644
--- a/controllers/servicebinder.go
+++ b/controllers/servicebinder.go
@@ -5,12 +5,10 @@ import (
 	"errors"
 	"fmt"
 
-	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
 	"gotest.tools/assert/cmp"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/meta"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/client-go/dynamic"
@@ -112,7 +110,7 @@ func updateServiceBinding(
 		Resource(v1alpha1.GroupVersionResource).
 		Namespace(sbr.GetNamespace())
 
-	u, err = nsClient.Update(context.TODO(), u, v1.UpdateOptions{})
+	u, err = nsClient.Update(context.TODO(), u, metav1.UpdateOptions{})
 
 	if err != nil {
 		return nil, err
@@ -164,10 +162,10 @@ func (b *serviceBinder) unbind() (reconcile.Result, error) {
 func updateServiceBindingStatus(
 	dynClient dynamic.Interface,
 	sbr *v1alpha1.ServiceBinding,
-	conditions ...conditionsv1.Condition,
+	conditions ...metav1.Condition,
 ) (*v1alpha1.ServiceBinding, error) {
 	for _, v := range conditions {
-		conditionsv1.SetStatusCondition(&sbr.Status.Conditions, v)
+		meta.SetStatusCondition(&sbr.Status.Conditions, v)
 	}
 	u, err := converter.ToUnstructured(sbr)
 	if err != nil {
@@ -178,7 +176,7 @@ func updateServiceBindingStatus(
 		Resource(v1alpha1.GroupVersionResource).
 		Namespace(sbr.GetNamespace())
 
-	u, err = nsClient.UpdateStatus(context.TODO(), u, v1.UpdateOptions{})
+	u, err = nsClient.UpdateStatus(context.TODO(), u, metav1.UpdateOptions{})
 
 	if err != nil {
 		return nil, err
@@ -223,15 +221,16 @@ func (b *serviceBinder) onError(
 	if objs != nil {
 		b.setApplicationObjects(sbrStatus, objs)
 	}
-	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+	meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 		Type:    v1alpha1.InjectionReady,
-		Status:  corev1.ConditionFalse,
+		Status:  metav1.ConditionFalse,
 		Reason:  bindingFail,
 		Message: b.message(err),
 	})
-	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+	meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 		Type:   v1alpha1.BindingReady,
-		Status: corev1.ConditionFalse,
+		Reason: bindingFail,
+		Status: metav1.ConditionFalse,
 	})
 	newSbr, errStatus := b.updateStatusServiceBinding(sbr, sbrStatus)
 	if errStatus != nil {
@@ -252,7 +251,7 @@ func isApplicationEmpty(
 		return true
 	}
 	emptyApplication := &v1alpha1.Application{
-		LabelSelector: &v1.LabelSelector{},
+		LabelSelector: &metav1.LabelSelector{},
 	}
 	return application == emptyApplication ||
 		application.Name == "" && application.LabelSelector != nil && application.LabelSelector.MatchLabels == nil
@@ -302,21 +301,23 @@ func (b *serviceBinder) bind() (reconcile.Result, error) {
 	}
 	sbrStatus.Secret = secretObj.GetName()
 
-	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+	meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 		Type:   v1alpha1.CollectionReady,
-		Status: corev1.ConditionTrue,
+		Status: metav1.ConditionTrue,
+		Reason: v1alpha1.BindingInjectedReason,
 	})
 
 	if isApplicationEmpty(b.sbr.Spec.Application) {
-		conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+		meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 			Type:    v1alpha1.InjectionReady,
-			Status:  corev1.ConditionFalse,
+			Status:  metav1.ConditionFalse,
 			Reason:  v1alpha1.EmptyApplicationReason,
 			Message: errEmptyApplication.Error(),
 		})
-		conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+		meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 			Type:   v1alpha1.BindingReady,
-			Status: corev1.ConditionTrue,
+			Reason: v1alpha1.EmptyApplicationReason,
+			Status: metav1.ConditionTrue,
 		})
 		return b.handleApplicationError(errEmptyApplication, sbrStatus)
 	}
@@ -324,15 +325,16 @@ func (b *serviceBinder) bind() (reconcile.Result, error) {
 	if err != nil {
 		b.logger.Error(err, "On binding application.")
 		if errors.Is(err, errApplicationNotFound) {
-			conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+			meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 				Type:    v1alpha1.InjectionReady,
-				Status:  corev1.ConditionFalse,
+				Status:  metav1.ConditionFalse,
 				Reason:  v1alpha1.ApplicationNotFoundReason,
 				Message: errApplicationNotFound.Error(),
 			})
-			conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+			meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionFalse,
+				Reason: v1alpha1.ApplicationNotFoundReason,
+				Status: metav1.ConditionFalse,
 			})
 			return b.handleApplicationError(errApplicationNotFound, sbrStatus)
 		}
@@ -340,13 +342,15 @@ func (b *serviceBinder) bind() (reconcile.Result, error) {
 	}
 	b.setApplicationObjects(sbrStatus, updatedObjects)
 
-	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+	meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 		Type:   v1alpha1.InjectionReady,
-		Status: corev1.ConditionTrue,
+		Reason: v1alpha1.BindingInjectedReason,
+		Status: metav1.ConditionTrue,
 	})
-	conditionsv1.SetStatusCondition(&sbrStatus.Conditions, conditionsv1.Condition{
+	meta.SetStatusCondition(&sbrStatus.Conditions, metav1.Condition{
 		Type:   v1alpha1.BindingReady,
-		Status: corev1.ConditionTrue,
+		Reason: v1alpha1.BindingInjectedReason,
+		Status: metav1.ConditionTrue,
 	})
 
 	// updating status of request instance
@@ -375,7 +379,7 @@ func (b *serviceBinder) setApplicationObjects(
 	boundApps := []v1alpha1.BoundApplication{}
 	for _, obj := range objs {
 		boundApp := v1alpha1.BoundApplication{
-			GroupVersionKind: v1.GroupVersionKind{
+			GroupVersionKind: metav1.GroupVersionKind{
 				Group:   obj.GroupVersionKind().Group,
 				Version: obj.GroupVersionKind().Version,
 				Kind:    obj.GetKind(),
diff --git a/go.mod b/go.mod
index 5bd4e1cd..97fd4d6f 100644
--- a/go.mod
+++ b/go.mod
@@ -10,7 +10,6 @@ require (
 	github.com/mitchellh/copystructure v1.0.0
 	github.com/onsi/ginkgo v1.14.1 // indirect
 	github.com/onsi/gomega v1.10.2 // indirect
-	github.com/openshift/custom-resource-status v0.0.0-20190822192428-e62f2f3b79f3
 	github.com/operator-framework/api v0.3.8
 	github.com/pkg/errors v0.9.1
 	github.com/stretchr/testify v1.6.1
diff --git a/go.sum b/go.sum
index e0905560..7b93239e 100644
--- a/go.sum
+++ b/go.sum
@@ -82,7 +82,6 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
-github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -96,7 +95,6 @@ github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZ
 github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
 github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
 github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
@@ -179,7 +177,6 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM=
 github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
-github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
@@ -214,7 +211,6 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
 github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -228,7 +224,6 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
@@ -258,7 +253,6 @@ github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc=
 github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -310,7 +304,6 @@ github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/f
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
@@ -324,14 +317,12 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn
 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4=
 github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
@@ -339,8 +330,6 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs=
 github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-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/operator-framework/api v0.3.8 h1:tJykTCmwGKZBsPVTCfxbwz6nTF6dzmKydWJtC40erc8=
 github.com/operator-framework/api v0.3.8/go.mod h1:Xbje9x0SHmh0nihE21kpesB38vk3cyxnE6JdDS8Jo1Q=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
@@ -350,7 +339,6 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
@@ -380,7 +368,6 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4
 github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
@@ -411,7 +398,6 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 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=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -463,9 +449,7 @@ golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
@@ -578,7 +562,6 @@ golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -608,9 +591,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0=
 gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
-gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
-gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -659,7 +639,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/imdario/mergo.v0 v0.3.7/go.mod h1:9qPP6AGrlC1G2PTNXko614FwGZvorN7MiBU0Eppok+U=
-gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
@@ -688,7 +667,6 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-k8s.io/api v0.0.0-20190725062911-6607c48751ae/go.mod h1:1O0xzX/RAtnm7l+5VEUxZ1ysO2ghatfq/OZED4zM9kA=
 k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
 k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI=
 k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms=
@@ -697,7 +675,6 @@ k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJ
 k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M=
 k8s.io/apiextensions-apiserver v0.19.2 h1:oG84UwiDsVDu7dlsGQs5GySmQHCzMhknfhFExJMz9tA=
 k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg=
-k8s.io/apimachinery v0.0.0-20190719140911-bfcf53abc9f8/go.mod h1:sBJWIJZfxLhp7mRsRyuAE/NfKTr3kXGR1iaqg8O0gJo=
 k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko=
 k8s.io/apimachinery v0.19.2 h1:5Gy9vQpAGTKHPVOh5c4plE274X8D/6cuEiTO2zve7tc=
@@ -709,7 +686,6 @@ k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
 k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q=
 k8s.io/client-go v0.19.2 h1:gMJuU3xJZs86L1oQ99R4EViAADUPMHHtS9jFshasHSc=
 k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA=
-k8s.io/code-generator v0.0.0-20190717022600-77f3a1fe56bb/go.mod h1:cDx5jQmWH25Ff74daM7NVYty9JWw9dvIS9zT9eIubCY=
 k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
 k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c=
 k8s.io/code-generator v0.19.2 h1:7uaWJll6fyCPj2j3sfNN1AiY2gZU1VFN2dFR2uoxGWI=
@@ -725,13 +701,11 @@ k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14 h1:t4L10Qfx/p7ASH3gXCdIUtPbbIueg
 k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
-k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A=
 k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
-k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4=
 k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
 k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
 k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ=
@@ -740,11 +714,6 @@ k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl
 k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg=
 k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
-modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
-modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
-modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
-modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0=
@@ -753,8 +722,6 @@ sigs.k8s.io/controller-runtime v0.6.4 h1:4013CKsBs5bEqo+LevzDett+LLxag/FjQWG94nV
 sigs.k8s.io/controller-runtime v0.6.4/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY=
 sigs.k8s.io/controller-tools v0.3.0 h1:y3YD99XOyWaXkiF1kd41uRvfp/64teWcrEZFuHxPhJ4=
 sigs.k8s.io/controller-tools v0.3.0/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI=
-sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ=
-sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA=
diff --git a/hack/common.mk b/hack/common.mk
index 24a18150..6422b8cb 100644
--- a/hack/common.mk
+++ b/hack/common.mk
@@ -77,7 +77,7 @@ endif
 
 # Generate code
 generate: controller-gen
-	$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="api/... controllers/..."
+	$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..."
 
 # Download controller-gen locally if necessary
 CONTROLLER_GEN = $(shell pwd)/bin/controller-gen
diff --git a/vendor/github.com/openshift/custom-resource-status/LICENSE b/vendor/github.com/openshift/custom-resource-status/LICENSE
deleted file mode 100644
index 261eeb9e..00000000
--- a/vendor/github.com/openshift/custom-resource-status/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 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
deleted file mode 100644
index b657efea..00000000
--- a/vendor/github.com/openshift/custom-resource-status/conditions/v1/_doc.go
+++ /dev/null
@@ -1,9 +0,0 @@
-// +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
deleted file mode 100644
index d32c48d9..00000000
--- a/vendor/github.com/openshift/custom-resource-status/conditions/v1/conditions.go
+++ /dev/null
@@ -1,82 +0,0 @@
-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
deleted file mode 100644
index 950678fb..00000000
--- a/vendor/github.com/openshift/custom-resource-status/conditions/v1/types.go
+++ /dev/null
@@ -1,51 +0,0 @@
-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
deleted file mode 100644
index bbbbf863..00000000
--- a/vendor/github.com/openshift/custom-resource-status/conditions/v1/zz_generated.deepcopy.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// +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 ab403805..76bb891b 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -82,9 +82,6 @@ github.com/modern-go/reflect2
 ## explicit
 # github.com/onsi/gomega v1.10.2
 ## explicit
-# github.com/openshift/custom-resource-status v0.0.0-20190822192428-e62f2f3b79f3
-## explicit
-github.com/openshift/custom-resource-status/conditions/v1
 # github.com/operator-framework/api v0.3.8
 ## explicit
 github.com/operator-framework/api/pkg/lib/version


Test patch:
diff --git a/controllers/reconciler_test.go b/controllers/reconciler_test.go
index cf09758e..552fafd9 100644
--- a/controllers/reconciler_test.go
+++ b/controllers/reconciler_test.go
@@ -13,7 +13,6 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/meta"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/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/runtime/schema"
@@ -22,8 +21,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
-	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
-
 	"github.com/redhat-developer/service-binding-operator/test/mocks"
 )
 
@@ -52,28 +49,28 @@ func reconcileRequest() reconcile.Request {
 	}
 }
 
-func requireConditionPresentAndTrue(t *testing.T, condition conditionsv1.ConditionType, sbrConditions []conditionsv1.Condition) {
+func requireConditionPresentAndTrue(t *testing.T, conditionType string, sbrConditions []metav1.Condition) {
 	require.True(t,
-		conditionsv1.IsStatusConditionPresentAndEqual(
+		meta.IsStatusConditionPresentAndEqual(
 			sbrConditions,
-			condition,
-			corev1.ConditionTrue,
+			conditionType,
+			metav1.ConditionTrue,
 		),
 		"%+v should exist and be true; existing conditions: %+v",
-		condition,
+		conditionType,
 		sbrConditions,
 	)
 }
 
-func requireConditionPresentAndFalse(t *testing.T, condition conditionsv1.ConditionType, sbrConditions []conditionsv1.Condition) {
+func requireConditionPresentAndFalse(t *testing.T, conditionType string, sbrConditions []metav1.Condition) {
 	require.True(t,
-		conditionsv1.IsStatusConditionPresentAndEqual(
+		meta.IsStatusConditionPresentAndEqual(
 			sbrConditions,
-			condition,
-			corev1.ConditionFalse,
+			conditionType,
+			metav1.ConditionFalse,
 		),
 		"%+v should exist and be false; existing conditions: %+v",
-		condition,
+		conditionType,
 		sbrConditions,
 	)
 }
@@ -139,7 +136,7 @@ func TestApplicationByName(t *testing.T) {
 
 		require.Equal(t, 1, len(sbrOutput.Status.Applications))
 		expectedStatus := v1alpha1.BoundApplication{
-			GroupVersionKind: v1.GroupVersionKind{
+			GroupVersionKind: metav1.GroupVersionKind{
 				Group:   deploymentsGVR.Group,
 				Version: deploymentsGVR.Version,
 				Kind:    "Deployment",
@@ -205,7 +202,7 @@ func TestReconcilerReconcileUsingSecret(t *testing.T) {
 
 		require.Equal(t, 1, len(sbrOutput.Status.Applications))
 		expectedStatus := v1alpha1.BoundApplication{
-			GroupVersionKind: v1.GroupVersionKind{
+			GroupVersionKind: metav1.GroupVersionKind{
 				Group:   deploymentsGVR.Group,
 				Version: deploymentsGVR.Version,
 				Kind:    "Deployment",
@@ -468,7 +465,7 @@ func TestReconcilerReconcileWithConflictingAppSelc(t *testing.T) {
 		require.NoError(t, err)
 
 		expectedStatus := v1alpha1.BoundApplication{
-			GroupVersionKind: v1.GroupVersionKind{
+			GroupVersionKind: metav1.GroupVersionKind{
 				Group:   deploymentsGVR.Group,
 				Version: deploymentsGVR.Version,
 				Kind:    "Deployment",
@@ -580,7 +577,7 @@ func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
 
 		// expected sbr assertion
 		expectedStatus := v1alpha1.BoundApplication{
-			GroupVersionKind: v1.GroupVersionKind{
+			GroupVersionKind: metav1.GroupVersionKind{
 				Group:   deploymentsGVR.Group,
 				Version: deploymentsGVR.Version,
 				Kind:    "Deployment",
@@ -618,7 +615,7 @@ func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
 
 		// expected sbr assertion
 		expectedStatus = v1alpha1.BoundApplication{
-			GroupVersionKind: v1.GroupVersionKind{
+			GroupVersionKind: metav1.GroupVersionKind{
 				Group:   deploymentsGVR.Group,
 				Version: deploymentsGVR.Version,
 				Kind:    "Deployment",
diff --git a/controllers/servicebinder_test.go b/controllers/servicebinder_test.go
index de31e6a9..de7a134e 100644
--- a/controllers/servicebinder_test.go
+++ b/controllers/servicebinder_test.go
@@ -5,7 +5,6 @@ import (
 	"encoding/base64"
 	"testing"
 
-	conditionsv1 "github.com/openshift/custom-resource-status/conditions/v1"
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	"github.com/redhat-developer/service-binding-operator/api/v1alpha1"
@@ -47,8 +46,8 @@ func TestServiceBinder_Bind(t *testing.T) {
 	}
 
 	type wantedCondition struct {
-		Type    conditionsv1.ConditionType
-		Status  corev1.ConditionStatus
+		Type    string
+		Status  metav1.ConditionStatus
 		Reason  string
 		Message string
 	}
@@ -104,10 +103,10 @@ func TestServiceBinder_Bind(t *testing.T) {
 			if len(args.wantConditions) > 0 {
 				// proceed to find whether conditions match wanted conditions
 				for _, c := range args.wantConditions {
-					if c.Status == corev1.ConditionTrue {
+					if c.Status == metav1.ConditionTrue {
 						requireConditionPresentAndTrue(t, c.Type, sb.sbr.Status.Conditions)
 					}
-					if c.Status == corev1.ConditionFalse {
+					if c.Status == metav1.ConditionFalse {
 						requireConditionPresentAndFalse(t, c.Type, sb.sbr.Status.Conditions)
 					}
 				}
@@ -431,15 +430,15 @@ func TestServiceBinder_Bind(t *testing.T) {
 		wantConditions: []wantedCondition{
 			{
 				Type:   v1alpha1.CollectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.InjectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 		},
 		wantActions: []wantedAction{
@@ -477,15 +476,15 @@ func TestServiceBinder_Bind(t *testing.T) {
 		wantConditions: []wantedCondition{
 			{
 				Type:   v1alpha1.CollectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.InjectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 		},
 		wantActions: []wantedAction{
@@ -524,15 +523,15 @@ func TestServiceBinder_Bind(t *testing.T) {
 		wantConditions: []wantedCondition{
 			{
 				Type:   v1alpha1.CollectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.InjectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 		},
 	}))
@@ -551,17 +550,17 @@ func TestServiceBinder_Bind(t *testing.T) {
 		wantConditions: []wantedCondition{
 			{
 				Type:   v1alpha1.CollectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:    v1alpha1.InjectionReady,
-				Status:  corev1.ConditionFalse,
+				Status:  metav1.ConditionFalse,
 				Reason:  v1alpha1.EmptyApplicationReason,
 				Message: errEmptyApplication.Error(),
 			},
 			{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 		},
 	}))
@@ -580,17 +579,17 @@ func TestServiceBinder_Bind(t *testing.T) {
 		wantConditions: []wantedCondition{
 			{
 				Type:   v1alpha1.CollectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:    v1alpha1.InjectionReady,
-				Status:  corev1.ConditionFalse,
+				Status:  metav1.ConditionFalse,
 				Reason:  v1alpha1.ApplicationNotFoundReason,
 				Message: errApplicationNotFound.Error(),
 			},
 			{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionFalse,
+				Status: metav1.ConditionFalse,
 			},
 		},
 	}))
@@ -621,15 +620,15 @@ func TestServiceBinder_Bind(t *testing.T) {
 		wantConditions: []wantedCondition{
 			{
 				Type:   v1alpha1.CollectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.InjectionReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 			{
 				Type:   v1alpha1.BindingReady,
-				Status: corev1.ConditionTrue,
+				Status: metav1.ConditionTrue,
 			},
 		},
 		wantActions: []wantedAction{