diff --git a/frontend/packages/operator-lifecycle-manager-v1/console-extensions.json b/frontend/packages/operator-lifecycle-manager-v1/console-extensions.json
index f1f3b5ad28..00bd522d36 100644
--- a/frontend/packages/operator-lifecycle-manager-v1/console-extensions.json
+++ b/frontend/packages/operator-lifecycle-manager-v1/console-extensions.json
@@ -32,23 +32,6 @@
"flag": "CLUSTER_EXTENSION_API"
}
},
- {
- "type": "console.navigation/resource-cluster",
- "properties": {
- "id": "installed-extensions",
- "section": "ecosystem",
- "name": "%olm-v1~Installed Operators%",
- "model": {
- "kind": "ClusterExtension",
- "version": "v1",
- "group": "olm.operatorframework.io"
- },
- "startsWith": ["olm.operatorframework.io"]
- },
- "flags": {
- "required": ["CLUSTER_EXTENSION_API", "TECH_PREVIEW", "OLMV1_ENABLED"]
- }
- },
{
"type": "console.catalog/item-provider",
"properties": {
@@ -117,5 +100,45 @@
"flags": {
"required": ["CLUSTER_EXTENSION_API"]
}
+ },
+ {
+ "type": "console.action/resource-provider",
+ "properties": {
+ "model": {
+ "group": "olm.operatorframework.io",
+ "version": "v1",
+ "kind": "ClusterExtension"
+ },
+ "provider": { "$codeRef": "defaultActionsProvider.useDefaultActionsProvider" }
+ },
+ "flags": {
+ "required": ["CLUSTER_EXTENSION_API"]
+ }
+ },
+ {
+ "type": "console.navigation/href",
+ "properties": {
+ "id": "installed-software",
+ "section": "ecosystem",
+ "name": "%olm-v1~Installed Software%",
+ "insertAfter": "developer-catalog",
+ "href": "/installed-software",
+ "namespaced": true,
+ "startsWith": ["installed-software"]
+ },
+ "flags": {
+ "required": ["TECH_PREVIEW", "OLMV1_ENABLED", "CLUSTER_EXTENSION_API"]
+ }
+ },
+ {
+ "type": "console.page/route",
+ "properties": {
+ "exact": false,
+ "path": ["/installed-software/all-namespaces", "/installed-software/ns/:ns"],
+ "component": { "$codeRef": "installedSoftwarePage.default" }
+ },
+ "flags": {
+ "required": ["CLUSTER_EXTENSION_API"]
+ }
}
]
diff --git a/frontend/packages/operator-lifecycle-manager-v1/locales/en/olm-v1.json b/frontend/packages/operator-lifecycle-manager-v1/locales/en/olm-v1.json
index d61b0f1ff4..aa11e8c5e3 100644
--- a/frontend/packages/operator-lifecycle-manager-v1/locales/en/olm-v1.json
+++ b/frontend/packages/operator-lifecycle-manager-v1/locales/en/olm-v1.json
@@ -1,9 +1,9 @@
{
- "Installed Operators": "Installed Operators",
"Operators": "Operators",
"OLMv1 Catalog": "OLMv1 Catalog",
"Enable the OLMv1 catalog experience. OLMv1 is a technology preview feature that provides an updated operator catalog interface.": "Enable the OLMv1 catalog experience. OLMv1 is a technology preview feature that provides an updated operator catalog interface.",
"Enable OLMv1 catalog": "Enable OLMv1 catalog",
+ "Installed Software": "Installed Software",
"An error occurred creating the ClusterExtension: {{error}}": "An error occurred creating the ClusterExtension: {{error}}",
"Name": "Name",
"Package name": "Package name",
@@ -43,17 +43,22 @@
"Package will only be resolved from specified catalogs.": "Package will only be resolved from specified catalogs.",
"Create": "Create",
"Cancel": "Cancel",
+ "Status": "Status",
+ "Package": "Package",
+ "ClusterExtensions": "ClusterExtensions",
"Create ClusterExtension": "Create ClusterExtension",
"Create a ClusterExtension to add functionality to your cluster. Operator Lifecycle Manager v1 manages ClusterExtensions.": "Create a ClusterExtension to add functionality to your cluster. Operator Lifecycle Manager v1 manages ClusterExtensions.",
"An error occurred. Please try again.": "An error occurred. Please try again.",
"Create ServiceAccount": "Create ServiceAccount",
"An error occurred": "An error occurred",
+ "Cluster extensions (OLMv1)": "Cluster extensions (OLMv1)",
+ "Operators (OLMv0)": "Operators (OLMv0)",
"Operator Lifecycle Management version 1": "Operator Lifecycle Management version 1",
"Learn more about OLMv1": "Learn more about OLMv1",
"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.": "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.",
- "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.": "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.",
"Enable OLMv1": "Enable OLMv1",
"Toggle OLMv1 UI": "Toggle OLMv1 UI",
+ "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.": "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.",
"Tech Preview": "Tech Preview",
"OLMv1 information": "OLMv1 information"
}
\ No newline at end of file
diff --git a/frontend/packages/operator-lifecycle-manager-v1/package.json b/frontend/packages/operator-lifecycle-manager-v1/package.json
index c4c33f99af..a3fdf2a964 100644
--- a/frontend/packages/operator-lifecycle-manager-v1/package.json
+++ b/frontend/packages/operator-lifecycle-manager-v1/package.json
@@ -8,7 +8,9 @@
"useCatalogItems": "src/hooks/useCatalogItems.ts",
"useCatalogCategories": "src/hooks/useCatalogCategories.ts",
"useOLMv1FlagProvider": "src/hooks/useOLMv1FlagProvider.ts",
- "CreateClusterExtension": "src/components/cluster-extension/CreateClusterExtension.tsx"
+ "CreateClusterExtension": "src/components/cluster-extension/CreateClusterExtension.tsx",
+ "defaultActionsProvider": "src/actions/providers/default-actions-provider.ts",
+ "installedSoftwarePage": "src/components/installed-software/InstalledSoftwarePage.tsx"
}
}
}
diff --git a/frontend/packages/operator-lifecycle-manager-v1/src/actions/providers/default-actions-provider.ts b/frontend/packages/operator-lifecycle-manager-v1/src/actions/providers/default-actions-provider.ts
new file mode 100644
index 0000000000..869f068349
--- /dev/null
+++ b/frontend/packages/operator-lifecycle-manager-v1/src/actions/providers/default-actions-provider.ts
@@ -0,0 +1 @@
+export { useDefaultActionsProvider } from '@console/app/src/actions/providers/default-provider';
diff --git a/frontend/packages/operator-lifecycle-manager-v1/src/components/OLMv1Switch.tsx b/frontend/packages/operator-lifecycle-manager-v1/src/components/OLMv1Switch.tsx
index 336ea26926..b884df1891 100644
--- a/frontend/packages/operator-lifecycle-manager-v1/src/components/OLMv1Switch.tsx
+++ b/frontend/packages/operator-lifecycle-manager-v1/src/components/OLMv1Switch.tsx
@@ -1,12 +1,12 @@
import { useCallback } from 'react';
import type { FC, FormEvent } from 'react';
-import { Button, Flex, FlexItem, Label, Popover, Switch } from '@patternfly/react-core';
-import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-question-circle-icon';
+import { Flex, FlexItem, Switch } from '@patternfly/react-core';
import { useTranslation } from 'react-i18next';
import { FLAG_TECH_PREVIEW } from '@console/app/src/consts';
import { useFlag } from '@console/dynamic-plugin-sdk/src/utils/flags';
import { useUserSettings } from '@console/shared/src/hooks/useUserSettings';
import { OLMV1_ENABLED_USER_SETTING_KEY } from '../const';
+import { OLMv1TechPreviewBadge } from './OLMv1TechPreviewBadge';
/**
* Toolbar component for toggling OLMv1 UI visibility in the operator catalog.
@@ -28,14 +28,6 @@ export const OLMv1Switch: FC = () => {
[setOlmv1Enabled],
);
- const popoverContent = (
-
- {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.',
- )}
-
- );
-
return (
@@ -48,19 +40,7 @@ export const OLMv1Switch: FC = () => {
/>
-
-
-
-
- }
- aria-label={t('olm-v1~OLMv1 information')}
- variant="link"
- isInline
- />
-
+
);
diff --git a/frontend/packages/operator-lifecycle-manager-v1/src/components/OLMv1TechPreviewBadge.tsx b/frontend/packages/operator-lifecycle-manager-v1/src/components/OLMv1TechPreviewBadge.tsx
new file mode 100644
index 0000000000..3463e987fd
--- /dev/null
+++ b/frontend/packages/operator-lifecycle-manager-v1/src/components/OLMv1TechPreviewBadge.tsx
@@ -0,0 +1,38 @@
+import type { FC } from 'react';
+import { Button, Label, Popover } from '@patternfly/react-core';
+import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-question-circle-icon';
+import { useTranslation } from 'react-i18next';
+
+/**
+ * Shared tech preview badge with info popover for OLMv1 features.
+ * Displays a yellow outline label with "Tech Preview" and an info icon that shows
+ * a popover with details about OLMv1 when clicked.
+ * Renders inline for use in tabs or toolbars.
+ */
+export const OLMv1TechPreviewBadge: FC = () => {
+ const { t } = useTranslation();
+
+ const popoverContent = (
+
+ {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.',
+ )}
+