import {Flex, Text, Tooltip} from '@gravity-ui/uikit';
import {useBlobStorageCapacityMetricsEnabled} from '../../store/reducers/capabilities/hooks';
import type {PreparedStorageGroup} from '../../store/reducers/storage/types';
import {isNonEmptyValue} from '../../utils';
import {formatBytes} from '../../utils/bytesParsers';
import {cn} from '../../utils/cn';
import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
import {
formatMetricPercent,
formatStorageMetricPair,
formatStorageThroughput,
} from '../../utils/storageMetrics';
import {formatToMs} from '../../utils/timeParsers';
import {parseOptionalNonNegativeNumber} from '../../utils/utils';
import {getStorageGroupCapacityInfoItems} from '../DiskCapacityInfo/DiskCapacityInfo';
import diskCapacityInfoKeyset from '../DiskCapacityInfo/i18n';
import {StatusIcon} from '../StatusIcon/StatusIcon';
import type {YDBDefinitionListItem} from '../YDBDefinitionList/YDBDefinitionList';
import {YDBDefinitionList} from '../YDBDefinitionList/YDBDefinitionList';
import {CAPACITY_CONFIGURATION_HELP_TEXT} from '../capacityMetricsColumns/constants';
import {formatCapacityUnitCount} from '../capacityMetricsColumns/formatters';
import {storageGroupInfoKeyset} from './i18n';
import './StorageGroupInfo.scss';
const b = cn('ydb-storage-group-info');
interface StorageGroupInfoProps {
data?: PreparedStorageGroup;
className?: string;
}
export function StorageGroupInfo({data, className}: StorageGroupInfoProps) {
const capacityMetricsEnabled = useBlobStorageCapacityMetricsEnabled();
const {
PoolName,
GroupGeneration,
ErasureSpecies,
MissingDisks,
LatencyPutTabletLogMs,
LatencyPutUserDataMs,
LatencyGetFastMs,
Read,
Write,
GroupSizeInUnits,
Used,
Limit,
Available,
Usage,
DiskSpace,
} = data || {};
const configurationItems: YDBDefinitionListItem[] = [
{
name: storageGroupInfoKeyset('field_pool-name'),
content: PoolName ? (
{PoolName}
) : (
EMPTY_DATA_PLACEHOLDER
),
},
...(
[
[storageGroupInfoKeyset('group-generation'), GroupGeneration],
[storageGroupInfoKeyset('erasure-species'), ErasureSpecies],
[storageGroupInfoKeyset('missing-disks'), MissingDisks],
] as const
).map(([name, value]) => ({
name,
content: isNonEmptyValue(value) ? value : EMPTY_DATA_PLACEHOLDER,
})),
];
const latencyItems: YDBDefinitionListItem[] = (
[
[storageGroupInfoKeyset('latency-put-tablet-log'), LatencyPutTabletLogMs],
[storageGroupInfoKeyset('latency-put-user-data'), LatencyPutUserDataMs],
[storageGroupInfoKeyset('latency-get-fast'), LatencyGetFastMs],
] as const
).map(([name, value]) => {
const latency = parseOptionalNonNegativeNumber(value);
return {
name,
content: latency === undefined ? EMPTY_DATA_PLACEHOLDER : formatToMs(latency),
};
});
const throughputItems: YDBDefinitionListItem[] = (
[
[storageGroupInfoKeyset('read-throughput'), Read],
[storageGroupInfoKeyset('write-throughput'), Write],
] as const
).map(([name, value]) => ({
name,
content: formatStorageThroughput(value),
}));
const capacityItems: YDBDefinitionListItem[] = [];
if (capacityMetricsEnabled) {
capacityItems.push({
name: diskCapacityInfoKeyset('field_group-size-in-units'),
content: formatCapacityUnitCount(GroupSizeInUnits),
note: CAPACITY_CONFIGURATION_HELP_TEXT.GroupSizeInUnits,
});
}
capacityItems.push(
{
name: storageGroupInfoKeyset('used-space'),
content: formatStorageMetricPair(Used, Limit, 2),
},
{
name: storageGroupInfoKeyset('available'),
content:
formatBytes({
value: parseOptionalNonNegativeNumber(Available),
size: 'gb',
fixedDecimalPlaces: 2,
}) || EMPTY_DATA_PLACEHOLDER,
},
);
if (capacityMetricsEnabled) {
capacityItems.push(...getStorageGroupCapacityInfoItems(data));
} else {
capacityItems.push(
{
name: storageGroupInfoKeyset('usage'),
content: formatMetricPercent(Usage, 2),
},
{
name: storageGroupInfoKeyset('disk-space'),
content: DiskSpace ? : EMPTY_DATA_PLACEHOLDER,
},
);
}
return (
);
}