import type {MetaClusterVersion, MetaClusters} from '../../../types/api/meta'; import {uiFactory} from '../../../uiFactory/uiFactory'; import {prepareBackendFromBalancer} from '../../../utils/parseBalancer'; import { getVersionMap, getVersionsData, prepareClusterVersions, } from '../../../utils/versions/clusterVersionColors'; import {prepareClusterLinksFields} from '../cluster/parseFields'; import type {PreparedCluster} from './types'; export const prepareClustersData = (data: MetaClusters): PreparedCluster[] => { const {clusters = []} = data; let allMinorVersions = new Map(); // Collect all clusters minor versions clusters.forEach(({versions = []}) => { allMinorVersions = getVersionMap(versions, allMinorVersions); }); // Get colors map for all clusters colors const versionsData = getVersionsData(allMinorVersions); // Apply color map to every cluster in the list return clusters.map((cluster) => { const parsedFields = prepareClusterLinksFields(cluster); const {settings: parsedSettings} = parsedFields; // If no backend is provided, it will be automatically generated by API instance const useMetaProxy = uiFactory.useMetaProxy && parsedSettings?.use_meta_proxy !== false; const clusterDomain = uiFactory.useClusterDomain ? parsedSettings?.cluster_domain : undefined; const preparedBackend = cluster.balancer && !useMetaProxy ? prepareBackendFromBalancer(cluster.balancer) : undefined; // Split versions by role in a single pass const {versions = []} = cluster; const computeVersions: MetaClusterVersion[] = []; const storageVersions: MetaClusterVersion[] = []; for (const version of versions) { if (version.role === 'compute') { computeVersions.push(version); } else if (version.role === 'storage') { storageVersions.push(version); } } const clusterName = cluster.name; const clusterTitle = cluster.title || clusterName; return { ...cluster, name: clusterName, title: clusterTitle, ...parsedFields, preparedVersions: prepareClusterVersions(versions, versionsData), preparedComputeVersions: prepareClusterVersions(computeVersions, versionsData), preparedStorageVersions: prepareClusterVersions(storageVersions, versionsData), preparedBackend, clusterDomain, clusterExternalName: parsedSettings?.cluster_external_name, } satisfies PreparedCluster; }); };