Skip to content

RHIDP-12610 - Support several plugin catalogs in the Extensions plugin - #2579

Open
Gerry-Forde wants to merge 5 commits into
redhat-developer:release-2.1from
Gerry-Forde:RHIDP-12610
Open

RHIDP-12610 - Support several plugin catalogs in the Extensions plugin#2579
Gerry-Forde wants to merge 5 commits into
redhat-developer:release-2.1from
Gerry-Forde:RHIDP-12610

Conversation

@Gerry-Forde

@Gerry-Forde Gerry-Forde commented Sep 4, 2026

Copy link
Copy Markdown
Member

IMPORTANT: Do Not Merge - To be merged by Docs Team Only

Version(s):
2.1

Issue:
RHIDP-12610
Preview:
Manage plugin catalog sources

@rhdh-bot

rhdh-bot commented Sep 4, 2026

Copy link
Copy Markdown
Collaborator

PR Build Results

Build passed -- 36/36 titles | 93s
Preview: https://redhat-developer.github.io/red-hat-developers-documentation-rhdh/pr-2579/


Content Quality Assessment

CQA Report

  • CQA-00a: Orphaned modules
  • CQA-00b: Directory structure
  • CQA-01: Vale AsciiDoc DITA compliance
  • CQA-02: Verify assembly structure
  • CQA-03: Verify content type metadata
  • CQA-04: Verify module templates
  • CQA-05: Verify required modular elements
  • CQA-06: Verify assemblies follow official template (one user story)
  • CQA-07: Verify TOC depth (max 3 levels)
  • CQA-08: Verify short description content quality
  • CQA-09: Verify short description format
  • CQA-10: Verify titles are brief, complete, and descriptive
  • CQA-11: Verify procedure prerequisites
  • CQA-12: Verify grammar and style (Vale)
  • CQA-13: Verify content matches declared type
  • CQA-14: Verify no broken links
  • CQA-14b: Inbound link stability (no ID changes for existing files)
  • CQA-15: Check redirects
  • CQA-16: Verify official product names
  • CQA-17: Verify legal disclaimers for preview features
  • CQA-jtbd-01: Verify navigation file structure
  • CQA-jtbd-02: Modules not yet in product_product (informational)

Summary

Checks: 22 total, 22 pass, 0 fail

Modules not yet in product_product

15 modules (proc, con, ref) are not yet included in the product_product title.

modules/extend_configuring-dynamic-plugins/ (4)
  • modules/extend_configuring-dynamic-plugins/con-extra-catalog-naming-conventions.adoc
  • modules/extend_configuring-dynamic-plugins/con-primary-vs-extra-catalog-index-images.adoc
  • modules/extend_configuring-dynamic-plugins/ref-extra-catalog-index-directory-structure.adoc
  • modules/extend_configuring-dynamic-plugins/ref-extra-catalog-index-images-environment-variable.adoc
modules/shared/ (8)
  • modules/shared/proc-configure-extra-catalog-index-images-disconnected.adoc
  • modules/shared/proc-configure-extra-catalog-index-images-helm.adoc
  • modules/shared/proc-configure-extra-catalog-index-images-operator.adoc
  • modules/shared/proc-configure-extra-catalog-index-images-rhdh-local.adoc
  • modules/shared/proc-configure-rate-limits-for-lightspeed.adoc
  • modules/shared/proc-enable-real-time-notifications-with-the-signals-plugin.adoc
  • modules/shared/ref-ai-feature-permissions.adoc
  • modules/shared/ref-helm-chart-catalog-index-extra-images.adoc
modules/upgrade_upgrade-rhdh/ (3)
  • modules/upgrade_upgrade-rhdh/con-rhdh-upgrade-helper-skill.adoc
  • modules/upgrade_upgrade-rhdh/proc-run-the-rhdh-upgrade-helper-skill.adoc
  • modules/upgrade_upgrade-rhdh/ref-rhdh-upgrade-helper-skill-configuration-inputs.adoc

22 checks: 22 pass, 0 fail

Run node build/scripts/cqa/index.js --all --fix locally to review and auto-fix issues.


Updated 2026-09-07 14:50:58 UTC

@sonarqubecloud

sonarqubecloud Bot commented Sep 7, 2026

Copy link
Copy Markdown

* Catalog entities for the Extensions UI
* The `dynamic-plugins.default.yaml` file with out-of-the-box plugin configurations

When you deploy {product}, plugins listed in the primary catalog's `dynamic-plugins.default.yaml` install automatically. This ensures a consistent baseline plugin ecosystem across {product} installations.

@rm3l rm3l Sep 8, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For clarity, they will only be installed automatically if they are enabled by default in dynamic-plugins.default.yaml. Otherwise, they won't be installed automatically even if they are listed in the primary catalog's dynamic-plugins.default.yaml file.

Comment on lines +134 to +137
If a catalog index image does not contain a `catalog-entities/` directory at the root level, {product} checks the following fallback locations in order:

. `marketplace/`
. `extensions/`

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is accurate. It checks catalog-entities/extensions and catalog-entities/marketplace in this order. These are subdirs within catalog-entities, not root-level dirs. And if there is no catalog-entities/, it just logs a warning message.
See https://github.com/redhat-developer/rhdh-plugins/blob/0ec0b3f4b23ba8ca1dc951c84ee9711cedb2cbee/workspaces/install-dynamic-plugins/packages/install-dynamic-plugins/src/catalog-index.ts#L62-L65 and https://github.com/redhat-developer/rhdh-plugins/blob/0ec0b3f4b23ba8ca1dc951c84ee9711cedb2cbee/workspaces/install-dynamic-plugins/packages/install-dynamic-plugins/src/catalog-index.ts#L224-L230

Comment on lines +132 to +142
In disconnected or air-gapped environments using the Operator, you must configure matching `RELATED_IMAGE_extra_catalog_index_<name>` environment variables on the Operator controller.
The `<name>` portion of the `RELATED_IMAGE` variable must match the subdirectory name used in `EXTRA_CATALOG_INDEX_IMAGES`.

Example:

[source,yaml]
----
# Operator deployment
env:
- name: RELATED_IMAGE_extra_catalog_index_community
value: internal-registry.example.com/community/catalog:v1.10

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We pushed back on this approach, so not accurate. The procedure for mirroring a catalog index image is already here and involves calling the mirroring script: https://docs.redhat.com/en/documentation/red_hat_developer_hub/1.10/html-single/installing_and_viewing_plugins_in_red_hat_developer_hub/index#catalog-index-image-mirroring_deploy-rhdh-with-mirrored-plugins-in-a-disconnected-environment

|`tag`
|String
|Yes
|The image tag (for example, `v1.10.0`, `latest`, `sha256:abc123`).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|The image tag (for example, `v1.10.0`, `latest`, `sha256:abc123`).
|The image tag (for example, `v1.10.0`, `latest`).

sha256:abc123 is a digest actually.

Comment on lines +3 to +129
[id="extra-catalog-index-directory-structure_{context}"]
= Extra catalog index directory structure reference

[role="_abstract"]
{product} extracts catalog index images into a structured directory tree under `/extensions/`. Understanding this structure helps you verify and troubleshoot catalog extraction and configuration issues.

[id="primary-catalog-directory-structure_{context}"]
== Primary catalog directory structure

The primary catalog index image (configured via `CATALOG_INDEX_IMAGE`) is extracted to `/extensions/`:

----
/extensions/
├── catalog-entities/ # Plugin metadata for Extensions UI
└── dynamic-plugins.default.yaml # Default plugin configurations
----

The `catalog-entities/` directory contains Backstage software catalog descriptor files in YAML or JSON format.
The Extensions UI reads these files to display available plugins.

The `dynamic-plugins.default.yaml` file contains default plugin configurations.
{product} applies these configurations automatically during installation.

[id="extra-catalog-directory-structure_{context}"]
== Extra catalog directory structure

Each extra catalog index image (configured via `EXTRA_CATALOG_INDEX_IMAGES`) is extracted to `/extensions/extra/<subdirectory>/`:

----
/extensions/
├── catalog-entities/ # From CATALOG_INDEX_IMAGE
├── dynamic-plugins.default.yaml # From CATALOG_INDEX_IMAGE
└── extra/
├── community/
│ └── catalog-entities/ # From extra catalog "community"
├── partner/
│ └── catalog-entities/ # From extra catalog "partner"
└── internal/
└── catalog-entities/ # From extra catalog "internal"
----

In this example:

* The `community/` subdirectory contains catalog entities from an extra catalog configured with the name `community`.
* The `partner/` subdirectory contains catalog entities from an extra catalog configured with the name `partner`.
* The `internal/` subdirectory contains catalog entities from an extra catalog configured with the name `internal`.

Each subdirectory contains only `catalog-entities/`.
Extra catalog index images do not provide `dynamic-plugins.default.yaml`.

[id="subdirectory-naming-rules_{context}"]
== Subdirectory naming rules

The subdirectory name under `/extensions/extra/` is determined by:

Explicit name:: When you configure an extra catalog using the `name=image_ref` format, the subdirectory name is the `<name>` portion.
+
Example: `community=quay.io/community/plugins:v1.10` creates `/extensions/extra/community/`.

Auto-derived name:: When you configure an extra catalog using the plain `image_ref` format, {product} derives the subdirectory name from the image reference by replacing `/`, `:`, and `@` characters with underscores (`_`).
+
Example: `quay.io/community/plugins:v1.10` creates `/extensions/extra/quay.io_community_plugins_v1.10/`.

[id="directory-structure-examples_{context}"]
== Directory structure examples

Single extra catalog with explicit name:

Configuration: `EXTRA_CATALOG_INDEX_IMAGES="community=quay.io/community/rhdh-plugin-catalog:v1.10.0"`

Resulting directory structure:

----
/extensions/
├── catalog-entities/
├── dynamic-plugins.default.yaml
└── extra/
└── community/
└── catalog-entities/
├── plugin-a.yaml
├── plugin-b.yaml
└── plugin-c.yaml
----

Multiple extra catalogs with mixed naming:

Configuration: `EXTRA_CATALOG_INDEX_IMAGES="community=quay.io/community/plugins:v1.10,quay.io/partner/catalog:latest,internal=registry.example.com/custom:v2.0"`

Resulting directory structure:

----
/extensions/
├── catalog-entities/
├── dynamic-plugins.default.yaml
└── extra/
├── community/
│ └── catalog-entities/
├── quay.io_partner_catalog_latest/
│ └── catalog-entities/
└── internal/
└── catalog-entities/
----

In this example:

* `community` and `internal` use explicit names.
* `quay.io_partner_catalog_latest` is auto-derived from the image reference `quay.io/partner/catalog:latest`.

Auto-derived names with complex image references:

Configuration: `EXTRA_CATALOG_INDEX_IMAGES="registry.example.com/team/plugins:v1.10.0,quay.io/org/catalog@sha256:abc123"`

Resulting directory structure:

----
/extensions/
├── catalog-entities/
├── dynamic-plugins.default.yaml
└── extra/
├── registry.example.com_team_plugins_v1.10.0/
│ └── catalog-entities/
└── quay.io_org_catalog_sha256_abc123/
└── catalog-entities/
----

Auto-derived names can become unwieldy with complex image references.
For production deployments, explicit naming is recommended.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should all this be documented at all? It sounds like internal implementation detail on how we extract the different extra catalog index images, but nothing IMO really impacting the customer, no? We are doing this so all extra index images are extracted to unique folders, so that plugins can correctly be discovered by the Extensions backend. If later we decide to change the extraction pattern, the documentation here would be stale.
Just the last recommendation on explicit naming seems important from the end-user's standpoint. The rest is internal detail IMO. WDYT?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Technical review needed 🔩 Test all the procedures

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants