Repository: redhat-developer/service-binding-operator
Pull request #835 (2021-01-08 17:33:35)

Add implementation to support flexible naming strategies to prepare binding names
## **Why ?** 
At the moment, binding names declared through annotations or CSV descriptors are processed before injected into the application according to the following strategy:

- names are upper-cased
- service resource kind is upper-cased and prepended to the name

Currently there is no way to build custom environment variable key except using naming prefix, This PR provides a way to have go template in the service field of SB request which can then be used to prepare environment variable name.

## **How ?**
With this PR we can define `namingStrategy`, a template which can be used in the preparation for env variable key.
sample SB request would look like
```
apiVersion: operators.coreos.com/v1alpha1
kind: ServiceBinding
metadata:
    name: binding-example
spec:
    namingStrategy: '{{ .service.kind | lower }}_custom_svc_{{ .name | lower }}'
    services:
    -   group: stable.example.com
        version: v1
        kind: Backend
        name: backend-demo
    application:
        name: generic-app
        group: apps
        version: v1
        resource: deployments
```

Above applied naming strategy would yield following env variable ` database_custom_svc_namefield`

## ****Predefined naming strategies****
1. none - `{{ .name  }}` -  if namingStrategy is set to 'none', then there won't any changes in the env variable key.
2. uppercase - `{{ .service.kind | upper }}_{{ .name | upper }}` - if no namingStrategy is set then `default` strategy would be used.
3. lowercase - `{{ .name | lower }}` - If `bindAsFiles` set to true then binding names would be lowercased.

Note: If `namingStrategy` provided isn't in the above list then value would be treated as template string.

## **Deprecation of features**
Following old features would be removed as a part of this PR.
1. Support of `namePrefix` and `globalNamePrefix` would be removed, since this can now be added as a part of naming strategy template.
2. In case we have not provided any namingStrategy then environment variable key would be uppercased name. i.e `HOST`, earlier we used to append kind as a prefix . i.e `BACKEND_HOST`.

## **TODO**

- [x]  Define global naming strategy.
- [x] Remove `globalNamePrefix` and `namePrefix` references in the code.
- [x] Fix acceptance tests based on the updates in the env variable keys.
- [x] Update documentation.

Ref: https://issues.redhat.com/browse/APPSVC-774

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

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

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

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
isutton: Could you please describe the use case and intended implementation?
isutton: @akashshinde any news on this?
akashshinde: > Could you please describe the use case and intended implementation?

@isutton added, please take a look at it
openshift-ci-robot: @akashshinde: PR needs rebase.

<details>

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

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

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

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

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

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

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

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

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

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

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

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 42f140e80dd0c3d98768bc8ee982b095f4e0f36b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1352445821827682304) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 42f140e80dd0c3d98768bc8ee982b095f4e0f36b | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1353719510351220736) | `/test 4.7-acceptance`

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

<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: @akashshinde: PR needs rebase.

<details>

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

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

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

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

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

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

<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: @akashshinde: PR needs rebase.

<details>

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

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

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 09bf1a6907d0ca38afe016f614e1f3818beaa2d1 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356213302094467072) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 09bf1a6907d0ca38afe016f614e1f3818beaa2d1 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356213302060912640) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 09bf1a6907d0ca38afe016f614e1f3818beaa2d1 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356213302060912640) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 87cf23ea5d73016e3fa58c02c8c416d00951c9ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356479337418723328) | `/test 4.7-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 87cf23ea5d73016e3fa58c02c8c416d00951c9ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356479337418723328) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 87cf23ea5d73016e3fa58c02c8c416d00951c9ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356479337380974592) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 87cf23ea5d73016e3fa58c02c8c416d00951c9ee | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356479337418723328) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 499e3a75634084cf7302afeaf425bed13193b0e8 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356507486579855360) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 499e3a75634084cf7302afeaf425bed13193b0e8 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356507486579855360) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 499e3a75634084cf7302afeaf425bed13193b0e8 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356507486613409792) | `/test 4.7-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 499e3a75634084cf7302afeaf425bed13193b0e8 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356507486613409792) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 682139e80cefae7d951b3350eaeac11ed05f471f | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356601239172812800) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 682139e80cefae7d951b3350eaeac11ed05f471f | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356601239172812800) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 682139e80cefae7d951b3350eaeac11ed05f471f | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356601239202172928) | `/test 4.7-acceptance`

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

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
codecov[bot]: # [Codecov](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835?src=pr&el=h1) Report
> Merging [#835](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835?src=pr&el=desc) (eb78e64) into [master](https://codecov.io/gh/redhat-developer/service-binding-operator/commit/0efd994cb486fb2b53a3984ea309c35b78eea216?el=desc) (0efd994) will **increase** coverage by `0.10%`.
> The diff coverage is `83.01%`.

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

```diff
@@            Coverage Diff             @@
##           master     #835      +/-   ##
==========================================
+ Coverage   61.47%   61.57%   +0.10%     
==========================================
  Files          25       26       +1     
  Lines        1918     1944      +26     
==========================================
+ Hits         1179     1197      +18     
- Misses        568      572       +4     
- Partials      171      175       +4     
```


| [Impacted Files](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [controllers/binder.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvYmluZGVyLmdv) | `50.00% <ø> (ø)` | |
| [pkg/envvars/envvars.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-cGtnL2VudnZhcnMvZW52dmFycy5nbw==) | `60.71% <ø> (-0.69%)` | :arrow_down: |
| [controllers/retriever.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvcmV0cmlldmVyLmdv) | `70.58% <66.66%> (-6.08%)` | :arrow_down: |
| [pkg/naming/naming.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-cGtnL25hbWluZy9uYW1pbmcuZ28=) | `87.50% <87.50%> (ø)` | |
| [controllers/servicecontext.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvc2VydmljZWNvbnRleHQuZ28=) | `71.05% <90.90%> (ø)` | |
| [controllers/reconciler.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvcmVjb25jaWxlci5nbw==) | `75.34% <100.00%> (+0.34%)` | :arrow_up: |
| [controllers/service.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvc2VydmljZS5nbw==) | `89.28% <100.00%> (+0.26%)` | :arrow_up: |
| [controllers/servicebinder.go](https://codecov.io/gh/redhat-developer/service-binding-operator/pull/835/diff?src=pr&el=tree#diff-Y29udHJvbGxlcnMvc2VydmljZWJpbmRlci5nbw==) | `64.81% <100.00%> (-0.17%)` | :arrow_down: |

------

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

openshift-ci[bot]: @akashshinde: The following tests **failed**, say `/retest` to rerun all failed tests:

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 682139e80cefae7d951b3350eaeac11ed05f471f | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356601239172812800) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 94c0585f73f010e1cd9d77c0ecdefc5ad939020d | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356912803935424512) | `/test 4.7-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 94c0585f73f010e1cd9d77c0ecdefc5ad939020d | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356912803935424512) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 94c0585f73f010e1cd9d77c0ecdefc5ad939020d | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356912803906064384) | `/test 4.6-acceptance`

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

<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: @akashshinde: PR needs rebase.

<details>

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 94c0585f73f010e1cd9d77c0ecdefc5ad939020d | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356912803935424512) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356950706312974336) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1356950706312974336) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356950706350723072) | `/test 4.7-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1356950706350723072) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357194938361581568) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357194938361581568) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1357194938390941696) | `/test 4.7-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1357194938390941696) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357197962144387072) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357197962144387072) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1357197962207301632) | `/test 4.7-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 5fa18c0a6584e16e5fdc7fcf32427a021bcf2cc9 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357197962144387072) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 91ca28995c9c3998e26f20ef6ea62774a155eb13 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1357203605785939968) | `/test 4.7-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 91ca28995c9c3998e26f20ef6ea62774a155eb13 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1357203605785939968) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 91ca28995c9c3998e26f20ef6ea62774a155eb13 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357203605756579840) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.7-acceptance | 91ca28995c9c3998e26f20ef6ea62774a155eb13 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1357203605785939968) | `/test 4.7-acceptance`
ci/prow/4.6-acceptance | 17d5c04c431848f848a6ceaa3065cc4b50fc7ddc | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357270509825298432) | `/test 4.6-acceptance`

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 17d5c04c431848f848a6ceaa3065cc4b50fc7ddc | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1357270509825298432) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 17d5c04c431848f848a6ceaa3065cc4b50fc7ddc | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1357270509863047168) | `/test 4.7-acceptance`

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

<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: Please update PR description to reflect the current state of implementation. Also, please update PR summary.
openshift-ci[bot]: @akashshinde: The following test **failed**, say `/retest` to rerun all failed tests:

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

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

<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 -->
akashshinde: /test 4.6-acceptance
openshift-ci-robot: @akashshinde: PR needs rebase.

<details>

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

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

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

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

Test name | Commit | Details | Rerun command
--- | --- | --- | ---
ci/prow/4.6-acceptance | 8eaf54278713f4628b0cd5ed20d10654a565e508 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.6-acceptance/1359393303828631552) | `/test 4.6-acceptance`
ci/prow/4.7-acceptance | 8eaf54278713f4628b0cd5ed20d10654a565e508 | [link](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/redhat-developer_service-binding-operator/835/pull-ci-redhat-developer-service-binding-operator-master-4.7-acceptance/1359393303862185984) | `/test 4.7-acceptance`

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

<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: /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/835#issuecomment-777414274" title="Approved">pedjak</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)~~ [pedjak]

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/.gitignore b/.gitignore
index 0a360360..4b1c810b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -109,4 +109,6 @@ testbin/*
 *.test
 
 bundle
-bundle.Dockerfile
\ No newline at end of file
+bundle.Dockerfile
+
+config/crd/bases/_.yaml
diff --git a/README.md b/README.md
index 8ff8c5f0..5f798fce 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@ connect to a backing service (for example, a database):
 
 * Support Binding with backing services represented by Kubernetes resources including third-party CRD-backed resources.
 * Support binding with multiple-backing services.
-* Extract binding information based on annotations present in CRDs/CRs/resources. 
+* Extract binding information based on annotations present in CRDs/CRs/resources.
 * Extract binding values based on annotations present in OLM descriptors.
 * Project binding values as volume mounts.
 * Project binding values as environment variables.
@@ -100,6 +100,20 @@ Follow [OperatorHub instructions](https://operatorhub.io/operator/service-bindin
 
 Clone the repository and run `make run` using an existing `kube:admin` kube context.
 
+## Key Features
+
+* Support Binding with backing services represented by Kubernetes resources including third-party CRD-backed resources.
+* Support binding with multiple-backing services.
+* Extract binding information based on annotations present in CRDs/CRs/resources.
+* Extract binding values based on annotations present in OLM descriptors.
+* Project binding values as volume mounts.
+* Project binding values as environment variables.
+* Binding of PodSpec-based workloads.
+* Binding of non-PodSpec-based Kubernetes resources.
+* Custom binding variables composed from one or more backing services.
+* Auto-detect binding resources in the absence of binding decorators.
+
+
 ## Getting Started
 
 The best way to get started with the Service Binding Operator is to see it in action.
diff --git a/api/v1alpha1/servicebinding_types.go b/api/v1alpha1/servicebinding_types.go
index 271c8fc8..9d5f4bb6 100644
--- a/api/v1alpha1/servicebinding_types.go
+++ b/api/v1alpha1/servicebinding_types.go
@@ -41,8 +41,17 @@ const (
 	ServiceNotFoundReason = "ServiceNotFound"
 
 	BindingInjectedReason = "BindingInjected"
+
+	// NamingStrategyError is used when naming strategy/template used is incorrect
+	NamingStrategyError = "NamingStrategyError"
 )
 
+var templates = map[string]string{
+	"none":      "{{ .name }}",
+	"uppercase": "{{ .service.kind | upper }}_{{ .name | upper }}",
+	"lowercase": "{{ .name | lower }}",
+}
+
 // ServiceBindingSpec defines the desired state of ServiceBinding
 type ServiceBindingSpec struct {
 	// MountPath is the path inside app container where bindings will be mounted
@@ -54,9 +63,11 @@ type ServiceBindingSpec struct {
 	// +optional
 	MountPath string `json:"mountPath,omitempty"`
 
-	// NamePrefix is the prefix for environment variables or file name
+	// NamingStrategy defines custom string template for preparing binding names.
+	// It can be pre-defined strategies(i.e none,uppercase), in case strategy provided in this field isn't defined
+	// we are going to treat the value as a custom template and prepare binding names accordingly.
 	// +optional
-	NamePrefix string `json:"namePrefix,omitempty"`
+	NamingStrategy string `json:"namingStrategy,omitempty"`
 
 	// Custom mappings
 	// +optional
@@ -111,9 +122,8 @@ type Service struct {
 	corev1.LocalObjectReference `json:",inline"`
 
 	// +optional
-	Namespace  *string `json:"namespace,omitempty"`
-	NamePrefix *string `json:"namePrefix,omitempty"`
-	Id         *string `json:"id,omitempty"`
+	Namespace *string `json:"namespace,omitempty"`
+	Id        *string `json:"id,omitempty"`
 }
 
 // BoundApplication defines the application workloads to which the binding secret has
@@ -195,3 +205,18 @@ func (sbr ServiceBinding) AsOwnerReference() metav1.OwnerReference {
 		Controller: &ownerRefController,
 	}
 }
+
+func (spec *ServiceBindingSpec) NamingTemplate() string {
+	if spec.BindAsFiles && spec.NamingStrategy == "" {
+		return templates["lowercase"]
+	} else if spec.NamingStrategy == "" {
+		return templates["uppercase"]
+	} else if spec.NamingStrategy != "" {
+		if v, ok := templates[spec.NamingStrategy]; ok {
+			return v
+		} else {
+			return spec.NamingStrategy
+		}
+	}
+	return templates["none"]
+}
diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go
index f2a8dc7a..33bf20a1 100644
--- a/api/v1alpha1/zz_generated.deepcopy.go
+++ b/api/v1alpha1/zz_generated.deepcopy.go
@@ -109,11 +109,6 @@ func (in *Service) DeepCopyInto(out *Service) {
 		*out = new(string)
 		**out = **in
 	}
-	if in.NamePrefix != nil {
-		in, out := &in.NamePrefix, &out.NamePrefix
-		*out = new(string)
-		**out = **in
-	}
 	if in.Id != nil {
 		in, out := &in.Id, &out.Id
 		*out = new(string)
diff --git a/config/crd/bases/operators.coreos.com_servicebindings.yaml b/config/crd/bases/operators.coreos.com_servicebindings.yaml
index 08ce63cc..34360687 100644
--- a/config/crd/bases/operators.coreos.com_servicebindings.yaml
+++ b/config/crd/bases/operators.coreos.com_servicebindings.yaml
@@ -164,9 +164,12 @@ spec:
                   `/bindings` When mountPath is used, the file will be mounted directly
                   under that directory Otherwise it will be under `SERVICE_BINDING_ROOT`/<SERVICE-BINDING-NAME>
                 type: string
-              namePrefix:
-                description: NamePrefix is the prefix for environment variables or
-                  file name
+              namingStrategy:
+                description: NamingStrategy defines custom string template for preparing
+                  binding names. It can be pre-defined strategies(i.e none,uppercase),
+                  in case strategy provided in this field isn't defined we are going
+                  to treat the value as a custom template and prepare binding names
+                  accordingly.
                 type: string
               services:
                 description: Services is used to identify multiple backing services.
@@ -184,8 +187,6 @@ spec:
                       description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                         TODO: Add other useful fields. apiVersion, kind, uid?'
                       type: string
-                    namePrefix:
-                      type: string
                     namespace:
                       type: string
                     version:
diff --git a/controllers/reconciler.go b/controllers/reconciler.go
index 8859631e..745a6b7d 100644
--- a/controllers/reconciler.go
+++ b/controllers/reconciler.go
@@ -3,6 +3,7 @@ package controllers
 import (
 	"context"
 	"errors"
+	"github.com/redhat-developer/service-binding-operator/pkg/naming"
 
 	"k8s.io/apimachinery/pkg/api/meta"
 
@@ -123,7 +124,9 @@ func (r *ServiceBindingReconciler) doReconcile(request reconcile.Request) (recon
 			sbr.GetNamespace(),
 			sbr.Spec.Services,
 			sbr.Spec.DetectBindingResources,
+			sbr.Spec.BindAsFiles,
 			r.restMapper,
+			sbr.Spec.NamingTemplate(),
 		)
 		if err != nil {
 			//handle service not found error
@@ -149,16 +152,29 @@ func (r *ServiceBindingReconciler) doReconcile(request reconcile.Request) (recon
 				}
 			}
 			return requeueError(err)
-
 		}
 	}
 	binding, err := buildBinding(
 		r.dynClient,
 		sbr.Spec.Mappings,
 		serviceCtxs,
-		sbr.Spec.NamePrefix,
+		sbr.Spec.NamingTemplate(),
 	)
 	if err != nil {
+		if errors.Is(err, naming.TemplateError) {
+			err = updateSBRConditions(r.dynClient, sbr,
+				metav1.Condition{
+					Type:    v1alpha1.CollectionReady,
+					Status:  metav1.ConditionFalse,
+					Reason:  v1alpha1.NamingStrategyError,
+					Message: err.Error(),
+				},
+			)
+			if err != nil {
+				logger.Error(err, "Failed to update SBR conditions", "sbr", sbr)
+			}
+			return done()
+		}
 		return requeueError(err)
 	}
 
diff --git a/controllers/retriever.go b/controllers/retriever.go
index dc550e0e..e5203797 100644
--- a/controllers/retriever.go
+++ b/controllers/retriever.go
@@ -10,6 +10,7 @@ import (
 	"github.com/redhat-developer/service-binding-operator/api/v1alpha1"
 	"github.com/redhat-developer/service-binding-operator/pkg/envvars"
 	"github.com/redhat-developer/service-binding-operator/pkg/log"
+	"github.com/redhat-developer/service-binding-operator/pkg/naming"
 )
 
 // retriever reads all data referred in plan instance, and store in a secret.
@@ -32,27 +33,42 @@ func createServiceIndexPath(name string, gvk schema.GroupVersionKind) []string {
 
 }
 
-func buildServiceEnvVars(svcCtx *serviceContext, globalNamePrefix string) (map[string]string, error) {
-	prefixes := []string{}
-	if len(globalNamePrefix) > 0 {
-		prefixes = append(prefixes, globalNamePrefix)
+func buildServiceEnvVars(svcCtx *serviceContext, namingTemplate string) (map[string]string, error) {
+	bindingNames := map[string]string{}
+	svcCtx.namingTemplate = namingTemplate
+	data := map[string]interface{}{}
+
+	listEnvVars, err := envvars.Build(svcCtx.envVars, "")
+	if err != nil {
+		return nil, err
+	}
+
+	if svcCtx.service == nil {
+		svcCtx.service = &unstructured.Unstructured{Object: data}
 	}
-	if svcCtx.namePrefix != nil && len(*svcCtx.namePrefix) > 0 {
-		prefixes = append(prefixes, *svcCtx.namePrefix)
+
+	t, err := naming.NewTemplate(namingTemplate, svcCtx.service.Object)
+	if err != nil {
+		return bindingNames, err
 	}
-	if svcCtx.namePrefix == nil {
-		prefixes = append(prefixes, svcCtx.service.GroupVersionKind().Kind)
+
+	for k, v := range listEnvVars {
+		bindingName, err := t.GetBindingName(k)
+		if err != nil {
+			return bindingNames, err
+		}
+		bindingNames[bindingName] = v
 	}
 
-	return envvars.Build(svcCtx.envVars, prefixes...)
+	return bindingNames, nil
 }
 
 func (r *retriever) processServiceContext(
 	svcCtx *serviceContext,
 	mappingsCtx map[string]interface{},
-	globalNamePrefix string,
+	globalNameStrategy string,
 ) (map[string][]byte, error) {
-	svcEnvVars, err := buildServiceEnvVars(svcCtx, globalNamePrefix)
+	svcEnvVars, err := buildServiceEnvVars(svcCtx, globalNameStrategy)
 	if err != nil {
 		return nil, err
 	}
@@ -109,7 +125,7 @@ func (r *retriever) processServiceContext(
 
 // ProcessServiceContexts returns environment variables and volume keys from a ServiceContext slice.
 func (r *retriever) ProcessServiceContexts(
-	globalNamePrefix string,
+	globalNameStrategy string,
 	svcCtxs serviceContextList,
 	envVarTemplates []v1alpha1.Mapping,
 ) (map[string][]byte, error) {
@@ -117,7 +133,7 @@ func (r *retriever) ProcessServiceContexts(
 	envVars := make(map[string][]byte)
 
 	for _, svcCtx := range svcCtxs {
-		s, err := r.processServiceContext(svcCtx, mappingsCtx, globalNamePrefix)
+		s, err := r.processServiceContext(svcCtx, mappingsCtx, globalNameStrategy)
 		if err != nil {
 			return nil, err
 		}
diff --git a/controllers/service.go b/controllers/service.go
index 3b07c395..7e6ef076 100644
--- a/controllers/service.go
+++ b/controllers/service.go
@@ -213,7 +213,8 @@ func getOwnedResources(
 func buildOwnedResourceContext(
 	client dynamic.Interface,
 	obj *unstructured.Unstructured,
-	ownerNamePrefix *string,
+	namingTemplate string,
+	isBindAsFiles bool,
 	restMapper meta.RESTMapper,
 	inputPath string,
 	outputPath string,
@@ -224,7 +225,8 @@ func buildOwnedResourceContext(
 		obj.GetNamespace(),
 		obj.GetObjectKind().GroupVersionKind(),
 		obj.GetName(),
-		ownerNamePrefix,
+		namingTemplate,
+		isBindAsFiles,
 		restMapper,
 		nil,
 	)
@@ -238,7 +240,8 @@ func buildOwnedResourceContext(
 func buildOwnedResourceContexts(
 	client dynamic.Interface,
 	objs []*unstructured.Unstructured,
-	ownerNamePrefix *string,
+	namingTemplate string,
+	isBindAsFiles bool,
 	restMapper meta.RESTMapper,
 ) ([]*serviceContext, error) {
 	ctxs := make(serviceContextList, 0)
@@ -251,7 +254,8 @@ func buildOwnedResourceContexts(
 			svcCtx, err := buildOwnedResourceContext(
 				client,
 				obj,
-				ownerNamePrefix,
+				namingTemplate,
+				isBindAsFiles,
 				restMapper,
 				br.inputPath,
 				br.outputPath,
diff --git a/controllers/servicebinder.go b/controllers/servicebinder.go
index c44317ab..9be2b97b 100644
--- a/controllers/servicebinder.go
+++ b/controllers/servicebinder.go
@@ -246,7 +246,6 @@ func (b *serviceBinder) onError(
 func isApplicationEmpty(
 	application *v1alpha1.Application,
 ) bool {
-	fmt.Println("Current APPLICATION IS : ", application)
 	if application == nil {
 		return true
 	}
@@ -463,10 +462,10 @@ func buildBinding(
 	client dynamic.Interface,
 	mappings []v1alpha1.Mapping,
 	svcCtxs serviceContextList,
-	globalNamePrefix string,
+	namingTemplate string,
 ) (*internalBinding, error) {
 	envVars, err := NewRetriever(client).
-		ProcessServiceContexts(globalNamePrefix, svcCtxs, mappings)
+		ProcessServiceContexts(namingTemplate, svcCtxs, mappings)
 	if err != nil {
 		return nil, err
 	}
diff --git a/controllers/servicecontext.go b/controllers/servicecontext.go
index 95a386db..56e71281 100644
--- a/controllers/servicecontext.go
+++ b/controllers/servicecontext.go
@@ -22,8 +22,9 @@ type serviceContext struct {
 	service *unstructured.Unstructured
 	// envVars contains the service's contributed environment variables.
 	envVars map[string]interface{}
-	// namePrefix indicates the prefix to use in environment variables.
-	namePrefix *string
+	// namingTemplate contains name template used to prepare custom env variable key.
+	namingTemplate string
+	bindAsFiles    bool
 	// Id indicates a name the service can be referred in custom environment variables.
 	id *string
 }
@@ -55,7 +56,9 @@ func buildServiceContexts(
 	defaultNs string,
 	selectors []v1alpha1.Service,
 	includeServiceOwnedResources *bool,
+	isBindAsFiles bool,
 	restMapper meta.RESTMapper,
+	namingTemplate string,
 ) (serviceContextList, error) {
 	svcCtxs := make(serviceContextList, 0)
 
@@ -64,7 +67,7 @@ SELECTORS:
 		ns := stringValueOrDefault(s.Namespace, defaultNs)
 		gvk := schema.GroupVersionKind{Kind: s.Kind, Version: s.Version, Group: s.Group}
 		svcCtx, err := buildServiceContext(logger.WithName("buildServiceContexts"), client, ns, gvk,
-			s.Name, s.NamePrefix, restMapper, s.Id)
+			s.Name, namingTemplate, isBindAsFiles, restMapper, s.Id)
 
 		if err != nil {
 			// best effort approach; should not break in common cases such as a unknown annotation
@@ -80,10 +83,6 @@ SELECTORS:
 
 		if includeServiceOwnedResources != nil && *includeServiceOwnedResources {
 			// use the selector's kind as owned resources environment variable prefix
-			svcNamePrefix := svcCtx.namePrefix
-			if svcNamePrefix == nil {
-				svcNamePrefix = &s.Kind
-			}
 			ownedResourcesCtxs, err := findOwnedResourcesCtxs(
 				logger,
 				client,
@@ -91,7 +90,8 @@ SELECTORS:
 				svcCtx.service.GetName(),
 				svcCtx.service.GetUID(),
 				gvk,
-				svcNamePrefix,
+				namingTemplate,
+				isBindAsFiles,
 				restMapper,
 			)
 			if err != nil {
@@ -111,7 +111,8 @@ func findOwnedResourcesCtxs(
 	name string,
 	uid types.UID,
 	gvk schema.GroupVersionKind,
-	namePrefix *string,
+	namingTemplate string,
+	isBindAsFiles bool,
 	restMapper meta.RESTMapper,
 ) (serviceContextList, error) {
 	ownedResources, err := getOwnedResources(
@@ -129,7 +130,8 @@ func findOwnedResourcesCtxs(
 	return buildOwnedResourceContexts(
 		client,
 		ownedResources,
-		namePrefix,
+		namingTemplate,
+		isBindAsFiles,
 		restMapper,
 	)
 }
@@ -191,7 +193,8 @@ func buildServiceContext(
 	ns string,
 	gvk schema.GroupVersionKind,
 	name string,
-	namePrefix *string,
+	namingTemplate string,
+	bindAsFiles bool,
 	restMapper meta.RESTMapper,
 	id *string,
 ) (*serviceContext, error) {
@@ -249,15 +252,16 @@ func buildServiceContext(
 		// runHandler modifies 'outputObj', and 'envVars' in place.
 		err := runHandler(client, obj, outputObj, k, v, envVars, restMapper)
 		if err != nil {
-			logger.Debug("Failed executing runHandler", "Error", err)
+			logger.Debug("Failed executing runHandler in envars", "Error", err)
 		}
 	}
 
 	serviceCtx := &serviceContext{
-		service:    outputObj,
-		envVars:    envVars,
-		namePrefix: namePrefix,
-		id:         id,
+		service:        outputObj,
+		envVars:        envVars,
+		namingTemplate: namingTemplate,
+		bindAsFiles:    bindAsFiles,
+		id:             id,
 	}
 
 	return serviceCtx, nil
diff --git a/docs/User_Guide.md b/docs/User_Guide.md
index 37039166..e0c82312 100644
--- a/docs/User_Guide.md
+++ b/docs/User_Guide.md
@@ -11,8 +11,8 @@
   * [Detect Binding Resources](#Detect-binding-resources)
   * [Compose custom binding variables](#Compose-custom-binding-variables)
 
+- [Configuring custom naming strategy for binding names](#Custom-Naming-Strategy)
 - [Accessing the binding data from the application](#Accessing-the-binding-data-from-the-application)
-
 - [Binding non podSpec based application workloads](#Binding-non-podSpec-based-application-workloads)
 
 - [Custom Containers Path and Secret Path](#Custom-Containers-Path-and-Secret-Path)
@@ -89,13 +89,13 @@ to express an intent to bind your workload with one or more service resources, b
 
 If the backing service hasn't provided any binding metadata, the application author may annotate the Kubernetes resource representing the backing service such that the managed binding secret generated has the necessary binding information.
 
-As an application author, you have a couple of options to extract binding information 
-from the backing service: 
+As an application author, you have a couple of options to extract binding information
+from the backing service:
 
 * Decorate the backing service resource using annotations.
 * Define custom binding variables.
 
-In the following section, details of the above methods to make 
+In the following section, details of the above methods to make
 a backing service consumable for your application workload, is explained.
 
 ## Annotate Service Resources
@@ -148,7 +148,7 @@ spec:
     resource: deployments
 
  services:
-  - group: postgresql.baiju.dev 
+  - group: postgresql.baiju.dev
     version: v1alpha1
     kind: Database
     name: db-demo   <--- Database service
@@ -175,11 +175,11 @@ spec:
     ## From both the services!
     - name: EXAMPLE_VARIABLE
       value: '{{ .postgresDB.status.dbName }}{{ translationService.status.secretName}}'
-   
-    ## Generate JSON. 
+
+    ## Generate JSON.
     - name: DB_JSON
       value: {{ json .postgresDB.status }}
-    
+
 ```
 
 This has been adopted in [IBM CodeEngine](https://cloud.ibm.com/docs/codeengine?topic=codeengine-kn-service-binding).
@@ -329,10 +329,101 @@ The following table summarizes how the final bind path is computed:
 | /home/foo       | non-existent         | /home/foo                            |
 | /home/foo       | /some/path/root      | /some/path/root/ServiceBinding_Name  |
 
+## Custom naming strategy
+Binding names declared through annotations or CSV descriptors are processed before injected into the application according to the following strategy
+ - names are upper-cased
+ - service resource kind is upper-cased and prepended to the name
+
+example:
+```yaml
+DATABASE_HOST: example.com
+```
+`DATABASE` is backend service `Kind` and `HOST` is the binding name.
+
+With custom naming strategy/templates we can build custom binding names.
+
+Naming strategy defines a way to prepare binding names through
+ServiceBinding request.
+
+1. We have a nodejs application which connects to database.
+2. Application mostly requires host address and exposed port information.
+3. Application access this information through binding names.
+
+
+###How ?
+Following fields are part of `ServiceBinding` request.
+- Application
+```yaml
+  application:
+    name: nodejs-app
+    group: apps
+    version: v1
+    resource: deployments
+```
+
+- Backend/Database Service
+```yaml
+namingStrategy: 'POSTGRES_{{ .service.kind | upper }}_{{ .name | upper }}_ENV'
+services:
+  - group: postgresql.baiju.dev
+    version: v1alpha1
+    kind: Database
+    name: db-demo
+```
+
+Considering following are the fields exposed by above service to use for binding
+1. host
+2. port
+
+We have applied `POSTGRES_{{ .service.kind | upper }}_{{ .name | upper }}_ENV` naming strategy
+1. `.name` refers to the binding name specified in the crd annotation or descriptor.
+2. `.service` refer to the services in the `ServiceBinding` request.
+3. `upper` is the string function used to postprocess the string while compiling the template string.
+4. `POSTGRES` is the prefix used.
+5. `ENV` is the suffix used.
+
+Following would be list of binding names prepared by above `ServiceBinding`
+
+```yaml
+POSTGRES_DATABASE_HOST_ENV: example.com
+POSTGRES_DATABASE_PORT_ENV: 8080
+```
+
+We can define how that key should be prepared defining string template in `namingStrategy`
+
+#### Naming Strategies
+
+There are few naming strategies predefine.
+1. `none` - When this is applied, we get binding names in following form - `{{ .name }}`
+```yaml
+host: example.com
+port: 8080
+```
+
+
+2. `uppercase` - This is by uppercase set when no `namingStrategy` is defined and `bindAsFiles` set to false - `{{ .service.kind | upper}}_{{ .name | upper }}`
+
+```yaml
+DATABASE_HOST: example.com
+DATABASE_PORT: 8080
+```
+
+3. `lowercase` - This is by default set when `bindAsFiles` set to true -`{{ .name | lower }}`
+
+```yaml
+host: example.com
+port: 8080
+```
+
+#### Predefined string post processing functions
+1. `upper` - Capatalize all letters
+2. `lower` - Lowercase all letters
+3. `title` - Title case all letters.
+
 
 # Binding non-podSpec-based application workloads
 
-If your application is to be deployed as a non-podSPec-based workload such that the containers path should bind at a custom location, the `ServiceBinding` API provides an API to achieve that. 
+If your application is to be deployed as a non-podSPec-based workload such that the containers path should bind at a custom location, the `ServiceBinding` API provides an API to achieve that.
 
 
 ``` yaml
@@ -558,7 +649,7 @@ spec:
     ```
     - path: data.dbcredentials
       x-descriptors:
-        - urn:alm:descriptor:io.kubernetes:Secret 
+        - urn:alm:descriptor:io.kubernetes:Secret
         - service.binding
     ```
 
@@ -580,7 +671,7 @@ spec:
     ```
     - path: data.dbConfiguration
       x-descriptors:
-        - urn:alm:descriptor:io.kubernetes:ConfigMap 
+        - urn:alm:descriptor:io.kubernetes:ConfigMap
         - service.binding
     ```
 
diff --git a/examples/pod_spec_path/README.md b/examples/pod_spec_path/README.md
index 9403a3e4..685c2145 100644
--- a/examples/pod_spec_path/README.md
+++ b/examples/pod_spec_path/README.md
@@ -95,7 +95,6 @@ kind: ServiceBinding
 metadata:
     name: binding-request-sample
 spec:
-    namePrefix: qiye111
     application:
         name: demo-appconfig
         group: stable.example.com
@@ -109,7 +108,6 @@ spec:
         kind: Database
         name: db-demo
         id: zzz
-        namePrefix: qiye
 EOD
 ```
 
diff --git a/examples/route_k8s_resource/README.md b/examples/route_k8s_resource/README.md
index c21512e4..e4c0aba6 100644
--- a/examples/route_k8s_resource/README.md
+++ b/examples/route_k8s_resource/README.md
@@ -57,7 +57,7 @@ deployment.apps/hello-app created
 We can verify that the app is running by checking the Deployment is available:
 
 ``` shell
-$ kubectl get deployment hello-app -n service-binding-demo -o wide                             
+$ kubectl get deployment hello-app -n service-binding-demo -o wide
 NAME        READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS        IMAGES                      SELECTOR
 hello-app   1/1     1            1           3m2s   hello-openshift   openshift/hello-openshift   app=hello-app
 ```
diff --git a/pkg/envvars/envvars.go b/pkg/envvars/envvars.go
index cc874512..ef4602b3 100644
--- a/pkg/envvars/envvars.go
+++ b/pkg/envvars/envvars.go
@@ -89,7 +89,6 @@ func buildEnvVarName(path []string) string {
 	}
 	envVar := strings.Join(newPath, "_")
 	envVar = strings.ReplaceAll(envVar, ".", "_")
-	envVar = strings.ToUpper(envVar)
 	return envVar
 }
 
diff --git a/pkg/naming/naming.go b/pkg/naming/naming.go
new file mode 100644
index 00000000..050cc45b
--- /dev/null
+++ b/pkg/naming/naming.go
@@ -0,0 +1,52 @@
+package naming
+
+import (
+	"bytes"
+	"errors"
+	"html/template"
+	"strings"
+)
+
+var TemplateError = errors.New("please check the namingStrategy template provided")
+
+var templateFunctions = map[string]interface{}{
+	"upper": strings.ToUpper,
+	"title": strings.Title,
+	"lower": strings.ToLower,
+}
+
+type namingTemplate struct {
+	template       *template.Template
+	data           map[string]interface{}
+	namingTemplate string
+}
+
+// NewTemplate creates template instance which handles how binding names should be prepared
+// templateStr is being used to format binding name.
+func NewTemplate(templateStr string, data map[string]interface{}) (*namingTemplate, error) {
+	t, err := template.New("template").Funcs(templateFunctions).Parse(templateStr)
+	if err != nil {
+		return nil, err
+	}
+	return &namingTemplate{
+		template:       t,
+		namingTemplate: templateStr,
+		data:           data,
+	}, nil
+}
+
+// GetBindingName prepares binding name which accepts binding name from the OLM descriptor/annotation
+// namingTemplate uses string template provided to build final binding name.
+func (n *namingTemplate) GetBindingName(bindingName string) (string, error) {
+	d := map[string]interface{}{
+		"service": n.data,
+		"name":    bindingName,
+	}
+
+	var tpl bytes.Buffer
+	err := n.template.Execute(&tpl, d)
+	if err != nil {
+		return "", TemplateError
+	}
+	return tpl.String(), nil
+}


Test patch:
diff --git a/controllers/retriever_test.go b/controllers/retriever_test.go
index fa40d00f..b74451e8 100644
--- a/controllers/retriever_test.go
+++ b/controllers/retriever_test.go
@@ -134,82 +134,122 @@ func TestRetrieverProcessServiceContexts(t *testing.T) {
 func TestBuildServiceEnvVars(t *testing.T) {
 
 	type testCase struct {
-		ctx              *serviceContext
-		globalNamePrefix string
-		expected         map[string]string
+		ctx      *serviceContext
+		expected map[string]string
 	}
 
 	cr := mocks.UnstructuredDatabaseCRMock("namespace", "name")
 
-	serviceNamePrefix := "serviceprefix"
-	emptyString := ""
+	noneNamingStrategy := "{{ .name }}"
+	bindAsFilesNaming := "{{ .name | lower}}"
+	customNamingStrategy := "CUSTOM_{{ .service.kind | upper }}_{{ .name | upper }}"
 
 	testCases := []testCase{
 		{
-			globalNamePrefix: "",
 			ctx: &serviceContext{
-				namePrefix: &emptyString,
+				service:        cr,
+				namingTemplate: "{{ .name }}",
+				envVars: map[string]interface{}{
+					"apiKey": map[string]interface{}{
+						"key": "my-secret-key",
+					},
+				},
+			},
+			expected: map[string]string{
+				"apiKey_key": "my-secret-key",
+			},
+		},
+		{
+			ctx: &serviceContext{
+				service:        cr,
+				namingTemplate: noneNamingStrategy,
+				envVars: map[string]interface{}{
+					"apiKey": map[string]interface{}{
+						"key": "my-secret-key",
+					},
+				},
+			},
+			expected: map[string]string{
+				"apiKey_key": "my-secret-key",
+			},
+		},
+		{
+			ctx: &serviceContext{
+				service:        cr,
+				namingTemplate: noneNamingStrategy,
+				envVars: map[string]interface{}{
+					"apiKey": map[string]interface{}{
+						"key": "my-secret-key",
+					},
+				},
+			},
+			expected: map[string]string{
+				"apiKey_key": "my-secret-key",
+			},
+		},
+		{
+			ctx: &serviceContext{
+				namingTemplate: noneNamingStrategy,
 				envVars: map[string]interface{}{
 					"apiKey": "my-secret-key",
 				},
 			},
 			expected: map[string]string{
-				"APIKEY": "my-secret-key",
+				"apiKey": "my-secret-key",
 			},
 		},
 		{
-			globalNamePrefix: "globalprefix",
 			ctx: &serviceContext{
-				namePrefix: &emptyString,
+				service:        cr,
+				namingTemplate: noneNamingStrategy,
 				envVars: map[string]interface{}{
 					"apiKey": "my-secret-key",
 				},
 			},
 			expected: map[string]string{
-				"GLOBALPREFIX_APIKEY": "my-secret-key",
+				"apiKey": "my-secret-key",
 			},
 		},
 		{
-			globalNamePrefix: "globalprefix",
 			ctx: &serviceContext{
-				namePrefix: &serviceNamePrefix,
+				namingTemplate: noneNamingStrategy,
+				service:        cr,
 				envVars: map[string]interface{}{
 					"apiKey": "my-secret-key",
 				},
 			},
 			expected: map[string]string{
-				"GLOBALPREFIX_SERVICEPREFIX_APIKEY": "my-secret-key",
+				"apiKey": "my-secret-key",
 			},
 		},
 		{
-			globalNamePrefix: "",
 			ctx: &serviceContext{
-				service:    cr,
-				namePrefix: nil,
+				namingTemplate: bindAsFilesNaming,
+				service:        cr,
 				envVars: map[string]interface{}{
 					"apiKey": "my-secret-key",
 				},
 			},
 			expected: map[string]string{
-				"DATABASE_APIKEY": "my-secret-key",
+				"apikey": "my-secret-key",
 			},
 		},
 		{
-			globalNamePrefix: "",
 			ctx: &serviceContext{
-				namePrefix: &serviceNamePrefix,
+				namingTemplate: customNamingStrategy,
+				service:        cr,
 				envVars: map[string]interface{}{
 					"apiKey": "my-secret-key",
 				},
 			},
 			expected: map[string]string{
-				"SERVICEPREFIX_APIKEY": "my-secret-key",
+				"CUSTOM_DATABASE_APIKEY": "my-secret-key",
 			},
 		},
 	}
 
 	for _, tc := range testCases {
-		actual, err := buildServiceEnvVars(tc.ctx, tc.globalNamePrefix)
+		actual, err := buildServiceEnvVars(tc.ctx, tc.ctx.namingTemplate)
 		require.NoError(t, err)
 		require.Equal(t, tc.expected, actual)
 	}
diff --git a/controllers/service_test.go b/controllers/service_test.go
index de666fee..9c661a77 100644
--- a/controllers/service_test.go
+++ b/controllers/service_test.go
@@ -203,21 +203,21 @@ func TestLoadDescriptor(t *testing.T) {
 
 func TestBuildOwnerResourceContext(t *testing.T) {
 	ns := "planner"
+	namingTemplate := "{{ .service.kind | upper }}_{{ .name | upper }}"
+
 	f := mocks.NewFake(t, ns)
 
 	obj := f.AddMockedUnstructuredSecret("secret")
 
 	type testCase struct {
-		inputPath       string
-		outputPath      string
-		ownerNamePrefix *string
+		inputPath  string
+		outputPath string
 	}
 
 	testCases := []testCase{
 		{
-			inputPath:       "data.user",
-			outputPath:      "user",
-			ownerNamePrefix: nil,
+			inputPath:  "data.user",
+			outputPath: "user",
 		},
 	}
 
@@ -225,7 +225,8 @@ func TestBuildOwnerResourceContext(t *testing.T) {
 		got, err := buildOwnedResourceContext(
 			f.FakeDynClient(),
 			obj,
-			tc.ownerNamePrefix,
+			namingTemplate,
+			false,
 			testutils.BuildTestRESTMapper(),
 			tc.inputPath,
 			tc.outputPath,
diff --git a/controllers/servicecontext_test.go b/controllers/servicecontext_test.go
index 8847dfee..51355cff 100644
--- a/controllers/servicecontext_test.go
+++ b/controllers/servicecontext_test.go
@@ -19,12 +19,13 @@ func TestBuildServiceContexts(t *testing.T) {
 	logger := log.NewLog("testBuildServiceContexts")
 	restMapper := testutils.BuildTestRESTMapper()
 	falseBool := false
+	namingTemplate := "{{ .service.kind | upper }}_{{ .name | upper }}"
 
 	t.Run("empty selectors", func(t *testing.T) {
 		ns := "planner"
 		f := mocks.NewFake(t, ns)
 		serviceCtxs, err := buildServiceContexts(
-			logger, f.FakeDynClient(), ns, nil, &falseBool, restMapper)
+			logger, f.FakeDynClient(), ns, nil, &falseBool, false, restMapper, namingTemplate)
 
 		require.NoError(t, err, "buildServiceContexts must execute without errors")
 		require.Empty(t, serviceCtxs, "buildServiceContexts must be empty")
@@ -48,7 +49,7 @@ func TestBuildServiceContexts(t *testing.T) {
 		sbr := f.AddMockedServiceBinding(sbrName, nil, firstResourceRef, "", deploymentsGVR, matchLabels)
 
 		serviceCtxs, err := buildServiceContexts(
-			logger, f.FakeDynClient(), firstNamespace, sbr.Spec.Services, &falseBool, restMapper)
+			logger, f.FakeDynClient(), firstNamespace, sbr.Spec.Services, &falseBool, false, restMapper, namingTemplate)
 
 		require.NoError(t, err, "buildServiceContexts must execute without errors")
 		require.Len(t, serviceCtxs, 1, "buildServiceContexts must return only one item")
@@ -119,7 +120,7 @@ func TestBuildServiceContexts(t *testing.T) {
 		}
 
 		serviceCtxs, err := buildServiceContexts(
-			logger, f.FakeDynClient(), sameNs, sbr.Spec.Services, &falseBool, restMapper)
+			logger, f.FakeDynClient(), sameNs, sbr.Spec.Services, &falseBool, false, restMapper, namingTemplate)
 
 		require.NoError(t, err, "buildServiceContexts must execute without errors")
 		require.Len(t, serviceCtxs, 2, "buildServiceContexts must return both service contexts")
@@ -164,6 +165,8 @@ func TestFindOwnedResourcesCtxs_ConfigMap(t *testing.T) {
 		"connects-to": "database",
 		"environment": "planner",
 	}
+	nameTemplate := "{{ .service.kind | upper }}_{{ .name | upper }}"
+
 	f := mocks.NewFake(t, ns)
 	sbr := f.AddMockedServiceBinding(name, nil, backendService, "", deploymentsGVR, matchLabels)
 	sbr.Spec.DetectBindingResources = &trueBool
@@ -203,7 +206,8 @@ func TestFindOwnedResourcesCtxs_ConfigMap(t *testing.T) {
 			cr.GetName(),
 			cr.GetUID(),
 			cr.GroupVersionKind(),
-			nil,
+			nameTemplate,
+			false,
 			restMapper,
 		)
 		require.NoError(t, err)
@@ -221,6 +225,8 @@ func TestFindOwnedResourcesCtxs_ConfigMap(t *testing.T) {
 }
 
 func TestFindOwnedResourcesCtxs_Secrets(t *testing.T) {
+	namingTemplate := "{{ .service.kind | upper }}_{{ .name | upper }}"
+
 	testCases := []struct {
 		desc    string
 		secrets []string
@@ -267,7 +273,8 @@ func TestFindOwnedResourcesCtxs_Secrets(t *testing.T) {
 				cr.GetName(),
 				cr.GetUID(),
 				cr.GroupVersionKind(),
-				nil,
+				namingTemplate,
+				false,
 				restMapper,
 			)
 			require.NoError(t, err)
diff --git a/pkg/envvars/envvars_test.go b/pkg/envvars/envvars_test.go
index 14a368d0..bb219791 100644
--- a/pkg/envvars/envvars_test.go
+++ b/pkg/envvars/envvars_test.go
@@ -19,9 +19,9 @@ func TestBuild(t *testing.T) {
 		{
 			name: "should create envvars without prefix",
 			expected: map[string]string{
-				"STATUS_LISTENERS_0_TYPE":             "secure",
-				"STATUS_LISTENERS_0_ADDRESSES_0_HOST": "my-cluster-kafka-bootstrap.coffeeshop.svc",
-				"STATUS_LISTENERS_0_ADDRESSES_0_PORT": "9093",
+				"status_listeners_0_type":             "secure",
+				"status_listeners_0_addresses_0_host": "my-cluster-kafka-bootstrap.coffeeshop.svc",
+				"status_listeners_0_addresses_0_port": "9093",
 			},
 			src: map[string]interface{}{
 				"status": map[string]interface{}{
@@ -42,9 +42,9 @@ func TestBuild(t *testing.T) {
 		{
 			name: "should create envvars with service prefix",
 			expected: map[string]string{
-				"KAFKA_STATUS_LISTENERS_0_TYPE":             "secure",
-				"KAFKA_STATUS_LISTENERS_0_ADDRESSES_0_HOST": "my-cluster-kafka-bootstrap.coffeeshop.svc",
-				"KAFKA_STATUS_LISTENERS_0_ADDRESSES_0_PORT": "9093",
+				"kafka_status_listeners_0_type":             "secure",
+				"kafka_status_listeners_0_addresses_0_host": "my-cluster-kafka-bootstrap.coffeeshop.svc",
+				"kafka_status_listeners_0_addresses_0_port": "9093",
 			},
 			path: []string{"kafka"},
 			src: map[string]interface{}{
@@ -66,9 +66,9 @@ func TestBuild(t *testing.T) {
 		{
 			name: "should create envvars with binding and service prefixes",
 			expected: map[string]string{
-				"BINDING_KAFKA_STATUS_LISTENERS_0_TYPE":             "secure",
-				"BINDING_KAFKA_STATUS_LISTENERS_0_ADDRESSES_0_HOST": "my-cluster-kafka-bootstrap.coffeeshop.svc",
-				"BINDING_KAFKA_STATUS_LISTENERS_0_ADDRESSES_0_PORT": "9093",
+				"binding_kafka_status_listeners_0_type":             "secure",
+				"binding_kafka_status_listeners_0_addresses_0_host": "my-cluster-kafka-bootstrap.coffeeshop.svc",
+				"binding_kafka_status_listeners_0_addresses_0_port": "9093",
 			},
 			path: []string{"binding", "kafka"},
 			src: map[string]interface{}{
@@ -90,9 +90,9 @@ func TestBuild(t *testing.T) {
 		{
 			name: "should create envvars without prefix",
 			expected: map[string]string{
-				"STATUS_LISTENERS_0_TYPE":             "secure",
-				"STATUS_LISTENERS_0_ADDRESSES_0_HOST": "my-cluster-kafka-bootstrap.coffeeshop.svc",
-				"STATUS_LISTENERS_0_ADDRESSES_0_PORT": "9093",
+				"status_listeners_0_type":             "secure",
+				"status_listeners_0_addresses_0_host": "my-cluster-kafka-bootstrap.coffeeshop.svc",
+				"status_listeners_0_addresses_0_port": "9093",
 			},
 			path: []string{""},
 			src: map[string]interface{}{
@@ -114,7 +114,7 @@ func TestBuild(t *testing.T) {
 		{
 			name: "should create envvar for int64 type",
 			expected: map[string]string{
-				"STATUS_VALUE": "-9223372036",
+				"status_value": "-9223372036",
 			},
 			src: map[string]interface{}{
 				"status": map[string]interface{}{
@@ -139,9 +139,9 @@ func TestBuild(t *testing.T) {
 		{
 			name: "should create envvars for each string in slice",
 			expected: map[string]string{
-				"TAGS_0": "knowledge",
-				"TAGS_1": "is",
-				"TAGS_2": "power",
+				"tags_0": "knowledge",
+				"tags_1": "is",
+				"tags_2": "power",
 			},
 			src: map[string]interface{}{
 				"tags": []string{
diff --git a/pkg/naming/naming_test.go b/pkg/naming/naming_test.go
new file mode 100644
index 00000000..4bde7ec4
--- /dev/null
+++ b/pkg/naming/naming_test.go
@@ -0,0 +1,57 @@
+package naming
+
+import (
+	"errors"
+	"fmt"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestBuildNamingStrategy(t *testing.T) {
+	data := map[string]interface{}{
+		"name": "database",
+		"kind": "Service",
+	}
+
+	dataProvider := []struct {
+		namingTemplate      string
+		bindingName         string
+		expectedBindingName string
+		expectedError       error
+	}{
+		{
+			namingTemplate:      "{{ .service.kind | upper }}",
+			bindingName:         "db",
+			expectedBindingName: "SERVICE",
+		},
+		{
+			namingTemplate:      "{{ .service.kind | upper }}_{{ .name }}",
+			bindingName:         "db",
+			expectedBindingName: "SERVICE_db",
+		},
+		{
+			namingTemplate:      "{{ .service.kind | upper }}_{{ .name | upper }}",
+			bindingName:         "db",
+			expectedBindingName: "SERVICE_DB",
+		},
+		{
+			namingTemplate:      "{{ .wrongfield | upper }}",
+			bindingName:         "db",
+			expectedBindingName: "",
+			expectedError:       errors.New("please check the namingStrategy template provided"),
+		},
+	}
+
+	for _, tt := range dataProvider {
+		t.Run(fmt.Sprintf("Process %s with %s gives %s", tt.bindingName, tt.namingTemplate, tt.expectedBindingName), func(t *testing.T) {
+			template, err := NewTemplate(tt.namingTemplate, data)
+			assert.NoError(t, err)
+			bindingName, err := template.GetBindingName(tt.bindingName)
+			if err != nil {
+				assert.EqualError(t, err, tt.expectedError.Error())
+			}
+			assert.EqualValues(t, tt.expectedBindingName, bindingName)
+		})
+	}
+
+}
diff --git a/test/acceptance/features/bindAppToService.feature b/test/acceptance/features/bindAppToService.feature
index d86e9347..49b52dce 100644
--- a/test/acceptance/features/bindAppToService.feature
+++ b/test/acceptance/features/bindAppToService.feature
@@ -319,7 +319,6 @@ Feature: Bind an application to a service
             metadata:
                 name: binding-request-a-d-c
             spec:
-                namePrefix: REDHAT
                 application:
                     name: nodejs-rest-http-crud-a-d-c
                     group: apps
@@ -331,7 +330,6 @@ Feature: Bind an application to a service
                     kind: Database
                     name: db-demo-a-d-c
                     id: postgresDB
-                    namePrefix: DEVTOOLS
                 mappings:
                     - name: SOME_KEY
                       value: 'SOME_VALUE:{{ .postgresDB.status.dbConnectionPort }}:{{ .postgresDB.status.dbName }}'
@@ -528,6 +526,7 @@ Feature: Bind an application to a service
             metadata:
               name: binding-request-etcd
             spec:
+              namingStrategy: "ETCDCLUSTER_{{ .name | upper }}"
               application:
                 group: apps
                 version: v1
diff --git a/test/acceptance/features/bindWithCustomNamingStrategies.feature b/test/acceptance/features/bindWithCustomNamingStrategies.feature
new file mode 100644
index 00000000..c254cf11
--- /dev/null
+++ b/test/acceptance/features/bindWithCustomNamingStrategies.feature
@@ -0,0 +1,235 @@
+Feature: Bind an application to a service using custom naming strategies
+
+    As a user of Service Binding Operator
+    I want to bind applications to services it depends on
+
+    Background:
+        Given Namespace [TEST_NAMESPACE] is used
+        * Service Binding Operator is running
+        * PostgreSQL DB operator is installed
+
+    Scenario: Bind an application to a service with no naming strategy specified
+        * OLM Operator "backend" is running
+        * The Custom Resource is present
+            """
+            apiVersion: stable.example.com/v1
+            kind: Backend
+            metadata:
+                name: backend-no-naming
+                annotations:
+                    service.binding/host_cross_ns_service: path={.spec.host_cross_ns_service}
+            spec:
+                host_cross_ns_service: cross.ns.service.stable.example.com
+            """
+        * Generic test application "myapp-no-naming" is running
+        When Service Binding is applied
+            """
+            apiVersion: operators.coreos.com/v1alpha1
+            kind: ServiceBinding
+            metadata:
+                name: binding-request-no-naming
+            spec:
+                application:
+                    name: myapp-no-naming
+                    group: apps
+                    version: v1
+                    resource: deployments
+                services:
+                -   group: stable.example.com
+                    version: v1
+                    kind: Backend
+                    name: backend-no-naming
+            """
+        Then Service Binding "binding-request-no-naming" is ready
+        And The application env var "BACKEND_HOST_CROSS_NS_SERVICE" has value "cross.ns.service.stable.example.com"
+
+
+    Scenario: Bind an application to a service with naming strategy none
+        * OLM Operator "backend" is running
+        * The Custom Resource is present
+            """
+            apiVersion: stable.example.com/v1
+            kind: Backend
+            metadata:
+                name: backend-naming-none
+                annotations:
+                    service.binding/host_cross_ns_service: path={.spec.host_cross_ns_service}
+            spec:
+                host_cross_ns_service: cross.ns.service.stable.example.com
+            """
+        * Generic test application "myapp-naming-none" is running
+        When Service Binding is applied
+            """
+            apiVersion: operators.coreos.com/v1alpha1
+            kind: ServiceBinding
+            metadata:
+                name: binding-request-naming-none
+            spec:
+                namingStrategy: none
+                application:
+                    name: myapp-naming-none
+                    group: apps
+                    version: v1
+                    resource: deployments
+                services:
+                -   group: stable.example.com
+                    version: v1
+                    kind: Backend
+                    name: backend-naming-none
+            """
+        Then Service Binding "binding-request-naming-none" is ready
+        And The application env var "host_cross_ns_service" has value "cross.ns.service.stable.example.com"
+
+    Scenario: Bind an application to a service with custom naming strategy
+        * OLM Operator "backend" is running
+        * The Custom Resource is present
+            """
+            apiVersion: stable.example.com/v1
+            kind: Backend
+            metadata:
+                name: backend-custom-naming
+                annotations:
+                    service.binding/host_cross_ns_service: path={.spec.host_cross_ns_service}
+            spec:
+                host_cross_ns_service: cross.ns.service.stable.example.com
+            """
+        * Generic test application "myapp-custom-naming" is running
+        When Service Binding is applied
+            """
+            apiVersion: operators.coreos.com/v1alpha1
+            kind: ServiceBinding
+            metadata:
+                name: binding-request-custom-naming
+            spec:
+                namingStrategy: "PREFIX_{{ .service.kind | upper }}_{{ .name | upper }}_SUFFIX"
+                application:
+                    name: myapp-custom-naming
+                    group: apps
+                    version: v1
+                    resource: deployments
+                services:
+                -   group: stable.example.com
+                    version: v1
+                    kind: Backend
+                    name: backend-custom-naming
+            """
+        Then Service Binding "binding-request-custom-naming" is ready
+        And The application env var "PREFIX_BACKEND_HOST_CROSS_NS_SERVICE_SUFFIX" has value "cross.ns.service.stable.example.com"
+
+    Scenario: Bind an application to a service with bind as file and no naming strategy
+        * OLM Operator "backend" is running
+        * The Custom Resource is present
+            """
+            apiVersion: stable.example.com/v1
+            kind: Backend
+            metadata:
+                name: backend-bind-files
+                annotations:
+                    service.binding/host_cross_ns_service: path={.spec.host_cross_ns_service}
+            spec:
+                host_cross_ns_service: cross.ns.service.stable.example.com
+            """
+        * Generic test application "myapp-bind-files" is running
+        When Service Binding is applied
+            """
+            apiVersion: operators.coreos.com/v1alpha1
+            kind: ServiceBinding
+            metadata:
+                name: binding-request-bind-files
+            spec:
+                bindAsFiles: true
+                application:
+                    name: myapp-bind-files
+                    group: apps
+                    version: v1
+                    resource: deployments
+                services:
+                -   group: stable.example.com
+                    version: v1
+                    kind: Backend
+                    name: backend-bind-files
+            """
+        Then Service Binding "binding-request-bind-files" is ready
+        And The env var "host_cross_ns_service" is not available to the application
+        And Content of file "/bindings/binding-request-bind-files/host_cross_ns_service" in application pod is
+            """
+            cross.ns.service.stable.example.com
+            """
+
+    Scenario: Bind an application to a service with bind files and custom naming strategy
+        * OLM Operator "backend" is running
+        * The Custom Resource is present
+            """
+            apiVersion: stable.example.com/v1
+            kind: Backend
+            metadata:
+                name: backend-custom-file-naming
+                annotations:
+                    service.binding/host_cross_ns_service: path={.spec.host_cross_ns_service}
+            spec:
+                host_cross_ns_service: cross.ns.service.stable.example.com
+            """
+        * Generic test application "myapp-custom-file-naming" is running
+        When Service Binding is applied
+            """
+            apiVersion: operators.coreos.com/v1alpha1
+            kind: ServiceBinding
+            metadata:
+                name: binding-request-custom-file-naming
+            spec:
+                namingStrategy: "PREFIX_{{ .service.kind | upper }}_{{ .name | upper }}_SUFFIX"
+                mountPath: "/foo/bar"
+                bindAsFiles: true
+                application:
+                    name: myapp-custom-file-naming
+                    group: apps
+                    version: v1
+                    resource: deployments
+                services:
+                -   group: stable.example.com
+                    version: v1
+                    kind: Backend
+                    name: backend-custom-file-naming
+            """
+        Then Service Binding "binding-request-custom-file-naming" is ready
+        And Content of file "/foo/bar/PREFIX_BACKEND_HOST_CROSS_NS_SERVICE_SUFFIX" in application pod is
+            """
+            cross.ns.service.stable.example.com
+            """
+
+    @error-naming
+    Scenario: Bind an application to a service with naming strategy error
+        * OLM Operator "backend" is running
+        * The Custom Resource is present
+            """
+            apiVersion: stable.example.com/v1
+            kind: Backend
+            metadata:
+                name: backend-naming-error
+                annotations:
+                    service.binding/host_cross_ns_service: path={.spec.host_cross_ns_service}
+            spec:
+                host_cross_ns_service: cross.ns.service.stable.example.com
+            """
+        * Generic test application "myapp-naming-error" is running
+        When Service Binding is applied
+            """
+            apiVersion: operators.coreos.com/v1alpha1
+            kind: ServiceBinding
+            metadata:
+                name: binding-request-naming-error
+            spec:
+                namingStrategy: "{{ .service.test.name | lower }}_incorrect"
+                application:
+                    name: myapp-naming-error
+                    group: apps
+                    version: v1
+                    resource: deployments
+                services:
+                -   group: stable.example.com
+                    version: v1
+                    kind: Backend
+                    name: backend-naming-error
+            """
+        Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-request-naming-error" should be changed to "False"
+        Then jq ".status.conditions[] | select(.type=="CollectionReady").reason" of Service Binding "binding-request-naming-error" should be changed to "NamingStrategyError"
diff --git a/test/acceptance/features/deleteBackendServiceAndRecreate.feature b/test/acceptance/features/deleteBackendServiceAndRecreate.feature
index a0688ce3..2c56e2ff 100644
--- a/test/acceptance/features/deleteBackendServiceAndRecreate.feature
+++ b/test/acceptance/features/deleteBackendServiceAndRecreate.feature
@@ -6,7 +6,7 @@ Feature: Reconcile when BackingService CR got deleted and recreated
     Background:
         Given Namespace [TEST_NAMESPACE] is used
         * Service Binding Operator is running
-    Scenario: Reconcile when BackingService CR got deleted and recreated 
+    Scenario: Reconcile when BackingService CR got deleted and recreated
         Given OLM Operator "backend" is running
         And Generic test application "ssa-3" is running
         And The Custom Resource Definition is present
diff --git a/test/acceptance/features/injectBindingsAsFiles.feature b/test/acceptance/features/injectBindingsAsFiles.feature
index f1a6b854..66c525f6 100644
--- a/test/acceptance/features/injectBindingsAsFiles.feature
+++ b/test/acceptance/features/injectBindingsAsFiles.feature
@@ -51,15 +51,15 @@ Feature: Bindings get injected as files in application
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-backend-vm-01" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-backend-vm-01" should be changed to "True"
-        And The env var "BACKEND_HOST" is not available to the application
-        And The env var "BACKEND_PORT" is not available to the application
+        And The env var "host" is not available to the application
+        And The env var "port" is not available to the application
         And The env var "MYHOST" is not available to the application
         And The application env var "SERVICE_BINDING_ROOT" has value "/var/data"
-        And Content of file "/var/data/binding-backend-vm-01/BACKEND_HOST" in application pod is
+        And Content of file "/var/data/binding-backend-vm-01/host" in application pod is
             """
             example.common
             """
-        And Content of file "/var/data/binding-backend-vm-01/BACKEND_PORT" in application pod is
+        And Content of file "/var/data/binding-backend-vm-01/port" in application pod is
             """
             8080
             """
@@ -105,14 +105,14 @@ Feature: Bindings get injected as files in application
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-backend-vm-02" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-backend-vm-02" should be changed to "True"
-        And The env var "BACKEND_HOST" is not available to the application
-        And The env var "BACKEND_PORT" is not available to the application
+        And The env var "host" is not available to the application
+        And The env var "port" is not available to the application
         And The application env var "SERVICE_BINDING_ROOT" has value "/bindings"
-        And Content of file "/bindings/binding-backend-vm-02/BACKEND_HOST" in application pod is
+        And Content of file "/bindings/binding-backend-vm-02/host" in application pod is
             """
             example.common
             """
-        And Content of file "/bindings/binding-backend-vm-02/BACKEND_PORT" in application pod is
+        And Content of file "/bindings/binding-backend-vm-02/port" in application pod is
             """
             8080
             """
@@ -155,14 +155,14 @@ Feature: Bindings get injected as files in application
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-backend-vm-03" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-backend-vm-03" should be changed to "True"
-        And The env var "BACKEND_HOST" is not available to the application
-        And The env var "BACKEND_PORT" is not available to the application
+        And The env var "host" is not available to the application
+        And The env var "port" is not available to the application
         And The env var "SERVICE_BINDING_ROOT" is not available to the application
-        And Content of file "/foo/bar/BACKEND_HOST" in application pod is
+        And Content of file "/foo/bar/host" in application pod is
             """
             example.common
             """
-        And Content of file "/foo/bar/BACKEND_PORT" in application pod is
+        And Content of file "/foo/bar/port" in application pod is
             """
             8080
             """
@@ -210,14 +210,14 @@ Feature: Bindings get injected as files in application
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-backend-vm-04" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-backend-vm-04" should be changed to "True"
-        And The env var "BACKEND_HOST" is not available to the application
-        And The env var "BACKEND_PORT" is not available to the application
+        And The env var "host" is not available to the application
+        And The env var "port" is not available to the application
         And The application env var "SERVICE_BINDING_ROOT" has value "/var/data"
-        And Content of file "/var/data/binding-backend-vm-04/BACKEND_HOST" in application pod is
+        And Content of file "/var/data/binding-backend-vm-04/host" in application pod is
             """
             example.common
             """
-        And Content of file "/var/data/binding-backend-vm-04/BACKEND_PORT" in application pod is
+        And Content of file "/var/data/binding-backend-vm-04/port" in application pod is
             """
             8080
             """
@@ -255,7 +255,6 @@ Feature: Bindings get injected as files in application
                     version: v1
                     kind: Backend
                     name: backend-demo-05
-                    namePrefix: ""
 
                 application:
                     name: generic-app-a-d-u-5
@@ -265,14 +264,14 @@ Feature: Bindings get injected as files in application
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-backend-vm-05" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-backend-vm-05" should be changed to "True"
-        And The env var "HOST" is not available to the application
-        And The env var "PORT" is not available to the application
+        And The env var "host" is not available to the application
+        And The env var "port" is not available to the application
         And The env var "SERVICE_BINDING_ROOT" is not available to the application
-        And Content of file "/foo/bar/HOST" in application pod is
+        And Content of file "/foo/bar/host" in application pod is
             """
             example.common
             """
-        And Content of file "/foo/bar/PORT" in application pod is
+        And Content of file "/foo/bar/port" in application pod is
             """
             8080
             """
@@ -315,14 +314,14 @@ Feature: Bindings get injected as files in application
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-backend-vm-06" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-backend-vm-06" should be changed to "True"
-        And The env var "BACKEND_HOST" is not available to the application
-        And The env var "BACKEND_PORT" is not available to the application
+        And The env var "host" is not available to the application
+        And The env var "port" is not available to the application
         And The env var "SERVICE_BINDING_ROOT" is not available to the application
-        And Content of file "/foo/bar/BACKEND_HOST" in application pod is
+        And Content of file "/foo/bar/host" in application pod is
             """
             example.common
             """
-        And Content of file "/foo/bar/BACKEND_PORT" in application pod is
+        And Content of file "/foo/bar/port" in application pod is
             """
             8080
             """
@@ -349,14 +348,14 @@ Feature: Bindings get injected as files in application
             """
         Then jq ".status.conditions[] | select(.type=="CollectionReady").status" of Service Binding "binding-backend-vm-06" should be changed to "True"
         And jq ".status.conditions[] | select(.type=="InjectionReady").status" of Service Binding "binding-backend-vm-06" should be changed to "True"
-        And The env var "BACKEND_HOST" is not available to the application
-        And The env var "BACKEND_PORT" is not available to the application
+        And The env var "host" is not available to the application
+        And The env var "port" is not available to the application
         And The env var "SERVICE_BINDING_ROOT" is not available to the application
-        And Content of file "/foo/newbar/BACKEND_HOST" in application pod is
+        And Content of file "/foo/newbar/host" in application pod is
             """
             example.common
             """
-        And Content of file "/foo/newbar/BACKEND_PORT" in application pod is
+        And Content of file "/foo/newbar/port" in application pod is
             """
             8080
             """
diff --git a/test/acceptance/features/injectSecretAtCustomSchemaPath.feature b/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
index e1ceeb16..2ddd3ba6 100644
--- a/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
+++ b/test/acceptance/features/injectSecretAtCustomSchemaPath.feature
@@ -59,7 +59,6 @@ Feature: Insert service binding to a custom location in application resource
             metadata:
                 name: binding-request-csp
             spec:
-                namePrefix: qiye111
                 application:
                     name: demo-appconfig-csp
                     group: stable.example.com
@@ -73,7 +72,6 @@ Feature: Insert service binding to a custom location in application resource
                     kind: Database
                     name: db-demo-csp
                     id: zzz
-                    namePrefix: qiye
             """
         Then Service Binding "binding-request-csp" is ready
         And Secret "binding-request-csp" has been injected in to CR "demo-appconfig-csp" of kind "AppConfig" at path "{.spec.spec.containers[0].envFrom[0].secretRef.name}"
@@ -97,7 +95,6 @@ Feature: Insert service binding to a custom location in application resource
             metadata:
                 name: binding-request-ssp
             spec:
-                namePrefix: qiye111
                 application:
                     name: demo-appconfig-ssp
                     group: stable.example.com
@@ -111,7 +108,6 @@ Feature: Insert service binding to a custom location in application resource
                     kind: Database
                     name: db-demo-ssp
                     id: zzz
-                    namePrefix: qiye
             """
         Then Service Binding "binding-request-ssp" is ready
         And Secret "binding-request-ssp" has been injected in to CR "demo-appconfig-ssp" of kind "AppConfig" at path "{.spec.spec.secret}"