{"id":49766,"date":"2025-06-21T17:22:16","date_gmt":"2025-06-21T17:22:16","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49766"},"modified":"2026-02-21T07:29:34","modified_gmt":"2026-02-21T07:29:34","slug":"openshift-add-all-operatorhub-io-operators-to-openshift","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/openshift-add-all-operatorhub-io-operators-to-openshift\/","title":{"rendered":"Openshift: Add All OperatorHub.io Operators to OpenShift"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"544\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-12-1024x544.png\" alt=\"\" class=\"wp-image-49767\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-12-1024x544.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-12-300x159.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-12-768x408.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-12-1536x815.png 1536w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-12.png 1748w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Here&#8217;s a complete, step-by-step tutorial \u2014 <strong>with explanations<\/strong> \u2014 to add <strong>OperatorHub.io operators<\/strong> to <strong>OpenShift<\/strong> by creating a <strong>custom <code>CatalogSource<\/code><\/strong> pointing to their community catalog image from <a href=\"https:\/\/quay.io\/operatorhubio\/catalog\" target=\"_blank\" rel=\"noopener\">Quay.io<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf Goal<\/h2>\n\n\n\n<p>You will configure OpenShift to pull operators directly from the <strong>OperatorHub.io community catalog<\/strong>, so that all available community operators appear inside your <strong>OperatorHub UI<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf0 Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 OpenShift 4.x cluster (4.8+ recommended)<\/li>\n\n\n\n<li>\u2705 <code>oc<\/code> CLI installed and logged in as <code>cluster-admin<\/code><\/li>\n\n\n\n<li>\u2705 Internet access to <code>quay.io<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Step 1: Understand What We\u2019re Doing<\/h2>\n\n\n\n<p>OpenShift uses the Operator Lifecycle Manager (OLM) to manage OperatorHub. Operator catalogs are delivered via objects called <code>CatalogSource<\/code>, which point to an OCI-based operator index (usually a container image).<\/p>\n\n\n\n<p>We&#8217;ll be adding a new <code>CatalogSource<\/code> that points to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">quay.io\/operatorhubio\/catalog:latest\n<\/code><\/span><\/pre>\n\n\n<p>This image is maintained by the <strong>OperatorHub.io<\/strong> team and contains all operators shown on their site.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcc4 Step 2: Create the YAML File<\/h2>\n\n\n\n<p>Save the following content into a file named: <code>operatorhubio-catalogsource.yaml<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: operators.coreos.com\/v1alpha1\n<span class=\"hljs-attr\">kind<\/span>: CatalogSource\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: operatorhubio-catalog\n  <span class=\"hljs-attr\">namespace<\/span>: openshift-marketplace\n<span class=\"hljs-attr\">spec<\/span>:\n  sourceType: grpc\n  <span class=\"hljs-attr\">image<\/span>: quay.io\/operatorhubio\/catalog:latest\n  <span class=\"hljs-attr\">displayName<\/span>: <span class=\"hljs-string\">\"OperatorHub.io Community Catalog\"<\/span>\n  <span class=\"hljs-attr\">publisher<\/span>: <span class=\"hljs-string\">\"OperatorHub.io\"<\/span>\n  <span class=\"hljs-attr\">updateStrategy<\/span>:\n    registryPoll:\n      interval: <span class=\"hljs-number\">45<\/span>m\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcd8 What Each Field Means:<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>name<\/code><\/td><td>Internal name used by OLM<\/td><\/tr><tr><td><code>namespace<\/code><\/td><td>Must be <code>openshift-marketplace<\/code> so it&#8217;s cluster-wide<\/td><\/tr><tr><td><code>image<\/code><\/td><td>Points to the community operator index<\/td><\/tr><tr><td><code>displayName<\/code><\/td><td>Friendly name shown in OpenShift UI<\/td><\/tr><tr><td><code>publisher<\/code><\/td><td>Shown in the OperatorHub UI<\/td><\/tr><tr><td><code>updateStrategy<\/code><\/td><td>Polls the registry every 45 min for updates<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce5 Step 3: Apply the YAML<\/h2>\n\n\n\n<p>Run the following command to apply the custom catalog:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">operatorhubio-catalogsource<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You should see:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">catalogsource.operators.coreos.com\/operatorhubio-catalog created\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udc40 Step 4: Verify the CatalogSource Is Working<\/h2>\n\n\n\n<p>Check the status of the catalog:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> catalogsource -n openshift-marketplace\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">NAME<\/span>                    <span class=\"hljs-selector-tag\">DISPLAY<\/span>                          <span class=\"hljs-selector-tag\">PUBLISHER<\/span>         <span class=\"hljs-selector-tag\">AGE<\/span>\n<span class=\"hljs-selector-tag\">operatorhubio-catalog<\/span>   <span class=\"hljs-selector-tag\">OperatorHub<\/span><span class=\"hljs-selector-class\">.io<\/span> <span class=\"hljs-selector-tag\">Community<\/span> <span class=\"hljs-selector-tag\">Catalog<\/span> <span class=\"hljs-selector-tag\">OperatorHub<\/span><span class=\"hljs-selector-class\">.io<\/span>    1<span class=\"hljs-selector-tag\">m<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Next, check if the catalog is READY:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc describe catalogsource operatorhubio-catalog -n openshift-marketplace\n<\/code><\/span><\/pre>\n\n\n<p>Look for a <code>Connection state: READY<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"171\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-13-1024x171.png\" alt=\"\" class=\"wp-image-49768\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-13-1024x171.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-13-300x50.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-13-768x128.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/06\/image-13.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd04 Step 5: Wait for OperatorHub UI to Sync<\/h2>\n\n\n\n<p>It may take 2\u20135 minutes for the UI to display new operators.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Operators \u2192 OperatorHub<\/strong><\/li>\n\n\n\n<li>Use the <strong>Publisher<\/strong> filter and search for <code>OperatorHub.io<\/code><\/li>\n\n\n\n<li>You\u2019ll now see many new operators available to install<\/li>\n<\/ul>\n\n\n\n<p>You can also list them via CLI:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">get<\/span> packagemanifests -n openshift-marketplace | grep operatorhubio\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Step 6: Install an Operator (Optional)<\/h2>\n\n\n\n<p>Once the new operators appear, you can install them from the console or via CLI. Example for installing the <strong>PostgreSQL Operator<\/strong>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc create -f - &lt;&lt;EOF\napiVersion: operators.coreos.com\/v1alpha1\nkind: Subscription\nmetadata:\n  name: postgresql-subscription\n  <span class=\"hljs-keyword\">namespace<\/span>: <span class=\"hljs-title\">my<\/span>-<span class=\"hljs-title\">app<\/span>-<span class=\"hljs-title\">namespace<\/span>\n<span class=\"hljs-title\">spec<\/span>:\n  <span class=\"hljs-title\">channel<\/span>: <span class=\"hljs-title\">stable<\/span>\n  <span class=\"hljs-title\">name<\/span>: <span class=\"hljs-title\">postgresql<\/span>\n  <span class=\"hljs-title\">source<\/span>: <span class=\"hljs-title\">operatorhubio<\/span>-<span class=\"hljs-title\">catalog<\/span>\n  <span class=\"hljs-title\">sourceNamespace<\/span>: <span class=\"hljs-title\">openshift<\/span>-<span class=\"hljs-title\">marketplace<\/span>\n  <span class=\"hljs-title\">installPlanApproval<\/span>: <span class=\"hljs-title\">Automatic<\/span>\n<span class=\"hljs-title\">EOF<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf9 (Optional) Step 7: Clean Up<\/h2>\n\n\n\n<p>To remove the catalog if needed:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> catalogsource operatorhubio-catalog -n openshift-marketplace\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here&#8217;s a complete, step-by-step tutorial \u2014 with explanations \u2014 to add OperatorHub.io operators to OpenShift by creating a custom CatalogSource pointing to their community catalog image from Quay.io. \ud83c\udfaf Goal&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-49766","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49766"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49766\/revisions"}],"predecessor-version":[{"id":59009,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49766\/revisions\/59009"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}