This is a cache of https://docs.okd.io/latest/extensions/ce/managing-ce.html. It is a snapshot of the page at 2026-10-24T18:53:59.435+0000.
Managing extensions - Cluster extensions | Extensions | OKD 5
×

You use catalogs to access the versions, patches, and over-the-air updates for extensions and Operators. You use custom resources (CRs) to manage extensions declaratively from the CLI.

For OKD 5, documented procedures for OLM v1 are CLI-based only. Alternatively, administrators can create and view related objects in the web console by using normal methods, such as the Import YAML and Search pages. However, the existing Software Catalog and Installed Operators pages do not yet display OLM v1 components.

Find Operators to install from a catalog

After you add a catalog to your cluster, you can query the catalog to find Operators and extensions to install.

Currently in Operator Lifecycle Manager (OLM) v1, you cannot query on-cluster catalogs managed by catalogd. In OLM v1, you must use the opm and jq CLI tools to query the catalog registry.

Prerequisites
  • You have added a catalog to your cluster.

  • You have installed the jq CLI tool.

  • You have installed the opm CLI tool.

Procedure
  1. To return a list of extensions that support the AllNamespaces install mode and do not use webhooks, enter the following command:

    $ opm render <catalog_registry_url>:<tag> \
      | jq -cs '[.[] | select(.schema == "olm.bundle" \
      and (.properties[] | select(.type == "olm.csv.metadata").value.installModes[] \
      | select(.type == "AllNamespaces" and .supported == true)) \
      and .spec.webhookdefinitions == null) | .package] | unique[]'

    where:

    catalog_registry_url

    Specifies the URL of the catalog registry, such as registry.redhat.io/redhat/redhat-operator-index.

    tag

    Specifies the tag or version of the catalog, such as v5 or latest.

    Example command
    $ opm render \
      registry.redhat.io/redhat/redhat-operator-index:v5 \
      | jq -cs '[.[] | select(.schema == "olm.bundle" \
      and (.properties[] | select(.type == "olm.csv.metadata").value.installModes[] \
      | select(.type == "AllNamespaces" and .supported == true)) \
      and .spec.webhookdefinitions == null) | .package] | unique[]'
    Example output
    "3scale-operator"
    "amq-broker-rhel8"
    "amq-online"
    "amq-streams"
    "amq-streams-console"
    "ansible-automation-platform-operator"
    "ansible-cloud-addons-operator"
    "apicast-operator"
    "authorino-operator"
    "aws-load-balancer-operator"
    "bamoe-kogito-operator"
    "cephcsi-operator"
    "cincinnati-operator"
    "cluster-logging"
    "cluster-observability-operator"
    "compliance-operator"
    "container-security-operator"
    "cryostat-operator"
    "datagrid"
    "devspaces"
    ...
  2. Inspect the contents of an extension’s metadata by running the following command:

    $ opm render <catalog_registry_url>:<tag> \
      | jq -s '.[] | select( .schema == "olm.package") \
      | select( .name == "<package_name>")'
    Example command
    $ opm render \
      registry.redhat.io/redhat/redhat-operator-index:v5 \
      | jq -s '.[] | select( .schema == "olm.package") \
      | select( .name == "openshift-pipelines-operator-rh")'
    Example output
    {
      "schema": "olm.package",
      "name": "openshift-pipelines-operator-rh",
      "defaultChannel": "latest",
      "icon": {
        "base64data": "iVBORw0KGgoAAAANSUhE...",
        "mediatype": "image/png"
      }
    }

Common catalog queries

You can query catalogs by using the opm and jq CLI tools to help you install, update, and manage the lifecycle of extensions.

The following examples show common catalog queries for extensions:

Command syntax
$ opm render <catalog_registry_url>:<tag> | <jq_request>

where:

catalog_registry_url

Specifies the URL of the catalog registry, such as registry.redhat.io/redhat/redhat-operator-index.

tag

Specifies the tag or version of the catalog, such as v5 or latest.

jq_request

Specifies the query you want to run on the catalog.

Example command
$ opm render \
  registry.redhat.io/redhat/redhat-operator-index:v5 \
  | jq -cs '[.[] | select(.schema == "olm.bundle" and (.properties[] \
  | select(.type == "olm.csv.metadata").value.installModes[] \
  | select(.type == "AllNamespaces" and .supported == true)) \
  and .spec.webhookdefinitions == null) \
  | .package] | unique[]'
Table 1. Common package queries
Query Request

Available packages in a catalog

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .schema == "olm.package")'

Packages that support AllNamespaces install mode and do not use webhooks

$ opm render <catalog_registry_url>:<tag> \
  | jq -cs '[.[] | select(.schema == "olm.bundle" and (.properties[] \
  | select(.type == "olm.csv.metadata").value.installModes[] \
  | select(.type == "AllNamespaces" and .supported == true)) \
  and .spec.webhookdefinitions == null) \
  | .package] | unique[]'

Package metadata

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .schema == "olm.package") \
  | select( .name == "<package_name>")'

Catalog blobs in a package

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .package == "<package_name>")'
Table 2. Common channel queries
Query Request

Channels in a package

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .schema == "olm.channel" ) \
  | select( .package == "<package_name>") | .name'

Versions in a channel

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .package == "<package_name>" ) \
  | select( .schema == "olm.channel" ) \
  | select( .name == "<channel_name>" ) .entries \
  | .[] | .name'
  • Latest version in a channel

  • Upgrade path

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .schema == "olm.channel" ) \
  | select ( .name == "<channel_name>") \
  | select( .package == "<package_name>")'
Table 3. Common bundle queries
Query Request

Bundles in a package

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .schema == "olm.bundle" ) \
  | select( .package == "<package_name>") | .name'
  • Bundle dependencies

  • Available APIs

$ opm render <catalog_registry_url>:<tag> \
  | jq -s '.[] | select( .schema == "olm.bundle" ) \
  | select ( .name == "<bundle_name>") \
  | select( .package == "<package_name>")'

Cluster extension permissions

Operator Lifecycle Manager (OLM) v1 installs and manages cluster extensions in OKD by using its own service account with cluster-admin permissions. You do not need to create an installer service account or assign permissions for each extension.

Access to the ClusterExtension API controls who can install and manage extensions. By default, only cluster administrators have write access. Unrestricted write access to this API delegates cluster-admin trust.

The spec.serviceAccount field in the ClusterExtension API is optional, deprecated, and ignored. Existing extensions that specify this field continue to work after a cluster update. The API server returns a deprecation warning when you create or update an extension that specifies the field. To stop these warnings, remove the spec.serviceAccount field from your ClusterExtension resource and any manifests that define it.

To delegate extension management, combine a validating admission policy with role-based access control (RBAC).

Create an installation namespace

To install a cluster extension in OKD, first create an installation namespace. Specify this namespace in the spec.namespace field of the extension manifest.

The spec.namespace field does not restrict the resources or permissions of an extension to the installation namespace. Depending on the bundle and configuration, an extension can create resources or use permissions in other namespaces or across the cluster.

Cluster extensions are cluster-scoped.

Prerequisites
  • Access to an OKD cluster using an account with cluster-admin permissions.

Procedure
  • Create the installation namespace by running the following command:

    $ oc adm new-project <new_namespace>

Install a cluster extension in all namespaces

You can install an extension from a catalog by creating a custom resource (CR) and applying it to the cluster. Operator Lifecycle Manager (OLM) v1 supports installing cluster extensions, including OLM (Classic) Operators in the registry+v1 bundle format, that are scoped to the cluster.

For OKD 5, documented procedures for OLM v1 are CLI-based only. Alternatively, administrators can create and view related objects in the web console by using normal methods, such as the Import YAML and Search pages. However, the existing Software Catalog and Installed Operators pages do not yet display OLM v1 components.

Prerequisites
  • You have access to the cluster by using an account with cluster-admin permissions.

  • You have created the installation namespace.

  • You have identified a supported package and an available version or channel in a catalog on the cluster.

Procedure
  1. Create a CR, similar to the following example:

    apiVersion: olm.operatorframework.io/v1
    kind: ClusterExtension
    metadata:
      name: <clusterextension_name>
    spec:
      namespace: <installed_namespace>
      source:
        sourceType: Catalog
        catalog:
          packageName: <package_name>
          channels:
            - <channel_name>
          version: <version_or_version_range>
          upgradeConstraintPolicy: CatalogProvided

    where:

    spec.namespace

    Specifies the namespace where you want the bundle installed, such as pipelines or my-extension. Extensions are still cluster-scoped and might contain resources that are installed in different namespaces.

    spec.source.catalog.channels

    Specifies channel names as an array, such as pipelines-1.14 or latest. This field is optional.

    spec.source.catalog.version

    Specifies the version or version range, such as 1.14.0, 1.14.x, or >=1.16, of the package you want to install or update. This field is optional.

    spec.source.catalog.upgradeConstraintPolicy

    Specifies the upgrade constraint policy. If unspecified, the default setting is CatalogProvided. The CatalogProvided setting only updates if the new version satisfies the upgrade constraints set by the package author. To force an update or rollback, set the field to SelfCertified. This field is optional.

    Example pipelines-operator.yaml CR
    apiVersion: olm.operatorframework.io/v1
    kind: ClusterExtension
    metadata:
      name: pipelines-operator
    spec:
      namespace: pipelines
      source:
        sourceType: Catalog
        catalog:
          packageName: openshift-pipelines-operator-rh
          version: "1.14.x"
  2. Apply the CR to the cluster by running the following command:

    $ oc apply -f pipelines-operator.yaml
    Example output
    clusterextension.olm.operatorframework.io/pipelines-operator created
Verification
  1. View the Operator or extension’s CR in the YAML format by running the following command:

    $ oc get clusterextension pipelines-operator -o yaml
    Example output
    apiVersion: v1
    items:
    - apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        annotations:
          kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"olm.operatorframework.io/v1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipes"},"spec":{"namespace":"pipelines","source":{"catalog":{"packageName":"openshift-pipelines-operator-rh","version":"1.14.x"},"sourceType":"Catalog"}}}
        creationTimestamp: "2025-02-18T21:48:13Z"
        finalizers:
        - olm.operatorframework.io/cleanup-unpack-cache
        - olm.operatorframework.io/cleanup-contentmanager-cache
        generation: 1
        name: pipelines-operator
        resourceVersion: "72725"
        uid: e18b13fb-a96d-436f-be75-a9a0f2b07993
      spec:
        namespace: pipelines
        source:
          catalog:
            packageName: openshift-pipelines-operator-rh
            upgradeConstraintPolicy: CatalogProvided
            version: 1.14.x
          sourceType: Catalog
      status:
        conditions:
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: Deprecated
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: PackageDeprecated
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: ChannelDeprecated
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: BundleDeprecated
        - lastTransitionTime: "2025-02-18T21:48:16Z"
          message: Installed bundle registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:f7b19ce26be742c4aaa458d37bc5ad373b5b29b20aaa7d308349687d3cbd8838
            successfully
          observedGeneration: 1
          reason: Succeeded
          status: "True"
          type: Installed
        - lastTransitionTime: "2025-02-18T21:48:16Z"
          message: desired state reached
          observedGeneration: 1
          reason: Succeeded
          status: "True"
          type: Progressing
        install:
          bundle:
            name: openshift-pipelines-operator-rh.v1.14.5
            version: 1.14.5
    kind: List
    metadata:
      resourceVersion: ""

    where:

    spec.channel

    Displays the channel defined in the CR of the extension.

    spec.version

    Displays the version or version range defined in the CR of the extension.

    status.conditions

    Displays information about the status and health of the extension.

    type: Deprecated

    Displays whether one or more of following are deprecated:

    type: PackageDeprecated

    Displays whether the resolved package is deprecated.

    type: ChannelDeprecated

    Displays whether the resolved channel is deprecated.

    type: BundleDeprecated

    Displays whether the resolved bundle is deprecated.

    The value of False in the status field indicates that the reason: Deprecated condition is not deprecated. The value of True in the status field indicates that the reason: Deprecated condition is deprecated.

    installedBundle.name

    Displays the name of the bundle installed.

    installedBundle.version

    Displays the version of the bundle installed.

Configure a watch namespace for a cluster extension (Technology Preview)

You can configure the watch namespace for extensions that support namespace-scoped resource watching.

Configuring watch namespace for a cluster extension is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.

For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.

Prerequisites
  • You have access to an OKD cluster using an account with cluster-admin permissions.

  • You have enabled the TechPreviewNoUpgrade feature set on the cluster.

  • You have created the installation namespace.

  • You have verified the supported install modes for the extension and determined the required watchNamespace configuration.

Procedure
  1. Create a custom resource (CR) based on where you want the extension to watch for resources:

    • To configure the extension to watch its own installation namespace:

      apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        name: <extension_name>
      spec:
        namespace: <installation_namespace>
        config:
          configType: Inline
          inline:
            watchNamespace: <installation_namespace>
        source:
          sourceType: Catalog
          catalog:
            packageName: <package_name>
            version: <version>
            upgradeConstraintPolicy: CatalogProvided

      where:

      config.inline.watchNamespace

      Specifies the namespace to watch for resources. For requirements and valid values, see "Extension configuration".

    • To configure the extension to watch a different namespace:

      apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        name: <extension_name>
      spec:
        namespace: <installation_namespace>
        config:
          configType: Inline
          inline:
            watchNamespace: <watched_namespace>
        source:
          sourceType: Catalog
          catalog:
            packageName: <package_name>
            version: <version>
            upgradeConstraintPolicy: CatalogProvided
  2. Apply the CR to the cluster by running the following command:

    $ oc apply -f <cluster_extension_cr>.yaml
Verification
  • Verify that the extension installed successfully by running the following command:

    $ oc get clusterextension <extension_name> -o yaml
    Example output
    apiVersion: olm.operatorframework.io/v1
    kind: ClusterExtension
    metadata:
      name: <extension_name>
    spec:
      namespace: <installation_namespace>
      config:
        configType: Inline
        inline:
          watchNamespace: <installation_namespace>
    status:
      conditions:
      - type: Installed
        status: "True"
        reason: Succeeded

Updating a cluster extension

You can update your cluster extension or Operator by manually editing the custom resource (CR) and applying the changes.

Automatic updates can install bundles that grant an extension additional permissions without administrator review. To review each bundle before installation, specify an exact approved version. Review the bundle’s permissions and configuration before approving another version.

Prerequisites
  • You have an Operator or extension installed.

  • You have installed the jq CLI tool.

  • You have installed the opm CLI tool.

Procedure
  1. Inspect a package for channel and version information from a local copy of your catalog file by completing the following steps:

    1. Get a list of channels from a selected package by running the following command:

      $ opm render <catalog_registry_url>:<tag> \
        | jq -s '.[] | select( .schema == "olm.channel" ) \
        | select( .package == "openshift-pipelines-operator-rh") | .name'
      Example command
      $ opm render registry.redhat.io/redhat/redhat-operator-index:v5 \
        | jq -s '.[] | select( .schema == "olm.channel" ) \
        | select( .package == "openshift-pipelines-operator-rh") | .name'
      Example output
      "latest"
      "pipelines-1.14"
      "pipelines-1.15"
      "pipelines-1.16"
      "pipelines-1.17"
    2. Get a list of the versions published in a channel by running the following command:

      $ opm render <catalog_registry_url>:<tag> \
        | jq -s '.[] | select( .package == "<package_name>" ) \
        | select( .schema == "olm.channel" ) \
        | select( .name == "<channel_name>" ) | .entries \
        | .[] | .name'
      Example command
      $ opm render registry.redhat.io/redhat/redhat-operator-index:v5 \
        | jq -s '.[] | select( .package == "openshift-pipelines-operator-rh" ) \
        | select( .schema == "olm.channel" ) | select( .name == "latest" ) \
        | .entries | .[] | .name'
      Example output
      "openshift-pipelines-operator-rh.v1.15.0"
      "openshift-pipelines-operator-rh.v1.16.0"
      "openshift-pipelines-operator-rh.v1.17.0"
      "openshift-pipelines-operator-rh.v1.17.1"
  2. Find out what version or channel is specified in your Operator or extension’s CR by running the following command:

    $ oc get clusterextension <operator_name> -o yaml
    Example command
    $ oc get clusterextension pipelines-operator -o yaml
    Example output
    apiVersion: v1
    items:
    - apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        annotations:
          kubectl.kubernetes.io/last-applied-configuration: |
            {"apiVersion":"olm.operatorframework.io/v1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipes"},"spec":{"namespace":"pipelines","source":{"catalog":{"packageName":"openshift-pipelines-operator-rh","version":"1.14.x"},"sourceType":"Catalog"}}}
        creationTimestamp: "2025-02-18T21:48:13Z"
        finalizers:
        - olm.operatorframework.io/cleanup-unpack-cache
        - olm.operatorframework.io/cleanup-contentmanager-cache
        generation: 1
        name: pipelines-operator
        resourceVersion: "72725"
        uid: e18b13fb-a96d-436f-be75-a9a0f2b07993
      spec:
        namespace: pipelines
        source:
          catalog:
            packageName: openshift-pipelines-operator-rh
            upgradeConstraintPolicy: CatalogProvided
            version: 1.14.x
          sourceType: Catalog
      status:
        conditions:
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: Deprecated
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: PackageDeprecated
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: ChannelDeprecated
        - lastTransitionTime: "2025-02-18T21:48:13Z"
          message: ""
          observedGeneration: 1
          reason: Deprecated
          status: "False"
          type: BundleDeprecated
        - lastTransitionTime: "2025-02-18T21:48:16Z"
          message: Installed bundle registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:f7b19ce26be742c4aaa458d37bc5ad373b5b29b20aaa7d308349687d3cbd8838
            successfully
          observedGeneration: 1
          reason: Succeeded
          status: "True"
          type: Installed
        - lastTransitionTime: "2025-02-18T21:48:16Z"
          message: desired state reached
          observedGeneration: 1
          reason: Succeeded
          status: "True"
          type: Progressing
        install:
          bundle:
            name: openshift-pipelines-operator-rh.v1.14.5
            version: 1.14.5
    kind: List
    metadata:
      resourceVersion: ""
  3. Edit your CR by using one of the following methods:

    • If you want to pin your Operator or extension to specific version, such as 1.15.0, edit your CR similar to the following example:

      Example pipelines-operator.yaml CR
      apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        name: pipelines-operator
      spec:
        namespace: pipelines
        source:
          sourceType: Catalog
          catalog:
            packageName: openshift-pipelines-operator-rh
            version: "1.15.0"

      This example updates the version from 1.14.x to 1.15.0.

    • If you want to define a range of acceptable update versions, edit your CR similar to the following example:

      Example CR with a version range specified
      apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        name: pipelines-operator
      spec:
        namespace: pipelines
        source:
          sourceType: Catalog
          catalog:
            packageName: openshift-pipelines-operator-rh
            version: ">1.15, <1.17"

      The spec.source.catalog.version value specifies that the desired version range is greater than version 1.15 and less than 1.17.

    • If you want to update to the latest version that can be resolved from a channel, edit your CR similar to the following example:

      Example CR with a specified channel
      apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        name: pipelines-operator
      spec:
        namespace: pipelines
        source:
          sourceType: Catalog
          catalog:
            packageName: openshift-pipelines-operator-rh
            channels:
              - latest

      The spec.source.catalog.channels value installs the latest release that can be resolved from the specified channel. Updates to the channel are automatically installed. Enter values as an array.

    • If you want to specify a channel and version or version range, edit your CR similar to the following example:

      Example CR with a specified channel and version range
      apiVersion: olm.operatorframework.io/v1
      kind: ClusterExtension
      metadata:
        name: pipelines-operator
      spec:
        namespace: pipelines
        source:
          sourceType: Catalog
          catalog:
            packageName: openshift-pipelines-operator-rh
            channels:
              - latest
            version: "<1.16"

      For more information, see "Example custom resources (CRs) that specify a target version".

  4. Apply the update to the cluster by running the following command:

    $ oc apply -f pipelines-operator.yaml
    Example output
    clusterextension.olm.operatorframework.io/pipelines-operator configured
Verification
  • Verify that the channel and version updates have been applied by running the following command:

    $ oc get clusterextension pipelines-operator -o yaml
    Example output
    apiVersion: olm.operatorframework.io/v1
    kind: ClusterExtension
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"olm.operatorframework.io/v1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipes"},"spec":{"namespace":"pipelines","source":{"catalog":{"packageName":"openshift-pipelines-operator-rh","version":"\u003c1.16"},"sourceType":"Catalog"}}}
      creationTimestamp: "2025-02-18T21:48:13Z"
      finalizers:
      - olm.operatorframework.io/cleanup-unpack-cache
      - olm.operatorframework.io/cleanup-contentmanager-cache
      generation: 2
      name: pipes
      resourceVersion: "90693"
      uid: e18b13fb-a96d-436f-be75-a9a0f2b07993
    spec:
      namespace: pipelines
      source:
        catalog:
          packageName: openshift-pipelines-operator-rh
          upgradeConstraintPolicy: CatalogProvided
          version: <1.16
        sourceType: Catalog
    status:
      conditions:
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: Deprecated
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: PackageDeprecated
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: ChannelDeprecated
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: BundleDeprecated
      - lastTransitionTime: "2025-02-18T21:48:16Z"
        message: Installed bundle registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:8a593c1144709c9aeffbeb68d0b4b08368f528e7bb6f595884b2474bcfbcafcd
          successfully
        observedGeneration: 2
        reason: Succeeded
        status: "True"
        type: Installed
      - lastTransitionTime: "2025-02-18T21:48:16Z"
        message: desired state reached
        observedGeneration: 2
        reason: Succeeded
        status: "True"
        type: Progressing
      install:
        bundle:
          name: openshift-pipelines-operator-rh.v1.15.2
          version: 1.15.2
Troubleshooting
  • If you specify a target version or channel that is deprecated or does not exist, you can run the following command to check the status of your extension:

    $ oc get clusterextension <operator_name> -o yaml
    Example output for a version that does not exist
    apiVersion: olm.operatorframework.io/v1
    kind: ClusterExtension
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"olm.operatorframework.io/v1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipes"},"spec":{"namespace":"pipelines","source":{"catalog":{"packageName":"openshift-pipelines-operator-rh","version":"9.x"},"sourceType":"Catalog"}}}
      creationTimestamp: "2025-02-18T21:48:13Z"
      finalizers:
      - olm.operatorframework.io/cleanup-unpack-cache
      - olm.operatorframework.io/cleanup-contentmanager-cache
      generation: 3
      name: pipes
      resourceVersion: "93334"
      uid: e18b13fb-a96d-436f-be75-a9a0f2b07993
    spec:
      namespace: pipelines
      source:
        catalog:
          packageName: openshift-pipelines-operator-rh
          upgradeConstraintPolicy: CatalogProvided
          version: 9.x
        sourceType: Catalog
    status:
      conditions:
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: Deprecated
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: PackageDeprecated
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: ChannelDeprecated
      - lastTransitionTime: "2025-02-18T21:48:13Z"
        message: ""
        observedGeneration: 2
        reason: Deprecated
        status: "False"
        type: BundleDeprecated
      - lastTransitionTime: "2025-02-18T21:48:16Z"
        message: Installed bundle registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:8a593c1144709c9aeffbeb68d0b4b08368f528e7bb6f595884b2474bcfbcafcd
          successfully
        observedGeneration: 3
        reason: Succeeded
        status: "True"
        type: Installed
      - lastTransitionTime: "2025-02-18T21:48:16Z"
        message: 'error upgrading from currently installed version "1.15.2": no bundles
          found for package "openshift-pipelines-operator-rh" matching version "9.x"'
        observedGeneration: 3
        reason: Retrying
        status: "True"
        type: Progressing
      install:
        bundle:
          name: openshift-pipelines-operator-rh.v1.15.2
          version: 1.15.2
Additional resources

Deleting an Operator

You can delete an Operator and its custom resource definitions (CRDs) by deleting the ClusterExtension custom resource (CR).

Prerequisites
  • You have a catalog installed.

  • You have an Operator installed.

Procedure
  • Delete an Operator and its CRDs by running the following command:

    $ oc delete clusterextension <operator_name>
    Example output
    clusterextension.olm.operatorframework.io "<operator_name>" deleted
Verification
  • Verify that the extension CR no longer exists by running the following command:

    $ oc get clusterextension <operator_name>

    The API server returns a NotFound error. A namespace that you created before installing the extension remains on the cluster.

Downloading the bundle manifests of an extension

Download the bundle manifests of an extension with the opm CLI tool. Review the resources and runtime permissions in the manifests before approving the extension for installation.

Prerequisites
  • You have access to an OKD cluster using an account with cluster-admin permissions.

  • You have decided which extension you want to install.

  • You have installed the opm CLI tool.

Procedure
  1. Inspect the available versions and images of the extension you want to install by running the following command:

    $ opm render <registry_url>:<tag_or_version> | \
      jq -cs '.[] | select( .schema == "olm.bundle" ) | \
      select( .package == "<extension_name>") | \
      {"name":.name, "image":.image}'
    Example command
    $ opm render registry.redhat.io/redhat/redhat-operator-index:v5 | \
      jq -cs '.[] | select( .schema == "olm.bundle" ) | \
      select( .package == "openshift-pipelines-operator-rh") | \
      {"name":.name, "image":.image}'
    Example output
    {"name":"openshift-pipelines-operator-rh.v1.14.5","image":"registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:f7b19ce26be742c4aaa458d37bc5ad373b5b29b20aaa7d308349687d3cbd8838"}
  2. Make a directory to extract the image of the bundle that you want to install by running the following command:

    $ mkdir <new_dir>
  3. Change into the directory by running the following command:

    $ cd <new_dir>
  4. Find the image reference of the version that you want to install and run the following command:

    $ oc image extract <full_path_to_registry_image>@sha256:<sha>
    Example command
    $ oc image extract registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:f7b19ce26be742c4aaa458d37bc5ad373b5b29b20aaa7d308349687d3cbd8838
  5. Change into the manifests directory by running the following command:

    $ cd manifests
  6. View the contents of the manifests directory by entering the following command. The output lists the manifests of the resources required to install, manage, and operate your extension.

    $ tree
    Example output
    .
    ├── manifests
    │   ├── config-logging_v1_configmap.yaml
    │   ├── openshift-pipelines-operator-monitor_monitoring.coreos.com_v1_servicemonitor.yaml
    │   ├── openshift-pipelines-operator-prometheus-k8s-read-binding_rbac.authorization.k8s.io_v1_rolebinding.yaml
    │   ├── openshift-pipelines-operator-read_rbac.authorization.k8s.io_v1_role.yaml
    │   ├── openshift-pipelines-operator-rh.clusterserviceversion.yaml
    │   ├── operator.tekton.dev_manualapprovalgates.yaml
    │   ├── operator.tekton.dev_openshiftpipelinesascodes.yaml
    │   ├── operator.tekton.dev_tektonaddons.yaml
    │   ├── operator.tekton.dev_tektonchains.yaml
    │   ├── operator.tekton.dev_tektonconfigs.yaml
    │   ├── operator.tekton.dev_tektonhubs.yaml
    │   ├── operator.tekton.dev_tektoninstallersets.yaml
    │   ├── operator.tekton.dev_tektonpipelines.yaml
    │   ├── operator.tekton.dev_tektonresults.yaml
    │   ├── operator.tekton.dev_tektontriggers.yaml
    │   ├── tekton-config-defaults_v1_configmap.yaml
    │   ├── tekton-config-observability_v1_configmap.yaml
    │   ├── tekton-config-read-rolebinding_rbac.authorization.k8s.io_v1_clusterrolebinding.yaml
    │   ├── tekton-config-read-role_rbac.authorization.k8s.io_v1_clusterrole.yaml
    │   ├── tekton-operator-controller-config-leader-election_v1_configmap.yaml
    │   ├── tekton-operator-info_rbac.authorization.k8s.io_v1_rolebinding.yaml
    │   ├── tekton-operator-info_rbac.authorization.k8s.io_v1_role.yaml
    │   ├── tekton-operator-info_v1_configmap.yaml
    │   ├── tekton-operator_v1_service.yaml
    │   ├── tekton-operator-webhook-certs_v1_secret.yaml
    │   ├── tekton-operator-webhook-config-leader-election_v1_configmap.yaml
    │   ├── tekton-operator-webhook_v1_service.yaml
    │   ├── tekton-result-read-rolebinding_rbac.authorization.k8s.io_v1_clusterrolebinding.yaml
    │   └── tekton-result-read-role_rbac.authorization.k8s.io_v1_clusterrole.yaml
    ├── metadata
    │   ├── annotations.yaml
    │   └── properties.yaml
    └── root
        └── buildinfo
            ├── content_manifests
            │   └── openshift-pipelines-operator-bundle-container-v1.16.2-3.json
            └── Dockerfile-openshift-pipelines-pipelines-operator-bundle-container-v1.16.2-3