diff --git a/src/store/reducers/cluster/cluster.ts b/src/store/reducers/cluster/cluster.ts index 1b42908302..852a4b763c 100644 --- a/src/store/reducers/cluster/cluster.ts +++ b/src/store/reducers/cluster/cluster.ts @@ -15,7 +15,7 @@ import type {RootState} from '../../defaultStore'; import {api} from '../api'; import {selectNodesMap} from '../nodesList'; -import {parseCoresUrl, parseLoggingUrls, parseTraceField} from './parseFields'; +import {parseCoresUrl, parseLoggingUrls, parseSettingsField, parseTraceField} from './parseFields'; import type {ClusterGroupsStats, ClusterState} from './types'; import { createSelectClusterGroupsQuery, @@ -167,6 +167,8 @@ export function useClusterBaseInfo() { traceView: parseTraceField(data.trace_view), cores: parseCoresUrl(data.cores), logging: parseLoggingUrls(data.logging), + + settings: parseSettingsField(data.settings), }; } diff --git a/src/store/reducers/cluster/parseFields.ts b/src/store/reducers/cluster/parseFields.ts index df79c2ea2b..615509746b 100644 --- a/src/store/reducers/cluster/parseFields.ts +++ b/src/store/reducers/cluster/parseFields.ts @@ -4,6 +4,7 @@ import type { MetaBaseClusterInfo, MetaClusterCoresUrl, MetaClusterLogsUrls, + MetaClusterSettings, MetaClusterTraceView, } from '../../../types/api/meta'; @@ -65,3 +66,22 @@ export function parseLoggingUrls( return undefined; } + +const settingsSchema = z.object({ + use_meta_proxy: z.boolean().optional(), +}); + +export function parseSettingsField( + settings: MetaBaseClusterInfo['settings'], +): MetaClusterSettings | undefined { + if (settings && typeof settings === 'object') { + return settings; + } + try { + return settings ? settingsSchema.parse(JSON.parse(settings)) : undefined; + } catch (e) { + console.error('Error parsing settings field:', e); + } + + return undefined; +} diff --git a/src/store/reducers/clusters/utils.ts b/src/store/reducers/clusters/utils.ts index d1c9be5254..073bc011e3 100644 --- a/src/store/reducers/clusters/utils.ts +++ b/src/store/reducers/clusters/utils.ts @@ -6,6 +6,7 @@ import { getVersionsData, prepareClusterVersions, } from '../../../utils/versions/clusterVersionColors'; +import {parseSettingsField} from '../cluster/parseFields'; import type {PreparedCluster} from './types'; @@ -24,8 +25,9 @@ export const prepareClustersData = (data: MetaClusters): PreparedCluster[] => { // Apply color map to every cluster in the list return clusters.map((cluster) => { + const parsedSettings = parseSettingsField(cluster.settings); // If no backend is provided, it will be automatically generated by API instance - const useMetaProxy = uiFactory.useMetaProxy && cluster.settings?.use_meta_proxy !== false; + const useMetaProxy = uiFactory.useMetaProxy && parsedSettings?.use_meta_proxy !== false; const preparedBackend = cluster.balancer && !useMetaProxy ? prepareBackendFromBalancer(cluster.balancer) @@ -35,6 +37,7 @@ export const prepareClustersData = (data: MetaClusters): PreparedCluster[] => { ...cluster, preparedVersions: prepareClusterVersions(cluster.versions, versionsData), preparedBackend, + settings: parsedSettings, }; }); }; diff --git a/src/types/api/meta.ts b/src/types/api/meta.ts index d41fdd8bbb..ba17091a2c 100644 --- a/src/types/api/meta.ts +++ b/src/types/api/meta.ts @@ -49,9 +49,7 @@ export interface MetaBaseClusterInfo { logging?: string | MetaClusterLogsUrls; trace_view?: string | MetaClusterTraceView; trace_check?: string | MetaClusterTraceCheck; - - // Settings are returned only by meta versions, that decode values by itself - settings?: MetaClusterSettings; + settings?: string | MetaClusterSettings; } export interface MetaGeneralClusterInfo extends MetaBaseClusterInfo { @@ -99,5 +97,4 @@ export interface MetaClusterTraceCheck { export interface MetaClusterSettings { use_meta_proxy?: boolean; - proxy?: unknown; }