{"@attributes":{"version":"2.0"},"channel":{"title":"Operator Lifecycle Manager \u2013 Operator Lifecycle Manager(OLM)","link":"https:\/\/olm.operatorframework.io\/docs\/","description":"Recent content in Operator Lifecycle Manager(OLM) on Operator Lifecycle Manager","generator":"Hugo -- gohugo.io","language":"en-us","lastBuildDate":"Thu, 30 Jun 2022 00:00:00 +0000","item":[{"title":"Docs: Creating operator manifests","link":"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-operator-manifests\/","pubDate":"Wed, 25 Mar 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-operator-manifests\/","description":"\n<p>OLM requires you to provide metadata about your operator, so that the operator&rsquo;s lifecycle can be managed safely on a cluster. This section introduces you to the process of packaging the metadata in a format that is compatible with OLM.<\/p>\n<p>This is very similar to packaging software for a traditional operating system - think of the packaging step for OLM as the stage at which you make your rpm, dep, or apk bundle.<\/p>\n<h2 id=\"writing-your-operator-manifests\">Writing your Operator Manifests<\/h2>\n<p>OLM uses a CRD called <code>ClusterServiceVersion<\/code> (CSV) to describe a single instance of a version of an operator. This is the main entry point for packaging an operator for OLM.<\/p>\n<p>There are two important ways to think about the CSV:<\/p>\n<ol>\n<li>Like an <code>rpm<\/code> or <code>deb<\/code>, it collects metadata about the operator that is required to install it onto the cluster.<\/li>\n<li>Like a <code>Deployment<\/code> that can stamp out <code>Pod<\/code>s from a template, the <code>ClusterServiceVersion<\/code> describes a template for the operator <code>Deployment<\/code> and can stamp them out.<\/li>\n<\/ol>\n<p>This is all in service of ensuring that when a user installs an operator from OLM, they can understand what changes are happening to the cluster, and OLM can ensure that installing the operator is a safe operation.<\/p>\n<h3 id=\"starting-from-an-existing-set-of-operator-manifests\">Starting from an existing set of operator manifests<\/h3>\n<p>For this example, we&rsquo;ll use the example manifests from <a href=\"https:\/\/github.com\/operator-framework\/operator-sdk-samples\/tree\/v0.19.2\/go\/memcached-operator\/deploy\">the example memcached operator<\/a>.<\/p>\n<p>These manifests consist of:<\/p>\n<ul>\n<li><strong>CRDs<\/strong> that define the APIs your operator will manage.<\/li>\n<li><strong>Operator<\/strong> (<code>operator.yaml<\/code>), containing the<code>Deployment<\/code> that runs your operator pods.<\/li>\n<li><strong>RBAC<\/strong> (<code>role.yaml<\/code>, <code>role_binding.yaml<\/code>, <code>service_account.yaml<\/code>) that configures the service account permissions your operator requires.<\/li>\n<\/ul>\n<p>Building a minimal <code>ClusterServiceVersion<\/code> from these manifests requires transplanting the contents of the Operator definition and the RBAC definitions into a CSV. Together, your CSV and CRDs will form the package that you give to OLM to install an operator.<\/p>\n<h4 id=\"basic-metadata-optional\">Basic Metadata (Optional)<\/h4>\n<p>Let&rsquo;s start with a CSV that only contains some descriptive metadata:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">annotations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator.v0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">description<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">This is an operator for memcached.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Memcached Operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">keywords<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">memcached<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">app<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">maintainers<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">email<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">corp@example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Some Corp<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">maturity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">provider<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Example<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">url<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">www.example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">minKubeVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.20.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Most of these fields are optional, but they provide an opportunity to describe your operator to potential or current users.<\/p>\n<h4 id=\"installation-metadata-required\">Installation Metadata (Required)<\/h4>\n<p>The next section to add to the CSV is the Install Strategy - this tells OLM about the runtime components of your operator and their requirements.<\/p>\n<p>Here is an example of the basic structure of an install strategy:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">annotations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator.v0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">install<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># strategy indicates what type of deployment artifacts are used<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">strategy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">deployment<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># spec for the deployment strategy is a list of deployment specs and required permissions - similar to a pod template used in a deployment<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">permissions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">serviceAccountName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">rules<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">apiGroups<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">resources<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">pods<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">verbs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#39;*&#39;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># the rest of the rules<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># permissions required at the cluster scope<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">clusterPermissions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">serviceAccountName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">rules<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">apiGroups<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">resources<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">serviceaccounts<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">verbs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#39;*&#39;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># the rest of the rules<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">deployments<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replicas<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># the rest of a deployment spec<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><code>deployments<\/code> is an array - your operator may be composed of several seperate components that should all be deployed and versioned together.<\/p>\n<p>It&rsquo;s also important to tell OLM the ways in which your operator can be deployed, or its <code>installModes<\/code>. InstallModes indicate if your operator can be configured to watch, one, some, or all namespaces. Please see the <a href=\"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/operator-scoping-with-operatorgroups\">document on operator scoping with operatorgroups<\/a> for more information.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator.v0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># ...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">installModes<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OwnNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">SingleNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">MultiNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">AllNamespaces<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><strong>Using <code>faq<\/code> to build an install strategy from an existing deployment and rbac<\/strong><\/p>\n<p><code>faq<\/code> is a wrapper around <code>jq<\/code> that can handle multiple input and output formats, like the yaml we&rsquo;re working with now. The following example requires that <a href=\"https:\/\/github.com\/jzelinskie\/faq#installation\">faq be installed<\/a> and references <a href=\"https:\/\/github.com\/operator-framework\/operator-sdk-samples\/tree\/v0.19.2\/go\/memcached-operator\/deploy\">the example memcached operator<\/a>.<\/p>\n<p>Here is a simple <code>faq<\/code> script that can generate an install strategy from a single deployment:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>faq -f yaml <span style=\"color:#4e9a06\">&#39;{install: {strategy: &#34;deployment&#34;, spec:{ deployments: [{name: .metadata.name, template: .spec }] }}}&#39;<\/span> operator.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>If you have an existing CSV <code>csv.yaml<\/code> (refer to the example from Basic Metadata) and you&rsquo;d like to insert or update an install strategy from a deployment <code>operator.yaml<\/code>, a role <code>role.yaml<\/code>, and a service account <code>service_account.yaml<\/code>, that is also possible:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>faq -f yaml -o yaml --slurp <span style=\"color:#4e9a06\">&#39;.[0].spec.install = {strategy: &#34;deployment&#34;, spec:{ deployments: [{name: .[1].metadata.name, template: .[1].spec }], permissions: [{serviceAccountName: .[3].metadata.name, rules: .[2].rules }]}} | .[0]&#39;<\/span> csv.yaml operator.yaml role.yaml service_account.yaml\n<\/span><\/span><\/code><\/pre><\/div><h4 id=\"defining-apis-required\">Defining APIs (Required)<\/h4>\n<p>By definition, operators are programs that can talk to the Kubernetes API. Often, they are also programs that <em>extend<\/em> the Kubernetes API, by providing an interface via <code>CustomResourceDefinition<\/code>s or, less frequently, <code>APIService<\/code>s.<\/p>\n<h5 id=\"owned-apis\">Owned APIs<\/h5>\n<p>Exactly which APIs are used and which APIs are watched or owned is important metadata for OLM. OLM uses this information to determine if dependencies are met and ensure that no two operators fight over the same resources in a cluster.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator.v0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># ...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">customresourcedefinitions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">owned<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># a list of CRDs that this operator owns<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># name is the metadata.name of the CRD (which is of the form &lt;plural&gt;.&lt;group&gt;)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcacheds.cache.example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># version is the spec.versions[].name value defined in the CRD<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># kind is the CamelCased singular value defined in spec.names.kind of the CRD.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Memcached<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># human-friendly display name of the CRD for rendering in graphical consoles (optional)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Memcached Cluster<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># a short description of the CRDs purpose for rendering in graphical consoles (optional)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">description<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Represents a memcached cluster<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h5 id=\"required-apis\">Required APIs<\/h5>\n<p>Similarly, there is a section <code>spec.customresourcedefinitions.required<\/code>, where dependencies can be specified. The operators that provide those APIs will be discovered and installed by OLM if they have not been installed.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">other-operator.v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># ...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">customresourcedefinitions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">required<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># a list of CRDs that this operator requires<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># name is the metadata.name of the CRD (which is of the form &lt;plural&gt;.&lt;group&gt;)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">others.example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># version is the spec.versions[].name value defined in the CRD<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># kind is the CamelCased singular value defined in spec.names.kind of the CRD.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Other<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Dependency resolution and ownership is discussed more in depth in the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/dependency-resolution\/\">here<\/a>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator.v0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># ...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">customresourcedefinitions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">owned<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># a list of CRDs that this operator owns<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># name is the metadata.name of the CRD (which is of the form &lt;plural&gt;.&lt;group&gt;)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcacheds.cache.example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># version is the spec.versions[].name value defined in the CRD<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># kind is the CamelCased singular value defined in spec.names.kind of the CRD.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Memcached<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h5 id=\"nativeapis-recommended\">NativeAPIs (recommended)<\/h5>\n<p>There are often cases where you wish to depend on an API that is either provided natively by the platform (i.e. <code>Pod<\/code>) or sometimes by another operator that is outside the control of OLM.<\/p>\n<p>In those cases, those dependencies can be described in the CSV as well, via <code>nativeAPIs<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">other-operator.v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">nativeAPIs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">group<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Pod<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The absence of any required <code>nativeAPIs<\/code> from a cluster will pause the installation of the operator, and <code>OLM<\/code> will write a status into the <code>CSV<\/code> indicating the missing APIs.<\/p>\n<p>TODO: example status<\/p>\n<p><code>nativeAPIs<\/code> is an optional field, but the more information you give OLM about the context in which your operator should be running, the more informed decisions OLM can make.<\/p>\n<h2 id=\"packaging-additional-objects-alongside-an-operator\">Packaging Additional Objects Alongside an Operator<\/h2>\n<p>Operators can include additional objects alongside their <code>CSV<\/code> in the <code>\/manifests<\/code> directory. These objects should be YAML files and valid kubernetes objects. The following objects are supported as of OLM 0.16.0:<\/p>\n<ul>\n<li>Secret<\/li>\n<li>ClusterRole<\/li>\n<li>ClusterRoleBinding<\/li>\n<li>ConfigMap<\/li>\n<li>ServiceAccount<\/li>\n<li>Service<\/li>\n<li>Role<\/li>\n<li>RoleBinding<\/li>\n<li>PrometheusRule<\/li>\n<li>ServiceMonitor<\/li>\n<li><a href=\"https:\/\/github.com\/operator-framework\/operator-lifecycle-manager\/blob\/master\/doc\/design\/adding-pod-disruption-budgets.md\">PodDisruptionBudget<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/operator-framework\/operator-lifecycle-manager\/blob\/master\/doc\/design\/adding-priority-classes.md\">PriorityClass<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/operator-framework\/operator-lifecycle-manager\/blob\/master\/doc\/design\/adding-vertical-pod-autoscaler.md\">VerticalPodAutoscaler<\/a><\/li>\n<li>ConsoleYAMLSample<\/li>\n<li>ConsoleQuickStart<\/li>\n<li>ConsoleCLIDownload<\/li>\n<li>ConsoleLink<\/li>\n<\/ul>\n<p><strong>Note<\/strong>: some of these objects can affect an upgrade of the cluster and potentially cause problems for workloads unrelated to your operator. Be sure to understand the safe use of these objects before packaging them with your operator. See the docs linked above for more information on these objects as they relate to OLM.*<\/p>\n<h3 id=\"limitations-on-pod-disruption-budgets\">Limitations on Pod Disruption Budgets<\/h3>\n<p>No limitations are placed on the contents of a PDB at this time when installing on-cluster.\nHowever, the following are suggested guidelines to follow when including PDB objects in a bundle.<\/p>\n<ul>\n<li>maxUnavailable field cannot be set to 0 or 0%.\n<ul>\n<li>This can make a node impossible to drain and block important lifecycle actions like operator upgrades or even cluster upgrades.<\/li>\n<\/ul>\n<\/li>\n<li>minAvailable field cannot be set to 100%.\n<ul>\n<li>This can make a node impossible to drain and block important lifecycle actions like operator upgrades or even cluster upgrades.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3 id=\"limitations-on-priority-classes\">Limitations on Priority Classes<\/h3>\n<p>No limitations are placed on the contents of a PriorityClass manifest at this time when installing on-cluster.\nHowever, the following is a suggested guideline to follow when including PriorityClass objects in a bundle.<\/p>\n<ul>\n<li>globalDefault should always be false on a PriorityClass included in a bundle.\n<ul>\n<li>Setting globalDefault on a PriorityClass means that all pods in the cluster without an explicit priority class will use this default PriorityClass. This can unintentionally affect other pods running in the cluster.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4 id=\"extension-apiservers-and-apiservices\">Extension apiservers and APIServices<\/h4>\n<p>TODO: Document on extension apiservers for operators that do not rely on CRDs to provide its API.<\/p>\n<h4 id=\"advanced-and-optional-features\">Advanced and Optional features<\/h4>\n<p>TODO: Documentation for advanced operator configuration which includes additional suggestions for further integration with OLM.<\/p>\n<h3 id=\"operator-sdk\">Operator SDK<\/h3>\n<p>You can also generate the manifests for your bundle using the <code>operator-sdk<\/code> binary. Checkout the documentation for generating CSV using <code>operator-sdk<\/code> <a href=\"https:\/\/sdk.operatorframework.io\/docs\/olm-integration\/generation\/\">here<\/a>.<\/p>"},{"title":"Docs: Creating an Operator Bundle","link":"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-operator-bundle\/","pubDate":"Mon, 11 Jan 2021 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-operator-bundle\/","description":"\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/operator-framework\/operator-registry\/releases\">opm<\/a><\/li>\n<li><a href=\"https:\/\/docs.docker.com\/install\/\">docker<\/a> version <code>17.03<\/code>+ or <a href=\"https:\/\/github.com\/containers\/libpod\/blob\/master\/install.md\">podman<\/a> <code>v1.2.0+<\/code> or <a href=\"https:\/\/github.com\/containers\/buildah\/blob\/master\/install.md\">buildah<\/a> <code>v1.7+<\/code>.<\/li>\n<\/ul>\n<h1 id=\"operator-bundle\">Operator Bundle<\/h1>\n<p>An Operator Bundle is a container image that stores Kubernetes manifests and metadata associated with an operator. A bundle is meant to represent a specific version of an operator on cluster. Once you have the <a href=\"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-operator-manifests\">ClusterServiceVersion(CSV) for your operator<\/a>, you can create an operator bundle using the CSV and the CRDs for your operator.<\/p>\n<p>We refer to a directory of files with one ClusterServiceVersion as a <code>bundle<\/code> that includes a CSV and the CRDs in its manifest directory, though additional kubernetes objects may be included. The directory also includes an annotations file in its metadata folder which defines some higher level aggregate data that helps to describe the format and package information about how the bundle should be added into a catalog of bundles. Finally, a Dockerfile can be built from the information in the directory to build the operator bundle image.<\/p>\n<pre tabindex=\"0\"><code> # example bundle\netcd\n\u251c\u2500\u2500 manifests\n\u2502 \u251c\u2500\u2500 etcdcluster.crd.yaml\n\u2502 \u2514\u2500\u2500 etcdoperator.clusterserviceversion.yaml\n\u251c\u2500\u2500 metadata\n\u2502 \u2514\u2500\u2500 annotations.yaml\n\u2514\u2500\u2500 Dockerfile\n<\/code><\/pre><h3 id=\"contents-of-annotationsyaml-and-the-dockerfile\">Contents of annotations.yaml and the Dockerfile<\/h3>\n<p>The <code>annotations.yaml<\/code> and the <code>Dockerfile<\/code> can be generated using the <code>opm<\/code> tool&rsquo;s <code>alpha bundle generate<\/code> command.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>Usage:\n<\/span><\/span><span style=\"display:flex;\"><span> opm alpha bundle generate <span style=\"color:#ce5c00;font-weight:bold\">[<\/span>flags<span style=\"color:#ce5c00;font-weight:bold\">]<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>Flags:\n<\/span><\/span><span style=\"display:flex;\"><span> -c, --channels string The list of channels that bundle image belongs to\n<\/span><\/span><span style=\"display:flex;\"><span> -e, --default string The default channel <span style=\"color:#204a87;font-weight:bold\">for<\/span> the bundle image\n<\/span><\/span><span style=\"display:flex;\"><span> -d, --directory string The directory where bundle manifests <span style=\"color:#204a87;font-weight:bold\">for<\/span> a specific version are located.\n<\/span><\/span><span style=\"display:flex;\"><span> -h, --help <span style=\"color:#204a87\">help<\/span> <span style=\"color:#204a87;font-weight:bold\">for<\/span> generate\n<\/span><\/span><span style=\"display:flex;\"><span> -u, --output-dir string Optional output directory <span style=\"color:#204a87;font-weight:bold\">for<\/span> operator manifests\n<\/span><\/span><span style=\"display:flex;\"><span> -p, --package string The name of the package that bundle image belongs to\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span> Note:\n<\/span><\/span><span style=\"display:flex;\"><span> * All manifests yaml must be in the same directory.\n<\/span><\/span><\/code><\/pre><\/div><p>For example, to generate the <code>annotations.yaml<\/code> and <code>Dockerfile<\/code> for the example bundle mentioned above, the command for the <code>generate<\/code> task is:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ opm alpha bundle generate --directory .\/etcd --package etcd --channels stable --default stable\n<\/span><\/span><\/code><\/pre><\/div><p>After the generate command is executed, the <code>Dockerfile<\/code> is generated in the directory where command is run. By default, the <code>annotations.yaml<\/code> file is located in a folder named <code>metadata<\/code> in the same root directory as the input directory containing manifests.<\/p>\n<p>If the <code>--output-dir<\/code> parameter is specified, that directory becomes the parent for a new pair of folders <code>manifests\/<\/code> and <code>metadata\/<\/code>, where <code>manifests\/<\/code> is a copy of the passed in directory of manifests and <code>metadata\/<\/code> is the folder containing annotations.yaml:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ tree etcd\n<\/span><\/span><span style=\"display:flex;\"><span>etcd\n<\/span><\/span><span style=\"display:flex;\"><span>\u251c\u2500\u2500 manifests\n<\/span><\/span><span style=\"display:flex;\"><span>\u2502 \u251c\u2500\u2500 etcdcluster.crd.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>\u2502 \u2514\u2500\u2500 etcdoperator.clusterserviceversion.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>\u251c\u2500\u2500 my-output-manifest-dir\n<\/span><\/span><span style=\"display:flex;\"><span>\u2502 \u251c\u2500\u2500 manifests\n<\/span><\/span><span style=\"display:flex;\"><span>\u2502 \u2502 \u251c\u2500\u2500 etcdcluster.crd.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>\u2502 \u2502 \u2514\u2500\u2500 etcdoperator.clusterserviceversion.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>\u2502 \u2514\u2500\u2500 metadata\n<\/span><\/span><span style=\"display:flex;\"><span>\u2502 \u2514\u2500\u2500 annotations.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>\u2514\u2500\u2500 Dockerfile\n<\/span><\/span><\/code><\/pre><\/div><p>The <code>annotations.yaml<\/code> contains the following information as labels that are used to annotate the operator bundle container image:<\/p>\n<ul>\n<li>The label <code>operators.operatorframework.io.bundle.mediatype.v1<\/code> reflects the media type or format of the operator bundle. It could be helm charts, plain Kubernetes manifests etc.<\/li>\n<li>The label <code>operators.operatorframework.io.bundle.manifests.v1<\/code> reflects the path in the image to the directory that contains the operator manifests. This label is reserved for the future use and is set to <code>manifests\/<\/code> for the time being.<\/li>\n<li>The label <code>operators.operatorframework.io.bundle.metadata.v1<\/code> reflects the path in the image to the directory that contains metadata files about the bundle. This label is reserved for the future use and is set to <code>metadata\/<\/code> for the time being.<\/li>\n<li>The <code>manifests.v1<\/code> and <code>metadata.v1<\/code> labels imply the bundle type:\n<ul>\n<li>The value <code>manifests.v1<\/code> implies that this bundle contains operator manifests.<\/li>\n<li>The value <code>metadata.v1<\/code> implies that this bundle has operator metadata.<\/li>\n<\/ul>\n<\/li>\n<li>The label <code>operators.operatorframework.io.bundle.package.v1<\/code> reflects the package name of the bundle.<\/li>\n<li>The label <code>operators.operatorframework.io.bundle.channels.v1<\/code> reflects the list of channels the bundle is subscribing to when added into an operator registry<\/li>\n<li>The label <code>operators.operatorframework.io.bundle.channel.default.v1<\/code> reflects the default channel an operator should be subscribed to when installed from a registry. This label is optional if the default channel has been set by previous bundles and the default channel is unchanged for this bundle.<\/li>\n<\/ul>\n<p>The <code>annotations.yaml<\/code> file generated in the example above would look like:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">annotations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operators.operatorframework.io.bundle.mediatype.v1<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;registry+v1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operators.operatorframework.io.bundle.manifests.v1<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;manifests\/&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operators.operatorframework.io.bundle.metadata.v1<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;metadata\/&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operators.operatorframework.io.bundle.package.v1<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;etcd&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operators.operatorframework.io.bundle.channels.v1<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;stable&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operators.operatorframework.io.bundle.channel.default.v1<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;stable&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The <code>Dockerfile<\/code> generated in the example above would look like:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-Dockerfile\" data-lang=\"Dockerfile\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">FROM<\/span><span style=\"color:#4e9a06\"> scratch<\/span><span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">LABEL<\/span> operators.operatorframework.io.bundle.mediatype.v1<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>registry+v1<span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">LABEL<\/span> operators.operatorframework.io.bundle.manifests.v1<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>manifests\/<span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">LABEL<\/span> operators.operatorframework.io.bundle.metadata.v1<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>metadata\/<span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">LABEL<\/span> operators.operatorframework.io.bundle.package.v1<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>test-operator<span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">LABEL<\/span> operators.operatorframework.io.bundle.channels.v1<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>beta,stable<span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">LABEL<\/span> operators.operatorframework.io.bundle.channel.default.v1<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>stable<span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">ADD<\/span> test\/*.yaml \/manifests<span style=\"color:#a40000\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a40000\"><\/span><span style=\"color:#204a87;font-weight:bold\">ADD<\/span> test\/metadata\/annotations.yaml \/metadata\/annotations.yaml<span style=\"color:#a40000\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h1 id=\"bundle-images\">Bundle images<\/h1>\n<p>An Operator Bundle is built as a scratch (i.e non-runnable) container image that contains information about the operator manifests and metadata inside the image(stored in a database inside the image). The image can then be pushed and pulled from an <a href=\"https:\/\/github.com\/opencontainers\/image-spec\/blob\/master\/spec.md\">OCI-compliant<\/a> container registry.<\/p>\n<p>The <code>opm<\/code> tool can be used to interact directly with these images. Once you have your manifests defined and have created a directory in the format defined above, building the image is as simple as defining a Dockerfile and building that image:<\/p>\n<pre tabindex=\"0\"><code><\/code><\/pre><div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ podman build -t quay.io\/my-container-registry-namespace\/my-manifest-bundle:latest -f bundle.Dockerfile .\n<\/span><\/span><\/code><\/pre><\/div><p>Once you have built the container, you can publish it like any other container image:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ podman push quay.io\/my-container-registry-namespace\/my-manifest-bundle:latest\n<\/span><\/span><\/code><\/pre><\/div><p>Of course, this build step can be done with any other OCI spec container tools like <code>docker<\/code>, <code>buildah<\/code>, <code>libpod<\/code>, etc<\/p>\n<h2 id=\"validating-your-bundle\">Validating your bundle<\/h2>\n<p>Once you&rsquo;ve created your bundle, you will want to ensure that your bundle is valid and in the correct format. The <a href=\"https:\/\/github.com\/operator-framework\/api\/tree\/master\/pkg\/validation\">api<\/a> library contains a validation library that is used by operator-framework tools like <code>operator-sdk<\/code> and <code>opm<\/code> to validate operator bundles. For more information on validating via the <code>operator-sdk<\/code> see the <a href=\"https:\/\/sdk.operatorframework.io\/docs\/cli\/operator-sdk_bundle_validate\/#operator-sdk-bundle-validate\"><code>operator-sdk bundle validate<\/code> documentation<\/a>.<\/p>\n<p>The <code>opm alpha bundle validate<\/code> command will validate a bundle image from a remote registry to determine if its format and content information are accurate.\nThe following validators will run by default on every invocation of the command.<\/p>\n<ul>\n<li>CSV validator - validates the CSV name and replaces fields.<\/li>\n<li>CRD validator - validates the CRDs OpenAPI V3 schema.<\/li>\n<li>Bundle validator - validates the bundle format and annotations.yaml file as well as the optional dependencies.yaml file.<\/li>\n<\/ul>\n<p>For example:<\/p>\n<p><code>$ opm alpha bundle validate --tag quay.io\/test\/test-operator:latest --image-builder docker<\/code><\/p>\n<h3 id=\"optional-validation\">Optional Validation<\/h3>\n<p>Some validators are disabled by default and can be optionally enabled via the <code>--optional-validators<\/code> or <code>-o<\/code> flag.<\/p>\n<ul>\n<li>Operatorhub validator - performs operatorhub.io validation which will check your bundle against the common criteria to distributed with OLM. To validate a bundle using custom categories use the <code>OPERATOR_BUNDLE_CATEGORIES<\/code> environmental variable to point to a json-encoded categories file. Enable this option via <code>--optional-validators=operatorhub<\/code>. This validator allows you to validate that your manifests can work with a Kubernetes cluster of a particular version using the <code>k8s-version<\/code> optional key value. (e.g. <code>--optional-values=k8s-version=1.22<\/code>)<\/li>\n<li>Bundle objects validator - performs validation on resources like <code>PodDisruptionBudgets<\/code> and <code>PriorityClasses<\/code>. Enable this option via <code>--optional-validators=bundle-objects<\/code>.\nMultiple optional validators can be enabled at once, for example <code>--optional-validators=operatorhub,bundle-objects<\/code>.<\/li>\n<li>Community validator - performs community operator bundle validation which will check your bundle against the criteria to distribute your project on the <a href=\"https:\/\/github.com\/operator-framework\/community-operators\">Community Catalogs<\/a>. For further information see its <a href=\"https:\/\/operator-framework.github.io\/community-operators\/\">docs<\/a>. This validator allows you to validate the required labels in the catalog image by using the <code>index-path<\/code> optional key value. (e.g. <code>--optional-values=index-path=bundle.Dockerfile<\/code>).<\/li>\n<\/ul>\n<h4 id=\"custom-bundle-categories\">Custom bundle categories<\/h4>\n<p>The operatorhub validator can verify against custom bundle categories by setting the <code>OPERATOR_BUNDLE_CATEGORIES<\/code> environment variable.\nSetting the <code>OPERATOR_BUNDLE_CATEGORIES<\/code> environment variable to the path to a json file containing a list of categories will enable those categories to be used when comparing CSV categories for operatorhub validation. The json file should be in the following format:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-json\" data-lang=\"json\"><span style=\"display:flex;\"><span><span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;categories&#34;<\/span><span style=\"color:#000;font-weight:bold\">:[<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#4e9a06\">&#34;Cloud Pak&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#4e9a06\">&#34;Registry&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#4e9a06\">&#34;MyCoolThing&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">]<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>For example:<\/p>\n<p><code>$ OPERATOR_BUNDLE_CATEGORIES=.\/validate\/categories.json .\/bin\/opm alpha bundle validate --tag &lt;bundle-tag&gt; --image-builder docker -o operatorhub<\/code>\nwill validate the bundle using the provided categories file.<\/p>\n<p>If <code>OPERATOR_BUNDLE_CATEGORIES<\/code> is not set, and operatorhub validation is enabled, the default categories will be used when performing operatorhub validation. The default categories are the following:<\/p>\n<ul>\n<li>AI\/Machine Learning<\/li>\n<li>Application Runtime<\/li>\n<li>Big Data<\/li>\n<li>Cloud Provider<\/li>\n<li>Developer Tools<\/li>\n<li>Database<\/li>\n<li>Integration &amp; Delivery<\/li>\n<li>Logging &amp; Tracing<\/li>\n<li>Monitoring<\/li>\n<li>Networking<\/li>\n<li>OpenShift Optional<\/li>\n<li>Security<\/li>\n<li>Storage<\/li>\n<li>Streaming &amp; Messaging<\/li>\n<\/ul>"},{"title":"Docs: CatalogSource","link":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/catalogsource\/","pubDate":"Wed, 25 Mar 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/catalogsource\/","description":"\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/mikefarah\/yq\">yq<\/a><\/li>\n<\/ul>\n<h2 id=\"how-to-debug-a-failing-catalogsource\">How to debug a failing CatalogSource<\/h2>\n<p>The <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture#catalog-operator\">Catalog operator<\/a> will constantly update the <code>Status<\/code> of <code>CatalogSources<\/code> to reflect its current state. You can check the <code>Status<\/code> of your <code>CatalogSource<\/code> with the following command:<\/p>\n<p><code>$ kubectl get catsrc my-catalog -n &lt;namespace&gt; -o yaml | yq e '.status' -<\/code><\/p>\n<blockquote>\n<p>Note: It is possible that the <code>Status<\/code> is missing, which suggests that the Catalog operator is encountering an issue when processing the <code>CatalogSource<\/code> in a very early stage.<\/p>\n<\/blockquote>\n<p>If the <code>Status<\/code> block does not provide enough information, check the <a href=\"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/olm-and-catalog-operators\/#how-to-view-the-catalog-operator-logs\">Catalog operator&rsquo;s logs<\/a>.<\/p>\n<p>If you are still unable to identify the cause of the failure, check if a pod was created for the <code>CatalogSource<\/code>. If a pod exists, review the pod&rsquo;s yaml and logs:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl -n my-namespace get pods\n<\/span><\/span><span style=\"display:flex;\"><span>NAME READY STATUS RESTARTS AGE\n<\/span><\/span><span style=\"display:flex;\"><span>my-catalog-ltdlp 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 8m31s\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl -n my-namespace get pod my-catalog-ltdlp -o yaml\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl -n my-namespace logs my-catalog-ltdlp\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><\/code><\/pre><\/div><h3 id=\"im-not-sure-if-a-specific-version-of-an-operator-is-available-in-a-catalogsource\">I&rsquo;m not sure if a specific version of an operator is available in a CatalogSource<\/h3>\n<p>First verify that the <code>CatalogSource<\/code> contains the operator that you want to install:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl -n my-namespace get packagemanifests\n<\/span><\/span><span style=\"display:flex;\"><span>NAME CATALOG AGE\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><span style=\"display:flex;\"><span>portworx My Catalog Source 14m\n<\/span><\/span><span style=\"display:flex;\"><span>postgres-operator My Catalog Source 14m\n<\/span><\/span><span style=\"display:flex;\"><span>postgresql My Catalog Source 14m\n<\/span><\/span><span style=\"display:flex;\"><span>postgresql-operator-dev4devs-com My Catalog Source 14m\n<\/span><\/span><span style=\"display:flex;\"><span>prometheus My Catalog Source 14m\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><\/code><\/pre><\/div><p>If the operator is present, check if the version you want is available:<\/p>\n<p><code>$ kubectl -n my-namespace get packagemanifests my-operator -o yaml<\/code><\/p>\n<h3 id=\"my-catalogsource-cannot-pull-images-from-a-private-registry\">My CatalogSource cannot pull images from a private registry<\/h3>\n<p>If you are attempting to pull images from a private registry, make sure to specify a secret key in the <code>CatalogSource.Spec.Secrets<\/code> field.<\/p>"},{"title":"Docs: ClusterServiceVersion","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/clusterserviceversion\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/clusterserviceversion\/","description":"\n<p>A ClusterServiceVersion (CSV) represents a particular version of a running operator on a cluster. It includes metadata such as name, description, version, repository link, labels, icon, etc. It declares <code>owned<\/code>\/<code>required<\/code> CRDs, cluster requirements, and install strategy that tells OLM how to create required resources and set up the operator as a <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/\">deployment<\/a>.<\/p>\n<p>OLM requires you to provide metadata about your operator in order to ensure that it can be kept running safely on a cluster, and to provide information about how updates should be applied as you publish new versions of your operator.<\/p>\n<p>This is very similar to packaging software for a traditional operating system - think of the packaging step for OLM as the stage at which you make your <code>rpm<\/code>, <code>deb<\/code>, or <code>apk<\/code> bundle.<\/p>\n<h2 id=\"writing-your-operator-manifests\">Writing your Operator Manifests<\/h2>\n<p>OLM uses an api called <code>ClusterServiceVersion<\/code> (CSV) to describe a single instance of a version of an operator. This is the main entrypoint for packaging an operator for OLM.<\/p>\n<p>There are two important ways to think about the CSV:<\/p>\n<ol>\n<li>Like an <code>rpm<\/code> or <code>deb<\/code>, it collects metadata about the operator that is required to install it onto the cluster.<\/li>\n<li>Like a <code>Deployment<\/code> that can stamp out <code>Pod<\/code>s from a template, the <code>ClusterServiceVersion<\/code> describes a template for the operator <code>Deployment<\/code> and can stamp them out.<\/li>\n<\/ol>\n<p>This is all in service of ensuring that when a user installs an operator from OLM, they can understand what changes are happening to the cluster, and OLM can ensure that installing the operator is a safe operation.<\/p>\n<h2 id=\"example-clusterserviceversion\">Example ClusterServiceVersion<\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">annotations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator.v0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># metadata<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">description<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">This is an operator for memcached.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Memcached Operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">keywords<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">memcached<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">app<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">maintainers<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">email<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">corp@example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Some Corp<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">maturity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">provider<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Example<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">url<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">www.example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">minKubeVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.16.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># operator scope<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">installModes<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OwnNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">SingleNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">MultiNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">AllNamespaces<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># installation<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">install<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># strategy indicates what type of deployment artifacts are used<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">strategy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">deployment<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># spec for the deployment strategy is a list of deployment specs and required permissions - similar to a pod template used in a deployment<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">permissions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">serviceAccountName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">rules<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">apiGroups<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">resources<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">pods<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">verbs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#39;*&#39;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># the rest of the rules<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># permissions required at the cluster scope<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">clusterPermissions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">serviceAccountName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">rules<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">apiGroups<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">resources<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">serviceaccounts<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">verbs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#39;*&#39;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># the rest of the rules<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">deployments<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replicas<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># the rest of a deployment spec<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># apis provided by the operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">customresourcedefinitions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">owned<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># a list of CRDs that this operator owns<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># name is the metadata.name of the CRD (which is of the form &lt;plural&gt;.&lt;group&gt;)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcacheds.cache.example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># version is the spec.versions[].name value defined in the CRD<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># kind is the CamelCased singular value defined in spec.names.kind of the CRD.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Memcached<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">required<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># a list of CRDs that this operator requires<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># see field descriptions above<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">others.example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Other<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"release-field\">Release Field<\/h2>\n<p>The <code>release<\/code> field is an optional field in the CSV spec that specifies the packaging version of an operator. It allows operator authors to distinguish between different builds of the same operator version.<\/p>\n<h3 id=\"when-to-use-the-release-field\">When to Use the Release Field<\/h3>\n<p>Use the <code>release<\/code> field when you need to make changes to the CSV that don&rsquo;t affect the operator&rsquo;s functionality, such as:<\/p>\n<ul>\n<li>Fixing typos in descriptions<\/li>\n<li>Adding or amending annotations or labels<\/li>\n<li>Amending examples or documentation<\/li>\n<li>Producing different builds for different environments<\/li>\n<\/ul>\n<h3 id=\"format-and-validation\">Format and Validation<\/h3>\n<p>The <code>release<\/code> field must satisfy the following criteria:<\/p>\n<ul>\n<li>Composed of dot-separated identifiers containing only alphanumerics and hyphens<\/li>\n<li>Maximum length of 20 characters<\/li>\n<li><strong>Cannot contain build metadata<\/strong> (the <code>+<\/code> character and everything after it)<\/li>\n<\/ul>\n<p>Examples: <code>1<\/code>, <code>alpha<\/code>, <code>alpha.1<\/code>, <code>beta-1<\/code>, <code>rc.2.0<\/code><\/p>\n<h3 id=\"example\">Example<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">memcached-operator-v0.10.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Optional packaging version<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Memcached Operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">description<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">This is an operator for memcached.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># ... rest of CSV spec<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"bundle-naming-convention-with-release\">Bundle Naming Convention with Release<\/h3>\n<p>When a <code>release<\/code> field is specified, the bundle name must follow the convention:<\/p>\n<pre tabindex=\"0\"><code>&lt;package-name&gt;-v&lt;version&gt;-&lt;release&gt;\n<\/code><\/pre><p><strong>Examples:<\/strong><\/p>\n<ul>\n<li><code>memcached-operator-v0.10.0-1<\/code><\/li>\n<li><code>memcached-operator-v0.10.0-alpha.1<\/code><\/li>\n<li><code>memcached-operator-v0.10.0-rc.2<\/code><\/li>\n<\/ul>\n<h3 id=\"version-ordering\">Version Ordering<\/h3>\n<p>Bundles are ordered using a composite version that considers both <code>version<\/code> and <code>release<\/code>:<\/p>\n<ol>\n<li>Bundles are first ordered by semantic version<\/li>\n<li>For bundles with the same version, those <strong>with<\/strong> a release are ordered <strong>before<\/strong> those <strong>without<\/strong> a release<\/li>\n<li>Bundles with the same version and both having releases are ordered from highest to lowest release version<\/li>\n<\/ol>\n<div class=\"mermaid\">graph TD\nA[Bundle Comparison] --> B{Same Version?}\nB -->|No| C[Order by Version]\nB -->|Yes| D{Both have Release?}\nD -->|No| E{Has Release?}\nD -->|Yes| F[Order by Release]\nE -->|Bundle A| G[A before B]\nE -->|Bundle B| H[B before A]\nstyle A fill:#e1f5ff\nstyle C fill:#c3e6cb\nstyle F fill:#c3e6cb\nstyle G fill:#c3e6cb\nstyle H fill:#c3e6cb\n<\/div>\n<p><strong>Example versions in ascending order:<\/strong><\/p>\n<pre tabindex=\"0\"><code>memcached-operator.v0.9.0 # version 0.9.0, no release\nmemcached-operator.v0.10.0 # version 0.10.0, no release\nmemcached-operator-v0.10.0-1 # version 0.10.0, release &#34;1&#34;\nmemcached-operator-v0.10.0-2 # version 0.10.0, release &#34;2&#34;\nmemcached-operator-v0.10.0-alpha # version 0.10.0, release &#34;alpha&#34;\n<\/code><\/pre><h3 id=\"build-metadata-restriction\">Build Metadata Restriction<\/h3>\n<p>The <code>release<\/code> field <strong>cannot contain build metadata<\/strong>. The following is <strong>invalid<\/strong>:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># \u274c INVALID - release cannot contain build metadata (the + character)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.10.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1+fffdb0e&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># \u2705 VALID - build metadata can be in version when no release is present<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.10.0<\/span><span style=\"color:#000\">+fffdb0e<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># no release field<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: Common recommendations and suggestions","link":"https:\/\/olm.operatorframework.io\/docs\/best-practices\/common\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/best-practices\/common\/","description":"\n<h2 id=\"overview\">Overview<\/h2>\n<p>Any recommendation or good practice suggested by the Kubernetes community such as to develop <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/\">Operator pattern<\/a> solutions or to manage them are good recommendations for who is looking for to build the operator projects and distribute them with OLM. Also, see <a href=\"https:\/\/sdk.operatorframework.io\/docs\/best-practices\/best-practices\/\">Operator Best Practices<\/a> and ensure that you check out <a href=\"https:\/\/master.sdk.operatorframework.io\/docs\/best-practices\/best-practices\/#running-on-cluster\">Running On-Cluster<\/a>.<\/p>\n<h2 id=\"validate-your-bundle-before-publish-it\">Validate your bundle before publish it<\/h2>\n<p>Check and test your operator bundle before you publish it. Note that the <a href=\"https:\/\/github.com\/operator-framework\/operator-sdk\"><code>operator-sdk<\/code><\/a> CLI can help with that process. You can validate a bundle via <a href=\"https:\/\/sdk.operatorframework.io\/docs\/cli\/operator-sdk_bundle_validate\/\"><code>operator-sdk bundle validate<\/code><\/a> against the entire suite of validators for Operator Framework, in addition to required bundle validators:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>operator-sdk bundle validate .\/bundle --select-optional <span style=\"color:#000\">suite<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>operatorframework\n<\/span><\/span><\/code><\/pre><\/div><p>The <code>OperatorHub.io<\/code> validator in the <code>operatorframework<\/code> optional suite allows you to validate that your manifests can work with a Kubernetes cluster of a particular version using the <code>k8s-version<\/code> optional key value:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>operator-sdk bundle validate .\/bundle --select-optional <span style=\"color:#000\">suite<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>operatorframework --optional-values<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>k8s-version<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>1.22\n<\/span><\/span><\/code><\/pre><\/div><p>Also, you can validate a bundle via <a href=\"https:\/\/sdk.operatorframework.io\/docs\/cli\/operator-sdk_scorecard\/\"><code>operator-sdk scorecard<\/code><\/a> to insure it against a suite of tests:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>operator-sdk scorecard bundle\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"provide-what-are-the-k8s-versions-supported-by-your-project\">Provide what are the k8s versions supported by your project<\/h2>\n<p>In the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/clusterserviceversion\">CSV<\/a> manifest of your operator bundle, you can set the <code>spec.minKubeVersion<\/code> property to inform what is the minimal Kubernetes version which your project supports:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">maturity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">minKubeVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.16.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>It is recommended you provide this information. Otherwise, it would mean that your operator project can be distributed and installed in any cluster version available, which is not necessarily the case for all projects.<\/p>"},{"title":"Docs: Admission Webhook Reference","link":"https:\/\/olm.operatorframework.io\/docs\/reference\/admission-webhooks\/","pubDate":"Fri, 24 Apr 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/reference\/admission-webhooks\/","description":"\n<p>After a request has been authenticated and authorized, admission webhooks intercept requests against the Kubernetes API and have an opportunity to validate or update the object before it is saved in the object store. Please refer to the following table that highlights what each webhook is capable of:<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Validating Webhooks<\/th>\n<th>Mutating Webhooks<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Validating Objects<\/td>\n<td>x<\/td>\n<td>x<\/td>\n<\/tr>\n<tr>\n<td>Mutating Objects<\/td>\n<td><\/td>\n<td>x<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>If you are interested in learning more about admission webhooks, please review the <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/admission-controllers\/#what-are-they\">official kubernetes documentation<\/a>.<\/p>"},{"title":"Docs: Subscription","link":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/subscription\/","pubDate":"Wed, 25 Mar 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/subscription\/","description":"\n<div class=\"pageinfo pageinfo-primary\">\n<p>This section assumes that you have a working <code>CatalogSource<\/code>. Please see how to <a href=\"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/catalogsource\/\">troubleshoot a CatalogSource<\/a> if you&rsquo;re having trouble configuring a CatalogSource.<\/p>\n<\/div>\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/mikefarah\/yq\">yq<\/a><\/li>\n<\/ul>\n<h3 id=\"how-to-debug-a-failing-subscription\">How to debug a failing Subscription<\/h3>\n<p>The Catalog operator will constantly update the <code>Status<\/code> of <code>Subscription<\/code> to reflect its current state. You can check the <code>Status<\/code> of your <code>Subscription<\/code> with the following command:<\/p>\n<p><code>$ kubectl get subscription &lt;subscription-name&gt; -n &lt;namespace&gt; -o yaml | yq e '.status' -<\/code><\/p>\n<blockquote>\n<p>Note: It is possible that the <code>Status<\/code> is missing, which suggests that the Catalog operator is encountering an issue when processing the <code>Subscription<\/code> in a very early stage.<\/p>\n<\/blockquote>\n<p>If the <code>Status<\/code> block does not provide enough information, check the <a href=\"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/olm-and-catalog-operators\/#how-to-view-the-catalog-operator-logs\">Catalog operator&rsquo;s logs<\/a>.<\/p>\n<h3 id=\"a-subscription-in-namespace-x-cant-install-operators-from-a-catalogsource-in-namespace-y\">A subscription in namespace X can&rsquo;t install operators from a CatalogSource in namespace Y<\/h3>\n<p><code>Subscriptions<\/code> cannot install operators provided by <code>CatalogSources<\/code> that are not in the same namespace unless the <code>CatalogSource<\/code> is created in the <code>olm<\/code> namespace.<\/p>\n<h3 id=\"a-subscription-fails-because-i-deleted-a-similar-subscription-and-left-the-csv-it-installed\">A subscription fails because I deleted a similar subscription and left the CSV it installed<\/h3>\n<p>By creating a <code>Subscription<\/code>, the user is &ldquo;subscribing&rdquo; to updates from a particular package and channel within a <code>CatalogSource<\/code>. When a <code>ClusterServiceVersion (CSV)<\/code> is created to fulfill the <code>Subscription<\/code>, the <code>Subscription<\/code> is updated so it is &ldquo;associated&rdquo; with that <code>CSV<\/code>. &ldquo;Associated&rdquo; <code>CSVs<\/code> do not need to appear in the solution set allowing the <code>Subscription<\/code>&rsquo;s&rsquo; requirements to be met by <code>CSVs<\/code> in the channel that are valid upgrades from the existing <code>CSV<\/code>.<\/p>\n<p>When you delete a <code>Subscription<\/code>, the <code>CSV<\/code> is no longer &ldquo;associated&rdquo; with any <code>Subscriptions<\/code>. <code>CSVs<\/code> that are not &ldquo;associated&rdquo; with a <code>Subscription<\/code> must appear in the solution set returned by the resolver. Historically, this allowed users to &ldquo;pin&rdquo; a specific version of the operator and cancel any upgrades.<\/p>\n<p>Once a <code>CSV<\/code> is no longer &ldquo;associated&rdquo; with a <code>Subscription<\/code>, creating a new <code>Subscription<\/code> that subscribes to the same package and channel within a <code>CatalogSource<\/code> will not &ldquo;associate&rdquo; the existing <code>CSV<\/code> with the <code>Subscription<\/code> because there is no guarantee that the package, channel, and <code>CatalogSource<\/code> defined in the <code>Subscription<\/code> are globally unique.<\/p>\n<p>Creating a new <code>Subscription<\/code> for the existing <code>CSV<\/code> causes the resolver to fail because of the following requirements:<\/p>\n<ul>\n<li>The <code>Subscription<\/code> requires an <code>CSV<\/code> that fulfills it.<\/li>\n<li>The existing <code>CSV<\/code> must appear in the solution set (remember, it cannot fulfill the requirements of <code>Subscriptions<\/code> it is not associated with).<\/li>\n<\/ul>\n<p>This ultimately surfaces a resolution failure in the <code>Subscription's status.Conditions<\/code> array:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>message: <span style=\"color:#4e9a06\">&#39;constraints not satisfiable: @existing\/namespace-foo\/operator-foo.v1.0.0\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">and catalogSource-foo\/namespace-foo\/4.Y\/operator-foo.v1.1.0\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">originate from package foo-operator, subscription subscription-foo\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">requires catalogSource-foo\/namespace-foo\/4.Y\/operator-foo.v1.1.0,\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">subscription subscription-foo exists, clusterserviceversion\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">operator-foo.v1.0.0 exists and is not referenced by a subscription&#39;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>reason: ConstraintsNotSatisfiable\n<\/span><\/span><span style=\"display:flex;\"><span>status: <span style=\"color:#4e9a06\">&#34;True&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>type: ResolutionFailed\n<\/span><\/span><\/code><\/pre><\/div><p>There are two potential workarounds:<\/p>\n<ul>\n<li>If you want to upgrade the operator, you will need to delete the existing <code>CSV<\/code>.<\/li>\n<li>If you do not want to upgrade the operator, you will need to delete the <code>Subscription<\/code>.<\/li>\n<\/ul>\n<h3 id=\"why-does-a-single-failing-subscription-cause-all-subscriptions-in-a-namespace-to-fail\">Why does a single failing subscription cause all subscriptions in a namespace to fail?<\/h3>\n<p>Each Subscription in a namespace acts as a part of a set of operators for the namespace - think of a Subscription as an entry in a python <code>requirements.txt<\/code>. If OLM is unable to resolve part of the set, it knows that resolving the entire set will fail, so it will bail out of the installation of operators for that particular namespace. Subscriptions are separate objects but within a namespace they are all synced and resolved together.<\/p>\n<h3 id=\"subscription-fails-due-to-missing-apis\">Subscription fails due to missing APIs<\/h3>\n<p>Newer versions of Kubernetes may deprecate and remove certain APIs that OLM supports. For example, the <code>apiextensions.k8s.io\/v1beta1<\/code> GroupVersion is no longer available on Kubernetes 1.22+ clusters. Operators that rely on v1beta1 CRDs will fail to install on 1.22+ clusters, since the v1beta API has been removed. See\n<a href=\"https:\/\/kubernetes.io\/docs\/reference\/using-api\/deprecation-guide\/\">the official Kubernetes deprecation guide<\/a> for the full list of resources that have been deprecated and removed by individual Kubernetes versions. These APIs will continue to be available on older versions of Kubernetes and OLM will continue to support them moving forward.<\/p>\n<p>In the case where a subscription is created to an operator that relies on missing APIs, for example a v1beta1 CRD, an error condition will be present on the subscription status with the following message:<\/p>\n<pre tabindex=\"0\"><code>api-server resource not found installing CustomResourceDefinition my-crd-name: GroupVersionKind apiextensions.k8s.io\/v1beta1, Kind=CustomResourceDefinition not found on the cluster. This API may have been deprecated and removed, see https:\/\/kubernetes.io\/docs\/reference\/using-api\/deprecation-guide\/ for more information.\n<\/code><\/pre><p>This error indicates that the API apiextensions.k8s.io\/v1beta1, Kind=CustomResourceDefinition is not available on-cluster. It indicates this particular GVK is not present on the api-server, which will happen on Kubernetes 1.22+ with deprecated built-in types like v1beta1 CRDs or v1beta1 RBAC.<\/p>\n<p>This error can also arise when installing operator bundles with CustomResources that OLM supports, such as <code>VerticalPodAutoscalers<\/code> and <code>PrometheusRules<\/code>, but the relevant CustomResourceDefinition has not yet been installed. In this case, this error should eventually resolve itself provided the required CustomResourceDefinition gets installed on the cluster and is accepted by the api-server.<\/p>\n<h3 id=\"subscriptions-failing-due-to-unpacking-errors\">Subscriptions failing due to unpacking errors<\/h3>\n<p>If a subscription that references an operator bundle fails to unpack successfully, the subscription fails with the following message:<\/p>\n<pre tabindex=\"0\"><code>bundle unpacking failed. Reason: DeadlineExceeded, and Message: Job was active longer than the specified deadline\n<\/code><\/pre><p>There are many potential causes for bundle unpacking errors. Some of the most common causes include:<\/p>\n<ul>\n<li>Unreachable Operator bundle image\n<ul>\n<li>Misconfigured network, such as an incorrectly configured proxy\/firewall<\/li>\n<li>Missing operator bundle images from the reachable image registries<\/li>\n<li>Invalid or missing image registry credentials\/secrets<\/li>\n<li>Image registry rate limits<\/li>\n<\/ul>\n<\/li>\n<li>Resource limitations on the cluster\n<ul>\n<li>CPU or network limitations preventing operator bundle images from being pulled within the timeout (10 minutes)<\/li>\n<li>Inability to schedule pods for unpacking operator bundle images<\/li>\n<li>etcd performance issues<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>To resolve the error, address the underlying causes for the unpack failure. Next, delete any failing unpack jobs and their owner configMaps to force the subscription to retry unpacking the operator bundles.<\/p>\n<p>To enable automated cleanup and retry of failed unpack jobs in a namespace, set the <code>operatorframework.io\/bundle-unpack-min-retry-interval<\/code> annotation on the operatorGroup in the desired namespace. This annotation indicates the time after the last unpack failure when the unpack may be attempted again. Do not set this annotation to an interval shorter than <code>5m<\/code> to avoid unnecessary load on the cluster.<\/p>\n<pre tabindex=\"0\"><code>kubectl annotate operatorgroup &lt;OPERATOR_GROUP&gt; operatorframework.io\/bundle-unpack-min-retry-interval=10m\n<\/code><\/pre><p>This annotation does not enforce limits on the number of times an operator bundle may be unpacked on failure, preserving only 5 failing unpack attempts for inspection. Unless the underlying cause for the failure is addressed, this may cause OLM to attempt to unsuccessfully unpack the operator bundle indefinitely. Removing the annotation from the operatorGroup disables automated retries for failed unpacking jobs on that namespace.<\/p>\n<p>With older versions of OLM, an installPlan might be generated for the failing subscription. To refresh a failed subscription with an InstallPlan, you must perform the following steps:<\/p>\n<ol>\n<li>Back up the subscription.<\/li>\n<li>Delete the failing installPlan, CSV, and subscription.<\/li>\n<li>Delete the failing unpack job and its owner configMap.<\/li>\n<li>Reapply the subscription.<\/li>\n<\/ol>"},{"title":"Docs: Shipping an operator that includes Webhooks","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/adding-admission-and-conversion-webhooks\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/adding-admission-and-conversion-webhooks\/","description":"\n<h2 id=\"the-webhookdefinition-clusterserviceversion-object\">The WebhookDefinition ClusterServiceVersion Object<\/h2>\n<p>Operators may define <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/admission-controllers\/#validatingadmissionwebhook\">validating<\/a>, <a href=\"https:\/\/kubernetes.io\/docs\/reference\/access-authn-authz\/admission-controllers\/#mutatingadmissionwebhook\">mutating<\/a>, and <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/extend-kubernetes\/custom-resources\/custom-resource-definition-versioning\/#webhook-conversion\">conversion<\/a> webhooks within its <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/clusterserviceversion\">ClusterServiceVersion resource (CSV)<\/a><\/p>\n<p>These webhooks are defined with the CSV&rsquo;s <a href=\"https:\/\/github.com\/operator-framework\/api\/blob\/7856a40f92893fe94d19d223f5277d1d116ffc67\/pkg\/operators\/v1alpha1\/clusterserviceversion_types.go#L164-L180\">WebhookDefinition<\/a> array. The <code>WebhookDescription<\/code> object contains a union of the fields defined in the <a href=\"https:\/\/kubernetes.io\/docs\/reference\/generated\/kubernetes-api\/v1.27\/#validatingwebhookconfiguration-v1-admissionregistration-k8s-io\">ValidatingWebhookConfiguration<\/a> and <a href=\"https:\/\/kubernetes.io\/docs\/reference\/generated\/kubernetes-api\/v1.27\/#mutatingwebhookconfiguration-v1-admissionregistration-k8s-io\">MutatingWebhookConfiguration<\/a> type with the exception of the NamespaceSelector, which is generated by OLM to match namespaces scoped by the <a href=\"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/operator-scoping-with-operatorgroups\">OperatorGroup<\/a> that the operator is deployed in.<\/p>\n<p>In addition to these fields, OLM requires that you define:<\/p>\n<ul>\n<li>The <code>Type<\/code> of the Webhook, which must be set to <code>ValidatingAdmissionWebhook<\/code>, <code>MutatingAdmissionWebhook<\/code>, or <code>ConversionWebhook<\/code><\/li>\n<li>The <code>DeploymentName<\/code> that OLM must mount the CA Cert information into, this should match the name of a deployment defined in the CSV<\/li>\n<\/ul>\n<h2 id=\"creating-an-operator-with-a-webhook\">Creating an Operator with a Webhook<\/h2>\n<p>This document will not cover the steps required to create an operator that includes an admission or conversion webhook. If you are interested in creating such an operator, please refer to the following documentation provided by the Operator-SDK and Kubebuilder projects:<\/p>\n<ul>\n<li><a href=\"https:\/\/book.kubebuilder.io\/cronjob-tutorial\/webhook-implementation.html\">Creating an Admission Webhook<\/a><\/li>\n<li><a href=\"https:\/\/book.kubebuilder.io\/multiversion-tutorial\/conversion.html\">Creating a Conversion Webhook<\/a><\/li>\n<\/ul>\n<h2 id=\"deploying-an-operator-with-webhooks-using-olm\">Deploying an operator with webhooks using OLM<\/h2>\n<p>OLM has a few constraints that must be considered when developing an operator featuring validating, mutating, or conversion webhooks.<\/p>\n<h3 id=\"certificate-authority-requirements\">Certificate Authority Requirements<\/h3>\n<p>OLM will create and mount a self-signed Certificate Authority (CA) to each deployment that contains a webhook as defined in the CSV. The certificates generated by OLM will expire after 2 years, at which point OLM will generate new certificates and redeploy the operator. The logic that generates and mounts the CA into the deployment was originally developed for the <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/access-kubernetes-api\/setup-extension-api-server\/\">API Service<\/a> lifecycle logic and has been expanded for use with webhooks.<\/p>\n<p>OLM will mount the certificates at the default location that operators built with Kubebuilder and the Operator-SDK expect the certificates, specifically<\/p>\n<ul>\n<li>The TLS Cert file will be mounted to the deployment at <code>\/tmp\/k8s-webhook-server\/serving-certs\/tls.cert<\/code><\/li>\n<li>The TLS Key file will be mounted to the deployment at <code>\/tmp\/k8s-webhook-server\/serving-certs\/tls.key<\/code><\/li>\n<\/ul>\n<blockquote>\n<p>Note: When OLM was released, the CAs meant for Webhooks were mounted to the same location as defined by the existing API Service Lifecycle code. In an effort to remain backwards compatible, the certificates are also mounted to the following locations:<\/p>\n<\/blockquote>\n<ul>\n<li>The TLS Cert file will also be mounted to the deployment at <code>\/apiserver.local.config\/certificates\/apiserver.crt<\/code><\/li>\n<li>The TLS Key file will also be mounted to the deployment at <code>\/apiserver.local.config\/certificates\/apiserver.key<\/code><\/li>\n<\/ul>\n<p>OLM does not allow users to specify a mount location or name for the certificates. This issue should be addressed once OLM makes the decision to offload the management of CAs to projects such as <a href=\"https:\/\/github.com\/jetstack\/cert-manager\">Cert-Manager<\/a> and the <a href=\"https:\/\/github.com\/openshift\/service-ca-operator\">Service-CA Operator<\/a>, this work can be tracked <a href=\"https:\/\/github.com\/operator-framework\/operator-lifecycle-manager\/issues\/1805\">here<\/a>.<\/p>\n<h3 id=\"admission-webhook-rule-requirements\">Admission Webhook Rule Requirements<\/h3>\n<p>When developing an admission webhook please be aware that in an attempt to prevent operator from configuring the cluster into an unrecoverable state, OLM will place the CSV in the failed phase if the Rules defined in an admission webhook:<\/p>\n<ul>\n<li>Intercept requests that target all groups<\/li>\n<li>Intercept requests that target the <code>operators.coreos.com<\/code> group<\/li>\n<li>Intercept requests that target the <code>ValidatingWebhookConfigurations<\/code> or <code>MutatingWebhookConfigurations<\/code> resources<\/li>\n<\/ul>\n<h3 id=\"conversion-webhook-rules-requirements\">Conversion Webhook Rules Requirements<\/h3>\n<ul>\n<li>CSVs featuring a conversion webhook may only support the <code>AllNamespaces<\/code> installMode<\/li>\n<li>The CRD targeted by the Conversion webhook must have its <code>spec.preserveUnknownFields<\/code> field set to <code>false<\/code> or <code>nil<\/code><\/li>\n<li>The Conversion Webhook defined in the CSV must target an owned CRD<\/li>\n<\/ul>\n<h3 id=\"example-installing-a-operator-featuring-webhooks-with-olm\">Example: Installing a operator featuring webhooks with OLM<\/h3>\n<p>This example will focus on installing an operator that the OLM team built for its e2e test portfolio, the <a href=\"https:\/\/github.com\/awgreene\/webhook-operator\/tree\/olm\">webhook-operator<\/a>. The webhook-operator implements a validating, mutating, and conversion webhook for the <a href=\"https:\/\/github.com\/awgreene\/webhook-operator\/blob\/olm\/config\/crd\/bases\/webhook.operators.coreos.io_webhooktests.yaml\">WebhookTest CRD<\/a>.<\/p>\n<h4 id=\"defining-conversion-webhooks-in-the-clusterserviceversion\">Defining Conversion Webhooks in the ClusterServiceVersion<\/h4>\n<p>The full webhook operator CSV can be seen <a href=\"https:\/\/github.com\/awgreene\/webhook-operator\/blob\/07375018e32cbebedee55aa1b131469c247dd275\/bundle\/manifests\/webhook-operator.clusterserviceversion.yaml\">here<\/a>, but we will highlight the important parts of the CSV below:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ClusterServiceVersion<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">webhook-operator.v0.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">customresourcedefinitions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">owned<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">WebhookTest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">webhooktests.webhook.operators.coreos.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># The CRDs target by the conversion webhook must exist here<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">install<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">deployments<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">webhook-operator-webhook<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">strategy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">deployment<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">installModes<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OwnNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">SingleNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">MultiNamespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">supported<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">AllNamespaces<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">webhookdefinitions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ValidatingAdmissionWebhook<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">admissionReviewVersions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1beta1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">containerPort<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">443<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetPort<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">4343<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">deploymentName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">webhook-operator-webhook<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">failurePolicy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Fail<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">generateName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">vwebhooktest.kb.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">rules<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">apiGroups<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">webhook.operators.coreos.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">apiVersions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">CREATE<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">UPDATE<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">resources<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">webhooktests<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sideEffects<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">None<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">webhookPath<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">\/validate-webhook-operators-coreos-io-v1-webhooktest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">MutatingAdmissionWebhook<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">admissionReviewVersions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1beta1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">containerPort<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">443<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetPort<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">4343<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">deploymentName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">webhook-operator-webhook<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">failurePolicy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Fail<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">generateName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">mwebhooktest.kb.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">rules<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">apiGroups<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">webhook.operators.coreos.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">apiVersions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">CREATE<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">UPDATE<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">resources<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">webhooktests<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sideEffects<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">None<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">webhookPath<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">\/mutate-webhook-operators-coreos-io-v1-webhooktest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">ConversionWebhook<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">admissionReviewVersions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1beta1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">containerPort<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">443<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetPort<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">4343<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">deploymentName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">webhook-operator-webhook<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">generateName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">cwebhooktest.kb.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sideEffects<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">None<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">webhookPath<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">\/convert<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">conversionCRDs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">webhooktests.webhook.operators.coreos.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Each CRD must have spec.PreserveUnknownFields property set to `false` or `nil`<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: CatalogSource","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/catalogsource\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/catalogsource\/","description":"\n<p>A CatalogSource represents a store of metadata that OLM can query to discover and install operators and their dependencies.<\/p>\n<p>There are three primary types of CatalogSource(<code>spec.sourceType<\/code>):<\/p>\n<ul>\n<li><code>grpc<\/code> with an <code>image<\/code> reference: OLM will pull the image and run a pod that has an api endpoint that can be queried for the metadata in the store<\/li>\n<li><code>grpc<\/code> with an <code>address<\/code> field: OLM will attempt to contact the grpc api at the given address. This should not be used in most cases.<\/li>\n<li><code>internal<\/code> or <code>configmap<\/code>: OLM will parse the configmap&rsquo;s data and spin up a pod that can serve the grpc api over it.<\/li>\n<\/ul>\n<h2 id=\"example---operatorhubio\">Example - OperatorHub.io<\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">CatalogSource<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operatorhubio-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceType<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">grpc<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/operatorhubio\/catalog:latest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Community Operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">publisher<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorHub.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>This defines a CatalogSource for OperatorHub.io&rsquo;s content. The <code>name<\/code> of the CatalogSource is used as input to a <code>Subscription<\/code>, which tells OLM where to look to find a requested operator:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operatorhubio-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: Overriding CatalogSource Pod Scheduling Configuration","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/overriding-catalog-source-pod-scheduling-configuration\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/overriding-catalog-source-pod-scheduling-configuration\/","description":"\n<h2 id=\"overriding-catalogsource-pod-scheduling-configuration\">Overriding CatalogSource Pod Scheduling Configuration<\/h2>\n<p>When given a CatalogSource of type <code>grpc<\/code> with <code>spec.image<\/code> defined, the <code>catalog<\/code> operator will create\nPod that serves the content in <code>spec.image<\/code>. By default, this pod defines in its spec no <code>tolerations<\/code>, no <code>priorityClassName<\/code>,\nand only the following node selector: <code>kubernetes.io\/os=linux<\/code>. These values can be overriden with CatalogSource&rsquo;s\n<code>spec.grpcPodConfig<\/code>. For instance,<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">CatalogSource<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operatorhubio-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceType<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">grpc<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/operatorhubio\/catalog:latest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Community Operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">publisher<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorHub.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># optional<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">grpcPodConfig<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># override nodeSelector<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># for more information on nodeSelectors see:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/assign-pod-node\/#nodeselector<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># optional<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">nodeSelector<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">custom_label<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">value<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># change priorityClassName<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># kubernetes ships with: system-cluster-critical and system-node-critical<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># setting it to empty (&#34;&#34;) will assign the pod the default priority.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Other priority classes can be defined manually. For more information on priority classes see:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/pod-priority-preemption\/#priorityclass<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># optional<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">priorityClassName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">system-cluster-critical<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># override tolerations<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># for more information on taints and tolerations see:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/taint-and-toleration<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># optional<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">tolerations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">key<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;key1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operator<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;Equal&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;value1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">effect<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;NoSchedule&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>As can be seen in the example, <code>spec.grpcPodConfig<\/code> and all of its attributes are optional. These attributes are: <code>nodeSelector<\/code>, <code>priorityClassName<\/code>, and <code>tolerations<\/code>. It should be noted that <code>priorityClassName<\/code> can be overriden to be <code>&quot;&quot;<\/code>. This will give the pod the default priority. Any value\noutside <code>system-cluster-critical<\/code>, <code>system-node-critical<\/code>, and <code>&quot;&quot;<\/code> will need to correspond to a pre-existing and custom defined <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/pod-priority-preemption\/#priorityclass\">priorityClass<\/a>.<\/p>\n<p>Previously, the only pod scheduling parameter that could be overriden was the <code>priorityClassName<\/code>. This was done by adding the following annotation to the <code>CatalogSource<\/code> CR: <code>operatorframework.io\/priorityclass<\/code>. For instance:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">CatalogSource<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operatorhubio-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">annotations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># kubernetes ships with: system-cluster-critical and system-node-critical<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># setting it to empty (&#34;&#34;) will assign the pod the default priority.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Other priority classes can be defined manually. For more information on priority classes see:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/pod-priority-preemption\/#priorityclass<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># optional<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operatorframework.io\/priorityclass<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">system-cluster-critical<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceType<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">grpc<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/operatorhubio\/catalog:latest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Community Operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">publisher<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorHub.io<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><strong>NOTE<\/strong>: If a <code>CatalogSource<\/code> CR defines both the annotation and <code>spec.grpcPodConfig.priorityClassName<\/code>, the <strong>annotation<\/strong> will take precedence over the configuration parameter.<\/p>"},{"title":"Docs: Communicating Operator Conditions to OLM","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/communicating-operator-conditions-to-olm\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/communicating-operator-conditions-to-olm\/","description":"\n<h2 id=\"communicating-operator-conditions-to-olm\">Communicating Operator Conditions to OLM<\/h2>\n<p>As part of its role in managing the lifecycle of an operator, the Operator-Lifecycle-Manager (OLM) infers the state of an operator from the state of Kubernetes resources that define the operator. While this approach provides some level of assurance that an operator is in a given state, there are many instances where an operator may wish to communicate information to OLM that could not be inferred otherwise. This information can then be used by OLM to better manage the lifecycle of the operator.<\/p>\n<h2 id=\"operatorconditions\">OperatorConditions<\/h2>\n<p>OLM introduced a new <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/api-extension\/custom-resources\/\">CustomResourceDefinition<\/a> called the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorcondition\">OperatorCondition<\/a> allowing operators to communicate conditions to OLM. There are a set of &ldquo;OLM Supported Conditions&rdquo; which influence OLM&rsquo;s management of the operator when present in the OperatorCondition&rsquo;s <a href=\"https:\/\/github.com\/operator-framework\/api\/blob\/b55a341f6560db4adec39d69aab1ff3092ea202a\/pkg\/operators\/v1\/operatorcondition_types.go#L22\">Status.Conditions<\/a> array.<\/p>\n<h3 id=\"olm-supported-conditions\">OLM Supported Conditions<\/h3>\n<p>The set of &ldquo;OLM Supported Conditions&rdquo; include:<\/p>\n<ul>\n<li>The <a href=\"#upgradeable\">Upgradeable<\/a> Condition<\/li>\n<\/ul>\n<h4 id=\"upgradeable\">Upgradeable<\/h4>\n<p>The <code>Upgradeable<\/code> &ldquo;OLM Supported Condition&rdquo; prevents the existing CSV from being replaced by a newer version of the CSV. When the <code>Upgradeable<\/code> condition is set to <code>False<\/code>, OLM will:<\/p>\n<ul>\n<li>Prevent a channel entry in a subscribed package that replaces the operator&rsquo;s existing CSV from leaving the PendingPhase.<\/li>\n<\/ul>\n<p>The <code>Upgradeable<\/code> condition might be useful when:<\/p>\n<ul>\n<li>An operator is about to start a critical process and should not be upgraded until after the process is completed.<\/li>\n<li>The operator is performing a migration of CRs that must be completed before the operator is ready to be upgraded.<\/li>\n<\/ul>\n<h5 id=\"example-upgradeable-operatorcondition\">Example Upgradeable OperatorCondition<\/h5>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorCondition<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">conditions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Upgradeable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># The name of the `Upgradeable` OLM Supported Condition.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;False&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># The operator is not ready to be upgraded.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">reason<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;migration&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;The operator is performing a migration.&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">lastTransitionTime<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;2020-08-24T23:15:55Z&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Given that the <code>Upgradable Condition<\/code>&rsquo;s status is set to <code>False<\/code>, OLM will understand that it should not upgrade the operator.<\/p>\n<h3 id=\"overriding-operatorconditions\">Overriding OperatorConditions<\/h3>\n<p>There are times as a Cluster Admin that you may want to ignore an &ldquo;OLM Supported Condition&rdquo; reported by an Operator. For example, imagine that a known version of an operator always communicates that it is not upgradeable. In this instance, you may want to upgrade the operator despite the operator communicating that it is not upgradeable. This could be accomplished by overriding the <code>OLM Supported Condition<\/code> by adding the condition&rsquo;s type and status to the <code>spec.overrides<\/code> array in the <code>OperatorCondition<\/code> CR:<\/p>\n<p>&ldquo;OLM Supported Conditions&rdquo; can be overridden by Cluster Admins by appending the desired OperatorCondition to the opertor&rsquo;s OperatorCondition&rsquo;s <a href=\"https:\/\/github.com\/operator-framework\/api\/blob\/b55a341f6560db4adec39d69aab1ff3092ea202a\/pkg\/operators\/v1\/operatorcondition_types.go#L16\">Spec.Overrides<\/a> Condition Array. When present, &ldquo;OLM Supported Conditions&rdquo; in the <code>Spec.Overrides<\/code> array will override the Conditions in the <code>Status.conditions<\/code> array, allowing Cluster Admins to deal with situations where an operator is incorrectly reporting a state to OLM.<\/p>\n<h4 id=\"example-override\">Example Override<\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorCondition<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">overrides<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Upgradeable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Allows the cluster admin to change operator&#39;s Upgrade readiness to True<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;True&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">reason<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;upgradeIsSafe&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;This is a known issue with the operator where it always reports that it cannot be upgraded.&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">conditions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Upgradeable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;False&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">reason<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;migration&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;The operator is performing a migration.&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">lastTransitionTime<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;2020-08-24T23:15:55Z&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"updating-your-operator-to-use-olm-operatorcondition\">Updating your operator to use OLM OperatorCondition<\/h2>\n<p>OLM will automatically create an <code>OperatorCondition<\/code> for each <code>ClusterServiceVersion<\/code> that it reconciles. All service accounts in the CSV will be granted the RBAC to interact with the <code>OperatorCondition<\/code> owned by the operator.<\/p>\n<p>Operators deployed by OLM may then use the <a href=\"https:\/\/github.com\/operator-framework\/operator-lib\/tree\/main\/conditions\">operator-library<\/a> to set conditions on their operator.<\/p>\n<h3 id=\"setting-defaults\">Setting Defaults<\/h3>\n<p>In an effort to remain backwards compatible, OLM treats the absence of an <code>OperatorConditions<\/code> as opting out of the condition. Therefore, an operator that opts in to using <code>OperatorConditions<\/code> should set default conditions before the pod&rsquo;s <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-liveness-readiness-startup-probes\/#define-readiness-probes\">ready probe<\/a> is set to true. This provides the operator with a grace period to update the condition to the correct state.<\/p>"},{"title":"Docs: Configuring OLM","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/configuring-olm\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/configuring-olm\/","description":"\n<h2 id=\"configuring-olm\">Configuring OLM<\/h2>\n<p>The <a href=\"https:\/\/github.com\/operator-framework\/operator-lifecycle-manager\">Operator-Lifecycle-Manager (OLM)<\/a> controller can be configured through an <a href=\"https:\/\/github.com\/operator-framework\/api\/blob\/v0.11.0\/crds\/operators.coreos.com_olmconfigs.yaml\">OLMConfig CustomResourceDefinition (CRD)<\/a> named <code>cluster<\/code>. This document will outline what configurations OLM currently supports.<\/p>\n<h3 id=\"disabling-copied-csvs\">Disabling Copied CSVs<\/h3>\n<h4 id=\"background\">Background<\/h4>\n<p>When an operator is installed by OLM, a stripped down copy of its CSV is created in every namespace the operator is configured to watch. These stripped down CSVs are known as &ldquo;Copied CSVs&rdquo; and communicate to users which controllers are actively reconciling resource events in a given namespace. When operators are installed in the AllNamespace mode, a Copied CSV is created in every namespace on the cluster. On especially large clusters, with namespaces and installed operators tending in the hundreds or thousands, Copied CSVs consume an untenable amount of resources; e.g. OLM&rsquo;s memory usage, cluster Etcd limits, networking, etc.<\/p>\n<h4 id=\"usage\">Usage<\/h4>\n<p>In an effort to support these larger cluster, OLM allows users to disable Copied CSVs for operators installed in the AllNamespace mode by setting the <code>cluster<\/code> olmConfig&rsquo;s <code>spec.features.disableCopiedCSVs<\/code> field to true.<\/p>\n<pre tabindex=\"0\"><code class=\"language-bash=\" data-lang=\"bash=\">$ kubectl apply -f - &lt;&lt;EOF\napiVersion: operators.coreos.com\/v1\nkind: OLMConfig\nmetadata:\nname: cluster\nspec:\nfeatures:\ndisableCopiedCSVs: true # Disabled Copied CSVs for AllNamespace operators.\nEOF\nolmconfig.operators.coreos.com\/cluster configured\n<\/code><\/pre><p>When Copied CSVs are Disabled, OLM will capture this information in an event in the operator&rsquo;s namespace, an example of the event can be seen below:<\/p>\n<pre tabindex=\"0\"><code class=\"language-bash=\" data-lang=\"bash=\">$ kubectl get events\nLAST SEEN TYPE REASON OBJECT MESSAGE\n85s Warning DisabledCopiedCSVs clusterserviceversion\/my-csv.v1.0.0 CSV copying disabled for operators\/my-csv.v1.0.0\n<\/code><\/pre><p>When the <code>cluster<\/code> olmConfig&rsquo;s <code>spec.features.disableCopiedCSVs<\/code> field is missing or set to <code>false<\/code>, OLM will recreate the Copied CSVs for all operators installed in the AllNamespace mode and deleted the previously mentioned events.<\/p>\n<p>Additional information about this feature can be found in its original <a href=\"https:\/\/github.com\/operator-framework\/enhancements\/blob\/master\/enhancements\/olm-toggle-copied-csvs.md\">enhancement proposal<\/a>.<\/p>\n<h3 id=\"changing-the-package-server-sync-interval\">Changing the Package Server Sync Interval<\/h3>\n<h4 id=\"background-1\">Background<\/h4>\n<p>After CatalogSources are created, they are synced by the OLM packageservers every 12 hours. This sync interval may be increased to reduce the CPU utilization of the packageserver and CatalogSources, or decreased to improve response times to available updates. This field represents a duration, but is limited to using hours, minutes and seconds.<\/p>\n<h4 id=\"usage-1\">Usage<\/h4>\n<pre tabindex=\"0\"><code class=\"language-bash=\" data-lang=\"bash=\">$ kubectl apply -f - &lt;&lt;EOF\napiVersion: operators.coreos.com\/v1\nkind: OLMConfig\nmetadata:\nname: cluster\nspec:\nfeatures:\npackageServerSyncInterval: 1h30m\nEOF\nolmconfig.operators.coreos.com\/cluster configured\n<\/code><\/pre><p>When the <code>cluster<\/code> olmConfig&rsquo;s <code>spec.features.packageServerSyncInterval<\/code> field is missing, OLM will use the default value of <code>12h<\/code>.<\/p>"},{"title":"Docs: Creating a Catalog of operators","link":"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-a-catalog\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-a-catalog\/","description":"\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/operator-framework\/operator-registry\/releases\">opm<\/a> <code>v1.19.0+<\/code> (for file-based catalogs), <strong>OR<\/strong><\/li>\n<li><a href=\"https:\/\/github.com\/operator-framework\/operator-registry\/releases\">opm<\/a> <code>v1.23.1+<\/code> (for catalog templates)<\/li>\n<\/ul>\n<blockquote>\n<p>Note: This document discusses creating a catalog of operators using plaintext files to store catalog metadata, which is the <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\">latest feature<\/a> of OLM catalogs. If you are looking to build catalogs using the deprecated sqlite database format to store catalog metadata instead, please read the <a href=\"https:\/\/v0-18-z.olm.operatorframework.io\/docs\/tasks\/make-index-available-on-cluster\/\">v0.18.z version<\/a> of this doc instead.<\/p>\n<\/blockquote>\n<blockquote>\n<p>Note: <code>catalog templates<\/code> are <strong>ALPHA<\/strong> functionality and may adopt breaking changes<\/p>\n<\/blockquote>\n<h2 id=\"creating-a-catalog\">Creating a Catalog<\/h2>\n<p><code>OLM<\/code>&rsquo;s <code>CatalogSource<\/code> <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/catalogsource\">CRD<\/a> accepts a container image reference to a catalog of operators that can\nbe made available to install in a cluster. You can make your operator bundle available to install in a cluster by adding\nit to a catalog, packaging the catalog in a container image, and then using that image reference in the <code>CatalogSource<\/code>.\nThis image contains all of the metadata required for OLM to manage the lifecycle of all of the operators it contains.<\/p>\n<p>OLM uses a plaintext <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\">file-based catalog<\/a> format (JSON or YAML) to store these records in a Catalog, and there are two approaches we can take to creating a Catalog, adding operators to it, and validating it.\nLet&rsquo;s walk through a simple example for both approaches.<\/p>\n<h3 id=\"catalog-creation-using-catalog-templates\">Catalog Creation Using Catalog Templates<\/h3>\n<p><a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/catalog-templates\">Catalog Templates<\/a> are a purpose-built simplification of <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\">File-Based Catalogs<\/a> to ease common catalog operations. For this example, we&rsquo;ll be using the <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/catalog-templates#semver-template\">semver template<\/a>.<\/p>\n<blockquote>\n<p>Note: We strongly recommend that authors create and maintain their templates in a version-controlled environment discrete from their generated catalogs. Further, we recommend that authors focus on the template as the sole artifact connecting the operator to the catalog (even going so far as only generating the file-based catalog during CI\/CD tooling so it is only provided for catalog contribution.)<\/p>\n<\/blockquote>\n<h4 id=\"catalog-creation\">Catalog Creation<\/h4>\n<p>First we need to create the Catalog hierarchy and Dockerfile for generating the image<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ mkdir -p cool-catalog\/example-operator\n<\/span><\/span><span style=\"display:flex;\"><span>$ opm generate dockerfile cool-catalog\n<\/span><\/span><\/code><\/pre><\/div><h4 id=\"organizing-the-bundles-into-channels\">Organizing the Bundles into Channels<\/h4>\n<p>Let&rsquo;s assume that this isn&rsquo;t the first time that we have released this operator into the catalog, but it&rsquo;s our first foray into templates. We need to ensure an upgrade graph edge between the older bundle version and the new one. We also want to promote this latest version in a &ldquo;stable&rdquo; channel. Lastly, we already use <a href=\"https:\/\/semver.org\">Semantic Versioning<\/a> for our release numbering, and we really only care about new major (e.g. X.#.#) releases.<\/p>\n<blockquote>\n<p>Note: we presume this step and template processing are performed in the source-controlled location related to operator bundle release, or at least separate from the catalog<\/p>\n<\/blockquote>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ cat <span style=\"color:#4e9a06\">&lt;&lt; EOF &gt;&gt; example-operator-template.yaml\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">Schema: olm.semver\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">GenerateMajorChannels: true\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">GenerateMinorChannels: false\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">Stable:\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> Bundles:\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> - Image: repository-uri\/example-operator:v0.8.9\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> - Image: repository-uri\/example-operator:v0.9.0\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">EOF<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h4 id=\"generating-the-catalog\">Generating the Catalog<\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\">opm alpha render-template semver -o yaml &lt; example-operator-template.yaml &gt; cool-catalog\/catalog.yaml\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Validate the catalog to ensure that the result is functional<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ opm validate cool-catalog\n<\/span><\/span><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">echo<\/span> <span style=\"color:#000\">$?<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#0000cf;font-weight:bold\">0<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h3 id=\"catalog-creation-with-raw-file-based-catalogs\">Catalog Creation with Raw File-Based Catalogs<\/h3>\n<h4 id=\"catalog-creation-1\">Catalog Creation<\/h4>\n<p>First, we need to initialize our Catalog, so we&rsquo;ll make a directory for it, generate a Dockerfile that can build a Catalog\nimage, and then populate our catalog with our operator.<\/p>\n<h4 id=\"initializing-the-catalog\">Initializing the Catalog<\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ mkdir cool-catalog\n<\/span><\/span><span style=\"display:flex;\"><span>$ opm generate dockerfile cool-catalog\n<\/span><\/span><span style=\"display:flex;\"><span>$ opm init example-operator <span style=\"color:#4e9a06\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"><\/span> --default-channel<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>preview <span style=\"color:#4e9a06\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"><\/span> --description<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>.\/README.md <span style=\"color:#4e9a06\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"><\/span> --icon<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>.\/example-operator.svg <span style=\"color:#4e9a06\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"><\/span> --output yaml &gt; cool-catalog\/operator.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>Let&rsquo;s validate our catalog to see if we&rsquo;re ready to ship!<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ opm validate cool-catalog\n<\/span><\/span><span style=\"display:flex;\"><span>FATA<span style=\"color:#ce5c00;font-weight:bold\">[<\/span>0000<span style=\"color:#ce5c00;font-weight:bold\">]<\/span> invalid index:\n<\/span><\/span><span style=\"display:flex;\"><span>\u2514\u2500\u2500 invalid package <span style=\"color:#4e9a06\">&#34;example-operator&#34;<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> \u2514\u2500\u2500 invalid channel <span style=\"color:#4e9a06\">&#34;preview&#34;<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> \u2514\u2500\u2500 channel must contain at least one bundle\n<\/span><\/span><\/code><\/pre><\/div><p>Alright, so it&rsquo;s not valid. It looks like we need to add a bundle, so let&rsquo;s do\nthat next&hellip;<\/p>\n<h4 id=\"add-a-bundle-to-the-catalog\">Add a bundle to the Catalog<\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ opm render quay.io\/example-inc\/example-operator-bundle:v0.1.0 <span style=\"color:#4e9a06\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"><\/span> --output<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>yaml &gt;&gt; cool-catalog\/operator.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>Let&rsquo;s validate again:<\/p>\n<pre tabindex=\"0\"><code>$ opm validate cool-catalog\nFATA[0000] package &#34;example-operator&#34;, bundle &#34;example-operator.v0.1.0&#34; not found in any channel entries\n<\/code><\/pre><h4 id=\"add-a-channel-entry-for-the-bundle\">Add a channel entry for the bundle<\/h4>\n<p>We rendered the bundle, but we still haven&rsquo;t yet added it to any channels.\nLet&rsquo;s initialize a channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>cat <span style=\"color:#4e9a06\">&lt;&lt; EOF &gt;&gt; cool-catalog\/operator.yaml\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">---\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">schema: olm.channel\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">package: example-operator\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">name: preview\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">entries:\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> - name: example-operator.v0.1.0\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">EOF<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>Is the third time the charm for <code>opm validate<\/code>?<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ opm validate cool-catalog\n<\/span><\/span><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">echo<\/span> <span style=\"color:#000\">$?<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#0000cf;font-weight:bold\">0<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>Success! There were no errors and we got a <code>0<\/code> error code.<\/p>\n<h4 id=\"structured-validation-output-for-automation\">Structured Validation Output for Automation<\/h4>\n<p>For CI\/CD pipelines and automation tools, <code>opm validate<\/code> supports structured JSON and YAML output via the <code>-o\/--output<\/code> flag:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ opm validate cool-catalog -o json\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ce5c00;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#4e9a06\">&#34;passed&#34;<\/span>: <span style=\"color:#204a87\">true<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ce5c00;font-weight:bold\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>When validation fails, the structured output includes error details:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ opm validate cool-catalog -o yaml\n<\/span><\/span><span style=\"display:flex;\"><span>error:\n<\/span><\/span><span style=\"display:flex;\"><span> message: <span style=\"color:#4e9a06\">&#39;invalid package &#34;example-operator&#34;: invalid channel &#34;preview&#34;: channel must contain at least one bundle&#39;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>passed: <span style=\"color:#204a87\">false<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>The exit code remains 0 for success and 1 for failure, regardless of output format. This makes it easy to integrate with tools like <code>jq<\/code> for processing:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Extract validation status in CI pipeline<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87;font-weight:bold\">if<\/span> opm validate cool-catalog -o json <span style=\"color:#000;font-weight:bold\">|<\/span> jq -e <span style=\"color:#4e9a06\">&#39;.passed&#39;<\/span><span style=\"color:#000;font-weight:bold\">;<\/span> <span style=\"color:#204a87;font-weight:bold\">then<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87\">echo<\/span> <span style=\"color:#4e9a06\">&#34;Catalog is valid, proceeding with build&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">else<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87\">echo<\/span> <span style=\"color:#4e9a06\">&#34;Catalog validation failed&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87\">exit<\/span> <span style=\"color:#0000cf;font-weight:bold\">1<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">fi<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h4 id=\"raw-file-based-catalogs-summary\">Raw File-Based Catalogs Summary<\/h4>\n<p>In the general case, adding a bundle involves three discrete steps:<\/p>\n<ul>\n<li>Render the bundle into the catalog using <code>opm render &lt;bundleImage&gt;<\/code>.<\/li>\n<li>Add the bundle into desired channels and update the channels&rsquo; upgrade edges\nto stitch the bundle into the correct place.<\/li>\n<li>Validate the resulting catalog.<\/li>\n<\/ul>\n<blockquote>\n<p>NOTE: catalog metadata should be stored in a version control system (e.g. <code>git<\/code>) and catalog images should be rebuilt from source\nwhenever updates are made to ensure that all changes to the catalog are auditable. Here is an example of catalog metadata being stored\nin github: <a href=\"https:\/\/github.com\/operator-framework\/cool-catalog\">https:\/\/github.com\/operator-framework\/cool-catalog<\/a>, with the catalog image being rebuilt whenever there is a change:\n<a href=\"https:\/\/github.com\/operator-framework\/cool-catalog\/blob\/main\/.github\/workflows\/build-push.yml\">https:\/\/github.com\/operator-framework\/cool-catalog\/blob\/main\/.github\/workflows\/build-push.yml<\/a>.<\/p>\n<\/blockquote>\n<p><strong>Step 1<\/strong> is just a simple <code>opm render<\/code> command.<\/p>\n<p><strong>Step 2<\/strong> has no defined standards other than that the result must pass validation in step 3. Some operator authors may\ndecide to hand edit channels and upgrade edges. Others may decide to implement automation (e.g. to idempotently\nbuild semver-based channels and upgrade graphs based solely on the versions of the operators in the package). There is\nno right or wrong answer for implementing this step as long as <code>opm validate<\/code> is successful.<\/p>\n<p>There are some guidelines to keep in mind though:<\/p>\n<ul>\n<li>Once a bundle is present in a Catalog, you should assume that one of your users has installed it. With that in mind,\nyou should take care to avoid stranding users that have that version installed. Put another way, make sure that\nall previously published bundles in a catalog have a path to the current\/new channel head.<\/li>\n<li>Keep the semantics of the upgrade edges you use in mind. <code>opm validate<\/code> is not able to tell you if you have a sane\nupgrade graph. To learn more about the upgrade graph of an operator, checkout the\n<a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\">creating an upgrade graph doc<\/a>.<\/li>\n<\/ul>\n<h3 id=\"build-and-push-the-catalog-image\">Build and push the catalog image<\/h3>\n<p>The last step is building and pushing the catalog image. For either approach, this is the same:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>$ docker build . <span style=\"color:#4e9a06\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"><\/span> -f cool-catalog.Dockerfile <span style=\"color:#4e9a06\">\\\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"><\/span> -t quay.io\/example-inc\/cool-catalog:latest\n<\/span><\/span><span style=\"display:flex;\"><span>$ docker push quay.io\/example-inc\/cool-catalog:latest\n<\/span><\/span><\/code><\/pre><\/div><p>Now the catalog image is available for clusters to use and reference with <code>CatalogSources<\/code> on their cluster.<\/p>"},{"title":"Docs: Shipping an operator that supports Multiple Architectures","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/ship-operator-supporting-multiarch\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/ship-operator-supporting-multiarch\/","description":"\n<p>An operator&rsquo;s target OS and architecture can be specified by labelling its respective <code>ClusterServiceVersion<\/code>.<\/p>\n<h2 id=\"supported-labels\">Supported Labels<\/h2>\n<p>The following label convention defines the target OSes and architectures supported by an operator:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">labels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operatorframework.io\/arch.&lt;GOARCH&gt;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">supported<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operatorframework.io\/os.&lt;GOOS&gt;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">supported<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Where <code>&lt;GOARCH&gt;<\/code> and <code>&lt;GOOS&gt;<\/code> are one of the values <a href=\"https:\/\/github.com\/golang\/go\/blob\/master\/src\/internal\/syslist\/syslist.go\">listed here<\/a>.<\/p>\n<h2 id=\"multiple-architectures\">Multiple Architectures<\/h2>\n<p>Some operators may support multiple node architectures or OSes. In this case, multiple labels can be added. For example, an operator that support both windows and linux workloads will sport the following labels:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">labels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operatorframework.io\/os.windows<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">supported<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operatorframework.io\/os.linux<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">supported<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"defaults\">Defaults<\/h2>\n<p>If a ClusterServiceVersion does not include an <code>os<\/code> label, a target OS is assumed to be <code>linux<\/code>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">labels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operatorframework.io\/os.linux<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">supported<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>If a ClusterServiceVersion does not include an <code>arch<\/code> label, a target architecture is assumed to be <code>amd64<\/code>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">labels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operatorframework.io\/arch.amd64<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">supported<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"filtering-available-operators-by-os-or-arch\">Filtering available operators by os or arch<\/h2>\n<p>Only windows:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>kubectl get packagemanifests -l operatorframework.io\/os.windows<span style=\"color:#ce5c00;font-weight:bold\">=<\/span>supported\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"caveats\">Caveats<\/h2>\n<p>Only the labels on the <a href=\"https:\/\/olm.operatorframework.io\/docs\/glossary\/#channel-head\">HEAD of the default channel<\/a> are considered for filtering PackageManifests by label.<\/p>\n<p>This means, for example, that providing an alternate architecture for an operator in the non-default channel is possible, but will not be available for filtering in the PackageManifest API.<\/p>"},{"title":"Docs: Overriding Operator Pod Affinity Configuration","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/overriding-operator-pod-affinity-configuration\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/overriding-operator-pod-affinity-configuration\/","description":"\n<h2 id=\"overriding-operator-pod-affinity-configuration\">Overriding Operator Pod Affinity Configuration<\/h2>\n<p>Pods can be configured to be scheduled in particular nodes using <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/assign-pod-node\/#affinity-and-anti-affinity\">affinity and anti-affinity<\/a> constraints. Namely, <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/assign-pod-node\/#node-affinity\">node affinity<\/a>, and <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/scheduling-eviction\/assign-pod-node\/#inter-pod-affinity-and-anti-affinity\">pod affinity and anti-affinity<\/a>. These constraints can enable users to have high-grained control over where pods are scheduled in the cluster, e.g. to schedule them on nodes running with cheaper architectures, such as arm64, or to improve service resilience by ensuring pod replicas are never scheduled on the same node. In OLM, the <code>Subscription<\/code> API can be used to override operator pod&rsquo;s affinity configuration, thus giving users the ability to override or define their own affinity settings for operator deployments.<\/p>\n<p>The affinity settings for an operator deployment pod defined by the operator author can be overriden in <code>Subscription.config.affinity<\/code>, i.e.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operator-registries<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">config<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">affinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">nodeAffinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">podAffinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">podAntiAffinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"example-overridingdefining-node-affinity\">Example: Overriding\/Defining Node Affinity<\/h3>\n<p>The operator <code>nodeAffinity<\/code> configuration can be overriden in the following way:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operator-registries<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">config<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">affinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">nodeAffinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">requiredDuringSchedulingIgnoredDuringExecution<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">nodeSelectorTerms<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">matchExpressions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">key<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">kubernetes.io\/arch<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">operator<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">In<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">values<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">amd64<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Note that this will completely override the <code>nodeAffinity<\/code> configuration defined in the operator deployment pod spec defined by the author.<\/p>\n<h3 id=\"example-removing-operator-author-defined-affinity\">Example: Removing Operator Author defined Affinity<\/h3>\n<p>The empty object <code>{}<\/code> can be used to remove any affinity definition already defined in the operator deployment pod spec, e.g.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operator-registries<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">config<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">affinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>{}<span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>If equivalent to no affinity configuration. And,<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operator-registries<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">config<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">affinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">podAffinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>{}<span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">podAntiAffinity<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>{}<span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Is equivalent to keeping the original <code>nodeAffinity<\/code>, while removing the original <code>podAffinity<\/code> and <code>podAnitAffinity<\/code> configurations.<\/p>"},{"title":"Docs: File-based Catalogs","link":"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\/","pubDate":"Tue, 18 Jan 2022 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\/","description":"\n<p>File-based catalogs are the latest iteration of OLM&rsquo;s catalog format. It is a fully plaintext-based (JSON or YAML)\nevolution of the previous sqlite database format that is fully backwards compatible.<\/p>\n<h2 id=\"design\">Design<\/h2>\n<p>The primary design goal for this format is to enable catalog editing, composability, and extensibility.<\/p>\n<h3 id=\"editing\">Editing<\/h3>\n<p>With file-based catalogs, users interacting with the contents of a catalog are able to make direct changes to the catalog\nformat and verify that their changes are valid.<\/p>\n<p>Because this format is plaintext JSON or YAML, catalog maintainers can easily manipulate catalog metadata by hand or with\nwidely known and supported JSON or YAML tooling (e.g. <code>jq<\/code>).<\/p>\n<p>This editability enables features and user-defined extensions, such as:<\/p>\n<ul>\n<li>Promoting an existing bundle to a new channel<\/li>\n<li>Changing the default channel of a package<\/li>\n<li>Custom algorithms for adding, updating, adding removing upgrade edges<\/li>\n<\/ul>\n<h3 id=\"composability\">Composability<\/h3>\n<p>File-based catalogs are stored in an arbitrary directory hierarchy, which enables catalog composition. If I have two\nseparate file-based catalog directories, <code>CatalogA<\/code> and <code>CatalogB<\/code>, I can make a new combined catalog by making a new\ndirectory <code>CatalogC<\/code> and copying <code>CatalogA<\/code> and <code>CatalogB<\/code> into it.<\/p>\n<p>This composability enables decentralized catalogs. The format permits operator authors to maintain operator-specific\ncatalogs and catalog maintainers to trivially build a catalog composed of individual operator-specific catalogs.<\/p>\n<blockquote>\n<p>NOTE: Duplicate packages and duplicate bundles within a package are not permitted. The <code>opm validate<\/code> command will\nreturn an error if any duplicates are found.<\/p>\n<\/blockquote>\n<p>Since operator authors are most familiar with their operator, its dependencies, and its upgrade compatibility, they are\nable to maintain their own operator-specific catalog and have direct control over its contents. With file-based catalogs,\noperator authors own the task of building and maintaining their packages in a catalog. Composite catalog maintainers treat\npackages as a black box; they own the task of curating the packages in their catalog and publishing the catalog to\nusers.<\/p>\n<p>File-based catalogs can be composed by combining multiple other catalogs or by extracting subsets of one catalog, or a\ncombination of both of these.<\/p>\n<p>See the <a href=\"#building-a-composite-catalog\">Building a composite catalog<\/a> section for a simple example.<\/p>\n<h3 id=\"extensibility\">Extensibility<\/h3>\n<p>The final design goal is to provide extensibility around catalogs. The file-based catalog spec is a low-level\nrepresentation of a catalog. While it can be maintained directly in its low-level form, we expect many catalog maintainers\nto build interesting extensions on top that can be used by their own custom tooling to make all sorts of mutations. For\nexample, one could imagine a tool that translates a high-level API like (mode=semver) down to the low-level file-based\ncatalog format for upgrade edges. Or perhaps a catalog maintainer needs to customize all of the bundle metadata by adding\na new property to bundles that meet a certain criteria.<\/p>\n<p>The OLM developer community will be making use of this extensibility to build more official tooling on top of the\nlow-level APIs, but the major benefit is that catalog maintainers have this capability as well.<\/p>\n<h2 id=\"specification\">Specification<\/h2>\n<h3 id=\"structure\">Structure<\/h3>\n<p>File-based catalogs can be stored and loaded from directory-based filesystems.<\/p>\n<p><code>opm<\/code> loads the catalog by walking the root directory and recursing into subdirectories. It attempts to load every file\nit finds and fails if any errors occur.<\/p>\n<p>Non-catalog files can be ignored using <code>.indexignore<\/code> files, which behave identically to <code>.gitignore<\/code> files. That is,\nthey have the same rules for <a href=\"https:\/\/git-scm.com\/docs\/gitignore#_pattern_format\">patterns<\/a> and precedence.<\/p>\n<blockquote>\n<p><strong>Example <code>.gitignore<\/code> file<\/strong><\/p>\n<pre tabindex=\"0\"><code class=\"language-gitignore\" data-lang=\"gitignore\"># Ignore everything except non-object .json and .yaml files\n**\/*\n!*.json\n!*.yaml\n**\/objects\/*.json\n**\/objects\/*.yaml\n<\/code><\/pre><\/blockquote>\n<p>Catalog maintainers have the flexibility to chose their desired layout, but the OLM team recommends storing each package&rsquo;s\nfile-based catalog blobs in separate sub-directories. Each individual file can be either JSON or YAML &ndash; it is not\nnecessary for every file in a catalog to use the same format.<\/p>\n<p>This layout has the property that each sub-directory in the directory hierarchy is a self-contained catalog, which makes\ncatalog composition, discovery, and navigation as simple as trivial filesystem operations.<\/p>\n<blockquote>\n<p><strong>Basic recommended structure<\/strong><\/p>\n<pre tabindex=\"0\"><code>catalog\n\u251c\u2500\u2500 pkgA\n\u2502 \u2514\u2500\u2500 operator.yaml\n\u251c\u2500\u2500 pkgB\n\u2502 \u251c\u2500\u2500 .indexignore # to ignore README.md\n\u2502 \u251c\u2500\u2500 operator.yaml\n\u2502 \u2514\u2500\u2500 README.md\n\u2514\u2500\u2500 pkgC\n\u2502 \u251c\u2500\u2500 package.json\n\u2502 \u251c\u2500\u2500 channels.yaml\n\u2514\u2500\u2500 bundles.json\n<\/code><\/pre><\/blockquote>\n<p>This catalog could also be trivially included in a parent catalog by simply copying it into the parent catalog&rsquo;s root\ndirectory.<\/p>\n<h3 id=\"schema\">Schema<\/h3>\n<p>At its core, file-based catalogs use a simple format that can be extended with arbitrary schemas. The format that all\nfile-based catalog blobs must adhere to is the <code>Meta<\/code> schema, which consists of <code>schema<\/code>, <code>package<\/code>, <code>name<\/code>, and\n<code>properties<\/code> fields. The <code>schema<\/code> field is required. The <code>package<\/code>, <code>name<\/code>, and <code>properties<\/code> fields are optional, but if\nthey are present, they must adhere to their respective field schemas. Any other field is allowed and is specified by the schema.<\/p>\n<p>The combination of the <code>schema<\/code>, <code>package<\/code>, and <code>name<\/code> fields must be unique within a catalog.<\/p>\n<p>See the <a href=\"#properties\">Properties<\/a> section for information about the <code>properties<\/code> field.<\/p>\n<p>Here is an example of an object which adheres to the <code>Meta<\/code> schema:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\">### Core Meta fields<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># The schema for this object (required)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;example.com.my.object&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># The package this object belongs to, if applicable (optional)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># The name of this object, if applicable (optional)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">bar<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># The properties associated with this object, if applicable (optional)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my.string<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;my value&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my.map<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">key1<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">value1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">key2<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">hello<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">world<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">key3<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">harry<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">sally<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my.list<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">item1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">item2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># (schema: &#34;my.other.object&#34;)-defined, non-meta fields<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">myCustomMap<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">whiz<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">bang<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">myCustomList<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">alice<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">bob<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>When this blob is parsed as a <code>Meta<\/code> object, the core fields are parsed to their respective types. Non-meta fields\nare not parsed. However, the parsed <code>Meta<\/code> object contains the full JSON representation of the blob, which enables\ncallers to parse the object using a more specific type that maps to the &ldquo;my.other.object&rdquo; schema.<\/p>\n<h3 id=\"olm-defined-schemas\">OLM-defined schemas<\/h3>\n<p>An OLM catalog currently uses the following schemas:<\/p>\n<ul>\n<li><code>olm.package<\/code>, <code>olm.channel<\/code>, and <code>olm.bundle<\/code>, which correspond to OLM&rsquo;s existing package, channel, and bundle concepts,<\/li>\n<li><code>olm.deprecations<\/code>, which provides information for support and upgrades.<\/li>\n<\/ul>\n<p>Each operator package in a catalog requires exactly one <code>olm.package<\/code> blob, at least one <code>olm.channel<\/code> blob, and one or\nmore <code>olm.bundle<\/code> blobs.<\/p>\n<blockquote>\n<p><strong>NOTE<\/strong>: All <code>olm.*<\/code> schemas are reserved for OLM-defined schemas. Custom schemas must use a unique prefix (e.g. a\ndomain that you own).<\/p>\n<\/blockquote>\n<h4 id=\"olmpackage\"><code>olm.package<\/code><\/h4>\n<p>An <code>olm.package<\/code> defines package-level (i.e. top level) metadata for an operator. This includes its name, description, default channel\nand icon.<\/p>\n<p>Here is an example of an <code>olm.package<\/code> blob:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Description is markdown-formatted text that describes the operator.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># It may contain overviews, installation instructions, links, migration<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># guides, etc. It is meant for a human audience.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">description<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000;font-weight:bold\">|-<\/span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> foo-operator is a Kubernetes operator to deploy and manage Foo resources for a Kubernetes cluster.\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> ## Overview\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> Foo is a service that orchestrates Bar and Baz to provide a simple integrated experience.\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> The goal of the **foo-operator** is to make it easy to orchestrate complex tasks that underpin the Foo\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> service, including Bar and Baz upgrades, migrations, and optimizations.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># DefaultChannel is the name of the default channel for this package.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Icon defines the image that UIs can use to represent this package.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">icon<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base64data<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyMCAzMjAiPgogIDxnIGlkPSJsb2dvIiBmaWxsPSIjZmZmIj4KICAgIDxjaXJjbGUgY3g9IjE2MCIgY3k9IjE2MCIgcj0iMTAwIiBzdHJva2U9InBpbmsiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0icmVkIiAvPgogIDwvZz4KPC9zdmc+Cg==<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">mediatype<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">image\/svg+xml<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"olmchannel\"><code>olm.channel<\/code><\/h4>\n<p>An <code>olm.channel<\/code> defines a channel within a package, the bundle entries that are members\nof the channel, and the upgrade edges for those bundles.<\/p>\n<p>A bundle can be included as an entry in multiple <code>olm.channel<\/code> blobs, but it can have only one entry per channel.<\/p>\n<p>Also, it is valid for an entry&rsquo;s replaces value to reference another bundle name that cannot be found in this catalog\n(or even another catalog) as long as other channel invariants still hold (e.g. a channel cannot have multiple heads).<\/p>\n<p>Here is an example of an <code>olm.channel<\/code> blob:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#8f5902;font-style:italic\"># name is required. It is the name of an `olm.bundle` that<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># is present in the channel. <\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.3.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># replaces is optional. It is the name of the bundle that is replaced<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># by this entry. It must be present in the entry list, unless this<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># entry is a channel tail. Channel tails are allowed to have replaces<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># values that are not present in the entry list.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># skips is optional. It is a list of bundle names that are skipped by<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># this entry. The skipped bundles do not have to be present in the<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># entry list.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">foo.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># skipRange is optional. It is the semver range of bundle versions<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># that are skipped by this entry.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skipRange<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&gt;=0.2.0-0 &lt;0.3.1-0&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>For more information about defining upgrade edges, see the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\">upgrade graph reference documentation<\/a>.<\/p>\n<h4 id=\"olmbundle\"><code>olm.bundle<\/code><\/h4>\n<p>An <code>olm.bundle<\/code> defines an individually installable version of an operator within a package. It contains information\nnecessary to locate the bundle&rsquo;s contents, the related images used by the operator at runtime, and properties that\ncan be used by clients to orchestrate lifecycling behavior, build user interfaces, provide filtering mechanisms, etc.\nFor example, the &ldquo;olm.gvk&rdquo; property can be used to specify a Kubernetes group, version, and kind that this operator\nversion provides, and the &ldquo;olm.gvk.required&rdquo; property can be used to specify a GVK that this operator requires.\nComponents that understand these properties can implement dependency resolution by matching GVK providers and\nrequirers.<\/p>\n<p>See the <a href=\"#properties\">Properties<\/a> section for information about the properties understood by OLM.<\/p>\n<p>Here is an example of an <code>olm.bundle<\/code> blob:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># image defined the location of the bundle image. (required)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example-com\/foo-bundle:v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">relatedImages<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#8f5902;font-style:italic\"># name is a descriptive name for this image that helps<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># identify its purpose in the context of the operator. (optional)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># image is the location of the image. (required)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example-com\/foo-bundle:v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example-com\/foo-operator:v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example-com\/foo:v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example-com\/foo:v2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package.required<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">bar<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">versionRange<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&gt;=1.0.0 &lt;2.0.0-0&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.gvk<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">group<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.gvk.required<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">group<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Bar<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"olmdeprecations\"><code>olm.deprecations<\/code><\/h4>\n<p>Operator authors can provide information for support and upgrades by using the optional <code>olm.deprecations<\/code> schema.<\/p>\n<p>The file-based catalog (FBC) deprecation schema consists of references to packages, bundles, and channels with a custom deprecation message.<\/p>\n<p>A valid deprecation schema meets the following criteria:<\/p>\n<ul>\n<li>There must be only one schema per package<\/li>\n<li>The message must be a non-zero length<\/li>\n<li>The package must exist in the catalog<\/li>\n<\/ul>\n<p>The deprecation feature does not consider overlapping deprecation (package vs channel vs bundle).<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th><code>olm.package<\/code><\/th>\n<th><code>olm.channel<\/code><\/th>\n<th><code>olm.bundle<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Scope<\/td>\n<td>Entire Package<\/td>\n<td>Single Channel<\/td>\n<td>Single Bundle Version<\/td>\n<\/tr>\n<tr>\n<td>Requirements<\/td>\n<td><code>name<\/code> must be empty since it is inferred from the parent <code>package<\/code> field<\/td>\n<td><code>name<\/code> is mandatory<\/td>\n<td><code>name<\/code> is mandatory<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The following example demonstrates each of the deprecation entry types:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.deprecations<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">deprecation-example<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">reference<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">deprecation-example-operator.v1.68.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000;font-weight:bold\">|<\/span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> deprecation-example-operator.v1.68.0 is deprecated. Uninstall and install deprecation-example-operator.v1.72.0 for support.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">reference<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000;font-weight:bold\">|<\/span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> package deprecation-example is end of life. Please use &#39;non-deprecated-example&#39; package for support.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">reference<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000;font-weight:bold\">|<\/span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> channel alpha is no longer supported. Please switch to channel &#39;stable&#39;.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"properties\">Properties<\/h3>\n<p>Properties are arbitrary pieces of metadata that can be attached to file-based catalog schemas. The type field is a\nstring that effectively specifies the semantic and syntactic meaning of the value field. The value can be any arbitrary\nJSON\/YAML.<\/p>\n<p>OLM defines a handful of property types, again using the reserved <code>olm.*<\/code> prefix.<\/p>\n<h4 id=\"olmpackage-1\"><code>olm.package<\/code><\/h4>\n<p>An <code>olm.package<\/code> property defines the package name and version. This is a required property on bundles, and there must\nbe exactly one of these properties. The <code>packageName<\/code> must match the bundle&rsquo;s first-class <code>package<\/code> field, the\n<code>version<\/code> must be a valid <a href=\"https:\/\/semver.org\/spec\/v2.0.0.html\">semantic version<\/a>, and the package may include an optional <code>release<\/code> bundle packaging field. See the <a href=\"#bundle-release-property\">Bundle Release Property<\/a> section for additional format requirements and examples.<\/p>\n<p>The <code>olm.package<\/code> property <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#PropertyPackage: {\ntype: &#34;olm.package&#34;\nvalue: {\npackageName: string &amp; !=&#34;&#34;\nversion: string &amp; !=&#34;&#34;\nrelease?: string &amp; !=&#34;&#34; \/\/ optional release version\n}\n}\n<\/code><\/pre><h4 id=\"olmgvk\"><code>olm.gvk<\/code><\/h4>\n<p>An <code>olm.gvk<\/code> property defines the group, version, and kind (GVK) of a Kubernetes API that is provided by this bundle.\nThis property is used by OLM to resolve a bundle with this property as a dependency for other bundles that list the same\nGVK as a required API. The GVK must adhere to Kubernetes GVK validations.<\/p>\n<p>The <code>olm.gvk<\/code> property <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#PropertyGVK: {\ntype: &#34;olm.gvk&#34;\nvalue: {\ngroup: string &amp; !=&#34;&#34;\nversion: string &amp; !=&#34;&#34;\nkind: string &amp; !=&#34;&#34;\n}\n}\n<\/code><\/pre><h4 id=\"olmpackagerequired\"><code>olm.package.required<\/code><\/h4>\n<!-- TODO: deprecate in favor of '#PropertyOLMConstraint: value: package' -->\n<p>An <code>olm.package.required<\/code> property defines the package name and version range of another package that this bundle\nrequires. For every required package property a bundle lists, OLM will ensure there is an operator installed on the\ncluster for the listed package and in the required version range. The <code>versionRange<\/code> field must be a valid\n<a href=\"https:\/\/github.com\/blang\/semver\/blob\/master\/README.md#ranges\">semver range<\/a>.<\/p>\n<p>The <code>olm.package.required<\/code> property <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#PropertyPackageRequired: {\ntype: &#34;olm.package.required&#34;\nvalue: {\npackageName: string &amp; !=&#34;&#34;\nversionRange: string &amp; !=&#34;&#34;\n}\n}\n<\/code><\/pre><h4 id=\"olmgvkrequired\"><code>olm.gvk.required<\/code><\/h4>\n<!-- TODO: deprecate in favor of '#PropertyOLMConstraint: value: gvk' -->\n<p>An <code>olm.gvk.required<\/code> property defines the group, version, and kind (GVK) of a Kubernetes API that this bundle requires.\nFor every required GVK property a bundle lists, OLM will ensure there is an operator installed on the cluster that\nprovides it. The GVK must adhere to Kubernetes GVK validations.<\/p>\n<p>The <code>olm.gvk.required<\/code> property <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#PropertyGVKRequired: {\ntype: &#34;olm.gvk.required&#34;\nvalue: {\ngroup: string &amp; !=&#34;&#34;\nversion: string &amp; !=&#34;&#34;\nkind: string &amp; !=&#34;&#34;\n}\n}\n<\/code><\/pre><h4 id=\"olmcsvmetadata\"><code>olm.csv.metadata<\/code><\/h4>\n<p><code>olm.csv.metadata<\/code> properties are used to include informational metadata about a bundle. This property is optional, and\nthere can be at most one of these properties per bundle. Bundles that include this property should not include any\n<code>olm.bundle.object<\/code> properties. This property supersedes the <code>olm.bundle.object<\/code> property.<\/p>\n<blockquote>\n<p><strong>NOTE<\/strong>: Core OLM does not require a <code>olm.csv.metadata<\/code> property to be included on bundles. However, the OLM Package\nServer (used by tooling such as the kubectl operator plugin and the OpenShift console) does require these properties\nto be able to serve metadata about the packages in a catalog. In order to satisfy the needs of the package server, catalog\nmaintainers should use this property to include the CSV metadata for all bundles that are channel heads.<\/p>\n<\/blockquote>\n<p>As of <code>opm<\/code> version 1.28.0, this property is automatically generated by when migrating SQLite catalogs with <code>opm migrate<\/code>\nand when rendering SQLite catalogs and registry+v1 bundles with <code>opm render<\/code>. Catalogs containing <code>olm.csv.metadata<\/code>\nproperties must be served by <code>opm<\/code> binaries with version at least <code>1.28.0<\/code>.<\/p>\n<h4 id=\"olmconstraint\"><code>olm.constraint<\/code><\/h4>\n<p>An <a href=\"https:\/\/github.com\/operator-framework\/enhancements\/blob\/master\/enhancements\/generic-constraints.md\"><code>olm.constraint<\/code> property<\/a> defines a dependency constraint of a particular type.\nThe <code>failureMessage<\/code> field is recommended but not required to be populated so readers know why a constraint\nwas specified, and errors can contain this string. The supported types are detailed in subsections.<\/p>\n<p>The <code>olm.constraint<\/code> property <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#ConstraintValue: {\nfailureMessage?: string\n{ gvk: #GVK } |\n{ package: #Package } |\n{ cel: #Cel } |\n{ all: null | #CompoundConstraintValue } |\n{ any: null | #CompoundConstraintValue } |\n{ not: null | #CompoundConstraintValue }\n}\n#PropertyOLMConstraint: {\ntype: &#34;olm.constraint&#34;\nvalue: #ConstraintValue\n}\n<\/code><\/pre><h5 id=\"gvk\"><code>#GVK<\/code><\/h5>\n<p><code>#GVK<\/code> is identical to the old top-level constraint <code>olm.gvk.required<\/code> value. The <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#GVK: {\ngroup: string &amp; !=&#34;&#34;\nversion: string &amp; !=&#34;&#34;\nkind: string &amp; !=&#34;&#34;\n}\n<\/code><\/pre><p>Example:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#PropertyOLMConstraint &amp; {\nvalue: {\nfailureMessage: &#34;required for ...&#34;\ngvk: #GVK &amp; {\ngroup: &#34;example.com&#34;\nversion: &#34;v1&#34;\nkind: &#34;Foo&#34;\n}\n}\n}\n<\/code><\/pre><h5 id=\"package\"><code>#Package<\/code><\/h5>\n<p><code>#Package<\/code> is identical to the old top-level constraint <code>olm.package.required<\/code> value. The <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#Package: {\npackageName: string &amp; !=&#34;&#34;\nversionRange: string &amp; !=&#34;&#34;\n}\n<\/code><\/pre><p>Example:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#PropertyOLMConstraint &amp; {\nvalue: {\nfailureMessage: &#34;required for ...&#34;\npackage: #Package &amp; {\npackageName: &#34;foo&#34;\nversionRange: &#34;&gt;=1.0.0&#34;\n}\n}\n}\n<\/code><\/pre><h5 id=\"cel\"><code>#Cel<\/code><\/h5>\n<p>The <code>cel<\/code> struct is specific to <a href=\"https:\/\/github.com\/google\/cel-go\">Common Expression Language (CEL)<\/a> constraint type that supports CEL as the expression language. The <code>cel<\/code> struct has <code>rule<\/code> field which contains the CEL expression string that will be evaluated against operator properties at the runtime to determine if the operator satisfies the constraint.<\/p>\n<p>The <code>cel<\/code> constraint <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#Cel: {\nrule: string &amp; !=&#34;&#34;\n}\n<\/code><\/pre><h5 id=\"compoundconstraintvalue\"><code>#CompoundConstraintValue<\/code><\/h5>\n<p><code>#CompoundConstraintValue<\/code> is a <a href=\"https:\/\/github.com\/operator-framework\/enhancements\/blob\/master\/enhancements\/compound-bundle-constraints.md\">compound constraint<\/a> that represents either\na logical conjunction, disjunction, or negation of a constraint list, some of which are concrete\n(ex. <code>#GVK<\/code> or <code>#Cel<\/code>), others being child compound constraints.\nThese logical operations correspond to <code>#ConstraintValue<\/code> fields <code>all<\/code>, <code>any<\/code>, or <code>not<\/code>, respectively.\nThe <code>not<\/code> compound constraint should only be used with an <code>#All<\/code> or <code>#Any<\/code> value,\nsince negating without first selecting a possible set of dependencies does not make sense.<\/p>\n<p>The <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#ConstraintList: [#ConstraintValue, ...#ConstraintValue]\n#CompoundConstraintValue: {\nconstraints: #ConstraintList\n}\n<\/code><\/pre><p>Example:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#PropertyOLMConstraint &amp; {\nvalue: #ConstraintValue &amp; {\nfailureMessage: &#34;Required for Baz because...&#34;\nany: #CompoundConstraintValue &amp; {\nconstraints: #ConstraintList &amp; [\n{\nfailureMessage: &#34;Pin kind Foo&#39;s version for stable versions&#34;\nall: #CompoundConstraintValue &amp; {\nconstraints: #ConstraintList &amp; [\n{\npackage: #Package &amp; {\npackageName: &#34;foo&#34;\nversionRange: &#34;&gt;=1.0.0&#34;\n}\n},\n{\ngvk: #GVK &amp; {\ngroup: &#34;foos.example.com&#34;\nversion: &#34;v1&#34;\nkind: &#34;Foo&#34;\n}\n}\n]\n}\n},\n{\nfailureMessage: &#34;Pin kind Foo&#39;s version for pre-stable versions&#34;\nall: #CompoundConstraintValue &amp; {\nconstraints: #ConstraintList &amp; [\n{\npackage: #Package &amp; {\npackageName: &#34;foo&#34;\nversionRange: &#34;&lt;1.0.0&#34;\n}\n},\n{\ngvk: #GVK &amp; {\ngroup: &#34;foos.example.com&#34;\nversion: &#34;v1beta1&#34;\nkind: &#34;Foo&#34;\n}\n}\n]\n}\n}\n]\n}\n}\n}\n<\/code><\/pre><h4 id=\"olmbundleobject-deprecated\"><code>olm.bundle.object<\/code> (deprecated)<\/h4>\n<p><code>olm.bundle.object<\/code> properties are used to inline a bundle&rsquo;s manifests directly in the catalog.<\/p>\n<blockquote>\n<p><strong>NOTE<\/strong>: Core OLM does not require <code>olm.bundle.object<\/code> properties to be included on bundles. However, the OLM Package\nServer (used by tooling such as the kubectl operator plugin and the OpenShift console) does require these properties\nto be able to serve metadata about the packages in a catalog. In order to satisfy the needs of the package server, catalog\nmaintainers should use this property to include the CSV for all bundles that are channel heads.<\/p>\n<p>This property is <em>deprecated<\/em> because it causes major performance issues when loading and serving file-based catalogs.\nThe <code>olm.csv.metadata<\/code> property, which serves the exact same purpose, should be used instead.<\/p>\n<\/blockquote>\n<p>A bundle object property can contain inlined data using the <code>value.data<\/code> field, which must be the base64-encoded string\nof that manifest.<\/p>\n<p>The <code>olm.bundle.object<\/code> property <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">\n#PropertyBundleObject: {\ntype: &#34;olm.bundle.object&#34;\nvalue: #propertyBundleObjectData\n}\n#propertyBundleObjectData: {\ndata: string &amp; !=&#34;&#34;\n}\n<\/code><\/pre><h3 id=\"bundle-release-property\">Bundle Release Property<\/h3>\n<h4 id=\"olmpackage-with-release-version\"><code>olm.package<\/code> with Release Version<\/h4>\n<p>The <code>olm.package<\/code> property has been extended to support an optional <code>release<\/code> field that specifies the packaging version of a bundle. This allows catalog maintainers to distinguish between different builds of the same operator version.<\/p>\n<h5 id=\"use-cases-for-bundle-release\">Use Cases for Bundle Release<\/h5>\n<p>Use the <code>release<\/code> field when you need to:<\/p>\n<ol>\n<li>\n<p><strong>Republish a bundle with documentation fixes<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Original bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># (no release)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Updated bundle with fixed description<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v0.3.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><\/li>\n<li>\n<p><strong>Create environment-specific builds<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Production build<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v0.3.0-prod<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;prod&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Staging build<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v0.3.0-staging<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;staging&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><\/li>\n<li>\n<p><strong>Version catalog packaging changes<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># First packaging iteration<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v0.3.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Second iteration with label updates<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v0.3.0-2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;2&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><\/li>\n<\/ol>\n<h4 id=\"required-bundle-naming-with-release\">Required Bundle Naming with Release<\/h4>\n<p>When the <code>release<\/code> field is present in the <code>olm.package<\/code> property, the bundle name <strong>must<\/strong> follow this convention:<\/p>\n<pre tabindex=\"0\"><code>&lt;package-name&gt;-v&lt;version&gt;-&lt;release&gt;\n<\/code><\/pre><p><code>opm validate<\/code> will fail if the bundle name doesn&rsquo;t match this normalized format.<\/p>\n<p><strong>Valid Examples:<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Release is a number<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v0.3.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Release is alphanumeric<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v0.3.0-alpha.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;alpha.1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><strong>Invalid Example:<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># \u274c INVALID - name uses dots instead of hyphens<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.3.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"release-format-constraints\">Release Format Constraints<\/h4>\n<p>The <code>release<\/code> field:<\/p>\n<ul>\n<li>Must conform to semver prerelease format (alphanumerics and hyphens, dot-separated)<\/li>\n<li><strong>Cannot contain build metadata<\/strong> (no <code>+<\/code> character)<\/li>\n<li>Has a maximum length of 20 characters<\/li>\n<\/ul>\n<p><strong>Invalid release values:<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># \u274c INVALID - contains build metadata<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1+fffdb0e&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># \u274c INVALID - contains invalid characters<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1_beta&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"example-bundle-with-release\">Example Bundle with Release<\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name: foo-v0.3.0-1 # Note<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">name includes release in format &lt;pkg&gt;-v&lt;version&gt;-&lt;release&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example-com\/foo-bundle:v0.3.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Optional packaging version<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.gvk<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">group<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"composite-version-ordering\">Composite Version Ordering<\/h4>\n<p>Bundles are compared using a <strong>composite version<\/strong> that combines the <code>version<\/code> and <code>release<\/code>:<\/p>\n<div class=\"mermaid\">flowchart LR\nA[Bundle A] --> AV[version: 0.3.0<br\/>release: 1]\nB[Bundle B] --> BV[version: 0.3.0<br\/>release: 2]\nAV --> C{Compare Versions}\nBV --> C\nC -->|Equal| D{Both have<br\/>release?}\nC -->|Not Equal| E[Order by version]\nD -->|Yes| F[Order by release]\nD -->|No| G{Which has<br\/>release?}\nG -->|A| H[B &lt; A]\nG -->|B| I[A &lt; B]\nF --> J[Bundle A &lt; Bundle B<br\/>1 &lt; 2]\nstyle C fill:#e1f5ff\nstyle D fill:#e1f5ff\nstyle G fill:#e1f5ff\nstyle F fill:#c3e6cb\nstyle E fill:#c3e6cb\nstyle H fill:#c3e6cb\nstyle I fill:#c3e6cb\nstyle J fill:#c3e6cb\n<\/div>\n<p><strong>Ordering rules:<\/strong><\/p>\n<ol>\n<li>Compare by version first (using semver comparison)<\/li>\n<li>If versions are equal:\n<ul>\n<li>Bundles <strong>with<\/strong> a release are <strong>greater than<\/strong> bundles <strong>without<\/strong> a release<\/li>\n<li>Bundles both having releases are ordered by their release version (using semver prerelease comparison)<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><strong>Example ascending order sequence:<\/strong><\/p>\n<pre tabindex=\"0\"><code>foo.v0.2.0 # v0.2.0, no release\nfoo.v0.3.0 # v0.3.0, no release\nfoo-v0.3.0-1 # v0.3.0, release &#34;1&#34; is greater than no release\nfoo-v0.3.0-2 # v0.3.0, release &#34;2&#34; is greater than release &#34;1&#34;\nfoo-v0.3.0-alpha # v0.3.0, release &#34;alpha&#34; is greater than release &#34;2&#34;\nfoo-v0.3.0-beta.1 # v0.3.0, release &#34;beta.1&#34; is greater than release &#34;alpha&#34;\nfoo.v0.4.0 # v0.4.0, no release\n<\/code><\/pre><h4 id=\"compatibility\">Compatibility<\/h4>\n<p>Catalogs produced with tooling that comprehends the release version can be consumed by tooling that does not support release versioning without impact, and vice-versa.\nDue to the Meta <a href=\"#schema\">schema<\/a> FBC composition combined with a general practice of allowing unknown fields when unmarshalling, FBC processing is relatively forgiving on receipt and strict on construction.\nThe release field is not perceived by older tooling, and the absence of this field in content created by older tooling is interpreted as intentional by newer tooling.<\/p>\n<h2 id=\"cli\">CLI<\/h2>\n<!--\nTODO(joelanford): We should auto-generate this from cobra CLI doc tooling.\n-->\n<h3 id=\"opm-init\"><code>opm init<\/code><\/h3>\n<pre tabindex=\"0\"><code>Generate an olm.package declarative config blob\nUsage:\nopm init &lt;packageName&gt; [flags]\nFlags:\n-c, --default-channel string The channel that subscriptions will default to if unspecified\n-d, --description string Path to the operator&#39;s README.md (or other documentation)\n-h, --help help for init\n-i, --icon string Path to package&#39;s icon\n-o, --output string Output format (json|yaml) (default &#34;json&#34;)\nGlobal Flags:\n--skip-tls skip TLS certificate verification for container image registries while pulling bundles or index\n<\/code><\/pre><h3 id=\"opm-render\"><code>opm render<\/code><\/h3>\n<pre tabindex=\"0\"><code>Generate a declarative config blob from the provided index images, bundle images, and sqlite database files\nUsage:\nopm render [index-image | bundle-image | sqlite-file]... [flags]\nFlags:\n-h, --help help for render\n-o, --output string Output format (json|yaml) (default &#34;json&#34;)\nGlobal Flags:\n--skip-tls skip TLS certificate verification for container image registries while pulling bundles or index\n<\/code><\/pre><h3 id=\"opm-validate\"><code>opm validate<\/code><\/h3>\n<pre tabindex=\"0\"><code>Validate the declarative config JSON file(s) in a given directory\nUsage:\nopm validate &lt;directory&gt; [flags]\nFlags:\n-h, --help help for validate\n-o, --output string Output format for validation results (json|yaml)\nGlobal Flags:\n--skip-tls skip TLS certificate verification for container image registries while pulling bundles or index\n<\/code><\/pre><p>By default, <code>opm validate<\/code> prints human-readable errors to stderr and returns exit code 0 for valid catalogs or 1 for invalid catalogs.<\/p>\n<p>When the <code>-o\/--output<\/code> flag is specified with <code>json<\/code> or <code>yaml<\/code>, the command ALSO outputs structured validation results to stdout:<\/p>\n<p><strong>Structured output format:<\/strong><\/p>\n<ul>\n<li><code>passed<\/code> (boolean): <code>true<\/code> if validation succeeds, <code>false<\/code> otherwise<\/li>\n<li><code>error<\/code> (object, optional): Contains validation error details when <code>passed<\/code> is <code>false<\/code>\n<ul>\n<li><code>message<\/code> (string): The validation error message<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>Example - Valid catalog:<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902\">$<\/span> opm validate my-catalog -o json\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\">{\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\"> &#34;passed&#34;: true\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\">}\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\"><\/span><span style=\"color:#8f5902\">$<\/span> <span style=\"color:#204a87\">echo<\/span> <span style=\"color:#000\">$?<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\">0\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><strong>Example - Invalid catalog:<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-console\" data-lang=\"console\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902\">$<\/span> opm validate my-catalog -o yaml\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\">error:\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\"> message: &#39;invalid package &#34;example-operator&#34;: invalid channel &#34;preview&#34;: channel must contain at least one bundle&#39;\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\">passed: false\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\"><\/span><span style=\"color:#8f5902\">$<\/span> <span style=\"color:#204a87\">echo<\/span> <span style=\"color:#000\">$?<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-style:italic\">1\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The structured output format is useful for:<\/p>\n<ul>\n<li>CI\/CD pipelines that need to parse validation results programmatically<\/li>\n<li>Automation tools that track validation status over time<\/li>\n<li>IDE integrations that display inline validation errors<\/li>\n<li>Monitoring systems that aggregate catalog health metrics<\/li>\n<\/ul>\n<h3 id=\"opm-serve\"><code>opm serve<\/code><\/h3>\n<pre tabindex=\"0\"><code>This command serves declarative configs via a GRPC server.\nNOTE: The declarative config directory is loaded by the serve command at\nstartup. Changes made to the declarative config after the this command starts\nwill not be reflected in the served content.\nUsage:\nopm serve &lt;source_path&gt; [flags]\nFlags:\n--debug enable debug logging\n-h, --help help for serve\n-p, --port string port number to serve on (default &#34;50051&#34;)\n-t, --termination-log string path to a container termination log file (default &#34;\/dev\/termination-log&#34;)\nGlobal Flags:\n--skip-tls skip TLS certificate verification for container image registries while pulling bundles or index\n<\/code><\/pre><h3 id=\"opm-alpha-diff\"><code>opm alpha diff<\/code><\/h3>\n<pre tabindex=\"0\"><code>Diff a set of old and new catalog references (&#34;refs&#34;) to produce a declarative config containing only packages channels, and versions not present in the old set, and versions that differ between the old and new sets. This is known as &#34;latest&#34; mode. These references are passed through &#39;opm render&#39; to produce a single declarative config.\nThis command has special behavior when old-refs are omitted, called &#34;heads-only&#34; mode: instead of the output being that of &#39;opm render refs...&#39; (which would be the case given the preceding behavior description), only the channel heads of all channels in all packages are included in the output, and dependencies. Dependencies are assumed to be provided by either an old ref, in which case they are not included in the diff, or a new ref, in which case they are included. Dependencies provided by some catalog unknown to &#39;opm alpha diff&#39; will not cause the command to error, but an error will occur if that catalog is not serving these dependencies at runtime.\nUsage:\nopm alpha diff [old-refs]... new-refs... [flags]\nExamples:\n# Diff a catalog at some old state and latest state into a declarative config index.\nmkdir -p catalog-index\nopm alpha diff registry.org\/my-catalog:abc123 registry.org\/my-catalog:def456 -o yaml &gt; .\/my-catalog-index\/index.yaml\n# Build and push this index into an index image.\nopm generate dockerfile .\/my-catalog-index\ndocker build -t registry.org\/my-catalog:latest-abc123-def456 -f index.Dockerfile .\ndocker push registry.org\/my-catalog:latest-abc123-def456\n# Create a new catalog from the heads of an existing catalog, then build and push the image like above.\nopm alpha diff registry.org\/my-catalog:def456 -o yaml &gt; my-catalog-index\/index.yaml\ndocker build -t registry.org\/my-catalog:headsonly-def456 -f index.Dockerfile .\ndocker push registry.org\/my-catalog:headsonly-def456\nFlags:\n--ca-file string the root Certificates to use with this command\n--debug enable debug logging\n-h, --help help for diff\n-o, --output string Output format (json|yaml) (default &#34;yaml&#34;)\nGlobal Flags:\n--skip-tls skip TLS certificate verification for container image registries while pulling bundles or index\n<\/code><\/pre><h3 id=\"opm-generate-dockerfile\"><code>opm generate dockerfile<\/code><\/h3>\n<pre tabindex=\"0\"><code>Generate a Dockerfile for a declarative config index.\nThis command creates a Dockerfile in the same directory as the &lt;dcRootDir&gt;\n(named &lt;dcDirName&gt;.Dockerfile) that can be used to build the index. If a\nDockerfile with the same name already exists, this command will fail.\nWhen specifying extra labels, note that if duplicate keys exist, only the last\nvalue of each duplicate key will be added to the generated Dockerfile.\nUsage:\nopm generate dockerfile &lt;dcRootDir&gt; [flags]\nFlags:\n-i, --binary-image string Image in which to build catalog. (default &#34;quay.io\/operator-framework\/upstream-opm-builder&#34;)\n-l, --extra-labels strings Extra labels to include in the generated Dockerfile. Labels should be of the form &#39;key=value&#39;.\n-h, --help help for dockerfile\nGlobal Flags:\n--skip-tls skip TLS certificate verification for container image registries while pulling bundles or index\n<\/code><\/pre><h2 id=\"guidelines\">Guidelines<\/h2>\n<h3 id=\"immutable-bundles\">Immutable bundles<\/h3>\n<p>OLM&rsquo;s general advice is that bundle images and their metadata should be treated as immutable. If a broken bundle has\nbeen pushed to an index, you must assume that at least one of your users has upgraded to that bundle. Based on that\nassumption, you must release another bundle with an upgrade edge from the broken bundle to ensure users with the broken\nbundle installed receive an upgrade. OLM will not reinstall an installed bundle if the contents of that bundle are\nupdated in the index.<\/p>\n<p>However, there are some cases where a change in the index metadata is preferred. For example:<\/p>\n<ul>\n<li>Channel promotion - if you already released a bundle and later decide that you&rsquo;d like to add it to another channel,\nsimply add an entry for your bundle in another <code>olm.channel<\/code> blob.<\/li>\n<li>New upgrade edges - if you release a new 1.2.z (e.g. 1.2.4), but 1.3.0 is already released, you can update the index\nmetadata for 1.3.0 to skip 1.2.4.<\/li>\n<\/ul>\n<h3 id=\"use-of-source-control\">Use of source control<\/h3>\n<p>OLM highly recommends storing index metadata in source control and treating the source-controlled metadata as the source\nof truth. Updates to index images should:<\/p>\n<ul>\n<li>Update the source-controlled index directory with a new commit.<\/li>\n<li>Build and push the index image. OLM suggests using a consistent tagging taxonomy (e.g. <code>:latest<\/code> or\n<code>:&lt;targetClusterVersion&gt;<\/code> so that users can receive updates to an index as they become available.<\/li>\n<\/ul>\n<!--\nTODO(joelanford): Add a link to an file-based catalog repository when one exists in the future.\n-->\n<h2 id=\"examples\">Examples<\/h2>\n<h3 id=\"building-a-composite-catalog\">Building a composite catalog<\/h3>\n<p>With file-based catalogs, catalog maintainers can focus on operator curation and compatibility.\nSince operator authors have already produced operator-specific catalogs for their operators, catalog\nmaintainers can build their catalog simply by rendering each operator catalog into a subdirectory of the\ncatalog&rsquo;s root catalog directory.<\/p>\n<p>There are many possible ways to build a catalog, but an extremely simple approach would be to:<\/p>\n<ul>\n<li>\n<p>Maintain a single configuration file containing image references for each operator in the catalog<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">community-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">repo<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/community-operators\/catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">tag<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">latest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">references<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">etcd-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/etcd-operator\/catalog@sha256:5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">prometheus-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/prometheus-operator\/catalog@sha256:e258d248fda94c63753607f7c4494ee0fcbe92f1a76bfdac795c9d84101eb317<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><\/li>\n<li>\n<p>Run a simple script that parses this file and creates a new catalog from its references<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span><span style=\"color:#000\">name<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#204a87;font-weight:bold\">$(<\/span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;.name&#39;<\/span> catalog.yaml<span style=\"color:#204a87;font-weight:bold\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>mkdir <span style=\"color:#4e9a06\">&#34;<\/span><span style=\"color:#000\">$name<\/span><span style=\"color:#4e9a06\">&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;.name + &#34;\/&#34; + .references[].name&#39;<\/span> catalog.yaml <span style=\"color:#000;font-weight:bold\">|<\/span> xargs mkdir\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">for<\/span> l in <span style=\"color:#204a87;font-weight:bold\">$(<\/span>yq e <span style=\"color:#4e9a06\">&#39;.name as $catalog | .references[] | .image + &#34;|&#34; + $catalog + &#34;\/&#34; + .name + &#34;\/index.yaml&#34;&#39;<\/span> catalog.yaml<span style=\"color:#204a87;font-weight:bold\">)<\/span><span style=\"color:#000;font-weight:bold\">;<\/span> <span style=\"color:#204a87;font-weight:bold\">do<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">image<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#204a87;font-weight:bold\">$(<\/span><span style=\"color:#204a87\">echo<\/span> <span style=\"color:#000\">$l<\/span> <span style=\"color:#000;font-weight:bold\">|<\/span> cut -d<span style=\"color:#4e9a06\">&#39;|&#39;<\/span> -f1<span style=\"color:#204a87;font-weight:bold\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">file<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#204a87;font-weight:bold\">$(<\/span><span style=\"color:#204a87\">echo<\/span> <span style=\"color:#000\">$l<\/span> <span style=\"color:#000;font-weight:bold\">|<\/span> cut -d<span style=\"color:#4e9a06\">&#39;|&#39;<\/span> -f2<span style=\"color:#204a87;font-weight:bold\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> opm render <span style=\"color:#4e9a06\">&#34;<\/span><span style=\"color:#000\">$image<\/span><span style=\"color:#4e9a06\">&#34;<\/span> &gt; <span style=\"color:#4e9a06\">&#34;<\/span><span style=\"color:#000\">$file<\/span><span style=\"color:#4e9a06\">&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">done<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>opm generate dockerfile <span style=\"color:#4e9a06\">&#34;<\/span><span style=\"color:#000\">$name<\/span><span style=\"color:#4e9a06\">&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000\">indexImage<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#204a87;font-weight:bold\">$(<\/span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;.repo + &#34;:&#34; + .tag&#39;<\/span> catalog.yaml<span style=\"color:#204a87;font-weight:bold\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>docker build -t <span style=\"color:#4e9a06\">&#34;<\/span><span style=\"color:#000\">$indexImage<\/span><span style=\"color:#4e9a06\">&#34;<\/span> -f <span style=\"color:#4e9a06\">&#34;<\/span><span style=\"color:#000\">$name<\/span><span style=\"color:#4e9a06\">.Dockerfile&#34;<\/span> .\n<\/span><\/span><span style=\"display:flex;\"><span>docker push <span style=\"color:#4e9a06\">&#34;<\/span><span style=\"color:#000\">$indexImage<\/span><span style=\"color:#4e9a06\">&#34;<\/span>\n<\/span><\/span><\/code><\/pre><\/div><\/li>\n<\/ul>\n<blockquote>\n<p>Note: The <code>yq<\/code> binary used in the script can be found <a href=\"https:\/\/github.com\/mikefarah\/yq\">here<\/a><\/p>\n<\/blockquote>\n<h2 id=\"automation\">Automation<\/h2>\n<p>Operator authors and catalog maintainers are encouraged to automate their catalog maintenance with CI\/CD workflows.\nCatalog maintainers could further improve on this by building Git-ops automation that:<\/p>\n<ul>\n<li>Checks that PR authors are permitted to make the requested changes (e.g. updating their package&rsquo;s image reference)<\/li>\n<li>Checks that the catalog updates pass <code>opm validate<\/code><\/li>\n<li>Checks that the updated bundle and\/or catalog image reference(s) exist, the catalog images run successfully in a cluster,\nand operators from that package can be successfully installed.<\/li>\n<li>Automatically merges PRs that pass these checks.<\/li>\n<li>Automatically rebuilds and republishes the catalog image.<\/li>\n<\/ul>\n<h3 id=\"validation-in-cicd-pipelines\">Validation in CI\/CD Pipelines<\/h3>\n<p>The <code>-o\/--output<\/code> flag enables programmatic validation checking in automated workflows. Here&rsquo;s an example GitHub Actions workflow snippet:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Validate catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">id<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">validate<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">run<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000;font-weight:bold\">|<\/span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> opm validate .\/catalog -o json &gt; validation-result.json\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> echo &#34;passed=$(jq -r &#39;.passed&#39; validation-result.json)&#34; &gt;&gt; $GITHUB_OUTPUT<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Comment on PR<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">if<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">steps.validate.outputs.passed == &#39;false&#39;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">uses<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">actions\/github-script@v6<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">with<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">script<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000;font-weight:bold\">|<\/span><span style=\"color:#8f5902;font-style:italic\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> const result = require(&#39;.\/validation-result.json&#39;);\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> github.rest.issues.createComment({\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> issue_number: context.issue.number,\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> owner: context.repo.owner,\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> repo: context.repo.repo,\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> body: `\u274c Catalog validation failed:\\n\\`\\`\\`\\n${result.error.message}\\n\\`\\`\\``\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"> });<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>This approach allows automation to:<\/p>\n<ul>\n<li>Parse validation results programmatically<\/li>\n<li>Generate detailed reports from error messages<\/li>\n<li>Track validation metrics over time<\/li>\n<li>Integrate with issue trackers and notification systems<\/li>\n<\/ul>\n<p>An example catalog that automates a lot of these workflows can be found at <a href=\"https:\/\/github.com\/operator-framework\/cool-catalog\">https:\/\/github.com\/operator-framework\/cool-catalog<\/a><\/p>"},{"title":"Docs: Make a Catalog available on Cluster","link":"https:\/\/olm.operatorframework.io\/docs\/tasks\/make-catalog-available-on-cluster\/","pubDate":"Wed, 28 Apr 2021 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/tasks\/make-catalog-available-on-cluster\/","description":"\n<p>Once you have a catalog of operators, you can make it available on cluster by referencing it from a <code>CatalogSource<\/code>.<\/p>\n<p>For example, if you have a catalog image <code>quay.io\/my-namespace\/cool-catalog:latest<\/code>, you can create a CatalogSource with your image:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">CatalogSource<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">cool-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceType<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">grpc<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/my-namespace\/cool-catalog:latest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Coolest Catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">publisher<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Me<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">updateStrategy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">registryPoll<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">interval<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">10m<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"explanation-of-specupdatestrategy\">Explanation of spec.updateStrategy<\/h3>\n<p>When you create a <code>CatalogSource<\/code>, it deploys a pod that serves the content you&rsquo;ve stored in the catalog via a grpc API endpoint.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl apply -f cool-catalog.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>catalogsource.operators.coreos.com\/cool-catalog created\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl get catsrc\n<\/span><\/span><span style=\"display:flex;\"><span>NAME DISPLAY TYPE PUBLISHER AGE\n<\/span><\/span><span style=\"display:flex;\"><span>cool-catalog Coolest Catalog grpc Me 38s\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl get pods\n<\/span><\/span><span style=\"display:flex;\"><span>NAME READY STATUS RESTARTS AGE\n<\/span><\/span><span style=\"display:flex;\"><span>cool-catalog-dtqv2 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 30s\n<\/span><\/span><\/code><\/pre><\/div><p>It is possible to configure the <code>CatalogSource<\/code> to poll a source, such as an image registry, to check whether the catalog source pod should be updated. A common use case would be pushing new bundles to the same catalog source tag, and seeing updated operators from those bundles being installed in the cluster.<\/p>\n<p>For example, say currently you have Operator X v1.0 installed in the cluster from the catalog <code>quay.io\/my-namespace\/cool-catalog:main<\/code>. This is the latest version of the X operator in the catalog. When a new v2.0 of Operator X is published, the v2.0 version of the X operator can be included in the catalog using the same steps described in the <a href=\"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-a-catalog\/#creating-a-catalog\">creating catalog doc<\/a>, then the catalog image can be rebuilt and pushed to the same <code>main<\/code> tag. With catalog polling enabled, OLM will pull down the newer version of the catalog image and make the new information available.<\/p>\n<p>Each type of check for an updated catalog source is called an <code>updateStrategy<\/code>. Only one <code>updateStrategy<\/code> is supported at a time. <code>registryPoll<\/code> is a type of <code>updateStrategy<\/code> that checks an image registry for an updated version of the same tag(via image SHAs). The <code>interval<\/code> defines the amount of time between each successive poll.<\/p>\n<h4 id=\"caveats\">Caveats<\/h4>\n<ul>\n<li>The polling sequence is not instantaneous - it can take up to 15 minutes from each poll for the new catalog source pod to be deployed into the cluster. It may take longer for larger clusters.<\/li>\n<li>Because OLM pulls down the image every poll interval and starts the pod, to see if its updated, the updated catalog pod must be able to be scheduled onto the cluster. If the cluster is at absolutely maximum capacity, without autoscaling enabled, this feature may not work.<\/li>\n<li>OLM checks to see whether the container ImageID has changed between the old and new catalog source image when determining if an upgrade is in order. It does not actually parse the image content itself to check for later CSVs. If there is a bad upgrade to the catalog source image, simply overwrite the tag with another version and it will be pulled down, or delete and recreate the catalog source.<\/li>\n<li>The polling interval should be reasonably high to ensure the update functionality works as intended. Avoid intervals less than 15m.<\/li>\n<\/ul>\n<h3 id=\"using-registry-images-that-require-authentication-as-catalogbundleoperatoroperand-images\">Using registry images that require authentication as Catalog\/bundle\/operator\/operand images<\/h3>\n<p>If certain images are hosted in an authenticated container image registry, i.e a private registry, OLM is unable to pull the images by default. To enable access, you can create a pull secret that contains the authentication credentials for the registry. By referencing one or more pull secrets in a <code>CatalogSource<\/code>, OLM can handle placing the secrets in the operator and catalog namespace to allow installation.<\/p>\n<blockquote>\n<p>Note: Bundle images that require authentication to pull are handled by this method. Other images required by an Operator or its Operands might require access to private registries as well. OLM does not handle placing the secrets in target tenant namespaces for this scenario, but authentication credentials can be added to the global cluster pull secret or individual namespace service accounts to enable the required access. Alternatively, if providing access to the entire cluster is not permissible, the pull secret can be added to the <code>default<\/code> service accounts of the target tenant namespaces.<\/p>\n<\/blockquote>\n<p>To use images from private registries as Catalog\/bundle images, create a secret for each required private registry. Once you have the secrets, <code>kubectl apply<\/code> your secrets to the cluster, and the create or update an existing <code>CatalogSource<\/code> object to reference one or more secrets to add a <code>spec.secrets<\/code> section and specify all secrets.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">CatalogSource<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">cool-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceType<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">grpc<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">secrets<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#34;&lt;secret_name_1&gt;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#4e9a06\">&#34;&lt;secret_name_2&gt;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/my-namespace\/cool-catalog:latest<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">displayName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Coolest Catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">publisher<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Me<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">updateStrategy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">registryPoll<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">interval<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">10m<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>If the <code>imagePullSecret<\/code> is referenced in the bundle, for instance when the controller-manager image is pulled from a private registry, there is no place in the API to tell OLM to attach the <code>imagePullSecrets<\/code>. As a consequence, permissions to pull the image should be added directly to the operator Deployment&rsquo;s manifest by adding the required secret name to the list <code>deployment.spec.template.spec.imagePullSecrets<\/code>.<\/p>\n<p>For the <a href=\"https:\/\/sdk.operatorframework.io\/\">operator-sdk<\/a> abstraction, the operator Deployment&rsquo;s manifest is found under <code>config\/manager\/manager.yaml<\/code>. Below is an example of a controller-manager Deployment&rsquo;s manifest configured with an <code>imagePullSecret<\/code> to pull container images from a private registry.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># config\/manager\/manager.yaml<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">apps\/v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Deployment<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">controller-manager<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">system<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">imagePullSecrets<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;registry-auth-secret-name&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><blockquote>\n<p>Note: It is required for the <code>imagePullSecret<\/code> to be present in the same namespace where the controller is deployed for the controller pod to start.<\/p>\n<\/blockquote>"},{"title":"Docs: ClusterServiceVersion","link":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/clusterserviceversion\/","pubDate":"Wed, 25 Mar 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/clusterserviceversion\/","description":"\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/mikefarah\/yq\">yq<\/a><\/li>\n<\/ul>\n<h3 id=\"how-to-debug-a-failing-csv\">How to debug a failing CSV<\/h3>\n<p>If the OLM operator encounters an unrecoverable error when attempting to install the operator, the <code>CSV<\/code> will be placed in the <code>failed<\/code> phase. The OLM operator will constantly update the <code>Status<\/code> with useful information regarding the state of the <code>CSV<\/code>. You can check the <code>Status<\/code> of your <code>CSV<\/code> with the following command:<\/p>\n<p><code>$ kubectl get csv prometheusoperator.0.32.0 -n &lt;namespace&gt; -o yaml | yq e '.status' -<\/code><\/p>\n<blockquote>\n<p>Note: It is possible that the Status is missing, which suggests that the OLM operator is encountering an issue when processing the <code>CSV<\/code> in a very early stage. You should respond by reviewing the logs of the OLM operator.<\/p>\n<\/blockquote>\n<p>You should typically pay special attention to the information within the <code>status.reason<\/code> and <code>status.message<\/code> fields. Please look in the <a href=\"#failed-csv-reasons\">failed CSV reasons<\/a><\/p>\n<p>If the <code>Status<\/code> block does not provide enough information, check the <a href=\"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/olm-and-catalog-operators\/#how-to-view-the-olm-operator-logs\">OLM operator&rsquo;s logs<\/a>.<\/p>\n<h3 id=\"failed-csv-reasons\">Failed CSV Reasons<\/h3>\n<h4 id=\"reason-nooperatorgroup\">Reason: NoOperatorGroup<\/h4>\n<p>The <code>CSV<\/code> failed to install because it has been deployed in a namespace that does not include an <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorgroup\/\">OperatorGroup<\/a>.<\/p>\n<h4 id=\"reason-unsupportedoperatorgroup\">Reason: UnsupportedOperatorGroup<\/h4>\n<p>The <code>CSV<\/code> is failing to install because it does not support the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorgroup\/\">OperatorGroup<\/a> defined in the namespace.<\/p>\n<h3 id=\"failed-csv-messages\">Failed CSV Messages<\/h3>\n<h4 id=\"messages-ending-with-field-is-immutable\">Messages Ending with &ldquo;field is immutable&rdquo;<\/h4>\n<p>The <code>CSV<\/code> is failing because its install strategy changes some immutable field of an existing <code>Deployment<\/code>. This usually happens on upgrade, after an operator author publishes a new version of the operator containing such a change. In this case, the issue can be resolved by publishing a new version of the operator that uses a different <code>Deployment<\/code> name, which will cause OLM to generate a completely new <code>Deployment<\/code> instead of attempting to patch any existing one.<\/p>"},{"title":"Docs: Debugging OLM and Catalog Operator","link":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/olm-and-catalog-operators\/","pubDate":"Wed, 25 Mar 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/olm-and-catalog-operators\/","description":"\n<h3 id=\"how-to-enable-verbose-logging-on-the-olm-and-catalog-operators\">How to enable verbose logging on the OLM and Catalog operators<\/h3>\n<p>Both the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\">OLM and Catalog operators<\/a> have <code>-debug<\/code> flags available that display much more useful information when diagnosing a problem. If necessary, add this flag to their deployments and perform the action that is showing undersired behavior.<\/p>\n<h3 id=\"how-to-view-the-catalog-operator-logs\">How to view the Catalog operator logs<\/h3>\n<p>To view the Catalog Operator logs, use the following commands:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl -n olm get pods\n<\/span><\/span><span style=\"display:flex;\"><span>NAME READY STATUS RESTARTS AGE\n<\/span><\/span><span style=\"display:flex;\"><span>catalog-operator-5bdc79c56b-zbqbl 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m30s\n<\/span><\/span><span style=\"display:flex;\"><span>olm-operator-6999db5767-5r5zs 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m31s\n<\/span><\/span><span style=\"display:flex;\"><span>operatorhubio-catalog-ltdlp 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m28s\n<\/span><\/span><span style=\"display:flex;\"><span>packageserver-5c76df75bb-mq4qd 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m26s\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl -n olm logs catalog-operator-5bdc79c56b-zbqbl\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><\/code><\/pre><\/div><h3 id=\"how-to-view-the-olm-operator-logs\">How to view the OLM operator logs<\/h3>\n<p>To view the OLM Operator logs, use the following commands:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl -n olm get pods\n<\/span><\/span><span style=\"display:flex;\"><span>NAME READY STATUS RESTARTS AGE\n<\/span><\/span><span style=\"display:flex;\"><span>catalog-operator-5bdc79c56b-zbqbl 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m30s\n<\/span><\/span><span style=\"display:flex;\"><span>olm-operator-6999db5767-5r5zs 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m31s\n<\/span><\/span><span style=\"display:flex;\"><span>operatorhubio-catalog-ltdlp 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m28s\n<\/span><\/span><span style=\"display:flex;\"><span>packageserver-5c76df75bb-mq4qd 1\/1 Running <span style=\"color:#0000cf;font-weight:bold\">0<\/span> 5m26s\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl -n olm logs olm-operator-6999db5767-5r5zs\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: Operator scoping with OperatorGroups","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/operator-scoping-with-operatorgroups\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/operator-scoping-with-operatorgroups\/","description":"\n<p>OLM runs with cluster-admin privileges and is capable of granting permissions to operators that it deploys. By default, an operator can specify any set of permission(s) in the CSV and OLM will consequently grant it to the operator. In effect, an operator can achieve cluster-scoped privilege(s) which may not always be desired.<\/p>\n<p>OLM introduces the concept of <code>OperatorGroups<\/code> to enable cluster admins complete control over the permissions that OLM grants operators that it deploys.<\/p>\n<p>An admin may create a single <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorgroup\"><code>OperatorGroup<\/code><\/a> in a given namespace. Any CSV created in that namespace is said to be a member operator of that <code>OperatorGroup<\/code>. With <code>OperatorGroups<\/code>, a cluster admin can:<\/p>\n<ul>\n<li>Define the set of permissions that OLM may grant to member operators<\/li>\n<li>Define the set of namespaces that OLM may grant namespaced permissions in.<\/li>\n<\/ul>\n<h2 id=\"configuring-operatorgroups\">Configuring OperatorGroups<\/h2>\n<h3 id=\"scoping-member-operators-to-specific-namespaces\">Scoping Member Operators to Specific Namespaces<\/h3>\n<p>Using an <code>OperatorGroup<\/code>, a cluster admin can scope member operators&rsquo; namespaced permissions to specific namespaces in two ways:<\/p>\n<ul>\n<li>Using a predefined list of namespaces<\/li>\n<li>Using a label selector.<\/li>\n<\/ul>\n<h4 id=\"defining-a-set-of-namespaces\">Defining a set of namespaces<\/h4>\n<p>The set of namespaces can be hardcoded setting the <code>spec.targetNamespaces<\/code> of an <code>OperatorGroup<\/code> like so:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetNamespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">my-other-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">my-other-other-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>In the example above, member operator will be scoped to the following namespaces:<\/p>\n<ul>\n<li>my-namespace<\/li>\n<li>my-other-namespace<\/li>\n<li>my-other-other-namespace<\/li>\n<\/ul>\n<h4 id=\"defining-a-set-of-namespaces-with-a-label-selector\">Defining a set of namespaces with a label selector<\/h4>\n<p>Cluster admins may not know in advance which namespaces member operators should be scoped to. In this case, it may make sense to use a label selector to identify which namespaces permissions should be granted in. A namespace selector can be defined for an <code>OpearatorGroup<\/code> like so:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">selector<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">matchLabels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">cool.io\/prod<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;true&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>In the example above, member operators will be scoped to any namespaces with the <code>cool.io\/prod: true<\/code> label. If no namespaces exist with the <code>cool.io\/prod: true<\/code> label, OLM will fail to install any member operators.<\/p>\n<blockquote>\n<p>Note: In the case that both a selector and a list of namespaces are provided, the selector is ignored.<\/p>\n<\/blockquote>\n<h4 id=\"targetnamespaces-and-their-relationship-to-installmodes\">TargetNamespaces and their relationship to InstallModes<\/h4>\n<p>When creating <code>OperatorGroups<\/code> it is important to keep in mind that an operator may not support all namespace configurations. For example, an operator that is designed to run at the cluster level shouldn&rsquo;t be expected to work in an <code>OperatorGroup<\/code> that defines a single targetNamespace.<\/p>\n<p>Operator authors are responsible for defining which <code>InstallModes<\/code> their operator supports within its <code>ClusterServiceVersion (CSV)<\/code>. There are four <code>InstallModes<\/code> that an operator can support:<\/p>\n<ul>\n<li><strong>OwnNamespace<\/strong>: If supported, the operator can be configured to watch for events in the namespace it is deployed in.<\/li>\n<li><strong>SingleNamespace<\/strong>: If supported, the operator can be configured to watch for events in a single namespace that the operator is not deployed in.<\/li>\n<li><strong>MultiNamespace<\/strong>: If supported, the operator can be configured to watch for events in more than one namespace.<\/li>\n<li><strong>AllNamespaces<\/strong>: If supported, the operator can be configured to watch for events in all namespaces.<\/li>\n<\/ul>\n<blockquote>\n<p>Note: If a CSV&rsquo;s spec omits an entry of InstallModeType, that type is considered unsupported unless support can be inferred by an existing entry that implicitly supports it.<\/p>\n<\/blockquote>\n<p>Cluster admins cannot override which <code>InstallModes<\/code> an operator supports, and so should understand how to create an <code>OperatorGroup<\/code> that supports each <code>InstallMode<\/code>. Let&rsquo;s look at an example of an <code>OperatorGroup<\/code> implementing each type of installMode:<\/p>\n<h5 id=\"ownnamespace\">OwnNamespace<\/h5>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">own-namespace-operator-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetNamespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h5 id=\"singlenamespace\">SingleNamespace<\/h5>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">single-namespace-operator-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetNamespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">some-other-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h5 id=\"multinamespace\">MultiNamespace<\/h5>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">multi-namespace-operator-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetNamespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">some-other-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h5 id=\"allnamespaces\">AllNamespaces<\/h5>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">all-namespaces-operator-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"scoping-member-operator-permissions\">Scoping Member Operator Permissions<\/h3>\n<p>When creating an <code>OperatorGroup<\/code>, cluster admins may specify a <code>ServiceAccount<\/code> that defines the set of permissions that may be granted to all member operators. OLM will ensure that when an operator is installed its privileges are confined to that of the <code>ServiceAccount<\/code> specified.<\/p>\n<p>As a result a cluster-admin can limit an operator to a pre-defined set of RBAC rules. The Operator will not be able to do anything that is not explicitly permitted by these permissions. This enables self-sufficient installation of Operators by non-cluster-admin users with a limited scope.<\/p>\n<h4 id=\"defining-a-serviceaccount-for-an-operatorgroup\">Defining a ServiceAccount for an OperatorGroup<\/h4>\n<p>A <code>ServiceAccount<\/code> may be defined within an <code>OperatorGroup<\/code> like so:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">scoped-permissions-operator-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">serviceAccountName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">member-operator-servicee-account<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetNamespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">own-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Any operator tied to this <code>OperatorGroup<\/code> will now be confined to the permission(s) granted to the specified <code>ServiceAccount<\/code>. If the operator asks for permission(s) that are outside the scope of the <code>ServiceAccount<\/code> the install will fail with appropriate error(s).<\/p>\n<h3 id=\"configuring-the-end-user-experience\">Configuring the End User Experience<\/h3>\n<h3 id=\"making-operators-available\">Making Operators Available<\/h3>\n<p>Once a cluster admin has successfully created an <code>OperatorGroup<\/code>, he or she then has the opportunity to decide which operators should be offered as a part of that group. This is an important phase in configuring the cluster, as most users may not have the ability to install an operator into an <code>OperatorGroup<\/code>.<\/p>\n<p>A cluster admin can add an operator to an <code>OperatorGroup<\/code> by creating a <code>Subscription<\/code> in the same namespace. An operator can be added and removed from an <code>OperatorGroup<\/code> at anytime.<\/p>\n<p>Keep in mind that this process can be repeated for any number of <code>OperatorGroups<\/code>. This means that a cluster admin can decide for a set of operator to watch for events in one set of namespaces while defining a seperate set of operators that watch for events in a seperate set of namespaces.<\/p>\n<h3 id=\"enabling-a-user-to-use-an-operator\">Enabling a User to use an Operator<\/h3>\n<p>Once a cluster admin has decided which operators are available on a cluster, it is now time to decide which user(s) may take advantage of an available operator.<\/p>\n<p>Users interact with operators by creating a resource in a namespace that an operator is watching. As such, by tuning RBAC privileges a cluster admin has complete control over the set of users that may interact with an operator along with the set of APIs that user may take advantage of.<\/p>\n<p>For example, if an operator were available that offered two APIs, a cluster admin may provide a user with full RBAC privileges over one API but not grant the user any privileges with the second API.<\/p>"},{"title":"Docs: OperatorCondition","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorcondition\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorcondition\/","description":"\n<p>An <code>OperatorCondition<\/code> is CustomResourceDefinition that creates a communication between OLM and an operator it manages. Operators may write to the <code>Status.Conditions<\/code> array to modify OLM management the operator.<\/p>\n<p>Here&rsquo;s an example of an <code>OperatorCondition<\/code> CustomResource:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorCondition<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">overrides<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Upgradeable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Allows the cluster admin to change operator&#39;s Upgrade readiness to True<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;True&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">reason<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;upgradeIsSafe&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># optional<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;The cluster admin wants to make the operator eligible for an upgrade.&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># optional<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">conditions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Upgradeable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;False&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">reason<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;migration&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">message<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;The operator is performing a migration.&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">lastTransitionTime<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;2020-08-24T23:15:55Z&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: Opting into UnsafeFailForward upgrades","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/unsafe-fail-forward-upgrades\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/unsafe-fail-forward-upgrades\/","description":"\n<h2 id=\"warning\">Warning<\/h2>\n<p>This feature is not recommended in a majority of cases as enabling UnsafeFailForward upgrades no longer guarantees sane upgrade paths, possibly causing unrecoverable failures resulting in data loss. Only use this feature if you:<\/p>\n<ul>\n<li>Know every operator installed in the namespace.<\/li>\n<li>Have deep knowledge regarding the upgrade paths for each operator in the namespace.<\/li>\n<li>Have control over the contents of the catalogs providing the operators in the namespace.<\/li>\n<li>Do not want to manually upgrade your failed operators.<\/li>\n<\/ul>\n<h2 id=\"what-unsafefailforward-upgrades-add\">What &ldquo;UnsafeFailForward&rdquo; upgrades add<\/h2>\n<p>A failed installation\/upgrade is typically caused by one of two scenarios:<\/p>\n<ul>\n<li><strong>A Failed CSV:<\/strong> The <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/clusterserviceversion\/\">CSV<\/a> is in the FAILED phase.<\/li>\n<li><strong>A Failed InstallPlan:<\/strong> Usually occurs because a resource listed in the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/installplan\/\">InstallPlan<\/a> fails to be created or updated. An InstallPlan may fail independently of its CSV and may fail to create the CSV.<\/li>\n<\/ul>\n<p>By opting into &ldquo;UnsafeFailForward&rdquo; upgrades, OLM will allow you to recover from failed installations and upgrades by:<\/p>\n<ul>\n<li>Allowing CSVs to move from the FAILED phase to the REPLACING phase.<\/li>\n<li>Allowing OLM to calculate new InstallPlans for a set of installables if:\n<ul>\n<li>The InstallPlan referenced by a Subscription is in the FAILED phase.<\/li>\n<li>The CatalogSource has been updated to include a new upgrade for one or more CSVs in the namespace.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 id=\"using-unsafefailforward-upgrades\">Using UnsafeFailForward Upgrades<\/h2>\n<p>Since resolution is namespace scoped, the toggle for allowing &ldquo;UnsafeFailForward&rdquo; upgrades is namespace scoped as well. Accordingly, the namespace scoped resource, OperatorGroup, has the <code>upgradeStrategy<\/code> field.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">bar<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Possible values include &#34;Default&#34; or &#34;TechPreviewUnsafeFailForward&#34;.<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">upgradeStrategy<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">TechPreviewUnsafeFailForward<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>With the upgradeStrategy type set to <code>TechPreviewUnsafeFailForward<\/code>, OLM will allow operators to &ldquo;UnsafeFailForward&rdquo; in adherence with the principles discussed below. If the upgradeStrategy is unset or set to <code>Default<\/code> OLM will exhibit existing behavior.<\/p>\n<h2 id=\"understanding-unsafefailforward-upgrades\">Understanding &ldquo;UnsafeFailForward&rdquo; upgrades<\/h2>\n<p>Before using UnsafeFailForward upgrades, it is important to understand how OLM and the Resolver calculate what needs to be installed. When determining what to install, OLM provides the Resolver with the set of CSVs in a namespace. The Resolver treats these CSVs differently depending on whether or not they are claimed by a Subscription, where the Subscription lists the CSV&rsquo;s name in its <code>.status.currentCSV<\/code> field.<\/p>\n<ul>\n<li>If a CSV is claimed by a Subscription, the Resolver will allow it to be upgraded by a bundle that replaces it.<\/li>\n<li>If a CSV is not claimed by a Subscription, it is assumed that the user installed the CSV themselves, that OLM should not upgrade the CSV, and that it must appear in the next set of installables.<\/li>\n<\/ul>\n<p>OLM&rsquo;s Resolver is deterministic, meaning that the set of installables will not change for a given set of arguments if no new upgrades have been declared in the existing CatalogSources. When an upgrade fails due to a CSV entering the FAILED phase, the CSV being replaced still exists and is not referenced by a Subscription. Today, OLM would send both <code>Operator v1<\/code> and <code>Operator v2<\/code> to the Resolver which will normally be unsatisfiable because <code>Operator v1<\/code> is marked as required and <code>Operator v2<\/code> cannot be upgraded further since it provides the same APIs as <code>Operator v1<\/code>. In order to support &ldquo;failing forward&rdquo;, OLM needs to omit CSVs in the REPLACING phase from the set of arguments sent to the Resolver when &ldquo;UnsafeFailForward&rdquo; upgrades are enabled.<\/p>\n<h3 id=\"when-an-installplan-failed\">When an InstallPlan failed<\/h3>\n<p>Let&rsquo;s review what steps must be taken to recover from a failed InstallPlan today:<\/p>\n<ul>\n<li><code>Operator v1<\/code> is being upgraded to <code>Operator v2<\/code>.<\/li>\n<li>The InstallPlan for <code>Operator v2<\/code> fails.<\/li>\n<li><code>Operator v3<\/code> is added to the catalog and is defined as the upgrade for <code>Operator v1<\/code>.<\/li>\n<li>The user deletes the InstallPlan created for <code>Operator v2<\/code>.<\/li>\n<li>A new InstallPlan is generated for <code>Operator v3<\/code> and the upgrade succeeds.<\/li>\n<\/ul>\n<p>With &ldquo;UnsafeFailForward&rdquo; upgrades, OLM allows new InstallPlans to be generated if:<\/p>\n<ul>\n<li>The failed InstallPlan is referenced by a Subscription in the namespace.<\/li>\n<li>The CatalogSource has been updated to include a new upgrade for the set of arguments.<\/li>\n<\/ul>\n<p>In practice, the fourth step from the previous workflow would be removed, meaning that the you simply need to update the CatalogSource and wait for the cluster to move past the failed install. With catalog polling enabled, you can even skip updating the CatalogSource directly by pushing a new catalog image to the same tag.<\/p>\n<blockquote>\n<p>BEST PRACTICE NOTE: If a bundle is known to fail, it should be skipped in the upgrade graph using the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/#skips\">skips<\/a> or <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/#skiprange\">skipRange<\/a> feature.<\/p>\n<\/blockquote>\n<p>To further understand, let&rsquo;s visualize this.<\/p>\n<div class=\"mermaid\">\ngraph TD;\nA(Operavtor V1 installed) --> B(Starts upgrading to Operator V2)\nB --> |Install succeeds| F(Operator V2 is installed and succeeds)\nB --> |InstallPlan fails| C(Operator V3 added to catalog replacing V2)\nC --> |Upgrade blocked as V1 is in solution set still| D(Manually delete Operator V2 InstallPlan)\nD --> |New InstallPlan generated and approved| E(Operator V3 is installed and succeeds)\nB --> |InstallPlan fails with UnsafeFailForward upgrades| H(Operator V3 added to catalog replacing V2)\nH --> |New InstallPlan generated and approved| J(Operator V3 is installed and succeeds)\n<\/div>\n<h3 id=\"when-one-or-more-csvs-have-failed\">When one or more CSVs have failed<\/h3>\n<p>Let&rsquo;s review what steps must be taken to recover from a failed CSV today:<\/p>\n<ul>\n<li><code>Operator v1<\/code> is being upgraded to <code>Operator v2<\/code>.<\/li>\n<li>The CSV for <code>Operator v2<\/code> enters the FAILED phase.<\/li>\n<li><code>Operator v3<\/code> is added to the catalog which replaces or skips <code>Operator v2<\/code>.<\/li>\n<li>The Resolver cannot upgrade <code>Operator v2<\/code> while including <code>Operator v1<\/code> in the solution set, upgrade is blocked.<\/li>\n<li>User manually deletes the existing CSVs, a new InstallPlan is generated and approved.<\/li>\n<li><code>Operator v3<\/code> is installed and the upgrade succeeds.<\/li>\n<\/ul>\n<p>To further understand, let&rsquo;s visualize this.<\/p>\n<div class=\"mermaid\">\ngraph TD;\nA(Operator V1 installed) --> B(Starts upgrading to Operator V2)\nB --> |Install succeeds| F(Operator V2 is installed and succeeds)\nB --> |CSV enters FAILED phase| C(Operator V3 added to catalog replacing V2)\nC --> |Upgrade blocked as V1 is in solution set still| D(Manually delete Operator V2 CSV)\nD --> |New InstallPlan generated and approved| E(Operator V3 is installed and succeeds)\nB --> |CSV enters FAILED phase with UnsafeFailForward upgrades| H(Operator V3 added to catalog replacing V2)\nH --> |New InstallPlan generated and approved| J(Operator V3 is installed and succeeds)\n<\/div>\n<p>When you opt into &ldquo;UnsafeFailForward&rdquo; upgrades, OLM:<\/p>\n<ul>\n<li>Does not include CSVs in the REPLACING phase in the set of arguments sent to the Resolver if the final CSV in the upgrade chain is in the FAILED phase and all other CSVs are in the REPLACING phase.<\/li>\n<li>Allows CSVs to move from the FAILED phase to the REPLACING phase.<\/li>\n<\/ul>\n<p>These changes allow OLM to recover from any number of failed CSVs in an upgrade path, replacing the latest FAILED CSV with the next upgrade.<\/p>"},{"title":"Docs: Subscription","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/subscription\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/subscription\/","description":"\n<p>A Subscription represents an intention to install an operator. It is the CustomResource that relate an operator to a CatalogSource. Subscriptions describe which <a href=\"https:\/\/olm.operatorframework.io\/docs\/glossary\/#channel\">channel<\/a> of an operator package to subscribe to, and whether to perform updates automatically or manually. If set to automatic, the Subscription ensures OLM will manage and upgrade the operator to ensure the latest version is always running in the cluster.<\/p>\n<p>Here&rsquo;s an example of a Subscription definition:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>This Subscription object defines the name and namespace of the operator, as well as the catalog from which the operator data can be found. The channel (such as alpha, beta, or stable) helps determine which stream of the operator should be installed from the CatalogSource.<\/p>\n<h2 id=\"manually-approving-upgrades-via-subscriptions\">Manually Approving Upgrades via Subscriptions<\/h2>\n<p>By default, OLM will automatically approve updates to an operator as new versions become available via a CatalogSource. When creating a subscription, it is possible to disable automatic updates by setting the <code>installPlanApproval<\/code> field to <code>Manual<\/code> like so:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">installPlanApproval<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Manual<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Setting the <code>installPlanApproval<\/code> field to manual will prevent OLM from automatically installing the operator. As such, you will need to approve the installPlan which can be done with the following commands:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>kubectl -n operators get installplans\n<\/span><\/span><span style=\"display:flex;\"><span>NAME CSV APPROVAL APPROVED\n<\/span><\/span><span style=\"display:flex;\"><span>install-bfmxd my-operator.v0.1.0 Manual <span style=\"color:#204a87\">false<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl -n operators patch installplan install-bfmxd -p <span style=\"color:#4e9a06\">&#39;{&#34;spec&#34;:{&#34;approved&#34;:true}}&#39;<\/span> --type merge\n<\/span><\/span><span style=\"display:flex;\"><span>installplan.operators.coreos.com\/install-bfmxd patched\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl -n operators get installplans\n<\/span><\/span><span style=\"display:flex;\"><span>NAME CSV APPROVAL APPROVED\n<\/span><\/span><span style=\"display:flex;\"><span>install-bfmxd my-operator.v0.1.0 Manual <span style=\"color:#204a87\">true<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>Now that the <code>install-bfmxd<\/code> installPlan is in the approved state, OLM will install the operator defined by the <code>my-operator.v0.1.0<\/code> CSV.<\/p>\n<p>When the CatalogSource is updated with a newer version of that operator in the channel you selected, a new installPlan will be created in the namespace that you installed the operator to, as shown below:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl -n operators get installplans\n<\/span><\/span><span style=\"display:flex;\"><span>NAME CSV APPROVAL APPROVED\n<\/span><\/span><span style=\"display:flex;\"><span>install-bfmxd my-operator.v0.1.0 Manual <span style=\"color:#204a87\">true<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>install-svojy my-operator.v0.2.0 Manual <span style=\"color:#204a87\">false<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>From here, you can approve <code>install-svojy<\/code> using the patch command shown earlier.<\/p>\n<p>With the new installPlan in the approve state, the <code>my-operator.v0.2.0<\/code> CSV will be deployed to the cluster and if the CSV reaches the <code>Succeeded<\/code> state the old CSV will be deleted. If the new CSV fails to reach the <code>Succeeded<\/code> state, both CSVs will continue to exist and it is up to the user to resolve the failure. In either case, OLM will not delete old installPlans as they act as a record of CSVs that were installed on your cluster.<\/p>\n<h2 id=\"how-do-i-know-when-an-update-is-available-for-an-operator\">How do I know when an update is available for an operator<\/h2>\n<p>It is possible to identify when there is a newer version of an operator available by inspecting the status of the operator&rsquo;s subscription. The value associated with the <code>currentCSV<\/code> field is the newest version that is known to OLM, and <code>installedCSV<\/code> is the version that is installed on the cluster.<\/p>"},{"title":"Docs: Catalog Templates","link":"https:\/\/olm.operatorframework.io\/docs\/reference\/catalog-templates\/","pubDate":"Thu, 30 Jun 2022 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/reference\/catalog-templates\/","description":"\n<blockquote>\n<p>Note: <code>catalog templates<\/code> are <strong>ALPHA<\/strong> functionality and may adopt breaking changes<\/p>\n<\/blockquote>\n<h2 id=\"concept-and-design\">Concept and Design<\/h2>\n<p>File-Based Catalogs (FBC) are a major improvement to the imperative update graph approaches of previous versions. FBCs give operator authors a <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/\">declarative and deterministic approach to defining their update graph<\/a>. However, FBCs can get complex, especially as the number of releases and dependencies scale. We introduce the concept of a <code>catalog template<\/code> (referred to as <code>template<\/code> going forward) as an approach to simplifying interacting with FBCs.<\/p>\n<p>In this context, there are two components to every <code>template<\/code>:<\/p>\n<ol>\n<li>An arbitrary API<\/li>\n<li>An executable which processes #1 and produces a valid FBC.<\/li>\n<\/ol>\n<p>The templates supported by <a href=\"https:\/\/github.com\/operator-framework\/operator-registry\/blob\/master\/docs\/design\/opm-tooling.md\"><code>opm<\/code><\/a> are:<\/p>\n<ul>\n<li>the <a href=\"#basic-template\"><code>basic template<\/code><\/a>, which provides a simplified abstraction of an FBC<\/li>\n<li>the <a href=\"#semver-template\"><code>semver template<\/code><\/a>, which provides the capability to generate an entire upgrade graph<\/li>\n<\/ul>\n<h2 id=\"basic-template\">Basic Template<\/h2>\n<p>The <code>basic template<\/code> is an input schema which eliminates FBC information that can be retrieved from existing registries when we process it.\nWithin the schema, users can add entries composed of any valid <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\/#olm-defined-schemas\">FBC schema<\/a> components, but supply only the bundle image reference for any <code>olm.bundle<\/code> objects. This results in a greatly simplified, smaller document.\nThis approach may be attractive to operator authors who maintain existing catalogs and just want to simplify the format, or for operator authors who need to retain an update graph which cannot be based on <code>semver<\/code>.<\/p>\n<h3 id=\"usage\">Usage<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>opm alpha render-template basic <span style=\"color:#ce5c00;font-weight:bold\">[<\/span>flags<span style=\"color:#ce5c00;font-weight:bold\">]<\/span> &lt;filename&gt;\n<\/span><\/span><\/code><\/pre><\/div><table>\n<thead>\n<tr>\n<th>Flag<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>-h, &ndash;help<\/td>\n<td>prints help\/usage information<\/td>\n<\/tr>\n<tr>\n<td>-o, &ndash;output <type><\/td>\n<td>the output format, can be <code>yaml<\/code> or <code>json<\/code><\/td>\n<\/tr>\n<tr>\n<td>&ndash;skip-tls-verify<\/td>\n<td>skip TLS certificate verification for container image registries while pulling bundles<\/td>\n<\/tr>\n<tr>\n<td>&ndash;use-http<\/td>\n<td>use plain HTTP for container image registries while pulling bundles<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><code>--skip-tls-verify<\/code> and <code>--use-http<\/code> are mutually exclusive flags.<\/p>\n<h3 id=\"example\">Example<\/h3>\n<p>In a very simple example, we define an <code>olm.package<\/code> and an <code>olm.channel<\/code> composed of two <code>olm.bundle<\/code> objects that have an image name attribute but no other attributes\/properties.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.template.basic<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator-bundle:0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator-bundle:0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Using the <code>opm alpha render-template basic<\/code> command on this input generates the full FBC (skipping large bundle metadata objects):<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator-bundle:0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.gvk<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">group<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">App<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">relatedImages<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator-bundle:0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator:0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator-bundle:0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.gvk<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">group<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">App<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">example-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">relatedImages<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator-bundle:0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">docker.io\/example\/example-operator:0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"converting-from-fbc-to-basic-template\">Converting from FBC to Basic Template<\/h2>\n<p>The <code>opm<\/code> tool provides the capability to render existing File-Based Catalogs to basic catalog templates in JSON or YAML formats.<\/p>\n<h3 id=\"usage-1\">Usage<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>opm alpha convert-template basic <span style=\"color:#ce5c00;font-weight:bold\">[<\/span>flags<span style=\"color:#ce5c00;font-weight:bold\">]<\/span> &lt;filename&gt;\n<\/span><\/span><\/code><\/pre><\/div><table>\n<thead>\n<tr>\n<th>Flag<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>-h, &ndash;help<\/td>\n<td>prints help\/usage information<\/td>\n<\/tr>\n<tr>\n<td>-o, &ndash;output <type><\/td>\n<td>the output format, can be <code>yaml<\/code> or <code>json<\/code><\/td>\n<\/tr>\n<tr>\n<td>&ndash;skip-tls-verify<\/td>\n<td>skip TLS certificate verification for container image registries while pulling bundles<\/td>\n<\/tr>\n<tr>\n<td>&ndash;use-http<\/td>\n<td>use plain HTTP for container image registries while pulling bundles<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><code>--skip-tls-verify<\/code> and <code>--use-http<\/code> are mutually exclusive flags.<\/p>\n<h3 id=\"example-template-in-json-format-after-the-conversion\">Example template in JSON format after the conversion<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-json\" data-lang=\"json\"><span style=\"display:flex;\"><span><span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.template.basic&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;entries&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#000;font-weight:bold\">[<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.package&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;name&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;defaultChannel&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;alpha&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;description&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">},<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.channel&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;name&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;alpha&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;package&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;entries&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#000;font-weight:bold\">[<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;name&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes.v0.0.1&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">]<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">},<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.bundle&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;image&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;docker.io\/test\/hello-kubernetes-operator-bundle:v0.0.1&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">]<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"using-existing-fbc-to-bootstrap-a-substitutes-template\">Using existing FBC to bootstrap a Substitutes Template<\/h2>\n<p>The <code>opm<\/code> tool provides the capability to generate a substitutes template from existing FBC in JSON or YAML formats.<\/p>\n<h3 id=\"usage-2\">Usage<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>.\/bin\/opm alpha convert-template substitutes <span style=\"color:#ce5c00;font-weight:bold\">[<\/span>flags<span style=\"color:#ce5c00;font-weight:bold\">]<\/span> &lt;fbc-location&gt;\n<\/span><\/span><\/code><\/pre><\/div><table>\n<thead>\n<tr>\n<th>Flag<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>-h, &ndash;help<\/td>\n<td>prints help\/usage information<\/td>\n<\/tr>\n<tr>\n<td>-o, &ndash;output <type><\/td>\n<td>the output format, can be <code>yaml<\/code> or <code>json<\/code><\/td>\n<\/tr>\n<tr>\n<td>&ndash;skip-tls-verify<\/td>\n<td>skip TLS certificate verification for container image registries while pulling bundles<\/td>\n<\/tr>\n<tr>\n<td>&ndash;use-http<\/td>\n<td>use plain HTTP for container image registries while pulling bundles<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><code>--skip-tls-verify<\/code> and <code>--use-http<\/code> are mutually exclusive flags.<\/p>\n<h3 id=\"example-template-in-json-format-after-the-conversion-1\">Example template in JSON format after the conversion<\/h3>\n<blockquote>\n<p>Note: empty substitutions are provided, but must be filled in to be valid<\/p>\n<\/blockquote>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-json\" data-lang=\"json\"><span style=\"display:flex;\"><span><span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.template.substitutes&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;entries&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#000;font-weight:bold\">[<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.package&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;name&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;defaultChannel&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;alpha&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;description&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">},<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.channel&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;name&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;alpha&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;package&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;entries&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#000;font-weight:bold\">[<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;name&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;hello-kubernetes.v0.0.1&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">]<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">},<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;schema&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;olm.bundle&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;image&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;docker.io\/test\/hello-kubernetes-operator-bundle:v0.0.1&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">],<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;substitutions&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#000;font-weight:bold\">[<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">{<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;name&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;&#34;<\/span><span style=\"color:#000;font-weight:bold\">,<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#204a87;font-weight:bold\">&#34;base&#34;<\/span><span style=\"color:#000;font-weight:bold\">:<\/span> <span style=\"color:#4e9a06\">&#34;&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000;font-weight:bold\">]<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#000;font-weight:bold\">}<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"semver-template\">Semver Template<\/h2>\n<p>Since a <code>catalog template<\/code> is identified as an input schema which is processed to generate a valid FBC, we can define a <code>semver template<\/code> as a schema which uses channel conventions to facilitate the auto-generation of channels adhering to <a href=\"https:\/\/semver.org\/\">Semantic Versioning<\/a> (semver) guidelines and consistent with best practices on <a href=\"https:\/\/olm.operatorframework.io\/docs\/best-practices\/channel-naming\/#naming\">channel naming<\/a>. This approach may be attractive to operator authors who are defining a new upgrade graph, or are already close enough to this template&rsquo;s conventions to be able to adopt it.<\/p>\n<blockquote>\n<p><strong>DISCLAIMER:<\/strong> since version build metadata MUST be ignored when determining version precedence (see <a href=\"https:\/\/semver.org\/\">spec #10<\/a>) when using semver, if any bundles differ only by build metadata the render attempt will generate a fatal error.<\/p>\n<\/blockquote>\n<p>This alpha version of the <code>semver template<\/code> has the following goals:<\/p>\n<ul>\n<li>terse grammar to minimize creation\/maintenance effort<\/li>\n<li>idempotent output<\/li>\n<li>simple channel promotion<\/li>\n<li>demonstration of a common type of channel maturity model<\/li>\n<li>minor-version (Y-stream) and major-version (X-stream) versioning capabilities<\/li>\n<li>clear mapping between input schema and output FBC attributes<\/li>\n<\/ul>\n<blockquote>\n<p><strong>Note:<\/strong> The semver template depends on the optional <code>csv.spec.version<\/code> field. If you want to use the semver catalog template, you must specify a version in your extension&rsquo;s CSV.<\/p>\n<\/blockquote>\n<h3 id=\"specification\">Specification<\/h3>\n<p>Like best practices <a href=\"https:\/\/olm.operatorframework.io\/docs\/best-practices\/channel-naming\/#recommended-channel-naming\">recommended channel naming<\/a>, this template supports channel names <code>Candidate<\/code>, <code>Fast<\/code>, and <code>Stable<\/code>, in order of increasing channel stability. We leverage this relationship when calculating the default channel for the package.<\/p>\n<p><code>GenerateMajorChannels<\/code> and <code>GenerateMinorChannels<\/code> dictate whether this template will generate X-stream or Y-stream channels (attributes can be set independently). If omitted, only minor (Y-stream) channels will be generated.<\/p>\n<p>Under each channel are a list of bundle image references which contribute to that channel. At least one channel must have bundle images.<\/p>\n<p>The <code>olm.semver<\/code> <a href=\"https:\/\/cuelang.org\/docs\/references\/spec\/\">cue<\/a> schema is:<\/p>\n<pre tabindex=\"0\"><code class=\"language-cue\" data-lang=\"cue\">#Package: {\nschema: &#34;olm.semver&#34;\n\/\/ optional flag to control generating minor-version channels, defaults to _true_ if unspecified\nGenerateMinorChannels?: bool\n\/\/ optional flag to control generating major-version channels, defaults to _false_ if unspecified\nGenerateMajorChannels?: bool\n\/\/ optional preference for major- or minor-version channels, when both are generated and identical in stability and version\nDefaultChannelTypePreference?: string\n\/\/ optional candidate channel\nCandidate?: {\nBundles: [...#ImageEntry]\n}\n\/\/ optional fast channel\nFast?: {\nBundles: [...#ImageEntry]\n}\n\/\/ optional stable channel\nStable?: {\nBundles: [...#ImageEntry]\n}\n#ImageEntry: {\nImage: string\n}\n}\n<\/code><\/pre><h3 id=\"usage-3\">Usage<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>opm alpha render-template semver <span style=\"color:#ce5c00;font-weight:bold\">[<\/span>flags<span style=\"color:#ce5c00;font-weight:bold\">]<\/span> &lt;filename&gt;\n<\/span><\/span><\/code><\/pre><\/div><table>\n<thead>\n<tr>\n<th>Flag<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>-h, &ndash;help<\/td>\n<td>prints help\/usage information<\/td>\n<\/tr>\n<tr>\n<td>-o, &ndash;output <type><\/td>\n<td>the output format, can be <code>yaml<\/code> or <code>json<\/code><\/td>\n<\/tr>\n<tr>\n<td>&ndash;skip-tls-verify<\/td>\n<td>skip TLS certificate verification for container image registries while pulling bundles<\/td>\n<\/tr>\n<tr>\n<td>&ndash;use-http<\/td>\n<td>use plain HTTP for container image registries while pulling bundles<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><code>--skip-tls-verify<\/code> and <code>--use-http<\/code> are mutually exclusive flags.<\/p>\n<h3 id=\"examples\">Examples<\/h3>\n<p>With the following (hypothetical) example we define a mock bundle which has 11 versions, represented across each of the channel types:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">Schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.semver<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">GenerateMajorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">GenerateMinorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">Candidate<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">Bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.1.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.1.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">Fast<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">Bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">Stable<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">Bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">Image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/foo\/olm:testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>In this example, <code>Candidate<\/code> has the entire version range of bundles, <code>Fast<\/code> has a mix of older and more-recent versions, and <code>Stable<\/code> channel only has a single published entry.<\/p>\n<h4 id=\"generating-major-version-channels\">Generating major-version channels<\/h4>\n<p>If we set the template attributes<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">GenerateMajorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">GenerateMinorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>we generate the following major channels (filtering out large bundle metadata):<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.1.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>We generated a channel for each template channel entity corresponding to each of the 0.#.#, 1.#.# major version ranges with skips to the head of the highest semver in a channel. We also generated a replaces edge to traverse across minor version transitions within each major channel. Finally, we generated an <code>olm.package<\/code> object, setting as default the most-stable channel head we created. This process will prefer <code>Stable<\/code> channel over <code>Fast<\/code>, over <code>Candidate<\/code> and then a higher bundle version over a lower version.<br>\n(Please note that the naming of the generated channels indicates the digits of significance for that channel. For example, <code>fast-v1<\/code> is a decomposed channel of the <code>fast<\/code> type which contains only major versions of contributing bundles matching <code>v1<\/code>.)<\/p>\n<h4 id=\"generating-minor-version-channels\">Generating minor-version channels<\/h4>\n<p>For contrast, if we set the template attributes<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">GenerateMinorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">GenerateMajorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>we generate the following minor channels (again filtering out large bundle metadata):<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.1.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v0.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v0.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v0.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v0.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Here, a channel is generated for each template channel which differs by minor version, and each channel has a <code>replaces<\/code> edge from the predecessor channel to the next-lesser minor bundle version. Please note that at no time do we transgress across major-version boundaries with the channels, to be consistent with <a href=\"https:\/\/semver.org\/\">the semver convention<\/a> for major versions, where the purpose is to make incompatible API changes.<\/p>\n<h4 id=\"generating-both-channel-types-and-disambiguating-default-channel-selection\">Generating both channel types, and disambiguating default channel selection<\/h4>\n<p>In the case that we generate both major-version and minor-version channels:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">GenerateMinorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">GenerateMajorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>we can easily end up in a situation where our results yield indifferentiable results, for e.g.:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>In this situation, both channels have matching channel archetypes and the channel heads have the same versions. The <code>DefaultChannelTypePreference<\/code> attribute allows us to deterministically select a single channel in this case. This attribute defaults to prefer minor-version channels (<code>DefaultChannelTypePreference: minor<\/code>), but can be overridden in the schema if the author wishes to prefer major-version channels instead (<code>DefaultChannelTypePreference: major<\/code>).<\/p>\n<p>With <code>DefaultChannelTypePreference<\/code> set to <code>major<\/code>, our most-stable channels and package output would look like<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"substitutes-template\">Substitutes Template<\/h2>\n<p>The substitutes template provides a safe and structured way to replace bundles in an upgrade graph with newer packaging versions. This is particularly useful when you need to republish a bundle with non-functional changes (documentation fixes, label updates, etc.) and want to ensure users can upgrade to the new bundle.<\/p>\n<p>Before the substitutes template, when you needed to replace a bundle in a catalog (for example, <code>foo.v1.0.0<\/code> with a documentation fix), you had two options:<\/p>\n<ol>\n<li><strong>Manually edit all channel entries<\/strong> - Error-prone and requires updating multiple references<\/li>\n<li><strong>Use the deprecated <code>substitutesFor<\/code> CSV field<\/strong> - Not available in file-based catalogs<\/li>\n<\/ol>\n<p>The <code>olm.template.substitutes<\/code> template solves this by automatically handling the complex graph mutations required to safely replace bundles.<\/p>\n<h3 id=\"schema\">Schema<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.template.substitutes<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#8f5902;font-style:italic\"># Existing FBC catalog content (packages, channels, bundles)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">substitutions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;new-bundle-image&gt; <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Bundle image to substitute<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;old-bundle-name&gt; <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Bundle name to replace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"how-it-works\">How It Works<\/h3>\n<p>When you define a substitution:<\/p>\n<ol>\n<li>The template validates that the substitute bundle has a higher composite version than the base bundle<\/li>\n<li>For each channel containing the base bundle, the template:\n<ul>\n<li>Adds the new bundle to the channel<\/li>\n<li>Moves upgrade edges (replaces, skips, skipRange) from the base to the substitute<\/li>\n<li>Adds a skip edge from substitute to base<\/li>\n<li>Updates all other entries that reference the base to reference the substitute instead<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Before Substitution<\/p>\n<div class=\"mermaid\">graph LR\nA1[foo.v0.9.0] -->|replace| B1[foo.v1.0.0]\nB1 -->|replace| C1[foo.v1.1.0]\n<\/div>\n<p>After Substitution<\/p>\n<div class=\"mermaid\">graph LR\nA2[foo.v0.9.0] -->|replace| B2[foo-v1.0.0-1<br\/>NEW]\nB2 -->|replace| C2[foo.v1.1.0]\nB2 -.->|skip| D2[foo.v1.0.0<br\/>OLD]\nstyle B2 fill:#c3e6cb,stroke:#28a745,stroke-width:3px\nstyle D2 fill:#f8d7da,stroke:#dc3545,stroke-width:2px,stroke-dasharray: 5 5\n<\/div>\n<h3 id=\"step-by-step-example\">Step-by-Step Example<\/h3>\n<h4 id=\"step-1-initial-catalog-state\">Step 1: Initial Catalog State<\/h4>\n<p>You have a catalog with three bundles in the <code>stable<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"step-2-create-new-bundle-with-release\">Step 2: Create New Bundle with Release<\/h4>\n<p>You discover <code>foo.v1.0.0<\/code> is missing a critical annotation.\nYou:<\/p>\n<ol>\n<li>update the bundle&rsquo;s annotation in <code>metadata\/annotations.yaml<\/code><\/li>\n<li>update the bundle&rsquo;s CSV with <code>spec.release<\/code> set (here set to 1)<\/li>\n<li>ensure that the bundle&rsquo;s <code>metadata-name<\/code> follows the format required for using release versions<\/li>\n<li>publish the bundle<\/li>\n<\/ol>\n<p>The rendered bundle image (via <code>opm render<\/code>) would look something like this in FBC:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-1 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># New name with release<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.0.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">release<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;1&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Added release<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"step-3-create-substitutes-template\">Step 3: Create Substitutes Template<\/h4>\n<p>Instead of manually updating the catalog, create a substitutes template:<\/p>\n<blockquote>\n<p>Note: see <a href=\"#using-existing-fbc-to-bootstrap-a-substitutes-template\">Using existing FBC to bootstrap a Substitutes Template<\/a> to get <code>opm<\/code> to generate this for you.<\/p>\n<\/blockquote>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.template.substitutes<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Include all your existing catalog content here<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># (packages, channels, bundles - except the new foo-v1.0.0-1)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">substitutions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.0.0-1 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># New bundle image<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Old bundle name to replace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"step-4-render-the-template\">Step 4: Render the Template<\/h4>\n<p>Use <code>opm<\/code> to render the template:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>opm alpha render-template substitutes-template.yaml -o yaml &gt; catalog\/foo\/index.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>The rendered catalog will have:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-1 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># NEW substitute bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">foo.v1.0.0 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Skips the old bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-1 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Updated to point to new bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># OLD bundle remains in catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># No upgrade edges (orphaned)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"substitution-rules-and-validation\">Substitution Rules and Validation<\/h3>\n<p>The template enforces several validation rules:<\/p>\n<ol>\n<li>\n<p><strong>Composite version check<\/strong>: The substitute bundle must have a higher composite version than the base bundle<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># \u2705 VALID - release &#34;1&#34; &gt; no release<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0 (version 1.0.0, no release)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-1 (version 1.0.0, release &#34;1&#34;)<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># \u274c INVALID - same version and release<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># \u274c INVALID - lower composite version<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo-v1.0.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><\/li>\n<li>\n<p><strong>Base bundle must exist<\/strong>: The base bundle name must be present in the catalog<\/p>\n<\/li>\n<li>\n<p><strong>Required fields<\/strong>: Both <code>name<\/code> (bundle image) and <code>base<\/code> (bundle name) are required<\/p>\n<\/li>\n<li>\n<p><strong>Name vs Base validation<\/strong>: The <code>name<\/code> and <code>base<\/code> cannot be the same<\/p>\n<\/li>\n<\/ol>\n<h4 id=\"multiple-substitutions\">Multiple Substitutions<\/h4>\n<p>You can define multiple substitutions in a single template:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.template.substitutes<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># ... catalog content ...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">substitutions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.0.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.1.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/bar-bundle:v2.0.0-alpha.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">bar-v2.0.0-alpha.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The substitutions are processed in order, and each substitution validates against the current state of the catalog.<\/p>\n<h4 id=\"upgrade-path-diagram\">Upgrade Path Diagram<\/h4>\n<div class=\"mermaid\">stateDiagram-v2\n[*] --> InstalledOld: User has foo.v1.0.0\n[*] --> InstalledNew: New user installs\nInstalledOld --> UpgradeToSubstitute: Catalog updated with<br\/>substitution\nInstalledNew --> UseSubstitute: Directly installs<br\/>foo-v1.0.0-1\nUpgradeToSubstitute --> foo_v1_0_0_1: OLM sees substitute<br\/>skips old bundle\nUseSubstitute --> foo_v1_0_0_1: Gets latest bundle\nfoo_v1_0_0_1 --> [*]: Up to date\nnote right of UpgradeToSubstitute\nSkip relationship ensures\nusers upgrade to the new\npackaging version\nend note\n<\/div>\n<h3 id=\"best-practices\">Best Practices<\/h3>\n<ol>\n<li>\n<p><strong>Use for packaging changes only<\/strong>: The substitute bundle should be functionally equivalent to the base bundle<\/p>\n<\/li>\n<li>\n<p><strong>Validate composite versions<\/strong>: Ensure your substitute bundle has a higher composite version (typically by adding a release field)<\/p>\n<\/li>\n<li>\n<p><strong>Test before deploying<\/strong>: Use <code>opm validate<\/code> to verify the rendered catalog:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>opm alpha render-template template.yaml <span style=\"color:#000;font-weight:bold\">|<\/span> opm validate -\n<\/span><\/span><\/code><\/pre><\/div><\/li>\n<li>\n<p><strong>Keep base bundles<\/strong>: The old bundle remains in the catalog but becomes unreachable through normal upgrade paths (it&rsquo;s still accessible for historical reference)<\/p>\n<\/li>\n<li>\n<p><strong>Document substitutions<\/strong>: Add comments in your template explaining why each substitution was made<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">substitutions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Fixed typo in operator description<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.0.0-1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><\/li>\n<\/ol>\n<h3 id=\"complete-working-example\">Complete Working Example<\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.template.substitutes<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Your existing catalog content<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">0.9.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">properties<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">type<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">value<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">packageName<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">version<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#8f5902;font-style:italic\"># Define the substitution<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">substitutions<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/example\/foo-bundle:v1.0.0-1 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># New bundle with fixed docs<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">base<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo.v1.0.0 <\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#8f5902;font-style:italic\"># Old bundle to replace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Render with:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>opm alpha render-template substitutes-template.yaml -o yaml &gt; catalog\/foo\/index.yaml\n<\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: List operators available to install on cluster","link":"https:\/\/olm.operatorframework.io\/docs\/tasks\/list-operators-available-to-install\/","pubDate":"Thu, 05 Jan 2017 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/tasks\/list-operators-available-to-install\/","description":"\n<h2 id=\"list-your-operator\">List your operator<\/h2>\n<p>The <code>PackageManifest<\/code> API exposes content from existing <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/catalogsource\">CatalogSources<\/a> on cluster. Querying that API reveals the list of operators available to install.<\/p>\n<blockquote>\n<p>Note: <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/catalogsource\">CatalogSources<\/a> in OLM are either global or namespaced. Global CatalogSources contain operators that will be available for installing in all namespaces, while namespaced CatalogSources only contains operators that are available to be installed in a specific namespace.<\/p>\n<\/blockquote>\n<h3 id=\"using-the-packagemanifest-api\">Using the PackageManifest API<\/h3>\n<p>The <code>PackageManifest<\/code> API when queried, will return the union of globally available as well as namespaced available operators, from the namespace you&rsquo;re querying in.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>kubectl get packagemanifest -n &lt;namespace&gt;\n<\/span><\/span><\/code><\/pre><\/div><p>The list of available operators will be displayed as an output of those above commands:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl get packagemanifest\n<\/span><\/span><span style=\"display:flex;\"><span>NAME CATALOG AGE\n<\/span><\/span><span style=\"display:flex;\"><span>cassandra-operator Community Operators 26m\n<\/span><\/span><span style=\"display:flex;\"><span>etcd Community Operators 26m\n<\/span><\/span><span style=\"display:flex;\"><span>postgres-operator Community Operators 26m\n<\/span><\/span><span style=\"display:flex;\"><span>prometheus Community Operators 26m\n<\/span><\/span><span style=\"display:flex;\"><span>wildfly Community Operators 26m\n<\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: Catalog Update Formulary","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/catalog-update-formulary\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/catalog-update-formulary\/","description":"\n<h2 id=\"background\">Background<\/h2>\n<p><a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\">File-based-catalogs<\/a> (FBC) and <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/catalog-templates\">catalog templates<\/a> (templates) provide operator authors with standardized schemas to express operator upgrade graphs. However, without explicit tooling users require clear examples of how to achieve routine goals. This document is an attempt to establish a formulary of common operations, specifically with the intention of making these pieces automatable. This is in no way an exhaustive list.<\/p>\n<h2 id=\"conventions\">Conventions<\/h2>\n<p>Formulae will be identified as FBC, <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/catalog-templates#basic-template\">basic catalog template<\/a> (basic template), or <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/catalog-templates#semver-template\">semver catalog template<\/a> (semver template).\nSchema manipulations will be modeled using YAML and <a href=\"https:\/\/github.com\/mikefarah\/yq\">yq<\/a>. Wherever possible, example input will be limited to the relevant object hierarchies. Truncation is indicated by elipses (&hellip;) before and after the text.<\/p>\n<h2 id=\"examples\">Examples<\/h2>\n<p>For brevity, all formulae will refer to the same example, for semver template and FBC. For convenience, all semver bundle image pullspecs will express versions which match the bundle version (instead of SHAs).<\/p>\n<h3 id=\"fbc-example\">FBC example<\/h3>\n<p>Formulae presume the following content is saved to the file <code>fbc.yaml<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"basic-template-example\">basic template example<\/h3>\n<p>Formulae presume the following context is saved to the file <code>basic.yaml<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.template.basic<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.bundle<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"semver-template-example\">semver template example<\/h3>\n<p>Formulae presume the following content is saved to the file <code>semver.yaml<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.semver<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">generateMajorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">generateMinorChannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">candidate<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">fast<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">stable<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"formulae\">Formulae<\/h2>\n<h3 id=\"adding-a-new-bundle-to-an-existing-channel\">Adding a new bundle to an existing channel<\/h3>\n<h4 id=\"fbc\">FBC<\/h4>\n<p>Add a new <code>testoperator.v1.1.1<\/code> edge to an existing <code>candidate-v1.1<\/code> channel<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;select(.schema==&#34;olm.channel&#34; and .name == &#34;candidate-v1.1&#34;).entries += [{&#34;name&#34; : &#34;testoperator.v1.1.1&#34;}]&#39;<\/span> fbc.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>candidate-v1.1<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>\n<div class=\"alert alert-warning\" role=\"alert\">\n<h4 class=\"alert-heading\">Warning<\/h4>\n<p>This example illustrates how it is possible to inadvertently create multiple channel heads\n<code>opm validate<\/code> result for this output would be:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>FATA<span style=\"color:#ce5c00;font-weight:bold\">[<\/span>0000<span style=\"color:#ce5c00;font-weight:bold\">]<\/span> invalid index:\n<\/span><\/span><span style=\"display:flex;\"><span>\u2514\u2500\u2500 invalid package <span style=\"color:#4e9a06\">&#34;testoperator&#34;<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> \u2514\u2500\u2500 invalid channel <span style=\"color:#4e9a06\">&#34;candidate-v1.1&#34;<\/span>:\n<\/span><\/span><span style=\"display:flex;\"><span> \u251c\u2500\u2500 multiple channel heads found in graph: testoperator.v1.1.0, testoperator.v1.1.1\n<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n<h4 id=\"basic\">basic<\/h4>\n<p>Add a new <code>testoperator.v0.2.1<\/code> bundle pullspec to the existing <code>stable<\/code> channel<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;select(.schema == &#34;olm.template.basic&#34;).entries[] |= select(.schema == &#34;olm.channel&#34; and .name == &#34;stable&#34;).entries += [{&#34;name&#34; : &#34;testoperator.v0.2.1&#34;, &#34;replaces&#34;: &#34;testoperator.v0.2.0&#34;}]&#39;<\/span> basic.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>stable<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"semver\">semver<\/h4>\n<p>Add a new <code>testoperator.v1.1.1<\/code> bundle pullspec to the <code>Candidate<\/code> channel archetype<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;.candidate.bundles += [{&#34;image&#34; : &#34;quay.io\/organization\/testoperator:v1.1.1&#34;}]&#39;<\/span> semver.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>Candidate<\/code> archetype contents:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">candidate<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"adding-a-new-replaces-link-between-two-existing-bundles\">Adding a new &lsquo;replaces&rsquo; link between two existing bundles<\/h3>\n<div class=\"alert alert-info\" role=\"alert\">\n<h4 class=\"alert-heading\">Note<\/h4>\nThis operation is not possible for the semver template, which exclusively leverages semver ordering to generate an opinonated upgrade graph.\n<\/div>\n<h4 id=\"fbc-1\">FBC<\/h4>\n<p>Adding a new <code>testoperator.v1.1.1<\/code> bundle version edge with a replaces link to its predecessor <code>testoperator.v1.1.0<\/code> version which already exists in the channel.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;select(.schema == &#34;olm.channel&#34; and .name == &#34;candidate-v1.1&#34;).entries += [{&#34;name&#34; : &#34;testoperator:v1.1.1&#34;, &#34;replaces&#34;: &#34;testoperator:v1.1.0&#34;}]&#39;<\/span> fbc.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>candidate-v1.1<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v1.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"basic-1\">basic<\/h4>\n<p>Adding a new <code>testoperator.v0.1.1<\/code> bundle version edge with a replaces link to its predecessor <code>testoperator.v0.1.0<\/code> version which already exists in the channel.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;select(.schema == &#34;olm.template.basic&#34;).entries[] |= select(.schema == &#34;olm.channel&#34; and .name == &#34;stable&#34;).entries += [{&#34;name&#34; : &#34;testoperator:v0.1.1&#34;, &#34;replaces&#34;: &#34;testoperator:v0.1.0&#34;}]&#39;<\/span> basic.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>stable<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v0.1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"removing-a-specific-bundle-version\">Removing a specific bundle version<\/h3>\n<div class=\"alert alert-info\" role=\"alert\">\n<h4 class=\"alert-heading\">Note<\/h4>\nThis operation is not possible for the semver template, which exclusively leverages semver ordering to generate an opinonated upgrade graph.\n<\/div>\n<h4 id=\"fbc-2\">FBC<\/h4>\n<p>Remove the upgrade edge from the example <code>candidate-v1.1<\/code> channel which refers to bundle version <code>testoperator.v1.1.0<\/code>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;del(select(.schema == &#34;olm.channel&#34; and .name == &#34;candidate-v1.1&#34; ).entries[]| select(.name == &#34;testoperator.v1.1.0&#34;))&#39;<\/span> fbc.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>candidate-v1.1<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000;font-weight:bold\">[]<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>\n<div class=\"alert alert-warning\" role=\"alert\">\n<h4 class=\"alert-heading\">Warning<\/h4>\nPlease note that removing the only edge for a channel as in this example will yield an explicitly empty array. This will produce an error in <code>opm validate<\/code>.\n<\/div>\n<h4 id=\"basic-2\">basic<\/h4>\n<p>Remove the upgrade edge from the example <code>stable<\/code> channel which refers to bundle version <code>testoperator.v0.2.0<\/code>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;select(.schema == &#34;olm.template.basic&#34;).entries[] |= del(select(.schema == &#34;olm.channel&#34; and .name == &#34;stable&#34;).entries[]| select(.name == &#34;testoperator.v0.2.0&#34;))&#39;<\/span> basic.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>stable<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"substituting-a-bundle-version-in-the-upgrade-graph\">Substituting a bundle version in the upgrade graph<\/h3>\n<h4 id=\"fbc-3\">FBC<\/h4>\n<p>For all graph edges, replaces instances of <code>testoperator.v1.1.0<\/code> with a different bundle version <code>testoperator.v1.1.0-CVE<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#4e9a06\">&#39;(.. | select(has(&#34;entries&#34;) and .entries[].name == &#34;testoperator.v1.1.0&#34; ).entries[]).name = &#34;testoperator.v1.1.0-cve&#34;&#39;<\/span> fbc.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated channels:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">defaultChannel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.package<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0-cve<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">testoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.1.0-cve<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">fast-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable-v1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"basic-3\">basic<\/h4>\n<p>For all channels, replace instances of <code>testoperator:v0.1.0<\/code> with <code>testoperator:v0.1.0-CVE<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#4e9a06\">&#39;(..| select(. == &#34;testoperator.v0.1.0&#34;)) |=&#34;testoperator.v0.1.0-CVE&#34;&#39;<\/span> basic.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated channels:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0-CVE<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator.v0.1.0-CVE<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"semver-1\">semver<\/h4>\n<p>For all channels, replace instances of <code>quay.io\/organization\/testoperator:v1.1.0<\/code> with <code>quay.io\/organization\/testoperator:v1.1.0-CVE<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#4e9a06\">&#39;(..| select(has(&#34;image&#34;) and .image == &#34;quay.io\/organization\/testoperator:v1.1.0&#34;)).image = &#34;quay.io\/organization\/testoperator:v1.1.0-cve&#34;&#39;<\/span> semver.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated template:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.semver<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">generatemajorchannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">false<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">generateminorchannels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">candidate<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.1.0-cve<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">fast<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.1.0-cve<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">stable<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">bundles<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">image<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">quay.io\/organization\/testoperator:v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"introducing-a-new-replacement-relationship-in-the-upgrade-graph\">Introducing a new replacement relationship in the upgrade graph<\/h3>\n<div class=\"alert alert-info\" role=\"alert\">\n<h4 class=\"alert-heading\">Note<\/h4>\nThis operation is not possible for the semver template, which exclusively leverages semver ordering to generate an opinonated upgrade graph.\n<\/div>\n<h4 id=\"fbc-4\">FBC<\/h4>\n<p>Substitute an existing &lsquo;replaces&rsquo; link target for <code>testoperator.v1.1.0<\/code> with a different bundle version <code>testoperator.v1.0.0<\/code>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;select(.schema == &#34;olm.channel&#34; and .name == &#34;candidate-v1.1&#34;).entries |= [{&#34;name&#34; : &#34;testoperator:v1.1.0&#34;, &#34;replaces&#34;: &#34;testoperator:v1.0.0&#34;}]&#39;<\/span> fbc.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>candidate-v1.1<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate-v1.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h4 id=\"basic-4\">basic<\/h4>\n<p>Substitute an existing &lsquo;replaces&rsquo; link target for <code>testoperator.v0.2.0<\/code> with a different bundle version <code>testoperator.v0.1.5<\/code>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>yq <span style=\"color:#204a87\">eval<\/span> <span style=\"color:#4e9a06\">&#39;.entries[] |= select(.schema == &#34;olm.channel&#34; and .name == &#34;stable&#34;).entries |= [{&#34;name&#34; : &#34;testoperator:v0.2.0&#34;, &#34;replaces&#34;: &#34;testoperator:v0.1.5&#34;}]&#39;<\/span> basic.yaml\n<\/span><\/span><\/code><\/pre><\/div><p>produces updated <code>stable<\/code> channel:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">testoperator:v0.1.5<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: InstallPlan","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/installplan\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/installplan\/","description":"\n<div class=\"alert alert-warning\" role=\"alert\">\n<h4 class=\"alert-heading\">Warning<\/h4>\nThis page is under construction\n<\/div>\n<p>An InstallPlan defines a set of resources to be created in order to install or upgrade to a specific version of a ClusterService defined by a CSV.<\/p>"},{"title":"Docs: Install your operator with OLM","link":"https:\/\/olm.operatorframework.io\/docs\/tasks\/install-operator-with-olm\/","pubDate":"Fri, 30 Apr 2021 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/tasks\/install-operator-with-olm\/","description":"\n<p><a href=\"https:\/\/olm.operatorframework.io\/docs\/tasks\/make-catalog-available-on-cluster\">Once you have a catalog of operators loaded onto the cluster via a <code>CatalogSource<\/code><\/a>, you can install your operator by creating a <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/subscription\"><code>Subscription<\/code><\/a> to a specific <a href=\"https:\/\/olm.operatorframework.io\/docs\/glossary\/#channel\">channel<\/a>.<\/p>\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<p>Before installing an operator into a namespace, you will need to create an <code>OperatorGroup<\/code> that targets the namespaces your operator is planning to watch, to generate the required RBACs for your operator in those namespaces. You can read more about <code>OperatorGroup<\/code> <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorgroup\">here<\/a>.<\/p>\n<blockquote>\n<p>Note: The namespaces targeted by the OperatorGroup must align with the <code>installModes<\/code> specified in the <code>ClusterServiceVersion<\/code> of the operator&rsquo;s package. To know the <code>installModes<\/code> of an operator, inspect the packagemanifest:<\/p>\n<\/blockquote>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>kubectl get packagemanifest &lt;operator-name&gt; -o <span style=\"color:#000\">jsonpath<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#4e9a06\">&#34;{.status.channels[0].currentCSVDesc.installModes}&#34;<\/span>\n<\/span><\/span><\/code><\/pre><\/div><blockquote>\n<p>Note: This document uses a global OperatorGroup in the examples to install operators. To learn more about installing namespaced scoped operators, check out <a href=\"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/operator-scoping-with-operatorgroups\">operator scoping with OperatorGroups<\/a>.<\/p>\n<\/blockquote>\n<h2 id=\"install-your-operator\">Install your operator<\/h2>\n<p>To install an Operator, simply create a <code>Subscription<\/code> for your operator. This represents the intent to subscribe to a stream of available versions of this Operator from a <code>CatalogSource<\/code>:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;name-of-your-subscription&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;namespace-you-want-your-operator-installed-in&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;channel-you-want-to-subscribe-to&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;name-of-your-operator&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;name-of-catalog-operator-is-part-of&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;namespace-that-has-catalog&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">installPlanApproval<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">&lt;Automatic\/Manual&gt;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>You can read more about the <code>Subscription<\/code> object and what the different fields mean <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/subscription\">here<\/a>.<\/p>\n<p>The <code>Subscription<\/code> object creates an <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/installplan\">InstallPlan<\/a>, which is either automatically approved (if <code>sub.spec.installPlanApproval: Automatic<\/code>), or needs to be approved (if <code>sub.spec.installPlanApproval: Manual<\/code>), following which the operator is installed in the namespace you want.<\/p>\n<h2 id=\"example-install-the-latest-version-of-an-operator\">Example: Install the latest version of an Operator<\/h2>\n<p>If you want to install an operator named <code>my-operator<\/code> in the namespace <code>foo<\/code> that is cluster scoped (i.e <code>installModes:AllNamespaces<\/code>), from a catalog named <code>my-catalog<\/code> that is in the namespace <code>olm<\/code>, and you want to subscribe to the channel <code>stable<\/code>,<\/p>\n<p>create a <em>global<\/em> <code>OperatorGroup<\/code> (which selects all namespaces):<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ cat og.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span> apiVersion: operators.coreos.com\/v1\n<\/span><\/span><span style=\"display:flex;\"><span> kind: OperatorGroup\n<\/span><\/span><span style=\"display:flex;\"><span> metadata:\n<\/span><\/span><span style=\"display:flex;\"><span> name: my-group\n<\/span><\/span><span style=\"display:flex;\"><span> namespace: foo\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl apply -f og.yaml\n<\/span><\/span><span style=\"display:flex;\"><span> operatorgroup.operators.coreos.com\/my-group created\n<\/span><\/span><\/code><\/pre><\/div><p>Then, create a subscription for the operator:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ cat sub.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>apiVersion: operators.coreos.com\/v1alpha1\n<\/span><\/span><span style=\"display:flex;\"><span>kind: Subscription\n<\/span><\/span><span style=\"display:flex;\"><span>metadata:\n<\/span><\/span><span style=\"display:flex;\"><span> name: sub-to-my-operator\n<\/span><\/span><span style=\"display:flex;\"><span> namespace: foo\n<\/span><\/span><span style=\"display:flex;\"><span>spec:\n<\/span><\/span><span style=\"display:flex;\"><span> channel: stable\n<\/span><\/span><span style=\"display:flex;\"><span> name: my-operator\n<\/span><\/span><span style=\"display:flex;\"><span> source: my-catalog\n<\/span><\/span><span style=\"display:flex;\"><span> sourceNamespace: olm\n<\/span><\/span><span style=\"display:flex;\"><span> installPlanApproval: Manual\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl apply -f sub.yaml\n<\/span><\/span><span style=\"display:flex;\"><span>subscription.operators.coreos.com\/sub-to-my-operator created\n<\/span><\/span><\/code><\/pre><\/div><p>Since <code>installPlanApproval<\/code> is set to <code>Manual<\/code>, we need to manually go in and approve the <code>InstallPlan<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl get ip -n foo\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>NAME CSV APPROVAL APPROVED\n<\/span><\/span><span style=\"display:flex;\"><span>install-nlwcw my-operator.v0.9.2 Automatic <span style=\"color:#204a87\">false<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl edit ip install-nlwcw -n foo\n<\/span><\/span><\/code><\/pre><\/div><p>And then change the <code>spec.approved<\/code> from <code>false<\/code> to <code>true<\/code>.<\/p>\n<p>This should spin up the <code>ClusterServiceVersion<\/code> of the operator in the <code>foo<\/code> namespace, following which the operator pod will spin up.<\/p>\n<p>To ensure the operator installed successfully, check for the ClusterServiceVersion and the operator deployment in the namespace it was installed in.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl get csv -n &lt;namespace-operator-was-installed-in&gt;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>NAME DISPLAY VERSION REPLACES PHASE\n<\/span><\/span><span style=\"display:flex;\"><span>&lt;name-of-csv&gt; &lt;operator-name&gt; &lt;version&gt; &lt;csv-of-previous-version&gt; Succeeded\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl get deployments -n &lt;namespace-operator-was-installed-in&gt;\n<\/span><\/span><span style=\"display:flex;\"><span>NAME READY UP-TO-DATE AVAILABLE AGE\n<\/span><\/span><span style=\"display:flex;\"><span>&lt;name-of-your-operator&gt; 1\/1 <span style=\"color:#0000cf;font-weight:bold\">1<\/span> <span style=\"color:#0000cf;font-weight:bold\">1<\/span> 9m48s\n<\/span><\/span><\/code><\/pre><\/div><p>If the ClusterServiceVersion fails to show up or does not reach the <code>Succeeded<\/code> phase, please check the <a href=\"https:\/\/olm.operatorframework.io\/docs\/troubleshooting\/clusterserviceversion\/\">troubleshooting documentation<\/a> to debug your installation.<\/p>\n<h2 id=\"example-install-a-specific-version-of-an-operator\">Example: Install a specific version of an Operator<\/h2>\n<p>If you want to install a particular version of your Operator, specify the <code>startingCSV<\/code> property in your <code>Subscription<\/code> like so:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">sub-to-my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">foo<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-catalog<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">installPlanApproval<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Manual<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">startingCSV<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#0000cf;font-weight:bold\">1.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Notice that <code>approval<\/code> has been set to <code>Manual<\/code> as well in order to keep OLM from immediately updating your Operator, if <code>1.1.0<\/code> happens to be superseded by a newer version in <code>my-catalog<\/code>. Follow the instructions from the <a href=\"#example-install-the-latest-version-of-an-operator\">previous example<\/a> to approve the initial <code>InstallPlan<\/code> for this <code>Subscription<\/code>, so <code>1.1.0<\/code> is allowed to be installed.<\/p>\n<p>If your intent is to pin an installed Operator to the particular version <code>1.1.0<\/code> you don&rsquo;t need to do anything. After approving the initial <code>InstallPlan<\/code> OLM will install version <code>1.1.0<\/code> of your Operator and keep it at that version. When updates are discovered in the catalog, OLM will wait not proceed unless you manually approve the update.<\/p>"},{"title":"Docs: OperatorGroup","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorgroup\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/operatorgroup\/","description":"\n<p>An OperatorGroup is an OLM resource that provides rudimentary multitenant configuration to OLM installed operators.<\/p>\n<h2 id=\"overview\">Overview<\/h2>\n<ul>\n<li>An <code>OperatorGroup<\/code> selects a set of target namespaces in which to generate required RBAC access for its member operators.<\/li>\n<li>The set of target namespaces is provided via a comma-delimited string stored in the <code>olm.targetNamespaces<\/code> annotation. This annotation is applied to member operator&rsquo;s <code>ClusterServiceVersion<\/code> (CSV) instances and is projected into their deployments. It is accessible to operator containers using <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/inject-data-application\/downward-api-volume-expose-pod-information\/\">The Downward API<\/a><\/li>\n<li>An operator is said to be a <a href=\"#membership\">member of an <code>OperatorGroup<\/code><\/a> if its CSV exists in the same namespace as the <code>OperatorGroup<\/code> and its CSV&rsquo;s <a href=\"#installmodes-and-supported-operatorgroups\"><code>InstallModes<\/code> support the set of namespaces targeted by the <code>OperatorGroup<\/code><\/a><\/li>\n<li>In order to transition, a CSV must be an active member of an <code>OperatorGroup<\/code> that has no <a href=\"#operatorgroup-intersection\">provided API conflicts with intersecting <code>OperatorGroups<\/code><\/a><\/li>\n<\/ul>\n<h2 id=\"membership\">Membership<\/h2>\n<p>An operator defined by CSV <code>csv-a<\/code> is said to be a <em>member<\/em> of <code>OperatorGroup<\/code> <code>op-a<\/code> in namespace <code>ns-a<\/code> if both of the following hold:<\/p>\n<ul>\n<li><code>op-a<\/code> is the only <code>OperatorGroup<\/code> in <code>ns-a<\/code><\/li>\n<li><code>csv-a<\/code>&rsquo;s <code>InstallMode<\/code>s support <code>op-a<\/code>&rsquo;s target namespace set<\/li>\n<\/ul>\n<h3 id=\"toomanyoperatorgroups\">TooManyOperatorGroups<\/h3>\n<p>If there exists more than one <code>OperatorGroup<\/code> in a single namespace, any CSV created in that namespace will transition to a failure state with reason <code>TooManyOperatorGroups<\/code>. CSVs in a failed state for this reason will transition to pending once the number of <code>OperatorGroup<\/code>s in their namespaces reaches one.<\/p>\n<h3 id=\"installmodes-and-supported-operatorgroups\">InstallModes and Supported OperatorGroups<\/h3>\n<p>An <code>InstallMode<\/code> consists of an <code>InstallModeType<\/code> field and a boolean <code>Supported<\/code> field. A CSV&rsquo;s spec can contain a set of <code>InstallModes<\/code> of four distinct <code>InstallModeTypes<\/code>:<\/p>\n<ul>\n<li><code>OwnNamespace<\/code>: If supported, the operator can be a member of an <code>OperatorGroup<\/code> that selects its own namespace<\/li>\n<li><code>SingleNamespace<\/code>: If supported, the operator can be a member of an <code>OperatorGroup<\/code> that selects one namespace<\/li>\n<li><code>MultiNamespace<\/code>: If supported, the operator can be a member of an <code>OperatorGroup<\/code> that selects more than one namespace<\/li>\n<li><code>AllNamespaces<\/code>: If supported, the operator can be a member of an <code>OperatorGroup<\/code> that selects all namespaces (target namespace set is the empty string &ldquo;&rdquo;)<\/li>\n<\/ul>\n<blockquote>\n<p>Note: If a CSV&rsquo;s spec omits an entry of <code>InstallModeType<\/code>, that type is considered unsupported unless support can be inferred by an existing entry that implicitly supports it.<\/p>\n<\/blockquote>\n<h3 id=\"unsupportedoperatorgroup\">UnsupportedOperatorGroup<\/h3>\n<p>If a CSV&rsquo;s <code>InstallMode<\/code>s do not support the target namespace selection of the <code>OperatorGroup<\/code> in its namespace, the CSV will transition to a failure state with reason <code>UnsupportedOperatorGroup<\/code>. CSVs in a failed state for this reason will transition to pending once either the <code>OperatorGroups<\/code>&rsquo;s target namespace selection changes to a supported configuration, or the CSV&rsquo;s <code>InstallMode<\/code>s are modified to support the <code>OperatorGroup<\/code>&rsquo;s target namespace selection.<\/p>\n<h2 id=\"target-namespace-selection\">Target Namespace Selection<\/h2>\n<p>Select the set of namespaces by specifying a label selector with the <code>spec.selector<\/code> field:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">selector<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">cool.io\/prod<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;true&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>or by explicitly naming target namespaces with the <code>spec.targetNamespaces<\/code> field:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetNamespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">my-other-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">my-other-other-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><blockquote>\n<p>Note: If both <code>spec.targetNamespaces<\/code> and <code>spec.selector<\/code> are defined, <code>spec.selector<\/code> is ignored.<\/p>\n<\/blockquote>\n<p>Additionally, a <em>global<\/em> <code>OperatorGroup<\/code> (which selects all namespaces) is specified by omitting both <code>spec.selector<\/code> and <code>spec.targetNamespaces<\/code>:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-group<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-namespace<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The resolved set of selected namespaces is surfaced in an <code>OperatorGroup<\/code>&rsquo;s <code>status.namespaces<\/code> field. A global <code>OperatorGroup<\/code>&rsquo;s <code>status.namespace<\/code> is of length 1 and contains the empty string, <code>&quot;&quot;<\/code>, which signals a consuming operator that it should watch all namespaces.<\/p>\n<blockquote>\n<p>Note: The consuming operator must know to treat <code>&quot;&quot;<\/code> as an all namespace configuration.<\/p>\n<\/blockquote>\n<h2 id=\"operatorgroup-csv-annotations\">OperatorGroup CSV Annotations<\/h2>\n<p>Member CSVs of an <code>OperatorGroup<\/code> get the following annotations:<\/p>\n<ul>\n<li><code>olm.operatorGroup=&lt;group-name&gt;<\/code>\n<ul>\n<li>Contains the name of the <code>OperatorGroup<\/code><\/li>\n<\/ul>\n<\/li>\n<li><code>olm.operatorGroupNamespace=&lt;group-namespace&gt;<\/code>\n<ul>\n<li>Contains the namespace of the <code>OperatorGroup<\/code><\/li>\n<\/ul>\n<\/li>\n<li><code>olm.targetNamespaces=&lt;target-namespaces&gt;<\/code>\n<ul>\n<li>Contains a comma-delimited string listing the <code>OperatorGroup<\/code>&rsquo;s target namespace selection. This annotation is projected onto the pod template of a CSV&rsquo;s deployments and can be consumed by a pod instance via <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/inject-data-application\/downward-api-volume-expose-pod-information\/\">The Downward API<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<blockquote>\n<p>Note: All annotations except <code>olm.targetNamespaces<\/code> are included with <a href=\"#copied-csvs\">copied CSVs<\/a>. Omitting the <code>olm.targetNamespaces<\/code> annotation on copied CSVs prevents the names of target namespaces from being leaked between tenants.<\/p>\n<\/blockquote>\n<h2 id=\"provided-apis-annotation\">Provided APIs Annotation<\/h2>\n<p>Information about what <code>GroupVersionKinds<\/code>s (GVK) are provided by an <code>OperatorGroup<\/code> are surfaced in an <code>olm.providedAPIs<\/code> annotation. The annotation&rsquo;s value is a string consisting of a set of <code>&lt;Kind&gt;.&lt;version&gt;.&lt;group&gt;<\/code>s delimited with commas. The GVKs of CRDs and APIServices provided by all active member CSVs of an <code>OperatorGroup<\/code> are included.<\/p>\n<p>Here&rsquo;s an example of an <code>OperatorGroup<\/code> with a single active member CSV providing the PackageManifests resource:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">annotations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">olm.providedAPIs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">PackageManifest.v1.packages.operators.coreos.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">local<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">...<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">selector<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>{}<span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">serviceAccount<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">creationTimestamp<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">null<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">targetNamespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">local<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">status<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">lastUpdated<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">2019-02-19T16:18:28Z<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">local<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"rbac\">RBAC<\/h2>\n<p>When an <code>OperatorGroup<\/code> is created, 3 ClusterRoles each containing a single AggregationRule are generated:<\/p>\n<ul>\n<li>\n<p><code>&lt;operatorgroup-name&gt;-admin<\/code><\/p>\n<ul>\n<li>ClusterRoleSelector set to match the <code>olm.opgroup.permissions\/aggregate-to-admin: &lt;operatorgroup-name&gt;<\/code> label<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><code>&lt;operatorgroup-name&gt;-edit<\/code><\/p>\n<ul>\n<li>ClusterRoleSelector set to match the <code>olm.opgroup.permissions\/aggregate-to-edit: &lt;operatorgroup-name&gt;<\/code> label<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><code>&lt;operatorgroup-name&gt;-view<\/code><\/p>\n<ul>\n<li>ClusterRoleSelector set to match the <code>olm.opgroup.permissions\/aggregate-to-view: &lt;operatorgroup-name&gt;<\/code> label<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>When a CSV becomes an active member of an <code>OperatorGroup<\/code> and is not in a failed state with reason InterOperatorGroupOwnerConflict, the following RBAC resources are generated:<\/p>\n<ul>\n<li>\n<p>For each provided API resource from a CRD:<\/p>\n<ul>\n<li>A <code>&lt;kind&gt;.&lt;group&gt;-&lt;version&gt;-admin<\/code> ClusterRole is generated with the <code>*<\/code> verb on <code>&lt;group&gt;<\/code> <code>&lt;kind&gt;<\/code> with aggregation labels <code>rbac.authorization.k8s.io\/aggregate-to-admin: true<\/code> and <code>olm.opgroup.permissions\/aggregate-to-admin: &lt;operatorgroup-name&gt;<\/code><\/li>\n<li>A <code>&lt;kind&gt;.&lt;group&gt;-&lt;version&gt;-edit<\/code> ClusterRole is generated with the <code>create, update, patch, delete<\/code> verbs on <code>&lt;group&gt;<\/code> <code>&lt;kind&gt;<\/code> with aggregation labels <code>rbac.authorization.k8s.io\/aggregate-to-edit: true<\/code> and <code>olm.opgroup.permissions\/aggregate-to-edit: &lt;operatorgroup-name&gt;<\/code><\/li>\n<li>A <code>&lt;kind&gt;.&lt;group&gt;-&lt;version&gt;-view<\/code> ClusterRole is generated with the <code>get, list, watch<\/code> verbs on <code>&lt;group&gt;<\/code> <code>&lt;kind&gt;<\/code> with aggregation labels <code>rbac.authorization.k8s.io\/aggregate-to-view: true<\/code> and <code>olm.opgroup.permissions\/aggregate-to-view: &lt;operatorgroup-name&gt;<\/code><\/li>\n<li>A <code>&lt;kind&gt;.&lt;group&gt;-&lt;version&gt;-view-crdview<\/code> ClusterRole is generated with the <code>get<\/code> verb on <code>apiextensions.k8s.io<\/code> <code>customresourcedefinitions<\/code> <code>&lt;crd-name&gt;<\/code> with aggregation labels <code>rbac.authorization.k8s.io\/aggregate-to-view: true<\/code> and <code>olm.opgroup.permissions\/aggregate-to-view: &lt;operatorgroup-name&gt;<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\n<p>For each provided API resource from an APIService:<\/p>\n<ul>\n<li>A <code>&lt;kind&gt;.&lt;group&gt;-&lt;version&gt;-admin<\/code> ClusterRole is generated with the <code>*<\/code> verb on <code>&lt;group&gt;<\/code> <code>&lt;kind&gt;<\/code> with aggregation labels <code>rbac.authorization.k8s.io\/aggregate-to-admin: true<\/code> and <code>olm.opgroup.permissions\/aggregate-to-admin: &lt;operatorgroup-name&gt;<\/code><\/li>\n<li>A <code>&lt;kind&gt;.&lt;group&gt;-&lt;version&gt;-edit<\/code> ClusterRole is generated with the <code>create, update, patch, delete<\/code> verbs on <code>&lt;group&gt;<\/code> <code>&lt;kind&gt;<\/code> with aggregation labels <code>rbac.authorization.k8s.io\/aggregate-to-edit: true<\/code> and <code>olm.opgroup.permissions\/aggregate-to-edit: &lt;operatorgroup-name&gt;<\/code><\/li>\n<li>A <code>&lt;kind&gt;.&lt;group&gt;-&lt;version&gt;-view<\/code> ClusterRole is generated with the <code>get, list, watch<\/code> verbs on <code>&lt;group&gt;<\/code> <code>&lt;kind&gt;<\/code> with aggregation labels <code>rbac.authorization.k8s.io\/aggregate-to-view: true<\/code> and <code>olm.opgroup.permissions\/aggregate-to-view: &lt;operatorgroup-name&gt;<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\n<p>If |target namespaces| == 1 and contains <code>*<\/code>:<\/p>\n<ul>\n<li>A ClusterRole and corresponding ClusterRoleBinding are generated for each permission defined in the CSV&rsquo;s permissions field. All resources generated are given the <code>olm.owner: &lt;csv-name&gt;<\/code> and <code>olm.owner.namespace: &lt;csv-namespace&gt;<\/code> labels<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Else for each target namespace:<\/p>\n<ul>\n<li>All Roles and RoleBindings in the operator namespace with the <code>olm.owner: &lt;csv-name&gt;<\/code> and <code>olm.owner.namespace: &lt;csv-namespace&gt;<\/code> labels are copied into the target namespace.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 id=\"copied-csvs\">Copied CSVs<\/h2>\n<p>OLM will create copies of all active member CSVs of an <code>OperatorGroup<\/code> in each of that <code>OperatorGroup<\/code>&rsquo;s target namespaces. The purpose of a Copied CSV is to tell users of a target namespace that a specific operator is configured to watch resources created there. Copied CSVs have a status reason <em>Copied<\/em> and are updated to match the status of their source CSV. The <code>olm.targetNamespaces<\/code> annotation is stripped from copied CSVs before they are created on the cluster. Omitting the target namespace selection avoids an unnecessary information leak. Copied CSVs are deleted when their source CSV no longer exists or the operator group their source CSV belongs to no longer targets the copied CSV&rsquo;s namespace.<\/p>\n<h2 id=\"static-operatorgroups\">Static OperatorGroups<\/h2>\n<p>An <code>OperatorGroup<\/code> is <em>static<\/em> if it&rsquo;s <code>spec.staticProvidedAPIs<\/code> field is set to <strong>true<\/strong>. As a result, OLM does not modify the OperatorGroups&rsquo;s <code>olm.providedAPIs<\/code> annotation, which means that it can be set in advance. This is useful when a user wishes to use an <code>OperatorGroup<\/code> to prevent resource contention in a set of namespaces, but does not have active member CSVs that provide the APIs for those resources.<\/p>\n<p>Here&rsquo;s an example of an <code>OperatorGroup<\/code> that &ldquo;protects&rdquo; prometheus resources in all namespaces with the <code>something.cool.io\/cluster-monitoring: &quot;true&quot;<\/code> annotation:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">OperatorGroup<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">cluster-monitoring<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">cluster-monitoring<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">annotations<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">olm.providedAPIs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Alertmanager.v1.monitoring.coreos.com,Prometheus.v1.monitoring.coreos.com,PrometheusRule.v1.monitoring.coreos.com,ServiceMonitor.v1.monitoring.coreos.com<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">staticProvidedAPIs<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">true<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">selector<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">matchLabels<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">something.cool.io\/cluster-monitoring<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;true&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"operatorgroup-intersection\">OperatorGroup Intersection<\/h2>\n<h3 id=\"operatorgroup-intersection-terminology\">OperatorGroup Intersection Terminology<\/h3>\n<ul>\n<li>Two <code>OperatorGroup<\/code>s are said to be <em>intersecting<\/em> if the intersection of their target namespace sets <strong>is not the empty set<\/strong><\/li>\n<li>Two <code>OperatorGroup<\/code>s are said to have <em>intersecting provided APIs<\/em> if they are <strong>intersecting<\/strong> and the intersection of their provided API sets (defined by <code>olm.providedAPIs<\/code> annotations) <strong>is not the empty set<\/strong><\/li>\n<\/ul>\n<h3 id=\"what-can-go-wrong\">What Can Go Wrong?<\/h3>\n<p><code>OperatorGroup<\/code>s with <em>intersecting provided APIs<\/em> can compete for the same resources in the set of intersecting namespaces.<\/p>\n<h3 id=\"rules-for-intersection\">Rules for Intersection<\/h3>\n<p>Each time an active member CSV syncs, OLM queries the cluster for the set of <em>intersecting provided APIs<\/em> between the CSV&rsquo;s <code>OperatorGroup<\/code> and all others. OLM then checks if that set <strong>is the empty set<\/strong>:<\/p>\n<ul>\n<li>If <strong>true<\/strong> and the CSV&rsquo;s provided APIs <strong>are a subset<\/strong> of the <code>OperatorGroup<\/code>&rsquo;s:\n<ul>\n<li>Continue transitioning<\/li>\n<\/ul>\n<\/li>\n<li>If <strong>true<\/strong> and the CSV&rsquo;s provided APIs <strong>are not a subset<\/strong> of the <code>OperatorGroup<\/code>&rsquo;s:\n<ul>\n<li>If the <code>OperatorGroup<\/code> <a href=\"#static-operatorgroups\"><strong>is static<\/strong><\/a>:\n<ul>\n<li>Clean up any deployments that belong to the CSV<\/li>\n<li>Transition the CSV to a failed state with status reason CannotModifyStaticOperatorGroupProvidedAPIs<\/li>\n<\/ul>\n<\/li>\n<li>Else:\n<ul>\n<li>Replace the <code>OperatorGroup<\/code>&rsquo;s <code>olm.providedAPIs<\/code> annotation with the union of itself and the CSV&rsquo;s provided APIs<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>If <strong>false<\/strong> and the CSV&rsquo;s provided APIs <strong>are not a subset<\/strong> of the <code>OperatorGroup<\/code>&rsquo;s:\n<ul>\n<li>Clean up any deployments that belong to the CSV<\/li>\n<li>Transition the CSV to a failed state with status reason InterOperatorGroupOwnerConflict<\/li>\n<\/ul>\n<\/li>\n<li>If <strong>false<\/strong> and the CSV&rsquo;s provided APIs <strong>are a subset<\/strong> of the <code>OperatorGroup<\/code>&rsquo;s:\n<ul>\n<li>If the <code>OperatorGroup<\/code> <a href=\"#static-operatorgroups\"><strong>is static<\/strong><\/a>:\n<ul>\n<li>Clean up any deployments that belong to the CSV<\/li>\n<li>Transition the CSV to a failed state with status reason CannotModifyStaticOperatorGroupProvidedAPIs<\/li>\n<\/ul>\n<\/li>\n<li>Else:\n<ul>\n<li>Replace the <code>OperatorGroup<\/code>&rsquo;s <code>olm.providedAPIs<\/code> annotation with the difference between itself and the CSV&rsquo;s provided APIs<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<blockquote>\n<p>Note: Failure states caused by <code>OperatorGroup<\/code>s are non-terminal.\nNote: When checking intersection rules, an <code>OperatorGroup<\/code>&rsquo;s namespace is always included as part of its selected target namespaces.<\/p>\n<\/blockquote>\n<p>Each time an <code>OperatorGroup<\/code> syncs:<\/p>\n<ul>\n<li>The set of provided APIs from active member CSV&rsquo;s is calculated from the cluster (ignoring <a href=\"#copied-csvs\">copied CSVs<\/a>)<\/li>\n<li>The cluster set is compared to <code>olm.providedAPIs<\/code>:\n<ul>\n<li>If <code>olm.providedAPIs<\/code> contains any extraneous provided APIs:\n<ul>\n<li><code>olm.providedAPIs<\/code> is pruned of any extraneous provided APIs (not provided on cluster)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>All CSVs that provide the same APIs across all namespaces (including those removed) are requeued. This notifies conflicting CSVs in intersecting groups that their conflict has possibly been resolved, either through resizing or through deletion of the conflicting CSV.<\/li>\n<\/ul>"},{"title":"Docs: Creating an update graph with OLM","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/","pubDate":"Mon, 14 Dec 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/","description":"\n<blockquote>\n<p>Note: This document discusses creating an upgrade graph for your operator using plaintext files to store catalog metadata, which is the <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\">latest feature<\/a> of OLM catalogs. If you are looking to create an upgrade graph for your operator using the deprecated sqllite database format to store catalog metadata instead, please read the <a href=\"https:\/\/v0-18-z.olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/\">v0.18.z version<\/a> of this doc instead.<\/p>\n<\/blockquote>\n<h1 id=\"creating-an-update-graph\">Creating an Update Graph<\/h1>\n<p>OLM provides a variety of ways to specify updates between operator versions.<\/p>\n<h2 id=\"methods-for-specifying-updates\">Methods for Specifying Updates<\/h2>\n<p>All update graphs are defined in <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\">file-based catalogs<\/a> via <code>olm.channel<\/code> blobs. Each <code>olm.channel<\/code> defines the set of\nbundles present in the channel and the update graph edges between each entry in the channel.\nNote that: In FBC, the upgrade edge metadata in bundles\/CSVs is ignored, the source of truth for upgrade edges is the catalog itself.<\/p>\n<h3 id=\"replaces\">Replaces<\/h3>\n<p>For explicit updates from one operator version to another, you can specify the operator name to replace in your channel entry as\nsuch:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Note that it is not required for there to be an entry for <code>myoperator.v1.0.0<\/code> in the catalog as long as\nother channel invariants (verified by <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\/#opm-validate\"><code>opm validate<\/code><\/a>) still hold. Generally, this means that the tail of the channel&rsquo;s\n<code>replaces<\/code> chain can replace a bundle that is not present in the catalog.<\/p>\n<p>An update sequence of bundles created via <code>replaces<\/code> will have updates step through each version in\nthe chain. For example, given<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-txt\" data-lang=\"txt\"><span style=\"display:flex;\"><span>myoperator.v1.0.0 -&gt; myoperator.v1.0.1 -&gt; myoperator.v1.0.2\n<\/span><\/span><\/code><\/pre><\/div><p>A subscription on <code>myoperator.v1.0.0<\/code> will update to <code>myoperator.v1.0.2<\/code> through <code>myoperator.v1.0.1<\/code>.<\/p>\n<p>Installing from the UI today will always install the latest of a given channel. However, installing\nspecific versions is possible with this update graph by modifying the <code>startingCSV<\/code> field\nof the subscription to point to the desired operator name. Note that, in this case, the subscription will\nneed its <code>approval<\/code> field set to <code>Manual<\/code> to ensure that the subscription does not auto-update and\ninstead stays pinned to the specified version.<\/p>\n<h3 id=\"skips\">Skips<\/h3>\n<p>In order to skip through certain updates, you can specify a list of operator names to be skipped. For example:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v1.0.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v1.0.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">myoperator.v1.0.1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">myoperator.v1.0.2<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Using the above graph, this will mean subscriptions on <code>myoperator.v1.0.0<\/code> can update directly to\n<code>myoperator.v1.0.3<\/code> without going through <code>myoperator.v1.0.1<\/code> or <code>myoperator.v1.0.2<\/code>. Installs\nthat are already on <code>myoperator.v1.0.1<\/code> or <code>myoperator.v1.0.2<\/code> will still be able to update to\n<code>myoperator.v1.0.3<\/code>.<\/p>\n<p>This is particularly useful if <code>myoperator.v1.0.1<\/code> and <code>myoperator.v1.0.2<\/code> are affected by a CVE\nor contain bugs.<\/p>\n<p>Skipped operators do not need to be present in a catalog or set of manifests prior to adding to a catalog.<\/p>\n<h3 id=\"skiprange\">SkipRange<\/h3>\n<p>OLM also allows you to specify updates through version ranges in your channel entry. This requires your CSVs\nto define a version in their version field which must follow the <a href=\"https:\/\/semver.org\/\">semver spec<\/a>.\nInternally, OLM uses the <a href=\"https:\/\/github.com\/blang\/semver\">blang\/semver<\/a> go library.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v1.0.3<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skipRange<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#4e9a06\">&#34;&gt;=1.0.0 &lt;1.0.3&#34;<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The entry specifying the <code>skipRange<\/code> will be presented as a direct (one hop) update to\nany version from that package within that range. The versions in this range do not need to be in\nthe catalog in order for bundle addition to be successful. We recommend avoiding using unbound ranges\nsuch as <code>&lt;1.0.3<\/code>.<\/p>\n<p><strong>WARNING:<\/strong> As a consequence of using <code>skipRange<\/code> the skipped operator versions will be pruned from OLMs\nupdate graph and therefore will not be installable anymore by users with the <code>spec.startingCSV<\/code> property\nof <code>Subscriptions.<\/code> Use with caution. If you want to have direct (one hop) updates to this version from\nmultiple previous versions but keep those previous versions available to users for install, always use\n<code>skipRange<\/code> in conjunction with <code>replaces<\/code> pointing to the immediate previous version of the operator\nversion in question.<\/p>\n<p>SkipRange by itself is useful for teams who are not interested in supporting directly installing\nversions within a given range or for whom consumers of the operator are always on the latest\nversion.<\/p>\n<h2 id=\"channel-guidelines\">Channel Guidelines<\/h2>\n<h3 id=\"cross-channel-updates\">Cross channel updates<\/h3>\n<p>Cross channel updates are not possible today in an automated way. In order for your subscription\nto switch channels, the cluster admin must manually change the <code>channel<\/code> field in the subscription\nobject.<\/p>\n<p>Changing this field does not always result in receiving updates from that channel. For that to\noccur, updates paths must be available from the given version to versions in the new channel.<\/p>\n<h4 id=\"if-using-replaces\">If using replaces<\/h4>\n<p>The CSV name currently installed must be in the <code>replaces<\/code> field of an entry in the new channel.<\/p>\n<h4 id=\"if-using-skips\">If using skips<\/h4>\n<p>The CSV name currently installed must be in the <code>skips<\/code> field of an entry in the new channel.<\/p>\n<h4 id=\"if-using-skiprange\">If using skipRange<\/h4>\n<p>The version currently installed must be in the <code>skipRange<\/code> field of an entry in the new channel.<\/p>\n<h2 id=\"channel-promotion\">Channel Promotion<\/h2>\n<p>A popular channel strategy is to use <code>alpha<\/code>, <code>beta<\/code>, and <code>stable<\/code> channels, where every new bundle is added to <code>alpha<\/code>,\na subset of bundles from <code>alpha<\/code> are promoted to <code>beta<\/code>, and a further subset of bundles from <code>beta<\/code> are promoted to\n<code>stable<\/code>.<\/p>\n<p>An operator author wishing to employ the <code>alpha<\/code>\/<code>beta<\/code>\/<code>stable<\/code> channel strategy may have created and updated their\n<code>olm.channel<\/code> blobs following the below scenario.<\/p>\n<p>First, an operator author releases a few versions into the <code>alpha<\/code> channel, with a simple linear replaces chain.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Next, an operator author decides that <code>myoperator.v0.2.0<\/code> is a good candidate to promote to <code>beta<\/code>, so they add a new\n<code>olm.channel<\/code> schema and include <code>myoperator.v0.2.0<\/code> as the first entry, taking care to preserve any upgrade edges from\n<code>alpha<\/code> to enable users to switch from the <code>alpha<\/code> to the <code>beta<\/code> channel if they have <code>myoperator.v0.1.0<\/code> installed.<\/p>\n<blockquote>\n<p>NOTE: This bundle already exists in the catalog (the image was already built and pushed, and the catalog already contains\nan <code>olm.bundle<\/code> blob and an entry for it in the <code>alpha<\/code> channel). The channel promotion step for <code>myoperator.v0.2.0<\/code>\nis to simply create a new <code>olm.channel<\/code> for the <code>beta<\/code> channel and include an entry for <code>myoperator.v0.2.0<\/code>.<\/p>\n<\/blockquote>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">beta<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The operator continues releasing bundles to <code>alpha<\/code> and promotes <code>myoperator.v0.4.0<\/code> to <code>beta<\/code>.<\/p>\n<blockquote>\n<p>NOTE: In channel <code>alpha<\/code>, <code>myoperator.v0.4.0<\/code> replaces <code>myoperator.v0.3.0<\/code>, but in channel <code>beta<\/code>, <code>myoperator.v0.4.0<\/code>\nreplaces <code>myoperator.v0.2.0<\/code> because the <code>beta<\/code> channel does not include every entry from alpha.<\/p>\n<\/blockquote>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.5.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">beta<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>Finally, the operator author releases several more bundles and makes several more promotions, finally deciding to\npromote <code>myoperator.v0.4.0<\/code> to the stable channel. With <code>myoperator.v0.4.0<\/code> being the first entry in the <code>stable<\/code>\nchannel, the operator author has decided to add <code>replaces<\/code> and <code>skips<\/code> edges for all previously released bundles to\nassist users in moving to the <code>stable<\/code> channel directly from the <code>alpha<\/code> and <code>beta<\/code> channels. However, it would have\nbeen equally valid to require that a user have either <code>myoperator.v0.2.0<\/code> or <code>myoperator.v0.3.0<\/code> installed (e.g. if the\ndirect upgrade from <code>myoperator.v0.1.0<\/code> has not been tested or is known to be unsupported).<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">alpha<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.5.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.6.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.5.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">beta<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.6.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#000\">---<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">schema<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">olm.channel<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">package<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">stable<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">entries<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.4.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">replaces<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">myoperator.v0.1.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">skips<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">myoperator.v0.2.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span>- <span style=\"color:#000\">myoperator.v0.3.0<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: Uninstall your operator","link":"https:\/\/olm.operatorframework.io\/docs\/tasks\/uninstall-operator\/","pubDate":"Wed, 25 Mar 2020 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/tasks\/uninstall-operator\/","description":"\n<p>When uninstalling an operator managed by OLM, a Cluster Admin must decide whether or not to remove the <code>CustomResourceDefinitions (CRD)<\/code>, <code>APIServices<\/code>, and resources related to these types owned by the operator. By design, when OLM uninstalls an operator it does not remove any of the operator&rsquo;s owned <code>CRDs<\/code>, <code>APIServices<\/code>, or <code>CRs<\/code> in order to prevent data loss. Instead, it is left to the Cluster Admin to remove any unwanted types and resources from the cluster. This document will discuss the steps a Cluster Admin should take when uninstalling an operator.<\/p>\n<h2 id=\"step-1-identifying-resources-to-remove\">Step 1: Identifying Resources to Remove<\/h2>\n<p>The cluster admin should first understand which types (<code>CRDs<\/code> and <code>APIServices<\/code>) are owned by the operator, which is available in the operator&rsquo;s <code>ClusterServiceVersion (CSV)<\/code> under the <code>spec.customresourcedefinitions.owned<\/code> and <code>spec.apiservicedefinitions.owned<\/code> arrays. It is likely that users have created resources for these types since the operator was installed. The cluster admin should should decide which of these resources to delete on a case-by-case basis. If the resource is not required, delete it. The Cluster Admin should delete all unwanted resources before moving to the next step.<\/p>\n<blockquote>\n<p>Note: Although deleting the <code>CRD<\/code> or <code>APIService<\/code> removes all resource of the type from the cluster, this action may lead to unintended consequences. Operators often use <a href=\"https:\/\/book.kubebuilder.io\/reference\/using-finalizers.html\">finalizers<\/a> to execute application specific cleanup routines before removing the <code>CR<\/code>. If the API is removed, the operator will be unable to properly remove the resource, and the cluster may appear to be &ldquo;stuck&rdquo; as defined in this <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/60807\">Kubernetes issue<\/a>.<\/p>\n<\/blockquote>\n<h2 id=\"step-2-unsubscribe-from-the-operator\">Step 2: Unsubscribe from the Operator<\/h2>\n<p>OLM uses the <code>Subscription<\/code> resource to convey a user&rsquo;s intent to subscribe to the latest version of an operator. If the operator was installed with Automatic Updates (<code>spec.InstallPlanApproval: &quot;Automatic&quot;<\/code>), OLM will reinstall a new version of the operator even if the operator&rsquo;s <code>CSV<\/code> was deleted earlier. In effect, you must tell OLM that you do not want new versions of the operator to be installed by deleting the <code>Subscription<\/code> associated with the operator. It should be noted that opting out of future upgrades by deleting a <code>Subscription<\/code> does not delete the associated <code>CSV<\/code> as this ensures that a specific version of the operator is available on cluster and is never upgraded.<\/p>\n<p>You can list existing <code>Subscription<\/code> in a specific namespace with the following <code>kubectl<\/code> command:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl get subscription -n &lt;namespace&gt;\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Example output<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>NAME PACKAGE SOURCE CHANNEL\n<\/span><\/span><span style=\"display:flex;\"><span>foo-sub foo foo-catalog alpha\n<\/span><\/span><\/code><\/pre><\/div><blockquote>\n<p>Note: The name of the operator installed by the <code>Subscription<\/code> is available under the <code>Package<\/code> column.<\/p>\n<\/blockquote>\n<p>The <code>Subscription<\/code> can be deleted by running this command:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>kubectl delete subscription &lt;subscription-name&gt; -n &lt;namespace&gt;\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"step-3-delete-the-operators-clusterserviceversion-csv\">Step 3: Delete the Operator&rsquo;s ClusterServiceVersion (CSV)<\/h2>\n<p>The <code>CSV<\/code> contains all the information that OLM needs to manage an operator, and it effectively represents an operator that is installed on cluster. By deleting a <code>CSV<\/code>, OLM will delete the resources it created for the operator such as the <code>deployment<\/code>, <code>RBAC<\/code>, and any corresponding <code>CSVs<\/code> that OLM &ldquo;Copied&rdquo; into other namespaces watched by the operator.<\/p>\n<p>Note that deleting a CSV only deletes objects derived from the CSV and does not delete objects from the bundle. For example, while RBAC resources derived from the CSV&rsquo;s <code>permissions<\/code> and <code>clusterPermissions<\/code> fields will be deleted, any RBAC resources included directly in the bundle itself will remain on the cluster.<\/p>\n<p>If you wish to look up a list of <code>ClusterServiceVersion<\/code> in a specific namespace to see which <code>ClusterServiceVersion<\/code> you need to delete, you can use the example <code>kubectl<\/code> command:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ kubectl get clusterserviceversion -n &lt;namespace&gt;\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Example output<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>NAME DISPLAY VERSION REPLACES PHASE\n<\/span><\/span><span style=\"display:flex;\"><span>foo Foo Operator 1.0.0 Succeeded\n<\/span><\/span><\/code><\/pre><\/div><p>You can delete the <code>ClusterServiceVersion<\/code> in the namespace that the operator was installed into using this command:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>kubectl delete clusterserviceversion &lt;csv-name&gt; -n &lt;namespace&gt;\n<\/span><\/span><\/code><\/pre><\/div><h3 id=\"combine-steps-2-and-3\">Combine steps 2 and 3<\/h3>\n<p>Alternatively, you can delete both <code>Subscription<\/code> and its <code>CSV<\/code> using a sequence of commands:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span><span style=\"color:#000\">CSV<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#204a87;font-weight:bold\">$(<\/span>kubectl get subscription &lt;subscription-name&gt; -n &lt;namespace&gt; -o json <span style=\"color:#000;font-weight:bold\">|<\/span> jq -r <span style=\"color:#4e9a06\">&#39;.status.installedCSV&#39;<\/span><span style=\"color:#204a87;font-weight:bold\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>kubectl delete subscription &lt;subscription-name&gt; -n &lt;namespace&gt;\n<\/span><\/span><span style=\"display:flex;\"><span>kubectl delete csv <span style=\"color:#000\">$CSV<\/span> -n &lt;namespace&gt;\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"step-4-deciding-whether-or-not-to-delete-the-crds-and-apiservices\">Step 4: Deciding whether or not to delete the CRDs and APIServices<\/h2>\n<p>The fourth step consists of deciding whether or not to delete the <code>CRDs<\/code> and <code>APIServices<\/code> that were introduced to the cluster by the operator. Assuming you have already deleted all unwanted resources on cluster as enumerated in Step 1, if no resources remain it is safe to remove the <code>CRD<\/code> or <code>APISerivces<\/code>. Otherwise, you should not delete the type as the wanted resources will be deleted automatically when the CRD or <code>APISerivce<\/code> is deleted.<\/p>\n<h2 id=\"step-5-deleting-the-operator-cr\">Step 5: Deleting the Operator CR<\/h2>\n<p>OLM recently introduced the view-only <a href=\"https:\/\/github.com\/operator-framework\/api\/blob\/7339a22050af53df7b6f97a652b8e2d73698765a\/crds\/operators.coreos.com_operators.yaml\">operator CRD<\/a> which communicates the list of resources associated with an <a href=\"https:\/\/olm.operatorframework.io\/docs\/tasks\/creating-operator-bundle\/#operator-bundle\">operator bundle<\/a> installed by OLM. When installing an <code>operator bundle<\/code>, OLM will create an <code>operator<\/code> CR named:<\/p>\n<ul>\n<li><code>&lt;packageName&gt;<\/code> if the operator is All Namespaced scoped.<\/li>\n<li><code>&lt;packageName&gt;.&lt;Namespace&gt;<\/code> if the operator is not All Namespaced scoped.<\/li>\n<\/ul>\n<p>OLM will then the update the <a href=\"https:\/\/github.com\/operator-framework\/api\/blob\/7339a22050af53df7b6f97a652b8e2d73698765a\/crds\/operators.coreos.com_operators.yaml#L76-L77\">operator&rsquo;s status.Components.Refs<\/a> array to include all resources associated with the <code>operator<\/code>. Let&rsquo;s consider OLM&rsquo;s behavior after creating the <code>operator<\/code> CR named <code>foo<\/code>:<\/p>\n<ul>\n<li>All resources associated with the <code>foo operator<\/code> CR will have the <code>operators.coreos.com\/foo<\/code> label applied to it.<\/li>\n<li>OLM will create or recreate the <code>foo operator<\/code> CR if any resources exist with the <code>operators.coreos.com\/foo<\/code> label.<\/li>\n<\/ul>\n<p>This ultimately means that in order to delete the <code>foo operator<\/code> CR, users will need to ensure that no resources are labeled with the <code>operators.coreos.com\/foo<\/code> label. Typically, OLM should not attempt to recreate the <code>foo operator<\/code> after a user deletes it if they have completed steps 1 through 4 above. However, if OLM is still recreating the <code>foo operator<\/code>, a user should:<\/p>\n<ul>\n<li>Delete each resource found in the <code>foo operator's status.Components.Refs<\/code> array. Alternatively, if you have deleted the <code>foo operator's CSV<\/code> and <code>Subscription<\/code> you may remove the <code>operators.coreos.com\/foo<\/code> label from any resources you do not wish to delete.<\/li>\n<li>Delete the <code>foo operator<\/code> CR.\nThe final step consists of deciding whether or not to delete the <code>CRDs<\/code> and <code>APIServices<\/code> that were introduced to the cluster by the operator. Assuming you have already deleted all unwanted resources on cluster as enumerated in Step 1, if no resources remain it is safe to remove the <code>CRD<\/code> or <code>APISerivces<\/code>. Otherwise, you should not delete the type as the wanted resources will be deleted automatically when the <code>CRD<\/code> or <code>APISerivce<\/code> is deleted.<\/li>\n<\/ul>"},{"title":"Docs: OLM Performance Profiling Instrumentation","link":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/performance-profiling\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/advanced-tasks\/performance-profiling\/","description":"\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<ul>\n<li><a href=\"https:\/\/golang.org\/dl\/\">go<\/a><\/li>\n<\/ul>\n<h2 id=\"background\">Background<\/h2>\n<p>OLM utilizes the <a href=\"https:\/\/golang.org\/pkg\/net\/http\/pprof\/\">pprof package<\/a> from the standard go library to expose performance profiles for the OLM and Catalog Operator.<\/p>\n<p>Due to the sensitive nature of profiling data, the profiling endpoints will reject any clients that do not present a verifiable certificate. Both operators must be configured with a serving certificate and a client CA bundle in order to access the profiling endpoints.<\/p>\n<p>This document will dive into the steps to <a href=\"#enabling-performance-profiling\">enable olm performance profiling<\/a> and retrieving pprof data from each component.<\/p>\n<h2 id=\"enabling-performance-profiling\">Enabling Performance Profiling<\/h2>\n<h3 id=\"creating-a-certificate\">Creating a Certificate<\/h3>\n<p>A valid server certificate must be created for each component before the Performance Profiling functionality can be enabled. If you are unfamiliar with certificate generation, we recommend using the <a href=\"https:\/\/www.openssl.org\/\">OpenSSL<\/a> tool-kit and refer to the <a href=\"https:\/\/www.openssl.org\/docs\/man1.1.1\/man1\/openssl-req.html\">request certificate<\/a> documentation.<\/p>\n<p>Once you have generated a private and public key, this data should be stored in a <code>TLS Secret<\/code>:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">export<\/span> <span style=\"color:#000\">PRIVATE_KEY_FILENAME<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>private.key <span style=\"color:#8f5902;font-style:italic\"># Replace with the name of the file that contains the private key you generated.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">export<\/span> <span style=\"color:#000\">PUBLIC_KEY_FILENAME<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>certificate.crt <span style=\"color:#8f5902;font-style:italic\"># Replace with the name of the file that contains the public key you generated.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl -n my-namespace create secret tls my-name --cert<span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#000\">$PUBLIC_KEY_FILENAME<\/span> --key<span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#000\">$PRIVATE_KEY_FILENAME<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h3 id=\"updating-olm-to-use-the-tls-secret\">Updating OLM to Use the TLS Secret<\/h3>\n<p>Patch the OLM or Catalog Deployment&rsquo;s pod template to use the generated TLS secret:<\/p>\n<ul>\n<li>Defining a volume and volumeMount<\/li>\n<li>Adding the <code>client-ca<\/code>, <code>tls-key<\/code> and <code>tls-cert<\/code> arguments<\/li>\n<li>Replacing all mentions of port <code>8080<\/code> with <code>8443<\/code><\/li>\n<li>Updating the <code>livenessProbe<\/code> and <code>readinessProbe<\/code> to use HTTPS as the scheme<\/li>\n<\/ul>\n<p>The steps to patch an existing OLM deployment can be seen below:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">export<\/span> <span style=\"color:#000\">TLS_SECRET<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>my-tls-secret\n<\/span><\/span><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">export<\/span> <span style=\"color:#000\">CERT_PATH<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>\/var\/run\/secrets <span style=\"color:#8f5902;font-style:italic\"># Define where to mount the certs.<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Set Deployment name to olm-operator or catalog-operator<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">export<\/span> <span style=\"color:#000\">DEPLOYMENT_NAME<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>olm-operator\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl patch deployment <span style=\"color:#000\">$DEPLOYMENT_NAME<\/span> -n olm --type json -p<span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#4e9a06\">&#39;[\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> # Mount the secret to the pod\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/volumes&#34;, &#34;value&#34;:[{&#34;name&#34;: &#39;<\/span><span style=\"color:#000\">$TLS_SECRET<\/span><span style=\"color:#4e9a06\">&#39;, &#34;secret&#34;: {&#34;secretName&#34;: &#39;<\/span><span style=\"color:#000\">$TLS_SECRET<\/span><span style=\"color:#4e9a06\">&#39;}}]},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/volumeMounts&#34;, &#34;value&#34;:[{&#34;name&#34;: &#39;<\/span><span style=\"color:#000\">$TLS_SECRET<\/span><span style=\"color:#4e9a06\">&#39;, &#34;mountPath&#34;: &#39;<\/span><span style=\"color:#000\">$CERT_PATH<\/span><span style=\"color:#4e9a06\">&#39;}]},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> # Add startup arguments\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/args\/-&#34;, &#34;value&#34;:&#34;--client-ca&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/args\/-&#34;, &#34;value&#34;:&#34;&#39;<\/span><span style=\"color:#000\">$CERT_PATH<\/span><span style=\"color:#4e9a06\">&#39;\/tls.crt&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/args\/-&#34;, &#34;value&#34;:&#34;--tls-key&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/args\/-&#34;, &#34;value&#34;:&#34;&#39;<\/span><span style=\"color:#000\">$CERT_PATH<\/span><span style=\"color:#4e9a06\">&#39;\/tls.key&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/args\/-&#34;, &#34;value&#34;:&#34;--tls-cert&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;add&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/args\/-&#34;, &#34;value&#34;:&#34;&#39;<\/span><span style=\"color:#000\">$CERT_PATH<\/span><span style=\"color:#4e9a06\">&#39;\/tls.crt&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> # Replace port 8080 with 8443\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;replace&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/ports\/0&#34;, &#34;value&#34;:{&#34;containerPort&#34;: 8443}},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;replace&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/livenessProbe\/httpGet\/port&#34;, &#34;value&#34;:8443},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;replace&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/readinessProbe\/httpGet\/port&#34;, &#34;value&#34;:8443},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> # Update livenessProbe and readinessProbe to use HTTPS\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;replace&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/readinessProbe\/httpGet\/scheme&#34;, &#34;value&#34;:&#34;HTTPS&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\"> {&#34;op&#34;: &#34;replace&#34;, &#34;path&#34;: &#34;\/spec\/template\/spec\/containers\/0\/livenessProbe\/httpGet\/scheme&#34;, &#34;value&#34;:&#34;HTTPS&#34;},\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#4e9a06\">]&#39;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>deployment.apps\/olm-operator patched\n<\/span><\/span><\/code><\/pre><\/div><h2 id=\"accessing-pprof-data\">Accessing PPROF Data<\/h2>\n<p>You will need to be able to access OLM port, for dev purposes the following commands may prove useful:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span><span style=\"color:#8f5902;font-style:italic\"># Set Deployment name to olm-operator or catalog-operator<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ <span style=\"color:#204a87\">export<\/span> <span style=\"color:#000\">DEPLOYMENT_NAME<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>olm-operator\n<\/span><\/span><span style=\"display:flex;\"><span>$ kubectl port-forward deployment\/<span style=\"color:#000\">$DEPLOYMENT_NAME<\/span> 8443:8443 -n olm\n<\/span><\/span><\/code><\/pre><\/div><p>You can then curl the OLM <code>\/debug\/pprof<\/code> endpoint to retrieve default pprof profiles like so:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>$ curl https:\/\/localhost:8443\/debug\/pprof\/heap --cert certificate.crt --key private.key --insecure -o olm-heap\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span>$ go tool pprof --top olm-heap\n<\/span><\/span><\/code><\/pre><\/div><p>Please review <a href=\"https:\/\/blog.golang.org\/pprof\">the official pprof documentation<\/a> to learn more about pprof.<\/p>"},{"title":"Docs:","link":"https:\/\/olm.operatorframework.io\/docs\/concepts\/operators-on-cluster\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/concepts\/operators-on-cluster\/","description":"\n<h1 id=\"when-to-use-operators-on-a-cluster\">When to use operators on a cluster<\/h1>\n<p>Operators are good for automating the knowledge of how to operate a complex system. Operators are a high-privilege component and by design, they run persistently inside your cluster. An operators can handle features like automatic scaling in response to load, backup and restore etc.<\/p>\n<h1 id=\"how-does-olm-help-and-install-operators-on-a-cluster\">How does OLM help and install operators on a cluster?<\/h1>\n<p>OLM requires you to provide metadata about your operator in order to ensure that it can be kept running safely on a cluster, and to provide information about how updates should be applied as you publish new versions of your operator. A ClusterServiceVersion (CSV) represents a particular version a running operator on a cluster. It includes metadata such as name, description, version, repository link, labels, icon, etc. It declares <code>owned<\/code>\/<code>required<\/code> CRDs, cluster requirements, and install strategy that tells OLM how to create required resources and set up the operator.<\/p>\n<p>As a cluster administrator, you can install an Operator from the OperatorHub using the OpenShift Container Platform web console or the CLI. You can then subscribe the Operator to one or more namespaces to make it available for developers on your cluster.<\/p>\n<p>Example: Install the latest version of an Operator<\/p>\n<p>Before installing an operator into a namespace, you will need to create an OperatorGroup that targets the namespaces your operator is planning to watch, to generate the required RBACs for your operator in those namespaces.<\/p>\n<p>If you want to install an operator named <code>my-operator<\/code> in the namespace <code>foo<\/code> that is cluster scoped (i.e installModes:AllNamespaces), from a catalog named <code>my-catalog<\/code> that is in the namespace <code>olm<\/code>.<\/p>\n<p>Create a global OperatorGroup (which selects all namespaces):<\/p>\n<pre tabindex=\"0\"><code>$ cat og.yaml\napiVersion: operators.coreos.com\/v1\nkind: OperatorGroup\nmetadata:\nname: my-group\nnamespace: foo\n$ kubectl apply og.yaml\noperatorgroup.operators.coreos.com\/my-group created\n<\/code><\/pre><p>Then, create a subscription for the operator:<\/p>\n<pre tabindex=\"0\"><code>$ cat sub.yaml\napiVersion: operators.coreos.com\/v1alpha1\nkind: Subscription\nmetadata:\nname: sub-to-my-operator\nnamespace: foo\nspec:\nchannel: stable\nname: my-operator\nsource: my-catalog\nsourceNamespace: olm\ninstallPlanApproval: Manual\n$ kubectl apply -f sub.yaml\nsubscription.operators.coreos.com\/sub-to-my-operator created\n<\/code><\/pre><p>Since the approval is Manual, we need to manually go in and approve the InstallPlan<\/p>\n<pre tabindex=\"0\"><code>$ kubectl get ip -n foo\nNAME CSV APPROVAL APPROVED\ninstall-nlwcw my-operator.v0.9.2 Automatic false\n$ kubectl edit ip install-nlwcw -n foo\n<\/code><\/pre><p>And then change the <code>spec.approved<\/code> from <code>false<\/code> to <code>true<\/code><\/p>\n<p>This should spin up the <code>ClusterServiceVersion<\/code> of the operator in the <code>foo<\/code> namespace`, following which the operator pod will spin up.<\/p>\n<p>To ensure the operator installed successfully, check for the <code>ClusterServiceVersion<\/code> and the operator deployment in the namespace it was installed in.<\/p>\n<pre tabindex=\"0\"><code>$ kubectl get csv -n &lt;namespace-operator-was-installed-in&gt;\nNAME DISPLAY VERSION REPLACES PHASE\n&lt;name-of-csv&gt; &lt;operator-name&gt; &lt;version&gt; &lt;csv-of-previous-version&gt; Succeeded\n...\n$ kubectl get deployments -n &lt;namespace-operator-was-installed-in&gt;\nNAME READY UP-TO-DATE AVAILABLE AGE\n&lt;name-of-your-operator&gt; 1\/1 1 1 9m48s\n<\/code><\/pre>"},{"title":"Docs: Channel Naming","link":"https:\/\/olm.operatorframework.io\/docs\/best-practices\/channel-naming\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/best-practices\/channel-naming\/","description":"\n<h2 id=\"channels\">CHANNELS<\/h2>\n<p>Operator Lifecycle Manager (OLM) provides a channel concept that allows you\nas the operator author a means to specify a set of update streams for your\noperator.<\/p>\n<p>Operator authors deal with two key tasks associated with OLM channels, first,\nhow to define a channel for your operator and then lastly how to interact\nwith OLM to deploy your operator using channels.<\/p>\n<p>For each version of an operator you can specify a channel that it will belong\nto. Since there can be multiple versions of an operator within a channel,\nthere is a notion of the latest version within a channel, or the channel head\nversion. It&rsquo;s the channel head that OLM will install for most subscriptions.<\/p>\n<p>There can also be multiple channels for a given operator package which is\nused to offer different support models (e.g. pre-release, production). Here\nis a diagram that shows the relationship of operator versions to channels:<\/p>\n<p><img src=\"https:\/\/olm.operatorframework.io\/docs\/best-practices\/images\/channel-naming1.png\" alt=\"Channel Naming Image\"><\/p>\n<p>In the diagram above you can see the following:<\/p>\n<ul>\n<li>A catalog named \u201cvendor:v4.6\u201d, this catalog is built by a cluster administrator typically<\/li>\n<li>There are 2 operator packages found in the catalog, myoperator and otheroperator.<\/li>\n<li>The myoperator has 3 bundles (1.0.0, 1.0.1, 1.0.2). Versions 1.0.0 and 1.0.1 are in multiple channels (fast, stable). Whereas version 1.0.2 is only in the fast channel.<\/li>\n<li>The otheroperator has 2 bundles specifying 2 different channels (candidate, stable). Version 1.4.0 specifies it is within 2 channels, stable and candidate.<\/li>\n<\/ul>\n<p>Here is the view of another catalog, \u201cvendor:v4.7\u201d, that shows you can change\nthe upgrade path for an operator by what operator bundles are contained\nwithin the catalog:<\/p>\n<p><img src=\"https:\/\/olm.operatorframework.io\/docs\/best-practices\/images\/channel-naming2.png\" alt=\"Channel Naming Image\"><\/p>\n<h3 id=\"defining-channels\">Defining Channels<\/h3>\n<p>Operator authors define the channels they intend to use by creating labels within their operator bundle. Bundles contain metadata about a particular operator version. For example, when you build an operator bundle, you specify an annotations.yaml manifest which gets included into the bundle image. Here is an example snippet of an annotations.yaml file including channel information for that operator:<\/p>\n<pre tabindex=\"0\"><code>annotations:\noperators.operatorframework.io.bundle.channels.v1: candidate\noperators.operatorframework.io.bundle.channel.default.v1: candidate\noperators.operatorframework.io.bundle.manifests.v1: manifests\/\noperators.operatorframework.io.bundle.mediatype.v1: registry+v1\noperators.operatorframework.io.bundle.metadata.v1: metadata\/\noperators.operatorframework.io.bundle.package.v1: otheroperator\n<\/code><\/pre><p>This example shows that you are defining the candidate channel to be used for\nthis operator bundle. Operator bundles are loaded into an Operator Index\nimage using the opm command. It is important to note that by specifying a\nchannel value like this, you are essentially creating a channel which can\nthen be subscribed to. If you mis-type the channel name, there is nothing\nthat validates the channel value because the channel is known by whatever\nyou provide.<\/p>\n<p>Note that you can specify a default channel for a given operator package. This\ndefault channel is used when an operator is being installed to fulfill\na dependency requirement of another operator. The dependent operator will\nbe installed from the dependent operator\u2019s default channel as the first\nchoice, falling back to other channels the dependent operator provides as\nnecessary. Default channels for an operator package are determined by the\norder in which operator bundles are added to the catalog, with the last\nbundle\u2019s default channel value being used. Note the default channel is\nalso used if you create a Subscription that doesn\u2019t specify a channel.<\/p>\n<p>If your operator bundles do not specify a default channel, a default channel\nwill be picked by OLM based on the lexical ordering of the channels you have\nspecified. For example, if your bundles specified channels of candidate and\nstable, then candidate would be picked based solely on the names chosen and\ncharacter ordering (e.g. \u2018p\u2019 comes before \u2018s\u2019). Dependency resolution is\ndescribed in more detail <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/dependency-resolution\/\">here<\/a>.<\/p>\n<h3 id=\"deploying-operators-from-channels\">Deploying Operators from Channels<\/h3>\n<p>When an end user or administrator wants to deploy an operator using OLM,\nthey create a <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/subscription\/\">Subscription<\/a> manifest, e.g:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-yaml\" data-lang=\"yaml\"><span style=\"display:flex;\"><span><span style=\"color:#204a87;font-weight:bold\">apiVersion<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">operators.coreos.com\/v1alpha1<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">kind<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">Subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">metadata<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">sample-subscription<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">namespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"><\/span><span style=\"color:#204a87;font-weight:bold\">spec<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">channel<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">candidate<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">name<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">sampleoperator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">source<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">sample-operator<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#204a87;font-weight:bold\">sourceNamespace<\/span><span style=\"color:#000;font-weight:bold\">:<\/span><span style=\"color:#f8f8f8;text-decoration:underline\"> <\/span><span style=\"color:#000\">my-operators<\/span><span style=\"color:#f8f8f8;text-decoration:underline\">\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>The <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/subscription\/\">Subscription<\/a> is providing hints to OLM which are used to determine exactly which version of an operator will get deployed onto the cluster, in this example OLM will look for an operator to deploy that belongs to the candidate channel within a specified catalog source.<\/p>\n<p>Note that exactly which operator version is deployed can depend on more than what you specify in the <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/crds\/subscription\/\">Subscription<\/a>. On initial install, OLM will always attempt to install whatever is the head of the specified channel by default. Settings within the operator\u2019s CSV also are used by OLM to determine exactly which operator version OLM will deploy or upgrade.<\/p>\n<h2 id=\"naming\">NAMING<\/h2>\n<p>Channel names should imply the nature of official support the user can expect when subscribed to that channel for your operator. For example, the channel name <code>stable-v2<\/code> implies that subscribing to this channel will install an operator with a major version <code>v2<\/code> that you can expect official support for. The channel name <code>candidate-v2<\/code> implies that the user will be installing a candidate release version that does not have official supported.<\/p>\n<p>Our motivation with this convention is to encourage a better user experience for OLM users to have an intuitive\nunderstanding of the level of maturity and supportability of the solutions that will get installed.\nIt can get very confusing for cluster admins and Operator consumers in general when each solution distributed in the OLM catalog adopts different names or different meanings for the same terminologies.<\/p>\n<p>The names you choose are notional and up to you to decide, however, picking good channel names requires some basic guidance. What is described below are different channel naming conventions that are commonly used by the operator community to denote different operator upgrade use cases.<\/p>\n<h3 id=\"naming-conventions\">Naming Conventions<\/h3>\n<ul>\n<li>Channel names are chosen by operator authors as they see fit to meet their upgrade strategies.<\/li>\n<li>Channel names should communicate the release strategy, official support level and the level of maturity, but <strong>not<\/strong> specific features. ( e.g. a channel with Operator versions which has official support ought to be have the word <code>stable<\/code> in the channel name, whereas a channel with Operator versions with a non-supported feature should have the phrase <code>tech-preview<\/code>in it&rsquo;s name. ).<\/li>\n<\/ul>\n<blockquote>\n<p><strong>Note:<\/strong> If your new operator version release contains an API(CRD), which represents new experimental features and\nis not supported (like &ldquo;tech-preview&rdquo;), then the recommendation is to capture the maturity in the API version\n(that is group: my.example.com, kind: Backup, version: v1alpha1) and not in the channel name.\nThis follows <a href=\"https:\/\/kubernetes.io\/docs\/reference\/using-api\/#api-versioning\">Kubernetes API versioning<\/a> recommendations.<\/p>\n<\/blockquote>\n<ul>\n<li>Channel names are unique to your operator and do not collide with channel names used by other operator providers.<\/li>\n<li>Seldom is there a situation where your channel names need to contain information about the Kubernetes or Openshift cluster version they run on. Only in the case where your operator versions have a dependency on the Kubernetes\/Openshift version would you include the cluster version in your channel name.<\/li>\n<li>You typically would <strong>not<\/strong> include product names in your channels since the channels are unique to your product and will not collide with other channel names used by other operators.<\/li>\n<li>You could include or have an operand version in your channel name to advertise to consumers the version of operand they can subscribe to.<\/li>\n<li>If you do choose to include some version in your channel name, it is important to include an additional identifier, to clarify what that the version number is referring to. A version number could equally be referring to product version (operand version), or operator version - these two don&rsquo;t always match: the operator itself can have different versioning than the product it is managing.<\/li>\n<li>It is recommended to use at least the major versions of your Operator releases in the channel names. Cluster admins can then better plan the consumption of versions of Operators introducing breaking changes and avoid workflow issues. (e.g. <code>stable-v2.x<\/code>)<\/li>\n<\/ul>\n<h3 id=\"recommended-channel-naming\">Recommended Channel Naming<\/h3>\n<h4 id=\"example-1\">Example 1<\/h4>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Channel Name<\/th>\n<th style=\"text-align:left\">Purpose<\/th>\n<th style=\"text-align:left\">Supported<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">candidate<\/td>\n<td style=\"text-align:left\">Pre-release operators that would typically not have support offered and might be considered experimental. Release candidates contain all the features of the product but are not supported. Use release candidate versions to test feature acceptance and assist in qualifying the next version of Operator. A release candidate is any build that is available in the candidate channel, including ones that do not contain a pre-release version such as <code>-rc<\/code> in their names. After a version is available in the candidate channel, it goes through more quality checks. If it meets the quality standard, it is promoted to the <code>fast<\/code> or <code>stable<\/code> channels. Because of this strategy, if a specific release is available in both the <code>candidate<\/code> channel and in the <code>fast<\/code> or <code>stable<\/code> channels, it is a supported version. The <code>candidate<\/code> channel can include release versions from which there are no recommended updates in any channel.<\/td>\n<td style=\"text-align:left\">No<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">fast<\/td>\n<td style=\"text-align:left\">Released, supported operators which are still being monitored to assess stability\/quality prior to promoting them as stable. Generally used by early adopters or for testing in pre-production environments. The <code>fast<\/code> channel ought to be updated with new and previous minor versions of the Operator as soon as it declares the given version as a general availability release. As such, these releases are fully supported, are production quality, and have performed well while available as a release candidate in the <code>candidate<\/code> channel from where they were promoted. Some time after a release appears in the <code>fast<\/code> channel, it is added to the <code>stable<\/code> channel. If you adopted the <code>fast<\/code> and\/or <code>candidate<\/code> channel then, releases never should appear in the <code>stable<\/code> channel before they appears in the <code>fast<\/code> and\/or <code>candidate<\/code>. Please, make sure you understand the <a href=\"https:\/\/olm.operatorframework.io\/docs\/best-practices\/channel-naming\/#channel-promotion\">CHANNEL PROMOTION<\/a>.<\/td>\n<td style=\"text-align:left\">Yes<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">stable<\/td>\n<td style=\"text-align:left\">Released, supported operators that have been observed to be stable through usage by consumers of the fast channel. While the fast channel contains releases as soon as their are published with a support statement, releases are added to the stable channel after a delay in this case. During this delay, data could to be collected, for example, to ensure the stability of the release.<\/td>\n<td style=\"text-align:left\">Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>With the above channel naming convention, you are always moving end users to the latest versions of your operator. For example, you could create a version <code>1.1.1<\/code> that is considered fast, adding it to the fast channel. Users can experiment with that fast version, but the stable version for example <code>1.2.0<\/code> would be added only to the stable channel.<\/p>\n<p><strong>NOTE<\/strong> The above terminology and support statements are very similar to the channels of distribution used by Kubernetes, (e.g <a href=\"https:\/\/cloud.google.com\/kubernetes-engine\/docs\/concepts\/release-channels\">here<\/a>), and popular vendors such as OpenShift (e.g <a href=\"https:\/\/docs.openshift.com\/container-platform\/4.9\/updating\/understanding-upgrade-channels-release.html\">here<\/a>). In this way, by adopting it you will bring a better and more intuitive understanding for the maintainers, users and community.<\/p>\n<h4 id=\"example-2\">Example 2<\/h4>\n<p>By following the recommendation, you would provide the major versions of the Operators\nin the channel naming. Consumers can then subscribe to a channel with confidence that none of the versions in the\nchannel will introduce breaking changes:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Channels for Operator version(s) v2.x<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">candidate-v2<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">fast-v2<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">stable-v2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Attention:<\/strong> The versions on the channel names are related to the Operator version and not its Operands.<\/p>\n<h4 id=\"example-3-recommended-option-is-the-most-common-scenarios\">Example 3 (Recommended Option is the most common scenarios)<\/h4>\n<p>An operator should be supported at various operator major\/minor versions.<br>\nFor example, you might have a <code>v1.3<\/code> and also a <code>v2.4<\/code> releases of your operator that\nyou need or want to offer support for at the same time. However, you might\nnot want to have OLM upgrade users to the <code>v2.4<\/code> Operator but instead keep them\nupgrading within the <code>v1.3<\/code> versions. In that case, you would end up with channels as\nrecommended above but with major\/minor version information applied as follows:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Channels for v1.3<\/th>\n<th style=\"text-align:left\">Channels for v2.4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">candidate-v1.3<\/td>\n<td style=\"text-align:left\">candidate-v2.4<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">fast-v1.3<\/td>\n<td style=\"text-align:left\">fast-v2.4<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">stable-v1.3<\/td>\n<td style=\"text-align:left\">stable-v2.4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Attention:<\/strong> The versions on the channel names are related to the Operator version and not its Operands.<\/p>\n<h4 id=\"example-4-only-if-you-need-make-clear-for-your-users-the-operand-version\">Example 4 (Only if you need make clear for your users the Operand version)<\/h4>\n<p>Another form of channel naming might have the operand version be specified\ninstead of the operator version. For example, consider a database operator\nthat has operands of different database versions such as Version 12 or\nVersion 13. In this case, you might have the need to advertise your\nchannels by the operand version as follows:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:left\">Channels for Postgres v12<\/th>\n<th style=\"text-align:left\">Channels for Postgres v13<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align:left\">candidate-pg-v12<\/td>\n<td style=\"text-align:left\">candidate-pg-v13<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">fast-pg-v12<\/td>\n<td style=\"text-align:left\">fast-pg-v13<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left\">stable-pg-v12<\/td>\n<td style=\"text-align:left\">stable-pg-v13<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>In this example, subscribers know which database version they are subscribing\nto and don\u2019t necessarily care which operator version is being used, but will\nlikely just want the latest operator version in that channel. As with the\nprevious naming convention examples, we start the channel name with\ncandidate\/fast\/stable to denote the maturity level of the operator. Using all\n3 naming prefixes is optional, you might only want to support a stable channel.<\/p>\n<h1 id=\"channel-promotion\">CHANNEL PROMOTION<\/h1>\n<p>Channel promotion is the notion of moving an operator from one channel to\nanother. For example, consider the case where you have an operator version\n<code>1.0.1<\/code> which is found in a candidate channel, then you might decide to offer\nsupport for that version and want to move it to a stable channel.<\/p>\n<p>Today, channel promotion is achieved by creating a new operator version\n(<code>1.0.2<\/code>) that is labeled with the channel(s) you want to promote to (as well\nas any channels you want to keep it in).<\/p>\n<h1 id=\"upgrades\">UPGRADES<\/h1>\n<p>OLM provides a variety of ways to specify updates between operator versions. Before we continue with the following\nrecommendations, make sure you understand the options by checking <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/\">Creating an update graph with OLM<\/a>.<\/p>\n<h2 id=\"recommended-upgrade-path\">Recommended upgrade path<\/h2>\n<p>Within a channel each patch release should be directly upgradable to the <a href=\"https:\/\/olm.operatorframework.io\/docs\/glossary\/#channel-head\">HEAD of channel<\/a>.\nUse skips or skipRange to provide this behaviour. (i.e. if you followed the above <code>Example 3<\/code> that means\nuse skipRange to publish a patch for <code>3.6.z<\/code>under the<code>stable-v3.6<\/code> would mean setting the skipRange to be\n<code>&gt;= 3.5.z &lt; 3.6.z<\/code>, where <code>3.5.z<\/code> represents the oldest <code>3.5.z<\/code> version for which\nyou can provide direct upgrade support to <code>3.6.z<\/code> latest)<\/p>\n<h4 id=\"example\">Example<\/h4>\n<p>Let&rsquo;s imagine that you will be releasing the Operator bundle <code>v3.6.30<\/code> (patch release under the channel <code>stable-v3.6<\/code>) and\nthat you have published so far:<\/p>\n<ul>\n<li>Operator bundles versions from <code>v3.5.0<\/code> to <code>v3.5.25<\/code> under the <code>stable-v3.5<\/code> channel<\/li>\n<li>Operator bundles versions from <code>3.6.0<\/code> to <code>3.6.29<\/code> under the <code>stable-v3.6<\/code> channel<\/li>\n<\/ul>\n<p>Then, in this case, your newer patch release <code>3.6.30<\/code> would be configured with <code>skipRange: &gt;=3.5.25 &lt; 3.6.30<\/code> in\norder to only supports upgrading to the newest <code>3.6.z<\/code> from a pretty recent <code>3.5.z<\/code>.<\/p>\n<p>You do not need necessarily to use <code>3.5.25<\/code>. Therefore, you should\nuse the oldest <code>3.5.z<\/code> version that supports upgrades from. Be aware that the ability to configure the path\nusing this example from an Operator version like <code>3.5.25<\/code> <em>(or <code>3.5.17<\/code>, or something else)<\/em>\ninstead of <code>3.5.0<\/code> is a mechanism to constrain the support matrix when necessary, it&rsquo;s not the default recommendation.<\/p>\n<p><strong>Note<\/strong> If you would like to ensure that the users of your Operator are still able to install the Operator bundle version\n<code>3.6.29<\/code> by using the option <code>startingCSV<\/code> added manually in the subscription then, you will need to also use the <code>replaces: 3.6.29<\/code>\nto ensure the older Operator bundle does not get pruned from the index catalog via the OLM resolver.<\/p>\n<h4 id=\"attention-be-aware-of-the-following-scenario\">Attention (Be aware of the following scenario)<\/h4>\n<p>If you have the channel <code>stable-v3.7<\/code> where the head of channel is <code>v3.7.10<\/code>, and you have a new patch release\nwith a bug fix using the Operator bundle version <code>v3.7.11<\/code> , and you configure <code>v3.7.11<\/code> to skip all\noperator bundles published in the channel <code>stable-v3.7<\/code> (e.g.<code>v3.7.11<\/code> mentions skipRange: <code>&quot;&gt;= 3.7.0 &lt; 3.7.11&quot;<\/code> replaces: <code>3.6.z &lt;latest release on 3.6 channel&gt;<\/code> ).<\/p>\n<p>, you could ensure that your users can more easily upgrade to the latest version since they will\nbe able to install the new <code>3.7.11<\/code> release directly from <code>3.6.z &lt;latest release on 3.6 channel&gt;<\/code> instead of\nhaving to upgrade through Operator version <code>3.7.0<\/code> which may contain bugs that are already fixed in both the <code>3.6.z<\/code>\nversion they had installed, and the <code>3.7.11<\/code> version they are moving to.<\/p>\n<p>However, this approach has negative implications when you provide your next patch release to the minor channel <code>stable-v3.6<\/code>.<br>\nNote that if you publish <code>3.6.latest+1<\/code> when this version comes out, and your users upgrade to it, they will have no way to\nupgrade from <code>3.6.latest+1<\/code> to any solution published under the channel <code>stable-v3.7<\/code>,\nuntil you publish a new <code>3.7.z<\/code> version that replaces `3.6.latest+1.<\/p>"},{"title":"Docs: Build and serve the docs locally","link":"https:\/\/olm.operatorframework.io\/docs\/contribution-guidelines\/local-docs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/contribution-guidelines\/local-docs\/","description":"\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<p>For running local dev server you will only need to install stable version of <a href=\"https:\/\/go.dev\/\">Go<\/a>\nand clone the repository:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>git clone https:\/\/github.com\/operator-framework\/olm-docs\/\n<\/span><\/span><\/code><\/pre><\/div><p>For other tasks such as building production version of the site\nand linting you will also need to:<\/p>\n<ul>\n<li>Install Node.js LTS<\/li>\n<li>Install Docker or Podman<\/li>\n<\/ul>\n<h2 id=\"build-and-serve\">Build and Serve<\/h2>\n<p>You can build and serve your docs to <a href=\"http:\/\/localhost:1313\/\">http:\/\/localhost:1313\/<\/a> with:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>make serve\n<\/span><\/span><\/code><\/pre><\/div><p>Any changes will be included in real time.<\/p>\n<h2 id=\"running-the-linting-script-locally\">Running the Linting Script Locally<\/h2>\n<p>To run linting locally you will need to run the following command:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>make lint\n<\/span><\/span><\/code><\/pre><\/div><p>This assumes <code>docker<\/code> command is available. If you want to specify different engine such as <code>podman<\/code>:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>make lint <span style=\"color:#000\">CONTAINER_ENGINE<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span>podman\n<\/span><\/span><\/code><\/pre><\/div><p>Behind this target, the <code>hack\/ci\/link-check.sh<\/code> script is responsible for running <a href=\"https:\/\/github.com\/gjtorikian\/html-proofer\">html-proofer<\/a> that validates the generated HTML output.<\/p>\n<p><strong>Note<\/strong>: In the case you&rsquo;re getting permission denied errors when reading from that mounted volume, set the following environment variable and re-run the linting script:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>make lint <span style=\"color:#000\">CONTAINER_RUN_EXTRA_OPTIONS<\/span><span style=\"color:#ce5c00;font-weight:bold\">=<\/span><span style=\"color:#4e9a06\">&#34;--security-opt label=disable&#34;<\/span>\n<\/span><\/span><\/code><\/pre><\/div>"},{"title":"Docs: Channel Upgrade Graphs Legends","link":"https:\/\/olm.operatorframework.io\/docs\/contribution-guidelines\/upgrade-graphs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/olm.operatorframework.io\/docs\/contribution-guidelines\/upgrade-graphs\/","description":"\n<p>This document enumerates the legends for the graphs that depict channel upgrades throughout this site. Using the legends documented here can help to communicate channel upgrade graphs in a standardized way.<\/p>\n<h2 id=\"legends\">Legends<\/h2>\n<table>\n<thead>\n<tr>\n<th><div style=\"align-text: center;width:200px\">Diagram (e.g)<\/div><\/th>\n<th style=\"text-align:center\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nID(v0.0.1):::head\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Version of the operator which is the head of a channel different versions are available in<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nID(v0.0.1):::installed\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Version of the operator currently installed on cluster<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nID(v0.0.1)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Operator bundle version which is installable<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nsubgraph preview\nID(v0.0.1)\nend\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Operator bundle channel.<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nsubgraph \"preview (default)\"\nID(v0.0.1) --> ID2(v0.0.2)\nend\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Default Operator bundle channel.<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) --> B(v0.0.4)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">An upgrade path to replace one operator bundle version for another using the <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\/#olmchannel\"><code>olm.channel<\/code><\/a> <code>replaces<\/code> field. More info: <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/#replaces\">here<\/a>.<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) x--x |v0.0.2,v0.0.3| B(v0.0.4)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">An upgrade path to skip versions in the upgrade path using the <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\/#olmchannel\"><code>olm.channel<\/code><\/a> <code>skips<\/code> field. More info: <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/#skips\">here<\/a>.<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nC(v2.0.3) o--o |>= 2.0.4 < 3.0.0| D(v3.0.1)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">An upgrade path to skip a range of operator bundle versions using the <a href=\"https:\/\/olm.operatorframework.io\/docs\/reference\/file-based-catalogs\/#olmchannel\"><code>olm.channel<\/code><\/a> <code>skipRange<\/code> field. More info: <a href=\"https:\/\/olm.operatorframework.io\/docs\/concepts\/olm-architecture\/operator-catalog\/creating-an-update-graph\/#skiprange\">here<\/a>.<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) -.-> B(v0.0.4)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Represent the same replace method describe above but for a future scenario<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) x-.-x |v0.0.2,v0.0.3| B(v0.0.4)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Represent the same skips method describe above but for a future scenario<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nC(v2.0.3) o-.-o |>= 2.0.4 < 3.0.0| D(v3.0.1)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">Represent the same skipRange method describe above but for a future scenario<\/td>\n<\/tr>\n<tr>\n<td><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ff668d;\nclassDef installed fill:#34ebba;\nE(v0.0.2 \\n fa:fa-tag label=value)\n<\/div>\n<\/td>\n<td style=\"text-align:center\">catalog image label with its value for an operator bundle version. (eg.<code>LABEL com.vendor.release.versions:=v4.7<\/code>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"creating-graphs\">Creating graphs<\/h2>\n<p>The graphs are done programmatically via <a href=\"https:\/\/mermaid.js.org\/\">mermaid<\/a>. You can use its <a href=\"https:\/\/mermaid.live\">online editor<\/a> to work with them and check the following examples.<\/p>\n<p>Check the following example:<\/p>\n<div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nsubgraph stable\nA(v0.0.1):::installed --> B(v0.0.2)\nB(v0.0.2) x--x |v0.0.3,v0.0.4| C(v0.0.5 \\n fa:fa-tag 4.6):::head\nC -.-> E(v0.0.6 \\n fa:fa-tag 4.6)\nend\n<\/div>\n<p>Now, check the code used to generate this example:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-js\" data-lang=\"js\"><span style=\"display:flex;\"><span><span style=\"color:#000\">flowchart<\/span> <span style=\"color:#000\">TB<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">classDef<\/span> <span style=\"color:#000\">head<\/span> <span style=\"color:#000\">fill<\/span><span style=\"color:#ce5c00;font-weight:bold\">:<\/span><span style=\"color:#a40000\">#<\/span><span style=\"color:#000\">ffbfcf<\/span><span style=\"color:#000;font-weight:bold\">;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">classDef<\/span> <span style=\"color:#000\">installed<\/span> <span style=\"color:#000\">fill<\/span><span style=\"color:#ce5c00;font-weight:bold\">:<\/span><span style=\"color:#a40000\">#<\/span><span style=\"color:#0000cf;font-weight:bold\">34<\/span><span style=\"color:#000\">ebba<\/span><span style=\"color:#000;font-weight:bold\">;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">subgraph<\/span> <span style=\"color:#000\">stable<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">A<\/span><span style=\"color:#000;font-weight:bold\">(<\/span><span style=\"color:#000\">v0<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#0000cf;font-weight:bold\">0.1<\/span><span style=\"color:#000;font-weight:bold\">)<\/span><span style=\"color:#ce5c00;font-weight:bold\">:::<\/span><span style=\"color:#000\">installed<\/span> <span style=\"color:#ce5c00;font-weight:bold\">--&gt;<\/span> <span style=\"color:#000\">B<\/span><span style=\"color:#000;font-weight:bold\">(<\/span><span style=\"color:#000\">v0<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#0000cf;font-weight:bold\">0.2<\/span><span style=\"color:#000;font-weight:bold\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">B<\/span><span style=\"color:#000;font-weight:bold\">(<\/span><span style=\"color:#000\">v0<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#0000cf;font-weight:bold\">0.2<\/span><span style=\"color:#000;font-weight:bold\">)<\/span> <span style=\"color:#000\">x<\/span><span style=\"color:#ce5c00;font-weight:bold\">--<\/span><span style=\"color:#000\">x<\/span> <span style=\"color:#ce5c00;font-weight:bold\">|<\/span><span style=\"color:#000\">v0<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#0000cf;font-weight:bold\">0.3<\/span><span style=\"color:#000;font-weight:bold\">,<\/span><span style=\"color:#000\">v0<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#0000cf;font-weight:bold\">0.4<\/span><span style=\"color:#ce5c00;font-weight:bold\">|<\/span> <span style=\"color:#000\">C<\/span><span style=\"color:#000;font-weight:bold\">(<\/span><span style=\"color:#000\">v0<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#0000cf;font-weight:bold\">0.5<\/span> <span style=\"color:#a40000\">\\<\/span><span style=\"color:#000\">n<\/span> <span style=\"color:#000\">fa<\/span><span style=\"color:#ce5c00;font-weight:bold\">:<\/span><span style=\"color:#000\">fa<\/span><span style=\"color:#ce5c00;font-weight:bold\">-<\/span><span style=\"color:#000\">tag<\/span> <span style=\"color:#0000cf;font-weight:bold\">4.6<\/span><span style=\"color:#000;font-weight:bold\">)<\/span><span style=\"color:#ce5c00;font-weight:bold\">:::<\/span><span style=\"color:#000\">head<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">C<\/span> <span style=\"color:#ce5c00;font-weight:bold\">-<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#ce5c00;font-weight:bold\">-&gt;<\/span> <span style=\"color:#000\">E<\/span><span style=\"color:#000;font-weight:bold\">(<\/span><span style=\"color:#000\">v0<\/span><span style=\"color:#000;font-weight:bold\">.<\/span><span style=\"color:#0000cf;font-weight:bold\">0.6<\/span> <span style=\"color:#a40000\">\\<\/span><span style=\"color:#000\">n<\/span> <span style=\"color:#000\">fa<\/span><span style=\"color:#ce5c00;font-weight:bold\">:<\/span><span style=\"color:#000\">fa<\/span><span style=\"color:#ce5c00;font-weight:bold\">-<\/span><span style=\"color:#000\">tag<\/span> <span style=\"color:#0000cf;font-weight:bold\">4.6<\/span><span style=\"color:#000;font-weight:bold\">)<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">end<\/span>\n<\/span><\/span><\/code><\/pre><\/div><h3 id=\"usage-code\">Usage code<\/h3>\n<p>Note that, the graphs requires starts with:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-js\" data-lang=\"js\"><span style=\"display:flex;\"><span><span style=\"color:#000\">flowchart<\/span> <span style=\"color:#000\">TB<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">classDef<\/span> <span style=\"color:#000\">head<\/span> <span style=\"color:#000\">fill<\/span><span style=\"color:#ce5c00;font-weight:bold\">:<\/span><span style=\"color:#a40000\">#<\/span><span style=\"color:#000\">ffbfcf<\/span><span style=\"color:#000;font-weight:bold\">;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#000\">classDef<\/span> <span style=\"color:#000\">installed<\/span> <span style=\"color:#000\">fill<\/span><span style=\"color:#ce5c00;font-weight:bold\">:<\/span><span style=\"color:#a40000\">#<\/span><span style=\"color:#0000cf;font-weight:bold\">34<\/span><span style=\"color:#000\">ebba<\/span><span style=\"color:#000;font-weight:bold\">;<\/span>\n<\/span><\/span><\/code><\/pre><\/div><p>Following the code semantic with examples which ought to be used to create the Upgrade Graphs Diagrams.<\/p>\n<table>\n<thead>\n<tr>\n<th>Description<\/th>\n<th style=\"text-align:center\">Code<\/th>\n<th style=\"text-align:right\">Examples<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>head bundle<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt;):::head<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nID(v0.0.1):::head\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>installed bundle<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt;):::installed<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nID(v0.0.1):::installed\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>installable bundle<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nID(v0.0.1)\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>channel<\/td>\n<td style=\"text-align:center\"><code>subgraph &lt;channel name&gt; end<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nsubgraph preview\nID(v0.0.1)\nend\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>default channel<\/td>\n<td style=\"text-align:center\"><code>subgraph &quot;&lt;channel name&gt; (default)&quot; end<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nsubgraph \"preview (default)\"\nID(v0.0.1) --> ID2(v0.0.2)\nend\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>replaces<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt;) --&gt; ID(&lt;bundle tag&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) --> B(v0.0.4)\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>skips<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt;) x--x | &lt;versions that should be skipped&gt; | ID(&lt;bundle tag&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) x--x |v0.0.2,v0.0.3| B(v0.0.4)\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>skipRange<\/td>\n<td style=\"text-align:center\"><code>ID&lt;bundle tag&gt;) o--o | &lt;range&gt; | ID(&lt;bundle tag&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nC(v2.0.3) o--o |>= 2.0.4 < 3.0.0| D(v3.0.1)\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>future replaces<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt;) -.-&gt; ID(&lt;bundle tag&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) -.-> B(v0.0.4)\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>future skips<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt;) x-.-x | &lt;versions that should be skipped&gt; | ID(&lt;bundle tag&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nA(v0.0.1) x-.-x |v0.0.2,v0.0.3| B(v0.0.4)\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>future skipRange<\/td>\n<td style=\"text-align:center\"><code>ID&lt;bundle tag&gt;) o-.-o | &lt;range&gt; | ID(&lt;bundle tag&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nC(v2.0.3) o-.-o |>= 2.0.4 < 3.0.0| D(v3.0.1)\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>Index image label<\/td>\n<td style=\"text-align:center\"><code>ID(&lt;bundle tag&gt; \\n fa:fa-tag &lt;label&gt;=&lt;value&gt;)<\/code><\/td>\n<td style=\"text-align:right\"><div class=\"mermaid\">\nflowchart TB\nclassDef head fill:#ffbfcf;\nclassDef installed fill:#34ebba;\nE(v0.0.2 \\n fa:fa-tag label=value)\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>"}]}}