mirror of https://github.com/portainer/portainer
50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
import { round, reduce } from 'lodash';
|
|
import filesizeParser from 'filesize-parser';
|
|
import { useQuery } from '@tanstack/react-query';
|
|
import { Node } from 'kubernetes-types/core/v1';
|
|
|
|
import { EnvironmentId } from '@/react/portainer/environments/types';
|
|
import { withGlobalError } from '@/react-tools/react-query';
|
|
import KubernetesResourceReservationHelper from '@/kubernetes/helpers/resourceReservationHelper';
|
|
import { parseCpu } from '@/react/kubernetes/utils';
|
|
import { getNodes } from '@/react/kubernetes/cluster/HomeView/nodes.service';
|
|
|
|
export function useClusterResourceLimitsQuery(environmentId: EnvironmentId) {
|
|
return useQuery(
|
|
[environmentId, 'clusterResourceLimits'],
|
|
async () => getNodes(environmentId),
|
|
{
|
|
...withGlobalError('Unable to retrieve resource limit data', 'Failure'),
|
|
enabled: !!environmentId,
|
|
select: aggregateResourceLimits,
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Processes node data to calculate total CPU and memory limits for the cluster
|
|
* and sets the state for memory limit in MB and CPU limit rounded to 3 decimal places.
|
|
*/
|
|
function aggregateResourceLimits(nodes: Node[]) {
|
|
const processedNodes = nodes.map((node) => ({
|
|
...node,
|
|
memory: filesizeParser(node.status?.allocatable?.memory ?? ''),
|
|
cpu: parseCpu(node.status?.allocatable?.cpu ?? ''),
|
|
}));
|
|
|
|
return {
|
|
nodes: processedNodes,
|
|
memoryLimit: reduce(
|
|
processedNodes,
|
|
(acc, node) =>
|
|
KubernetesResourceReservationHelper.megaBytesValue(node.memory || 0) +
|
|
acc,
|
|
0
|
|
),
|
|
cpuLimit: round(
|
|
reduce(processedNodes, (acc, node) => (node.cpu || 0) + acc, 0),
|
|
3
|
|
),
|
|
};
|
|
}
|