diff --git a/packages/api-v4/src/quotas/types.ts b/packages/api-v4/src/quotas/types.ts index f7f9f37d773..65b81e8a490 100644 --- a/packages/api-v4/src/quotas/types.ts +++ b/packages/api-v4/src/quotas/types.ts @@ -33,6 +33,11 @@ export interface Quota { */ quota_name: string; + /** + * Customer facing id describing the quota. + */ + quota_type_id: string; + /** * The region slug to which this limit applies. * @@ -52,6 +57,11 @@ export interface Quota { * For OBJ limits only. */ s3_endpoint?: string; + + /** + * Sets usage column to be n/a when value is "none". + */ + usage_mode: 'none' | 'normal'; } /** diff --git a/packages/manager/src/factories/quotas.ts b/packages/manager/src/factories/quotas.ts index 9fdbde146be..a14e3726660 100644 --- a/packages/manager/src/factories/quotas.ts +++ b/packages/manager/src/factories/quotas.ts @@ -7,8 +7,10 @@ export const quotaFactory = Factory.Sync.makeFactory({ quota_id: Factory.each((id) => id.toString()), quota_limit: 50, quota_name: 'Linode Dedicated vCPUs', + quota_type_id: 'linode-dedicated-cpus', region_applied: 'us-east', resource_metric: 'CPU', + usage_mode: 'normal', }); export const quotaUsageFactory = Factory.Sync.makeFactory({ diff --git a/packages/manager/src/features/Account/Quotas/QuotasTable.tsx b/packages/manager/src/features/Account/Quotas/QuotasTable.tsx index c07e4b77882..7a3c2bec5eb 100644 --- a/packages/manager/src/features/Account/Quotas/QuotasTable.tsx +++ b/packages/manager/src/features/Account/Quotas/QuotasTable.tsx @@ -25,6 +25,12 @@ import type { AttachmentError } from 'src/features/Support/SupportTicketDetail/S const quotaRowMinHeight = 58; +const EXCLUDED_QUOTA_TYPE_IDS = [ + 'obj-per-ip-upload-throughput', + 'obj-per-ip-download-throughput', + 'obj-per-ip-concurrent-requests', +]; + interface QuotasTableProps { selectedLocation: null | SelectOption; selectedService: SelectOption; @@ -72,9 +78,13 @@ export const QuotasTable = (props: QuotasTableProps) => { ); // Quota Usage Queries - // For each quota, fetch the usage in parallel + // For each quota with usage_mode == normal, + // fetch the usage in parallel // This will only fetch for the paginated set - const quotaIds = quotas?.data.map((quota) => quota.quota_id) ?? []; + const quotaIds = + quotas?.data + .filter((quota) => quota.usage_mode === 'normal') + .map((quota) => quota.quota_id) ?? []; const quotaUsageQueries = useQueries({ queries: quotaIds.map((quotaId) => quotaQueries.service(selectedService.value)._ctx.usage(quotaId) @@ -147,7 +157,11 @@ export const QuotasTable = (props: QuotasTableProps) => { /> ) : ( quotasWithUsage.map((quota, index) => { - const hasQuotaUsage = quota.usage?.usage !== null; + const hasQuotaUsage = + quota.usage_mode === 'normal' && quota.usage?.usage !== null; + if (EXCLUDED_QUOTA_TYPE_IDS.includes(quota.quota_type_id)) { + return null; + } return ( { usage={quota.usage?.usage ?? 0} /> ) : ( - Data not available + n/a )} diff --git a/packages/manager/src/features/Account/Quotas/utils.ts b/packages/manager/src/features/Account/Quotas/utils.ts index 3ea45ecb21f..7ffb4d67125 100644 --- a/packages/manager/src/features/Account/Quotas/utils.ts +++ b/packages/manager/src/features/Account/Quotas/utils.ts @@ -1,5 +1,9 @@ import { useRegionsQuery } from '@linode/queries'; -import { capitalize, readableBytes } from '@linode/utilities'; +import { + capitalize, + convertStorageUnit, + readableBytes, +} from '@linode/utilities'; import { object, string } from 'yup'; import { regionSelectGlobalOption } from 'src/components/RegionSelect/constants'; @@ -193,6 +197,14 @@ export const convertResourceMetric = ({ }; } + if (initialResourceMetric === 'byte_per_second') { + return { + convertedUsage: 0, + convertedResourceMetric: 'Gbps', + convertedLimit: convertStorageUnit('B', initialLimit, 'GB'), + }; + } + return { convertedUsage: initialUsage, convertedLimit: initialLimit,