/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import "./resource-quota-details.scss"; import React from "react"; import kebabCase from "lodash/kebabCase"; import { observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import { cpuUnitsToNumber, cssNames, unitsToBytes, metricUnitsToNumber, object, hasDefinedTupleValue } from "../../utils"; import type { KubeObjectDetailsProps } from "../kube-object-details"; import { ResourceQuota } from "../../../common/k8s-api/endpoints/resource-quota.api"; import { LineProgress } from "../line-progress"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { KubeObjectMeta } from "../kube-object-meta"; import logger from "../../../common/logger"; export interface ResourceQuotaDetailsProps extends KubeObjectDetailsProps { } function transformUnit(name: string, value: string): number | undefined { if (name.includes("memory") || name.includes("storage")) { return unitsToBytes(value); } if (name.includes("cpu")) { return cpuUnitsToNumber(value); } return metricUnitsToNumber(value); } function renderQuotas(quota: ResourceQuota): JSX.Element[] { const { hard = {}, used = {}} = quota.status ?? {}; return object.entries(hard) .filter(hasDefinedTupleValue) .map(([name, rawMax]) => { const rawCurrent = used[name] ?? "0"; const current = transformUnit(name, rawCurrent); const max = transformUnit(name, rawMax); if (current === undefined || max === undefined) { return (
{name} {`${rawCurrent} / ${rawMax}`}
); } const usage = max === 0 ? 100 // special case 0 max as always 100% usage : current / max * 100; return (
{name} {`${rawCurrent} / ${rawMax}`} {`Set: ${rawMax}. Usage: ${+usage.toFixed(2)}%`}

)} />
); }); } @observer export class ResourceQuotaDetails extends React.Component { render() { const { object: quota } = this.props; if (!quota) { return null; } if (!(quota instanceof ResourceQuota)) { logger.error("[ResourceQuotaDetails]: passed object that is not an instanceof ResourceQuota", quota); return null; } return (
{renderQuotas(quota)} {quota.getScopeSelector().length > 0 && ( <> Scope Selector Operator Scope name Values { quota.getScopeSelector().map((selector, index) => { const { operator, scopeName, values } = selector; return ( {operator} {scopeName} {values.join(", ")} ); }) }
)}
); } }