Repository: redhat-developer/service-binding-operator
Pull request #60 (2019-07-10 18:19:42)

The display name was "Operator Service Binding Operator" 
One too many "Operator"

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 **sbose78**
You can assign the PR to them by writing `/assign @sbose78` 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":["sbose78"]} -->
openshift-ci-robot: @ldimaggi: The following test **failed**, say `/retest` to rerun them all:

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

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=60). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:ldimaggi). 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: @ldimaggi: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/lint | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-lint/155) | `/test lint`
ci/prow/unit | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-unit/138) | `/test unit`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=60). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:ldimaggi). 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: @ldimaggi: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/lint | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-lint/155) | `/test lint`
ci/prow/unit | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-unit/138) | `/test unit`
ci/prow/e2e-olm-ci | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-e2e-olm-ci/49) | `/test e2e-olm-ci`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=60). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:ldimaggi). 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: @ldimaggi: The following tests **failed**, say `/retest` to rerun them all:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/lint | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-lint/155) | `/test lint`
ci/prow/unit | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-unit/138) | `/test unit`
ci/prow/e2e-olm-ci | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-e2e-olm-ci/49) | `/test e2e-olm-ci`
ci/prow/e2e | 344c80939873083187df35e91cc0316a3a4110dc | [link](https://prow.svc.ci.openshift.org/view/gcs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/60/pull-ci-redhat-developer-service-binding-operator-master-e2e/149) | `/test e2e`

[Full PR test history](https://prow.svc.ci.openshift.org/pr-history?org=redhat-developer&repo=service-binding-operator&pr=60). [Your PR dashboard](https://prow.svc.ci.openshift.org/pr?query=is:pr+state:open+author:ldimaggi). 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 -->
Avni-Sharma: /lgtm

Patch:
diff --git a/Makefile b/Makefile
index 56051c6e..e482da00 100644
--- a/Makefile
+++ b/Makefile
@@ -86,6 +86,10 @@ GO_PACKAGE_ORG_NAME ?= $(shell basename $$(dirname $$PWD))
 GO_PACKAGE_REPO_NAME ?= $(shell basename $$PWD)
 GO_PACKAGE_PATH ?= github.com/${GO_PACKAGE_ORG_NAME}/${GO_PACKAGE_REPO_NAME}
 
+CGO_ENABLED ?= 0
+GO111MODULE ?= on
+GOCACHE ?= "$(shell echo ${PWD})/out/gocache"
+
 GIT_COMMIT_ID = $(shell git rev-parse --short HEAD)
 
 OPERATOR_VERSION ?= 0.0.10
@@ -93,14 +97,16 @@ OPERATOR_GROUP ?= ${GO_PACKAGE_ORG_NAME}
 OPERATOR_IMAGE ?= quay.io/${OPERATOR_GROUP}/${GO_PACKAGE_REPO_NAME}
 OPERATOR_TAG_SHORT ?= $(OPERATOR_VERSION)
 OPERATOR_TAG_LONG ?= $(OPERATOR_VERSION)-$(GIT_COMMIT_ID)
+
 QUAY_TOKEN ?= ""
 
 MANIFESTS_DIR ?= ./manifests
 MANIFESTS_TMP ?= ./tmp/manifests
 
+GOLANGCI_LINT_BIN=./out/golangci-lint
+
 ## -- Static code analysis (lint) targets --
 
-GOLANGCI_LINT_BIN=./out/golangci-lint
 .PHONY: lint
 ## Runs linters on Go code files and YAML files
 lint: setup-venv lint-go-code lint-yaml courier
@@ -117,7 +123,7 @@ lint-yaml: ${YAML_FILES}
 lint-go-code: $(GOLANGCI_LINT_BIN)
 	# This is required for OpenShift CI enviroment
 	# Ref: https://github.com/openshift/release/pull/3438#issuecomment-482053250
-	$(Q)GOCACHE=$(shell pwd)/out/gocache ./out/golangci-lint ${V_FLAG} run --deadline=30m
+	$(Q)GOCACHE=$(GOCACHE) ./out/golangci-lint ${V_FLAG} run --deadline=30m
 
 $(GOLANGCI_LINT_BIN):
 	$(Q)curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./out v1.17.1
@@ -150,48 +156,67 @@ get-test-namespace: out/test-namespace
 .PHONY: e2e-setup
 e2e-setup: e2e-cleanup
 	$(Q)kubectl create namespace $(TEST_NAMESPACE)
+	$(Q)kubectl --namespace $(TEST_NAMESPACE) apply -f ./test/third-party-crds/postgresql_v1alpha1_database_crd.yaml
 
 .PHONY: e2e-cleanup
 e2e-cleanup: get-test-namespace
-	$(Q)-kubectl delete namespace $(TEST_NAMESPACE) --timeout=10s --wait
+	$(Q)-kubectl delete namespace $(TEST_NAMESPACE) --timeout=45s --wait
 
 .PHONY: test-e2e
 ## Runs the e2e tests locally from test/e2e dir
 test-e2e: e2e-setup
 	$(info Running E2E test: $@)
-	$(Q)GO111MODULE=on operator-sdk test local ./test/e2e --namespace $(TEST_NAMESPACE) --up-local --go-test-flags "-v -timeout=15m"
+	$(Q)GO111MODULE=$(GO111MODULE) GOCACHE=$(GOCACHE) SERVICE_BINDING_OPERATOR_DISABLE_ELECTION=true \
+		operator-sdk --verbose test local ./test/e2e \
+			--debug \
+			--namespace $(TEST_NAMESPACE) \
+			--up-local \
+			--go-test-flags "-timeout=15m"
 
 .PHONY: test-unit
 ## Runs the unit tests
 test-unit:
 	$(info Running unit test: $@)
-	$(Q)GO111MODULE=on GOCACHE=$(shell pwd)/out/gocache go test $(shell GOCACHE=$(shell pwd)/out/gocache go list ./...|grep -v e2e) -v -mod vendor $(TEST_EXTRA_ARGS)
+	$(Q)GO111MODULE=$(GO111MODULE) GOCACHE=$(GOCACHE) \
+		go test $(shell GOCACHE="$(GOCACHE)" go list ./...|grep -v e2e) -v -mod vendor $(TEST_EXTRA_ARGS)
+
+.PHONY: test
+## Test: Runs unit and integration (e2e) tests
+test: test-unit test-e2e
 
 .PHONY: test-e2e-olm-ci
+## OLM-E2E: Adds the operator as a subscription, and run e2e tests without any setup.
 test-e2e-olm-ci:
-	$(Q)sed -e "s,REPLACE_IMAGE,registry.svc.ci.openshift.org/${OPENSHIFT_BUILD_NAMESPACE}/stable:service-binding-operator-registry," ./test/e2e/catalog_source.yaml | kubectl apply -f -
-	$(Q)kubectl apply -f ./test/e2e/subscription.yaml
+	$(Q)sed -e "s,REPLACE_IMAGE,registry.svc.ci.openshift.org/${OPENSHIFT_BUILD_NAMESPACE}/stable:service-binding-operator-registry," ./test/operator-hub/catalog_source.yaml | kubectl apply -f -
+	$(Q)kubectl apply -f ./test/operator-hub/subscription.yaml
 	$(eval DEPLOYED_NAMESPACE := openshift-operators)
 	$(Q)./hack/check-crds.sh
-	$(Q)operator-sdk test local ./test/e2e --no-setup --go-test-flags "-v -timeout=15m"
+	$(Q)operator-sdk --verbose test local ./test/e2e --no-setup --go-test-flags "-timeout=15m"
 
 ## -- Build Go binary and OCI image targets --
 
-.PHONY: build 
+.PHONY: build
 ## Build: compile the operator for Linux/AMD64.
 build: out/operator
 
 out/operator:
-	$(Q)CGO_ENABLED=0 GO111MODULE=on GOARCH=amd64 GOOS=linux go build ${V_FLAG} -o ./out/operator cmd/manager/main.go
+	$(Q)GOARCH=amd64 GOOS=linux go build ${V_FLAG} -o ./out/operator cmd/manager/main.go
 
 ## Build-Image: using operator-sdk to build a new image
 build-image:
-	$(Q)GO111MODULE=on operator-sdk build "$(OPERATOR_IMAGE):$(OPERATOR_TAG_LONG)"
+	$(Q)operator-sdk build "$(OPERATOR_IMAGE):$(OPERATOR_TAG_LONG)"
 
+## Generate-K8S: after modifying _types, generate Kubernetes scaffolding.
+generate-k8s:
+	$(Q)GOCACHE=$(GOCACHE) operator-sdk generate k8s
+
+## Generate-OpenAPI: after modifying _types, generate OpenAPI scaffolding.
+generate-openapi:
+	$(Q)GOCACHE=$(GOCACHE) operator-sdk generate openapi
 
 ## Vendor: 'go mod vendor' resets the vendor folder to what is defined in go.mod.
 vendor: go.mod go.sum
-	$(Q)GOCACHE=$(shell pwd)/out/gocache GO111MODULE=on go mod vendor ${V_FLAG}
+	$(Q)GOCACHE=$(GOCACHE) go mod vendor ${V_FLAG}
 
 ## Generate CSV: using oeprator-sdk generate cluster-service-version for current operator version
 generate-csv:
@@ -228,29 +253,29 @@ push-image: build-image
 ## -- Local deployment targets --
 
 .PHONY: local
-## Run operator locally
+## Local: Run operator locally
 local: deploy-clean deploy-rbac deploy-crds deploy-cr
 	$(Q)operator-sdk up local
 
 .PHONY: deploy-rbac
-## Setup service account and deploy RBAC
+## Deploy-RBAC: Setup service account and deploy RBAC
 deploy-rbac:
 	$(Q)kubectl create -f deploy/service_account.yaml
 	$(Q)kubectl create -f deploy/role.yaml
 	$(Q)kubectl create -f deploy/role_binding.yaml
 
 .PHONY: deploy-crds
-## Deploy CRD
+## Deploy-CRD: Deploy CRD
 deploy-crds:
 	$(Q)kubectl create -f deploy/crds/apps_v1alpha1_servicebindingrequest_crd.yaml
 
 .PHONY: deploy-cr
-## Deploy CRs
+## Deploy-CR: Deploy CRs
 deploy-cr:
 	$(Q)kubectl apply -f deploy/crds/apps_v1alpha1_servicebindingrequest_cr.yaml
 
 .PHONY: deploy-clean
-## Removing CRDs and CRs
+## Deploy-Clean: Removing CRDs and CRs
 deploy-clean:
 	$(Q)-kubectl delete -f deploy/crds/apps_v1alpha1_servicebindingrequest_cr.yaml
 	$(Q)-kubectl delete -f deploy/crds/apps_v1alpha1_servicebindingrequest_crd.yaml
@@ -259,6 +284,10 @@ deploy-clean:
 	$(Q)-kubectl delete -f deploy/role.yaml
 	$(Q)-kubectl delete -f deploy/service_account.yaml
 
+.PHONY: deploy
+## Deploy:
+deploy: deploy-rbac deploy-crds
+
 
 ## -- Cleanup targets --
 
diff --git a/cmd/manager/main.go b/cmd/manager/main.go
index 8d142230..a0818e2a 100644
--- a/cmd/manager/main.go
+++ b/cmd/manager/main.go
@@ -8,7 +8,7 @@ import (
 	"runtime"
 
 	// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.
-	_ "k8s.io/client-go/plugin/pkg/client/auth"
+	osappsv1 "github.com/openshift/api/apps/v1"
 	"github.com/operator-framework/operator-sdk/pkg/k8sutil"
 	"github.com/operator-framework/operator-sdk/pkg/leader"
 	"github.com/operator-framework/operator-sdk/pkg/log/zap"
@@ -16,11 +16,11 @@ import (
 	"github.com/operator-framework/operator-sdk/pkg/restmapper"
 	sdkVersion "github.com/operator-framework/operator-sdk/version"
 	"github.com/spf13/pflag"
+	_ "k8s.io/client-go/plugin/pkg/client/auth"
 	"sigs.k8s.io/controller-runtime/pkg/client/config"
 	"sigs.k8s.io/controller-runtime/pkg/manager"
 	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
 	"sigs.k8s.io/controller-runtime/pkg/runtime/signals"
-	osappsv1 "github.com/openshift/api/apps/v1"
 
 	"github.com/redhat-developer/service-binding-operator/pkg/apis"
 	"github.com/redhat-developer/service-binding-operator/pkg/controller"
@@ -39,25 +39,25 @@ func printVersion() {
 	log.Info(fmt.Sprintf("Version of operator-sdk: %v", sdkVersion.Version))
 }
 
+// getOperatorName based on environment variable OPERATOR_NAME, or returns the default name for
+// the operatator.
+func getOperatorName() string {
+	envName := os.Getenv("OPERATOR_NAME")
+	if envName != "" {
+		return envName
+	}
+	return "service-binding-operator"
+}
+
+// isLeaderElectionEnabled based on environment variable SERVICE_BINDING_OPERATOR_DISABLE_ELECTION.
+func isLeaderElectionEnabled() bool {
+	return os.Getenv("SERVICE_BINDING_OPERATOR_DISABLE_ELECTION") == ""
+}
+
 func main() {
-	// Add the zap logger flag set to the CLI. The flag set must
-	// be added before calling pflag.Parse().
 	pflag.CommandLine.AddFlagSet(zap.FlagSet())
-
-	// Add flags registered by imported packages (e.g. glog and
-	// controller-runtime)
 	pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
-
 	pflag.Parse()
-
-	// Use a zap logr.Logger implementation. If none of the zap
-	// flags are configured (or if the zap flag set is not being
-	// used), this defaults to a production zap logger.
-	//
-	// The logger instantiated here can be changed to any logger
-	// implementing the logr.Logger interface. This logger will
-	// be propagated through the whole operator, generating
-	// uniform and structured logs.
 	logf.SetLogger(zap.Logger())
 
 	printVersion()
@@ -71,17 +71,22 @@ func main() {
 	// Get a config to talk to the apiserver
 	cfg, err := config.GetConfig()
 	if err != nil {
-		log.Error(err, "")
+		log.Error(err, "Failed to acquire a configuration to talk to the API server")
 		os.Exit(1)
 	}
 
 	ctx := context.TODO()
 
-	// Become the leader before proceeding
-	err = leader.Become(ctx, "service-binding-operator-lock")
-	if err != nil {
-		log.Error(err, "")
-		os.Exit(1)
+	// FIXME: is there a way to tell k8s-client that is not running in-cluster?
+	if isLeaderElectionEnabled() {
+		// Become the leader before proceeding
+		err = leader.Become(ctx, fmt.Sprintf("%s-lock", getOperatorName()))
+		if err != nil {
+			log.Error(err, "Failed to become the leader")
+			os.Exit(1)
+		}
+	} else {
+		log.Info("Warning: Leader election is disabled")
 	}
 
 	// Create a new Cmd to provide shared dependencies and start components
@@ -91,7 +96,7 @@ func main() {
 		MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort),
 	})
 	if err != nil {
-		log.Error(err, "")
+		log.Error(err, "Error on creating a new manager instance")
 		os.Exit(1)
 	}
 
@@ -99,18 +104,18 @@ func main() {
 
 	// Setup Scheme for all resources
 	if err := apis.AddToScheme(mgr.GetScheme()); err != nil {
-		log.Error(err, "Error adding local operator scheme!")
+		log.Error(err, "Error adding local operator scheme")
 		os.Exit(1)
 	}
 
 	if err := osappsv1.AddToScheme(mgr.GetScheme()); err != nil {
-		log.Error(err, "Error on adding OS APIs to scheme!")
+		log.Error(err, "Error on adding OS APIs to scheme")
 		os.Exit(1)
 	}
 
 	// Setup all Controllers
 	if err := controller.AddToManager(mgr); err != nil {
-		log.Error(err, "")
+		log.Error(err, "Failed to setup the controller manager")
 		os.Exit(1)
 	}
 
diff --git a/deploy/crds/apps_v1alpha1_servicebindingrequest_cr.yaml b/deploy/crds/apps_v1alpha1_servicebindingrequest_cr.yaml
index df04b89f..6a2d62fe 100644
--- a/deploy/crds/apps_v1alpha1_servicebindingrequest_cr.yaml
+++ b/deploy/crds/apps_v1alpha1_servicebindingrequest_cr.yaml
@@ -1,12 +1,13 @@
+---
 apiVersion: apps.openshift.io/v1alpha1
 kind: ServiceBindingRequest
 metadata:
   name: example-servicebindingrequest
 spec:
   backingServiceSelector:
-    resourceKind: database.example.org
+    resourceRef: pg-instance
+    resourceName: database.example.org
     resourceVersion: v1alpha1
-    resourceRef: mysqldb
   applicationSelector:
     matchLabels:
       connects-to: postgres
diff --git a/deploy/crds/apps_v1alpha1_servicebindingrequest_crd.yaml b/deploy/crds/apps_v1alpha1_servicebindingrequest_crd.yaml
index 5e49d311..055151e6 100644
--- a/deploy/crds/apps_v1alpha1_servicebindingrequest_crd.yaml
+++ b/deploy/crds/apps_v1alpha1_servicebindingrequest_crd.yaml
@@ -34,7 +34,7 @@ spec:
                 connecting to the backing service operator. Example 1: \tapplicationSelector:
                 \t\tmatchLabels: \t\t\tconnects-to: postgres \t\t\tenvironment: stage
                 \t\tresourceKind: Deployment Example 2: \tapplicationSelector: \t\tresourceKind:
-                Deployment \t\tresourceType: my-app"
+                Deployment \t\tresourceName: my-app"
               properties:
                 matchLabels:
                   additionalProperties:
@@ -54,18 +54,18 @@ spec:
                 MySQL or CouchDB), messaging/queueing systems (such as RabbitMQ or
                 Beanstalkd), SMTP services for outbound email (such as Postfix), and
                 caching systems (such as Memcached).  Example 1: \tbackingServiceSelector:
-                \t\tresourceType: database.example.org      resourceRef: mysql-database
-                Example 2: \tbackingServiceSelector: \t\tresourceType: database.example.org
+                \t\tresourceName: database.example.org      resourceRef: mysql-database
+                Example 2: \tbackingServiceSelector: \t\tresourceName: database.example.org
                 \t\tresourceVersion: v1alpha1      resourceRef: mysql-database"
               properties:
-                resourceKind:
+                resourceName:
                   type: string
                 resourceRef:
                   type: string
                 resourceVersion:
                   type: string
               required:
-              - resourceKind
+              - resourceName
               - resourceVersion
               - resourceRef
               type: object
diff --git a/hack/check-crds.sh b/hack/check-crds.sh
index 82aaff52..b739f1ac 100755
--- a/hack/check-crds.sh
+++ b/hack/check-crds.sh
@@ -1,18 +1,26 @@
 #!/bin/bash
-function check_crds() {
-	local crd_name=$1
-	for i in {1..120}
-	do
-		kubectl get crds | grep $crd_name
-		if [ $? == 0 ]
-		then
-			echo "CRD exists: " $crd_name
-			return 0
-		fi
-		sleep 10s
-	done
-	echo "CRD doesn't exist: " $crd_name
-	exit 1
+
+function check_crds () {
+    local crd_name="$1"
+
+    for i in  {1..120} ; do
+        if ( kubectl get crds |grep ${crd_name} 2>&1 > /dev/null ) ; then
+            return 0
+        fi
+
+        sleep 3
+    done
+
+    return 1
 }
 
-check_crds servicebindingrequests.apps.openshift.io
+CRD_NAME="servicebindingrequests.apps.openshift.io"
+
+echo "# Searching for '${CRD_NAME}'..."
+
+if ! check_crds ${CRD_NAME} ; then
+    echo "CRD doesn't exist: ${crd_name}"
+    exit 1
+fi
+
+echo "CRD is found: ${crd_name}"
diff --git a/manifests/service-binding-operator.package.yaml b/manifests/service-binding-operator.package.yaml
index f66efe51..db4efd8d 100644
--- a/manifests/service-binding-operator.package.yaml
+++ b/manifests/service-binding-operator.package.yaml
@@ -2,6 +2,6 @@ packageName: service-binding-operator
 channels:
 - name: dev
   currentCSV: service-binding-operator.v0.0.10
-- name: stable 
+- name: stable
   currentCSV: service-binding-operator.v0.0.10
 defaultChannel: dev
diff --git a/manifests/service-binding-operator.v0.0.10.clusterserviceversion.yaml b/manifests/service-binding-operator.v0.0.10.clusterserviceversion.yaml
index 58344b4e..cdfc3a49 100644
--- a/manifests/service-binding-operator.v0.0.10.clusterserviceversion.yaml
+++ b/manifests/service-binding-operator.v0.0.10.clusterserviceversion.yaml
@@ -2,7 +2,7 @@ apiVersion: operators.coreos.com/v1alpha1
 kind: ClusterServiceVersion
 metadata:
   annotations:
-    alm-examples: '[{"apiVersion":"apps.openshift.io/v1alpha1","kind":"ServiceBindingRequest","metadata":{"name":"example-servicebindingrequest"},"spec":{"applicationSelector":{"matchLabels":{"connects-to":"postgres","environment":"production"},"resourceKind":"Deployment"},"backingSelector":{"resourceName":"database.example.org","resourceVersion":"v1alpha1"}}}]'
+    alm-examples: '[{"apiVersion":"apps.openshift.io/v1alpha1","kind":"ServiceBindingRequest","metadata":{"name":"example-servicebindingrequest"},"spec":{"applicationSelector":{"matchLabels":{"connects-to":"postgres","environment":"production"},"resourceKind":"Deployment"},"backingServiceSelector":{"resourceName":"database.example.org","resourceVersion":"v1alpha1"}}}]'
     capabilities: Basic Install
     containerImage: quay.io/redhat-developer/app-binding-operator:v0.0.10
     description: An operator to support binding capabilities between imported apps and operator backed services
@@ -24,7 +24,7 @@ spec:
       displayName: ServiceBindingRequest
       description: Expresses intent to bind an operator-backed service with an Deployment.
   description: Placeholder description
-  displayName: Operator Service Binding Operator
+  displayName: Service Binding Operator
   install:
     spec:
       deployments:
@@ -122,4 +122,4 @@ spec:
   maturity: alpha
   provider:
     name: Red Hat, Inc.
-  version: 0.0.10
\ No newline at end of file
+  version: 0.0.10
diff --git a/openshift-ci/Dockerfile.registry.build b/openshift-ci/Dockerfile.registry.build
index 970c3ffb..d65d5c97 100644
--- a/openshift-ci/Dockerfile.registry.build
+++ b/openshift-ci/Dockerfile.registry.build
@@ -1,12 +1,13 @@
 FROM quay.io/openshift/origin-operator-registry:latest
 
 ARG version=0.0.10
-
-COPY manifests manifests
+RUN mkdir -p manifests/service-binding-operator/${version}
+COPY manifests/service-binding-operator.package.yaml manifests/service-binding-operator/
+COPY manifests/service-binding-operator*.crd.yaml manifests/service-binding-operator/${version}/
+COPY manifests/service-binding-operator*.clusterserviceversion.yaml manifests/service-binding-operator/${version}/
 
 USER root
-RUN rm manifests/*.package.yaml
-RUN sed -e "s,quay.io/redhat-developer/app-binding-operator,registry.svc.ci.openshift.org/${OPENSHIFT_BUILD_NAMESPACE}/stable:service-binding-operator," -i manifests/service-binding-operator.v${version}.clusterserviceversion.yaml
+RUN sed -e "s,quay.io/redhat-developer/app-binding-operator:v${version},registry.svc.ci.openshift.org/${OPENSHIFT_BUILD_NAMESPACE}/stable:service-binding-operator," -i manifests/service-binding-operator/${version}/service-binding-operator.v${version}.clusterserviceversion.yaml
 RUN initializer
 
 USER 1001
diff --git a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
index 7de3f487..66ba584a 100644
--- a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
+++ b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go
@@ -4,13 +4,14 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.
+// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file
 
 // ServiceBindingRequestSpec defines the desired state of ServiceBindingRequest
 // +k8s:openapi-gen=true
 type ServiceBindingRequestSpec struct {
 	// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file
-	// Add custom validation using kubebuilder tags: https://book.kubebuilder.io/beyond_basics/generating_crd.html
+	// Add custom validation using kubebuilder tags:
+	// 	https://book.kubebuilder.io/beyond_basics/generating_crd.html
 
 	// BackingServiceSelector is used to identify the backing service operator.
 	//
@@ -23,13 +24,13 @@ type ServiceBindingRequestSpec struct {
 	//
 	// Example 1:
 	//	backingServiceSelector:
-	//		resourceKind: database.example.org
-	//      	resourceRef: mysql-database
+	//		resourceName: database.example.org
+	//      resourceRef: mysql-database
 	// Example 2:
 	//	backingServiceSelector:
-	//		resourceKind: database.example.org
+	//		resourceName: database.example.org
 	//		resourceVersion: v1alpha1
-	//      	resourceRef: mysql-database
+	//      resourceRef: mysql-database
 	BackingServiceSelector BackingServiceSelector `json:"backingServiceSelector"`
 
 	// ApplicationSelector is used to identify the application connecting to the
@@ -41,20 +42,18 @@ type ServiceBindingRequestSpec struct {
 	//			environment: stage
 	//		resourceKind: Deployment
 	// Example 2:
-	// (By default resourceKind is Deployment)
 	//	applicationSelector:
-	//		matchLabels:
-	//			connects-to: postgres
-	//			environment: stage
+	//		resourceKind: Deployment
+	//		resourceName: my-app
 	ApplicationSelector ApplicationSelector `json:"applicationSelector"`
 }
 
 // BackingServiceSelector defines the selector based on resource name, version, and resource kind
 // +k8s:openapi-gen=true
 type BackingServiceSelector struct {
-	ResourceKind    string `json:"resourceKind"`
+	ResourceName    string `json:"resourceName"`
 	ResourceVersion string `json:"resourceVersion"`
-	ResourceRef      string `json:"resourceRef"`
+	ResourceRef     string `json:"resourceRef"`
 }
 
 // ApplicationSelector defines the selector based on labels and resource kind
@@ -66,10 +65,7 @@ type ApplicationSelector struct {
 
 // ServiceBindingRequestStatus defines the observed state of ServiceBindingRequest
 // +k8s:openapi-gen=true
-type ServiceBindingRequestStatus struct {
-	// Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file
-	// Add custom validation using kubebuilder tags: https://book.kubebuilder.io/beyond_basics/generating_crd.html
-}
+type ServiceBindingRequestStatus struct{}
 
 // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 
diff --git a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go
index 50b604ec..4f43ef39 100644
--- a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go
+++ b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go
@@ -60,7 +60,7 @@ func schema_pkg_apis_apps_v1alpha1_BackingServiceSelector(ref common.ReferenceCa
 			SchemaProps: spec.SchemaProps{
 				Description: "BackingServiceSelector defines the selector based on resource name, version, and resource kind",
 				Properties: map[string]spec.Schema{
-					"resourceKind": {
+					"resourceName": {
 						SchemaProps: spec.SchemaProps{
 							Type:   []string{"string"},
 							Format: "",
@@ -79,7 +79,7 @@ func schema_pkg_apis_apps_v1alpha1_BackingServiceSelector(ref common.ReferenceCa
 						},
 					},
 				},
-				Required: []string{"resourceKind", "resourceVersion", "resourceRef"},
+				Required: []string{"resourceName", "resourceVersion", "resourceRef"},
 			},
 		},
 		Dependencies: []string{},
@@ -137,13 +137,13 @@ func schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestSpec(ref common.Referenc
 				Properties: map[string]spec.Schema{
 					"backingServiceSelector": {
 						SchemaProps: spec.SchemaProps{
-							Description: "BackingServiceSelector is used to identify the backing service operator.\n\nRefer: https://12factor.net/backing-services A backing service is any service the app consumes over the network as part of its normal operation. Examples include datastores (such as MySQL or CouchDB), messaging/queueing systems (such as RabbitMQ or Beanstalkd), SMTP services for outbound email (such as Postfix), and caching systems (such as Memcached).\n\nExample 1:\n\tbackingServiceSelector:\n\t\tresourceType: database.example.org\n     resourceRef: mysql-database\nExample 2:\n\tbackingServiceSelector:\n\t\tresourceType: database.example.org\n\t\tresourceVersion: v1alpha1\n     resourceRef: mysql-database",
+							Description: "BackingServiceSelector is used to identify the backing service operator.\n\nRefer: https://12factor.net/backing-services A backing service is any service the app consumes over the network as part of its normal operation. Examples include datastores (such as MySQL or CouchDB), messaging/queueing systems (such as RabbitMQ or Beanstalkd), SMTP services for outbound email (such as Postfix), and caching systems (such as Memcached).\n\nExample 1:\n\tbackingServiceSelector:\n\t\tresourceName: database.example.org\n     resourceRef: mysql-database\nExample 2:\n\tbackingServiceSelector:\n\t\tresourceName: database.example.org\n\t\tresourceVersion: v1alpha1\n     resourceRef: mysql-database",
 							Ref:         ref("github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.BackingServiceSelector"),
 						},
 					},
 					"applicationSelector": {
 						SchemaProps: spec.SchemaProps{
-							Description: "ApplicationSelector is used to identify the application connecting to the backing service operator. Example 1:\n\tapplicationSelector:\n\t\tmatchLabels:\n\t\t\tconnects-to: postgres\n\t\t\tenvironment: stage\n\t\tresourceKind: Deployment\nExample 2:\n\tapplicationSelector:\n\t\tresourceKind: Deployment\n\t\tresourceType: my-app",
+							Description: "ApplicationSelector is used to identify the application connecting to the backing service operator. Example 1:\n\tapplicationSelector:\n\t\tmatchLabels:\n\t\t\tconnects-to: postgres\n\t\t\tenvironment: stage\n\t\tresourceKind: Deployment\nExample 2:\n\tapplicationSelector:\n\t\tresourceKind: Deployment\n\t\tresourceName: my-app",
 							Ref:         ref("github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ApplicationSelector"),
 						},
 					},
diff --git a/pkg/controller/servicebindingrequest/planner.go b/pkg/controller/servicebindingrequest/planner.go
index 1031bc5f..b3a59790 100644
--- a/pkg/controller/servicebindingrequest/planner.go
+++ b/pkg/controller/servicebindingrequest/planner.go
@@ -8,9 +8,9 @@ import (
 	"github.com/go-logr/logr"
 	olmv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
 	extv1beta1 "k8s.io/api/extensions/v1beta1"
-	apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
 	"k8s.io/apimachinery/pkg/api/errors"
 	ustrv1 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
 
@@ -32,32 +32,20 @@ type Plan struct {
 	Ns             string                      // namespace name
 	Name           string                      // plan name, same than ServiceBindingRequest
 	CRDDescription *olmv1alpha1.CRDDescription // custom resource definition description
-	CRD            *ustrv1.Unstructured        // custom resource definition
-}
-
-const (
-	connectsToLabel = "connects-to"
-)
-
-// extractConnectTo inspect ServiceBindingRequest to extract connects-to value.
-func (p *Planner) extractConnectsTo() string {
-	value, exists := p.sbr.Spec.ApplicationSelector.MatchLabels[connectsToLabel]
-	if !exists {
-		return ""
-	}
-	return value
+	CR             *ustrv1.Unstructured        // custom resource object
 }
 
 // searchCRDDescription based on BackingServiceSelector instance, find a CustomResourceDefinitionDescription
 // to return, otherwise creating a not-found error.
 func (p *Planner) searchCRDDescription() (*olmv1alpha1.CRDDescription, error) {
-	var backingServiceSelector = p.sbr.Spec.BackingServiceSelector
-	var logger = p.logger.WithValues(
-		"BackingServiceSelector.ResourceKind", backingServiceSelector.ResourceKind,
-		"BackingServiceSelector.ResourceVersion", backingServiceSelector.ResourceVersion,
-	)
+	var resourceName = strings.ToLower(
+		fmt.Sprintf(".%s", p.sbr.Spec.BackingServiceSelector.ResourceName))
+	var resourceVersion = strings.ToLower(p.sbr.Spec.BackingServiceSelector.ResourceVersion)
 	var err error
 
+	logger := p.logger.WithValues(
+		"BackingServiceSelector.ResourceName", resourceName,
+		"BackingServiceSelector.ResourceVersion", resourceVersion)
 	logger.Info("Looking for a CSV based on backing-selector")
 	csvList := &olmv1alpha1.ClusterServiceVersionList{}
 
@@ -78,10 +66,11 @@ func (p *Planner) searchCRDDescription() (*olmv1alpha1.CRDDescription, error) {
 			)
 			logger.Info("Inspecting CustomResourceDefinitionDescription object...")
 
-			if !strings.HasSuffix(crd.Name, backingServiceSelector.ResourceKind) {
+			// checking for suffix since is expected to have object type as prefix
+			if !strings.HasSuffix(strings.ToLower(crd.Name), resourceName) {
 				continue
 			}
-			if crd.Version != "" && backingServiceSelector.ResourceVersion != crd.Version {
+			if crd.Version != "" && resourceVersion != strings.ToLower(crd.Version) {
 				continue
 			}
 
@@ -94,62 +83,45 @@ func (p *Planner) searchCRDDescription() (*olmv1alpha1.CRDDescription, error) {
 	return nil, errors.NewNotFound(extv1beta1.Resource("CustomResourceDefinition"), "")
 }
 
-// searchCRD based on a CustomResourceDefinitionDescription and name, search for the object.
-func (p *Planner) searchCRD(
-	kind, name string,
-) (*ustrv1.Unstructured, error) {
-	var backingServiceSelector = p.sbr.Spec.BackingServiceSelector
+// searchCR based on a CustomResourceDefinitionDescription and name, search for the object.
+func (p *Planner) searchCR(kind string) (*ustrv1.Unstructured, error) {
+	var resourceRef = p.sbr.Spec.BackingServiceSelector.ResourceRef
+	var apiVersion = fmt.Sprintf("%s/%s",
+		p.sbr.Spec.BackingServiceSelector.ResourceName,
+		p.sbr.Spec.BackingServiceSelector.ResourceVersion)
+	var err error
 
-	apiVersion := fmt.Sprintf("%s/%s", backingServiceSelector.ResourceKind, backingServiceSelector.ResourceVersion)
-	obj := map[string]interface{}{"kind": kind, "apiVersion": apiVersion}
-	objList := &ustrv1.UnstructuredList{Object: obj}
+	p.logger.WithValues("CR.Name", resourceRef, "CR.Kind", kind, "CR.APIVersion", apiVersion).
+		Info("Searching for CR instance...")
 
-	logger := p.logger.WithValues(
-		"CustomResourceDefinition.Kind", name,
-		"CustomResourceDefinition.Name", name,
-		"CRDDescription.APIVersion", apiVersion,
-	)
-	logger.Info("Searching for CRD instance...")
+	cr := ustrv1.Unstructured{Object: map[string]interface{}{
+		"kind":       kind,
+		"apiVersion": apiVersion,
+	}}
+	namespacedName := types.NamespacedName{Namespace: p.ns, Name: resourceRef}
 
-	err := p.client.List(p.ctx, &client.ListOptions{Namespace: p.ns}, objList)
-	if err != nil {
+	if err = p.client.Get(p.ctx, namespacedName, &cr); err != nil {
 		return nil, err
 	}
 
-	// TODO: find a way to load the object directory, without having to loop a list;
-	for _, item := range objList.Items {
-		if name == item.GetName() {
-			logger.Info("CustomResourceDefintion found!")
-			return &item, nil
-		}
-	}
-
-	logger.Info("Warning: not able to find the CustomResourceDefinition!")
-	return nil, errors.NewNotFound(apiextv1beta1.Resource("CustomResourceDefinition"), name)
+	return &cr, nil
 }
 
 // Plan by retrieving the necessary resources related to binding a service backend.
 func (p *Planner) Plan() (*Plan, error) {
-	// extracting label conects-to, it shows the CRD name we are looking for
-	connectsToValue := p.extractConnectsTo()
-	if connectsToValue == "" {
-		return nil, fmt.Errorf("unable to find label '%s' in service-binding-request '%s'",
-			connectsToValue, p.sbr.GetName())
-	}
-
 	// find the CRD description object
 	crdDescription, err := p.searchCRDDescription()
 	if err != nil {
 		return nil, err
 	}
 
-	// retrieve the CRD based on kind, api-version and name
-	crd, err := p.searchCRD(crdDescription.Kind, connectsToValue)
+	// retrieve the CR based on kind, api-version and name
+	cr, err := p.searchCR(crdDescription.Kind)
 	if err != nil {
 		return nil, err
 	}
 
-	return &Plan{Ns: p.ns, Name: p.sbr.GetName(), CRDDescription: crdDescription, CRD: crd}, nil
+	return &Plan{Ns: p.ns, Name: p.sbr.GetName(), CRDDescription: crdDescription, CR: cr}, nil
 }
 
 // NewPlanner instantiate Planner type.
diff --git a/pkg/controller/servicebindingrequest/reconciler.go b/pkg/controller/servicebindingrequest/reconciler.go
index e21f9abd..b21f9041 100644
--- a/pkg/controller/servicebindingrequest/reconciler.go
+++ b/pkg/controller/servicebindingrequest/reconciler.go
@@ -13,7 +13,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
 
-	v1alpha1 "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
 )
 
 // Reconciler reconciles a ServiceBindingRequest object
diff --git a/pkg/controller/servicebindingrequest/retriever.go b/pkg/controller/servicebindingrequest/retriever.go
index 5bce12dd..9dd866bc 100644
--- a/pkg/controller/servicebindingrequest/retriever.go
+++ b/pkg/controller/servicebindingrequest/retriever.go
@@ -28,20 +28,16 @@ const (
 	secretPrefix  = "urn:alm:descriptor:servicebindingrequest:env:object:secret"
 )
 
-// getCRDKey retrieve key in section from CRD object, part of the "plan" instance.
-func (r *Retriever) getCRDKey(section string, key string) (string, error) {
-	obj := r.plan.CRD.Object
-	objName := r.plan.CRD.GetName()
-	logger := r.logger.WithValues(
-		"read.CRD.Name", objName,
-		"read.CRD.section", section,
-		"read.CRD.key", key,
-	)
-	logger.Info("Reading CRD attributes...")
+// getCRKey retrieve key in section from CR object, part of the "plan" instance.
+func (r *Retriever) getCRKey(section string, key string) (string, error) {
+	obj := r.plan.CR.Object
+	objName := r.plan.CR.GetName()
+	logger := r.logger.WithValues("CR.Name", objName, "CR.section", section, "CR.key", key)
+	logger.Info("Reading CR attributes...")
 
 	sectionMap, exists := obj[section]
 	if !exists {
-		return "", fmt.Errorf("Can't find '%s' section in CRD named '%s'", section, objName)
+		return "", fmt.Errorf("Can't find '%s' section in CR named '%s'", section, objName)
 	}
 
 	value, exists := sectionMap.(map[string]interface{})[key]
@@ -50,17 +46,17 @@ func (r *Retriever) getCRDKey(section string, key string) (string, error) {
 			key, section, objName)
 	}
 
-	logger.Info("CRD attribute is found!")
+	logger.Info("CR attribute is found!")
 	// making sure we always return a string representation
 	return fmt.Sprintf("%v", value), nil
 }
 
-// read attributes from CRD, where place means which top level key name contains the "path" actual
-// value, and parsing x-descriptors in order to either directly read CRD data, or read items from
+// read attributes from CR, where place means which top level key name contains the "path" actual
+// value, and parsing x-descriptors in order to either directly read CR data, or read items from
 // a secret.
 func (r *Retriever) read(place, path string, xDescriptors []string) error {
 	logger := r.logger.WithValues(
-		"CRD.Section", place,
+		"CR.Section", place,
 		"CRDDescription.Path", path,
 		"CRDDescription.XDescriptors", xDescriptors,
 	)
@@ -72,7 +68,7 @@ func (r *Retriever) read(place, path string, xDescriptors []string) error {
 	for _, xDescriptor := range xDescriptors {
 		logger = logger.WithValues("CRDDescription.xDescriptor", xDescriptor)
 		logger.Info("Inspecting xDescriptor...")
-		pathValue, err := r.getCRDKey(place, path)
+		pathValue, err := r.getCRKey(place, path)
 		if err != nil {
 			return err
 		}
@@ -128,7 +124,7 @@ func (r *Retriever) readSecret(name string, items []string) error {
 func (r *Retriever) store(key string, value []byte) {
 	key = strings.ReplaceAll(key, ":", "_")
 	key = strings.ReplaceAll(key, ".", "_")
-	key = fmt.Sprintf("%s_%s_%s", bindingPrefix, r.plan.CRD.GetKind(), key)
+	key = fmt.Sprintf("%s_%s_%s", bindingPrefix, r.plan.CR.GetKind(), key)
 	key = strings.ToUpper(key)
 	r.data[key] = value
 }


Test patch:
diff --git a/pkg/controller/servicebindingrequest/controller_test.go b/pkg/controller/servicebindingrequest/controller_test.go
deleted file mode 100644
index 34588b68..00000000
--- a/pkg/controller/servicebindingrequest/controller_test.go
+++ /dev/null
@@ -1,538 +0,0 @@
-package servicebindingrequest
-
-import (
-	"context"
-	"testing"
-
-	osappsv1 "github.com/openshift/api/apps/v1"
-	olmv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
-	appsv1 "k8s.io/api/apps/v1"
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/apimachinery/pkg/types"
-	"k8s.io/client-go/kubernetes/scheme"
-	"sigs.k8s.io/controller-runtime/pkg/client/fake"
-	"sigs.k8s.io/controller-runtime/pkg/reconcile"
-
-	v1alpha1 "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
-)
-
-func TestServiceBindingRequestController(t *testing.T) {
-	var (
-		backingOperatorName = "postgresql-operator.v0.1.0"
-		name                = "postgres"
-		deploymentName      = "my-app"
-		namespace           = "default"
-	)
-	sbr := &v1alpha1.ServiceBindingRequest{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      name,
-			Namespace: namespace,
-		},
-		Spec: v1alpha1.ServiceBindingRequestSpec{
-			BackingServiceSelector: v1alpha1.BackingServiceSelector{
-				ResourceKind: "specialdb.example.org",
-			},
-			ApplicationSelector: v1alpha1.ApplicationSelector{
-				MatchLabels: map[string]string{
-					"connects-to": "postgres",
-					"environment": "production",
-				},
-			},
-		},
-	}
-
-	// Register operator types with the runtime scheme.
-	s := scheme.Scheme
-	s.AddKnownTypes(v1alpha1.SchemeGroupVersion, sbr)
-	// Add CSV scheme
-	if err := olmv1alpha1.AddToScheme(s); err != nil {
-		t.Fatalf("Unable to add CSV scheme: (%v)", err)
-	}
-
-	csv := &olmv1alpha1.ClusterServiceVersion{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      backingOperatorName,
-			Namespace: namespace,
-		},
-		Spec: olmv1alpha1.ClusterServiceVersionSpec{
-			CustomResourceDefinitions: olmv1alpha1.CustomResourceDefinitions{
-				Owned: []olmv1alpha1.CRDDescription{
-					{
-						Name: "specialdb.example.org",
-						SpecDescriptors: []olmv1alpha1.SpecDescriptor{
-							{
-								XDescriptors: []string{"urn:alm:descriptor:servicebindingrequest:secret:password", "aaa:ccc:aa"},
-							},
-						},
-					},
-					{
-						Name: "specialdb.example.org",
-						SpecDescriptors: []olmv1alpha1.SpecDescriptor{
-							{
-								XDescriptors: []string{"urn:alm:descriptor:servicebindingrequest:configmap:username", "aaa:ccc:aa"},
-							},
-						},
-					},
-				},
-			},
-		},
-	}
-
-	s.AddKnownTypes(olmv1alpha1.SchemeGroupVersion, csv)
-
-	t.Run("Deployment", func(t *testing.T) {
-
-		// Add Deployment scheme
-		if err := appsv1.AddToScheme(s); err != nil {
-			t.Fatalf("Unable to add Deployment scheme: (%v)", err)
-		}
-
-		dp := &appsv1.Deployment{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:      deploymentName,
-				Namespace: namespace,
-				Labels: map[string]string{
-					"connects-to": "postgres",
-					"environment": "production",
-				},
-			},
-			Spec: appsv1.DeploymentSpec{
-				Template: corev1.PodTemplateSpec{
-					Spec: corev1.PodSpec{
-						Containers: []corev1.Container{
-							{Name: "app"},
-						},
-					},
-				},
-			},
-		}
-
-		s.AddKnownTypes(appsv1.SchemeGroupVersion, dp)
-
-		// Objects to track in the fake client.
-		objs := []runtime.Object{sbr, csv, dp}
-
-		cl := fake.NewFakeClient(objs...)
-
-		// Create a ReconcileServiceBindingRequest object with the scheme and fake client.
-		r := &Reconciler{client: cl, scheme: s}
-
-		// Mock request to simulate Reconcile() being called on an event for a
-		// watched resource .
-		req := reconcile.Request{
-			NamespacedName: types.NamespacedName{
-				Name:      name,
-				Namespace: namespace,
-			},
-		}
-
-		res, err := r.Reconcile(req)
-		if err != nil {
-			t.Fatalf("reconcile: (%v)", err)
-		}
-
-		// Check the result of reconciliation to make sure it has the desired state.
-		if !res.Requeue {
-			t.Error("reconcile did not requeue request as expected")
-		}
-
-		dpOut := &appsv1.Deployment{}
-		nn := types.NamespacedName{
-			Name:      deploymentName,
-			Namespace: namespace,
-		}
-		err = r.client.Get(context.TODO(), nn, dpOut)
-		if err != nil {
-			t.Fatalf("get deployment: (%v)", err)
-		}
-		n := dpOut.Spec.Template.Spec.Containers[0].Env[0].Name
-		if n != "POSTGRES_PASSWORD" {
-			t.Errorf("Environment name not matching: %s", n)
-		}
-		n2 := dpOut.Spec.Template.Spec.Containers[0].Env[1].Name
-		if n2 != "POSTGRES_USERNAME" {
-			t.Errorf("Environment name not matching: %s", n2)
-		}
-	})
-
-	t.Run("DeploymentConfig", func(t *testing.T) {
-
-		// Add DeploymentConfig scheme
-		if err := osappsv1.AddToScheme(s); err != nil {
-			t.Fatalf("Unable to add DeploymentConfig scheme: (%v)", err)
-		}
-
-		dp := &osappsv1.DeploymentConfig{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:      deploymentName,
-				Namespace: namespace,
-				Labels: map[string]string{
-					"connects-to": "postgres",
-					"environment": "production",
-				},
-			},
-			Spec: osappsv1.DeploymentConfigSpec{
-				Template: &corev1.PodTemplateSpec{
-					Spec: corev1.PodSpec{
-						Containers: []corev1.Container{
-							{Name: "app"},
-						},
-					},
-				},
-			},
-		}
-
-		s.AddKnownTypes(osappsv1.SchemeGroupVersion, dp)
-
-		sbr.Spec.ApplicationSelector.ResourceKind = "DeploymentConfig"
-		// Objects to track in the fake client.
-		objs := []runtime.Object{sbr, csv, dp}
-
-		cl := fake.NewFakeClient(objs...)
-
-		// Create a ReconcileServiceBindingRequest object with the scheme and fake client.
-		r := &Reconciler{client: cl, scheme: s}
-
-		// Mock request to simulate Reconcile() being called on an event for a
-		// watched resource .
-		req := reconcile.Request{
-			NamespacedName: types.NamespacedName{
-				Name:      name,
-				Namespace: namespace,
-			},
-		}
-
-		res, err := r.Reconcile(req)
-		if err != nil {
-			t.Fatalf("reconcile: (%v)", err)
-		}
-
-		// Check the result of reconciliation to make sure it has the desired state.
-		if !res.Requeue {
-			t.Error("reconcile did not requeue request as expected")
-		}
-
-		dpOut := &osappsv1.DeploymentConfig{}
-		nn := types.NamespacedName{
-			Name:      deploymentName,
-			Namespace: namespace,
-		}
-		err = r.client.Get(context.TODO(), nn, dpOut)
-		if err != nil {
-			t.Fatalf("get deployment: (%v)", err)
-		}
-		n := dpOut.Spec.Template.Spec.Containers[0].Env[0].Name
-		if n != "POSTGRES_PASSWORD" {
-			t.Errorf("Environment name not matching: %s", n)
-		}
-		n2 := dpOut.Spec.Template.Spec.Containers[0].Env[1].Name
-		if n2 != "POSTGRES_USERNAME" {
-			t.Errorf("Environment name not matching: %s", n2)
-		}
-	})
-
-	t.Run("StatefulSet", func(t *testing.T) {
-
-		// Add StatefulSet scheme
-		if err := appsv1.AddToScheme(s); err != nil {
-			t.Fatalf("Unable to add StatefulSet scheme: (%v)", err)
-		}
-
-		dp := &appsv1.StatefulSet{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:      deploymentName,
-				Namespace: namespace,
-				Labels: map[string]string{
-					"connects-to": "postgres",
-					"environment": "production",
-				},
-			},
-			Spec: appsv1.StatefulSetSpec{
-				Template: corev1.PodTemplateSpec{
-					Spec: corev1.PodSpec{
-						Containers: []corev1.Container{
-							{Name: "app"},
-						},
-					},
-				},
-			},
-		}
-
-		s.AddKnownTypes(appsv1.SchemeGroupVersion, dp)
-
-		sbr.Spec.ApplicationSelector.ResourceKind = "StatefulSet"
-		// Objects to track in the fake client.
-		objs := []runtime.Object{sbr, csv, dp}
-
-		cl := fake.NewFakeClient(objs...)
-
-		// Create a ReconcileServiceBindingRequest object with the scheme and fake client.
-		r := &Reconciler{client: cl, scheme: s}
-
-		// Mock request to simulate Reconcile() being called on an event for a
-		// watched resource .
-		req := reconcile.Request{
-			NamespacedName: types.NamespacedName{
-				Name:      name,
-				Namespace: namespace,
-			},
-		}
-
-		res, err := r.Reconcile(req)
-		if err != nil {
-			t.Fatalf("reconcile: (%v)", err)
-		}
-
-		// Check the result of reconciliation to make sure it has the desired state.
-		if !res.Requeue {
-			t.Error("reconcile did not requeue request as expected")
-		}
-
-		dpOut := &appsv1.StatefulSet{}
-		nn := types.NamespacedName{
-			Name:      deploymentName,
-			Namespace: namespace,
-		}
-		err = r.client.Get(context.TODO(), nn, dpOut)
-		if err != nil {
-			t.Fatalf("get deployment: (%v)", err)
-		}
-		n := dpOut.Spec.Template.Spec.Containers[0].Env[0].Name
-		if n != "POSTGRES_PASSWORD" {
-			t.Errorf("Environment name not matching: %s", n)
-		}
-		n2 := dpOut.Spec.Template.Spec.Containers[0].Env[1].Name
-		if n2 != "POSTGRES_USERNAME" {
-			t.Errorf("Environment name not matching: %s", n2)
-		}
-	})
-
-	t.Run("DaemonSet", func(t *testing.T) {
-
-		// Add DaemonSet scheme
-		if err := appsv1.AddToScheme(s); err != nil {
-			t.Fatalf("Unable to add DaemonSet scheme: (%v)", err)
-		}
-
-		dp := &appsv1.DaemonSet{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:      deploymentName,
-				Namespace: namespace,
-				Labels: map[string]string{
-					"connects-to": "postgres",
-					"environment": "production",
-				},
-			},
-			Spec: appsv1.DaemonSetSpec{
-				Template: corev1.PodTemplateSpec{
-					Spec: corev1.PodSpec{
-						Containers: []corev1.Container{
-							{Name: "app"},
-						},
-					},
-				},
-			},
-		}
-
-		s.AddKnownTypes(appsv1.SchemeGroupVersion, dp)
-
-		sbr.Spec.ApplicationSelector.ResourceKind = "DaemonSet"
-		// Objects to track in the fake client.
-		objs := []runtime.Object{sbr, csv, dp}
-
-		cl := fake.NewFakeClient(objs...)
-
-		// Create a ReconcileServiceBindingRequest object with the scheme and fake client.
-		r := &Reconciler{client: cl, scheme: s}
-
-		// Mock request to simulate Reconcile() being called on an event for a
-		// watched resource .
-		req := reconcile.Request{
-			NamespacedName: types.NamespacedName{
-				Name:      name,
-				Namespace: namespace,
-			},
-		}
-
-		res, err := r.Reconcile(req)
-		if err != nil {
-			t.Fatalf("reconcile: (%v)", err)
-		}
-
-		// Check the result of reconciliation to make sure it has the desired state.
-		if !res.Requeue {
-			t.Error("reconcile did not requeue request as expected")
-		}
-
-		dpOut := &appsv1.DaemonSet{}
-		nn := types.NamespacedName{
-			Name:      deploymentName,
-			Namespace: namespace,
-		}
-		err = r.client.Get(context.TODO(), nn, dpOut)
-		if err != nil {
-			t.Fatalf("get deployment: (%v)", err)
-		}
-		n := dpOut.Spec.Template.Spec.Containers[0].Env[0].Name
-		if n != "POSTGRES_PASSWORD" {
-			t.Errorf("Environment name not matching: %s", n)
-		}
-		n2 := dpOut.Spec.Template.Spec.Containers[0].Env[1].Name
-		if n2 != "POSTGRES_USERNAME" {
-			t.Errorf("Environment name not matching: %s", n2)
-		}
-	})
-
-}
-
-func TestCornerCasesServiceBindingRequestController(t *testing.T) {
-	var (
-		backingOperatorName = "postgresql-operator.v0.1.0"
-		name                = "postgres"
-		deploymentName      = "my-app"
-		namespace           = "default"
-	)
-	sbr := &v1alpha1.ServiceBindingRequest{
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      name,
-			Namespace: namespace,
-		},
-		Spec: v1alpha1.ServiceBindingRequestSpec{
-			BackingServiceSelector: v1alpha1.BackingServiceSelector{
-				ResourceKind:    "specialdb.example.org",
-				ResourceVersion: "v1apha1",
-			},
-			ApplicationSelector: v1alpha1.ApplicationSelector{
-				MatchLabels: map[string]string{
-					"connects-to": "postgres",
-					"environment": "production",
-				},
-			},
-		},
-	}
-
-	// Register operator types with the runtime scheme.
-	s := scheme.Scheme
-	s.AddKnownTypes(v1alpha1.SchemeGroupVersion, sbr)
-
-	t.Run("object not added to client", func(t *testing.T) {
-		// Objects to track in the fake client.
-		objs := []runtime.Object{}
-
-		cl := fake.NewFakeClient(objs...)
-
-		// Create a ReconcileServiceBindingRequest object with the scheme and fake client.
-		r := &Reconciler{client: cl, scheme: s}
-
-		// Mock request to simulate Reconcile() being called on an event for a
-		// watched resource .
-		req := reconcile.Request{
-			NamespacedName: types.NamespacedName{
-				Name:      name,
-				Namespace: namespace,
-			},
-		}
-
-		res, err := r.Reconcile(req)
-		if err != nil {
-			t.Fatalf("reconcile: (%v)", err)
-		}
-
-		// Check the result of reconciliation to make sure it has the desired state.
-		if res.Requeue {
-			t.Error("reconcile did not requeue request as expected")
-		}
-	})
-	t.Run("match version", func(t *testing.T) {
-		// Add CSV scheme
-		if err := olmv1alpha1.AddToScheme(s); err != nil {
-			t.Fatalf("Unable to add CSV scheme: (%v)", err)
-		}
-
-		csv := &olmv1alpha1.ClusterServiceVersion{
-			ObjectMeta: metav1.ObjectMeta{
-				Name:      backingOperatorName,
-				Namespace: namespace,
-			},
-			Spec: olmv1alpha1.ClusterServiceVersionSpec{
-				CustomResourceDefinitions: olmv1alpha1.CustomResourceDefinitions{
-					Owned: []olmv1alpha1.CRDDescription{
-						{
-							Name: "specialdb.example.org",
-							SpecDescriptors: []olmv1alpha1.SpecDescriptor{
-								{
-									XDescriptors: []string{"urn:alm:descriptor:servicebindingrequest:secret:password", "aaa:ccc:aa"},
-								},
-							},
-						},
-						{
-							Name: "specialdb.example.org",
-							SpecDescriptors: []olmv1alpha1.SpecDescriptor{
-								{
-									XDescriptors: []string{"urn:alm:descriptor:servicebindingrequest:configmap:username", "aaa:ccc:aa"},
-								},
-							},
-						},
-					},
-				},
-			},
-		}
-
-		s.AddKnownTypes(olmv1alpha1.SchemeGroupVersion, csv)
-		t.Run("Deployment", func(t *testing.T) {
-
-			// Add Deployment scheme
-			if err := appsv1.AddToScheme(s); err != nil {
-				t.Fatalf("Unable to add Deployment scheme: (%v)", err)
-			}
-
-			dp := &appsv1.Deployment{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:      deploymentName,
-					Namespace: namespace,
-					Labels: map[string]string{
-						"connects-to": "postgres",
-						"environment": "production",
-					},
-				},
-				Spec: appsv1.DeploymentSpec{
-					Template: corev1.PodTemplateSpec{
-						Spec: corev1.PodSpec{
-							Containers: []corev1.Container{
-								{Name: "app"},
-							},
-						},
-					},
-				},
-			}
-
-			s.AddKnownTypes(appsv1.SchemeGroupVersion, dp)
-
-			// Objects to track in the fake client.
-			objs := []runtime.Object{sbr, csv, dp}
-
-			cl := fake.NewFakeClient(objs...)
-
-			// Create a ReconcileServiceBindingRequest object with the scheme and fake client.
-			r := &Reconciler{client: cl, scheme: s}
-
-			// Mock request to simulate Reconcile() being called on an event for a
-			// watched resource .
-			req := reconcile.Request{
-				NamespacedName: types.NamespacedName{
-					Name:      name,
-					Namespace: namespace,
-				},
-			}
-
-			_, err := r.Reconcile(req)
-			if err == nil {
-				t.Fatalf("reconcile worked without version match")
-			}
-
-		})
-
-	})
-}
diff --git a/pkg/controller/servicebindingrequest/planner_test.go b/pkg/controller/servicebindingrequest/planner_test.go
new file mode 100644
index 00000000..a006a948
--- /dev/null
+++ b/pkg/controller/servicebindingrequest/planner_test.go
@@ -0,0 +1,75 @@
+package servicebindingrequest
+
+import (
+	"context"
+	"testing"
+
+	pgapis "github.com/baijum/postgresql-operator/pkg/apis"
+	pgv1alpha1 "github.com/baijum/postgresql-operator/pkg/apis/postgresql/v1alpha1"
+	olmv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/client-go/kubernetes/scheme"
+	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+
+	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/test/mocks"
+)
+
+var planner *Planner
+
+func TestPlannerNew(t *testing.T) {
+	logf.SetLogger(logf.ZapLogger(true))
+
+	ns := "testing"
+	resourceRef := "db-testing"
+	s := scheme.Scheme
+
+	sbr := mocks.ServiceBindingRequestMock(ns, "binding-request", resourceRef, map[string]string{
+		"connects-to": "database",
+		"environment": "planner",
+	})
+	s.AddKnownTypes(v1alpha1.SchemeGroupVersion, &sbr)
+
+	require.Nil(t, olmv1alpha1.AddToScheme(s))
+	csvList := mocks.ClusterServiceVersionListMock(ns, "cluster-service-version-list")
+	s.AddKnownTypes(olmv1alpha1.SchemeGroupVersion, &csvList)
+
+	require.Nil(t, pgapis.AddToScheme(s))
+	crList := mocks.DatabaseCRListMock(ns, resourceRef)
+	s.AddKnownTypes(pgv1alpha1.SchemeGroupVersion, &crList)
+
+	objs := []runtime.Object{&sbr, &csvList, &crList}
+	fakeClient := fake.NewFakeClientWithScheme(s, objs...)
+
+	planner = NewPlanner(context.TODO(), fakeClient, ns, &sbr)
+	require.NotNil(t, planner)
+}
+
+func TestPlannerSearchCRDDescription(t *testing.T) {
+	TestPlannerNew(t)
+	crdDescription, err := planner.searchCRDDescription()
+
+	assert.Nil(t, err)
+	assert.NotNil(t, crdDescription)
+}
+
+func TestPlannerSearchCR(t *testing.T) {
+	cr, err := planner.searchCR("Database")
+
+	assert.Nil(t, err)
+	assert.NotNil(t, cr)
+}
+
+func TestPlannerPlan(t *testing.T) {
+	plan, err := planner.Plan()
+
+	assert.Nil(t, err)
+	assert.NotNil(t, plan)
+	assert.NotNil(t, plan.CRDDescription)
+	assert.NotNil(t, plan.CR)
+	assert.Equal(t, "testing", plan.Ns)
+	assert.Equal(t, "binding-request", plan.Name)
+}
diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go
new file mode 100644
index 00000000..d2eb58a6
--- /dev/null
+++ b/pkg/controller/servicebindingrequest/reconciler_test.go
@@ -0,0 +1,88 @@
+package servicebindingrequest
+
+import (
+	"context"
+	"testing"
+
+	pgapis "github.com/baijum/postgresql-operator/pkg/apis"
+	pgv1alpha1 "github.com/baijum/postgresql-operator/pkg/apis/postgresql/v1alpha1"
+	olmv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+	extv1beta1 "k8s.io/api/extensions/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/client-go/kubernetes/scheme"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
+
+	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/test/mocks"
+)
+
+const (
+	reconcilerNs   = "testing"
+	reconcilerName = "binding-request"
+)
+
+var reconciler *Reconciler
+var reconcilerFakeClient client.Client
+
+// TestReconcilerNew this method acts as a "new" call would, but in this scenario bootstraping the
+// types and requirements to test Reconcile.
+func TestReconcilerNew(t *testing.T) {
+	logf.SetLogger(logf.ZapLogger(true))
+
+	s := scheme.Scheme
+	resourceRef := "db-testing"
+	matchLabels := map[string]string{
+		"connects-to": "database",
+		"environment": "planner",
+	}
+
+	sbr := mocks.ServiceBindingRequestMock(reconcilerNs, reconcilerName, resourceRef, matchLabels)
+	s.AddKnownTypes(v1alpha1.SchemeGroupVersion, &sbr)
+
+	require.Nil(t, olmv1alpha1.AddToScheme(s))
+	csvList := mocks.ClusterServiceVersionListMock(reconcilerNs, "cluster-service-version-list")
+	s.AddKnownTypes(olmv1alpha1.SchemeGroupVersion, &csvList)
+
+	require.Nil(t, pgapis.AddToScheme(s))
+	crList := mocks.DatabaseCRListMock(reconcilerNs, resourceRef)
+	s.AddKnownTypes(pgv1alpha1.SchemeGroupVersion, &crList)
+
+	dbSecret := mocks.SecretMock(reconcilerNs, "db-credentials")
+
+	require.Nil(t, extv1beta1.AddToScheme(s))
+	d := mocks.DeploymentMock(reconcilerNs, reconcilerName, matchLabels)
+	s.AddKnownTypes(extv1beta1.SchemeGroupVersion, &d)
+
+	objs := []runtime.Object{&sbr, &csvList, &crList, &dbSecret, &d}
+	reconcilerFakeClient = fake.NewFakeClientWithScheme(s, objs...)
+	reconciler = &Reconciler{client: reconcilerFakeClient, scheme: s}
+}
+
+func TestReconcilerReconcile(t *testing.T) {
+	req := reconcile.Request{
+		NamespacedName: types.NamespacedName{
+			Namespace: reconcilerNs,
+			Name:      reconcilerName,
+		},
+	}
+
+	res, err := reconciler.Reconcile(req)
+	assert.Nil(t, err)
+	assert.False(t, res.Requeue)
+
+	namespacedName := types.NamespacedName{Namespace: reconcilerNs, Name: reconcilerName}
+	d := extv1beta1.Deployment{}
+	require.Nil(t, reconcilerFakeClient.Get(context.TODO(), namespacedName, &d))
+
+	containers := d.Spec.Template.Spec.Containers
+	assert.Equal(t, 1, len(containers))
+	assert.Equal(t, 1, len(containers[0].EnvFrom))
+	assert.NotNil(t, containers[0].EnvFrom[0].SecretRef)
+	assert.Equal(t, reconcilerName, containers[0].EnvFrom[0].SecretRef.Name)
+}
diff --git a/pkg/controller/servicebindingrequest/retriever_test.go b/pkg/controller/servicebindingrequest/retriever_test.go
index 17b6fecd..5c4341d5 100644
--- a/pkg/controller/servicebindingrequest/retriever_test.go
+++ b/pkg/controller/servicebindingrequest/retriever_test.go
@@ -4,12 +4,12 @@ import (
 	"context"
 	"testing"
 
-	"github.com/stretchr/testify/require"
-
 	"github.com/stretchr/testify/assert"
-	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	"github.com/stretchr/testify/require"
+	ustrv1 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client/fake"
+	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
 
 	"github.com/redhat-developer/service-binding-operator/test/mocks"
 )
@@ -17,20 +17,22 @@ import (
 var retriever *Retriever
 
 func TestRetrieverNew(t *testing.T) {
+	logf.SetLogger(logf.ZapLogger(true))
+
 	ns := "testing"
-	crdName := "db-testing"
+	crName := "db-testing"
 
 	crdDescription := mocks.CRDDescriptionMock()
-	crd := mocks.DatabaseCRDMock(ns, crdName)
+	cr := mocks.DatabaseCRMock(ns, crName)
 
-	genericCRDObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&crd)
+	genericCR, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&cr)
 	require.Nil(t, err)
 
 	plan := &Plan{
 		Ns:             ns,
 		Name:           "retriever",
 		CRDDescription: &crdDescription,
-		CRD:            &unstructured.Unstructured{Object: genericCRDObj},
+		CR:             &ustrv1.Unstructured{Object: genericCR},
 	}
 
 	dbSecret := mocks.SecretMock(ns, "db-credentials")
@@ -41,8 +43,8 @@ func TestRetrieverNew(t *testing.T) {
 	require.NotNil(t, retriever)
 }
 
-func TestRetrieverGetCRDKey(t *testing.T) {
-	imageName, err := retriever.getCRDKey("spec", "imageName")
+func TestRetrieverGetCRKey(t *testing.T) {
+	imageName, err := retriever.getCRKey("spec", "imageName")
 	assert.Nil(t, err)
 	assert.Equal(t, "postgres", imageName)
 }
diff --git a/test/e2e/servicebindingrequest_test.go b/test/e2e/servicebindingrequest_test.go
index 2fcb2db0..9e24b0e2 100644
--- a/test/e2e/servicebindingrequest_test.go
+++ b/test/e2e/servicebindingrequest_test.go
@@ -2,62 +2,48 @@ package e2e
 
 import (
 	"context"
-	"encoding/json"
-	"fmt"
 	"testing"
 	"time"
 
 	pgsqlapis "github.com/baijum/postgresql-operator/pkg/apis"
-	pgsql "github.com/baijum/postgresql-operator/pkg/apis/postgresql/v1alpha1"
-	olm "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
-	olminstall "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
+	pgv1alpha1 "github.com/baijum/postgresql-operator/pkg/apis/postgresql/v1alpha1"
+	olmv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
 	framework "github.com/operator-framework/operator-sdk/pkg/test"
 	"github.com/operator-framework/operator-sdk/pkg/test/e2eutil"
 	"github.com/stretchr/testify/assert"
-	appsv1 "k8s.io/api/apps/v1"
+	"github.com/stretchr/testify/require"
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/types"
+	logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
 
 	"github.com/redhat-developer/service-binding-operator/pkg/apis"
-	v1alpha1 "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
+	"github.com/redhat-developer/service-binding-operator/test/mocks"
 )
 
 var (
-	retryInterval      = time.Second * 5
-	timeout            = time.Second * 120
-	cleanupTimeout     = time.Second * 5
-	replicas           = 1
-	operatorKind       = "ServiceBindingRequest"
-	operatorAPIVersion = "apps.openshift.io/v1alpha1"
+	retryInterval  = time.Second * 5
+	timeout        = time.Second * 120
+	cleanupTimeout = time.Second * 5
 )
 
 // TestAddSchemesToFramework starting point of the test, it declare the CRDs that will be using
 // during end-to-end tests.
 func TestAddSchemesToFramework(t *testing.T) {
-	serviceBindingRequestList := &v1alpha1.ServiceBindingRequestList{
-		Items: []v1alpha1.ServiceBindingRequest{{}},
-	}
-
-	t.Log("Adding ServiceBindingRequest scheme to cluster...")
-	err := framework.AddToFrameworkScheme(apis.AddToScheme, serviceBindingRequestList)
-	assert.Nil(t, err)
-
-	clusterServiceVersionListObj := &olm.ClusterServiceVersionList{
-		Items: []olm.ClusterServiceVersion{{}},
-	}
+	logf.SetLogger(logf.ZapLogger(true))
 
-	t.Log("Adding ClusterServiceVersion scheme to cluster...")
-	err = framework.AddToFrameworkScheme(olm.AddToScheme, clusterServiceVersionListObj)
-	assert.Nil(t, err)
+	t.Log("Adding ServiceBindingRequestList scheme to cluster...")
+	sbrlist := v1alpha1.ServiceBindingRequestList{}
+	require.Nil(t, framework.AddToFrameworkScheme(apis.AddToScheme, &sbrlist))
 
-	databaseListObj := &pgsql.DatabaseList{
-		Items: []pgsql.Database{{}},
-	}
+	t.Log("Adding ClusterServiceVersionList scheme to cluster...")
+	csvList := olmv1alpha1.ClusterServiceVersionList{}
+	require.Nil(t, framework.AddToFrameworkScheme(olmv1alpha1.AddToScheme, &csvList))
 
-	t.Log("Adding Database scheme to cluster...")
-	err = framework.AddToFrameworkScheme(pgsqlapis.AddToScheme, databaseListObj)
-	assert.Nil(t, err)
+	t.Log("Adding DatabaseList scheme to cluster...")
+	dbList := pgv1alpha1.DatabaseList{}
+	require.Nil(t, framework.AddToFrameworkScheme(pgsqlapis.AddToScheme, &dbList))
 
 	t.Run("end-to-end", func(t *testing.T) {
 		t.Run("scenario-1", ServiceBindingRequest)
@@ -66,193 +52,134 @@ func TestAddSchemesToFramework(t *testing.T) {
 
 // cleanUpOptions using global variables to create the object.
 func cleanUpOptions(ctx *framework.TestCtx) *framework.CleanupOptions {
-	return nil
-	/*
-	   return &framework.CleanupOptions{
-	       TestContext:   ctx,
-	       Timeout:       cleanupTimeout,
-	       RetryInterval: time.Duration(time.Second * retryInterval),
-	   }
-	*/
-}
-
-// ServiceBindingRequest bootstrap method to initialize cluster resources and setup a testing
-// namespace, after bootstrap operator related tests method is called out.
-func ServiceBindingRequest(t *testing.T) {
-	t.Log("Creating a new test context...")
-	ctx := framework.NewTestCtx(t)
-	defer ctx.Cleanup()
-
-	t.Log("Initializing cluster resources...")
-
-	err := ctx.InitializeClusterResources(&framework.CleanupOptions{
+	return &framework.CleanupOptions{
 		TestContext:   ctx,
 		Timeout:       cleanupTimeout,
 		RetryInterval: time.Duration(time.Second * retryInterval),
-	})
+	}
+}
+
+// bootstrapNamespace execute scaffolding to have a new cluster initialized, and acquire a test
+// namespace, the namespace name is returned and framework global variables are returned.
+func bootstrapNamespace(t *testing.T, ctx *framework.TestCtx) (string, *framework.Framework) {
+	t.Log("Initializing cluster resources...")
+	err := ctx.InitializeClusterResources(cleanUpOptions(ctx))
 	if err != nil {
-		if !errors.IsAlreadyExists(err) {
-			t.Fatalf("Failed to setup cluster resources: '%s'", err)
-		}
+		t.Logf("Cluster resources initialization error: '%s'", err)
+		require.True(t, errors.IsAlreadyExists(err), "failed to setup cluster resources")
 	}
 
 	// namespace name is informed on command-line or defined dinamically
 	ns, err := ctx.GetNamespace()
-	assert.Nil(t, err)
-
+	require.Nil(t, err)
 	t.Logf("Using namespace '%s' for testing...", ns)
-	f := framework.Global
-	err = e2eutil.WaitForOperatorDeployment(
-		t, f.KubeClient, ns, "service-binding-operator", replicas, retryInterval, timeout)
-	assert.Nil(t, err)
 
-	// populating cluster with mocked CRDs
-	mockedObjects(t, ns, f, ctx)
-	// executing testing steps on operator
-	serviceBindingRequestTest(t, ns, f, ctx)
+	f := framework.Global
+	return ns, f
 }
 
-// mockedObjects creates all required CRDs in the cluster, using common values to link them as
-// service-binding-operator expects.
-func mockedObjects(t *testing.T, ns string, f *framework.Framework, ctx *framework.TestCtx) {
-	todoCtx := context.TODO()
-
-	crdName := "postgresql.baiju.dev"
-	crdVersion := "v1alpha1"
-	crdKind := "Database"
-	secretName := "e2e-secret"
-
-	labelConnectTo := "postgresql"
-	labelEnvironment := "e2e"
+// ServiceBindingRequest bootstrap method to initialize cluster resources and setup a testing
+// namespace, after bootstrap operator related tests method is called out.
+func ServiceBindingRequest(t *testing.T) {
+	t.Log("Creating a new test context...")
+	ctx := framework.NewTestCtx(t)
+	defer ctx.Cleanup()
 
-	strategy := olminstall.StrategyDetailsDeployment{
-		DeploymentSpecs: []olminstall.StrategyDeploymentSpec{{
-			Name: "deployment",
-			Spec: appsv1.DeploymentSpec{},
-		}},
-	}
+	ns, f := bootstrapNamespace(t, ctx)
 
-	strategyJSON, err := json.Marshal(strategy)
-	assert.Nil(t, err)
-
-	clusterServiceVersionObj := olm.ClusterServiceVersion{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "ClusterServiceVersion",
-			APIVersion: "operators.coreos.com/v1alpha1",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "e2e-cluster-service-version",
-			Namespace: ns,
-		},
-		Spec: olm.ClusterServiceVersionSpec{
-			DisplayName: "e2e database csv",
-			InstallStrategy: olm.NamedInstallStrategy{
-				StrategyName:    "deployment",
-				StrategySpecRaw: strategyJSON,
-			},
-			CustomResourceDefinitions: olm.CustomResourceDefinitions{
-				Owned: []olm.CRDDescription{{
-					Name:        crdName,
-					DisplayName: crdKind,
-					Description: "e2e csv based on postgresql-operator",
-					Kind:        crdKind,
-					Version:     crdVersion,
-					StatusDescriptors: []olm.StatusDescriptor{{
-						DisplayName: "DB Password Credentials",
-						Description: "Database credentials secret",
-						Path:        "dbCredentials",
-						XDescriptors: []string{
-							"urn:alm:descriptor:io.kubernetes:Secret",
-							"urn:alm:descriptor:io.servicebindingrequest:secret:user",
-							"urn:alm:descriptor:io.servicebindingrequest:secret:password",
-						},
-					}},
-				}},
-			},
-		},
-	}
+	// executing testing steps on operator
+	serviceBindingRequestTest(t, ctx, f, ns)
+}
 
-	t.Log("Creating ClusterServiceVersion object...")
-	// err = f.Client.Create(todoCtx, &clusterServiceVersionObj, cleanUpOptions(ctx))
-	_ = f.Client.Create(todoCtx, &clusterServiceVersionObj, cleanUpOptions(ctx))
-	// assert.Nil(t, err)
-
-	pgDatabaseObj := pgsql.Database{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       crdKind,
-			APIVersion: fmt.Sprintf("%s/%s", crdName, crdVersion),
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      labelConnectTo,
-			Namespace: ns,
-		},
-		Spec: pgsql.DatabaseSpec{
-			Image:     "database/image",
-			ImageName: "database",
-		},
-	}
+// serviceBindingRequestTest executes the actual end-to-end testing, simulating the components and
+// expecting for changes caused by the operator.
+func serviceBindingRequestTest(t *testing.T, ctx *framework.TestCtx, f *framework.Framework, ns string) {
+	todoCtx := context.TODO()
 
-	t.Log("Creating a database CRD object...")
-	// err = f.Client.Create(todoCtx, &pgDatabaseObj, cleanUpOptions(ctx))
-	_ = f.Client.Create(todoCtx, &pgDatabaseObj, nil)
-	// assert.Nil(t, err)
-
-	/*
-	   t.Log("Adding db-credentials to status...")
-	   pgDatabaseObj.Status.DBCredentials = secretName
-	   err = f.Client.Status().Update(todoCtx, &pgDatabaseObj)
-	   assert.Nil(t, err)
-	*/
-
-	secretObj := corev1.Secret{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "Secret",
-			APIVersion: "v1",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      secretName,
-			Namespace: ns,
-		},
-		Data: map[string][]byte{
-			"user":     []byte("user"),
-			"password": []byte("password"),
-		},
+	name := "e2e-service-binding-request"
+	resourceRef := "e2e-db-testing"
+	secretName := "e2e-db-credentials"
+	appName := "e2e-application"
+	matchLabels := map[string]string{
+		"connects-to": "database",
+		"environment": "e2e",
 	}
 
-	t.Log("Creating secret object...")
-	// err = f.Client.Create(todoCtx, &secretObj, cleanUpOptions(ctx))
-	_ = f.Client.Create(todoCtx, &secretObj, cleanUpOptions(ctx))
-	// assert.Nil(t, err)
-
-	serviceBindingRequestObj := v1alpha1.ServiceBindingRequest{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       operatorKind,
-			APIVersion: operatorAPIVersion,
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      "e2e-service-binding-request",
-			Namespace: ns,
-		},
-		Spec: v1alpha1.ServiceBindingRequestSpec{
-			BackingServiceSelector: v1alpha1.BackingServiceSelector{
-				ResourceKind:    crdName,
-				ResourceVersion: crdVersion,
-			},
-			ApplicationSelector: v1alpha1.ApplicationSelector{
-				MatchLabels: map[string]string{
-					"connects-to": labelConnectTo,
-					"environment": labelEnvironment,
-				},
-			},
-		},
+	t.Log("Starting end-to-end tests for operator!")
+
+	t.Log("Creating ClusterServiceVersion mock object...")
+	csv := mocks.ClusterServiceVersionMock(ns, "cluster-service-version")
+	require.Nil(t, f.Client.Create(todoCtx, &csv, cleanUpOptions(ctx)))
+
+	t.Log("Creating Database mock object...")
+	db := mocks.DatabaseCRMock(ns, resourceRef)
+	require.Nil(t, f.Client.Create(todoCtx, &db, cleanUpOptions(ctx)))
+
+	t.Log("Updating Database status, adding 'DBCredentials'")
+	require.Nil(t, f.Client.Get(todoCtx, types.NamespacedName{Namespace: ns, Name: resourceRef}, &db))
+	db.Status.DBCredentials = secretName
+	require.Nil(t, f.Client.Status().Update(todoCtx, &db))
+
+	t.Log("Creating Database credentials secret mock object...")
+	dbSecret := mocks.SecretMock(ns, secretName)
+	require.Nil(t, f.Client.Create(todoCtx, &dbSecret, cleanUpOptions(ctx)))
+
+	t.Log("Creating Deployment mock object...")
+	d := mocks.DeploymentMock(ns, appName, matchLabels)
+	require.Nil(t, f.Client.Create(todoCtx, &d, cleanUpOptions(ctx)))
+
+	// waiting for application deployment to reach one replica
+	t.Log("Waiting for application deployment reach one replica...")
+	require.Nil(t, e2eutil.WaitForDeployment(t, f.KubeClient, ns, appName, 1, retryInterval, timeout))
+
+	// retrieveing deployment, to inspect it's generation
+	t.Logf("Reading application deployment, extrating generation from '%s'", appName)
+	require.Nil(t, f.Client.Get(todoCtx, types.NamespacedName{Namespace: ns, Name: appName}, &d))
+
+	// creating service-binding-request, which will trigger actions in the controller
+	t.Log("Creating ServiceBindingRequest mock object...")
+	sbr := mocks.ServiceBindingRequestMock(ns, name, resourceRef, matchLabels)
+	// making sure object does not exist before testing
+	_ = f.Client.Delete(todoCtx, &sbr)
+	require.Nil(t, f.Client.Create(todoCtx, &sbr, cleanUpOptions(ctx)))
+
+	// waiting again for deployment
+	t.Log("Waiting for application deployment reach one replica, again...")
+	require.Nil(t, e2eutil.WaitForDeployment(t, f.KubeClient, ns, appName, 1, retryInterval, timeout))
+
+	// retrieveing deployment again until new generation or timeout
+	for attempts := 0; attempts < 10; attempts++ {
+		t.Logf("Reading application deployment '%s' ('%d')", appName, attempts)
+		require.Nil(t, f.Client.Get(todoCtx, types.NamespacedName{Namespace: ns, Name: appName}, &d))
+
+		generation := d.GetGeneration()
+		t.Logf("Deployment generation: '%d'", generation)
+		if generation > 1 {
+			break
+		}
+		time.Sleep(time.Second * 3)
 	}
 
-	t.Log("Creating ServiceBindingRequest object...")
-	// err = f.Client.Create(todoCtx, &serviceBindingRequestObj, cleanUpOptions(ctx))
-	_ = f.Client.Create(todoCtx, &serviceBindingRequestObj, cleanUpOptions(ctx))
-	// assert.Nil(t, err)
-}
-
-func serviceBindingRequestTest(t *testing.T, ns string, f *framework.Framework, ctx *framework.TestCtx) {
-	t.Log("Starting end-to-end tests for operator...")
+	// making sure envFrom is added to the container
+	t.Logf("Inspecting '%s' searching for 'envFrom'...", appName)
+	containers := d.Spec.Template.Spec.Containers
+	require.Equal(t, 1, len(containers))
+	require.Equal(t, 1, len(containers[0].EnvFrom))
+	assert.NotNil(t, containers[0].EnvFrom[0].SecretRef)
+	assert.Equal(t, name, containers[0].EnvFrom[0].SecretRef.Name)
+
+	// checking intermediary secret
+	t.Logf("Checking intermediary secret '%s'...", name)
+	sbrSecret := corev1.Secret{}
+	require.Nil(t, f.Client.Get(todoCtx, types.NamespacedName{Namespace: ns, Name: name}, &sbrSecret))
+	assert.Contains(t, sbrSecret.Data, "SERVICE_BINDING_DATABASE_SECRET_USER")
+	assert.Equal(t, []byte("user"), sbrSecret.Data["SERVICE_BINDING_DATABASE_SECRET_USER"])
+	assert.Contains(t, sbrSecret.Data, "SERVICE_BINDING_DATABASE_SECRET_PASSWORD")
+	assert.Equal(t, []byte("password"), sbrSecret.Data["SERVICE_BINDING_DATABASE_SECRET_PASSWORD"])
+
+	// cleaning up
+	t.Log("Cleaning all up!")
+	_ = f.Client.Delete(todoCtx, &sbr)
+	_ = f.Client.Delete(todoCtx, &sbrSecret)
+	_ = f.Client.Delete(todoCtx, &d)
 }
diff --git a/test/mocks/mocks.go b/test/mocks/mocks.go
index 9046c148..f6936de7 100644
--- a/test/mocks/mocks.go
+++ b/test/mocks/mocks.go
@@ -4,19 +4,24 @@ import (
 	"encoding/json"
 	"fmt"
 
-	dbv1alpha1 "github.com/baijum/postgresql-operator/pkg/apis/postgresql/v1alpha1"
+	pgv1alpha1 "github.com/baijum/postgresql-operator/pkg/apis/postgresql/v1alpha1"
 	olmv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
 	olminstall "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
 	appsv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
+	extv1beta1 "k8s.io/api/extensions/v1beta1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+	v1alpha1 "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1"
 )
 
-// names employed in mocks
+// resource details employed in mocks
 const (
-	CRDName    = "postgresql.baiju.dev"
-	CRDVersion = "v1alpha1"
-	CRDKind    = "Database"
+	CRDName            = "postgresql.baiju.dev"
+	CRDVersion         = "v1alpha1"
+	CRDKind            = "Database"
+	OperatorKind       = "ServiceBindingRequest"
+	OperatorAPIVersion = "apps.openshift.io/v1alpha1"
 )
 
 // ClusterServiceVersionMock based on PostgreSQL operator.
@@ -31,10 +36,6 @@ func ClusterServiceVersionMock(ns, name string) olmv1alpha1.ClusterServiceVersio
 	strategyJSON, _ := json.Marshal(strategy)
 
 	return olmv1alpha1.ClusterServiceVersion{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "ClusterServiceVersion",
-			APIVersion: "operators.coreos.com/v1alpha1",
-		},
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: ns,
 			Name:      name,
@@ -52,11 +53,18 @@ func ClusterServiceVersionMock(ns, name string) olmv1alpha1.ClusterServiceVersio
 	}
 }
 
+// ClusterServiceVersionListMock returns a list with a single CSV object inside, reusing mock.
+func ClusterServiceVersionListMock(ns, name string) olmv1alpha1.ClusterServiceVersionList {
+	return olmv1alpha1.ClusterServiceVersionList{
+		Items: []olmv1alpha1.ClusterServiceVersion{ClusterServiceVersionMock(ns, name)},
+	}
+}
+
 // CRDDescriptionMock based on PostgreSQL operator, returning a mock that defines database
 // credentials entry with OLM descriptors.
 func CRDDescriptionMock() olmv1alpha1.CRDDescription {
 	return olmv1alpha1.CRDDescription{
-		Name:        CRDName,
+		Name:        fmt.Sprintf("%s.%s", CRDKind, CRDName),
 		DisplayName: CRDKind,
 		Description: "mock-crd-description",
 		Kind:        CRDKind,
@@ -80,9 +88,11 @@ func CRDDescriptionMock() olmv1alpha1.CRDDescription {
 	}
 }
 
-// DatabaseCRDMock based on PostgreSQL operator, returning a instantiated object
-func DatabaseCRDMock(ns, name string) dbv1alpha1.Database {
-	return dbv1alpha1.Database{
+// DatabaseCRMock based on PostgreSQL operator, returning a instantiated object.
+func DatabaseCRMock(ns, name string) pgv1alpha1.Database {
+	return pgv1alpha1.Database{
+		// usually TypeMeta should not be explicitly defined in mocked objects, however, on using
+		// it via *unstructured.Unstructured it could not find this CR without it.
 		TypeMeta: metav1.TypeMeta{
 			Kind:       CRDKind,
 			APIVersion: fmt.Sprintf("%s/%s", CRDName, CRDVersion),
@@ -91,23 +101,26 @@ func DatabaseCRDMock(ns, name string) dbv1alpha1.Database {
 			Namespace: ns,
 			Name:      name,
 		},
-		Spec: dbv1alpha1.DatabaseSpec{
+		Spec: pgv1alpha1.DatabaseSpec{
 			Image:     "docker.io/postgres:latest",
 			ImageName: "postgres",
 		},
-		Status: dbv1alpha1.DatabaseStatus{
+		Status: pgv1alpha1.DatabaseStatus{
 			DBCredentials: "db-credentials",
 		},
 	}
 }
 
+// DatabaseCRListMock returns a list with a single database CR inside, reusing existing mock.
+func DatabaseCRListMock(ns, name string) pgv1alpha1.DatabaseList {
+	return pgv1alpha1.DatabaseList{
+		Items: []pgv1alpha1.Database{DatabaseCRMock(ns, name)},
+	}
+}
+
 // SecretMock returns a Secret based on PostgreSQL operator usage.
 func SecretMock(ns, name string) corev1.Secret {
 	return corev1.Secret{
-		TypeMeta: metav1.TypeMeta{
-			Kind:       "Secret",
-			APIVersion: "v1",
-		},
 		ObjectMeta: metav1.ObjectMeta{
 			Namespace: ns,
 			Name:      name,
@@ -118,3 +131,56 @@ func SecretMock(ns, name string) corev1.Secret {
 		},
 	}
 }
+
+// ServiceBindingRequestMock return a binding-request mock of informed name and match labels.
+func ServiceBindingRequestMock(
+	ns, name, resourceRef string, matchLabels map[string]string,
+) v1alpha1.ServiceBindingRequest {
+	return v1alpha1.ServiceBindingRequest{
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: ns,
+			Name:      name,
+		},
+		Spec: v1alpha1.ServiceBindingRequestSpec{
+			BackingServiceSelector: v1alpha1.BackingServiceSelector{
+				ResourceName:    CRDName,
+				ResourceVersion: CRDVersion,
+				ResourceRef:     resourceRef,
+			},
+			ApplicationSelector: v1alpha1.ApplicationSelector{
+				ResourceKind: "Deployment",
+				MatchLabels:  matchLabels,
+			},
+		},
+	}
+}
+
+// DeploymentMock creates a mocked Deployment object of busybox.
+func DeploymentMock(ns, name string, matchLabels map[string]string) extv1beta1.Deployment {
+	return extv1beta1.Deployment{
+		ObjectMeta: metav1.ObjectMeta{
+			Namespace: ns,
+			Name:      name,
+			Labels:    matchLabels,
+		},
+		Spec: extv1beta1.DeploymentSpec{
+			Selector: &metav1.LabelSelector{
+				MatchLabels: matchLabels,
+			},
+			Template: corev1.PodTemplateSpec{
+				ObjectMeta: metav1.ObjectMeta{
+					Namespace: ns,
+					Name:      name,
+					Labels:    matchLabels,
+				},
+				Spec: corev1.PodSpec{
+					Containers: []corev1.Container{{
+						Name:    "busybox",
+						Image:   "busybox:latest",
+						Command: []string{"sleep", "3600"},
+					}},
+				},
+			},
+		},
+	}
+}
diff --git a/test/operator-hub/subscription.yaml b/test/operator-hub/subscription.yaml
index 0064ecda..fad05470 100644
--- a/test/operator-hub/subscription.yaml
+++ b/test/operator-hub/subscription.yaml
@@ -5,7 +5,7 @@ metadata:
   name: my-service-binding
   namespace: openshift-operators
 spec:
-  channel: alpha
+  channel: dev
   name: service-binding
   source: my-catalog
   sourceNamespace: openshift-operator-lifecycle-manager
diff --git a/test/third-party-crds/postgresql_v1alpha1_database_crd.yaml b/test/third-party-crds/postgresql_v1alpha1_database_crd.yaml
new file mode 100644
index 00000000..eae666e3
--- /dev/null
+++ b/test/third-party-crds/postgresql_v1alpha1_database_crd.yaml
@@ -0,0 +1,38 @@
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  name: databases.postgresql.baiju.dev
+spec:
+  group: postgresql.baiju.dev
+  names:
+    kind: Database
+    listKind: DatabaseList
+    plural: databases
+    singular: database
+    shortNames:
+      - db
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      properties:
+        apiVersion:
+          description: 'APIVersion defines the versioned schema of this
+            representation of an object. Servers should convert recognized
+            schemas to the latest internal value, and may reject unrecognized
+            values.'
+          type: string
+        kind:
+          description: 'Kind is a string value representing the REST resource
+            this object represents. Servers may infer this from the endpoint the
+            client submits requests to.'
+          type: string
+        metadata:
+          type: object
+        spec:
+          type: object
+        status:
+          type: object
+  version: v1alpha1