Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/manager/.changeset/pr-12821-added-1757419656849.md
Original file line number Diff line number Diff line change
@@ -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))
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,6 @@ describe('displays specific linode plans for GPU', () => {
mockAppendFeatureFlags({
gpuv2: {
egressBanner: true,
planDivider: true,
transferBanner: true,
},
}).as('getFeatureFlags');
Expand Down Expand Up @@ -428,7 +427,6 @@ describe('displays specific kubernetes plans for GPU', () => {
mockAppendFeatureFlags({
gpuv2: {
egressBanner: true,
planDivider: true,
transferBanner: true,
},
}).as('getFeatureFlags');
Expand Down
2 changes: 1 addition & 1 deletion packages/manager/src/featureFlags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ export interface CloudPulseResourceTypeMapFlag {

interface GpuV2 {
egressBanner: boolean;
planDivider: boolean;
transferBanner: boolean;
}

Expand Down Expand Up @@ -161,6 +160,7 @@ export interface Flags {
iam: BetaFeatureFlag;
iamRbacPrimaryNavChanges: boolean;
ipv6Sharing: boolean;
kubernetesBlackwellPlans: boolean;
limitsEvolution: LimitsEvolution;
linodeCloneFirewall: boolean;
linodeDiskEncryption: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -50,7 +49,6 @@ export const KubernetesPlanContainer = (
updatePlanCount,
wholePanelIsDisabled,
} = props;
const flags = useFlags();
const shouldDisplayNoRegionSelectedMessage = !selectedRegionId;

/**
Expand All @@ -59,9 +57,13 @@ export const KubernetesPlanContainer = (
*/
const planSelectionDividers: PlanSelectionDividers[] = [
{
flag: Boolean(flags.gpuv2?.planDivider),
planType: 'gpu',
tables: [
{
header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition',
planFilter: (plan: PlanWithAvailability) =>
plan.label.includes('Blackwell'),
},
{
header: 'NVIDIA RTX 4000 Ada',
planFilter: (plan: PlanWithAvailability) =>
Expand All @@ -70,7 +72,7 @@ export const KubernetesPlanContainer = (
{
header: 'NVIDIA Quadro RTX 6000',
planFilter: (plan: PlanWithAvailability) =>
!plan.label.includes('Ada'),
!plan.label.includes('Ada') && !plan.label.includes('Blackwell'),
},
],
},
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ 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)
);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ export interface PlanSelectionFilterOptionsTable {
}

export interface PlanSelectionDividers {
flag: boolean;
planType: LinodeTypeClass;
tables: PlanSelectionFilterOptionsTable[];
}
Expand Down Expand Up @@ -87,9 +86,13 @@ export const PlanContainer = (props: PlanContainerProps) => {
*/
const planSelectionDividers: PlanSelectionDividers[] = [
{
flag: Boolean(flags.gpuv2?.planDivider),
planType: 'gpu',
tables: [
{
header: 'NVIDIA RTX PRO 6000 Blackwell Server Edition',
planFilter: (plan: PlanWithAvailability) =>
plan.label.includes('Blackwell'),
},
{
header: 'NVIDIA RTX 4000 Ada',
planFilter: (plan: PlanWithAvailability) =>
Expand All @@ -98,7 +101,7 @@ export const PlanContainer = (props: PlanContainerProps) => {
{
header: 'NVIDIA Quadro RTX 6000',
planFilter: (plan: PlanWithAvailability) =>
!plan.label.includes('Ada'),
!plan.label.includes('Ada') && !plan.label.includes('Blackwell'),
},
],
},
Expand Down Expand Up @@ -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)
Expand All @@ -194,8 +196,7 @@ export const PlanContainer = (props: PlanContainerProps) => {
<Hidden lgDown={isCreate} mdDown={!isCreate}>
<Grid size={12}>
{planSelectionDividers.map((planSelectionDivider) =>
planType === planSelectionDivider.planType &&
planSelectionDivider.flag ? (
planType === planSelectionDivider.planType ? (
planSelectionDivider.tables.map((table, idx) => {
const filteredPlans = table.planFilter
? plans.filter(table.planFilter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down