<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CAP Operator</title><link>https://sap.github.io/cap-operator/</link><description>Recent content on CAP Operator</description><generator>Hugo</generator><language>en</language><atom:link href="https://sap.github.io/cap-operator/index.xml" rel="self" type="application/rss+xml"/><item><title>CAPApplication</title><link>https://sap.github.io/cap-operator/docs/usage/resources/capapplication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/capapplication/</guid><description>&lt;p&gt;Here&amp;rsquo;s an example of a fully configured &lt;code&gt;CAPApplication&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CAPApplication&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-ns&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;btp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;xsuaa&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-uaa&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-uaa-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;saas-registry&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-saas-reg&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-saas-reg-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;service-manager&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-service-manager&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-svc-man-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;destination&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-destination&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-bem-02-dest-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;html5-apps-repo&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-html5-repo-host&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-html5-repo-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;html5-apps-repo&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-html5-repo-runtime&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-html5-rt-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;some-content-service&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-some-content-service&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-some-content-service-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;business-logging&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-business-logging&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-business-logging-bind&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;btpAppName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;domainRefs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Domain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-01-primary&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ClusterDomain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;common-external-domain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;providerSubaccountId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;7a49218f-c750-4e1f-a248-7f1cefa13010&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;btp.services&lt;/code&gt; array specifies all SAP BTP service instances and their corresponding Kubernetes Secrets (containing credentials) required by the application. These service instances are assumed to exist in the provider subaccount. You can use operators such as &lt;a href="https://sap.github.io/cf-service-operator/docs/"&gt;cf-service-operator&lt;/a&gt; or &lt;a href="https://github.com/SAP/sap-btp-service-operator"&gt;sap-btp-service-operator&lt;/a&gt; to declaratively create these service instances and their credentials as Kubernetes resources.&lt;/p&gt;</description></item><item><title>Controller</title><link>https://sap.github.io/cap-operator/docs/concepts/operator-components/controller/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/concepts/operator-components/controller/</guid><description>&lt;p&gt;The CAP controller uses &lt;a href="https://github.com/kubernetes/client-go"&gt;client-go&lt;/a&gt; from Kubernetes, which provides the tools and utilities needed to interact with the Kubernetes API server and manage the custom resources defined by CAP Operator.&lt;/p&gt;&#10;&lt;p&gt;The controller uses &lt;code&gt;Informers&lt;/code&gt; to watch certain resources and invokes registered event handlers when these resources are modified. To streamline the processing of such notifications, rate-limiting queues are implemented that store changes and allow processing of items in independent reconciliation threads (goroutines). This design enables sequential processing of changed items and avoids conflicts.&lt;/p&gt;</description></item><item><title>Custom DNS Templates</title><link>https://sap.github.io/cap-operator/docs/usage/domain-management/custom-dns/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/domain-management/custom-dns/</guid><description>&lt;p&gt;When &lt;code&gt;dnsMode&lt;/code&gt; is set to &lt;code&gt;Custom&lt;/code&gt;, the operator creates DNS entries according to the &lt;code&gt;dnsTemplates&lt;/code&gt; field instead of the fixed patterns used by &lt;code&gt;Wildcard&lt;/code&gt; and &lt;code&gt;Subdomain&lt;/code&gt; modes. This lets you generate multiple DNS records per domain, map subdomains to external names, or combine wildcard and per-subdomain entries in one resource.&lt;/p&gt;&#10;&lt;div class="alert alert-info" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Prerequisite&lt;/div&gt;&#10;&lt;p&gt;DNS entry creation requires the Gardener external-dns-management controller. When using the Kubernetes DNS manager, &lt;code&gt;dnsMode&lt;/code&gt; is ignored and no DNS entries are created regardless of the mode chosen.&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>Configuration</title><link>https://sap.github.io/cap-operator/docs/installation/helm/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/installation/helm/configuration/</guid><description>&lt;h2 id="optional-configuration"&gt;Optional Configuration&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;h3 id="enable-service-monitors-for-metrics"&gt;Enable Service Monitors for metrics&lt;/h3&gt;&#10;&lt;p&gt;To enable monitoring via &lt;a href="../../../usage/operator-metrics"&gt;metrics&lt;/a&gt; emitted by CAP Operator components, set the following value:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;monitoring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- enables creation of service monitors for metrics emitted by CAP Operator components&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To enable detailed operational metrics for the controller:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;detailedOperationalMetrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;h3 id="set-up-prometheus-integration-for-version-monitoring"&gt;Set up Prometheus integration for &lt;em&gt;Version Monitoring&lt;/em&gt;&lt;/h3&gt;&#10;&lt;p&gt;To use the &lt;a href="../../../usage/version-monitoring/"&gt;Version Monitoring&lt;/a&gt; feature, provide a &lt;a href="https://prometheus.io/"&gt;Prometheus&lt;/a&gt; server URL to the CAP Operator. When installing with the Helm chart, specify the following values:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;versionMonitoring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;prometheusAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://prometheus-operated.monitoring.svc.cluster.local:9090&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- example of a Prometheus server running inside the same cluster&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;promClientAcquireRetryDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2h&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metricsEvaluationInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;30m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- interval at which version metrics are evaluated&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On startup, the controller attempts to connect to the Prometheus server and fetch &lt;a href="https://prometheus.io/docs/prometheus/latest/querying/api/#runtime-information"&gt;runtime information&lt;/a&gt; to verify the connection. If the connection fails, the controller retries after the delay specified in &lt;code&gt;controller.versionMonitoring.promClientAcquireRetryDelay&lt;/code&gt;. See default values &lt;a href="../helm-values"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;div class="alert alert-info" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Note&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;When connecting the controller to a Prometheus server running inside the cluster, ensure that the &lt;code&gt;NetworkPolicy&lt;/code&gt; resources required for connecting to the service in the Prometheus namespace are also created.&lt;/li&gt;&#10;&lt;li&gt;If the Prometheus service is configured to use TLS, mount the relevant CA root certificates as volumes on the controller.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;h3 id="configure-maximum-concurrent-reconciles"&gt;Configure maximum concurrent reconciles&lt;/h3&gt;&#10;&lt;p&gt;The controller reconciles each resource type with a built-in default concurrency. To override these defaults, configure the values explicitly:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxConcurrentReconciles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;capApplication&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# default: 1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;capApplicationVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# default: 3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;capTenant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# default: 10&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;capTenantOperation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;10&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# default: 10&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# default: 1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;clusterDomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# default: 1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;h3 id="configure-controller-client-rate-limiting"&gt;Configure controller client rate limiting&lt;/h3&gt;&#10;&lt;p&gt;To control the rate at which the controller client sends requests to the Kubernetes API server, configure the QPS (queries per second) and burst values:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;clientRateLimiting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;qps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- maximum queries per second&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;burst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;30&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- maximum burst for throttle&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;h3 id="configure-controller-rollout-delay"&gt;Configure controller rollout delay&lt;/h3&gt;&#10;&lt;p&gt;To introduce a delay before the controller rolls out workloads of relevant application versions on credential update (e.g. to allow a safe rollout window), set the rollout delay:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rolloutDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1h&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- duration to wait before rolling out version workloads on credential update&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Prerequisites</title><link>https://sap.github.io/cap-operator/docs/installation/prerequisites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/installation/prerequisites/</guid><description>&lt;p&gt;We recommend using a &amp;ldquo;&lt;a href="https://gardener.cloud/"&gt;Gardener&lt;/a&gt;&amp;rdquo; managed cluster to deploy CAP applications managed with CAP Operator.&lt;/p&gt;&#10;&lt;p&gt;Set up the following prerequisites in the Kubernetes cluster before installing CAP Operator:&lt;/p&gt;&#10;&lt;h3 id="istio-version--122"&gt;&lt;a href="https://istio.io/latest/docs/concepts/traffic-management/"&gt;Istio&lt;/a&gt; (version &amp;gt;= 1.22)&lt;/h3&gt;&#10;&lt;p&gt;The Istio service mesh is used for HTTP traffic management. CAP Operator creates Istio resources to manage incoming HTTP requests to the application and to route requests on specific (tenant) subdomains.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Determine the public ingress gateway subdomain and the overall shoot domain for the system, and specify them in the &lt;a href="../helm/helm-values/"&gt;chart values&lt;/a&gt;. See &lt;a href="../helm/#installation"&gt;here&lt;/a&gt; for an example.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Prerequisites</title><link>https://sap.github.io/cap-operator/docs/usage/prerequisites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/prerequisites/</guid><description>&lt;h2 id="prepare-the-sap-btp-global-account-and-provider-subaccount"&gt;Prepare the SAP BTP global account and provider subaccount&lt;/h2&gt;&#10;&lt;p&gt;CAP-based applications use various SAP BTP services created in a provider subaccount. Before deploying the application, create a global account and entitle the required services, then create a provider subaccount where the service instances can be created. See the &lt;a href="https://help.sap.com/docs/btp/sap-business-technology-platform/account-administration"&gt;SAP BTP account administration documentation&lt;/a&gt; for details.&lt;/p&gt;&#10;&lt;h2 id="create-service-instances-and-bindings"&gt;Create service instances and bindings&lt;/h2&gt;&#10;&lt;p&gt;A multi-tenant CAP-based application consumes the following SAP BTP services. Some parameters require special attention during service instance creation. Service keys (bindings) generate access credentials that must be provided as Kubernetes Secrets in the namespace where the application is deployed.&lt;/p&gt;</description></item><item><title>Configuring Additional CA Certificates</title><link>https://sap.github.io/cap-operator/docs/usage/domain-management/additional-ca/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/domain-management/additional-ca/</guid><description>&lt;p&gt;When &lt;code&gt;tlsMode&lt;/code&gt; is set to &lt;code&gt;Mutual&lt;/code&gt; or &lt;code&gt;OptionalMutual&lt;/code&gt; on a &lt;code&gt;Domain&lt;/code&gt; or &lt;code&gt;ClusterDomain&lt;/code&gt;, Istio requires a CA certificate to verify client certificates presented during the TLS handshake. Provide this certificate via &lt;code&gt;certConfig.additionalCACertificate&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;The operator stores the certificate as a Kubernetes &lt;code&gt;Secret&lt;/code&gt; (key: &lt;code&gt;ca.crt&lt;/code&gt;) in the Istio Ingress Gateway namespace, where Istio reads it.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ClusterDomain &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# also applies to Domain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-example-domain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;myapp.example.com&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ingressSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;istio-ingressgateway&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;istio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ingressgateway&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tlsMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Mutual&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;certConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;additionalCACertificate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -----BEGIN CERTIFICATE-----&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; MIIFZjCCA06gAwIBAgIQGHcPvmUGa79M6pM42bGFYjANBgkqhkiG9w0BAQsFADBN&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -----END CERTIFICATE-----&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Removing &lt;code&gt;certConfig.additionalCACertificate&lt;/code&gt; from the spec causes the operator to delete the corresponding secret.&lt;/p&gt;</description></item><item><title>CAP Application Components</title><link>https://sap.github.io/cap-operator/docs/concepts/cap-application-components/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/concepts/cap-application-components/</guid><description>&lt;p&gt;A full-stack application built with the SAP Cloud Application Programming Model has the following components:&lt;/p&gt;&#10;&lt;h3 id="sap-btp-service-instances"&gt;SAP BTP Service Instances&lt;/h3&gt;&#10;&lt;p&gt;Multi-tenant CAP-based applications consume services from SAP BTP such as &lt;a href="https://help.sap.com/docs/authorization-and-trust-management-service?locale=en-US"&gt;SAP Authorization and Trust Management Service&lt;/a&gt; and SAP Software-as-a-Service Provisioning service. You need to create these service instances within an SAP BTP provider account along with service keys (bindings) that generate the credentials used by the application to access these services.&lt;/p&gt;&#10;&lt;h3 id="cap-application-server"&gt;CAP Application Server&lt;/h3&gt;&#10;&lt;p&gt;The application provides data models that are deployed to the connected database. An HTTP server exposes defined services and handles server-side application logic. For more details, see &lt;a href="https://cap.cloud.sap/docs"&gt;the SAP Cloud Application Programming Model documentation&lt;/a&gt;. It is also possible to split the application into multiple servers (services) that work together.&lt;/p&gt;</description></item><item><title>CAPApplicationVersion</title><link>https://sap.github.io/cap-operator/docs/usage/resources/capapplicationversion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/capapplicationversion/</guid><description>&lt;p&gt;The &lt;code&gt;CAPApplicationVersion&lt;/code&gt; has the following high-level structure:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CAPApplicationVersion&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cav-cap-app-v1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-ns&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3.2.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- semantic version (must be unique within the versions of a CAP application)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;capApplicationInstance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;registrySecrets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- image pull secrets to be used in the workloads&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;regcred&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;workloads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- define deployments and jobs used for this application version&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cap-backend&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploymentDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;consumedBTPServices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;app-router&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploymentDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;consumedBTPServices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;service-content&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jobDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;consumedBTPServices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tenant-operation&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jobDefinition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;consumedBTPServices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tenantOperations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ... &amp;lt;-- (optional)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;A &lt;code&gt;CAPApplicationVersion&lt;/code&gt; is always associated with a &lt;code&gt;CAPApplication&lt;/code&gt; in the same namespace, referenced via the &lt;code&gt;capApplicationInstance&lt;/code&gt; attribute.&lt;/li&gt;&#10;&lt;li&gt;The &lt;code&gt;workloads&lt;/code&gt; array defines the software components of the application. Examples include a deployment for the CAP application server or a job for tenant operations. Each workload must have either a &lt;code&gt;deploymentDefinition&lt;/code&gt; or a &lt;code&gt;jobDefinition&lt;/code&gt;. See the next section for details.&lt;/li&gt;&#10;&lt;li&gt;The optional &lt;code&gt;tenantOperations&lt;/code&gt; attribute defines a sequence of steps (jobs) to execute during tenant operations (provisioning, upgrade, or deprovisioning).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;The &lt;code&gt;CAPApplicationVersion&lt;/code&gt; resource is immutable — its spec must not be modified after deployment. This is enforced by webhooks, which we recommend keeping active (the default).&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Deploying a CAP Application</title><link>https://sap.github.io/cap-operator/docs/usage/deploying-application/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/deploying-application/</guid><description>&lt;p&gt;Deploying a multi-tenant CAP application involves defining several key resources provided by CAP Operator. These resources manage the application&amp;rsquo;s runtime components and external traffic routing.&lt;/p&gt;&#10;&lt;h2 id="key-resources"&gt;Key Resources&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;CAPApplication&lt;/strong&gt; (&lt;code&gt;capapplications.sme.sap.com&lt;/code&gt;): A namespaced resource that represents the application.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;CAPApplicationVersion&lt;/strong&gt; (&lt;code&gt;capapplicationversions.sme.sap.com&lt;/code&gt;): A namespaced resource that specifies the version of the application being deployed. It ensures that all runtime components (Deployments, Services, and Jobs) are created with the specified image version in the same namespace.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Domain resources&lt;/strong&gt;: These resources determine how external traffic reaches the application and how DNS and TLS settings are applied. You can choose between:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Domain&lt;/strong&gt; (&lt;code&gt;domains.sme.sap.com&lt;/code&gt;): A namespaced resource for a single application.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ClusterDomain&lt;/strong&gt; (&lt;code&gt;clusterdomains.sme.sap.com&lt;/code&gt;): A cluster-scoped resource that can be shared across multiple applications.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;</description></item><item><title>Helm Values</title><link>https://sap.github.io/cap-operator/docs/installation/helm/helm-values/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/installation/helm/helm-values/</guid><description>&lt;div id="yaml-tree-wrapper" class="crd"&gt;&#10; &lt;div class="crd" style="max-width:100%"&gt;&#10; &lt;div class="crdTree"&gt;&#10;&#10; &lt;div class="controls" style="margin-top:15px; justify-content: flex-start;"&gt;&#10;&#10; &lt;button id="btnExpandAll" type="button" class="btn"&gt;Expand All&lt;/button&gt;&#10; &lt;button id="btnCollapseAll" type="button" class="btn"&gt;Collapse All&lt;/button&gt;&#10;&#10; &lt;div&gt;&#10; &lt;input id="searchInput" class="td-search__input" placeholder="Search keys..." /&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&#10; &lt;div id="treeRoot" class="tree-root"&gt;&lt;/div&gt;&#10;&#10; &lt;div style="margin-top:20px"&gt;&#10;&#10; &#10; &#10; &#10; &lt;textarea id="yaml-data-source" style="display:none;"&gt;image:&#10; # -- Default image tag (can be overwritten on component level)&#10; tag: &amp;#34;&amp;#34;&#10; # -- Default image pull policy (can be overwritten on component level)&#10; pullPolicy: &amp;#34;&amp;#34;&#10;# -- Default image pull secrets (can be overwritten on component level)&#10;imagePullSecrets: []&#10;# -- Default pod security content (can be overwritten on component level)&#10;podSecurityContext: {}&#10;# -- Default node selector (can be overwritten on component level)&#10;nodeSelector: {}&#10;# -- Default affinity settings (can be overwritten on component level)&#10;affinity: {}&#10;# -- Default tolerations (can be overwritten on component level)&#10;tolerations: []&#10;# -- Default priority class (can be overwritten on component level)&#10;priorityClassName: &amp;#34;&amp;#34;&#10;# -- Default topology spread constraints (can be overwritten on component level)&#10;topologySpreadConstraints: []&#10;# -- Additional pod labels for all components&#10;podLabels: {}&#10;# -- Additional pod annotations for all components&#10;podAnnotations: {}&#10;# -- Monitoring configuration for all components&#10;monitoring:&#10; # -- Optionally enable Prometheus monitoring for all components (disabled by default)&#10; enabled: false&#10; # -- Prometheus service monitor selector labels&#10; serviceMonitorSelectorLabels: {}&#10; # -- Grafana configuration&#10; grafana:&#10; dashboard:&#10; # -- Labels for selecting ConfigMaps with dashboards in Grafana&#10; configMapLabels:&#10; grafana_dashboard: &amp;#34;1&amp;#34;&#10;&#10;controller:&#10; # -- Replicas&#10; replicas: 1&#10; image:&#10; # -- Image repository&#10; repository: ghcr.io/sap/cap-operator/controller&#10; # -- Image tag&#10; tag: &amp;#34;&amp;#34;&#10; # -- Image pull policy&#10; pullPolicy: &amp;#34;&amp;#34;&#10; # -- Image pull secrets&#10; imagePullSecrets: []&#10; # -- Additional labels for controller pods&#10; podLabels: {}&#10; # -- Additional annotations for controller pods&#10; podAnnotations: {}&#10; # -- Pod security content&#10; podSecurityContext: {}&#10; # -- Node selector&#10; nodeSelector: {}&#10; # -- Affinity settings&#10; affinity: {}&#10; # -- Tolerations&#10; tolerations: []&#10; # -- Priority class&#10; priorityClassName: &amp;#34;&amp;#34;&#10; # -- Topology spread constraints&#10; topologySpreadConstraints: []&#10; # -- Security context&#10; securityContext: {}&#10; resources:&#10; limits:&#10; # -- Memory limit&#10; memory: 500Mi&#10; # -- CPU limit&#10; cpu: 0.2&#10; requests:&#10; # -- Memory request&#10; memory: 50Mi&#10; # -- CPU request&#10; cpu: 0.02&#10; # -- Optionally specify list of additional volumes for the controller pod(s)&#10; volumes: []&#10; # -- Optionally specify list of additional volumeMounts for the controller container(s)&#10; volumeMounts: []&#10; # -- Override the cert manager type (e.g. &amp;#34;gardener&amp;#34; or &amp;#34;cert-manager.io&amp;#34;); if empty, auto-detected via API capabilities&#10; certManager: &amp;#34;&amp;#34;&#10; # -- Override the DNS manager type (e.g. &amp;#34;gardener&amp;#34; or &amp;#34;kubernetes&amp;#34;); if empty, auto-detected via API capabilities&#10; dnsManager: &amp;#34;&amp;#34;&#10; # -- The dns target mentioned on the public ingress gateway service used in the cluster&#10; dnsTarget: &amp;#34;&amp;#34;&#10; # -- Optionally enable detailed opertational metrics for the controller by setting this to true&#10; detailedOperationalMetrics: false&#10; maxConcurrentReconciles:&#10; # -- The maximum number of concurrent reconciles (e.g. &amp;#34;1&amp;#34;) for the cap application&#10; capApplication: &amp;#34;&amp;#34;&#10; # -- The maximum number of concurrent reconciles (e.g. &amp;#34;3&amp;#34;) for the cap application version&#10; capApplicationVersion: &amp;#34;&amp;#34;&#10; # -- The maximum number of concurrent reconciles (e.g. &amp;#34;10&amp;#34;) for the cap tenant&#10; capTenant: &amp;#34;&amp;#34;&#10; # -- The maximum number of concurrent reconciles (e.g. &amp;#34;10&amp;#34;) for the cap tenant operation&#10; capTenantOperation: &amp;#34;&amp;#34;&#10; # -- The maximum number of concurrent reconciles (e.g. &amp;#34;1&amp;#34;) for the domain&#10; domain: &amp;#34;&amp;#34;&#10; # -- The maximum number of concurrent reconciles (e.g. &amp;#34;1&amp;#34;) for the cluster domain&#10; clusterDomain: &amp;#34;&amp;#34;&#10; versionMonitoring:&#10; # -- The URL of the Prometheus server from which metrics related to managed application versions can be queried&#10; prometheusAddress: &amp;#34;&amp;#34;&#10; # -- The duration (example 2h) after which versions are evaluated for deletion; based on specified workload metrics&#10; metricsEvaluationInterval: &amp;#34;1h&amp;#34;&#10; # -- The duration (example 10m) to wait before retrying to acquire Prometheus client and verify connection, after a failed attempt&#10; promClientAcquireRetryDelay: &amp;#34;1h&amp;#34;&#10; clientRateLimiting:&#10; # -- The maximum queries per second from the controller client to the kubernetes API server (e.g. &amp;#34;20&amp;#34;)&#10; qps: &amp;#34;&amp;#34;&#10; # -- The maximum burst for throttle (e.g. &amp;#34;30&amp;#34;)&#10; burst: &amp;#34;&amp;#34;&#10; # -- The delay (example 1h) to wait before rolling out version workloads on credential update&#10; rolloutDelay: &amp;#34;&amp;#34;&#10;&#10;subscriptionServer:&#10; # -- Replicas&#10; replicas: 1&#10; image:&#10; # -- Image repository&#10; repository: ghcr.io/sap/cap-operator/server&#10; # -- Image tag&#10; tag: &amp;#34;&amp;#34;&#10; # -- Image pull policy&#10; pullPolicy: &amp;#34;&amp;#34;&#10; # -- Image pull secrets&#10; imagePullSecrets: []&#10; # -- Additional labels for subscription server pods&#10; podLabels: {}&#10; # -- Additional annotations for subscription server pods&#10; podAnnotations: {}&#10; # -- Pod security content&#10; podSecurityContext: {}&#10; # -- Node selector&#10; nodeSelector: {}&#10; # -- Affinity settings&#10; affinity: {}&#10; # -- Tolerations&#10; tolerations: []&#10; # -- Priority class&#10; priorityClassName: &amp;#34;&amp;#34;&#10; # -- Topology spread constraints&#10; topologySpreadConstraints: []&#10; # -- Security context&#10; securityContext: {}&#10; resources:&#10; limits:&#10; # -- Memory limit&#10; memory: 200Mi&#10; # -- CPU limit&#10; cpu: 0.1&#10; requests:&#10; # -- Memory request&#10; memory: 20Mi&#10; # -- CPU request&#10; cpu: 0.01&#10; # -- Optionally specify list of additional volumes for the server pod(s)&#10; volumes: []&#10; # -- Optionally specify list of additional volumeMounts for the server container(s)&#10; volumeMounts: []&#10; # -- Service port&#10; port: 4000&#10; # -- The namespace in the cluster where istio system components are installed&#10; istioSystemNamespace: istio-system&#10; # -- Labels used to identify the istio ingress-gateway component&#10; ingressGatewayLabels:&#10; istio: ingressgateway&#10; app: istio-ingressgateway&#10; # -- The dns target mentioned on the public ingress gateway service used in the cluster&#10; dnsTarget: public-ingress.clusters.cs.services.sap # replace with the actual cluster domain&#10; # -- The domain under which the cap operator subscription server would be available&#10; domain: cap-operator.clusters.cs.services.sap # replace with actual cluster domain&#10; # -- Certificate manager which can be either `Gardener` or `CertManager`&#10; certificateManager: Gardener&#10; # -- Certificate configuration&#10; # @default -- the `additionalCACertificate` part will contain the &amp;#34;SAP Cloud Root CA&amp;#34; certificate by default&#10; certificateConfig:&#10; # -- Optionally specify the corresponding certificate configuration&#10; gardener:&#10; # -- Issuer name&#10; issuerName: &amp;#34;&amp;#34;&#10; # -- Issuer namespace&#10; issuerNamespace: &amp;#34;&amp;#34;&#10; # -- Cert Manager configuration&#10; certManager:&#10; # -- Issuer group&#10; issuerGroup: &amp;#34;&amp;#34;&#10; # -- Issuer kind&#10; issuerKind: &amp;#34;&amp;#34;&#10; # -- Issuer name&#10; issuerName: &amp;#34;&amp;#34;&#10; # -- Optionally specify the common name (at most 64 characters). Not needed in most scenarios.&#10; commonName: &amp;#34;&amp;#34;&#10; # -- Optionally specify additional CA Certificate&#10; # @default -- this will contain the &amp;#34;SAP Cloud Root CA&amp;#34; certificate by default&#10; additionalCACertificate: |&#10; -----BEGIN CERTIFICATE-----&#10; MIIFZjCCA06gAwIBAgIQGHcPvmUGa79M6pM42bGFYjANBgkqhkiG9w0BAQsFADBN&#10; MQswCQYDVQQGEwJERTERMA8GA1UEBwwIV2FsbGRvcmYxDzANBgNVBAoMBlNBUCBT&#10; RTEaMBgGA1UEAwwRU0FQIENsb3VkIFJvb3QgQ0EwHhcNMTkwMjEzMTExOTM2WhcN&#10; MzkwMjEzMTEyNjMyWjBNMQswCQYDVQQGEwJERTERMA8GA1UEBwwIV2FsbGRvcmYx&#10; DzANBgNVBAoMBlNBUCBTRTEaMBgGA1UEAwwRU0FQIENsb3VkIFJvb3QgQ0EwggIi&#10; MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChbHLXJoe/zFag6fB3IcN3d3HT&#10; Y14nSkEZIuUzYs7B96GFxQi0T/2s971JFiLfB4KaCG&amp;#43;UcG3dLXf1H/wewq8ahArh&#10; FTsu4UR71ePUQiYlk/G68EFSy2zWYAJliXJS5k0DFMIWHD1lbSjCF3gPVJSUKf&amp;#43;v&#10; HmWD5e9vcuiPBlSCaEnSeimYRhg0ITmi3RJ4Wu7H0Xp7tDd5z4HUKuyi9XRinfvG&#10; kPALiBaX01QRC51cixmo0rhVe7qsNh7WDnLNBZeA0kkxNhLKDl8J6fQHKDdDEzmZ&#10; KhK5KxL5p5YIZWZ8eEdNRoYRMXR0PxmHvRanzRvSVlXSbfqxaKlORfJJ1ah1bRNt&#10; o0ngAQchTghsrRuf3Qh/2Kn29IuBy4bjKR9CdNLxGrClvX/q26rUUlz6A3lbXbwJ&#10; EHSRnendRfEiia&amp;#43;xfZD&amp;#43;NG2oZW0IdTXSqkCbnBnign&amp;#43;uxGH5ECjuLEtvtUx6i9Ae&#10; xAvK2FqIuud&amp;#43;AchqiZBKzmQAhUjKUoACzNP2Bx2zgJOeB0BqGvf6aldG0n2hYxJF&#10; 8Xssc8TBlwvAqtiubP/UxJJPs&amp;#43;IHqU&amp;#43;zjm7KdP6dM2sbE&amp;#43;J9O3n8DzOP0SDyEmWU&#10; UCwnmoPOQlq1z6fH9ghcp9bDdbh6adXM8I&amp;#43;SUYUcfvupOzBU7rWHxDCXld/24tpI&#10; FA7FRzHwKXqMSjwtBQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/&#10; BAUwAwEB/zAdBgNVHQ4EFgQUHLxmKw7KjUufjZNxqQ/KZ0ZpEyIwDQYJKoZIhvcN&#10; AQELBQADggIBABdSKQsh3EfVoqplSIx6X43y2Pp&amp;#43;kHZLtEsRWMzgO5LhYy2/Fvel&#10; eRBw/XEiB5iKuEGhxHz/Gqe0gZixw3SsHB1Q464EbGT4tPQ2UiMhiiDho9hVe6tX&#10; qX1FhrhycAD1xHIxMxQP/buX9s9arFZauZrpw/Jj4tGp7aEj4hypWpO9tzjdBthy&#10; 5vXSviU8L2HyiQpVND/Rp&amp;#43;dNJmVYTiFLuULRY28QbikgFO2xp9s4RNkDBnbDeTrT&#10; CKWcVsmlZLPJJQZm0n2p8CvoeAsKzIULT9YSbEEBwmeqRlmbUaoT/rUGoobSFcrP&#10; jrBg66y5hA2w7S3tDH0GjMpRu16b2u0hYQocUDuMlyhrkhsO&amp;#43;Qtqkz1ubwHCJ8PA&#10; RJw6zYl9VeBtgI5F69AEJdkAgYfvPw5DJipgVuQDSv7ezi6ZcI75939ENGjSyLVy&#10; 4SuP99G7DuItG008T8AYFUHAM2h/yskVyvoZ8&amp;#43;gZx54TC9aY9gPIKyX&amp;#43;&amp;#43;4bHv5BC&#10; qbEdU46N05R&amp;#43;AIBW2KvWozQkjhSQCbzcp6DHXLoZINI6y0WOImzXrvLUSIm4CBaj&#10; 6MTXInIkmitdURnmpxTxLva5Kbng/u20u5ylIQKqpcD8HWX97lLVbmbnPkbpKxo&amp;#43;&#10; LvHPhNDM3rMsLu06agF4JTbO8ANYtWQTx0PVrZKJu&amp;#43;8fcIaUp7MVBIVZ&#10; -----END CERTIFICATE-----&#10;&#10;webhook:&#10; # -- Replicas&#10; replicas: 1&#10; image:&#10; # -- Image repository&#10; repository: ghcr.io/sap/cap-operator/web-hooks&#10; # -- Image tag&#10; tag: &amp;#34;&amp;#34;&#10; # -- Image pull policy&#10; pullPolicy: &amp;#34;&amp;#34;&#10; # -- Image pull secrets&#10; imagePullSecrets: []&#10; # -- Additional labels for validating webhook pods&#10; podLabels: {}&#10; # -- Additional annotations for validating webhook pods&#10; podAnnotations: {}&#10; # -- Pod security content&#10; podSecurityContext: {}&#10; # -- Node selector&#10; nodeSelector: {}&#10; # -- Affinity settings&#10; affinity: {}&#10; # -- Tolerations&#10; tolerations: []&#10; # -- Priority class&#10; priorityClassName: &amp;#34;&amp;#34;&#10; # -- Topology spread constraints&#10; topologySpreadConstraints: []&#10; # -- Security context&#10; securityContext: {}&#10; resources:&#10; limits:&#10; # -- Memory limit&#10; memory: 200Mi&#10; # -- CPU limit&#10; cpu: 0.1&#10; requests:&#10; # -- Memory request&#10; memory: 20Mi&#10; # -- CPU request&#10; cpu: 0.01&#10; # -- Service port&#10; service:&#10; # -- Service type&#10; type: ClusterIP&#10; # -- Service port&#10; port: 443&#10; # -- Target port&#10; targetPort: 1443&#10; # -- Optionally specify list of additional volumes for the webhook pod(s)&#10; volumes: []&#10; # -- Optionally specify list of additional volumeMounts for the webhook container(s)&#10; volumeMounts: []&#10; # -- Certificate manager which can be either `Default` or `CertManager`&#10; certificateManager: &amp;#34;Default&amp;#34;&#10; # -- Optionally specify the corresponding certificate configuration&#10; certificateConfig:&#10; certManager:&#10; # -- Issuer group&#10; issuerGroup: &amp;#34;&amp;#34;&#10; # -- Issuer kind&#10; issuerKind: &amp;#34;&amp;#34;&#10; # -- Issuer name&#10; issuerName: &amp;#34;&amp;#34;&#10;&lt;/textarea&gt;&#10; &#10;&#10; &lt;textarea id="yamlInput" class="yaml-in" style="display:none;"&gt;&lt;/textarea&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;style&gt;&#10; &#10; #yaml-tree-wrapper * {&#10; box-sizing: border-box;&#10; }&#10;&#10; #yaml-tree-wrapper {&#10; font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;&#10; padding: 1rem;&#10; background: #ffffff;&#10; color: #333;&#10; overflow-x: hidden;&#10; }&#10;&#10; &#10; #yaml-tree-wrapper .crd {&#10; width: 100%;&#10; margin: 0 auto;&#10; border-radius: 12px;&#10; padding: 1.5rem; &#10; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);&#10; background: #ffffff;&#10; border: 1px solid #e0e6ed;&#10; }&#10;&#10; &#10; #yaml-tree-wrapper .crdSelection {&#10; display: flex;&#10; gap: 1rem;&#10; margin-bottom: 1.25rem;&#10; border-bottom: 1px solid #e0e6ed;&#10; }&#10;&#10; #yaml-tree-wrapper .crdSelection button {&#10; padding: 0.5rem 0.75rem;&#10; border-radius: 6px 6px 0 0;&#10; border: 0;&#10; background: transparent;&#10; cursor: pointer;&#10; transition: color 0.2s;&#10; font-size: 1rem;&#10; }&#10;&#10; #yaml-tree-wrapper .crdTreeHeaderActive {&#10; border-bottom: 3px solid #15a5eb;&#10; color: #111;&#10; font-weight: 700;&#10; }&#10;&#10; #yaml-tree-wrapper .crdTreeHeader {&#10; color: #777;&#10; font-weight: 600;&#10; font-size: 1.1em;&#10; }&#10;&#10; #yaml-tree-wrapper .crdObject {&#10; margin-bottom: 1.25rem;&#10; margin-top: 1rem;&#10; position: relative;&#10; padding-right: 120px;&#10; }&#10;&#10; #yaml-tree-wrapper .crdObject.depth-0 {&#10; border-bottom: 1px solid #f0f2f5;&#10; margin-bottom: 1.5rem;&#10; margin-top: 1.25rem;&#10; padding-bottom: 1.5rem;&#10; }&#10;&#10; #yaml-tree-wrapper .crdObjectHeader {&#10; align-items: center;&#10; display: flex;&#10; gap: 0.75rem;&#10; }&#10;&#10; #yaml-tree-wrapper .crdHeaderButton {&#10; background: transparent;&#10; border: 0;&#10; padding: 4px 0;&#10; font-size: 1rem;&#10; font-weight: 600;&#10; color: #2c3e50;&#10; cursor: pointer;&#10; }&#10;&#10; &#10; #yaml-tree-wrapper .crdObjectValue {&#10; margin: 0.5rem 0 0.5rem 9px;&#10; padding: 5px 10px;&#10; font-weight: 500;&#10; font-style: normal;&#10; color: #555;&#10; font-size: 0.8rem;&#10; background: #f0f4f8;&#10; border: 1px solid #d8e2ed;&#10; border-radius: 4px;&#10; white-space: pre-wrap;&#10; display: inline-block;&#10; max-width: 100%;&#10; overflow-x: auto;&#10; font-family: 'Roboto Mono', monospace;&#10; }&#10;&#10; &#10; #yaml-tree-wrapper .crdOpenButton {&#10; background: #fff;&#10; border: 1px solid #ccc;&#10; border-radius: 50%;&#10; cursor: pointer;&#10; display: block;&#10; height: 22px;&#10; width: 22px;&#10; position: relative;&#10; margin-left: 0;&#10; transition: border-color 0.2s, background 0.2s;&#10; flex-shrink: 0;&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButton:after,&#10; #yaml-tree-wrapper .crdOpenButton:before {&#10; background: #555;&#10; border-radius: .2rem;&#10; bottom: 0;&#10; content: '';&#10; display: block;&#10; height: 10px;&#10; left: 0;&#10; margin: auto;&#10; position: absolute;&#10; right: 0;&#10; top: 0;&#10; transition: transform .3s ease-in-out, opacity .3s ease-in-out, background 0.2s;&#10; width: 2px;&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButton:after {&#10; height: 2px;&#10; width: 10px;&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButtonActive {&#10; border-color: #15a5eb;&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButtonActive:before {&#10; transform: rotate(90deg)&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButtonActive:after {&#10; opacity: 0;&#10; transform: rotate(180deg)&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButtonDisabled {&#10; visibility: hidden;&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButtonDisabled:after,&#10; #yaml-tree-wrapper .crdOpenButtonDisabled:before {&#10; background: #ccc;&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButton:hover:not(.crdOpenButtonDisabled) {&#10; border-color: #15a5eb;&#10; background: #e6f7ff;&#10; }&#10;&#10; #yaml-tree-wrapper .crdOpenButton:hover:not(.crdOpenButtonDisabled):after,&#10; #yaml-tree-wrapper .crdOpenButton:hover:not(.crdOpenButtonDisabled):before {&#10; background: #15a5eb;&#10; }&#10;&#10;&#10; &#10; #yaml-tree-wrapper .crdObjectContainer {&#10; border-left: 1px solid #ebf1f7;&#10; margin-left: 11px;&#10; margin-top: 0.5rem;&#10; padding-left: 1.25rem;&#10; }&#10;&#10; &#10; #yaml-tree-wrapper .yaml-in {&#10; width: 100%;&#10; height: 240px;&#10; font-family: 'Fira Code', 'Roboto Mono', monospace;&#10; font-size: 0.8rem;&#10; margin-top: 0.75rem;&#10; box-sizing: border-box;&#10; padding: 0.75rem;&#10; border: 1px solid #dcdfe6;&#10; border-radius: 8px;&#10; background-color: #fcfcfc;&#10; resize: vertical;&#10; }&#10;&#10; #yaml-tree-wrapper #yamlInput {&#10; display: none !important;&#10; }&#10;&#10; #yaml-tree-wrapper .controls {&#10; display: flex;&#10; flex-wrap: wrap;&#10; gap: 0.75rem;&#10; margin-top: 1rem;&#10; align-items: center&#10; }&#10;&#10; #yaml-tree-wrapper .controls button,&#10; #yaml-tree-wrapper .controls label[for="filePicker"] {&#10; padding: 0.5rem 1rem;&#10; border-radius: 6px;&#10; border: 1px solid #dcdfe6;&#10; background: white;&#10; cursor: pointer;&#10; font-weight: 500;&#10; transition: background 0.2s, border-color 0.2s;&#10; }&#10;&#10; #yaml-tree-wrapper #btnParse {&#10; background: #15a5eb;&#10; color: white;&#10; border-color: #15a5eb;&#10; font-weight: 600;&#10; }&#10;&#10; #yaml-tree-wrapper #btnParse:hover {&#10; background: #0d8cc8;&#10; border-color: #0d8cc8;&#10; }&#10;&#10; #yaml-tree-wrapper .controls button:hover:not(#btnParse) {&#10; background: #f0f4f8;&#10; border-color: #c9d5e3;&#10; }&#10;&#10; #yaml-tree-wrapper input[type=file] {&#10; display: none&#10; }&#10;&#10; #yaml-tree-wrapper .small {&#10; font-size: 0.75rem;&#10; color: #888;&#10; margin-left: 0.5rem&#10; }&#10;&#10; #yaml-tree-wrapper #searchInput {&#10; padding: 0.5rem 0.75rem;&#10; border: 1px solid #dcdfe6;&#10; border-radius: 6px;&#10; width: 100%;&#10; max-width: 250px;&#10; color: inherit;&#10; background-color: inherit;&#10; }&#10;&#10; &#10; #yaml-tree-wrapper .crdObjectDescription {&#10; margin: 6px 0 6px 34px;&#10; padding: 0;&#10; color: #5a6a7c;&#10; font-size: 0.8rem;&#10; background: transparent;&#10; border-left: none;&#10; border-radius: 0;&#10; box-shadow: none;&#10; white-space: pre-wrap;&#10; font-style: italic;&#10; line-height: 1.4;&#10; }&#10;&#10; &#10; #yaml-tree-wrapper .type-badge {&#10; position: absolute;&#10; right: 0;&#10; top: 15px;&#10; margin-right: 0;&#10; padding: 4px 10px;&#10; font-size: 0.8rem;&#10; font-weight: 700;&#10; color: #fff;&#10; text-transform: lowercase;&#10; border: 1px solid #e4e4e4;&#10; border-radius: 5px;&#10; color: #505a72;&#10; padding: 2px 8px;&#10; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);&#10; }&#10;&#10; &#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper {&#10; background: #1e1e1e !important;&#10; color: #cccccc !important;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crd {&#10; background: #252526;&#10; border: 1px solid #3c3c3c;&#10; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdHeaderButton {&#10; color: #e0e0e0;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdObjectDescription {&#10; color: #999999;&#10; }&#10;&#10; &#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .controls button,&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .controls label[for="filePicker"],&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper #searchInput {&#10; background: #333333;&#10; border-color: #555555;&#10; color: #e0e0e0;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .controls button:hover:not(#btnParse) {&#10; background: #444444;&#10; border-color: #666666;&#10; }&#10;&#10; &#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdObjectValue {&#10; background: #3a3a3a;&#10; border: 1px solid #5a5a5a;&#10; color: #cccccc;&#10; }&#10;&#10; &#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdObject.depth-0 {&#10; border-bottom: 1px solid #3c3c3c;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdObjectContainer {&#10; border-left: 1px solid #3c3c3c;&#10; }&#10;&#10; &#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdOpenButton {&#10; background: #444444;&#10; border: 1px solid #666666;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdOpenButton:after,&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdOpenButton:before {&#10; background: #cccccc;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdOpenButtonDisabled {&#10; visibility: hidden;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdOpenButton:hover:not(.crdOpenButtonDisabled) {&#10; background: #555555;&#10; border-color: #777777;&#10; }&#10;&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdOpenButton:hover:not(.crdOpenButtonDisabled):after,&#10; :root[data-bs-theme="dark"] #yaml-tree-wrapper .crdOpenButton:hover:not(.crdOpenButtonDisabled):before {&#10; background: #ffffff;&#10; }&#10;&#10; &#10; @media (max-width: 600px) {&#10; #yaml-tree-wrapper .crd {&#10; padding: 1rem;&#10; }&#10;&#10; #yaml-tree-wrapper .controls {&#10; flex-direction: column;&#10; align-items: stretch;&#10; gap: 0.5rem;&#10; }&#10;&#10; #yaml-tree-wrapper .controls &gt; * {&#10; width: 100%;&#10; margin-left: 0 !important;&#10; }&#10;&#10; #yaml-tree-wrapper .crdObject {&#10; padding-right: 0;&#10; margin-bottom: 1.5rem;&#10; }&#10;&#10; #yaml-tree-wrapper .type-badge {&#10; position: static;&#10; margin-top: 5px;&#10; display: block;&#10; width: fit-content;&#10; margin-left: 34px;&#10; }&#10;&#10; #yaml-tree-wrapper .crdObjectContainer {&#10; padding-left: 1rem;&#10; }&#10;&#10; #yaml-tree-wrapper #searchInput {&#10; max-width: 100%;&#10; width: 100%;&#10; margin-top: 0 !important;&#10; margin-bottom: 5px;&#10; }&#10;&#10; #yaml-tree-wrapper .crdObjectHeader {&#10; flex-wrap: nowrap;&#10; }&#10;&#10; #yaml-tree-wrapper .crdHeaderButton {&#10; white-space: nowrap;&#10; overflow: hidden;&#10; text-overflow: ellipsis;&#10; max-width: calc(100% - 30px);&#10; }&#10; }&#10;&#10; #yaml-tree-wrapper .type-object {&#10; background-color: #d1efff;&#10; border-color: #0057d2;&#10; color: #0057d2;&#10; }&#10;&#10; #yaml-tree-wrapper .type-array {&#10; background-color: #ffef9f;&#10; border-color: #d27700;&#10; color: #d27700;&#10; }&#10;&#10; #yaml-tree-wrapper .type-string {&#10; background-color: #e5f2bd;&#10; border-color: #256f3a;&#10; color: #256f3a;&#10; }&#10;&#10; #yaml-tree-wrapper .type-integer {&#10; background-color: #99f6ff;&#10; border-color: #2e5f64;&#10; color: #2e5f64&#10; }&#10;&#10; #yaml-tree-wrapper .type-float {&#10; background-color: #99f6ff;&#10; border-color: #2e5f64;&#10; color: #2e5f64&#10; }&#10;&#10; #yaml-tree-wrapper .type-boolean {&#10; background-color: #e2d8ff;&#10; border-color: #470ced;&#10; color: #470ced;&#10; }&#10;&#10; #yaml-tree-wrapper .type-null {&#10; background: #95a5a6;&#10; }&#10;&#10; #yaml-tree-wrapper .type-unknown {&#10; background: #bdc3c7;&#10; }&#10;&lt;/style&gt;&#10;&#10;&lt;script src="https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/dist/js-yaml.min.js"&gt;&lt;/script&gt;&#10;&#10;&lt;script&gt;&#10; (function () {&#10; &#10; const yamlInput = document.getElementById('yamlInput');&#10; const treeRoot = document.getElementById('treeRoot');&#10; const btnExpandAll = document.getElementById('btnExpandAll');&#10; const btnCollapseAll = document.getElementById('btnCollapseAll');&#10; const searchInput = document.getElementById('searchInput');&#10;&#10; let commentsMap = {};&#10;&#10; function el(tag, cls, text) {&#10; const d = document.createElement(tag);&#10; if (cls) d.className = cls;&#10; if (text !== undefined) d.textContent = text;&#10; return d;&#10; }&#10;&#10; function escapeHtml(str) {&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;');&#10; }&#10;&#10; &#10; function cleanCommentBlock(raw) {&#10; if (!raw) return raw;&#10; const lines = raw.split(/\r?\n/).map(l =&gt; l.replace(/^\s*--\s?/, '').replace(/^\s*-\s?/, '').replace(/^\s+/, ''));&#10; while (lines.length &amp;&amp; lines[0] === '') lines.shift();&#10; while (lines.length &amp;&amp; lines[lines.length - 1] === '') lines.pop();&#10; return lines.join('\n').trim();&#10; }&#10;&#10; &#10; function inferType(value) {&#10; if (value === null) return 'null';&#10; if (Array.isArray(value)) return 'array';&#10; const t = typeof value;&#10; if (t === 'object') return 'object';&#10; if (t === 'string') return 'string';&#10; if (t === 'number') {&#10; return String(value).includes('.') ? 'float' : 'integer';&#10; }&#10; if (t === 'boolean') return 'boolean';&#10; return 'unknown';&#10; }&#10;&#10; &#10; function buildTree(obj, keyName, depth = 0, path) {&#10; const container = el('div', 'crdObject depth-' + Math.min(depth, 5));&#10; const header = el('div', 'crdObjectHeader depth-' + Math.min(depth, 5));&#10;&#10; const isPrimitive = obj === null || typeof obj !== 'object' || (Array.isArray(obj) &amp;&amp; obj.length === 0) || (Object.keys(obj || {}).length === 0 &amp;&amp; !Array.isArray(obj));&#10;&#10; const toggle = el('button', 'crdOpenButton');&#10; toggle.type = 'button';&#10; toggle.setAttribute('aria-expanded', String(!isPrimitive));&#10; if (isPrimitive) {&#10; toggle.classList.add('crdOpenButtonDisabled');&#10; }&#10; header.appendChild(toggle);&#10;&#10; const headerBtn = el('button', 'crdHeaderButton', keyName || (Array.isArray(obj) ? 'items' : typeof obj));&#10; headerBtn.type = 'button';&#10; header.appendChild(headerBtn);&#10;&#10; container.appendChild(header);&#10;&#10; &#10; if (path &amp;&amp; commentsMap[path]) {&#10; const commentDiv = el('div', 'crdObjectDescription');&#10; commentDiv.innerHTML = escapeHtml(commentsMap[path]);&#10; container.appendChild(commentDiv);&#10; }&#10;&#10; const typeName = inferType(obj);&#10; const badge = el('div', 'type-badge type-' + (typeName || 'unknown'), typeName);&#10; container.appendChild(badge);&#10;&#10; const inner = el('div', 'crdObjectContainer');&#10;&#10; if (!isPrimitive) {&#10; inner.hidden = true; &#10; } else {&#10; inner.hidden = false; &#10; }&#10;&#10; if (isPrimitive &amp;&amp; typeof obj !== 'object') {&#10;&#10; &#10; const val = (obj === null) ? 'null' : (typeof obj === 'string' &amp;&amp; obj === '') ? '' : String(obj);&#10;&#10; if (val !== '') {&#10; const display = el('div', 'crdObjectValue');&#10;&#10; let displayVal = escapeHtml(val);&#10;&#10; if (typeName === 'string') {&#10; display.innerHTML = `"${displayVal}"`;&#10; } else {&#10; display.innerHTML = `${displayVal}`;&#10; }&#10;&#10; inner.appendChild(display);&#10; }&#10; } else if (!isPrimitive) {&#10; if (Array.isArray(obj)) {&#10; obj.forEach((it, idx) =&gt; {&#10; const childPath = path ? (path + '.items') : 'items';&#10; inner.appendChild(buildTree(it, 'items[' + idx + ']', depth + 1, childPath));&#10; });&#10; } else {&#10; for (const k in obj) {&#10; const childPath = path ? (path + '.' + k) : k;&#10; inner.appendChild(buildTree(obj[k], k, depth + 1, childPath));&#10; }&#10; }&#10; }&#10;&#10; container.appendChild(inner);&#10;&#10; &#10; if (!toggle.classList.contains('crdOpenButtonDisabled')) {&#10; toggle.addEventListener('click', () =&gt; {&#10; const isHidden = inner.hidden;&#10; inner.hidden = !isHidden;&#10; if (!isHidden) {&#10; toggle.classList.remove('crdOpenButtonActive');&#10; } else {&#10; toggle.classList.add('crdOpenButtonActive');&#10; }&#10; toggle.setAttribute('aria-expanded', String(!isHidden));&#10; });&#10; headerBtn.addEventListener('click', () =&gt; toggle.click());&#10; } else {&#10; headerBtn.style.cursor = 'default';&#10; }&#10;&#10; return container;&#10; }&#10;&#10; &#10; function parseComments(text) {&#10; const lines = text.split(/\r?\n/);&#10; const stack = [];&#10; const map = {};&#10; let commentBuffer = [];&#10; let lastNonEmptyWasComment = false;&#10;&#10; function currentPathWith(key) {&#10; const keys = stack.map(s =&gt; s.key);&#10; if (key) keys.push(key);&#10; return keys.join('.');&#10; }&#10;&#10; for (let i = 0; i &lt; lines.length; i++) {&#10; const raw = lines[i];&#10; const line = raw.replace(/\t/g, ' ');&#10; const trimmed = line.trim();&#10;&#10; if (trimmed.startsWith('#')) {&#10; const c = trimmed.replace(/^#\s?/, '');&#10; commentBuffer.push(c);&#10; lastNonEmptyWasComment = true;&#10; continue;&#10; }&#10;&#10; if (trimmed === '') {&#10; if (lastNonEmptyWasComment) {&#10; commentBuffer.push('');&#10; } else {&#10; commentBuffer = [];&#10; }&#10; lastNonEmptyWasComment = false;&#10; continue;&#10; }&#10;&#10; const indent = line.match(/^ */)[0].length;&#10; while (stack.length &amp;&amp; indent &lt;= stack[stack.length - 1].indent) {&#10; stack.pop();&#10; }&#10;&#10; if (/^\s*-\s+/.test(line)) {&#10; const arrKey = 'items';&#10; const currentIndent = stack.length ? stack[stack.length - 1].indent + 2 : 0;&#10; stack.push({ indent: currentIndent, key: arrKey });&#10;&#10; const rest = line.replace(/^\s*-\s+/, '');&#10; const idxKeyMatch = rest.match(/^([^:]+):\s*(.*)$/);&#10; if (idxKeyMatch) {&#10; const innerKey = idxKeyMatch[1].trim();&#10; stack.push({ indent: currentIndent + 2, key: innerKey });&#10; const path = currentPathWith();&#10; if (commentBuffer.length) {&#10; while (commentBuffer.length &amp;&amp; commentBuffer[commentBuffer.length - 1] === '') commentBuffer.pop();&#10; map[path] = commentBuffer.join('\n').trim();&#10; commentBuffer = [];&#10; }&#10; stack.pop();&#10; } else {&#10; const path = currentPathWith();&#10; if (commentBuffer.length) {&#10; while (commentBuffer.length &amp;&amp; commentBuffer[commentBuffer.length - 1] === '') commentBuffer.pop();&#10; map[path] = commentBuffer.join('\n').trim();&#10; commentBuffer = [];&#10; }&#10; }&#10; lastNonEmptyWasComment = false;&#10; continue;&#10; }&#10;&#10; const keyMatch = line.match(/^\s*([^:]+):\s*(.*)$/);&#10; if (keyMatch) {&#10; const key = keyMatch[1].trim();&#10; stack.push({ indent: indent, key: key });&#10; const path = currentPathWith();&#10; if (commentBuffer.length) {&#10; while (commentBuffer.length &amp;&amp; commentBuffer[commentBuffer.length - 1] === '') commentBuffer.pop();&#10; map[path] = commentBuffer.join('\n').trim();&#10; commentBuffer = [];&#10; }&#10; lastNonEmptyWasComment = false;&#10; continue;&#10; }&#10;&#10; commentBuffer = [];&#10; lastNonEmptyWasComment = false;&#10; }&#10;&#10; return map;&#10; }&#10;&#10; function renderFromYaml(yamlText) {&#10; const rawMap = parseComments(yamlText);&#10; commentsMap = {};&#10; for (const p in rawMap) {&#10; commentsMap[p] = cleanCommentBlock(rawMap[p]);&#10; }&#10;&#10; let data;&#10; try {&#10; data = jsyaml.load(yamlText);&#10; } catch (e) {&#10; alert('YAML parse error:\n' + e.message);&#10; return;&#10; }&#10;&#10; treeRoot.innerHTML = '';&#10; if (typeof data !== 'object' || data == null) {&#10; treeRoot.appendChild(el('div', '', 'No top-level mapping found'));&#10; return;&#10; }&#10; if (Array.isArray(data)) {&#10; treeRoot.appendChild(buildTree(data, 'root', 0, 'root'));&#10; } else {&#10; for (const k in data) {&#10; const path = k;&#10; treeRoot.appendChild(buildTree(data[k], k, 0, path));&#10; }&#10; }&#10; }&#10;&#10; &#10; btnExpandAll.addEventListener('click', () =&gt; {&#10; document.querySelectorAll('.crdObjectContainer').forEach(c =&gt; c.hidden = false);&#10; document.querySelectorAll('.crdOpenButton:not(.crdOpenButtonDisabled)').forEach(b =&gt; {&#10; b.classList.add('crdOpenButtonActive');&#10; b.setAttribute('aria-expanded', 'true');&#10; });&#10; });&#10; btnCollapseAll.addEventListener('click', () =&gt; {&#10; document.querySelectorAll('.crdObjectContainer').forEach(c =&gt; c.hidden = true);&#10; document.querySelectorAll('.crdOpenButton:not(.crdOpenButtonDisabled)').forEach(b =&gt; {&#10; b.classList.remove('crdOpenButtonActive');&#10; b.setAttribute('aria-expanded', 'false');&#10; });&#10; });&#10;&#10; &#10; searchInput.addEventListener('input', (e) =&gt; {&#10; const q = e.target.value.trim().toLowerCase();&#10; if (!q) {&#10; document.querySelectorAll('.crdObject').forEach(n =&gt; n.style.display = 'block');&#10; return;&#10; }&#10;&#10; document.querySelectorAll('.crdObject').forEach(n =&gt; {&#10; const txt = n.innerText.toLowerCase();&#10; n.style.display = txt.includes(q) ? 'block' : 'none';&#10; });&#10; });&#10;&#10; function initializeFromInjectedData() {&#10; const sourceTextarea = document.getElementById('yaml-data-source');&#10; const injectedYaml = sourceTextarea ? sourceTextarea.value.trim() : '';&#10;&#10; if (injectedYaml &amp;&amp; !injectedYaml.startsWith('# ERROR:')) {&#10; yamlInput.value = injectedYaml; &#10; renderFromYaml(injectedYaml);&#10; } else {&#10; &#10; yamlInput.value = injectedYaml || "# ERROR: Could not find or read includes/values.yaml.";&#10; treeRoot.appendChild(el('div', '', 'Error loading data. Check the hidden input field for details.'));&#10; }&#10; }&#10;&#10; initializeFromInjectedData();&#10;&#10; &#10; document.addEventListener('keydown', (ev) =&gt; {&#10; if ((ev.key === 'Enter' || ev.key === ' ') &amp;&amp; document.activeElement &amp;&amp; document.activeElement.classList.contains('crdHeaderButton')) {&#10; ev.preventDefault();&#10; document.activeElement.click();&#10; }&#10; });&#10;&#10; })();&#10;&lt;/script&gt;</description></item><item><title>Subscription Server</title><link>https://sap.github.io/cap-operator/docs/concepts/operator-components/subscription-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/concepts/operator-components/subscription-server/</guid><description>&lt;p&gt;The Subscription Server handles HTTP requests from the &lt;a href="https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/5e8a2b74e4f2442b8257c850ed912f48.html"&gt;SAP Software-as-a-Service Provisioning service&lt;/a&gt; for tenant subscription operations on SAP Cloud Application Programming Model applications installed in the cluster.&lt;/p&gt;&#10;&lt;p&gt;During the creation of a &lt;code&gt;saas-registry&lt;/code&gt; service instance (in the provider subaccount), &lt;a href="../../../usage/prerequisites/#sap-software-as-a-service-provisioning-service"&gt;callback URLs are configured&lt;/a&gt; to point to the subscription server routes. Additionally, the &lt;code&gt;getDependencies&lt;/code&gt; URLs can also be configured to point to the subscription server routes.&lt;/p&gt;&#10;&lt;p&gt;When a consumer tenant subscribes to an application managed by the operator, the subscription server receives the callback, validates the request using credentials from the corresponding &lt;a href="../../../usage/resources/subscriptionprovider"&gt;&lt;code&gt;SubscriptionProvider&lt;/code&gt;&lt;/a&gt; resource, and creates a &lt;a href="../../../usage/resources/subscription"&gt;&lt;code&gt;Subscription&lt;/code&gt;&lt;/a&gt; resource in the namespace of the identified &lt;code&gt;CAPApplication&lt;/code&gt;. The controller then creates the &lt;code&gt;CAPTenant&lt;/code&gt; and drives it through the provisioning flow.&lt;/p&gt;</description></item><item><title>What's New</title><link>https://sap.github.io/cap-operator/docs/whats-new/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/whats-new/</guid><description>&lt;h3 id="recent-updates"&gt;Recent updates&lt;/h3&gt;&#10;&lt;div class="td-card-group card-group p-0 mb-4"&gt;&#10; &lt;div class="td-card card border me-4"&gt;&#10;&lt;div class="card-header"&gt;&#10; v1alpha2 API Version&#10; &lt;/div&gt;&#10;&lt;div class="card-body"&gt;&#10; &lt;p class="card-text"&gt;&#10; &lt;p&gt;CAP Operator now uses &lt;code&gt;v1alpha2&lt;/code&gt; as the default API version (from release &lt;code&gt;0.37.0&lt;/code&gt;). The new version removes the deprecated &lt;code&gt;globalAccountId&lt;/code&gt; and &lt;code&gt;domains&lt;/code&gt; fields from &lt;code&gt;CAPApplication&lt;/code&gt;. See the &lt;a href="../usage/resources/capapplication"&gt;CAPApplication resource&lt;/a&gt; reference for the updated spec.&lt;/p&gt;&#10;&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="td-card card border me-4"&gt;&#10;&lt;div class="card-header"&gt;&#10; Subscription Resource&#10; &lt;/div&gt;&#10;&lt;div class="card-body"&gt;&#10; &lt;p class="card-text"&gt;&#10; &lt;p&gt;The new &lt;code&gt;Subscription&lt;/code&gt; resource represents an active consumer subscription to a CAP application. It is created and managed by the subscription server in response to SaaS Provisioning service callbacks. Learn more about the &lt;a href="../usage/resources/subscription"&gt;Subscription resource&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="td-card card border me-4"&gt;&#10;&lt;div class="card-header"&gt;&#10; SubscriptionProvider Resource&#10; &lt;/div&gt;&#10;&lt;div class="card-body"&gt;&#10; &lt;p class="card-text"&gt;&#10; &lt;p&gt;The new &lt;code&gt;SubscriptionProvider&lt;/code&gt; resource is automatically maintained by the controller to cache subscription credentials and pre-computed dependency information for efficient handling of subscription requests. Learn more about the &lt;a href="../usage/resources/subscriptionprovider"&gt;SubscriptionProvider resource&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>SubscriptionProvider</title><link>https://sap.github.io/cap-operator/docs/usage/resources/subscriptionprovider/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/subscriptionprovider/</guid><description>&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Warning&lt;/div&gt;&#10;&lt;p&gt;&lt;code&gt;SubscriptionProvider&lt;/code&gt; resources are fully managed by CAP Operator. They are automatically created and kept in sync by the controller whenever a &lt;code&gt;CAPApplication&lt;/code&gt; is reconciled. Do not create, modify, or delete them manually.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;A &lt;code&gt;SubscriptionProvider&lt;/code&gt; is created by the controller in the same namespace as its owning &lt;code&gt;CAPApplication&lt;/code&gt;, with the same name. It stores pre-computed subscription credentials and dependency information derived from the &lt;code&gt;CAPApplication&lt;/code&gt; spec. The &lt;a href="../../../concepts/operator-components/subscription-server"&gt;subscription server&lt;/a&gt; uses it to:&lt;/p&gt;</description></item><item><title>Subscription</title><link>https://sap.github.io/cap-operator/docs/usage/resources/subscription/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/subscription/</guid><description>&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Warning&lt;/div&gt;&#10;&lt;p&gt;&lt;code&gt;Subscription&lt;/code&gt; resources are fully managed by CAP Operator. They are created and deleted exclusively by the subscription server in response to callbacks from the SAP Software-as-a-Service Provisioning service or SMS. Do not create, modify, or delete them manually.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;A &lt;code&gt;Subscription&lt;/code&gt; represents an active subscription of a consumer subaccount to a CAP application. When a consumer subscribes via the SAP BTP cockpit or the SaaS Provisioning service API, the &lt;a href="../../../concepts/operator-components/subscription-server"&gt;subscription server&lt;/a&gt; creates a &lt;code&gt;Subscription&lt;/code&gt; resource in the namespace of the corresponding &lt;code&gt;CAPApplication&lt;/code&gt;. The controller then creates a &lt;a href="../captenant"&gt;&lt;code&gt;CAPTenant&lt;/code&gt;&lt;/a&gt; as a child of the &lt;code&gt;Subscription&lt;/code&gt; and drives it through the provisioning flow.&lt;/p&gt;</description></item><item><title>CAPTenant</title><link>https://sap.github.io/cap-operator/docs/usage/resources/captenant/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/captenant/</guid><description>&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Warning&lt;/div&gt;&#10;&lt;p&gt;The &lt;code&gt;CAPTenant&lt;/code&gt; resource is completely managed by CAP Operator and must not be created or modified manually. For details of how &lt;code&gt;CAPTenant&lt;/code&gt; is created, see &lt;a href="../../tenant-provisioning"&gt;tenant subscription&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The &lt;code&gt;CAPTenant&lt;/code&gt; resource indicates the existence of a tenant in the related application (or one that is currently being provisioned). The resource starts with a &lt;code&gt;Provisioning&lt;/code&gt; state and moves to &lt;code&gt;Ready&lt;/code&gt; when successfully provisioned. Managing tenants as Kubernetes resources allows you to control not only the lifecycle of the entity, but also other requirements that must be fulfilled for the application to serve tenant-specific requests (for example, creating networking resources).&lt;/p&gt;</description></item><item><title>Configuring cert-manager Certificates</title><link>https://sap.github.io/cap-operator/docs/usage/domain-management/cert-manager-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/domain-management/cert-manager-config/</guid><description>&lt;p&gt;When the operator is installed with the &lt;strong&gt;cert-manager&lt;/strong&gt; certificate manager (configured via the &lt;a href="../../../configuration#controller"&gt;&lt;code&gt;CERT_MANAGER&lt;/code&gt; environment variable&lt;/a&gt;), it creates a cert-manager &lt;code&gt;Certificate&lt;/code&gt; resource for each &lt;code&gt;Domain&lt;/code&gt; or &lt;code&gt;ClusterDomain&lt;/code&gt;. Every &lt;code&gt;Certificate&lt;/code&gt; must reference an issuer. By default the operator uses a &lt;code&gt;ClusterIssuer&lt;/code&gt; named &lt;code&gt;cluster-ca&lt;/code&gt;. Use &lt;code&gt;certConfig.certManager.issuerRef&lt;/code&gt; to override this with any issuer available in your cluster.&lt;/p&gt;&#10;&lt;h2 id="default-behavior"&gt;Default behavior&lt;/h2&gt;&#10;&lt;p&gt;If &lt;code&gt;certConfig.certManager&lt;/code&gt; is not set, the operator uses the following issuer reference:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Field&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Default&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cluster-ca&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;kind&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ClusterIssuer&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;group&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;cert-manager.io&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="configuring-a-custom-issuer"&gt;Configuring a custom issuer&lt;/h2&gt;&#10;&lt;p&gt;Set &lt;code&gt;certConfig.certManager.issuerRef&lt;/code&gt; on a &lt;code&gt;Domain&lt;/code&gt; or &lt;code&gt;ClusterDomain&lt;/code&gt; to point to any cert-manager issuer:&lt;/p&gt;</description></item><item><title>Tenant Subscription</title><link>https://sap.github.io/cap-operator/docs/usage/tenant-provisioning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/tenant-provisioning/</guid><description>&lt;p&gt;In CAP Operator, a valid tenant for an application is represented by the &lt;code&gt;CAPTenant&lt;/code&gt; resource. It references the &lt;code&gt;CAPApplication&lt;/code&gt; it belongs to and specifies the details of the SAP BTP subaccount that represents the tenant.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CAPTenant&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-01-consumer&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-01&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;capApplicationInstance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- reference to the CAPApplication&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subDomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;app-consumer&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tenantId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;aa2bae55d7b5-1279-456564-a7b0-aa2bae55d7b5&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.0.0&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- expected version of the application&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;versionUpgradeStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;lt;-- always / never&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="tenant-provisioning"&gt;Tenant Provisioning&lt;/h3&gt;&#10;&lt;p&gt;Tenant provisioning begins when a consumer subaccount subscribes to the application, either via the SAP BTP cockpit or using the SaaS Provisioning service APIs. This triggers an asynchronous callback from the SaaS Provisioning service into the cluster, which is handled by the &lt;a href="../../concepts/operator-components/subscription-server"&gt;subscription server&lt;/a&gt;. The subscription server validates the request using credentials from the &lt;a href="../resources/subscriptionprovider"&gt;&lt;code&gt;SubscriptionProvider&lt;/code&gt;&lt;/a&gt; resource and creates a &lt;a href="../resources/subscription"&gt;&lt;code&gt;Subscription&lt;/code&gt;&lt;/a&gt; resource in the namespace of the identified &lt;code&gt;CAPApplication&lt;/code&gt;. The controller, observing the new &lt;code&gt;Subscription&lt;/code&gt;, then creates a &lt;code&gt;CAPTenant&lt;/code&gt; instance to represent the consumer tenant.&lt;/p&gt;</description></item><item><title>Application Upgrade</title><link>https://sap.github.io/cap-operator/docs/usage/version-upgrade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/version-upgrade/</guid><description>&lt;p&gt;An important lifecycle aspect of operating multi-tenant CAP applications is the tenant upgrade process. With CAP Operator, tenant upgrades can be fully automated by providing a new &lt;code&gt;CAPApplicationVersion&lt;/code&gt; custom resource.&lt;/p&gt;&#10;&lt;p&gt;As covered in &lt;a href="../deploying-application"&gt;initial deployment&lt;/a&gt;, the &lt;code&gt;CAPApplicationVersion&lt;/code&gt; resource describes the workloads of an application version, including the container image and services consumed by each component. To upgrade the application, create a new &lt;code&gt;CAPApplicationVersion&lt;/code&gt; with updated &lt;code&gt;image&lt;/code&gt; values for each component and a higher semantic version in the &lt;code&gt;version&lt;/code&gt; field. See &lt;a href="../../reference/#sme.sap.com/v1alpha2.CAPApplicationVersion"&gt;API Reference&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>CAPTenantOperation</title><link>https://sap.github.io/cap-operator/docs/usage/resources/captenantoperation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/captenantoperation/</guid><description>&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Warning&lt;/div&gt;&#10;&lt;p&gt;The &lt;code&gt;CAPTenantOperation&lt;/code&gt; resource is managed by CAP Operator and must not be created or modified manually. It is created by the &lt;code&gt;CAPTenant&lt;/code&gt; to execute provisioning, deprovisioning, or upgrade operations.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CAPTenantOperation&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-consumer-ge455-77kb9&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-ns&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;capApplicationVersionInstance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cav-cap-app-v2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;upgrade&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;continueOnFailure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tenant-operation&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CustomTenantOperation&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tenant-operation&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TenantOperation&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;create-test-data&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CustomTenantOperation&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subDomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;consumer-x&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tenantId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cb46733-1279-48be-fdf434-aa2bae55d7b5&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The example above shows a &lt;code&gt;CAPTenantOperation&lt;/code&gt; for an upgrade operation. In addition to tenant details, it specifies the &lt;code&gt;CAPApplicationVersion&lt;/code&gt; to use. For upgrade and provisioning operations, this is the target version; for deprovisioning, it is the tenant&amp;rsquo;s current version.&lt;/p&gt;</description></item><item><title>Service Exposure</title><link>https://sap.github.io/cap-operator/docs/usage/service-exposure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/service-exposure/</guid><description>&lt;h1 id="exposing-service-workloads"&gt;Exposing Service Workloads&lt;/h1&gt;&#10;&lt;p&gt;This guide explains how to deploy applications with tenant-agnostic service workloads. These workloads can be part of multi-tenant applications or standalone applications that are entirely tenant-agnostic.&lt;/p&gt;&#10;&lt;h2 id="configuration"&gt;Configuration&lt;/h2&gt;&#10;&lt;h3 id="service-exposure-setup"&gt;Service Exposure Setup&lt;/h3&gt;&#10;&lt;p&gt;The &lt;code&gt;serviceExposures&lt;/code&gt; section in the &lt;code&gt;CAPApplicationVersion&lt;/code&gt; configuration is used to expose workloads. Each entry in the &lt;code&gt;serviceExposures&lt;/code&gt; array specifies a subdomain under which workloads are accessible, with support for multiple routes per subdomain.&lt;/p&gt;&#10;&lt;p&gt;For details on configuring routes, see the &lt;a href="../../reference/#sme.sap.com/v1alpha2.Route"&gt;Route API reference&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Rollout on Credential Update</title><link>https://sap.github.io/cap-operator/docs/usage/rollout-on-credential-update/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/rollout-on-credential-update/</guid><description>&lt;p&gt;When SAP BTP service credentials are rotated — for example, by a credential rotation tool or by re-binding a service instance — the Kubernetes Secrets holding those credentials are updated. By default, running application workloads are &lt;strong&gt;not&lt;/strong&gt; restarted and continue to use the old credentials until the next deployment or a manual rollout.&lt;/p&gt;&#10;&lt;p&gt;Enabling &lt;code&gt;rolloutOnCredentialUpdate&lt;/code&gt; on a &lt;code&gt;CAPApplication&lt;/code&gt; resource instructs CAP Operator to watch the referenced BTP service credential Secrets and automatically trigger a rolling restart of affected Deployments whenever their credentials change.&lt;/p&gt;</description></item><item><title>CAPTenantOutput</title><link>https://sap.github.io/cap-operator/docs/usage/resources/captenantoutput/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/captenantoutput/</guid><description>&lt;p&gt;&lt;a href="../../../reference/#sme.sap.com/v1alpha2.CAPTenantOutput"&gt;&lt;code&gt;CAPTenantOutput&lt;/code&gt;&lt;/a&gt; can be used to add additional data to the asynchronous callback parameters sent by the SaaS Provisioning service during tenant onboarding. The resource is not reconciled; it is consumed by the subscription server to generate additional callback data. It has the following structure:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CAPTenantOutput&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-consumer-output&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-ns&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sme.sap.com/btp-tenant-id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cb46733-1279-48be-fdf434-aa2bae55d7b5&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;subscriptionCallbackData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{foo: bar}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The example above shows a resource associated with a tenant via the &lt;code&gt;sme.sap.com/btp-tenant-id&lt;/code&gt; label, which must be set by consumers.&lt;/p&gt;</description></item><item><title>Domain</title><link>https://sap.github.io/cap-operator/docs/usage/resources/domain/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/domain/</guid><description>&lt;p&gt;A &lt;code&gt;Domain&lt;/code&gt; resource is namespace-scoped. All sub-resources — Gateway, DNSEntry, and (with Gardener certificate manager) the Certificate — are created in the same namespace as the &lt;code&gt;Domain&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Domain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-01&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cap-app-01-primary&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my.cluster.shoot.url.k8s.example.com&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ingressSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;istio-ingressgateway&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;istio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ingressgateway&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tlsMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Simple &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Simple (default), Mutual, or OptionalMutual&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dnsMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Wildcard &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# None (default), Wildcard, Subdomain, or Custom&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dnsTarget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;public-ingress.cluster.domain &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Optional&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;certConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Optional; only relevant when tlsMode is Mutual or OptionalMutual&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;additionalCACertificate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -----BEGIN CERTIFICATE-----&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -----END CERTIFICATE-----&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fields"&gt;Fields&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;domain&lt;/code&gt;&lt;/strong&gt; — the DNS domain name. The TLS certificate is issued for the wildcard &lt;code&gt;*.domain&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Version Monitoring</title><link>https://sap.github.io/cap-operator/docs/usage/version-monitoring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/version-monitoring/</guid><description>&lt;p&gt;In a continuous delivery environment where new application versions are deployed frequently, monitoring and cleaning up older unused versions is important for conserving cluster resources (compute, memory, storage) and keeping the system manageable. CAP Operator allows application developers and operations teams to define how an application version is monitored for usage.&lt;/p&gt;&#10;&lt;h2 id="integration-with-prometheus"&gt;Integration with Prometheus&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://prometheus.io/"&gt;Prometheus&lt;/a&gt; is the industry standard for monitoring application metrics and provides a wide variety of tools for managing and reporting metrics. The CAP Operator controller can be connected to a Prometheus server by setting the &lt;code&gt;PROMETHEUS_ADDRESS&lt;/code&gt; environment variable (see &lt;a href="../../configuration"&gt;Configuration&lt;/a&gt;). The controller then queries application-related metrics based on the workload specification of &lt;code&gt;CAPApplicationVersion&lt;/code&gt; resources. Prometheus is only required to evaluate workloads that declare &lt;code&gt;deletionRules&lt;/code&gt;. When &lt;code&gt;PROMETHEUS_ADDRESS&lt;/code&gt; is not set, or the configured server is unreachable, the cleanup loop still runs. Versions whose deployment workloads declare no &lt;code&gt;deletionRules&lt;/code&gt; can still be cleaned up in that case. Versions that do declare &lt;code&gt;deletionRules&lt;/code&gt; are skipped — they are neither deleted nor surfaced as errors — and will be re-evaluated on the next cycle once Prometheus becomes available again.&lt;/p&gt;</description></item><item><title>ClusterDomain</title><link>https://sap.github.io/cap-operator/docs/usage/resources/clusterdomain/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/resources/clusterdomain/</guid><description>&lt;p&gt;A &lt;code&gt;ClusterDomain&lt;/code&gt; resource is cluster-scoped and intended for domains shared across multiple applications or namespaces. All sub-resources — Gateway, DNSEntry, and (with Gardener certificate manager) the Certificate — are created in the namespace where CAP Operator is installed.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sme.sap.com/v1alpha2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ClusterDomain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;common-external-domain&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my.example.com&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ingressSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;istio-ingressgateway&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;istio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ingressgateway&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tlsMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Simple &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Simple (default), Mutual, or OptionalMutual&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dnsMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Subdomain &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# None (default), Wildcard, Subdomain, or Custom&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dnsTarget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;public-ingress.cluster.domain &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Optional&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;certConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Optional; only relevant when tlsMode is Mutual or OptionalMutual&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;additionalCACertificate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -----BEGIN CERTIFICATE-----&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; -----END CERTIFICATE-----&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fields"&gt;Fields&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;domain&lt;/code&gt;&lt;/strong&gt; — the DNS domain name. The TLS certificate is issued for the wildcard &lt;code&gt;*.domain&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Operator Metrics</title><link>https://sap.github.io/cap-operator/docs/usage/operator-metrics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/operator-metrics/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;&#10;&lt;p&gt;CAP Operator includes built-in &lt;a href="https://pkg.go.dev/github.com/prometheus/client_golang/prometheus"&gt;Prometheus metrics&lt;/a&gt; that enable you to effectively monitor and analyze the operator&amp;rsquo;s performance. These metrics provide insights into resource usage, potential issues, and overall operator health. The metrics are accessible at the &lt;code&gt;/metrics&lt;/code&gt; endpoint on port &lt;code&gt;9090&lt;/code&gt; of both the &lt;a href="../../concepts/operator-components/controller/"&gt;Controller&lt;/a&gt; and the &lt;a href="../../concepts/operator-components/subscription-server/"&gt;Subscription Server&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="controller-metrics"&gt;Controller Metrics&lt;/h2&gt;&#10;&lt;p&gt;The Controller emits several types of metrics, including:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Standard Go Metrics&lt;/strong&gt;: These metrics are provided by the &lt;a href="https://pkg.go.dev/github.com/prometheus/client_golang/prometheus/collectors#WithGoCollectorRuntimeMetrics"&gt;Prometheus Go client&lt;/a&gt; and include runtime statistics.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Workqueue Metrics&lt;/strong&gt;: These metrics are relevant to the resources being reconciled and are based on the &lt;a href="https://pkg.go.dev/k8s.io/client-go/util/workqueue#MetricsProvider"&gt;MetricsProvider&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Specific metrics: &lt;a href="#specific-metrics"&gt;mentioned below&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="specific-metrics"&gt;Specific Metrics&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Reconcile Errors&lt;/strong&gt; &amp;ndash; &lt;code&gt;cap_op_reconcile_errors&lt;/code&gt;, e.g.:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;cap_op_reconcile_errors{kind=&amp;#34;CAPApplication&amp;#34;,name=&amp;#34;my-app&amp;#34;,namespace=&amp;#34;app&amp;#34;} 11&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Counter&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: This metric tracks the total number of resources that failed to reconcile for each resource kind, such as &lt;code&gt;CAPApplication&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;Tenant Operations&lt;/strong&gt; &amp;ndash; &lt;code&gt;cap_op_tenant_operations&lt;/code&gt;, e.g.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;cap_op_tenant_operations{app=&amp;#34;&amp;lt;hash&amp;gt;&amp;#34;,operation=&amp;#34;provisioning&amp;#34;} 83&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt;: Counter&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt;: This metric provides insights into overall tenant operations being performed.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="detailed-operational-metrics"&gt;Detailed Operational Metrics&lt;/h3&gt;&#10;&lt;p&gt;To gain deeper insights, you can enable more granular metrics by setting the environment variable &lt;code&gt;DETAILED_OPERATIONAL_METRICS&lt;/code&gt; to &lt;code&gt;&amp;quot;true&amp;quot;&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Security</title><link>https://sap.github.io/cap-operator/docs/usage/security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sap.github.io/cap-operator/docs/usage/security/</guid><description>&lt;h2 id="securing-applications"&gt;Securing Applications&lt;/h2&gt;&#10;&lt;p&gt;We strongly recommend that applications implement the necessary authentication and authorization mechanisms to safeguard exposed workloads. This includes implicitly exposed &lt;a href="../tenant-provisioning/#tenant-provisioning"&gt;tenant workloads&lt;/a&gt; and explicitly exposed &lt;a href="../service-exposure"&gt;service workloads&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;When using &lt;a href="https://help.sap.com/docs/authorization-and-trust-management-service?locale=en-US"&gt;SAP Authorization and Trust Management Service&lt;/a&gt; in the application, this can be done as explained in &lt;a href="https://help.sap.com/docs/btp/sap-business-technology-platform/protecting-your-application"&gt;this guide&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="istio"&gt;Istio&lt;/h3&gt;&#10;&lt;p&gt;You may also consider using &lt;a href="https://istio.io/latest/docs/reference/config/security/"&gt;Istio&amp;rsquo;s security features&lt;/a&gt;, for instance using specific workload selectors to secure exposed workloads.&lt;/p&gt;</description></item></channel></rss>