From 32aef762bde52bd4e706b521bc10ddfb89ef79ed Mon Sep 17 00:00:00 2001 From: Ganesh Revanakar Date: Fri, 7 Nov 2025 12:22:24 +0530 Subject: [PATCH 1/3] change:[UIE-9541] Add MSW crud support for types API --- .../presets/crud/handlers/linodes/linodes.ts | 46 ++++++ .../manager/src/mocks/presets/crud/linodes.ts | 2 + packages/manager/src/mocks/serverHandlers.ts | 28 +--- packages/utilities/src/factories/linodes.ts | 138 ++++++++++++++++++ 4 files changed, 194 insertions(+), 20 deletions(-) diff --git a/packages/manager/src/mocks/presets/crud/handlers/linodes/linodes.ts b/packages/manager/src/mocks/presets/crud/handlers/linodes/linodes.ts index 25e5bd64f28..9188a5478fb 100644 --- a/packages/manager/src/mocks/presets/crud/handlers/linodes/linodes.ts +++ b/packages/manager/src/mocks/presets/crud/handlers/linodes/linodes.ts @@ -1,5 +1,11 @@ import { + acceleratedTypeFactory, configFactory, + dedicatedTypeFactory, + gcpDedicatedTypeFactory, + gpuTypeAdaFactory, + gpuTypeRtxFactory, + gpuTypeRtxProFactory, linodeBackupFactory, linodeConfigInterfaceFactory, linodeConfigInterfaceFactoryWithVPC, @@ -10,6 +16,8 @@ import { linodeIPFactory, linodeStatsFactory, linodeTransferFactory, + linodeTypeFactory, + premiumTypeFactory, } from '@linode/utilities'; import { DateTime } from 'luxon'; import { http } from 'msw'; @@ -33,6 +41,7 @@ import type { Linode, LinodeBackupsResponse, LinodeIPsResponse, + LinodeType, RegionalNetworkUtilization, Stats, } from '@linode/api-v4'; @@ -79,6 +88,43 @@ export const getLinodes = () => [ ), ]; +export const getLinodePlans = () => [ + http.get( + '*/v4/linode/types', + async ({ + request, + }): Promise< + StrictResponse> + > => { + const nanodeType = linodeTypeFactory.build({ id: 'g6-nanode-1' }); + const standardTypes = linodeTypeFactory.buildList(7); + const dedicatedTypes = [ + ...dedicatedTypeFactory.buildList(16), + ...Array.from(gcpDedicatedTypeFactory.build()), + ]; + const gpuTypesAda = gpuTypeAdaFactory.buildList(20); + const gpuTypesRtx = gpuTypeRtxFactory.buildList(20); + const gpuTypesRtxPro = gpuTypeRtxProFactory.buildList(20); + const premiumTypes = premiumTypeFactory.buildList(6); + const acceleratedType = acceleratedTypeFactory.buildList(7); + const mockPlans = [ + nanodeType, + ...standardTypes, + ...dedicatedTypes, + ...gpuTypesAda, + ...gpuTypesRtx, + ...gpuTypesRtxPro, + ...premiumTypes, + ...acceleratedType, + ]; + return makePaginatedResponse({ + data: mockPlans, + request, + }); + } + ), +]; + export const addFirewallDevice = async (inputs: { entityId: number; entityLabel: string; diff --git a/packages/manager/src/mocks/presets/crud/linodes.ts b/packages/manager/src/mocks/presets/crud/linodes.ts index f8c89c800d9..a7d08276823 100644 --- a/packages/manager/src/mocks/presets/crud/linodes.ts +++ b/packages/manager/src/mocks/presets/crud/linodes.ts @@ -14,6 +14,7 @@ import { getLinodeDisks, getLinodeFirewalls, getLinodeIps, + getLinodePlans, getLinodes, getLinodeStats, getLinodeTransfer, @@ -48,6 +49,7 @@ export const linodeCrudPreset: MockPresetCrud = { getLinodeIps, getLinodeBackups, shutDownLinode, + getLinodePlans, upgradeToLinodeInterfaces, deleteLinodeInterface, createLinodeInterface, diff --git a/packages/manager/src/mocks/serverHandlers.ts b/packages/manager/src/mocks/serverHandlers.ts index 14d3237a9b9..dfe2e18e2f5 100644 --- a/packages/manager/src/mocks/serverHandlers.ts +++ b/packages/manager/src/mocks/serverHandlers.ts @@ -7,10 +7,13 @@ * New handlers should be added to the CRUD baseline preset instead (ex: src/mocks/presets/crud/handlers/linodes.ts) which support a much more dynamic data mocking. */ import { + acceleratedTypeFactory, accountAvailabilityFactory, accountBetaFactory, betaFactory, dedicatedTypeFactory, + gpuTypeAdaFactory, + gpuTypeRtxFactory, grantFactory, grantsFactory, linodeFactory, @@ -22,6 +25,7 @@ import { nodeBalancerConfigNodeFactory, nodeBalancerFactory, pickRandom, + premiumTypeFactory, proDedicatedTypeFactory, profileFactory, regionAvailabilityFactory, @@ -534,21 +538,10 @@ const nanodeType = linodeTypeFactory.build({ id: 'g6-nanode-1' }); const standardTypes = linodeTypeFactory.buildList(7); const dedicatedTypes = dedicatedTypeFactory.buildList(7); const proDedicatedType = proDedicatedTypeFactory.build(); -const gpuTypesAda = linodeTypeFactory.buildList(7, { - class: 'gpu', - gpus: 5, - label: 'Ada Lovelace', - transfer: 0, -}); -const gpuTypesRX = linodeTypeFactory.buildList(7, { - class: 'gpu', - gpus: 1, - transfer: 5000, -}); +const gpuTypesAda = gpuTypeAdaFactory.buildList(7); +const gpuTypesRX = gpuTypeRtxFactory.buildList(7); const premiumTypes = [ - ...linodeTypeFactory.buildList(6, { - class: 'premium', - }), + ...premiumTypeFactory.buildList(6), linodeTypeFactory.build({ class: 'premium', disk: 10240000, @@ -564,13 +557,8 @@ const premiumTypes = [ vcpus: 128, }), ]; +const acceleratedType = acceleratedTypeFactory.buildList(7); -const acceleratedType = linodeTypeFactory.buildList(7, { - accelerated_devices: 1, - class: 'accelerated', - label: 'Netint Quadra T1U X', - transfer: 0, -}); const proxyAccountUser = accountUserFactory.build({ email: 'partner@proxy.com', last_login: null, diff --git a/packages/utilities/src/factories/linodes.ts b/packages/utilities/src/factories/linodes.ts index 494c86c3431..7e66d2e7c95 100644 --- a/packages/utilities/src/factories/linodes.ts +++ b/packages/utilities/src/factories/linodes.ts @@ -265,6 +265,109 @@ export const dedicatedTypeFactory = linodeTypeFactory.extend({ label: Factory.each((i) => `Dedicated 2${i}GB`), }); +export const gcpDedicatedTypeFactory = Factory.Sync.makeFactory( + ['G7', 'G8', 'G7 copy', 'G8 copy'] + .map((gen) => { + const computeOptimizedPlanConfigs = [ + // 1:2 ratio (vcpus:memory GB) + { memory: 4, vcpus: 2, generation: gen }, + { memory: 8, vcpus: 4, generation: gen }, + { memory: 16, vcpus: 8, generation: gen }, + { memory: 32, vcpus: 16, generation: gen }, + { memory: 48, vcpus: 24, generation: gen }, + { memory: 64, vcpus: 32, generation: gen }, + { memory: 96, vcpus: 48, generation: gen }, + { + memory: 128, + vcpus: gen.includes('G7') ? 50 : 64, + generation: gen, + }, + { + memory: 256, + vcpus: gen.includes('G7') ? 56 : 128, + generation: gen, + }, + { + memory: 512, + vcpus: gen.includes('G7') ? 64 : 256, + generation: gen, + }, + ]; + + // 1:4 ratio configs + const GeneralPurposePlanConfigs = [ + { memory: 8, vcpus: 2, generation: gen }, + { memory: 16, vcpus: 4, generation: gen }, + { memory: 32, vcpus: 8, generation: gen }, + { memory: 64, vcpus: 16, generation: gen }, + { memory: 96, vcpus: 24, generation: gen }, + { memory: 128, vcpus: 32, generation: gen }, + { memory: 192, vcpus: 48, generation: gen }, + { memory: 256, vcpus: 50, generation: gen }, + { memory: 384, vcpus: 56, generation: gen }, + { memory: 512, vcpus: 64, generation: gen }, + ]; + + return [...computeOptimizedPlanConfigs, ...GeneralPurposePlanConfigs]; + }) + .flat() + .map((planConfig) => { + return { + accelerated_devices: 0, + addons: { + backups: { + price: { + hourly: null, + monthly: null, + }, + region_prices: [ + { + hourly: null, + id: 'id-cgk', + monthly: null, + }, + { + hourly: null, + id: 'br-gru', + monthly: null, + }, + ], + }, + }, + class: 'dedicated', + disk: 5120000, + gpus: planConfig.generation.includes('copy') ? 1 : 0, + id: `${planConfig.generation.toLowerCase().replace(' copy', '')}-dedicated-${planConfig.memory}-${planConfig.vcpus}${ + planConfig.generation.includes('copy') ? '-copy' : '' + }`, + label: `${planConfig.generation.replace(' copy', '')} Dedicated ${planConfig.memory}x${planConfig.vcpus}${ + planConfig.generation.includes('copy') ? '-copy' : '' + }`, + memory: planConfig.memory * 1024, + network_out: 11000, + price: { + hourly: 2.88, + monthly: 1920.0, + }, + region_prices: [ + { + hourly: 4.032, + id: 'br-gru', + monthly: 2688, + }, + { + hourly: 3.436, + id: 'id-cgk', + monthly: 2304, + }, + ], + successor: null, + transfer: 11000, + vcpus: planConfig.vcpus, + }; + }), +); + export const proDedicatedTypeFactory = Factory.Sync.makeFactory({ accelerated_devices: 0, addons: { @@ -315,6 +418,41 @@ export const proDedicatedTypeFactory = Factory.Sync.makeFactory({ vcpus: 56, }); +export const gpuTypeRtxFactory = linodeTypeFactory.extend({ + class: 'gpu', + gpus: Factory.each((i) => i + 1), + id: Factory.each((i) => `g1-gpu-rtx6000-${i}`), + label: Factory.each((i) => `Dedicated 32 GB + RTX6000 GPU -${i}`), + transfer: 0, +}); + +export const gpuTypeAdaFactory = linodeTypeFactory.extend({ + class: 'gpu', + gpus: 1, + id: Factory.each((i) => `g2-gpu-rtx4000a${i}`), + label: Factory.each((i) => `RTX4000 Ada x${i}`), + transfer: 0, +}); + +export const gpuTypeRtxProFactory = linodeTypeFactory.extend({ + class: 'gpu', + gpus: Factory.each((i) => i + 1), + id: Factory.each((i) => `g3-gpu-rtxpro6000-blackwell-${i}`), + label: Factory.each((i) => `RTX PRO 6000 Blackwell x${i}`), + transfer: 0, +}); + +export const premiumTypeFactory = linodeTypeFactory.extend({ + class: 'premium', +}); + +export const acceleratedTypeFactory = linodeTypeFactory.extend({ + accelerated_devices: 1, + class: 'accelerated', + label: 'Netint Quadra T1U X', + transfer: 0, +}); + export const linodePlacementGroupPayloadFactory = Factory.Sync.makeFactory({ id: Factory.each((i) => i), From 717b2e0515056a566b0bb64b5fc0c8a7207410e7 Mon Sep 17 00:00:00 2001 From: Ganesh Revanakar Date: Fri, 7 Nov 2025 12:43:47 +0530 Subject: [PATCH 2/3] Added changeset: Add MSW crud support for types API --- .../.changeset/pr-13067-tech-stories-1762499626930.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/utilities/.changeset/pr-13067-tech-stories-1762499626930.md diff --git a/packages/utilities/.changeset/pr-13067-tech-stories-1762499626930.md b/packages/utilities/.changeset/pr-13067-tech-stories-1762499626930.md new file mode 100644 index 00000000000..fbcdf47f755 --- /dev/null +++ b/packages/utilities/.changeset/pr-13067-tech-stories-1762499626930.md @@ -0,0 +1,5 @@ +--- +"@linode/utilities": Tech Stories +--- + +Add MSW crud support for types API ([#13067](https://github.com/linode/manager/pull/13067)) From 70a8f133807fcfb0aeffff70ee85351d3f386e81 Mon Sep 17 00:00:00 2001 From: Ganesh Revanakar Date: Fri, 7 Nov 2025 15:13:49 +0530 Subject: [PATCH 3/3] Added changeset: Add MSW crud support for types API --- .../.changeset/pr-13067-tech-stories-1762508629516.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-13067-tech-stories-1762508629516.md diff --git a/packages/manager/.changeset/pr-13067-tech-stories-1762508629516.md b/packages/manager/.changeset/pr-13067-tech-stories-1762508629516.md new file mode 100644 index 00000000000..86a57c2e799 --- /dev/null +++ b/packages/manager/.changeset/pr-13067-tech-stories-1762508629516.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Tech Stories +--- + +Add MSW crud support for types API ([#13067](https://github.com/linode/manager/pull/13067))