From 032c9039c7b6f7e8bf4e67106ff0a7275a699d0b Mon Sep 17 00:00:00 2001 From: Krish Agarwal Date: Wed, 13 Aug 2025 16:22:29 -0400 Subject: [PATCH 1/6] Fixed SNC Errors in detect-ns, dashboards, and console operator --- .../console-operator/ConsoleOperatorConfig.tsx | 12 ++++++------ .../ConsolePluginCSPStatusDetail.tsx | 2 +- .../ConsolePluginDescriptionDetail.tsx | 2 +- .../ConsolePluginEnabledStatusDetail.tsx | 6 +++--- .../console-operator/ConsolePluginManifestPage.tsx | 8 ++++---- .../console-operator/ConsolePluginStatusDetail.tsx | 2 +- .../console-operator/ConsolePluginVersionDetail.tsx | 2 +- .../components/dashboards-page/OperatorStatus.tsx | 2 +- .../src/components/dashboards-page/status.ts | 8 ++++++-- .../__tests__/checkNamespaceExists.spec.ts | 2 +- .../detect-namespace/getValueForNamespace.ts | 2 +- 11 files changed, 26 insertions(+), 22 deletions(-) diff --git a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx index ee17bdaec05..a4115669449 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx @@ -208,7 +208,7 @@ const ConsolePluginsTable: React.FC = ({ obj, rows, lo const compare = React.useCallback>( (a, b) => { const { index, direction } = sortBy; - const { id } = columns[index]; + const { id } = columns[index ?? 0]; const desc = direction === SortByDirection.desc; const left = (desc ? b : a)[id]; const right = (desc ? a : b)[id]; @@ -256,7 +256,7 @@ const ConsolePluginsTable: React.FC = ({ obj, rows, lo {columns.map(({ id, name, sortable }, columnIndex) => ( - + {name} ))} @@ -333,7 +333,7 @@ const PluginsPage: React.FC = (props) => { return []; } return consolePlugins.map((plugin) => { - const pluginName = plugin?.metadata?.name; + const pluginName = plugin?.metadata?.name ?? 'unknown'; const enabled = enabledPlugins.includes(pluginName); const loadedPluginInfo = pluginInfo .filter(isLoadedDynamicPluginInfo) @@ -343,7 +343,7 @@ const PluginsPage: React.FC = (props) => { .find((i) => i?.pluginName === pluginName); if (loadedPluginInfo) { return { - name: plugin?.metadata?.name, + name: pluginName, version: loadedPluginInfo?.metadata?.version, description: loadedPluginInfo?.metadata?.customProperties?.console?.description, enabled, @@ -352,9 +352,9 @@ const PluginsPage: React.FC = (props) => { }; } return { - name: plugin?.metadata?.name, + name: pluginName, enabled, - status: notLoadedPluginInfo?.status, + status: notLoadedPluginInfo?.status || 'Pending', errorMessage: notLoadedPluginInfo?.status === 'Failed' ? notLoadedPluginInfo?.errorMessage : undefined, errorCause: diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginCSPStatusDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginCSPStatusDetail.tsx index 33e1e024606..3e2162fc956 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginCSPStatusDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginCSPStatusDetail.tsx @@ -9,7 +9,7 @@ const ConsolePluginCSPStatusDetail: React.FC = ({ obj const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ pluginStore, pluginName, ]); diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx index 022bc6eaaa6..64e36971bbc 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx @@ -8,7 +8,7 @@ const ConsolePluginDescriptionDetail: React.FC = ({ o const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ pluginStore, pluginName, ]); diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx index 4dfa01669be..f59332c9d14 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx @@ -15,7 +15,7 @@ const ConsolePluginEnabledStatusDetail: React.FC = ({ const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ pluginStore, pluginName, ]); @@ -25,11 +25,11 @@ const ConsolePluginEnabledStatusDetail: React.FC = ({ return consoleOperatorConfigLoaded ? ( ) : ( diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx index 8ea9a27aae1..8d2be2a875c 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx @@ -9,10 +9,10 @@ export const ConsolePluginManifestPage: React.FC = ({ obj }) const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginManifest = React.useMemo(() => pluginStore.getDynamicPluginManifest(pluginName), [ - pluginStore, - pluginName, - ]); + const pluginManifest = React.useMemo( + () => pluginStore.getDynamicPluginManifest(pluginName ?? ''), + [pluginStore, pluginName], + ); return ( diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx index 51f71d30bc1..d4c7e807186 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx @@ -8,7 +8,7 @@ const ConsolePluginStatusDetail: React.FC = ({ obj }) const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ pluginStore, pluginName, ]); diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx index 5cc1ce28aaa..e349273df54 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx @@ -8,7 +8,7 @@ const ConsolePluginVersionDetail: React.FC = ({ obj } const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ pluginStore, pluginName, ]); diff --git a/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx b/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx index baa16d9718e..6d14deb6853 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx +++ b/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx @@ -11,7 +11,7 @@ const ClusterOperatorStatusRow: React.FC> = ({ diff --git a/frontend/packages/console-app/src/components/dashboards-page/status.ts b/frontend/packages/console-app/src/components/dashboards-page/status.ts index c3e747df7b1..f3699269b0b 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/status.ts +++ b/frontend/packages/console-app/src/components/dashboards-page/status.ts @@ -96,6 +96,10 @@ export const getControlPlaneHealth: PrometheusHealthHandler = ( resource, infrastructure, ) => { + if (!t) { + return { state: HealthState.NOT_AVAILABLE }; + } + const componentsHealth = responses.map(({ response, error }) => getControlPlaneComponentHealth(response, error, t), ); @@ -105,7 +109,7 @@ export const getControlPlaneHealth: PrometheusHealthHandler = ( const worstStatus = getWorstStatus(componentsHealth, t); const singleMasterMsg = - worstStatus.state === HealthState.OK && isSingleNode(infrastructure) + worstStatus.state === HealthState.OK && infrastructure && isSingleNode(infrastructure) ? t('console-app~Single control plane node') : undefined; @@ -117,7 +121,7 @@ export const getControlPlaneHealth: PrometheusHealthHandler = ( ? worstStatus.count === 4 ? worstStatus.message : `${pluralize(worstStatus.count, 'component')} ${worstStatus.message.toLowerCase()}` - : null), + : undefined), }; }; diff --git a/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts b/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts index 22984f9ecb4..1bc768107d2 100644 --- a/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts +++ b/frontend/packages/console-app/src/components/detect-namespace/__tests__/checkNamespaceExists.spec.ts @@ -17,7 +17,7 @@ describe('getValueForNamespace', () => { it('should return false if namespace is not defined', async () => { k8sGetMock.mockReturnValueOnce(Promise.resolve()); - const exists = await checkNamespaceExists(null, true); + const exists = await checkNamespaceExists('', true); expect(exists).toBeFalsy(); }); diff --git a/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts b/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts index 54f520bbe32..1e4dd393b94 100644 --- a/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts +++ b/frontend/packages/console-app/src/components/detect-namespace/getValueForNamespace.ts @@ -7,7 +7,7 @@ export const getValueForNamespace = async ( useProjects: boolean, activeNamespace?: string, ): Promise => { - if (await checkNamespaceExists(activeNamespace, useProjects)) { + if (activeNamespace && (await checkNamespaceExists(activeNamespace, useProjects))) { return activeNamespace; } if (await checkNamespaceExists(preferredNamespace, useProjects)) { From 3cf52413950f444a5b55eb0999cef0637e440d60 Mon Sep 17 00:00:00 2001 From: Krish Agarwal Date: Tue, 26 Aug 2025 10:56:15 -0400 Subject: [PATCH 2/6] Addressed PR reviews --- .../console-operator/ConsoleOperatorConfig.tsx | 10 +++++----- .../ConsolePluginCSPStatusDetail.tsx | 2 +- .../src/components/dashboards-page/status.ts | 2 +- .../packages/console-plugin-sdk/src/store.ts | 17 +++++++++-------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx index a4115669449..21a5c27d026 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsoleOperatorConfig.tsx @@ -207,8 +207,8 @@ const ConsolePluginsTable: React.FC = ({ obj, rows, lo const compare = React.useCallback>( (a, b) => { - const { index, direction } = sortBy; - const { id } = columns[index ?? 0]; + const { index = 0, direction } = sortBy; + const { id } = columns[index]; const desc = direction === SortByDirection.desc; const left = (desc ? b : a)[id]; const right = (desc ? a : b)[id]; @@ -333,7 +333,7 @@ const PluginsPage: React.FC = (props) => { return []; } return consolePlugins.map((plugin) => { - const pluginName = plugin?.metadata?.name ?? 'unknown'; + const pluginName = plugin?.metadata?.name; const enabled = enabledPlugins.includes(pluginName); const loadedPluginInfo = pluginInfo .filter(isLoadedDynamicPluginInfo) @@ -416,7 +416,7 @@ export const ConsoleOperatorConfigDetailsPage: React.FC = ({ obj const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ pluginStore, pluginName, ]); diff --git a/frontend/packages/console-app/src/components/dashboards-page/status.ts b/frontend/packages/console-app/src/components/dashboards-page/status.ts index f3699269b0b..d1d07b406bb 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/status.ts +++ b/frontend/packages/console-app/src/components/dashboards-page/status.ts @@ -97,7 +97,7 @@ export const getControlPlaneHealth: PrometheusHealthHandler = ( infrastructure, ) => { if (!t) { - return { state: HealthState.NOT_AVAILABLE }; + return { state: HealthState.UNKNOWN }; } const componentsHealth = responses.map(({ response, error }) => diff --git a/frontend/packages/console-plugin-sdk/src/store.ts b/frontend/packages/console-plugin-sdk/src/store.ts index d90b757d297..2684ecb87dc 100644 --- a/frontend/packages/console-plugin-sdk/src/store.ts +++ b/frontend/packages/console-plugin-sdk/src/store.ts @@ -24,12 +24,13 @@ export const augmentExtension = ( }); export const isExtensionInUse = (e: Extension, flags: FlagsObject): boolean => - e.flags.required.every((f) => flags[f]) && e.flags.disallowed.every((f) => !flags[f]); + (e.flags?.required?.every((f) => flags[f]) ?? true) && + (e.flags?.disallowed?.every((f) => !flags[f]) ?? true); export const getGatingFlagNames = (extensions: Extension[]): string[] => _.uniq([ - ..._.flatMap(extensions.map((e) => e.flags.required)), - ..._.flatMap(extensions.map((e) => e.flags.disallowed)), + ..._.flatMap(extensions.map((e) => e.flags?.required ?? [])), + ..._.flatMap(extensions.map((e) => e.flags?.disallowed ?? [])), ]); export const isLoadedDynamicPluginInfo = (i: DynamicPluginInfo): i is LoadedDynamicPluginInfo => @@ -203,7 +204,7 @@ export class PluginStore { const plugin = this.loadedDynamicPlugins.get(pluginID); - if (plugin.enabled !== enabled) { + if (plugin && plugin.enabled !== enabled) { plugin.enabled = enabled; this.updateExtensions(); @@ -213,13 +214,13 @@ export class PluginStore { } } - private getLoadedDynamicPlugin(pluginName: string) { + private getLoadedDynamicPlugin(pluginName?: string) { return Array.from(this.loadedDynamicPlugins.values()).find( (plugin) => plugin.manifest.name === pluginName, ); } - private isDynamicPluginLoaded(pluginName: string) { + private isDynamicPluginLoaded(pluginName?: string) { return this.getLoadedDynamicPlugin(pluginName) !== undefined; } @@ -306,7 +307,7 @@ export class PluginStore { return [...loadedPluginEntries, ...failedPluginEntries, ...pendingPluginEntries]; } - findDynamicPluginInfo(pluginName: string): DynamicPluginInfo { + findDynamicPluginInfo(pluginName?: string): DynamicPluginInfo | undefined { return this.getDynamicPluginInfo().find((entry) => isLoadedDynamicPluginInfo(entry) ? entry.metadata.name === pluginName @@ -314,7 +315,7 @@ export class PluginStore { ); } - getDynamicPluginManifest(pluginName: string): DynamicPluginManifest { + getDynamicPluginManifest(pluginName?: string): DynamicPluginManifest | undefined { return this.getLoadedDynamicPlugin(pluginName)?.manifest; } From fa0c722938cdee1f93f30e50254dc35e5204ef65 Mon Sep 17 00:00:00 2001 From: Krish Agarwal Date: Tue, 2 Sep 2025 10:18:45 -0400 Subject: [PATCH 3/6] Fixed SNC changes as discussed with Cyril --- .../ConsolePluginDescriptionDetail.tsx | 4 ++-- .../ConsolePluginEnabledStatusDetail.tsx | 10 +++++----- .../console-operator/ConsolePluginManifestPage.tsx | 8 ++++---- .../console-operator/ConsolePluginVersionDetail.tsx | 2 +- .../components/dashboards-page/OperatorStatus.tsx | 2 +- .../src/components/dashboards-page/status.ts | 13 +++++++------ 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx index 64e36971bbc..32aa39d7cb2 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginDescriptionDetail.tsx @@ -8,12 +8,12 @@ const ConsolePluginDescriptionDetail: React.FC = ({ o const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ pluginStore, pluginName, ]); - return isLoadedDynamicPluginInfo(pluginInfo) ? ( + return pluginInfo && isLoadedDynamicPluginInfo(pluginInfo) ? ( <>{pluginInfo.metadata.customProperties?.console?.description || DASH} ) : ( <>{DASH} diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx index f59332c9d14..8f537c3025a 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginEnabledStatusDetail.tsx @@ -15,7 +15,7 @@ const ConsolePluginEnabledStatusDetail: React.FC = ({ const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ pluginStore, pluginName, ]); @@ -23,13 +23,13 @@ const ConsolePluginEnabledStatusDetail: React.FC = ({ consoleOperatorConfig?.spec?.plugins, ]); - return consoleOperatorConfigLoaded ? ( + return consoleOperatorConfigLoaded && pluginName ? ( ) : ( diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx index 8d2be2a875c..8ea9a27aae1 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx @@ -9,10 +9,10 @@ export const ConsolePluginManifestPage: React.FC = ({ obj }) const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginManifest = React.useMemo( - () => pluginStore.getDynamicPluginManifest(pluginName ?? ''), - [pluginStore, pluginName], - ); + const pluginManifest = React.useMemo(() => pluginStore.getDynamicPluginManifest(pluginName), [ + pluginStore, + pluginName, + ]); return ( diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx index e349273df54..5cc1ce28aaa 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginVersionDetail.tsx @@ -8,7 +8,7 @@ const ConsolePluginVersionDetail: React.FC = ({ obj } const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ pluginStore, pluginName, ]); diff --git a/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx b/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx index 6d14deb6853..9a94d4e73b5 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx +++ b/frontend/packages/console-app/src/components/dashboards-page/OperatorStatus.tsx @@ -11,7 +11,7 @@ const ClusterOperatorStatusRow: React.FC> = ({ diff --git a/frontend/packages/console-app/src/components/dashboards-page/status.ts b/frontend/packages/console-app/src/components/dashboards-page/status.ts index d1d07b406bb..9ff9f749665 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/status.ts +++ b/frontend/packages/console-app/src/components/dashboards-page/status.ts @@ -51,8 +51,11 @@ export const getK8sHealthState: URLHealthHandler = (k8sHealth, error, re export const getControlPlaneComponentHealth = ( response: PrometheusResponse, error, - t: TFunction, + t?: TFunction, ): SubsystemHealth => { + if (!t) { + return { state: HealthState.NOT_AVAILABLE }; + } if (error) { return { state: HealthState.NOT_AVAILABLE, @@ -92,14 +95,12 @@ export const getWorstStatus = ( export const getControlPlaneHealth: PrometheusHealthHandler = ( responses, - t, - resource, - infrastructure, + t?: TFunction, + infrastructure?, ) => { if (!t) { - return { state: HealthState.UNKNOWN }; + return { state: HealthState.NOT_AVAILABLE }; } - const componentsHealth = responses.map(({ response, error }) => getControlPlaneComponentHealth(response, error, t), ); From a46ab093db32fc501e62cc27f6440d2f7bc16084 Mon Sep 17 00:00:00 2001 From: Krish Agarwal Date: Tue, 2 Sep 2025 14:00:26 -0400 Subject: [PATCH 4/6] Fixed failing frontend test --- .../__tests__/getValueForNamespace.spec.ts | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts b/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts index eb7c53dd8e6..6dc2c6002c3 100644 --- a/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts +++ b/frontend/packages/console-app/src/components/detect-namespace/__tests__/getValueForNamespace.spec.ts @@ -34,7 +34,12 @@ describe('getValueForNamespace', () => { checkNamespaceExistsMock .mockReturnValueOnce(Promise.resolve(false)) .mockReturnValueOnce(Promise.resolve(true)); - const namespace = await getValueForNamespace(preferredNamespace, lastNamespace, true); + const namespace = await getValueForNamespace( + preferredNamespace, + lastNamespace, + true, + activeNamespace, + ); expect(namespace).toEqual(preferredNamespace); }); @@ -45,7 +50,12 @@ describe('getValueForNamespace', () => { .mockReturnValueOnce(Promise.resolve(false)) .mockReturnValueOnce(Promise.resolve(true)); - const namespace = await getValueForNamespace(preferredNamespace, lastNamespace, true); + const namespace = await getValueForNamespace( + preferredNamespace, + lastNamespace, + true, + activeNamespace, + ); expect(namespace).toEqual(lastNamespace); }); @@ -56,7 +66,12 @@ describe('getValueForNamespace', () => { .mockReturnValueOnce(Promise.resolve(false)) .mockReturnValueOnce(Promise.resolve(false)); - const namespace = await getValueForNamespace(preferredNamespace, lastNamespace, true); + const namespace = await getValueForNamespace( + preferredNamespace, + lastNamespace, + true, + activeNamespace, + ); expect(namespace).toEqual(ALL_NAMESPACES_KEY); }); From 40a773a75633d490b519ec1380d6f9e20fe7b796 Mon Sep 17 00:00:00 2001 From: Krish Agarwal Date: Wed, 3 Sep 2025 09:39:32 -0400 Subject: [PATCH 5/6] Fixed t-function and removed plugin name fallback in ConsolePluginStatusDetail --- .../console-operator/ConsolePluginStatusDetail.tsx | 2 +- .../src/components/dashboards-page/status.ts | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx index d4c7e807186..51f71d30bc1 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginStatusDetail.tsx @@ -8,7 +8,7 @@ const ConsolePluginStatusDetail: React.FC = ({ obj }) const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName ?? ''), [ + const pluginInfo = React.useMemo(() => pluginStore.findDynamicPluginInfo(pluginName), [ pluginStore, pluginName, ]); diff --git a/frontend/packages/console-app/src/components/dashboards-page/status.ts b/frontend/packages/console-app/src/components/dashboards-page/status.ts index 9ff9f749665..710b6cd0bd8 100644 --- a/frontend/packages/console-app/src/components/dashboards-page/status.ts +++ b/frontend/packages/console-app/src/components/dashboards-page/status.ts @@ -51,11 +51,8 @@ export const getK8sHealthState: URLHealthHandler = (k8sHealth, error, re export const getControlPlaneComponentHealth = ( response: PrometheusResponse, error, - t?: TFunction, + t: TFunction, ): SubsystemHealth => { - if (!t) { - return { state: HealthState.NOT_AVAILABLE }; - } if (error) { return { state: HealthState.NOT_AVAILABLE, @@ -95,12 +92,9 @@ export const getWorstStatus = ( export const getControlPlaneHealth: PrometheusHealthHandler = ( responses, - t?: TFunction, + t: TFunction, infrastructure?, ) => { - if (!t) { - return { state: HealthState.NOT_AVAILABLE }; - } const componentsHealth = responses.map(({ response, error }) => getControlPlaneComponentHealth(response, error, t), ); From 775c7ec373153ee9b5c78c1f9704a154ad3d8c3a Mon Sep 17 00:00:00 2001 From: Krish Agarwal Date: Fri, 5 Sep 2025 16:16:11 -0400 Subject: [PATCH 6/6] Addressed reviews --- .../console-operator/ConsolePluginManifestPage.tsx | 8 ++++---- frontend/packages/console-plugin-sdk/src/store.ts | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx index 8ea9a27aae1..b86c4277877 100644 --- a/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx +++ b/frontend/packages/console-app/src/components/console-operator/ConsolePluginManifestPage.tsx @@ -9,10 +9,10 @@ export const ConsolePluginManifestPage: React.FC = ({ obj }) const pluginStore = usePluginStore(); const pluginName = React.useMemo(() => obj?.metadata?.name, [obj?.metadata?.name]); - const pluginManifest = React.useMemo(() => pluginStore.getDynamicPluginManifest(pluginName), [ - pluginStore, - pluginName, - ]); + const pluginManifest = React.useMemo( + () => (pluginName ? pluginStore.getDynamicPluginManifest(pluginName) : undefined), + [pluginStore, pluginName], + ); return ( diff --git a/frontend/packages/console-plugin-sdk/src/store.ts b/frontend/packages/console-plugin-sdk/src/store.ts index 2684ecb87dc..79437cf8d53 100644 --- a/frontend/packages/console-plugin-sdk/src/store.ts +++ b/frontend/packages/console-plugin-sdk/src/store.ts @@ -214,13 +214,13 @@ export class PluginStore { } } - private getLoadedDynamicPlugin(pluginName?: string) { + private getLoadedDynamicPlugin(pluginName: string) { return Array.from(this.loadedDynamicPlugins.values()).find( (plugin) => plugin.manifest.name === pluginName, ); } - private isDynamicPluginLoaded(pluginName?: string) { + private isDynamicPluginLoaded(pluginName: string) { return this.getLoadedDynamicPlugin(pluginName) !== undefined; } @@ -315,7 +315,7 @@ export class PluginStore { ); } - getDynamicPluginManifest(pluginName?: string): DynamicPluginManifest | undefined { + getDynamicPluginManifest(pluginName: string): DynamicPluginManifest | undefined { return this.getLoadedDynamicPlugin(pluginName)?.manifest; }