{"id":15023892,"url":"https://github.com/sap/sap-btp-service-operator","last_synced_at":"2026-05-28T08:00:42.689Z","repository":{"id":36957048,"uuid":"333437150","full_name":"SAP/sap-btp-service-operator","owner":"SAP","description":"SAP BTP service operator enables developers to connect Kubernetes clusters to SAP BTP accounts and to consume SAP BTP services within the clusters by using Kubernetes native tools.","archived":false,"fork":false,"pushed_at":"2026-05-19T12:32:39.000Z","size":22279,"stargazers_count":139,"open_issues_count":2,"forks_count":58,"subscribers_count":10,"default_branch":"main","last_synced_at":"2026-05-26T01:06:31.737Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SAP.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-01-27T13:55:43.000Z","updated_at":"2026-05-19T12:26:11.000Z","dependencies_parsed_at":"2024-01-07T10:45:16.453Z","dependency_job_id":"997df0a8-df93-4ba7-a666-d775b1d82c91","html_url":"https://github.com/SAP/sap-btp-service-operator","commit_stats":{"total_commits":252,"total_committers":28,"mean_commits":9.0,"dds":0.5436507936507937,"last_synced_commit":"069e9c3705c892c29215615a5d56fb1056fe3742"},"previous_names":[],"tags_count":105,"template":false,"template_full_name":null,"purl":"pkg:github/SAP/sap-btp-service-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SAP%2Fsap-btp-service-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SAP%2Fsap-btp-service-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SAP%2Fsap-btp-service-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SAP%2Fsap-btp-service-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SAP","download_url":"https://codeload.github.com/SAP/sap-btp-service-operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SAP%2Fsap-btp-service-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33599465,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T19:59:35.005Z","updated_at":"2026-05-28T08:00:42.649Z","avatar_url":"https://github.com/SAP.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SAP Business Technology Platform (SAP BTP) Service Operator for Kubernetes\n\n[![REUSE status](https://api.reuse.software/badge/github.com/SAP/sap-btp-service-operator)](https://api.reuse.software/info/github.com/SAP/sap-btp-service-operator)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\nWith the SAP BTP service operator, you can consume [SAP BTP services](https://platformx-d8bd51250.dispatcher.us2.hana.ondemand.com/protected/index.html#/viewServices?) from your Kubernetes cluster using Kubernetes-native tools. \nSAP BTP service operator allows you to provision and manage service instances and service bindings of SAP BTP services so that your Kubernetes-native applications can access and use needed services from the cluster.  \nThe SAP BTP service operator is based on the [Kubernetes Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/).\n\n## Table of Contents\n\n- [Overview and Architecture](#overview-and-architecture)\n- [Prerequisites for Deployment](#prerequisites-for-deployment)\n- [Installation and Setup](#installation-and-setup)\n- [Managing Access Permissions](#managing-access-permissions)\n- [Configuring Multiple Subaccounts](#configuring-multiple-subaccounts)\n- [Using the SAP BTP Service Operator](#using-the-sap-btp-service-operator)\n- [Creating Service Instances](#creating-service-instances)\n- [Managing Service Bindings](#managing-service-bindings)\n- [Service Binding Secret Formats](#service-binding-secret-formats)\n- [Automating Service Binding Rotation](#automating-service-binding-rotation)\n- [Specifying Parameters](#specifying-parameters)\n- [Reference Documentation](#reference-documentation)\n- [Service Instance Properties](#service-instance-properties)\n- [Service Binding Properties](#service-binding-properties)\n- [Uninstalling the SAP BTP Service Operator](#uninstalling-the-sap-btp-service-operator)\n- [License](#license)\n- [Troubleshooting and Support](#troubleshooting-and-support)\n\n## Overview and Architecture\n\nThe SAP BTP Service Operator enables seamless integration with SAP Business Technology Platform (BTP) services by communicating with the [SAP Service Manager](https://help.sap.com/viewer/09cc82baadc542a688176dce601398de/Cloud/en-US/3a27b85a47fc4dff99184dd5bf181e14.html) via the [Open Service Broker API](https://github.com/openservicebrokerapi/servicebroker). It acts as an intermediary, allowing the Kubernetes API Server to provision services and retrieve credentials for applications. The operator leverages a [Custom Resource Definitions (CRDs)-based](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#custom-resources) architecture for extensibility and modularity.\n\n![img](./docs/images/architecture.png)\n\n[Back to top](#table-of-contents)\n\n## Prerequisites for Deployment\n\nBefore installing the SAP BTP Service Operator, ensure the following requirements are met:\n\n- SAP BTP [Global Account](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/d61c2819034b48e68145c45c36acba6e.html) and [Subaccount](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/55d0b6d8fa1e4de4b9fcc4ae771609da.html)\n- Familiarity with [SAP Service Manager](https://help.sap.com/docs/service-manager/sap-service-manager/working-with-sap-service-manager).\n- A Kubernetes cluster running version 1.17 or higher.\n- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) version 1.17 or higher.\n- [Helm](https://helm.sh/) version 3.0 or higher.\n\n[Back to top](#table-of-contents)\n\n## Installation and Setup\n\nTo deploy the SAP BTP Service Operator, follow these steps:\n\n- Install [cert-manager](https://cert-manager.io/docs/installation/):\n  - For operator releases v0.1.18 or higher, use cert-manager v1.6.0 or later.\n  - For releases v0.1.17 or lower, use cert-manager versions below v1.6.0.\n\n- Obtain access credentials:\n  - Create an instance of the SAP Service Manager service (technical name: `service-manager`) with the `service-operator-access` plan.\n  - **Note**: If the plan is not visible, entitle your subaccount for the SAP Service Manager service. See [Configure Entitlements and Quotas for Subaccounts](https://help.sap.com/docs/btp/sap-business-technology-platform/configuring-entitlements-and-quotas-for-subaccounts).\n  - Create a service binding to retrieve credentials. For details, see:\n    - [Creating Service Instances Using the SAP BTP Cockpit](https://help.sap.com/docs/btp/sap-business-technology-platform/creating-service-instances-using-sap-btp-cockpit)\n    - [Creating Service Instances Using BTP CLI](https://help.sap.com/docs/btp/sap-business-technology-platform/creating-service-instances-using-btp-cli)\n    - [Creating Service Bindings Using the SAP BTP Cockpit](https://help.sap.com/docs/btp/sap-business-technology-platform/creating-service-bindings-using-sap-btp-cockpit)\n    - [Creating Service Bindings Using BTP CLI](https://help.sap.com/docs/btp/sap-business-technology-platform/creating-service-bindings-using-btp-cli).\n\n- Retrieve the credentials from the binding. Example default binding:\n\n```json\n{\n    \"clientid\": \"\u003cclientid\u003e\",\n    \"clientsecret\": \"\u003cclientsecret\u003e\",\n    \"url\": \"https://mysubaccount.authentication.eu10.hana.ondemand.com\",\n    \"xsappname\": \"b15166|service-manager!b1234\",\n    \"sm_url\": \"https://service-manager.cfapps.eu10.hana.ondemand.com\"\n}\n```\n\nExample binding with X.509 certificate:\n\n```json\n{\n    \"clientid\": \"\u003cclientid\u003e\",\n    \"certificate\": \"-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----..-----END CERTIFICATE-----\\n-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----\\n\",\n    \"key\": \"-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----\\n\",\n    \"certurl\": \"https://mysubaccount.authentication.cert.eu10.hana.ondemand.com\",\n    \"xsappname\": \"b15166|service-manager!b1234\",\n    \"sm_url\": \"https://service-manager.cfapps.eu10.hana.ondemand.com\"\n}\n```\n**Note**: The `service-operator-access` credentials are intended exclusively for technical communication between the BTP Service Operator and Service Manager. They are not designed for direct API access. If you need to call Service Manager APIs directly, create a separate Service Manager instance with the `subaccount-admin` plan and use those credentials instead.\n\n- Add the SAP BTP Service Operator Helm chart repository:\n\n```bash\nhelm repo add sap-btp-operator https://sap.github.io/sap-btp-service-operator\n```\n\n- Deploy the operator using the obtained access credentials:\n\n  **Note**: If you are deploying the SAP BTP service operator in the registered cluster based on the Service Catalog (svcat) and Service Manager agent so that you can migrate svcat-based content to service operator-based content, add `--set cluster.id=\u003cclusterID\u003e` to your deployment script. For more information, see the step 2 of the Setup section of [Migration to SAP BTP service operator](https://github.com/SAP/sap-btp-service-operator-migration/blob/main/README.md).\n\n  An example of the deployment that uses the default access credentials type:\n\n```bash\nhelm upgrade --install sap-btp-operator sap-btp-operator/sap-btp-operator \\\n    --create-namespace \\\n    --namespace=sap-btp-operator \\\n    --set manager.secret.clientid=\u003cclientid\u003e \\\n    --set manager.secret.clientsecret=\u003cclientsecret\u003e \\\n    --set manager.secret.sm_url=\u003csm_url\u003e \\\n    --set manager.secret.tokenurl=\u003cauth_url\u003e\n```\n\n  An example of the deployment that uses the X.509 certificate:\n\n```bash\nhelm upgrade --install sap-btp-operator sap-btp-operator/sap-btp-service-operator \\\n    --create-namespace \\\n    --namespace=sap-btp-operator \\\n    --set manager.secret.clientid=\u003cclientid\u003e \\\n    --set manager.secret.tls.crt=\"$(cat /path/to/cert)\" \\\n    --set manager.secret.tls.key=\"$(cat /path/to/key)\" \\\n    --set manager.secret.sm_url=\u003csm_url\u003e \\\n    --set manager.secret.tokenurl=\u003cauth_url\u003e\n```\n\nThe credentials provided during the installation are stored in a secret named `sap-btp-service-operator`, in the `sap-btp-operator` namespace. These credentials are used by the BTP service operator to communicate with the SAP BTP subaccount.\n\n\u003cdetails\u003e\n\u003csummary\u003eBTP Access Secret Structure\u003c/summary\u003e\n\n#### Default Access Credentials\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: sap-btp-service-operator\n  namespace: sap-btp-operator\ntype: Opaque\nstringData:\n  clientid: \"\u003cclientid\u003e\"\n  clientsecret: \"\u003cclientsecret\u003e\"\n  sm_url: \"\u003csm_url\u003e\"\n  tokenurl: \"\u003cauth_url\u003e\"\n  tokenurlsuffix: \"/oauth/token\"\n```\n\n#### mTLS Access Credentials\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: sap-btp-service-operator\n  namespace: sap-btp-operator\ntype: Opaque\nstringData:\n  clientid: \"\u003cclientid\u003e\"\n  tls.crt: \"\u003ccertificate\u003e\"\n  tls.key: \"\u003ckey\u003e\"\n  sm_url: \"\u003csm_url\u003e\"\n  tokenurl: \"\u003cauth_url\u003e\"\n  tokenurlsuffix: \"/oauth/token\"\n```\n\n\u003c/details\u003e\n\n**Note**: To rotate the credentials between the BTP service operator and Service Manager, you have to create a new binding for the `service-operator-access` service instance, and then execute the setup script again with the new set of credentials. Afterward, you can delete the old binding.\n\n\n[Back to top](#table-of-contents)\n\n### Using Custom Certificate Authorities\nThe SAP BTP Service Operator can be configured to trust custom CA certificates in addition to the standard system CA bundle. This enables the operator to establish secure HTTPS connections with SAP BTP using certificates from your own trusted sources.\n\nThis is particularly useful in restricted or disconnected environments where public CAs may be unavailable.\n\n#### Configuration\n\nCustom CA certificates are configured through the Helm chart.\nYou configure custom CAs using the `customCACerts` array under `manager` in `values.yaml`.\nEach entry must be a base64-encoded PEM certificate.\n\n```bash\n    --set 'manager.customCACerts[0]'='LS0tLS1CRUdJTi...'  # Base64-encoded PEM certificate\n```\n\n### Managing Access Permissions\n\nBy default, the SAP BTP operator has cluster-wide permissions. You can also limit them to one or more namespaces; for this, you need to set the following two Helm parameters:\n\n```bash\n--set manager.allow_cluster_access=false\n--set manager.allowed_namespaces={namespace1,namespace2}\n```\n\n**Note**: If `allow_cluster_access` is set to `true`, then the `allowed_namespaces` parameter is ignored.\n\n[Back to top](#table-of-contents)\n\n## Configuring Multiple Subaccounts\n\nBy default, a Kubernetes cluster is associated with a single subaccount (as described in step 4 of the [Installation and Setup](#installation-and-setup) section). Consequently, any service instance created within any namespace will be provisioned in that subaccount.\n\nHowever, the SAP BTP service operator also supports multi-subaccount configurations in a single cluster. This is achieved through:\n\n- **Namespace-based mapping**: Connect different namespaces to separate subaccounts. This approach leverages dedicated credentials configured for each namespace.\n- **Explicit instance-level mapping**: Define the specific subaccount for each service instance, regardless of the namespace context.\n\nBoth can be achieved through dedicated secrets managed in the centrally managed namespace. Choosing the most suitable approach depends on your specific needs and application architecture.\n\n**Note**: The system’s centrally managed namespace is set by the value in `.Values.manager.management_namespace`. You can provide this value during installation (refer to step 4 in the [Installation and Setup](#installation-and-setup) section). If you don’t specify this value, the system will use the installation namespace as the default.\n\n### Subaccount for a Namespace\n\nTo associate a namespace to a specific subaccount, maintain the access credentials to the subaccount in a `Secret` that is dedicated to a specific namespace. Define a secret named `\u003cnamespace-name\u003e-sap-btp-service-operator` in the centrally-managed namespace.\n\n#### Default Access Credentials\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: \u003cnamespace-name\u003e-sap-btp-service-operator\n  namespace: \u003ccentrally-managed-namespace\u003e\ntype: Opaque\nstringData:\n  clientid: \"\u003cclientid\u003e\"\n  clientsecret: \"\u003cclientsecret\u003e\"\n  sm_url: \"\u003csm_url\u003e\"\n  tokenurl: \"\u003cauth_url\u003e\"\n  tokenurlsuffix: \"/oauth/token\"\n```\n\n#### mTLS Access Credentials\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: \"\u003cnamespace-name\u003e-sap-btp-service-operator\"\n  namespace: \"\u003ccentrally-managed-namespace\u003e\"\ntype: Opaque\nstringData:\n  clientid: \"\u003cclientid\u003e\"\n  tls.crt: \"\u003ccertificate\u003e\"\n  tls.key: \"\u003ckey\u003e\"\n  sm_url: \"\u003csm_url\u003e\"\n  tokenurl: \"\u003cauth_url\u003e\"\n  tokenurlsuffix: \"/oauth/token\"\n```\n\n### Subaccount for a ServiceInstance Resource\n\nYou can deploy service instances belonging to different subaccounts within the same namespace. To achieve this, follow these steps:\n\n- **Store access credentials**: Securely store the access credentials for each subaccount in separate `Secret` resources within the centrally-managed namespace.\n- **Specify subaccount per service**: In the `ServiceInstance` resource, use the `btpAccessCredentialsSecret` property to reference the specific `Secret` containing the relevant subaccount’s credentials. This explicitly tells the operator which subaccount to use to provision the service instance.\n\n#### Define a new secret\n\n##### Default Access Credentials\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: \"\u003cmy-secret\u003e\"\n  namespace: \u003ccentrally-managed-namespace\u003e\ntype: Opaque\nstringData:\n  clientid: \"\u003cclientid\u003e\"\n  clientsecret: \"\u003cclientsecret\u003e\"\n  sm_url: \"\u003csm_url\u003e\"\n  tokenurl: \"\u003cauth_url\u003e\"\n  tokenurlsuffix: \"/oauth/token\"\n```\n\n##### mTLS Access Credentials\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: \"\u003cmy-secret\u003e\"\n  namespace: \u003ccentrally-managed-namespace\u003e\ntype: Opaque\nstringData:\n  clientid: \"\u003cclientid\u003e\"\n  tls.crt: \"\u003ccertificate\u003e\"\n  tls.key: \"\u003ckey\u003e\"\n  sm_url: \"\u003csm_url\u003e\"\n  tokenurl: \"\u003cauth_url\u003e\"\n  tokenurlsuffix: \"/oauth/token\"\n```\n\n#### Configure the secret name in the `ServiceInstance` resource within the property `btpAccessCredentialsSecret`:\n\nThe secret must be located in the management namespace.\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceInstance\nmetadata:\n  name: sample-instance-1\nspec:\n  serviceOfferingName: service-manager\n  servicePlanName: subaccount-audit\n  btpAccessCredentialsSecret: mybtpsecret\n```\n\n##### Secrets Precedence\n\nSAP BTP service operator searches for the credentials in the following order:\n\n1. Explicit secret defined in the `ServiceInstance`\n2. Default namespace secret\n3. Default cluster secret\n\n[Back to top](#table-of-contents)\n\n## Using the SAP BTP Service Operator\n\n### Creating Service Instances\n\nTo create an instance of a service offered by SAP BTP, first create a `ServiceInstance` custom-resource file:\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceInstance\nmetadata:\n  name: my-service-instance\nspec:\n  serviceOfferingName: sample-service\n  servicePlanName: sample-plan\n  externalName: my-service-btp-name\n  parameters:\n    key1: val1\n    key2: val2\n```\n\n- `\u003coffering\u003e` - The name of the SAP BTP service that you want to create. To learn more about viewing and managing the available services for your subaccount in the SAP BTP cockpit, see [Service Marketplace](https://help.sap.com/viewer/09cc82baadc542a688176dce601398de/Cloud/en-US/affcc245c332433ba71917ff715b9971.html).\n  \n  **Tip**: Use the *Environment* filter to get all offerings that are relevant for Kubernetes.\n\n- `\u003cplan\u003e` - The plan of the selected service offering you want to create.\n\nApply the custom resource file in your cluster to create the instance:\n\n```bash\nkubectl apply -f path/to/my-service-instance.yaml\n```\n\nCheck that the service’s status in your cluster is `Created`:\n\n```bash\nkubectl get serviceinstances\nNAME                  OFFERING          PLAN        STATUS    AGE\nmy-service-instance   sample-service    sample-plan Created   44s\n```\n\n[Back to top](#table-of-contents)\n\n### Managing Service Bindings\n\nTo allow an application to obtain access credentials to communicate with a service, create a `ServiceBinding` custom resource. Set the `serviceInstanceName` field within the `ServiceBinding` to match the name of the `ServiceInstance` resource you previously created.\n\nThese access credentials are available to applications through a `Secret` resource generated in your cluster.\n\n#### Structure of the ServiceBinding Custom Resource\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceBinding\nmetadata:\n  name: sample-binding\nspec:\n  serviceInstanceName: sample-instance\n  externalName: my-binding-external\n  secretName: my-secret\n  parameters:\n    key1: val1\n    key2: val2\n```\n\n#### Procedure\n\nApply the custom resource file in your cluster to create the `ServiceBinding`:\n\n```bash\nkubectl apply -f path/to/my-binding.yaml\n```\n\nVerify that your `ServiceBinding` status is `Created` before you proceed:\n\n```bash\nkubectl get servicebindings\nNAME         INSTANCE              STATUS    AGE\nmy-binding   my-service-instance   Created   16s\n```\n\nCheck that the `Secret` with the name as specified in the `spec.secretName` field of the `ServiceBinding` custom resource is created. The `Secret` contains access credentials needed for the apps to use the service:\n\n```bash\nkubectl get secrets\nNAME         TYPE     DATA   AGE\nmy-secret   Opaque   5      32s\n```\n\nSee [Using Secrets](https://kubernetes.io/docs/concepts/configuration/secret/) to learn about different options on how to use the credentials from your application running in the Kubernetes cluster.\n\n[Back to top](#table-of-contents)\n\n## Service Binding Secret Formats\n\nYou can use different attributes in your `ServiceBinding` resource to generate different formats of your `Secret` resources. Even though `Secret` resources can come in various formats, they all share a common basic content. The parameters within the `Secret` fall into two categories:\n\n- **Credentials returned from the broker**: These credentials allow your applications to access and consume the service.\n- **Attributes of the associated `ServiceInstance`**: This information provides details about the service instance itself.\n\nNow let’s explore these various formats:\n\n### Key-Value Pairs (Default)\n\nIf you do not use any of the attributes, the generated `Secret` will be in a key-value pair format.\n\n**ServiceBinding**\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceBinding\nmetadata:\n  name: sample-binding\nspec:\n  serviceInstanceName: sample-instance\n```\n\n**Secret**\n\n```yaml\napiVersion: v1\nmetadata:\n  name: sample-binding\nkind: Secret\nstringData:\n  uri: https://my-service.authentication.eu10.hana.ondemand.com\n  client_id: admin\n  client_secret: ********\n  instance_guid: your-sample-instance-guid # The service instance ID\n  instance_name: sample-instance # Taken from the service instance external_name field if set. Otherwise from metadata.name\n  plan: sample-plan # The service plan name\n  type: sample-service # The service offering name\n```\n\n### Credentials as JSON Object\n\nTo show credentials returned from the broker within the `Secret` resource as a JSON object, use the `secretKey` attribute in the `ServiceBinding` spec. The value of this `secretKey` is the name of the key that stores the credentials in JSON format:\n\n**ServiceBinding**\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceBinding\nmetadata:\n  name: sample-binding\nspec:\n  serviceInstanceName: sample-instance\n  secretKey: myCredentials\n```\n\n**Secret**\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: sample-binding\nstringData:\n  myCredentials: |\n    {\n      \"uri\": \"https://my-service.authentication.eu10.hana.ondemand.com\",\n      \"client_id\": \"admin\",\n      \"client_secret\": \"********\"\n    }\n  instance_guid: your-sample-instance-guid # The service instance ID\n  instance_name: sample-binding # Taken from the service instance external_name field if set. Otherwise from metadata.name\n  plan: sample-plan # The service plan name\n  type: sample-service # The service offering name\n```\n\n### Credentials and Service Info as One JSON Object\n\nTo show both credentials returned from the broker and additional `ServiceInstance` attributes as a JSON object, use the `secretRootKey` attribute in the `ServiceBinding` spec. The value of `secretRootKey` is the name of the key that stores both credentials and `ServiceInstance` info in JSON format.\n\n**ServiceBinding**\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceBinding\nmetadata:\n  name: sample-binding\nspec:\n  serviceInstanceName: sample-instance\n  secretRootKey: myCredentialsAndInstance\n```\n\n**Secret**\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: sample-binding\nstringData:\n  myCredentialsAndInstance: |\n    {\n      \"uri\": \"https://my-service.authentication.eu10.hana.ondemand.com\",\n      \"client_id\": \"admin\",\n      \"client_secret\": \"********\",\n      \"instance_guid\": \"your-sample-instance-guid\",\n      \"instance_name\": \"sample-instance-name\",\n      \"plan\": \"sample-instance-plan\",\n      \"type\": \"sample-instance-offering\"\n    }\n```\n\n### Custom Formats\n\nFor additional flexibility, you can model the `Secret` resources according to your needs. To generate a custom-formatted `Secret`, use the `secretTemplate` attribute in the `ServiceBinding` spec.\n\nThis attribute expects a Go template as its value (for more information, see [Go Templates](https://golang.org/pkg/text/template/)). Ensure the template is in YAML format, and its structure is of a Kubernetes `Secret`.\n\nIn the provided `Secret`, you can customize the `metadata` and `stringData` sections with the following options:\n\n- `metadata`: labels and annotations\n- `stringData`: customize or utilize one of the available formatting options as detailed in the [Service Binding Secret Formats](#service-binding-secret-formats) section.\n\n**Important**: If you customize `stringData`, it takes precedence over the pre-defined formats (if you provided one of them in parallel).\n\nProvided templates are then executed on a map with the following available attributes:\n\n| Reference | Description |\n|-----------|-------------|\n| `instance.instance_guid` | The service instance ID. |\n| `instance.instance_name` | The service instance name. |\n| `instance.plan` | The name of the service plan used to create this service instance. |\n| `instance.type` | The name of the associated service offering. |\n| `credentials.attributes(var)` | The content of the credentials depends on a service. For more details, refer to the documentation of the service you’re using. |\n\nBelow are two examples demonstrating `ServiceBinding` and generated `Secret` resources. The first `ServiceBinding` example utilizes a custom template, while the second example combines a custom template with a predefined formatting option:\n\n#### Example of a binding with customized metadata and stringData sections\n\nIn this example, you specify both `metadata` and `stringData` in the `secretTemplate`:\n\n**ServiceBinding**\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceBinding\nmetadata:\n  name: sample-binding\nspec:\n  serviceInstanceName: sample-instance\n  secretTemplate: |\n    apiVersion: v1\n    kind: Secret\n    metadata:\n      labels:\n        service_plan: {{ .instance.plan }}\n      annotations:\n        instance: {{ .instance.instance_name }}\n    stringData:\n      USERNAME: {{ .credentials.client_id }}\n      PASSWORD: {{ .credentials.client_secret }}\n```\n\n**Secret**\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  labels:\n    service_plan: sample-plan\n  annotations:\n    instance: sample-instance\nstringData:\n  USERNAME: admin\n  PASSWORD: ********\n```\n\n#### Example of a binding with customized metadata section and applied pre-existing formatting option for stringData (credentials as JSON object)\n\nIn this example, you omit `stringData` from the `secretTemplate` and use the `secretKey` to format your `stringData` instead (see [Service Binding Secret Formats](#service-binding-secret-formats)):\n\n**ServiceBinding**\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceBinding\nmetadata:\n  name: sample-binding\nspec:\n  serviceInstanceName: sample-instance\n  secretKey: myCredentials\n  secretTemplate: |\n    apiVersion: v1\n    kind: Secret\n    metadata:\n      labels:\n        service_plan: {{ .instance.plan }}\n      annotations:\n        instance: {{ .instance.instance_name }}\n```\n\n**Secret**\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  labels:\n    service_plan: sample-plan\n  annotations:\n    instance: sample-instance\nstringData:\n  myCredentials: |\n    {\n      \"uri\": \"https://my-service.authentication.eu10.hana.ondemand.com\",\n      \"client_id\": \"admin\",\n      \"client_secret\": \"********\"\n    }\n  instance_guid: your-sample-instance-guid # The service instance ID\n  instance_name: sample-binding # Taken from the service instance external_name field if set. Otherwise from metadata.name\n  plan: sample-plan # The service plan name\n  type: sample-service # The service offering name\n```\n\n[Back to top](#table-of-contents)\n\n## Automating Service Binding Rotation\n\nEnhance security by automatically rotating the credentials associated with your service bindings. This process involves generating a new service binding while keeping the old credentials active for a specified period to ensure a smooth transition.\n\n### Enabling Automatic Rotation\n\nTo enable automatic rotation of service bindings, use the `credentialsRotationPolicy` field within the `spec` section of the `ServiceBinding` resource. This field allows you to configure several parameters:\n\n| Parameter | Type | Description | Valid Values |\n|-----------|------|-------------|--------------|\n| `enabled` | bool | Controls whether the automatic rotation is enabled or disabled. | |\n| `rotationFrequency` | string | Specifies the desired time interval between binding rotations. | \"m\" (minute), \"h\" (hour) |\n| `rotatedBindingTTL` | string | Determines how long to keep the old `ServiceBinding` resource after rotation (prior to deletion). The actual TTL may be slightly longer (details below). | \"m\" (minute), \"h\" (hour) |\n\n**Note**: The `credentialsRotationPolicy` does not manage the validity or expiration of the credentials themselves. This is determined by the specific service you are bound to.\n\n### Rotation Process\n\nThe `credentialsRotationPolicy` is evaluated periodically during a [control loop](https://kubernetes.io/docs/concepts/architecture/controller/), which runs on every service binding update or during a full reconciliation process. This means the actual rotation will occur in the closest upcoming reconciliation loop.\n\n### Immediate Rotation\n\nYou can trigger an immediate rotation (regardless of the configured `rotationFrequency`) by adding the `services.cloud.sap.com/forceRotate: \"true\"` annotation to the `ServiceBinding` resource. This immediate rotation only works if automatic rotation is already enabled.\n\n### Example\n\nThis example configures a `ServiceBinding` to rotate credentials every 25 days (600 hours) and keep the old `ServiceBinding` for 2 days (48 hours) before deleting it:\n\n```yaml\napiVersion: services.cloud.sap.com/v1\nkind: ServiceBinding\nmetadata:\n  name: sample-binding\nspec:\n  serviceInstanceName: sample-instance\n  credentialsRotationPolicy:\n    enabled: true\n    rotatedBindingTTL: 48h\n    rotationFrequency: 600h\n```\n\n### After Rotation\n\nOnce the `ServiceBinding` is rotated:\n\n- The `Secret` is updated with the latest credentials.\n- The old credentials are kept in a newly-created secret named `\u003coriginal-secret-name\u003e-\u003cguid\u003e`.\n  This temporary secret is marked with the `services.cloud.sap.com/stale` label and is kept until the configured deletion time (TTL) expires.\n\n### Checking Last Rotation\n\nTo view the timestamp of the last service binding rotation, refer to the `status.lastCredentialsRotationTime` field.\n\n### Limitations\n\nAutomatic credential rotation cannot be enabled for a backup `ServiceBinding` (named: `original-binding-name-\u003cguid\u003e`) which is marked with the `services.cloud.sap.com/stale` label. This backup service binding was created during the credentials rotation process to facilitate the process.\n\n### Further Information\n\nFor more details about `ServiceBinding`, refer to the dedicated [Managing Service Bindings](#managing-service-bindings) section in this documentation.\n\n[Back to top](#table-of-contents)\n\n## Specifying Parameters\n\nTo set input parameters, you may use the `parameters` and `parametersFrom` fields in the `spec` field of the `ServiceInstance` or `ServiceBinding` resource:\n\n- `parameters`: Can be used to specify a set of properties to be sent to the broker. The data specified will be passed \"as-is\" to the broker without any modifications - aside from converting it to JSON for transmission to the broker if the `spec` field is specified as YAML. Any valid YAML or JSON constructs are supported. Only one `parameters` field may be specified per `spec`.\n- `parametersFrom`: Enables you to specify one or more secrets, and the corresponding keys within those secrets, holding JSON-formatted parameters to be sent to the broker. The `parametersFrom` field is a list that supports multiple sources referenced per `spec`, defining an asymmetric relationship where the `ServiceInstance` resource can define several related secrets.\n- `watchParametersFromChanges`: (boolean) This field determines whether changes to the secret values referenced in `parametersFrom` should trigger an automatic update of the service instance. If `true`, any change to the referenced secret values will trigger the update of the service instance. Defaults to `false`.\n\nWhile you may use either or both of `parameters` and `parametersFrom` fields, `watchParametersFromChanges` is only relevant when used alongside `parametersFrom`.\n\n**Note**: The `watchParametersFromChanges` field is only relevant for `ServiceInstance` resources because `ServiceBinding` resources can’t be updated.\n\nIf multiple sources in the `parameters` and `parametersFrom` blocks are specified, the final payload merges all of them at the top level. If there are any duplicate properties defined at the top level, the specification is considered to be invalid, the further processing of the `ServiceInstance`/`ServiceBinding` resource stops, and its `status` is marked with an error condition.\n\nThe format of the `spec` in YAML:\n\n```yaml\nspec:\n  parameters:\n    name: value\n  parametersFrom:\n    - secretKeyRef:\n       name: my-secret,\n        key: secret-parameter\n```\n\nThe format of the `spec` in JSON:\n\n```json\n{\n  \"spec\": {\n    \"parameters\": {\n      \"name\": \"value\"\n    },\n    \"parametersFrom\": {\n      \"secretKeyRef\": {\n        \"name\": \"my-secret\",\n        \"key\": \"secret-parameter\"\n      }\n    }\n  }\n}\n```\n\nThe secret with the `secret-parameter` named key:\n\n```yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: my-secret\ntype: Opaque\nstringData:\n  secret-parameter: |\n    {\n      \"password\": \"password\"\n    }\n```\n\nThe final JSON payload to send to the broker:\n\n```json\n{\n  \"name\": \"value\",\n  \"password\": \"password\"\n}\n```\n\nYou can list multiple parameters in the secret. To do so, separate “key”: “value” pairs with commas as in this example:\n\n```yaml\nsecret-parameter: |\n  {\n    \"password\": \"password\",\n    \"key2\": \"value2\",\n    \"key3\": \"value3\"\n  }\n```\n\n[Back to top](#table-of-contents)\n\n## Reference Documentation\n\n### Service Instance Properties\n\n#### Spec\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `serviceOfferingName*` | `string` | The name of the SAP BTP service offering. |\n| `servicePlanName*` | `string` | The plan to use for the service instance. |\n| `servicePlanID` | `string` | The plan ID in case the service offering and plan name are ambiguous. |\n| `externalName` | `string` | The name for the service instance in SAP BTP, defaults to the instance `metadata.name` if not specified. |\n| `parameters` | `[]object` | Some services support the provisioning of additional configuration parameters during the instance creation. For the list of supported parameters, check the documentation of the particular service offering. |\n| `parametersFrom` | `[]object` | List of sources to populate parameters. |\n| `watchParametersFromChanges` | `bool` | This field determines whether changes to the secret values referenced in `parametersFrom` should trigger an automatic update of the service instance. When set to `true`, any change to the referenced secret values will trigger the update of the service instance. Defaults to `false`. It is only relevant when used in conjunction with the `parametersFrom` field. |\n| `customTags` | `[]string` | A list of custom tags describing the `ServiceInstance`, will be copied to `ServiceBinding` secret in the key called `tags`. |\n| `userInfo` | `object` | Contains information about the user that last modified this service instance. |\n| `shared` | `*bool` | The shared state. Possible values: `true`, `false`, or `nil` (value was not specified, counts as “false”). |\n| `btpAccessCredentialsSecret` | `string` | Name of a secret that contains access credentials for the SAP BTP service operator. See [Configuring Multiple Subaccounts](#configuring-multiple-subaccounts). |\n\n#### Status\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `instanceID` | `string` | The service instance ID in SAP Service Manager service. |\n| `operationURL` | `string` | The URL of the current operation performed on the service instance. |\n| `operationType` | `string` | The type of the current operation. Possible values are `CREATE`, `UPDATE`, or `DELETE`. |\n| `conditions` | `[]condition` | An array of conditions describing the status of the service instance. The possible condition types are: \u003cbr\u003e- `Ready`: set to `true` if the instance is ready and usable. \u003cbr\u003e- `Failed`: set to `true` when an operation on the service instance fails. In the case of failure, the details about the error are available in the condition message. \u003cbr\u003e- `Succeeded`: set to `true` when an operation on the service instance succeeded. In case of a false operation, it is considered as in progress unless a `Failed` condition exists. \u003cbr\u003e- `Shared`: set to `true` when sharing of the service instance succeeded. Set to `false` when unsharing of the service instance succeeded or when the service instance is not shared. |\n| `tags` | `[]string` | Tags describing the `ServiceInstance` as provided in the service catalog, will be copied to the `ServiceBinding` secret in the key called `tags`. |\n\n#### Annotations\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `services.cloud.sap.com/preventDeletion` | `map[string]string` | You can prevent deletion of any service instance by adding the following annotation: `services.cloud.sap.com/preventDeletion: \"true\"`. To enable back the deletion of the instance, either remove the annotation or set it to `false`. |\n\n### Service Binding Properties\n\n#### Spec\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `serviceInstanceName*` | `string` | The Kubernetes name of the service instance to bind. |\n| `serviceInstanceNamespace` | `string` | The namespace of the service instance to bind, if not specified the default is the binding’s namespace. |\n| `externalName` | `string` | The name for the service binding in SAP BTP, defaults to the binding `metadata.name` if not specified. |\n| `secretName` | `string` | The name of the secret where the credentials are stored, defaults to the binding `metadata.name` if not specified. |\n| `secretKey` | `string` | The secret key is a part of the Secret object, which stores service-binding data (credentials) received from the broker. When the secret key is used, all the credentials are stored under a single key. This makes it a convenient way to store credentials data in one file when using volumeMounts. [Example](#service-binding-secret-formats) |\n| `secretRootKey` | `string` | The root key is a part of the Secret object, which stores service-binding data (credentials) received from the broker, as well as additional service instance information. When the root key is used, all data is stored under a single key. This makes it a convenient way to store data in one file when using volumeMounts. [Example](#service-binding-secret-formats) |\n| `parameters` | `[]object` | Some services support the provisioning of additional configuration parameters during the bind request. For the list of supported parameters, check the documentation of the particular service offering. |\n| `parametersFrom` | `[]object` | List of sources to populate parameters. |\n| `userInfo` | `object` | Contains information about the user that last modified this service binding. |\n| `credentialsRotationPolicy` | `object` | Holds automatic credentials rotation configuration. |\n| `credentialsRotationPolicy.enabled` | `boolean` | Indicates whether automatic credentials rotation is enabled. |\n| `credentialsRotationPolicy.rotationFrequency` | `duration` | Specifies the frequency at which the binding rotation is performed. |\n| `credentialsRotationPolicy.rotatedBindingTTL` | `duration` | Specifies the time period for which to keep the rotated binding. |\n| `SecretTemplate` | `string` | A Go template used to generate a custom Kubernetes `v1/Secret`, working on both the access credentials returned by the broker and instance attributes. Refer to [Go Templates](https://golang.org/pkg/text/template/) for more details. |\n\n#### Status\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `instanceID` | `string` | The ID of the bound instance in the SAP Service Manager service. |\n| `bindingID` | `string` | The service binding ID in SAP Service Manager service. |\n| `operationURL` | `string` | The URL of the current operation performed on the service binding. |\n| `operationType` | `string` | The type of the current operation. Possible values are `CREATE`, `UPDATE`, or `DELETE`. |\n| `conditions` | `[]condition` | An array of conditions describing the status of the service instance. The possible conditions types are: \u003cbr\u003e- `Ready`: set to `true` if the binding is ready and usable. \u003cbr\u003e- `Failed`: set to `true` when an operation on the service binding fails. In the case of failure, the details about the error are available in the condition message. \u003cbr\u003e- `Succeeded`: set to `true` when an operation on the service binding succeeded. In case of a false operation considered as in progress unless a `Failed` condition exists. |\n| `lastCredentialsRotationTime` | `time` | Indicates the last time the binding secret was rotated. |\n\n[Back to top](#table-of-contents)\n\n## Uninstalling the SAP BTP Service Operator\n\nBefore you uninstall the operator, we recommend you manually delete all associated service instances and bindings. This way, you’ll ensure all data stored with service instances and bindings are properly taken care of. Instances and bindings that were not manually deleted will be automatically deleted once you start the uninstallation process.\n\nTo uninstall the operator, run the following command:\n\n```bash\nhelm uninstall sap-btp-operator -n sap-btp-operator\n```\n\n### Responses\n\n- `release sap-btp-operator uninstalled` - The operator has been successfully uninstalled.\n\n#### Timed out waiting for condition\n\n**What happened?**\n\nThe deletion of instances and bindings takes more than 5 minutes, this happens when there is a large number of instances and bindings.\n\n**What to do:**\n\nWait for the job to finish and re-trigger the uninstall process. To check the job status, run `kubectl get jobs --namespace=sap-btp-operator` or log on to the cluster and check the job log. Note that you may have to repeat this step several times until the uninstall process has been successfully completed.\n\n#### job failed: BackoffLimitExceeded\n\n**What happened?**\n\nOne of the service instances or bindings could not be deleted.\n\n**What to do:**\n\nFirst, locate the service instance or binding in question and fix it, then re-trigger the uninstallation. To find it, log on to the cluster and check the pre-delete job, or check the logs by running the following two commands:\n\n```bash\nkubectl get pods --all-namespaces | grep pre-delete\n```\n\n```bash\nkubectl logs \u003cjob_name\u003e --namespace=sap-btp-operator\n```\n\nNote that the pre-delete job is only visible for approximately one minute after the job execution is completed. If you don’t have access to the pre-delete job, use `kubectl` to view details about the failed resource and check its status by running:\n\n```bash\nkubectl describe \u003cresource_type\u003e \u003cresource_name\u003e\n```\n\nCheck for resources with the deletion timestamp to determine if it tried to be deleted.\n\n### Contributions\n\nWe currently do not accept community contributions.\n\n### License\n\nThis project is licensed under the Apache License, Version 2.0 - see the [LICENSE](LICENSE) file for details.\n\n### Copyright Notice\n\nCopyright 2024 SAP SE and sap-btp-service-operator contributors.\n\n### Third-Party Components\n\nThis project includes third-party software components. Detailed information including third-party components and their licensing/copyright information is available via the [REUSE tool](https://api.reuse.software/info/github.com/SAP/sap-btp-service-operator).\n\n### REUSE Compliance\n\nThis repository is [REUSE](https://reuse.software/) compliant. All files in this repository include proper license and copyright information according to the REUSE specification. For comprehensive licensing information, please use the REUSE tool or check the individual file headers.\n\n[Back to top](#table-of-contents)\n\n## Troubleshooting and Support\n\n### Cannot create a binding because service instance is in `Delete Failed` state\n\nThe deletion of my service instance failed. To fix the failure, I have to create a service binding, but I can’t do that because the instance is in the `Delete Failed` state.\n\n**Solution**\n\nUse the `force_k8s_binding` query param when creating the service binding and set it to `true` (`force_k8s_binding=true`). You can do this with the following `btp CLI` commands:\n\n**Note**: Do not use the `service-operator-access` plan credentials to run this command.\n\n**Example**\n\n```bash\nbtp create services/binding \\\n  --subaccount [ID] \\\n  --binding NAME \\\n  [--instance-name NAME] \\\n  [--service-instance ID] \\\n  [--parameters '{\"force_k8s_binding\": true}'] \\\n  [--labels JSON] \\\n  [--force TRUE]\n```\n\nDelete the binding afterward:\n\n```bash\nbtp delete services/binding \\\n  --subaccount [ID] \\\n  --binding NAME \\\n  [--instance-name NAME] \\\n  [--service-instance ID] \\\n  [--parameters '{\"force_k8s_binding\": true}'] \\\n  [--labels JSON] \\\n  [--force FALSE]\n```\n\n**Note**: `force_k8s_binding` is supported only for Kubernetes instances that are in the `Delete Failed` state.\n\n### Cluster is unavailable, and I still have service instances and bindings\n\nI cannot delete service instances and bindings because the cluster in which they were created is no longer available.\n\n**Solution**\n\nUse a dedicated Service Manager API to clean up cluster content. Access the API with the `subaccount-admin` plan. For more information, see [Technical Access](https://help.sap.com/docs/btp/sap-business-technology-platform/technical-access).\n\n**Note**: Do not call this API with the `service-operator-access` plan credentials.\n\n#### Request\n\n```\nDELETE /v1/platforms/{platformID}/clusters/{clusterID}\n```\n\n#### Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `platformID` | `string` | The ID of the platform (should be the `service-operator-access` instance ID). |\n| `clusterID` | `string` | The ID of the cluster. You should specify the ID from step 4 of the [Installation and Setup](#installation-and-setup) section. If you are unable to retrieve it, use the GET service instance or binding API or equivalent BTP CLI command and extract it from the response. |\n\n#### Response\n\n| Status Code | Description |\n|-------------|-------------|\n| 202 Accepted | The request has been accepted for processing. |\n| 404 Resource Not Found | Platform or cluster not found. |\n| 429 Too Many Requests | When the rate limit is exceeded, the client receives the HTTP 429 “Too Many Requests” response status code. |\n\n**Headers**:\n\n- `Location`: A path to the operation status. For more information about operations, see: [Service Manager operation API](https://api.sap.com/api/APIServiceManager/path/getSingleOperation).\n- `Retry-After`: Indicates the time in seconds after which the client can retry the request.\n\n**Attention**: Use this option only for cleanup purposes for a no longer available cluster. Applying it to an active and available cluster may result in unintended resource leftovers in your cluster.\n\n### I can see my service instance/binding in SAP BTP, but not its corresponding custom resource in my cluster. How can I restore the custom resource?\n\nLet’s break down how to recover your Kubernetes custom resource that exists in SAP BTP but not in your Kubernetes cluster:\n\n#### Background\n\nIf a Kubernetes custom resource (CR) representing an SAP BTP service instance or service binding is lost, you can restore the connection to the existing BTP resource by manually recreating the CR using the information from the BTP side. To successfully re-establish the link, the new CR must have the same name, reside in the same namespace, and be associated with the same cluster ID as the original. The SAP BTP resource itself holds the configuration and remains unchanged, so as long as these identifying attributes match, creating a new CR will not result in provisioning a new BTP resource, but will instead reconnect to the existing one.\n\n#### Steps\n\n1. **Retrieve CR Details**:\n   - Access the service instance or binding representing your CR in SAP BTP.\n   - Obtain the following details from the service instance:\n     - The name of the custom resource.\n     - The Kubernetes namespace where the CR should reside.\n\n2. **Recreate the CR**:\n   - If you have a YAML definition or manifest for your CR, ensure it includes the exact name and namespace you retrieved from the SAP BTP service instance or binding.\n   - Use `kubectl apply -f \u003cyour_cr_manifest.yaml\u003e` to create the CR in your Kubernetes cluster.\n\n3. **Verify**:\n   - Use `kubectl get \u003cyour_cr_kind\u003e \u003cyour_cr_name\u003e -n \u003cyour_namespace\u003e` to verify that the CR is successfully created in Kubernetes.\n   - Check the service instance or binding in SAP BTP to confirm it now recognizes the re-established connection with the CR in Kubernetes.\n   - If the connection is not re-established, verify that the cluster ID in your Kubernetes cluster matches the one associated with the SAP BTP service instance or binding. You can find the cluster ID in the context details visible in the cockpit or BTP CLI. If the IDs don’t match, reconfigure your cluster with the correct ID.\n\nYou’re welcome to raise issues related to feature requests, bugs, or give general feedback on this project’s [GitHub Issues page](https://github.com/sap/sap-btp-service-operator/issues). The SAP BTP service operator project maintainers will respond to the best of their abilities.\n\n[Back to top](#table-of-contents)\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsap%2Fsap-btp-service-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsap%2Fsap-btp-service-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsap%2Fsap-btp-service-operator/lists"}