Skip to content

Conversation

@TheRealJon
Copy link
Member

@TheRealJon TheRealJon commented Nov 12, 2025

This PR integrates OLM version 1 into the developer catalog

OLMv1 Feature Integration

  • Tech Preview Infrastructure: Added TECH_PREVIEW feature flag based on server-side configuration
  • User Preferences: Created OLMV1_ENABLED flag synchronized with user settings (console.olmv1.enabled)
  • Unified Catalog: Integrated OLMv1 operators into the main dev-catalog instead of standalone page
  • User Controls: Toolbar toggle and User Preferences checkbox both control OLMv1 visibility
  • Smart Filtering: Legacy operator catalog extensions disabled when OLMv1 is enabled

Technical Changes

Frontend:

  • OLMv1 Alert displays only in Software Catalog only when Operator type is selected and olmv1 is enabled
  • OLMv1 switch displays in Software Catalog toolbar, only when Operator type is selected and TECH_PREVIEW feature flag is true
  • Complete test coverage with unit tests and React Testing Library tests

Backend:

  • Extended Server struct to expose techPreview flag to frontend
  • New bridge endpoint for OLMv1 integration

Testing

  • Unit tests for extension hook filtering logic
  • RTL tests for component rendering

@openshift-ci openshift-ci bot added component/backend Related to backend component/core Related to console core functionality approved Indicates a PR has been approved by an approver from all required OWNERS files. component/dashboard Related to dashboard component/helm Related to helm-plugin component/olm Related to OLM component/sdk Related to console-plugin-sdk component/shared Related to console-shared kind/i18n Indicates issue or PR relates to internationalization or has content that needs to be translated plugin-api-changed Categorizes a PR as containing plugin API changes labels Nov 12, 2025
Copy link
Member Author

@TheRealJon TheRealJon left a comment

Choose a reason for hiding this comment

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

Group review comments

@TheRealJon
Copy link
Member Author

QE Approver
/assign @yapei

Docs Approver:
/assign @jseseCCS

PX Approver:
/assign @sferich888

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 12, 2025

@TheRealJon: GitHub didn't allow me to assign the following users: jseseCCS.

Note that only openshift members with read permissions, repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see the contributor guide

In response to this:

QE Approver
/assign @yapei

Docs Approver:
/assign @jseseCCS

PX Approver:
/assign @sferich888

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

}
]
"id": "olmv1-catalog",
"label": "%olm-v1~OLMV1 Catalog%"
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
"label": "%olm-v1~OLMV1 Catalog%"
"label": "%olm-v1~OLMv1 Catalog%"

it would be good if OLMv1 word is consistent across all pages

@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Nov 13, 2025
TheRealJon and others added 5 commits November 17, 2025 15:59
Implements an application-level TECH_PREVIEW feature flag in the console-app
package that is set based on the SERVER_FLAGS.techPreview value from the
backend.

Frontend changes:
- Add FLAG_TECH_PREVIEW constant to console-app/src/consts.ts
- Create useTechPreviewFlagProvider hook to set flag from server
- Register hook provider in console-app console-extensions.json
- Export provider in console-app package.json
- Add techPreview type to SERVER_FLAGS interface

Backend changes:
- Add TechPreview field to Server struct
- Add techPreview to jsGlobals struct
- Pass techPreview value to frontend in index handler

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Adds a new extension point allowing plugins to contribute toolbar items
to the Catalog view for specific catalog types. This enables plugins to
provide custom UI controls (like toggles, filters, or actions) that
appear in the catalog toolbar alongside the existing search, sort, and
grouping controls.

Changes include:
- New CatalogToolbarItem extension type in console-dynamic-plugin-sdk
- Extension consumption in console-shared catalog components
- Unit tests for useCatalogExtensions hook covering toolbar item filtering
- React Testing Library tests for CatalogToolbar component rendering

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Adds a toolbar toggle component that allows users to enable/disable OLMv1
operators in the developer catalog. The toggle uses user settings to persist
state and includes a tech preview label with informational popover.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
This commit adds a user-controlled feature flag for OLMv1 catalog that:
- Creates OLMV1_ENABLED flag synchronized with console.olmv1.enabled user setting
- Adds User Preferences tab under "OLMV1 Catalog" group for toggling OLMv1
- Integrates OLMv1 into dev-catalog instead of standalone /olmv1/catalog page
- Disables legacy operator catalog extensions when OLMV1_ENABLED is true
- Fixes loading state bug in useCatalogItems hook
- Fixes type mismatch (operator vs OLMv1CatalogItem) in catalog items
- Adds defensive null checks in catalog shared components

Both the toolbar toggle and user preferences checkbox control the same
setting, ensuring a synchronized experience across the console.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@openshift-ci openshift-ci bot added the docs-approved Signifies that Docs has signed off on this PR label Nov 18, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 7f7130e and 2f550ee.

📒 Files selected for processing (1)
  • frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx (3 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx
🔇 Additional comments (2)
frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx (2)

143-145: Well done fixing the critical logic error!

The defensive initialization correctly addresses the past review concern where items were silently lost. Items with types not present in catalogProviderExtensions will now be properly collected.


168-171: Verify deduplication behavior when categories share IDs but differ in properties.

uniqBy keeps the first occurrence and discards duplicates. If multiple category providers return categories with the same id but different properties (e.g., label, description), only the first will be retained. Confirm this is the intended behavior.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx (1)

168-171: Category aggregation/deduping looks good; consider defensive filtering

Flattening categoryProviderMap and uniqBy(..., 'id') is a clean way to expose a single de‑duplicated category list to consumers.

If plugin providers ever return null/undefined entries, you could defensively filter them out before dedupe to keep categories strictly CatalogCategory[] at runtime:

-  const categories = React.useMemo(
-    () => _.uniqBy(_.flatten(Object.values(categoryProviderMap)), 'id'),
-    [categoryProviderMap],
-  );
+  const categories = React.useMemo(
+    () =>
+      _.uniqBy(
+        _.flatten(Object.values(categoryProviderMap)).filter(Boolean),
+        'id',
+      ),
+    [categoryProviderMap],
+  );

Not required if providers already guarantee well‑formed arrays, but it would make this layer more robust against bad plugin data.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 2f550ee and aae5133.

📒 Files selected for processing (2)
  • frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx (3 hunks)
  • frontend/packages/operator-lifecycle-manager-v1/src/hooks/useCatalogItems.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx
  • frontend/packages/operator-lifecycle-manager-v1/src/hooks/useCatalogItems.ts
🔇 Additional comments (4)
frontend/packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx (2)

106-113: Category provider map update now avoids redundant state changes

Using _.isEqual inside setCategoryProviderMap to short‑circuit when newCategories hasn’t actually changed is correct and prevents unnecessary re‑renders. The callback signature also now matches the resolver’s (value, id) shape, so categories from all providers will be preserved.


137-147: Type bucketing fix correctly preserves items for previously-unknown types

Initializing result[item.type] on demand before push ensures catalog items whose type wasn’t preseeded from catalogProviderExtensions are no longer dropped on the floor. The overall catalogItemsMap construction remains straightforward and efficient for the expected data sizes.

frontend/packages/operator-lifecycle-manager-v1/src/hooks/useCatalogItems.ts (2)

62-66: LGTM: Cleanup prevents memory leaks.

The cleanup effect correctly aborts in-flight requests when the component unmounts, preventing the setState warnings mentioned in the past review.


23-30: No action required—Cache-Control request header is intentionally expected by the backend.

The backend (pkg/olm/catalog_client.go:78) explicitly sets Cache-Control as a request header, confirming this is a deliberate design choice rather than a mistake. The frontend and backend are aligned on this pattern: both send Cache-Control: max-age=300 when caching is needed.

Comment on lines +32 to +60
const fetchItems = useCallback(() => {
abortControllerRef.current?.abort();
abortControllerRef.current = new AbortController();

consoleFetch('/api/olm/catalog-items/', { headers, signal: abortControllerRef.current.signal })
.then((response) => {
if (response.status === 304) {
return null;
}

// Only update state on successful 200 response
if (response.status === 200) {
setLastModified((current) => response.headers.get('Last-Modified') || current);
return response.json();
}
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
})
.then((olmItems: OLMCatalogItem[] | null) => {
if (olmItems !== null) {
setOLMCatalogItems(olmItems);
}
setLoading(false);
})
.catch((err) => {
if (err.name === 'AbortError') return;
setError(err.toString());
setLoading(false);
});
}, [headers]);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Clear error state on successful fetch.

The error state (line 57) is never cleared when subsequent requests succeed. This leads to stale error messages persisting after recovery.

Apply this diff to clear the error state on successful requests:

       .then((olmItems: OLMCatalogItem[] | null) => {
         if (olmItems !== null) {
           setOLMCatalogItems(olmItems);
         }
+        setError('');
         setLoading(false);
       })

Additionally, consider clearing the error when starting a new fetch attempt:

   const fetchItems = useCallback(() => {
     abortControllerRef.current?.abort();
     abortControllerRef.current = new AbortController();
+    setError('');

     consoleFetch('/api/olm/catalog-items/', { headers, signal: abortControllerRef.current.signal })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const fetchItems = useCallback(() => {
abortControllerRef.current?.abort();
abortControllerRef.current = new AbortController();
consoleFetch('/api/olm/catalog-items/', { headers, signal: abortControllerRef.current.signal })
.then((response) => {
if (response.status === 304) {
return null;
}
// Only update state on successful 200 response
if (response.status === 200) {
setLastModified((current) => response.headers.get('Last-Modified') || current);
return response.json();
}
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
})
.then((olmItems: OLMCatalogItem[] | null) => {
if (olmItems !== null) {
setOLMCatalogItems(olmItems);
}
setLoading(false);
})
.catch((err) => {
if (err.name === 'AbortError') return;
setError(err.toString());
setLoading(false);
});
}, [headers]);
const fetchItems = useCallback(() => {
abortControllerRef.current?.abort();
abortControllerRef.current = new AbortController();
setError('');
consoleFetch('/api/olm/catalog-items/', { headers, signal: abortControllerRef.current.signal })
.then((response) => {
if (response.status === 304) {
return null;
}
// Only update state on successful 200 response
if (response.status === 200) {
setLastModified((current) => response.headers.get('Last-Modified') || current);
return response.json();
}
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
})
.then((olmItems: OLMCatalogItem[] | null) => {
if (olmItems !== null) {
setOLMCatalogItems(olmItems);
}
setError('');
setLoading(false);
})
.catch((err) => {
if (err.name === 'AbortError') return;
setError(err.toString());
setLoading(false);
});
}, [headers]);
🤖 Prompt for AI Agents
In frontend/packages/operator-lifecycle-manager-v1/src/hooks/useCatalogItems.ts
around lines 32 to 60, the error state is never cleared after a successful
fetch, causing stale error messages to persist; to fix, clear the error at the
start of a new fetch (before launching the request) and also clear it when a 200
response is processed (e.g., call setError(null) right before or after
setOLMCatalogItems when olmItems is not null), ensuring you still
setLoading(false) and preserve existing abort handling.

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 19, 2025

@TheRealJon: all tests passed!

Full PR test history. Your PR dashboard.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@rhamilto
Copy link
Member

/lgtm

Since this is the first of several PRs and is behind a feature flag.

There are known issues with the display of SyncMarkdownView that @TheRealJon plans to address in a follow-on.

@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Nov 19, 2025
@rhamilto rhamilto added the plugin-api-approved Indicates a PR with plugin API changes has been approved by an API reviewer label Nov 19, 2025
@TheRealJon
Copy link
Member Author

@yapei Could you take a look when you get a chance? Would love to merge this before Friday.

@yapei
Copy link
Contributor

yapei commented Nov 20, 2025

created a cluster-bot cluster, enable featuregate via oc patch featuregate cluster -p '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' --type merge
the only problem is there is noOperators type on Software Catalog page, no catalog items are returned even we have 200 response for /api/olm/catalog-items

$ oc get route -n openshift-catalogd
NAME             HOST/PORT                                                                           PATH   SERVICES           PORT    TERMINATION            WILDCARD
catalogd-route   catalogd-route-openshift-catalogd.apps.ci-ln-vj4hzyk-72292.gcp-2.ci.openshift.org          catalogd-service   https   passthrough/Redirect   None

$ oc get clusterrole console -o json | jq '.rules[] | select(.apiGroups[] == "operators.coreos.com" and .resources[] == "clustercatalogs")'
{
  "apiGroups": [
    "operators.coreos.com"
  ],
  "resources": [
    "clustercatalogs"
  ],
  "verbs": [
    "get",
    "list",
    "watch"
  ]
}

and we can still see following error in console pod

E1120 08:14:39.706947       1 reflector.go:200] "Failed to watch" err="failed to list *v1.ClusterCatalog: clustercatalogs.olm.operatorframework.io is forbidden: User \"system:serviceaccount:openshift-console:console\" cannot list resource \"clustercatalogs\" in API group \"olm.operatorframework.io\" at the cluster scope" logger="UnhandledError" reflector="sigs.k8s.io/controller-runtime/pkg/cache/internal/informers.go:108" type="*v1.ClusterCatalog"
{"level":"error","ts":"2025-11-20T08:14:55Z","msg":"Could not wait for Cache to sync","controller":"clustercatalog","controllerGroup":"olm.operatorframework.io","controllerKind":"ClusterCatalog","source":"kind source: *v1.ClusterCatalog","error":"failed to wait for clustercatalog caches to sync kind source: *v1.ClusterCatalog: timed out waiting for cache to be synced for Kind *v1.ClusterCatalog","stacktrace":"sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller[...]).Start.func2.1.1\n\t/go/src/github.com/openshift/console/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:216"}
{"level":"info","ts":"2025-11-20T08:14:55Z","msg":"Stopping and waiting for non leader election runnables"}
{"level":"info","ts":"2025-11-20T08:14:55Z","msg":"Stopping and waiting for leader election runnables"}
{"level":"info","ts":"2025-11-20T08:14:55Z","msg":"Stopping and waiting for caches"}
{"level":"error","ts":"2025-11-20T08:14:55Z","logger":"controller-runtime.source.EventHandler","msg":"failed to get informer from cache","error":"Timeout: failed waiting for *v1.ClusterCatalog Informer to sync","stacktrace":"sigs.k8s.io/controller-runtime/pkg/internal/source.(*Kind[...]).Start.func1.1\n\t/go/src/github.com/openshift/console/vendor/sigs.k8s.io/controller-runtime/pkg/internal/source/kind.go:76\nk8s.io/apimachinery/pkg/util/wait.loopConditionUntilContext.func1\n\t/go/src/github.com/openshift/console/vendor/k8s.io/apimachinery/pkg/util/wait/loop.go:53\nk8s.io/apimachinery/pkg/util/wait.loopConditionUntilContext\n\t/go/src/github.com/openshift/console/vendor/k8s.io/apimachinery/pkg/util/wait/loop.go:54\nk8s.io/apimachinery/pkg/util/wait.PollUntilContextCancel\n\t/go/src/github.com/openshift/console/vendor/k8s.io/apimachinery/pkg/util/wait/poll.go:33\nsigs.k8s.io/controller-runtime/pkg/internal/source.(*Kind[...]).Start.func1\n\t/go/src/github.com/openshift/console/vendor/sigs.k8s.io/controller-...
{"level":"info","ts":"2025-11-20T08:14:55Z","msg":"Stopping and waiting for webhooks"}
{"level":"info","ts":"2025-11-20T08:14:55Z","msg":"Stopping and waiting for HTTP servers"}
{"level":"info","ts":"2025-11-20T08:14:55Z","msg":"Wait completed, proceeding to shutdown the manager"}
E1120 08:14:55.778863       1 main.go:631] problem running manager: failed to wait for clustercatalog caches to sync kind source: *v1.ClusterCatalog: timed out waiting for cache to be synced for Kind *v1.ClusterCatalog
software-catalog cluster-extensions

@TheRealJon
Copy link
Member Author

Hi @yapei, sorry, I should have mentioned, openshift/console-operator#1068 fixes the issue with console ClusterCatalog permissions. Could you test these two together?

Copy link

@jseseCCS jseseCCS left a comment

Choose a reason for hiding this comment

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

Finished reviewing all user-facing content. Added a few small wording suggestions; everything else looks good. Let me know if you need anything else.

}, []);

const catalogCategories = React.useMemo<CatalogCategory[]>(() => {
const allCategory = { id: ALL_CATEGORY, label: t('console-shared~All items') };

Choose a reason for hiding this comment

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

--> All Items (for consistent case?)

Choose a reason for hiding this comment

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

@jseseCCS PatternFly recommends sentence case so for any inconsistencies, I'd change the other items to sentence case https://www.patternfly.org/ux-writing/capitalization

}
>
{t(
"With OLMv1, you'll get a much simpler API that's easier to work with and understand. Plus, you have more direct control over updates. You can define update ranges and decide exactly how they are rolled out.",

Choose a reason for hiding this comment

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

we shouldn’t describe OLMv1 as “simpler,” “easier to work with,” “easier to understand” unless we provide concrete examples that map to those descriptions. Suggest removing those claims. For example --> "With OLMv1, you have more direct control over updates. You can define update ranges and decide how updates are rolled out."

give example of rollout definition options?

const popoverContent = (
<div>
{t(
'olm-v1~Lets you use OLMv1 (Tech Preview), a streamlined redesign of OLMv0. OLMv1 simplifies operator management with declarative APIs, enhanced security, and direct, GitOps-friendly control over upgrades.',

Choose a reason for hiding this comment

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

suggested rewrite: “OLMv1, a technology preview, is the next iteration of OLM...."

also, we shouldn’t claim OLMv1 is “streamlined,” “simplifies,” “GitOps-friendly” unless we can support those with specific user-visible examples/differences.

label={t('olm-v1~Enable OLMv1')}
isChecked={olmv1Enabled ?? false}
onChange={handleToggle}
aria-label={t('olm-v1~Toggle OLMv1 UI')}

Choose a reason for hiding this comment

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

suggestion --> aria-label={t('olm-v1-Toggle OLMv1 visibility')}

<Popover aria-label={t('olm-v1~OLMv1 information')} bodyContent={popoverContent}>
<Button
icon={<OutlinedQuestionCircleIcon />}
aria-label={t('olm-v1~OLMv1 information')}

Choose a reason for hiding this comment

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

suggestion --> aria-label={t('olm-v1-More information about OLMv1')}

{ label: 'Source', value: source || '-' },
{ label: 'Provider', value: provider || '-' },
{
label: 'Infrastructure features',

Choose a reason for hiding this comment

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

“Infrastructure Features” for consistency with other catalog labels that use headline case?

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 20, 2025

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jseseCCS, rhamilto, TheRealJon

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@TheRealJon
Copy link
Member Author

Finished reviewing all user-facing content. Added a few small wording suggestions; everything else looks good. Let me know if you need anything else.

All of the user-facing text came from the UXD designs. @kevinhatchoua do you mind taking a look at Jocelyn's suggestions?

@yapei
Copy link
Contributor

yapei commented Nov 21, 2025

tested the changes with openshift/console-operator#1068 now works well
olmv1-enabled
olmv1-disabled

/verified by @yapei

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Nov 21, 2025
@openshift-ci-robot
Copy link
Contributor

@yapei: This PR has been marked as verified by @yapei.

In response to this:

tested the changes with openshift/console-operator#1068 now works well
olmv1-enabled
olmv1-disabled

/verified by @yapei

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@TheRealJon
Copy link
Member Author

/jira refresh

@openshift-ci-robot
Copy link
Contributor

@TheRealJon: No Jira issue is referenced in the title of this pull request.
To reference a jira issue, add 'XYZ-NNN:' to the title of this pull request and request another refresh with /jira refresh.

In response to this:

/jira refresh

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@TheRealJon TheRealJon changed the title CONSOLE-4729,CONSOLE4823: Enable OLMv1 Tech Preview CONSOLE-4729,CONSOLE-4823: Enable OLMv1 Tech Preview Nov 21, 2025
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Nov 21, 2025
@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Nov 21, 2025

@TheRealJon: This pull request references CONSOLE-4729 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

This pull request references CONSOLE-4823 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

In response to this:

This PR integrates OLM version 1 into the developer catalog

OLMv1 Feature Integration

  • Tech Preview Infrastructure: Added TECH_PREVIEW feature flag based on server-side configuration
  • User Preferences: Created OLMV1_ENABLED flag synchronized with user settings (console.olmv1.enabled)
  • Unified Catalog: Integrated OLMv1 operators into the main dev-catalog instead of standalone page
  • User Controls: Toolbar toggle and User Preferences checkbox both control OLMv1 visibility
  • Smart Filtering: Legacy operator catalog extensions disabled when OLMv1 is enabled

Technical Changes

Frontend:

  • OLMv1 Alert displays only in Software Catalog only when Operator type is selected and olmv1 is enabled
  • OLMv1 switch displays in Software Catalog toolbar, only when Operator type is selected and TECH_PREVIEW feature flag is true
  • Complete test coverage with unit tests and React Testing Library tests

Backend:

  • Extended Server struct to expose techPreview flag to frontend
  • New bridge endpoint for OLMv1 integration

Testing

  • Unit tests for extension hook filtering logic
  • RTL tests for component rendering

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@TheRealJon
Copy link
Member Author

/jira refresh

@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Nov 21, 2025

@TheRealJon: This pull request references CONSOLE-4729 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

This pull request references CONSOLE-4823 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

In response to this:

/jira refresh

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-merge-bot openshift-merge-bot bot merged commit c52e48c into openshift:main Nov 21, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. component/backend Related to backend component/core Related to console core functionality component/dashboard Related to dashboard component/helm Related to helm-plugin component/olm Related to OLM component/sdk Related to console-plugin-sdk component/shared Related to console-shared docs-approved Signifies that Docs has signed off on this PR jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. kind/i18n Indicates issue or PR relates to internationalization or has content that needs to be translated lgtm Indicates that a PR is ready to be merged. plugin-api-approved Indicates a PR with plugin API changes has been approved by an API reviewer plugin-api-changed Categorizes a PR as containing plugin API changes px-approved Signifies that Product Support has signed off on this PR verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.