From fcddec4bf46fd95895c9f72cd1ab5efa767f5bf2 Mon Sep 17 00:00:00 2001 From: Alban Bailly Date: Fri, 5 Sep 2025 13:16:37 +0200 Subject: [PATCH 1/6] initial commit --- .../e2e/core/linodes/plan-selection.spec.ts | 2 -- packages/manager/src/featureFlags.ts | 1 - .../KubernetesPlanContainer.tsx | 14 +++++++------- .../components/PlansPanel/PlanContainer.tsx | 15 ++++++++------- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/packages/manager/cypress/e2e/core/linodes/plan-selection.spec.ts b/packages/manager/cypress/e2e/core/linodes/plan-selection.spec.ts index b125410b982..1cca8fad33d 100644 --- a/packages/manager/cypress/e2e/core/linodes/plan-selection.spec.ts +++ b/packages/manager/cypress/e2e/core/linodes/plan-selection.spec.ts @@ -378,7 +378,6 @@ describe('displays specific linode plans for GPU', () => { mockAppendFeatureFlags({ gpuv2: { egressBanner: true, - planDivider: true, transferBanner: true, }, }).as('getFeatureFlags'); @@ -428,7 +427,6 @@ describe('displays specific kubernetes plans for GPU', () => { mockAppendFeatureFlags({ gpuv2: { egressBanner: true, - planDivider: true, transferBanner: true, }, }).as('getFeatureFlags'); diff --git a/packages/manager/src/featureFlags.ts b/packages/manager/src/featureFlags.ts index 9bcab347af9..d082e6ba25f 100644 --- a/packages/manager/src/featureFlags.ts +++ b/packages/manager/src/featureFlags.ts @@ -102,7 +102,6 @@ export interface CloudPulseResourceTypeMapFlag { interface GpuV2 { egressBanner: boolean; - planDivider: boolean; transferBanner: boolean; } diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx index 70a72e40eed..21b8c320cc4 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx @@ -3,7 +3,6 @@ import { Hidden } from '@linode/ui'; import Grid from '@mui/material/Grid'; import * as React from 'react'; -import { useFlags } from 'src/hooks/useFlags'; import { PLAN_SELECTION_NO_REGION_SELECTED_MESSAGE } from 'src/utilities/pricing/constants'; import { KubernetesPlanSelection } from './KubernetesPlanSelection'; @@ -50,7 +49,6 @@ export const KubernetesPlanContainer = ( updatePlanCount, wholePanelIsDisabled, } = props; - const flags = useFlags(); const shouldDisplayNoRegionSelectedMessage = !selectedRegionId; /** @@ -59,7 +57,6 @@ export const KubernetesPlanContainer = ( */ const planSelectionDividers: PlanSelectionDividers[] = [ { - flag: Boolean(flags.gpuv2?.planDivider), planType: 'gpu', tables: [ { @@ -67,6 +64,11 @@ export const KubernetesPlanContainer = ( planFilter: (plan: PlanWithAvailability) => plan.label.includes('Ada'), }, + { + header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition', + planFilter: (plan: PlanWithAvailability) => + plan.label.includes('Blackwell'), + }, { header: 'NVIDIA Quadro RTX 6000', planFilter: (plan: PlanWithAvailability) => @@ -130,8 +132,7 @@ export const KubernetesPlanContainer = ( /> ) : ( planSelectionDividers.map((planSelectionDivider) => - planType === planSelectionDivider.planType && - planSelectionDivider.flag + planType === planSelectionDivider.planType ? planSelectionDivider.tables.map((table) => { const filteredPlans = table.planFilter ? plans.filter(table.planFilter) @@ -159,8 +160,7 @@ export const KubernetesPlanContainer = ( }} > {planSelectionDividers.map((planSelectionDivider) => - planType === planSelectionDivider.planType && - planSelectionDivider.flag ? ( + planType === planSelectionDivider.planType ? ( planSelectionDivider.tables.map((table, idx) => { const filteredPlans = table.planFilter ? plans.filter(table.planFilter) diff --git a/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx b/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx index 04f7d0fc66e..7e0ccfffafc 100644 --- a/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx +++ b/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx @@ -21,7 +21,6 @@ export interface PlanSelectionFilterOptionsTable { } export interface PlanSelectionDividers { - flag: boolean; planType: LinodeTypeClass; tables: PlanSelectionFilterOptionsTable[]; } @@ -87,7 +86,6 @@ export const PlanContainer = (props: PlanContainerProps) => { */ const planSelectionDividers: PlanSelectionDividers[] = [ { - flag: Boolean(flags.gpuv2?.planDivider), planType: 'gpu', tables: [ { @@ -95,10 +93,15 @@ export const PlanContainer = (props: PlanContainerProps) => { planFilter: (plan: PlanWithAvailability) => plan.label.includes('Ada'), }, + { + header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition', + planFilter: (plan: PlanWithAvailability) => + plan.label.includes('Blackwell'), + }, { header: 'NVIDIA Quadro RTX 6000', planFilter: (plan: PlanWithAvailability) => - !plan.label.includes('Ada'), + !plan.label.includes('Ada') && !plan.label.includes('Blackwell'), }, ], }, @@ -170,8 +173,7 @@ export const PlanContainer = (props: PlanContainerProps) => { /> ) : ( planSelectionDividers.map((planSelectionDivider) => - planType === planSelectionDivider.planType && - planSelectionDivider.flag + planType === planSelectionDivider.planType ? planSelectionDivider.tables.map((table) => { const filteredPlans = table.planFilter ? plans.filter(table.planFilter) @@ -194,8 +196,7 @@ export const PlanContainer = (props: PlanContainerProps) => { {planSelectionDividers.map((planSelectionDivider) => - planType === planSelectionDivider.planType && - planSelectionDivider.flag ? ( + planType === planSelectionDivider.planType ? ( planSelectionDivider.tables.map((table, idx) => { const filteredPlans = table.planFilter ? plans.filter(table.planFilter) From 09debfb44ab9b4bc1bdf641aa8c1dabe3460e209 Mon Sep 17 00:00:00 2001 From: Alban Bailly Date: Fri, 5 Sep 2025 14:43:27 +0200 Subject: [PATCH 2/6] Added changeset: Support table grouping for the new NVIDIA Blackwell plans --- packages/manager/.changeset/pr-12821-added-1757076207432.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-12821-added-1757076207432.md diff --git a/packages/manager/.changeset/pr-12821-added-1757076207432.md b/packages/manager/.changeset/pr-12821-added-1757076207432.md new file mode 100644 index 00000000000..eedc2299200 --- /dev/null +++ b/packages/manager/.changeset/pr-12821-added-1757076207432.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Added +--- + +Support table grouping for the new NVIDIA Blackwell plans ([#12821](https://github.com/linode/manager/pull/12821)) From 2688c61546b66b270f0cc4f806e79cb239823117 Mon Sep 17 00:00:00 2001 From: Alban Bailly Date: Tue, 9 Sep 2025 12:01:13 +0200 Subject: [PATCH 3/6] product updates --- packages/manager/src/featureFlags.ts | 1 + .../KubernetesPlansPanel/KubernetesPlanContainer.tsx | 10 +++++----- .../KubernetesPlansPanel/KubernetesPlansPanel.tsx | 5 ++++- .../features/components/PlansPanel/PlanContainer.tsx | 8 ++++---- .../components/PlansPanel/PlanSelectionTable.tsx | 7 ++++--- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/manager/src/featureFlags.ts b/packages/manager/src/featureFlags.ts index d082e6ba25f..faa09298da3 100644 --- a/packages/manager/src/featureFlags.ts +++ b/packages/manager/src/featureFlags.ts @@ -160,6 +160,7 @@ export interface Flags { iam: BetaFeatureFlag; iamRbacPrimaryNavChanges: boolean; ipv6Sharing: boolean; + kubernetesBlackwellPlans: boolean; limitsEvolution: LimitsEvolution; linodeCloneFirewall: boolean; linodeDiskEncryption: boolean; diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx index 21b8c320cc4..95e03014172 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx @@ -60,19 +60,19 @@ export const KubernetesPlanContainer = ( planType: 'gpu', tables: [ { - header: 'NVIDIA RTX 4000 Ada', + header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition', planFilter: (plan: PlanWithAvailability) => - plan.label.includes('Ada'), + plan.label.includes('Blackwell'), }, { - header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition', + header: 'NVIDIA RTX 4000 Ada', planFilter: (plan: PlanWithAvailability) => - plan.label.includes('Blackwell'), + plan.label.includes('Ada'), }, { header: 'NVIDIA Quadro RTX 6000', planFilter: (plan: PlanWithAvailability) => - !plan.label.includes('Ada'), + !plan.label.includes('Ada') && !plan.label.includes('Blackwell'), }, ], }, diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx index 2918b3f3abc..b90c7794f55 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx @@ -96,7 +96,10 @@ export const KubernetesPlansPanel = (props: Props) => { !type.id.includes('nanode-edge') && // Filter out GPU types for enterprise; otherwise, return the rest of the types. // TODO: remove this once GPU plans are supported in LKE-E (Q3 2025) - (selectedTier === 'enterprise' ? !type.id.includes('gpu') : true) + (selectedTier === 'enterprise' ? !type.id.includes('gpu') : true) && + // Filter out Blackwell plans for kubernetes (for now) + !type.id.includes('blackwell') && + !flags.kubernetesBlackwellPlans ); }); diff --git a/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx b/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx index 7e0ccfffafc..edbd3a85639 100644 --- a/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx +++ b/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx @@ -89,14 +89,14 @@ export const PlanContainer = (props: PlanContainerProps) => { planType: 'gpu', tables: [ { - header: 'NVIDIA RTX 4000 Ada', + header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition', planFilter: (plan: PlanWithAvailability) => - plan.label.includes('Ada'), + plan.label.includes('Blackwell'), }, { - header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition', + header: 'NVIDIA RTX 4000 Ada', planFilter: (plan: PlanWithAvailability) => - plan.label.includes('Blackwell'), + plan.label.includes('Ada'), }, { header: 'NVIDIA Quadro RTX 6000', diff --git a/packages/manager/src/features/components/PlansPanel/PlanSelectionTable.tsx b/packages/manager/src/features/components/PlansPanel/PlanSelectionTable.tsx index 531c5d9838f..7db5f54f2d5 100644 --- a/packages/manager/src/features/components/PlansPanel/PlanSelectionTable.tsx +++ b/packages/manager/src/features/components/PlansPanel/PlanSelectionTable.tsx @@ -63,9 +63,10 @@ export const PlanSelectionTable = (props: PlanSelectionTableProps) => { (cellName: string) => plans?.some((plan) => { const showTooltipForGPUPlans = - flags.gpuv2?.transferBanner && - plan.class === 'gpu' && - filterOptions?.header?.includes('Ada'); + (flags.gpuv2?.transferBanner && + plan.class === 'gpu' && + filterOptions?.header?.includes('Ada')) || + filterOptions?.header?.includes('Blackwell'); return ( (showTooltipForGPUPlans || plan.class === 'accelerated') && cellName === 'Transfer' From f50f62c08999be64710bea5654cff0e8af76489c Mon Sep 17 00:00:00 2001 From: Alban Bailly Date: Tue, 9 Sep 2025 12:04:30 +0200 Subject: [PATCH 4/6] product updates --- .../Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx index b90c7794f55..493d3b2b559 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx @@ -98,8 +98,7 @@ export const KubernetesPlansPanel = (props: Props) => { // TODO: remove this once GPU plans are supported in LKE-E (Q3 2025) (selectedTier === 'enterprise' ? !type.id.includes('gpu') : true) && // Filter out Blackwell plans for kubernetes (for now) - !type.id.includes('blackwell') && - !flags.kubernetesBlackwellPlans + !(type.id.includes('blackwell') && !flags.kubernetesBlackwellPlans) ); }); From 2244918e148c5242f370ae673e5bf8e8c7196397 Mon Sep 17 00:00:00 2001 From: Alban Bailly Date: Tue, 9 Sep 2025 14:07:37 +0200 Subject: [PATCH 5/6] Added changeset: Plan selection table grouping for the new NVIDIA Blackwell plans --- packages/manager/.changeset/pr-12821-added-1757419656849.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-12821-added-1757419656849.md diff --git a/packages/manager/.changeset/pr-12821-added-1757419656849.md b/packages/manager/.changeset/pr-12821-added-1757419656849.md new file mode 100644 index 00000000000..53d2d0ee114 --- /dev/null +++ b/packages/manager/.changeset/pr-12821-added-1757419656849.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Added +--- + +Plan selection table grouping for the new NVIDIA Blackwell plans ([#12821](https://github.com/linode/manager/pull/12821)) From c183f9d24dbf775685a24609a5611894e7cf0748 Mon Sep 17 00:00:00 2001 From: Alban Bailly Date: Tue, 9 Sep 2025 14:08:32 +0200 Subject: [PATCH 6/6] remove dupe changeset --- packages/manager/.changeset/pr-12821-added-1757076207432.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 packages/manager/.changeset/pr-12821-added-1757076207432.md diff --git a/packages/manager/.changeset/pr-12821-added-1757076207432.md b/packages/manager/.changeset/pr-12821-added-1757076207432.md deleted file mode 100644 index eedc2299200..00000000000 --- a/packages/manager/.changeset/pr-12821-added-1757076207432.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@linode/manager": Added ---- - -Support table grouping for the new NVIDIA Blackwell plans ([#12821](https://github.com/linode/manager/pull/12821))