dashboard/shell/utils/cluster.js

93 lines
2.7 KiB
JavaScript

import semver from 'semver';
import { CAPI } from '@shell/config/labels-annotations';
import { MANAGEMENT, VIRTUAL_HARVESTER_PROVIDER } from '@shell/config/types';
import { SETTING } from '@shell/config/settings';
// Filter out any clusters that are not Kubernetes Clusters
export function filterOnlyKubernetesClusters(mgmtClusters, store) {
const openHarvesterContainerWorkload = store.getters['features/get']('harvester-baremetal-container-workload');
return mgmtClusters?.filter((c) => {
return openHarvesterContainerWorkload ? true : !isHarvesterCluster(c);
});
}
export function isHarvesterCluster(mgmtCluster) {
// Use the provider if it is set otherwise use the label
const provider = mgmtCluster?.metadata?.labels?.[CAPI.PROVIDER] || mgmtCluster?.status?.provider;
return provider === VIRTUAL_HARVESTER_PROVIDER;
}
export function isHarvesterSatisfiesVersion(version = '') {
if (version.startsWith('v1.21.4+rke2r')) {
const rkeVersion = version.replace(/.+rke2r/i, '');
return Number(rkeVersion) >= 4;
} else {
return semver.satisfies(semver.coerce(version), '>=v1.21.4+rke2r4');
}
}
export function filterHiddenLocalCluster(mgmtClusters, store) {
const hideLocalSetting = store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.HIDE_LOCAL_CLUSTER) || {};
const value = hideLocalSetting.value || hideLocalSetting.default || 'false';
const hideLocal = value === 'true';
if (!hideLocal) {
return mgmtClusters;
}
return mgmtClusters.filter((c) => {
const target = c.mgmt || c;
return !target.isLocal;
});
}
const clusterNameSegments = /([A-Za-z]+|\d+)/g;
/**
* Shortens an input string based on the number of segments it contains.
* @param {string} input - The input string to be shortened.
* @returns {string} - The shortened string.
* @example smallIdentifier('local') => 'lcl'
* @example smallIdentifier('word-wide-web') => 'www'
*/
export function abbreviateClusterName(input) {
if (!input) {
return '';
}
if (input.length <= 3) {
return input;
}
const segments = input.match(clusterNameSegments);
if (!segments) return ''; // In case no valid segments are found
let result = '';
switch (segments.length) {
case 1: {
const word = segments[0];
result = `${ word[0] }${ word[Math.floor(word.length / 2)] }${ word[word.length - 1] }`;
break;
}
case 2: {
const w1 = `${ segments[0][0] }`;
const w2 = `${ segments[0].length >= 2 ? segments[0][segments[0].length - 1] : segments[1][0] }`;
const w3 = `${ segments[1][segments[1].length - 1] }`;
result = w1 + w2 + w3;
break;
}
default:
result = segments.slice(0, 2).map((segment) => segment[0]).join('') + segments.slice(-1)[0].slice(-1);
}
return result;
}