Skip to content

Commit af7ee10

Browse files
reactor: STORIF-285 - Quota resource metric converted into an enum.
1 parent 4e922c0 commit af7ee10

File tree

11 files changed

+99
-70
lines changed

11 files changed

+99
-70
lines changed

packages/api-v4/src/quotas/types.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
import type { ObjectStorageEndpointTypes } from 'src/object-storage';
22
import type { Region } from 'src/regions';
3+
4+
export enum QuotaResourceMetrics {
5+
BUCKET = 'bucket',
6+
BYTE = 'byte',
7+
BYTE_PER_SECOND = 'byte_per_second',
8+
CLUSTER = 'cluster',
9+
CPU = 'CPU',
10+
GPU = 'GPU',
11+
OBJECT = 'object',
12+
REQUEST = 'request',
13+
VPU = 'VPU',
14+
}
15+
316
/**
417
* A Quota is a service used limit that is rated based on service metrics such
518
* as vCPUs used, instances or storage size.
@@ -54,7 +67,7 @@ export interface Quota {
5467
/**
5568
* The unit of measurement for this service limit.
5669
*/
57-
resource_metric: string;
70+
resource_metric: QuotaResourceMetrics;
5871

5972
/**
6073
* The S3 endpoint URL to which this limit applies.

packages/manager/cypress/e2e/core/account/quotas-storage.spec.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { type Quota, QuotaResourceMetrics } from '@linode/api-v4';
12
import { regionFactory } from '@linode/utilities';
23
import { profileFactory } from '@linode/utilities';
34
import { mockAppendFeatureFlags } from 'support/intercepts/feature-flags';
@@ -22,8 +23,6 @@ import { objectStorageEndpointsFactory } from 'src/factories';
2223
import { quotaFactory, quotaUsageFactory } from 'src/factories/quotas';
2324
import { getQuotaIncreaseMessage } from 'src/features/Account/Quotas/utils';
2425

25-
import type { Quota } from '@linode/api-v4';
26-
2726
const mockFeatureFlags = {
2827
limitsEvolution: {
2928
enabled: true,
@@ -74,7 +73,7 @@ const mockQuotas = [
7473
endpoint_type: mockSelectedEndpoint.endpoint_type,
7574
quota_limit: 10,
7675
quota_name: randomLabel(15),
77-
resource_metric: 'byte',
76+
resource_metric: QuotaResourceMetrics.BYTE,
7877
s3_endpoint: selectedDomain,
7978
}),
8079
quotaFactory.build({
@@ -84,7 +83,7 @@ const mockQuotas = [
8483
endpoint_type: mockSelectedEndpoint.endpoint_type,
8584
quota_limit: 78,
8685
quota_name: randomLabel(15),
87-
resource_metric: 'bucket',
86+
resource_metric: QuotaResourceMetrics.BUCKET,
8887
s3_endpoint: selectedDomain,
8988
}),
9089
quotaFactory.build({
@@ -94,7 +93,7 @@ const mockQuotas = [
9493
endpoint_type: mockSelectedEndpoint.endpoint_type,
9594
quota_limit: 400,
9695
quota_name: randomLabel(15),
97-
resource_metric: 'object',
96+
resource_metric: QuotaResourceMetrics.OBJECT,
9897
s3_endpoint: selectedDomain,
9998
}),
10099
];
@@ -229,7 +228,7 @@ describe('Quota workflow tests', () => {
229228
endpoint_type: updatedEndpoint.endpoint_type,
230229
quota_limit: 20,
231230
quota_name: randomLabel(15),
232-
resource_metric: 'byte',
231+
resource_metric: QuotaResourceMetrics.BYTE,
233232
s3_endpoint: updatedDomain,
234233
}),
235234
quotaFactory.build({
@@ -239,7 +238,7 @@ describe('Quota workflow tests', () => {
239238
endpoint_type: updatedEndpoint.endpoint_type,
240239
quota_limit: 122,
241240
quota_name: randomLabel(15),
242-
resource_metric: 'bucket',
241+
resource_metric: QuotaResourceMetrics.BUCKET,
243242
s3_endpoint: updatedDomain,
244243
}),
245244
quotaFactory.build({
@@ -249,7 +248,7 @@ describe('Quota workflow tests', () => {
249248
endpoint_type: updatedEndpoint.endpoint_type,
250249
quota_limit: 450,
251250
quota_name: randomLabel(15),
252-
resource_metric: 'object',
251+
resource_metric: QuotaResourceMetrics.OBJECT,
253252
s3_endpoint: updatedDomain,
254253
}),
255254
];

packages/manager/cypress/e2e/core/objectStorage/object-storage-summary-page.spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { QuotaResourceMetrics } from '@linode/api-v4';
12
import { regionFactory } from '@linode/utilities';
23
import { authenticate } from 'support/api/authentication';
34
import { mockAppendFeatureFlags } from 'support/intercepts/feature-flags';
@@ -58,7 +59,7 @@ const mockQuotas = [
5859
endpoint_type: mockSelectedEndpoint.endpoint_type,
5960
quota_limit: 10,
6061
quota_name: 'Total Capacity',
61-
resource_metric: 'byte',
62+
resource_metric: QuotaResourceMetrics.BYTE,
6263
s3_endpoint: selectedDomain,
6364
}),
6465
quotaFactory.build({
@@ -68,7 +69,7 @@ const mockQuotas = [
6869
endpoint_type: mockSelectedEndpoint.endpoint_type,
6970
quota_limit: 78,
7071
quota_name: 'Number of Objects',
71-
resource_metric: 'bucket',
72+
resource_metric: QuotaResourceMetrics.BUCKET,
7273
s3_endpoint: selectedDomain,
7374
}),
7475
quotaFactory.build({
@@ -78,7 +79,7 @@ const mockQuotas = [
7879
endpoint_type: mockSelectedEndpoint.endpoint_type,
7980
quota_limit: 400,
8081
quota_name: 'Number of Buckets',
81-
resource_metric: 'object',
82+
resource_metric: QuotaResourceMetrics.OBJECT,
8283
s3_endpoint: selectedDomain,
8384
}),
8485
];

packages/manager/src/components/QuotaUsageBar/QuotaUsageBar.test.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { QuotaResourceMetrics } from '@linode/api-v4';
12
import React from 'react';
23

34
import { renderWithTheme } from 'src/utilities/testHelpers';
@@ -43,7 +44,11 @@ describe('QuotaUsageBanner', () => {
4344
'should display correct byte quota usage text for $usage bytes used out of $limit bytes',
4445
({ usage, limit, expectedText }) => {
4546
const { getByText } = renderWithTheme(
46-
<QuotaUsageBar limit={limit} resourceMetric="byte" usage={usage} />
47+
<QuotaUsageBar
48+
limit={limit}
49+
resourceMetric={QuotaResourceMetrics.BYTE}
50+
usage={usage}
51+
/>
4752
);
4853
const quotaUsageText = getByText(expectedText);
4954
expect(quotaUsageText).toBeVisible();

packages/manager/src/components/QuotaUsageBar/QuotaUsageBar.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import {
77
pluralizeMetric,
88
} from 'src/features/Account/Quotas/utils';
99

10+
import type { QuotaResourceMetrics } from '@linode/api-v4';
11+
1012
interface Props {
1113
limit: number;
12-
resourceMetric: string;
14+
resourceMetric: QuotaResourceMetrics;
1315
usage: number;
1416
}
1517

packages/manager/src/factories/quotas.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
import {
2+
type Quota,
3+
QuotaResourceMetrics,
4+
type QuotaUsage,
5+
} from '@linode/api-v4/lib/quotas/types';
16
import { Factory } from '@linode/utilities';
27

3-
import type { Quota, QuotaUsage } from '@linode/api-v4/lib/quotas/types';
4-
58
export const quotaFactory = Factory.Sync.makeFactory<Quota>({
69
description: 'Maximimum number of vCPUs allowed',
710
quota_id: Factory.each((id) => id.toString()),
811
quota_limit: 50,
912
quota_name: 'Linode Dedicated vCPUs',
1013
quota_type: 'linode-dedicated-cpus',
1114
region_applied: 'us-east',
12-
resource_metric: 'CPU',
15+
resource_metric: QuotaResourceMetrics.CPU,
1316
has_usage: true,
1417
});
1518

packages/manager/src/features/Account/Quotas/utils.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { QuotaResourceMetrics, type QuotaUsage } from '@linode/api-v4';
12
import { profileFactory } from '@linode/utilities';
23
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
34
import { renderHook } from '@testing-library/react';
@@ -13,7 +14,6 @@ import {
1314
useGetLocationsForQuotaService,
1415
} from './utils';
1516

16-
import type { QuotaUsage } from '@linode/api-v4';
1717
import type { UseQueryResult } from '@tanstack/react-query';
1818

1919
const queryMocks = vi.hoisted(() => ({
@@ -154,7 +154,7 @@ describe('convertResourceMetric', () => {
154154
describe('pluralizeMetric', () => {
155155
it('should not pluralize if the value is 1', () => {
156156
const value = 1;
157-
const unit = 'CPU';
157+
const unit = QuotaResourceMetrics.REQUEST;
158158

159159
const result = pluralizeMetric(value, unit);
160160

@@ -163,7 +163,7 @@ describe('pluralizeMetric', () => {
163163

164164
it('should not pluralize the resource metric if the unit is byte', () => {
165165
const value = 100;
166-
const unit = 'byte';
166+
const unit = QuotaResourceMetrics.BYTE;
167167

168168
const result = pluralizeMetric(value, unit);
169169

@@ -172,7 +172,7 @@ describe('pluralizeMetric', () => {
172172

173173
it('should pluralize the resource metric if the unit is not byte', () => {
174174
const value = 100;
175-
const unit = 'CPU';
175+
const unit = QuotaResourceMetrics.REQUEST;
176176

177177
const result = pluralizeMetric(value, unit);
178178

packages/manager/src/features/Account/Quotas/utils.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { QuotaResourceMetrics } from '@linode/api-v4';
12
import { useRegionsQuery } from '@linode/queries';
23
import { capitalize, readableBytes } from '@linode/utilities';
34
import { object, string } from 'yup';
@@ -233,27 +234,26 @@ export const convertResourceMetric = ({
233234
convertedResourceMetric: string;
234235
convertedUsage: number;
235236
} => {
236-
if (initialResourceMetric === 'byte') {
237+
if (initialResourceMetric === QuotaResourceMetrics.BYTE) {
237238
const limitReadable = readableBytes(initialLimit);
238239

239240
return {
240241
convertedUsage: readableBytes(initialUsage, {
241242
unit: limitReadable.unit,
242243
}).value,
243-
convertedResourceMetric: capitalize(limitReadable.unit),
244244
convertedLimit: limitReadable.value,
245+
convertedResourceMetric: capitalize(limitReadable.unit),
245246
};
246247
}
247248

248-
if (initialResourceMetric === 'byte_per_second') {
249+
if (initialResourceMetric === QuotaResourceMetrics.BYTE_PER_SECOND) {
249250
return {
250251
convertedUsage: 0,
251-
convertedResourceMetric: 'Gbps',
252252
convertedLimit: readableBytes(initialLimit, {
253253
unit: 'GB',
254-
round: 0,
255254
base10: true,
256255
}).value,
256+
convertedResourceMetric: 'Gbps',
257257
};
258258
}
259259

@@ -271,12 +271,15 @@ export const convertResourceMetric = ({
271271
*
272272
* Note: the value should be the raw values in bytes, not an existing conversion
273273
*/
274-
export const pluralizeMetric = (value: number, unit: string) => {
275-
if (unit !== 'byte') {
276-
return value > 1 ? `${unit}s` : unit;
274+
export const pluralizeMetric = (value: number, unit: QuotaResourceMetrics) => {
275+
if (
276+
unit === QuotaResourceMetrics.BYTE ||
277+
unit === QuotaResourceMetrics.BYTE_PER_SECOND
278+
) {
279+
return unit;
277280
}
278281

279-
return unit;
282+
return value > 1 ? `${unit}s` : unit;
280283
};
281284

282285
export const getQuotaIncreaseFormSchema = (currentLimit: number) =>

packages/manager/src/features/ObjectStorage/SummaryLanding/Partials/EndpointSummaryRow.test.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { QuotaResourceMetrics } from '@linode/api-v4';
12
import * as React from 'react';
23

34
import { quotaFactory, quotaUsageFactory } from 'src/factories/quotas';
@@ -45,7 +46,7 @@ const quotasMock = [
4546
s3_endpoint: testEndpoint,
4647
description: 'Current number of buckets per account, per endpoint',
4748
quota_limit: 10,
48-
resource_metric: 'bucket',
49+
resource_metric: QuotaResourceMetrics.BUCKET,
4950
}),
5051
quotaFactory.build({
5152
quota_id: `obj-bytes-${testEndpoint}`,
@@ -55,7 +56,7 @@ const quotasMock = [
5556
s3_endpoint: testEndpoint,
5657
description: 'Current total capacity per account, per endpoint',
5758
quota_limit: 2048,
58-
resource_metric: 'byte',
59+
resource_metric: QuotaResourceMetrics.BYTE,
5960
}),
6061
quotaFactory.build({
6162
quota_id: `obj-objects-${testEndpoint}`,
@@ -65,7 +66,7 @@ const quotasMock = [
6566
s3_endpoint: testEndpoint,
6667
description: 'Current number of objects per account, per endpoint',
6768
quota_limit: 10,
68-
resource_metric: 'object',
69+
resource_metric: QuotaResourceMetrics.OBJECT,
6970
}),
7071
];
7172

0 commit comments

Comments
 (0)