diff --git a/packages/manager/.changeset/pr-11731-fixed-1740521257689.md b/packages/manager/.changeset/pr-11731-fixed-1740521257689.md new file mode 100644 index 00000000000..5483cf3cedd --- /dev/null +++ b/packages/manager/.changeset/pr-11731-fixed-1740521257689.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Fixed +--- + +RTX 6000 plans showing up in LKE UI ([#11731](https://github.com/linode/manager/pull/11731)) diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx index 78d4c8d3bab..a6dd7de1921 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx @@ -80,7 +80,8 @@ export const KubernetesPlansPanel = (props: Props) => { const plans = getPlanSelectionsByPlanType( flags.disableLargestGbPlans ? replaceOrAppendPlaceholder512GbPlans(_types) - : _types + : _types, + { isLKE: true } ); const tabs = Object.keys(plans).map( diff --git a/packages/manager/src/features/components/PlansPanel/utils.test.ts b/packages/manager/src/features/components/PlansPanel/utils.test.ts index de4789d109d..d945872e46c 100644 --- a/packages/manager/src/features/components/PlansPanel/utils.test.ts +++ b/packages/manager/src/features/components/PlansPanel/utils.test.ts @@ -135,6 +135,41 @@ describe('getPlanSelectionsByPlanType', () => { expect(actualKeys).toEqual(expectedOrder); }); + + it('should filter out RTX6000 plans when isLKE is true', () => { + const rtx6000Plan = typeFactory.build({ + class: 'gpu', + id: 'g1-gpu-rtx6000-1', + }); + const rtx4000Plan = typeFactory.build({ + class: 'gpu', + id: 'g1-gpu-rtx4000-1', + }); + + // With isLKE: true, RTX6000 should be filtered out + const actualWithLKE = getPlanSelectionsByPlanType( + [rtx6000Plan, rtx4000Plan], + { isLKE: true } + ); + + // With isLKE: false or default, RTX6000 should remain + const actualWithoutLKE = getPlanSelectionsByPlanType( + [rtx6000Plan, rtx4000Plan], + { isLKE: false } + ); + + const actualWithDefault = getPlanSelectionsByPlanType([ + rtx6000Plan, + rtx4000Plan, + ]); + + // RTX6000 should be filtered out in LKE context + expect(actualWithLKE.gpu).toEqual([rtx4000Plan]); + + // RTX6000 should remain in non-LKE context + expect(actualWithoutLKE.gpu).toEqual([rtx6000Plan, rtx4000Plan]); + expect(actualWithDefault.gpu).toEqual([rtx6000Plan, rtx4000Plan]); + }); }); describe('determineInitialPlanCategoryTab', () => { diff --git a/packages/manager/src/features/components/PlansPanel/utils.ts b/packages/manager/src/features/components/PlansPanel/utils.ts index 23a13d7ab8e..893ae7e5567 100644 --- a/packages/manager/src/features/components/PlansPanel/utils.ts +++ b/packages/manager/src/features/components/PlansPanel/utils.ts @@ -22,6 +22,7 @@ import type { } from './types'; import type { Capabilities, + BaseType, LinodeTypeClass, Region, RegionAvailability, @@ -74,6 +75,16 @@ export const useIsAcceleratedPlansEnabled = () => { return { isAcceleratedLKEPlansEnabled, isAcceleratedLinodePlansEnabled }; }; +const shouldExcludePlan = ( + type: { id: string }, + options: { isLKE?: boolean } = {} +): boolean => { + const { isLKE = false } = options; + const excludedPlanIdSubstring = 'rtx6000'; + // Filter out RTX6000 plans when in LKE context + return isLKE && type.id.includes(excludedPlanIdSubstring); +}; + /** * getPlanSelectionsByPlanType function takes an array of types, groups * them based on their class property into different plan types, filters out empty @@ -85,17 +96,22 @@ export const useIsAcceleratedPlansEnabled = () => { */ export const getPlanSelectionsByPlanType = < - T extends { class: LinodeTypeClass } + T extends BaseType & { class: LinodeTypeClass } >( - types: T[] + types: T[], + options: { isLKE?: boolean } = {} ): Partial> => { const plansByType: PlansByType = planTypeOrder.reduce((acc, key) => { acc[key] = []; return acc; }, {} as PlansByType); + const { isLKE = false } = options; // group plans by type for (const type of types) { + if (shouldExcludePlan(type, { isLKE })) { + continue; + } switch (type.class) { case 'nanode': case 'standard':