+
{
text: getLabel(),
}),
}}
- className={classes.label}
/>
-
+
({
+ color: theme.color.headline,
+ })}
+ >
+ {source}
+
-
{source}
- >
+
+
)}
-
+
);
};
diff --git a/packages/manager/src/features/Help/SearchHOC.tsx b/packages/manager/src/features/Help/SearchHOC.tsx
index ec2bfffcc56..996bab7c094 100644
--- a/packages/manager/src/features/Help/SearchHOC.tsx
+++ b/packages/manager/src/features/Help/SearchHOC.tsx
@@ -1,8 +1,7 @@
-import Algolia, { SearchClient } from 'algoliasearch';
+import Algolia from 'algoliasearch';
import { pathOr } from 'ramda';
import * as React from 'react';
-import { Item } from 'src/components/EnhancedSelect/Select';
import {
ALGOLIA_APPLICATION_ID,
ALGOLIA_SEARCH_KEY,
@@ -11,6 +10,8 @@ import {
} from 'src/constants';
import { truncate } from 'src/utilities/truncate';
+import type { SearchClient } from 'algoliasearch';
+
interface SearchHit {
_highlightResult?: any;
description?: string;
@@ -24,7 +25,7 @@ export interface AlgoliaState {
searchAlgolia: (inputValue: string) => void;
searchEnabled: boolean;
searchError?: string;
- searchResults: [Item[], Item[]];
+ searchResults: [ConvertedItems[], ConvertedItems[]];
}
interface SearchOptions {
@@ -36,11 +37,17 @@ interface AlgoliaContent {
results: unknown;
}
+export interface ConvertedItems {
+ data: { href: string; source: string };
+ label: string;
+ value: number;
+}
+
// Functional helper methods
export const convertDocsToItems = (
highlight: boolean,
hits: SearchHit[] = []
-): Item[] => {
+): ConvertedItems[] => {
return hits.map((hit: SearchHit, idx: number) => {
return {
data: {
@@ -56,7 +63,7 @@ export const convertDocsToItems = (
export const convertCommunityToItems = (
highlight: boolean,
hits: SearchHit[] = []
-): Item[] => {
+): ConvertedItems[] => {
return hits.map((hit: SearchHit, idx: number) => {
return {
data: {
diff --git a/packages/ui/src/foundations/breakpoints.ts b/packages/ui/src/foundations/breakpoints.ts
index be731cc5781..f888047e96d 100644
--- a/packages/ui/src/foundations/breakpoints.ts
+++ b/packages/ui/src/foundations/breakpoints.ts
@@ -1,4 +1,4 @@
-import { Chart } from '@linode/design-language-system';
+import { Chart, Search } from '@linode/design-language-system';
import { createTheme } from '@mui/material';
// This is a hack to create breakpoints outside of the theme itself.
@@ -13,6 +13,6 @@ export const breakpoints = createTheme({
xs: 0,
},
},
- tokens: { chart: Chart },
name: 'light',
+ tokens: { chart: Chart, search: Search },
}).breakpoints;
diff --git a/packages/ui/src/foundations/themes/dark.ts b/packages/ui/src/foundations/themes/dark.ts
index 720d7831895..17b6c889ca7 100644
--- a/packages/ui/src/foundations/themes/dark.ts
+++ b/packages/ui/src/foundations/themes/dark.ts
@@ -11,6 +11,7 @@ import {
Elevation,
Interaction,
NotificationToast,
+ Search,
Select,
TextField,
Typography,
@@ -214,6 +215,23 @@ export const darkTheme: ThemeOptions = {
},
MuiAutocomplete: {
styleOverrides: {
+ endAdornment: {
+ '.MuiAutocomplete-clearIndicator': {
+ visibility: 'visible !important',
+ },
+ '.MuiAutocomplete-popupIndicator': {
+ svg: {
+ fontSize: '28px',
+ },
+ },
+ paddingRight: 4,
+ svg: {
+ ':hover': {
+ color: `${Color.Brand[50]} !important`,
+ },
+ color: `${Search.Default.Icon} !important`,
+ },
+ },
input: {
'&::selection': {
backgroundColor: customDarkModeOptions.bg.appBar,
@@ -901,6 +919,7 @@ export const darkTheme: ThemeOptions = {
content: Content,
elevation: Elevation,
interaction: Interaction,
+ search: Search,
typography: Typography,
},
typography: {
diff --git a/packages/ui/src/foundations/themes/index.ts b/packages/ui/src/foundations/themes/index.ts
index 5ee8d7cad6d..9d3ca01007c 100644
--- a/packages/ui/src/foundations/themes/index.ts
+++ b/packages/ui/src/foundations/themes/index.ts
@@ -18,6 +18,7 @@ import type {
FontTypes,
InteractionTypes as InteractionTypesLight,
RadiusTypes,
+ SearchTypes as SearchTypesLight,
SpacingTypes,
TypographyTypes,
} from '@linode/design-language-system';
@@ -29,6 +30,7 @@ import type {
ContentTypes as ContentTypesDark,
ElevationTypes as ElevationTypesDark,
InteractionTypes as InteractionTypesDark,
+ SearchTypes as SearchTypesDark,
} from '@linode/design-language-system/themes/dark';
import type { latoWeb } from '../fonts';
// Types & Interfaces
@@ -53,6 +55,7 @@ type BorderTypes = MergeTypes
;
type ContentTypes = MergeTypes;
type ElevationTypes = MergeTypes;
type InteractionTypes = MergeTypes;
+type SearchTypes = MergeTypes;
type Fonts = typeof latoWeb;
@@ -91,7 +94,7 @@ type NotificationToast = MergeTypes<
* Avoid doing this unless you have a good reason.
*/
declare module '@mui/material/styles/createTheme' {
- interface Theme {
+ export interface Theme {
addCircleHoverEffect?: any;
animateCircleIcon?: any;
applyLinkStyles?: any;
@@ -112,6 +115,7 @@ declare module '@mui/material/styles/createTheme' {
borderRadius: BorderRadiusTypes;
color: ColorTypes;
font: FontTypes;
+ search: SearchTypes;
spacing: SpacingTypes;
// ----------------------------------------
accent: AccentTypes;
@@ -128,7 +132,7 @@ declare module '@mui/material/styles/createTheme' {
visually: any;
}
- interface ThemeOptions {
+ export interface ThemeOptions {
addCircleHoverEffect?: any;
animateCircleIcon?: any;
applyLinkStyles?: any;
@@ -149,6 +153,7 @@ declare module '@mui/material/styles/createTheme' {
borderRadius?: BorderRadiusTypes;
color?: ColorTypes;
font?: FontTypes;
+ search: SearchTypes;
spacing?: SpacingTypes;
// ----------------------------------------
accent?: AccentTypes;
diff --git a/packages/ui/src/foundations/themes/light.ts b/packages/ui/src/foundations/themes/light.ts
index 33fe880eb8c..b4c466ae73f 100644
--- a/packages/ui/src/foundations/themes/light.ts
+++ b/packages/ui/src/foundations/themes/light.ts
@@ -14,6 +14,7 @@ import {
Interaction,
NotificationToast,
Radius,
+ Search,
Select,
Spacing,
Typography,
@@ -325,16 +326,15 @@ export const lightTheme: ThemeOptions = {
},
'.MuiAutocomplete-popupIndicator': {
svg: {
- ':hover': {
- opacity: 1,
- },
fontSize: '28px',
- opacity: 0.5,
},
},
paddingRight: 4,
svg: {
- color: Color.Neutrals[40],
+ ':hover': {
+ color: `${Color.Brand[70]} !important`,
+ },
+ color: `${Search.Default.Icon} !important`,
},
},
groupLabel: {
@@ -374,7 +374,10 @@ export const lightTheme: ThemeOptions = {
borderTop: 0,
},
option: {
- '&.Mui-focused, :hover': {
+ '&.Mui-focused': {
+ backgroundColor: 'transparent',
+ },
+ '&:hover': {
backgroundColor: `${primaryColors.main} !important`,
color: primaryColors.white,
transition: 'background-color 0.2s',
@@ -1674,6 +1677,7 @@ export const lightTheme: ThemeOptions = {
font: Font,
interaction: Interaction,
radius: Radius,
+ search: Search,
spacing: Spacing,
typography: Typography,
},
From 7634e114b6a81ee4cbd5af11816a5335567e5589 Mon Sep 17 00:00:00 2001
From: aaleksee-akamai
Date: Wed, 22 Jan 2025 16:20:20 +0100
Subject: [PATCH 38/42] fix: [UIE-8386] - fix redirects to old route (#11539)
Fix redirects from /account/ to /iam/ when editing the username or deleting the user.
---
.../pr-11539-upcoming-features-1737537564184.md | 5 +++++
.../IAM/Users/UserDetails/DeleteUserPanel.tsx | 2 +-
.../IAM/Users/UserDetails/UsernamePanel.tsx | 2 +-
.../IAM/Users/UsersTable/CreateUserDrawer.tsx | 14 +++++---------
4 files changed, 12 insertions(+), 11 deletions(-)
create mode 100644 packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md
diff --git a/packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md b/packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md
new file mode 100644
index 00000000000..ce367462d47
--- /dev/null
+++ b/packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Upcoming Features
+---
+
+fix redirects from /account to /iam ([#11539](https://github.com/linode/manager/pull/11539))
diff --git a/packages/manager/src/features/IAM/Users/UserDetails/DeleteUserPanel.tsx b/packages/manager/src/features/IAM/Users/UserDetails/DeleteUserPanel.tsx
index b988df126f8..22f6ea766aa 100644
--- a/packages/manager/src/features/IAM/Users/UserDetails/DeleteUserPanel.tsx
+++ b/packages/manager/src/features/IAM/Users/UserDetails/DeleteUserPanel.tsx
@@ -47,7 +47,7 @@ export const DeleteUserPanel = ({ user }: Props) => {
setIsDeleteDialogOpen(false)}
- onSuccess={() => history.push(`/account/users`)}
+ onSuccess={() => history.push(`/iam/users`)}
open={isDeleteDialogOpen}
username={user.username}
/>
diff --git a/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx b/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx
index 26ec27c2f88..801c1e431db 100644
--- a/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx
+++ b/packages/manager/src/features/IAM/Users/UserDetails/UsernamePanel.tsx
@@ -36,7 +36,7 @@ export const UsernamePanel = ({ user }: Props) => {
const user = await mutateAsync(values);
// Because the username changed, we need to update the username in the URL
- history.replace(`/account/users/${user.username}`);
+ history.replace(`/iam/users/${user.username}/details`);
enqueueSnackbar('Username updated successfully', { variant: 'success' });
} catch (error) {
diff --git a/packages/manager/src/features/IAM/Users/UsersTable/CreateUserDrawer.tsx b/packages/manager/src/features/IAM/Users/UsersTable/CreateUserDrawer.tsx
index 674838be112..f4d27a78482 100644
--- a/packages/manager/src/features/IAM/Users/UsersTable/CreateUserDrawer.tsx
+++ b/packages/manager/src/features/IAM/Users/UsersTable/CreateUserDrawer.tsx
@@ -104,19 +104,15 @@ export const CreateUserDrawer = (props: Props) => {
(
{
- field.onChange(!e.target.checked);
- }}
- checked={!field.value}
- data-qa-create-restricted
- />
- }
label={`This user will have ${
field.value ? 'limited' : 'full'
} access to account features.
This can be changed later.`}
+ onChange={(e: React.ChangeEvent) => {
+ field.onChange(!e.target.checked);
+ }}
+ checked={!field.value}
+ control={}
sx={{ marginTop: 1 }}
/>
)}
From 1b6607a96269551c620851d72b00f4326a953eaa Mon Sep 17 00:00:00 2001
From: Alban Bailly <130582365+abailly-akamai@users.noreply.github.com>
Date: Wed, 22 Jan 2025 11:56:03 -0500
Subject: [PATCH 39/42] feat: [M3-9158] - Add GPU plans support for LKE in
Cloud Manager (#11544)
* initial commit - add GPU split plan selection panel
* test + banner display
* update tables and test for consistency
* Optimize refactor
* remove test skipping
* Added changeset: GPU plans in Kubernetes create flow
* Allo GPU in add node pool drawer
---
.../pr-11544-added-1737522840655.md | 5 +
.../e2e/core/linodes/plan-selection.spec.ts | 51 +++++
.../CreateCluster/NodePoolPanel.tsx | 4 +-
.../NodePoolsDisplay/AddNodePoolDrawer.tsx | 6 +-
.../KubernetesPlanContainer.tsx | 206 +++++++++++-------
.../KubernetesPlanSelectionTable.tsx | 80 +++++++
.../KubernetesPlansPanel.tsx | 2 +
.../components/PlansPanel/PlanContainer.tsx | 2 +-
.../PlansPanel/PlanInformation.test.tsx | 1 +
.../components/PlansPanel/PlanInformation.tsx | 4 +-
.../components/PlansPanel/PlansPanel.tsx | 1 +
11 files changed, 273 insertions(+), 89 deletions(-)
create mode 100644 packages/manager/.changeset/pr-11544-added-1737522840655.md
create mode 100644 packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanSelectionTable.tsx
diff --git a/packages/manager/.changeset/pr-11544-added-1737522840655.md b/packages/manager/.changeset/pr-11544-added-1737522840655.md
new file mode 100644
index 00000000000..88f8fc5a9ea
--- /dev/null
+++ b/packages/manager/.changeset/pr-11544-added-1737522840655.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Added
+---
+
+GPU plans in Kubernetes create flow ([#11544](https://github.com/linode/manager/pull/11544))
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 a23c01564d4..30ecd433839 100644
--- a/packages/manager/cypress/e2e/core/linodes/plan-selection.spec.ts
+++ b/packages/manager/cypress/e2e/core/linodes/plan-selection.spec.ts
@@ -409,6 +409,57 @@ describe('displays specific linode plans for GPU', () => {
});
});
+describe('displays specific kubernetes plans for GPU', () => {
+ beforeEach(() => {
+ mockGetRegions(mockRegions).as('getRegions');
+ mockGetLinodeTypes(mockLinodeTypes).as('getLinodeTypes');
+ mockGetRegionAvailability(mockRegions[0].id, mockRegionAvailability).as(
+ 'getRegionAvailability'
+ );
+ mockAppendFeatureFlags({
+ gpuv2: {
+ transferBanner: true,
+ planDivider: true,
+ egressBanner: true,
+ },
+ }).as('getFeatureFlags');
+ });
+
+ it('Should render divided tables when GPU divider enabled', () => {
+ cy.visitWithLogin('/kubernetes/create');
+ cy.wait(['@getRegions', '@getLinodeTypes', '@getFeatureFlags']);
+ ui.regionSelect.find().click();
+ ui.regionSelect.findItemByRegionLabel(mockRegions[0].label).click();
+
+ // GPU tab
+ // Should display two separate tables
+ cy.findByText('GPU').click();
+ cy.get(k8PlansPanel).within(() => {
+ cy.findAllByRole('alert').should('have.length', 2);
+ cy.get(notices.unavailable).should('be.visible');
+
+ cy.findByRole('table', {
+ name: 'List of NVIDIA RTX 4000 Ada Plans',
+ }).within(() => {
+ cy.findByText('NVIDIA RTX 4000 Ada').should('be.visible');
+ cy.findAllByRole('row').should('have.length', 2);
+ cy.get('[data-qa-plan-row="gpu-2 Ada"]').should(
+ 'have.attr',
+ 'disabled'
+ );
+ });
+
+ cy.findByRole('table', {
+ name: 'List of NVIDIA Quadro RTX 6000 Plans',
+ }).within(() => {
+ cy.findByText('NVIDIA Quadro RTX 6000').should('be.visible');
+ cy.findAllByRole('row').should('have.length', 2);
+ cy.get('[data-qa-plan-row="gpu-1"]').should('have.attr', 'disabled');
+ });
+ });
+ });
+});
+
describe('Linode Accelerated plans', () => {
beforeEach(() => {
mockGetRegions(mockRegions).as('getRegions');
diff --git a/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx b/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx
index 075837d2ad9..10e8f126545 100644
--- a/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx
+++ b/packages/manager/src/features/Kubernetes/CreateCluster/NodePoolPanel.tsx
@@ -121,8 +121,8 @@ const Panel = (props: NodePoolPanelProps) => {
return false;
}
- // No Nanodes or GPUs in Kubernetes clusters
- return t.class !== 'nanode' && t.class !== 'gpu';
+ // No Nanodes in Kubernetes clusters
+ return t.class !== 'nanode';
})}
error={apiError}
hasSelectedRegion={hasSelectedRegion}
diff --git a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/AddNodePoolDrawer.tsx b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/AddNodePoolDrawer.tsx
index a34e1271b94..c24ac3419de 100644
--- a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/AddNodePoolDrawer.tsx
+++ b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/AddNodePoolDrawer.tsx
@@ -180,10 +180,6 @@ export const AddNodePoolDrawer = (props: Props) => {
setSelectedTypeInfo({ count: 1, planId: newType });
}
}}
- // No nanodes or GPUs in clusters
- types={extendedTypes.filter(
- (t) => t.class !== 'nanode' && t.class !== 'gpu'
- )}
addPool={handleAdd}
getTypeCount={getTypeCount}
hasSelectedRegion={hasSelectedRegion}
@@ -194,6 +190,8 @@ export const AddNodePoolDrawer = (props: Props) => {
resetValues={resetDrawer}
selectedId={selectedTypeInfo?.planId}
selectedRegionId={clusterRegionId}
+ // No nanodes in clusters
+ types={extendedTypes.filter((t) => t.class !== 'nanode')}
updatePlanCount={updatePlanCount}
/>
{selectedTypeInfo &&
diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx
index e88d951a9ab..68f498da6d2 100644
--- a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx
+++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanContainer.tsx
@@ -1,36 +1,28 @@
-import { Notice } from '@linode/ui';
+import { Notice, Typography } from '@linode/ui';
import Grid from '@mui/material/Unstable_Grid2';
import * as React from 'react';
import { Hidden } from 'src/components/Hidden';
-import { Table } from 'src/components/Table';
-import { TableBody } from 'src/components/TableBody';
-import { TableCell } from 'src/components/TableCell';
-import { TableHead } from 'src/components/TableHead';
-import { TableRow } from 'src/components/TableRow';
-import { TableRowEmpty } from 'src/components/TableRowEmpty/TableRowEmpty';
+import { useFlags } from 'src/hooks/useFlags';
import { PLAN_SELECTION_NO_REGION_SELECTED_MESSAGE } from 'src/utilities/pricing/constants';
import { KubernetesPlanSelection } from './KubernetesPlanSelection';
+import { KubernetesPlanSelectionTable } from './KubernetesPlanSelectionTable';
+import type { LinodeTypeClass } from '@linode/api-v4';
+import type {
+ PlanSelectionDividers,
+ PlanSelectionFilterOptionsTable,
+} from 'src/features/components/PlansPanel/PlanContainer';
import type { PlanWithAvailability } from 'src/features/components/PlansPanel/types';
-const tableCells = [
- { cellName: 'Plan', center: false, noWrap: false, testId: 'plan' },
- { cellName: 'Monthly', center: false, noWrap: false, testId: 'monthly' },
- { cellName: 'Hourly', center: false, noWrap: false, testId: 'hourly' },
- { cellName: 'RAM', center: true, noWrap: false, testId: 'ram' },
- { cellName: 'CPUs', center: true, noWrap: false, testId: 'cpu' },
- { cellName: 'Storage', center: true, noWrap: false, testId: 'storage' },
- { cellName: 'Quantity', center: false, noWrap: false, testId: 'quantity' },
-];
-
export interface KubernetesPlanContainerProps {
allDisabledPlans: PlanWithAvailability[];
getTypeCount: (planId: string) => number;
hasMajorityOfPlansDisabled: boolean;
onAdd?: (key: string, value: number) => void;
onSelect: (key: string) => void;
+ planType?: LinodeTypeClass;
plans: PlanWithAvailability[];
selectedId?: string;
selectedRegionId?: string;
@@ -46,44 +38,75 @@ export const KubernetesPlanContainer = (
hasMajorityOfPlansDisabled,
onAdd,
onSelect,
+ planType,
plans,
selectedId,
selectedRegionId,
updatePlanCount,
wholePanelIsDisabled,
} = props;
-
+ const flags = useFlags();
const shouldDisplayNoRegionSelectedMessage = !selectedRegionId;
- const renderPlanSelection = React.useCallback(() => {
- return plans.map((plan, id) => {
- return (
-
- );
- });
- }, [
- wholePanelIsDisabled,
- hasMajorityOfPlansDisabled,
- getTypeCount,
- onAdd,
- onSelect,
- plans,
- selectedId,
- selectedRegionId,
- updatePlanCount,
- ]);
+ /**
+ * This features allows us to divide the GPU plans into two separate tables.
+ * This can be re-used for other plan types in the future.
+ */
+ const planSelectionDividers: PlanSelectionDividers[] = [
+ {
+ flag: Boolean(flags.gpuv2?.planDivider),
+ planType: 'gpu',
+ tables: [
+ {
+ header: 'NVIDIA RTX 4000 Ada',
+ planFilter: (plan: PlanWithAvailability) =>
+ plan.label.includes('Ada'),
+ },
+ {
+ header: 'NVIDIA Quadro RTX 6000',
+ planFilter: (plan: PlanWithAvailability) =>
+ !plan.label.includes('Ada'),
+ },
+ ],
+ },
+ ];
+
+ const renderPlanSelection = React.useCallback(
+ (filterOptions?: PlanSelectionFilterOptionsTable) => {
+ const _plans = filterOptions?.planFilter
+ ? plans.filter(filterOptions.planFilter)
+ : plans;
+
+ return _plans.map((plan, id) => {
+ return (
+
+ );
+ });
+ },
+ [
+ wholePanelIsDisabled,
+ hasMajorityOfPlansDisabled,
+ getTypeCount,
+ onAdd,
+ onSelect,
+ plans,
+ selectedId,
+ selectedRegionId,
+ updatePlanCount,
+ ]
+ );
return (
@@ -97,44 +120,65 @@ export const KubernetesPlanContainer = (
variant="info"
/>
) : (
- renderPlanSelection()
+ planSelectionDividers.map((planSelectionDivider) =>
+ planType === planSelectionDivider.planType &&
+ planSelectionDivider.flag
+ ? planSelectionDivider.tables.map((table) => {
+ const filteredPlans = table.planFilter
+ ? plans.filter(table.planFilter)
+ : plans;
+ return [
+ filteredPlans.length > 0 && (
+
+ {table.header}
+
+ ),
+ renderPlanSelection({
+ planFilter: table.planFilter,
+ }),
+ ];
+ })
+ : renderPlanSelection()
+ )
)}
-
-
-
- {tableCells.map(({ cellName, center, noWrap, testId }) => {
- const attributeValue = `${testId}-header`;
- return (
-
- {cellName === 'Quantity' ? (
- {cellName}
- ) : (
- cellName
- )}
-
- );
- })}
-
-
-
- {shouldDisplayNoRegionSelectedMessage ? (
-
- ) : (
- renderPlanSelection()
- )}
-
-
+ {planSelectionDividers.map((planSelectionDivider) =>
+ planType === planSelectionDivider.planType &&
+ planSelectionDivider.flag ? (
+ planSelectionDivider.tables.map((table, idx) => {
+ const filteredPlans = table.planFilter
+ ? plans.filter(table.planFilter)
+ : plans;
+ return (
+ filteredPlans.length > 0 && (
+
+ renderPlanSelection({
+ header: table.header,
+ planFilter: table.planFilter,
+ })
+ }
+ shouldDisplayNoRegionSelectedMessage={
+ shouldDisplayNoRegionSelectedMessage
+ }
+ filterOptions={table}
+ key={`k8-plan-filter-${idx}`}
+ />
+ )
+ );
+ })
+ ) : (
+
+ )
+ )}
diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanSelectionTable.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanSelectionTable.tsx
new file mode 100644
index 00000000000..12b682e555d
--- /dev/null
+++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlanSelectionTable.tsx
@@ -0,0 +1,80 @@
+import * as React from 'react';
+
+import { Table } from 'src/components/Table';
+import { TableBody } from 'src/components/TableBody';
+import { TableCell } from 'src/components/TableCell';
+import { TableHead } from 'src/components/TableHead';
+import { TableRow } from 'src/components/TableRow';
+import { TableRowEmpty } from 'src/components/TableRowEmpty/TableRowEmpty';
+import { PLAN_SELECTION_NO_REGION_SELECTED_MESSAGE } from 'src/utilities/pricing/constants';
+
+import type { PlanSelectionFilterOptionsTable } from 'src/features/components/PlansPanel/PlanContainer';
+
+interface KubernetesPlanSelectionTableProps {
+ filterOptions?: PlanSelectionFilterOptionsTable;
+ renderPlanSelection: (
+ filterOptions?: PlanSelectionFilterOptionsTable | undefined
+ ) => React.JSX.Element[];
+ shouldDisplayNoRegionSelectedMessage: boolean;
+}
+
+const tableCells = [
+ { cellName: 'Plan', center: false, noWrap: false, testId: 'plan' },
+ { cellName: 'Monthly', center: false, noWrap: false, testId: 'monthly' },
+ { cellName: 'Hourly', center: false, noWrap: false, testId: 'hourly' },
+ { cellName: 'RAM', center: true, noWrap: false, testId: 'ram' },
+ { cellName: 'CPUs', center: true, noWrap: false, testId: 'cpu' },
+ { cellName: 'Storage', center: true, noWrap: false, testId: 'storage' },
+ { cellName: 'Quantity', center: false, noWrap: false, testId: 'quantity' },
+];
+
+export const KubernetesPlanSelectionTable = (
+ props: KubernetesPlanSelectionTableProps
+) => {
+ const {
+ filterOptions,
+ renderPlanSelection,
+ shouldDisplayNoRegionSelectedMessage,
+ } = props;
+
+ return (
+
+
+
+ {tableCells.map(({ cellName, center, noWrap, testId }) => {
+ const attributeValue = `${testId}-header`;
+ return (
+
+ {cellName === 'Quantity' ? (
+ {cellName}
+ ) : cellName === 'Plan' && filterOptions?.header ? (
+ filterOptions.header
+ ) : (
+ cellName
+ )}
+
+ );
+ })}
+
+
+
+ {shouldDisplayNoRegionSelectedMessage ? (
+
+ ) : (
+ renderPlanSelection()
+ )}
+
+
+ );
+};
diff --git a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx
index 7423c472b17..3980bee33e8 100644
--- a/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx
+++ b/packages/manager/src/features/Kubernetes/KubernetesPlansPanel/KubernetesPlansPanel.tsx
@@ -106,6 +106,7 @@ export const KubernetesPlansPanel = (props: Props) => {
isSelectedRegionEligibleForPlan={isSelectedRegionEligibleForPlan(
plan
)}
+ flow="kubernetes"
hasMajorityOfPlansDisabled={hasMajorityOfPlansDisabled}
hasSelectedRegion={hasSelectedRegion}
isAPLEnabled={isAPLEnabled}
@@ -121,6 +122,7 @@ export const KubernetesPlansPanel = (props: Props) => {
hasMajorityOfPlansDisabled={hasMajorityOfPlansDisabled}
onAdd={onAdd}
onSelect={onSelect}
+ planType={plan}
plans={plansForThisLinodeTypeClass}
selectedId={selectedId}
selectedRegionId={selectedRegionId}
diff --git a/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx b/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx
index 471b83ba3c8..18b14888836 100644
--- a/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx
+++ b/packages/manager/src/features/components/PlansPanel/PlanContainer.tsx
@@ -20,7 +20,7 @@ export interface PlanSelectionFilterOptionsTable {
planFilter?: (plan: PlanWithAvailability) => boolean;
}
-interface PlanSelectionDividers {
+export interface PlanSelectionDividers {
flag: boolean;
planType: LinodeTypeClass;
tables: PlanSelectionFilterOptionsTable[];
diff --git a/packages/manager/src/features/components/PlansPanel/PlanInformation.test.tsx b/packages/manager/src/features/components/PlansPanel/PlanInformation.test.tsx
index 37be697e66b..ed8357b59d8 100644
--- a/packages/manager/src/features/components/PlansPanel/PlanInformation.test.tsx
+++ b/packages/manager/src/features/components/PlansPanel/PlanInformation.test.tsx
@@ -11,6 +11,7 @@ import {
import type { PlanInformationProps } from './PlanInformation';
const mockProps: PlanInformationProps = {
+ flow: 'linode',
hasMajorityOfPlansDisabled: false,
hasSelectedRegion: true,
isAPLEnabled: true,
diff --git a/packages/manager/src/features/components/PlansPanel/PlanInformation.tsx b/packages/manager/src/features/components/PlansPanel/PlanInformation.tsx
index 7b4d9386cef..b49ccd659c6 100644
--- a/packages/manager/src/features/components/PlansPanel/PlanInformation.tsx
+++ b/packages/manager/src/features/components/PlansPanel/PlanInformation.tsx
@@ -29,6 +29,7 @@ interface ExtendedPlanType {
export interface PlanInformationProps extends ExtendedPlanType {
disabledClasses?: LinodeTypeClass[];
+ flow: 'kubernetes' | 'linode';
hasMajorityOfPlansDisabled: boolean;
hasSelectedRegion: boolean;
hideLimitedAvailabilityBanner?: boolean;
@@ -40,6 +41,7 @@ export interface PlanInformationProps extends ExtendedPlanType {
export const PlanInformation = (props: PlanInformationProps) => {
const {
disabledClasses,
+ flow,
hasMajorityOfPlansDisabled,
hasSelectedRegion,
hideLimitedAvailabilityBanner,
@@ -96,7 +98,7 @@ export const PlanInformation = (props: PlanInformationProps) => {
)}
- {showTransferBanner && transferBanner}
+ {showTransferBanner && flow === 'linode' && transferBanner}
{
plan
)}
disabledClasses={disabledClasses}
+ flow="linode"
hasMajorityOfPlansDisabled={hasMajorityOfPlansDisabled}
hasSelectedRegion={hasSelectedRegion}
planType={plan}
From 77b9661efa561058f065e3d22a893aae2d097599 Mon Sep 17 00:00:00 2001
From: Banks Nussman <115251059+bnussman-akamai@users.noreply.github.com>
Date: Wed, 22 Jan 2025 20:49:25 -0500
Subject: [PATCH 40/42] fix: [M3-9156] - Linode Config Dialog misrepresenting
primary interface (#11542)
* initial refacror
* more progress
* clean up
* add schema change
* fix bug
* more progress on clearable issue and clean up
* fix spelling
* sort props
* changeset
* fix typecheck
* comment more
* use getPrimaryInterfaceIndex for unrecommended config notice in subnet linode row - should work now...
* add some comments
* update cypress test to account for implicit primary VPC interfaces
* fix typo
* Apply suggestions from @dwiley-akamai
Thanks!
Co-authored-by: Dajahi Wiley <114682940+dwiley-akamai@users.noreply.github.com>
---------
Co-authored-by: Banks Nussman
Co-authored-by: Connie Liu
Co-authored-by: Dajahi Wiley <114682940+dwiley-akamai@users.noreply.github.com>
---
.../pr-11542-fixed-1737484177266.md | 5 +
.../e2e/core/vpc/vpc-details-page.spec.ts | 66 ++++++++++++-
.../LinodeConfigs/LinodeConfigDialog.tsx | 92 +++++++++----------
.../LinodeConfigs/utilities.test.ts | 36 ++++++++
.../LinodesDetail/LinodeConfigs/utilities.ts | 49 ++++++++++
packages/manager/src/features/VPCs/utils.ts | 18 +++-
packages/validation/src/linodes.schema.ts | 12 ++-
7 files changed, 225 insertions(+), 53 deletions(-)
create mode 100644 packages/manager/.changeset/pr-11542-fixed-1737484177266.md
create mode 100644 packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.test.ts
create mode 100644 packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.ts
diff --git a/packages/manager/.changeset/pr-11542-fixed-1737484177266.md b/packages/manager/.changeset/pr-11542-fixed-1737484177266.md
new file mode 100644
index 00000000000..c13ed7f81d8
--- /dev/null
+++ b/packages/manager/.changeset/pr-11542-fixed-1737484177266.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Fixed
+---
+
+Linode Config Dialog misrepresenting primary interface ([#11542](https://github.com/linode/manager/pull/11542))
diff --git a/packages/manager/cypress/e2e/core/vpc/vpc-details-page.spec.ts b/packages/manager/cypress/e2e/core/vpc/vpc-details-page.spec.ts
index f82c9d4650c..1ee95a8652c 100644
--- a/packages/manager/cypress/e2e/core/vpc/vpc-details-page.spec.ts
+++ b/packages/manager/cypress/e2e/core/vpc/vpc-details-page.spec.ts
@@ -16,6 +16,7 @@ import {
LinodeConfigInterfaceFactoryWithVPC,
subnetFactory,
vpcFactory,
+ LinodeConfigInterfaceFactory,
} from '@src/factories';
import { randomLabel, randomNumber, randomPhrase } from 'support/util/random';
import { chooseRegion } from 'support/util/regions';
@@ -333,6 +334,63 @@ describe('VPC details page', () => {
cy.findByTestId(WARNING_ICON_UNRECOMMENDED_CONFIG).should('not.exist');
});
+ /**
+ * - Confirms UI for Linode with a config with an implicit primary VPC interface (no notice)
+ */
+ it('does not display an unrecommended config notice for a Linode with an implicit primary VPC', () => {
+ const linodeRegion = chooseRegion({ capabilities: ['VPCs'] });
+
+ const mockInterfaceId = randomNumber();
+ const mockLinode = linodeFactory.build({
+ id: randomNumber(),
+ label: randomLabel(),
+ region: linodeRegion.id,
+ });
+
+ const mockSubnet = subnetFactory.build({
+ id: randomNumber(),
+ label: randomLabel(),
+ linodes: [
+ {
+ id: mockLinode.id,
+ interfaces: [{ id: mockInterfaceId, active: true }],
+ },
+ ],
+ ipv4: '10.0.0.0/24',
+ });
+
+ const mockVPC = vpcFactory.build({
+ id: randomNumber(),
+ label: randomLabel(),
+ region: linodeRegion.id,
+ subnets: [mockSubnet],
+ });
+
+ const mockInterface = LinodeConfigInterfaceFactoryWithVPC.build({
+ id: mockInterfaceId,
+ vpc_id: mockVPC.id,
+ subnet_id: mockSubnet.id,
+ primary: false,
+ active: true,
+ });
+
+ const mockLinodeConfig = linodeConfigFactory.build({
+ interfaces: [mockInterface],
+ });
+
+ mockGetVPC(mockVPC).as('getVPC');
+ mockGetSubnets(mockVPC.id, [mockSubnet]).as('getSubnets');
+ mockGetLinodeDetails(mockLinode.id, mockLinode).as('getLinode');
+ mockGetLinodeConfigs(mockLinode.id, [mockLinodeConfig]).as(
+ 'getLinodeConfigs'
+ );
+
+ cy.visitWithLogin(`/vpcs/${mockVPC.id}`);
+ cy.findByLabelText(`expand ${mockSubnet.label} row`).click();
+ cy.wait('@getLinodeConfigs');
+ cy.findByTestId(WARNING_ICON_UNRECOMMENDED_CONFIG).should('not.exist');
+ });
+
/**
* - Confirms UI for Linode with an unrecommended config (notice displayed)
*/
@@ -365,6 +423,12 @@ describe('VPC details page', () => {
subnets: [mockSubnet],
});
+ const mockPrimaryInterface = LinodeConfigInterfaceFactory.build({
+ primary: true,
+ active: false,
+ purpose: 'public',
+ });
+
const mockInterface = LinodeConfigInterfaceFactoryWithVPC.build({
id: mockInterfaceId,
vpc_id: mockVPC.id,
@@ -374,7 +438,7 @@ describe('VPC details page', () => {
});
const mockLinodeConfig = linodeConfigFactory.build({
- interfaces: [mockInterface],
+ interfaces: [mockInterface, mockPrimaryInterface],
});
mockGetVPC(mockVPC).as('getVPC');
diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.tsx
index ea02cd184d7..74c88480a6b 100644
--- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.tsx
+++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/LinodeConfigDialog.tsx
@@ -65,14 +65,15 @@ import {
StyledFormGroup,
StyledRadioGroup,
} from './LinodeConfigDialog.styles';
+import { getPrimaryInterfaceIndex } from './utilities';
import type { ExtendedInterface } from '../LinodeSettings/InterfaceSelect';
import type {
+ APIError,
Config,
Interface,
LinodeConfigCreationData,
-} from '@linode/api-v4/lib/linodes';
-import type { APIError } from '@linode/api-v4/lib/types';
+} from '@linode/api-v4';
import type { DevicesAsStrings } from 'src/utilities/createDevicesFromStrings';
import type { ExtendedIP } from 'src/utilities/ipUtils';
@@ -204,10 +205,7 @@ const interfacesToState = (interfaces?: Interface[]) => {
return padInterfaceList(interfacesPayload);
};
-const interfacesToPayload = (
- interfaces?: ExtendedInterface[],
- primaryInterfaceIndex?: number
-) => {
+const interfacesToPayload = (interfaces?: ExtendedInterface[]) => {
if (!interfaces || interfaces.length === 0) {
return [];
}
@@ -230,12 +228,6 @@ const interfacesToPayload = (
return [];
}
- if (primaryInterfaceIndex !== undefined) {
- interfaces.forEach(
- (iface, i) => (iface.primary = i === primaryInterfaceIndex)
- );
- }
-
return filteredInterfaces as Interface[];
};
@@ -287,11 +279,6 @@ export const LinodeConfigDialog = (props: Props) => {
const [useCustomRoot, setUseCustomRoot] = React.useState(false);
- const [
- primaryInterfaceIndex,
- setPrimaryInterfaceIndex,
- ] = React.useState(0);
-
const regionHasVLANS = regions.some(
(thisRegion) =>
thisRegion.id === linode?.region &&
@@ -337,7 +324,7 @@ export const LinodeConfigDialog = (props: Props) => {
devices: createDevicesFromStrings(devices),
helpers,
initrd: initrd !== '' ? initrd : null,
- interfaces: interfacesToPayload(interfaces, primaryInterfaceIndex),
+ interfaces: interfacesToPayload(interfaces),
kernel,
label,
/** if the user did not toggle the limit radio button, send a value of 0 */
@@ -502,14 +489,6 @@ export const LinodeConfigDialog = (props: Props) => {
)
);
- const indexOfExistingPrimaryInterface = config.interfaces.findIndex(
- (_interface) => _interface.primary === true
- );
-
- if (indexOfExistingPrimaryInterface !== -1) {
- setPrimaryInterfaceIndex(indexOfExistingPrimaryInterface);
- }
-
resetForm({
values: {
comments: config.comments,
@@ -533,7 +512,6 @@ export const LinodeConfigDialog = (props: Props) => {
resetForm({ values: defaultFieldsValues });
setUseCustomRoot(false);
setDeviceCounter(deviceCounterDefault);
- setPrimaryInterfaceIndex(0);
}
}
}, [open, config, initrdFromConfig, resetForm, queryClient]);
@@ -614,20 +592,20 @@ export const LinodeConfigDialog = (props: Props) => {
value: null,
});
- const getPrimaryInterfaceOptions = (interfaces: ExtendedInterface[]) => {
- return interfaces.map((_interface, idx) => {
- return {
- label: `eth${idx}`,
- value: idx,
- };
- });
- };
+ const interfacesWithoutPlaceholderInterfaces = values.interfaces.filter(
+ (i) => i.purpose !== 'none'
+ ) as Interface[];
- const primaryInterfaceOptions = getPrimaryInterfaceOptions(values.interfaces);
+ const primaryInterfaceOptions = interfacesWithoutPlaceholderInterfaces.map(
+ (networkInterface, idx) => ({
+ label: `eth${idx}`,
+ value: idx,
+ })
+ );
- const handlePrimaryInterfaceChange = (selectedValue: number) => {
- setPrimaryInterfaceIndex(selectedValue);
- };
+ const primaryInterfaceIndex = getPrimaryInterfaceIndex(
+ interfacesWithoutPlaceholderInterfaces
+ );
/**
* Form change handlers
@@ -992,19 +970,36 @@ export const LinodeConfigDialog = (props: Props) => {
)}
<>
- option.value === value.value
- }
- onChange={(_, selected) =>
- handlePrimaryInterfaceChange(selected?.value)
+ disableClearable={interfacesWithoutPlaceholderInterfaces.some(
+ (i) => i.purpose === 'public' || i.purpose === 'vpc'
+ )}
+ onChange={(_, selected) => {
+ const updatedInterfaces = [...values.interfaces];
+
+ for (let i = 0; i < updatedInterfaces.length; i++) {
+ if (selected && selected.value === i) {
+ updatedInterfaces[i].primary = true;
+ } else {
+ updatedInterfaces[i].primary = false;
+ }
+ }
+
+ formik.setValues({
+ ...values,
+ interfaces: updatedInterfaces,
+ });
+ }}
+ value={
+ primaryInterfaceIndex !== null
+ ? primaryInterfaceOptions[primaryInterfaceIndex]
+ : null
}
autoHighlight
data-testid="primary-interface-dropdown"
- disableClearable
disabled={isReadOnly}
label="Primary Interface (Default Route)"
- options={getPrimaryInterfaceOptions(values.interfaces)}
- value={primaryInterfaceOptions[primaryInterfaceIndex]}
+ options={primaryInterfaceOptions}
+ placeholder="None"
/>
{
@@ -1255,6 +1250,7 @@ export const unrecommendedConfigNoticeSelector = ({
// Edge case: users w/ ability to have multiple VPC interfaces. Scenario 1 & 2 notices not helpful if that's done
const primaryInterfaceIsVPC =
+ primaryInterfaceIndex !== null &&
values.interfaces[primaryInterfaceIndex].purpose === 'vpc';
/*
diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.test.ts b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.test.ts
new file mode 100644
index 00000000000..1f5f7c47352
--- /dev/null
+++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.test.ts
@@ -0,0 +1,36 @@
+import { LinodeConfigInterfaceFactory } from 'src/factories';
+
+import { getPrimaryInterfaceIndex } from './utilities';
+
+describe('getPrimaryInterfaceIndex', () => {
+ it('returns null if there are no interfaces', () => {
+ expect(getPrimaryInterfaceIndex([])).toBeNull();
+ });
+
+ it('returns the primary interface when one is designated as primary', () => {
+ const interfaces = [
+ LinodeConfigInterfaceFactory.build({ primary: false }),
+ LinodeConfigInterfaceFactory.build({ primary: true }),
+ LinodeConfigInterfaceFactory.build({ primary: false }),
+ ];
+
+ expect(getPrimaryInterfaceIndex(interfaces)).toBe(1);
+ });
+
+ it('returns the index of the first non-VLAN interface if there is no interface designated as primary', () => {
+ const interfaces = [
+ LinodeConfigInterfaceFactory.build({ primary: false, purpose: 'vlan' }),
+ LinodeConfigInterfaceFactory.build({ primary: false, purpose: 'public' }),
+ ];
+
+ expect(getPrimaryInterfaceIndex(interfaces)).toBe(1);
+ });
+
+ it('returns null when there is no primary interface', () => {
+ const interfaces = [
+ LinodeConfigInterfaceFactory.build({ primary: false, purpose: 'vlan' }),
+ ];
+
+ expect(getPrimaryInterfaceIndex(interfaces)).toBe(null);
+ });
+});
diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.ts b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.ts
new file mode 100644
index 00000000000..2b12640e578
--- /dev/null
+++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeConfigs/utilities.ts
@@ -0,0 +1,49 @@
+import { isEmpty } from '@linode/api-v4';
+
+import type { Interface } from '@linode/api-v4';
+
+/**
+ * Gets the index of the primary Linode interface
+ *
+ * The function does more than just look for `primary: true`. It will also return the index
+ * of the implicit primary interface. (The API does not enforce that a Linode config always
+ * has an interface that is marked as primary)
+ *
+ * This is the general logic we follow in this function:
+ * - If an interface is primary we know that's the primary
+ * - If the API response returns an empty array "interfaces": [], under the hood, a public interface eth0 is implicit. This interface will be primary.
+ * - If a config has interfaces, but none of them are marked primary: true, then the first interface in the list thatโs not a VLAN will be the primary interface
+ *
+ * @returns the index of the primary interface or `null` if there is not a primary interface
+ */
+export const getPrimaryInterfaceIndex = (interfaces: Interface[]) => {
+ const indexOfPrimaryInterface = interfaces.findIndex((i) => i.primary);
+
+ // If an interface has `primary: true` we know thats the primary so just return it.
+ if (indexOfPrimaryInterface !== -1) {
+ return indexOfPrimaryInterface;
+ }
+
+ // If the API response returns an empty array "interfaces": [] the Linode will by default have a public interface,
+ // and it will be eth0 on the Linode. This interface will be primary.
+ // This case isn't really nessesary because this form is built so that the interfaces state will be
+ // populated even if the API returns an empty interfaces array, but I'm including it for completeness.
+ if (isEmpty(interfaces)) {
+ return null;
+ }
+
+ // If a config has interfaces but none of them are marked as primary,
+ // then the first interface in the list thatโs not a VLAN will shown as the primary interface.
+ const inherentIndexOfPrimaryInterface = interfaces.findIndex(
+ (i) => i.purpose !== 'vlan'
+ );
+
+ if (inherentIndexOfPrimaryInterface !== -1) {
+ // If we're able to find the inherent primary interface, just return it.
+ return inherentIndexOfPrimaryInterface;
+ }
+
+ // If we haven't been able to find the primary interface by this point, the Linode doesn't have one.
+ // As an example, this is the case when a Linode only has a VLAN interface.
+ return null;
+};
diff --git a/packages/manager/src/features/VPCs/utils.ts b/packages/manager/src/features/VPCs/utils.ts
index 3c622b585c3..ae27bd54f9c 100644
--- a/packages/manager/src/features/VPCs/utils.ts
+++ b/packages/manager/src/features/VPCs/utils.ts
@@ -1,3 +1,5 @@
+import { getPrimaryInterfaceIndex } from '../Linodes/LinodesDetail/LinodeConfigs/utilities';
+
import type { Config, Subnet } from '@linode/api-v4';
export const getUniqueLinodesFromSubnets = (subnets: Subnet[]) => {
@@ -35,8 +37,9 @@ export const hasUnrecommendedConfiguration = (
const configInterfaces = config.interfaces;
/*
- If there is a VPC interface marked as active but not primary, we want to display a
- message re: it not being a recommended configuration.
+ If there is a VPC interface marked as active but not primary, we then check if it
+ is implicitly the primary interface. If not, then we want to display a message
+ re: it not being a recommended configuration.
Rationale: when the VPC interface is not the primary interface, it can communicate
to other VMs within the same subnet, but not to VMs in a different subnet
@@ -46,12 +49,21 @@ export const hasUnrecommendedConfiguration = (
if (
configInterfaces.some((_interface) => _interface.subnet_id === subnetId)
) {
- return configInterfaces.some(
+ const nonExplicitPrimaryVPCInterfaceIndex = configInterfaces.findIndex(
(_interface) =>
_interface.active &&
_interface.purpose === 'vpc' &&
!_interface.primary
);
+
+ const primaryInterfaceIndex = getPrimaryInterfaceIndex(configInterfaces);
+
+ return (
+ // if there exists an active VPC interface not explicitly marked as primary,
+ nonExplicitPrimaryVPCInterfaceIndex !== -1 &&
+ // check if it actually is the (implicit) primary interface
+ primaryInterfaceIndex !== nonExplicitPrimaryVPCInterfaceIndex
+ );
}
}
diff --git a/packages/validation/src/linodes.schema.ts b/packages/validation/src/linodes.schema.ts
index de1f1d16d31..cf0ef8883b9 100644
--- a/packages/validation/src/linodes.schema.ts
+++ b/packages/validation/src/linodes.schema.ts
@@ -181,7 +181,17 @@ export const LinodeInterfaceSchema = object().shape({
}),
}),
}),
- primary: boolean().notRequired(),
+ primary: boolean()
+ .test(
+ 'cant-use-with-vlan',
+ "VLAN interfaces can't be the primary interface",
+ (value, context) => {
+ const isVLANandIsSetToPrimary =
+ value && context.parent.purpose === 'vlan';
+ return !isVLANandIsSetToPrimary;
+ }
+ )
+ .notRequired(),
subnet_id: number().when('purpose', {
is: 'vpc',
then: (schema) =>
From 3964f7199e96fc8d09e9a7d34dd5b1235a8b8233 Mon Sep 17 00:00:00 2001
From: Alban Bailly
Date: Wed, 22 Jan 2025 21:28:30 -0500
Subject: [PATCH 41/42] Cloud Manager v1.135, API v4 v0.133.0, Validation
v0.59.0, and UI v0.6.0
---
...r-11429-upcoming-features-1734442308306.md | 5 --
.../pr-11487-tech-stories-1736286017541.md | 5 --
.../pr-11493-added-1736811098382.md | 5 --
.../pr-11511-added-1736761634591.md | 5 --
.../pr-11515-changed-1736786729001.md | 5 --
packages/api-v4/CHANGELOG.md | 20 ++++++
packages/api-v4/package.json | 2 +-
.../pr-11402-added-1736419050008.md | 5 --
...r-11402-upcoming-features-1733927050433.md | 5 --
...r-11429-upcoming-features-1734442339368.md | 5 --
.../pr-11447-tech-stories-1734960446943.md | 5 --
.../pr-11470-tech-stories-1735907007536.md | 5 --
...r-11477-upcoming-features-1736156265225.md | 5 --
.../pr-11480-changed-1736262405005.md | 5 --
.../pr-11481-changed-1736250933443.md | 5 --
.../pr-11483-tech-stories-1736333190430.md | 5 --
.../pr-11484-tests-1736279319564.md | 5 --
.../pr-11487-tech-stories-1736286047440.md | 5 --
.../pr-11488-tech-stories-1736320081038.md | 5 --
.../pr-11489-tests-1736348080190.md | 5 --
.../pr-11493-upcoming-1736811045709.md | 5 --
.../pr-11495-changed-1736782822155.md | 5 --
.../pr-11501-tests-1736539585978.md | 5 --
.../pr-11505-tech-stories-1736510197103.md | 5 --
...r-11506-upcoming-features-1736518383049.md | 5 --
.../pr-11507-fixed-1736533913571.md | 5 --
.../pr-11508-tests-1736539546177.md | 5 --
.../pr-11509-tech-stories-1736971677397.md | 5 --
.../pr-11510-tech-stories-1736865158796.md | 5 --
.../pr-11511-added-1736761595455.md | 5 --
.../pr-11513-changed-1736782843874.md | 5 --
.../pr-11514-tech-stories-1736784891293.md | 5 --
...r-11515-upcoming-features-1736787005749.md | 5 --
...r-11518-upcoming-features-1736876400893.md | 5 --
.../pr-11521-changed-1736978874581.md | 5 --
.../pr-11522-tests-1737048531721.md | 5 --
...r-11524-upcoming-features-1737011022935.md | 5 --
.../pr-11526-fixed-1737034837256.md | 5 --
.../pr-11529-tests-1737049089021.md | 5 --
.../pr-11531-tech-stories-1737051309899.md | 5 --
.../pr-11536-changed-1737152603420.md | 5 --
...r-11539-upcoming-features-1737537564184.md | 5 --
.../pr-11542-fixed-1737484177266.md | 5 --
.../pr-11544-added-1737522840655.md | 5 --
packages/manager/CHANGELOG.md | 62 +++++++++++++++++++
packages/manager/package.json | 2 +-
.../pr-11480-changed-1736262442937.md | 5 --
.../pr-11480-removed-1736802565293.md | 5 --
packages/ui/CHANGELOG.md | 11 ++++
packages/ui/package.json | 2 +-
.../pr-11487-tech-stories-1736286059147.md | 5 --
.../pr-11515-changed-1736786649145.md | 5 --
packages/validation/CHANGELOG.md | 12 ++++
packages/validation/package.json | 2 +-
54 files changed, 109 insertions(+), 234 deletions(-)
delete mode 100644 packages/api-v4/.changeset/pr-11429-upcoming-features-1734442308306.md
delete mode 100644 packages/api-v4/.changeset/pr-11487-tech-stories-1736286017541.md
delete mode 100644 packages/api-v4/.changeset/pr-11493-added-1736811098382.md
delete mode 100644 packages/api-v4/.changeset/pr-11511-added-1736761634591.md
delete mode 100644 packages/api-v4/.changeset/pr-11515-changed-1736786729001.md
delete mode 100644 packages/manager/.changeset/pr-11402-added-1736419050008.md
delete mode 100644 packages/manager/.changeset/pr-11402-upcoming-features-1733927050433.md
delete mode 100644 packages/manager/.changeset/pr-11429-upcoming-features-1734442339368.md
delete mode 100644 packages/manager/.changeset/pr-11447-tech-stories-1734960446943.md
delete mode 100644 packages/manager/.changeset/pr-11470-tech-stories-1735907007536.md
delete mode 100644 packages/manager/.changeset/pr-11477-upcoming-features-1736156265225.md
delete mode 100644 packages/manager/.changeset/pr-11480-changed-1736262405005.md
delete mode 100644 packages/manager/.changeset/pr-11481-changed-1736250933443.md
delete mode 100644 packages/manager/.changeset/pr-11483-tech-stories-1736333190430.md
delete mode 100644 packages/manager/.changeset/pr-11484-tests-1736279319564.md
delete mode 100644 packages/manager/.changeset/pr-11487-tech-stories-1736286047440.md
delete mode 100644 packages/manager/.changeset/pr-11488-tech-stories-1736320081038.md
delete mode 100644 packages/manager/.changeset/pr-11489-tests-1736348080190.md
delete mode 100644 packages/manager/.changeset/pr-11493-upcoming-1736811045709.md
delete mode 100644 packages/manager/.changeset/pr-11495-changed-1736782822155.md
delete mode 100644 packages/manager/.changeset/pr-11501-tests-1736539585978.md
delete mode 100644 packages/manager/.changeset/pr-11505-tech-stories-1736510197103.md
delete mode 100644 packages/manager/.changeset/pr-11506-upcoming-features-1736518383049.md
delete mode 100644 packages/manager/.changeset/pr-11507-fixed-1736533913571.md
delete mode 100644 packages/manager/.changeset/pr-11508-tests-1736539546177.md
delete mode 100644 packages/manager/.changeset/pr-11509-tech-stories-1736971677397.md
delete mode 100644 packages/manager/.changeset/pr-11510-tech-stories-1736865158796.md
delete mode 100644 packages/manager/.changeset/pr-11511-added-1736761595455.md
delete mode 100644 packages/manager/.changeset/pr-11513-changed-1736782843874.md
delete mode 100644 packages/manager/.changeset/pr-11514-tech-stories-1736784891293.md
delete mode 100644 packages/manager/.changeset/pr-11515-upcoming-features-1736787005749.md
delete mode 100644 packages/manager/.changeset/pr-11518-upcoming-features-1736876400893.md
delete mode 100644 packages/manager/.changeset/pr-11521-changed-1736978874581.md
delete mode 100644 packages/manager/.changeset/pr-11522-tests-1737048531721.md
delete mode 100644 packages/manager/.changeset/pr-11524-upcoming-features-1737011022935.md
delete mode 100644 packages/manager/.changeset/pr-11526-fixed-1737034837256.md
delete mode 100644 packages/manager/.changeset/pr-11529-tests-1737049089021.md
delete mode 100644 packages/manager/.changeset/pr-11531-tech-stories-1737051309899.md
delete mode 100644 packages/manager/.changeset/pr-11536-changed-1737152603420.md
delete mode 100644 packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md
delete mode 100644 packages/manager/.changeset/pr-11542-fixed-1737484177266.md
delete mode 100644 packages/manager/.changeset/pr-11544-added-1737522840655.md
delete mode 100644 packages/ui/.changeset/pr-11480-changed-1736262442937.md
delete mode 100644 packages/ui/.changeset/pr-11480-removed-1736802565293.md
delete mode 100644 packages/validation/.changeset/pr-11487-tech-stories-1736286059147.md
delete mode 100644 packages/validation/.changeset/pr-11515-changed-1736786649145.md
diff --git a/packages/api-v4/.changeset/pr-11429-upcoming-features-1734442308306.md b/packages/api-v4/.changeset/pr-11429-upcoming-features-1734442308306.md
deleted file mode 100644
index 239fe403802..00000000000
--- a/packages/api-v4/.changeset/pr-11429-upcoming-features-1734442308306.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/api-v4": Upcoming Features
----
-
-update types for iam and resources api ([#11429](https://github.com/linode/manager/pull/11429))
diff --git a/packages/api-v4/.changeset/pr-11487-tech-stories-1736286017541.md b/packages/api-v4/.changeset/pr-11487-tech-stories-1736286017541.md
deleted file mode 100644
index b27c1d34f8a..00000000000
--- a/packages/api-v4/.changeset/pr-11487-tech-stories-1736286017541.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/api-v4": Tech Stories
----
-
-Update `tsconfig.json` to use `bundler` moduleResolution ([#11487](https://github.com/linode/manager/pull/11487))
diff --git a/packages/api-v4/.changeset/pr-11493-added-1736811098382.md b/packages/api-v4/.changeset/pr-11493-added-1736811098382.md
deleted file mode 100644
index 6046d0b39b5..00000000000
--- a/packages/api-v4/.changeset/pr-11493-added-1736811098382.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/api-v4": Added
----
-
-Types for Quotas endpoints ([#11493](https://github.com/linode/manager/pull/11493))
diff --git a/packages/api-v4/.changeset/pr-11511-added-1736761634591.md b/packages/api-v4/.changeset/pr-11511-added-1736761634591.md
deleted file mode 100644
index 01fa191f583..00000000000
--- a/packages/api-v4/.changeset/pr-11511-added-1736761634591.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/api-v4": Added
----
-
-Notification Channel related types to cloudpulse/alerts.ts ([#11511](https://github.com/linode/manager/pull/11511))
diff --git a/packages/api-v4/.changeset/pr-11515-changed-1736786729001.md b/packages/api-v4/.changeset/pr-11515-changed-1736786729001.md
deleted file mode 100644
index e1e84cc7d1a..00000000000
--- a/packages/api-v4/.changeset/pr-11515-changed-1736786729001.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/api-v4": Changed
----
-
-Allow `cipher_suite` to be `none` in `NodeBalancerConfig` and `CreateNodeBalancerConfig` ([#11515](https://github.com/linode/manager/pull/11515))
diff --git a/packages/api-v4/CHANGELOG.md b/packages/api-v4/CHANGELOG.md
index 2094dabd71e..ad483030435 100644
--- a/packages/api-v4/CHANGELOG.md
+++ b/packages/api-v4/CHANGELOG.md
@@ -1,3 +1,23 @@
+## [2025-01-28] - v0.133.0
+
+
+### Added:
+
+- Types for Quotas endpoints ([#11493](https://github.com/linode/manager/pull/11493))
+- Notification Channel related types to cloudpulse/alerts.ts ([#11511](https://github.com/linode/manager/pull/11511))
+
+### Changed:
+
+- Allow `cipher_suite` to be `none` in `NodeBalancerConfig` and `CreateNodeBalancerConfig` ([#11515](https://github.com/linode/manager/pull/11515))
+
+### Tech Stories:
+
+- Update `tsconfig.json` to use `bundler` moduleResolution ([#11487](https://github.com/linode/manager/pull/11487))
+
+### Upcoming Features:
+
+- update types for IAM and resources api ([#11429](https://github.com/linode/manager/pull/11429))
+
## [2025-01-14] - v0.132.0
### Added:
diff --git a/packages/api-v4/package.json b/packages/api-v4/package.json
index ccb47929f77..9be35fb4b2e 100644
--- a/packages/api-v4/package.json
+++ b/packages/api-v4/package.json
@@ -1,6 +1,6 @@
{
"name": "@linode/api-v4",
- "version": "0.132.0",
+ "version": "0.133.0",
"homepage": "https://github.com/linode/manager/tree/develop/packages/api-v4",
"bugs": {
"url": "https://github.com/linode/manager/issues"
diff --git a/packages/manager/.changeset/pr-11402-added-1736419050008.md b/packages/manager/.changeset/pr-11402-added-1736419050008.md
deleted file mode 100644
index 966a79ca909..00000000000
--- a/packages/manager/.changeset/pr-11402-added-1736419050008.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Added
----
-
-useCreateUserMutation for adding new users ([#11402](https://github.com/linode/manager/pull/11402))
diff --git a/packages/manager/.changeset/pr-11402-upcoming-features-1733927050433.md b/packages/manager/.changeset/pr-11402-upcoming-features-1733927050433.md
deleted file mode 100644
index add377adaf0..00000000000
--- a/packages/manager/.changeset/pr-11402-upcoming-features-1733927050433.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-proxy users table, removing users, adding users ([#11402](https://github.com/linode/manager/pull/11402))
diff --git a/packages/manager/.changeset/pr-11429-upcoming-features-1734442339368.md b/packages/manager/.changeset/pr-11429-upcoming-features-1734442339368.md
deleted file mode 100644
index 4ae5c5df004..00000000000
--- a/packages/manager/.changeset/pr-11429-upcoming-features-1734442339368.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-add new entities component for iam ([#11429](https://github.com/linode/manager/pull/11429))
diff --git a/packages/manager/.changeset/pr-11447-tech-stories-1734960446943.md b/packages/manager/.changeset/pr-11447-tech-stories-1734960446943.md
deleted file mode 100644
index 2480725bedc..00000000000
--- a/packages/manager/.changeset/pr-11447-tech-stories-1734960446943.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@linode/manager': Tech Stories
----
-
-Refactor and convert DomainRecords to functional component ([#11447](https://github.com/linode/manager/pull/11447))
diff --git a/packages/manager/.changeset/pr-11470-tech-stories-1735907007536.md b/packages/manager/.changeset/pr-11470-tech-stories-1735907007536.md
deleted file mode 100644
index d34523cf58d..00000000000
--- a/packages/manager/.changeset/pr-11470-tech-stories-1735907007536.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Replace EnhancedSelect with Autocomplete component in the Help feature ([#11470](https://github.com/linode/manager/pull/11470))
diff --git a/packages/manager/.changeset/pr-11477-upcoming-features-1736156265225.md b/packages/manager/.changeset/pr-11477-upcoming-features-1736156265225.md
deleted file mode 100644
index 4a8a78e1105..00000000000
--- a/packages/manager/.changeset/pr-11477-upcoming-features-1736156265225.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-Add Alert Details Criteria section in Cloud Pulse Alert Details page ([#11477](https://github.com/linode/manager/pull/11477))
diff --git a/packages/manager/.changeset/pr-11480-changed-1736262405005.md b/packages/manager/.changeset/pr-11480-changed-1736262405005.md
deleted file mode 100644
index fdd4f2cc995..00000000000
--- a/packages/manager/.changeset/pr-11480-changed-1736262405005.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Changed
----
-
-Improved backups banner styles ([#11480](https://github.com/linode/manager/pull/11480))
diff --git a/packages/manager/.changeset/pr-11481-changed-1736250933443.md b/packages/manager/.changeset/pr-11481-changed-1736250933443.md
deleted file mode 100644
index 9c13c4f4e4c..00000000000
--- a/packages/manager/.changeset/pr-11481-changed-1736250933443.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Changed
----
-
-Database Resize: Disable plans when the usable storage equals the used storage of the database cluster ([#11481](https://github.com/linode/manager/pull/11481))
diff --git a/packages/manager/.changeset/pr-11483-tech-stories-1736333190430.md b/packages/manager/.changeset/pr-11483-tech-stories-1736333190430.md
deleted file mode 100644
index bca4473cd5e..00000000000
--- a/packages/manager/.changeset/pr-11483-tech-stories-1736333190430.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Replace ramda's `splitAt` with custom utility ([#11483](https://github.com/linode/manager/pull/11483))
diff --git a/packages/manager/.changeset/pr-11484-tests-1736279319564.md b/packages/manager/.changeset/pr-11484-tests-1736279319564.md
deleted file mode 100644
index 32bd8c34592..00000000000
--- a/packages/manager/.changeset/pr-11484-tests-1736279319564.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tests
----
-
-Improve organization of Object Storage and Object Storage Multicluster tests ([#11484](https://github.com/linode/manager/pull/11484))
diff --git a/packages/manager/.changeset/pr-11487-tech-stories-1736286047440.md b/packages/manager/.changeset/pr-11487-tech-stories-1736286047440.md
deleted file mode 100644
index 1bb16c848e2..00000000000
--- a/packages/manager/.changeset/pr-11487-tech-stories-1736286047440.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Update `tsconfig.json` to use `bundler` moduleResolution ([#11487](https://github.com/linode/manager/pull/11487))
diff --git a/packages/manager/.changeset/pr-11488-tech-stories-1736320081038.md b/packages/manager/.changeset/pr-11488-tech-stories-1736320081038.md
deleted file mode 100644
index b99c76299b8..00000000000
--- a/packages/manager/.changeset/pr-11488-tech-stories-1736320081038.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Replace one-off hardcoded color values with color tokens pt5 ([#11488](https://github.com/linode/manager/pull/11488))
diff --git a/packages/manager/.changeset/pr-11489-tests-1736348080190.md b/packages/manager/.changeset/pr-11489-tests-1736348080190.md
deleted file mode 100644
index 3f5de239a65..00000000000
--- a/packages/manager/.changeset/pr-11489-tests-1736348080190.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tests
----
-
-Fix test notification formatting and output issues ([#11489](https://github.com/linode/manager/pull/11489))
diff --git a/packages/manager/.changeset/pr-11493-upcoming-1736811045709.md b/packages/manager/.changeset/pr-11493-upcoming-1736811045709.md
deleted file mode 100644
index 9ecac06aef0..00000000000
--- a/packages/manager/.changeset/pr-11493-upcoming-1736811045709.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming
----
-
-Quotas feature flag, queries, and MSW CRUD preset support ([#11493](https://github.com/linode/manager/pull/11493))
diff --git a/packages/manager/.changeset/pr-11495-changed-1736782822155.md b/packages/manager/.changeset/pr-11495-changed-1736782822155.md
deleted file mode 100644
index 6c6e3df22ac..00000000000
--- a/packages/manager/.changeset/pr-11495-changed-1736782822155.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Changed
----
-
-add `Asia/Calcutta` zonename in `timezones.ts`, add `disabledTimeZone` property in `DateTimeRangePicker`, add `minDate` property to `DateTimePicker` ([#11495](https://github.com/linode/manager/pull/11495))
diff --git a/packages/manager/.changeset/pr-11501-tests-1736539585978.md b/packages/manager/.changeset/pr-11501-tests-1736539585978.md
deleted file mode 100644
index bf7bf3b6e1b..00000000000
--- a/packages/manager/.changeset/pr-11501-tests-1736539585978.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tests
----
-
-Remove cypress deprecated helper.ts functions ([#11501](https://github.com/linode/manager/pull/11501))
diff --git a/packages/manager/.changeset/pr-11505-tech-stories-1736510197103.md b/packages/manager/.changeset/pr-11505-tech-stories-1736510197103.md
deleted file mode 100644
index a94cf71cac3..00000000000
--- a/packages/manager/.changeset/pr-11505-tech-stories-1736510197103.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@linode/manager': Tech Stories
----
-
-Remove ramda from `CreateDomain.tsx` ([#11505](https://github.com/linode/manager/pull/11505))
diff --git a/packages/manager/.changeset/pr-11506-upcoming-features-1736518383049.md b/packages/manager/.changeset/pr-11506-upcoming-features-1736518383049.md
deleted file mode 100644
index 4e6c1c43f5c..00000000000
--- a/packages/manager/.changeset/pr-11506-upcoming-features-1736518383049.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-Update Metrics api request and JWE Token api request in CloudPulse ([#11506](https://github.com/linode/manager/pull/11506))
diff --git a/packages/manager/.changeset/pr-11507-fixed-1736533913571.md b/packages/manager/.changeset/pr-11507-fixed-1736533913571.md
deleted file mode 100644
index baab0a1e6c9..00000000000
--- a/packages/manager/.changeset/pr-11507-fixed-1736533913571.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Fixed
----
-
-Spacing for LKE cluster tags at desktop screen sizes ([#11507](https://github.com/linode/manager/pull/11507))
diff --git a/packages/manager/.changeset/pr-11508-tests-1736539546177.md b/packages/manager/.changeset/pr-11508-tests-1736539546177.md
deleted file mode 100644
index 5fc77bd8126..00000000000
--- a/packages/manager/.changeset/pr-11508-tests-1736539546177.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tests
----
-
-Add component tests for PasswordInput ([#11508](https://github.com/linode/manager/pull/11508))
diff --git a/packages/manager/.changeset/pr-11509-tech-stories-1736971677397.md b/packages/manager/.changeset/pr-11509-tech-stories-1736971677397.md
deleted file mode 100644
index 3b7677e5774..00000000000
--- a/packages/manager/.changeset/pr-11509-tech-stories-1736971677397.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Replace remaining react-select instances & types in Linodes Feature ([#11509](https://github.com/linode/manager/pull/11509))
diff --git a/packages/manager/.changeset/pr-11510-tech-stories-1736865158796.md b/packages/manager/.changeset/pr-11510-tech-stories-1736865158796.md
deleted file mode 100644
index 4fcf12b67a6..00000000000
--- a/packages/manager/.changeset/pr-11510-tech-stories-1736865158796.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Dependabot security fixes ([#11510](https://github.com/linode/manager/pull/11510))
diff --git a/packages/manager/.changeset/pr-11511-added-1736761595455.md b/packages/manager/.changeset/pr-11511-added-1736761595455.md
deleted file mode 100644
index 0b374f27f76..00000000000
--- a/packages/manager/.changeset/pr-11511-added-1736761595455.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Added
----
-
-AddNotificationChannel component with Unit tests with necessary changes for constants, CreateAlertDefinition and other components. ([#11511](https://github.com/linode/manager/pull/11511))
diff --git a/packages/manager/.changeset/pr-11513-changed-1736782843874.md b/packages/manager/.changeset/pr-11513-changed-1736782843874.md
deleted file mode 100644
index 86cd58ef5a9..00000000000
--- a/packages/manager/.changeset/pr-11513-changed-1736782843874.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Changed
----
-
-Tech doc link for Bucket Rate Limits have changed ([#11513](https://github.com/linode/manager/pull/11513))
diff --git a/packages/manager/.changeset/pr-11514-tech-stories-1736784891293.md b/packages/manager/.changeset/pr-11514-tech-stories-1736784891293.md
deleted file mode 100644
index 57a2154c5da..00000000000
--- a/packages/manager/.changeset/pr-11514-tech-stories-1736784891293.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Remove ramda from `DomainRecords` pt1 ([#11514](https://github.com/linode/manager/pull/11514))
diff --git a/packages/manager/.changeset/pr-11515-upcoming-features-1736787005749.md b/packages/manager/.changeset/pr-11515-upcoming-features-1736787005749.md
deleted file mode 100644
index 4372f5643db..00000000000
--- a/packages/manager/.changeset/pr-11515-upcoming-features-1736787005749.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-Improve UDP NodeBalancer support ([#11515](https://github.com/linode/manager/pull/11515))
diff --git a/packages/manager/.changeset/pr-11518-upcoming-features-1736876400893.md b/packages/manager/.changeset/pr-11518-upcoming-features-1736876400893.md
deleted file mode 100644
index abb2ab0f026..00000000000
--- a/packages/manager/.changeset/pr-11518-upcoming-features-1736876400893.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-Display cluster provisioning after an LKE-E cluster is created ([#11518](https://github.com/linode/manager/pull/11518))
diff --git a/packages/manager/.changeset/pr-11521-changed-1736978874581.md b/packages/manager/.changeset/pr-11521-changed-1736978874581.md
deleted file mode 100644
index 2acbd957cfa..00000000000
--- a/packages/manager/.changeset/pr-11521-changed-1736978874581.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Changed
----
-
-Search v2 not equal syntax ([#11521](https://github.com/linode/manager/pull/11521))
diff --git a/packages/manager/.changeset/pr-11522-tests-1737048531721.md b/packages/manager/.changeset/pr-11522-tests-1737048531721.md
deleted file mode 100644
index 1399ee99153..00000000000
--- a/packages/manager/.changeset/pr-11522-tests-1737048531721.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tests
----
-
-Add `CY_TEST_RESET_PREFERENCES` env var to reset user preferences at test run start ([#11522](https://github.com/linode/manager/pull/11522))
diff --git a/packages/manager/.changeset/pr-11524-upcoming-features-1737011022935.md b/packages/manager/.changeset/pr-11524-upcoming-features-1737011022935.md
deleted file mode 100644
index c3517211a6f..00000000000
--- a/packages/manager/.changeset/pr-11524-upcoming-features-1737011022935.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-Add scaffolding for Resources section in Cloud Pulse Alert details page ([#11524](https://github.com/linode/manager/pull/11524))
diff --git a/packages/manager/.changeset/pr-11526-fixed-1737034837256.md b/packages/manager/.changeset/pr-11526-fixed-1737034837256.md
deleted file mode 100644
index 2e6209ed284..00000000000
--- a/packages/manager/.changeset/pr-11526-fixed-1737034837256.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Fixed
----
-
-Zoom-in icon hover effect fix in CloudPulse ([#11526](https://github.com/linode/manager/pull/11526))
diff --git a/packages/manager/.changeset/pr-11529-tests-1737049089021.md b/packages/manager/.changeset/pr-11529-tests-1737049089021.md
deleted file mode 100644
index ccc8d489fc5..00000000000
--- a/packages/manager/.changeset/pr-11529-tests-1737049089021.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tests
----
-
-Increase timeouts when performing Linode clone operations ([#11529](https://github.com/linode/manager/pull/11529))
diff --git a/packages/manager/.changeset/pr-11531-tech-stories-1737051309899.md b/packages/manager/.changeset/pr-11531-tech-stories-1737051309899.md
deleted file mode 100644
index e31454ae3b9..00000000000
--- a/packages/manager/.changeset/pr-11531-tech-stories-1737051309899.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Tech Stories
----
-
-Update to TypeScript v5.7 ([#11531](https://github.com/linode/manager/pull/11531))
diff --git a/packages/manager/.changeset/pr-11536-changed-1737152603420.md b/packages/manager/.changeset/pr-11536-changed-1737152603420.md
deleted file mode 100644
index 2ce268906d4..00000000000
--- a/packages/manager/.changeset/pr-11536-changed-1737152603420.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Changed
----
-
-Revise Disk Encryption description copy in Linode Create flow ([#11536](https://github.com/linode/manager/pull/11536))
diff --git a/packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md b/packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md
deleted file mode 100644
index ce367462d47..00000000000
--- a/packages/manager/.changeset/pr-11539-upcoming-features-1737537564184.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Upcoming Features
----
-
-fix redirects from /account to /iam ([#11539](https://github.com/linode/manager/pull/11539))
diff --git a/packages/manager/.changeset/pr-11542-fixed-1737484177266.md b/packages/manager/.changeset/pr-11542-fixed-1737484177266.md
deleted file mode 100644
index c13ed7f81d8..00000000000
--- a/packages/manager/.changeset/pr-11542-fixed-1737484177266.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Fixed
----
-
-Linode Config Dialog misrepresenting primary interface ([#11542](https://github.com/linode/manager/pull/11542))
diff --git a/packages/manager/.changeset/pr-11544-added-1737522840655.md b/packages/manager/.changeset/pr-11544-added-1737522840655.md
deleted file mode 100644
index 88f8fc5a9ea..00000000000
--- a/packages/manager/.changeset/pr-11544-added-1737522840655.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/manager": Added
----
-
-GPU plans in Kubernetes create flow ([#11544](https://github.com/linode/manager/pull/11544))
diff --git a/packages/manager/CHANGELOG.md b/packages/manager/CHANGELOG.md
index 820634b5612..c8d2c8df29e 100644
--- a/packages/manager/CHANGELOG.md
+++ b/packages/manager/CHANGELOG.md
@@ -4,6 +4,68 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
+## [2025-01-28] - v1.135.0
+
+### Added:
+
+- `useCreateUserMutation` for adding new users ([#11402](https://github.com/linode/manager/pull/11402))
+- `AddNotificationChannel` component with Unit tests with necessary changes for constants, `CreateAlertDefinition` and other components. ([#11511](https://github.com/linode/manager/pull/11511))
+- GPU plans in LKE create flow ([#11544](https://github.com/linode/manager/pull/11544))
+
+### Changed:
+
+- Improved backups banner styles ([#11480](https://github.com/linode/manager/pull/11480))
+- Database Resize: Disable plans when the usable storage equals the used storage of the database cluster ([#11481](https://github.com/linode/manager/pull/11481))
+- add `Asia/Calcutta` zonename in `timezones.ts`, add `disabledTimeZone` property in `DateTimeRangePicker`, add `minDate` property to `DateTimePicker` ([#11495](https://github.com/linode/manager/pull/11495))
+- Tech doc link for Bucket rate limits change ([#11513](https://github.com/linode/manager/pull/11513))
+- Search v2 `not equal` syntax ([#11521](https://github.com/linode/manager/pull/11521))
+- Revise Disk Encryption description copy in Linode Create flow ([#11536](https://github.com/linode/manager/pull/11536))
+
+### Fixed:
+
+- Spacing for LKE cluster tags at desktop screen sizes ([#11507](https://github.com/linode/manager/pull/11507))
+- Zoom-in icon hover effect fix in CloudPulse ([#11526](https://github.com/linode/manager/pull/11526))
+- Linode Config Dialog misrepresenting primary interface ([#11542](https://github.com/linode/manager/pull/11542))
+
+### Tech Stories:
+
+- Update to TypeScript v5.7 ([#11531](https://github.com/linode/manager/pull/11531))
+- Replace EnhancedSelect with Autocomplete component in the Help feature ([#11470](https://github.com/linode/manager/pull/11470))
+- Replace ramda's `splitAt` with custom utility ([#11483](https://github.com/linode/manager/pull/11483))
+- Update `tsconfig.json` to use `bundler` moduleResolution ([#11487](https://github.com/linode/manager/pull/11487))
+- Replace one-off hardcoded color values with color tokens (part 5) ([#11488](https://github.com/linode/manager/pull/11488))
+- Replace remaining react-select instances & types in Linodes Feature ([#11509](https://github.com/linode/manager/pull/11509))
+- Dependabot security fixes ([#11510](https://github.com/linode/manager/pull/11510))
+- Remove `ramda` from `DomainRecords` part 1 ([#11514](https://github.com/linode/manager/pull/11514))
+- Remove `ramda` from `CreateDomain.tsx` ([#11505](https://github.com/linode/manager/pull/11505))
+- Refactor and convert DomainRecords to functional component ([#11447](https://github.com/linode/manager/pull/11447))
+
+
+### Tests:
+
+- Improve organization of Object Storage and Object Storage Multicluster tests ([#11484](https://github.com/linode/manager/pull/11484))
+- Fix test notification formatting and output issues ([#11489](https://github.com/linode/manager/pull/11489))
+- Remove cypress deprecated helper.ts functions ([#11501](https://github.com/linode/manager/pull/11501))
+- Add component tests for PasswordInput ([#11508](https://github.com/linode/manager/pull/11508))
+- Add `CY_TEST_RESET_PREFERENCES` env var to reset user preferences at test run start ([#11522](https://github.com/linode/manager/pull/11522))
+- Increase timeouts when performing Linode clone operations ([#11529](https://github.com/linode/manager/pull/11529))
+
+### Upcoming Features:
+
+- Proxy users table, removing users, adding users ([#11402](https://github.com/linode/manager/pull/11402))
+- Add new entities component for iam ([#11429](https://github.com/linode/manager/pull/11429))
+- Add Alert Details Criteria section in Cloud Pulse Alert Details page ([#11477](https://github.com/linode/manager/pull/11477))
+- Update Metrics api request and JWE Token api request in CloudPulse ([#11506](https://github.com/linode/manager/pull/11506))
+- Improve UDP NodeBalancer support ([#11515](https://github.com/linode/manager/pull/11515))
+- Display cluster provisioning after an LKE-E cluster is created ([#11518](https://github.com/linode/manager/pull/11518))
+- Add scaffolding for Resources section in Cloud Pulse Alert details page ([#11524](https://github.com/linode/manager/pull/11524))
+- Fix redirects from /account to /iam ([#11539](https://github.com/linode/manager/pull/11539))
+
+### Upcoming:
+
+- Quotas feature flag, queries, and MSW CRUD preset support ([#11493](https://github.com/linode/manager/pull/11493))
+
+
## [2025-01-14] - v1.134.0
### Added:
diff --git a/packages/manager/package.json b/packages/manager/package.json
index 866c03724f1..430b6b8ee03 100644
--- a/packages/manager/package.json
+++ b/packages/manager/package.json
@@ -2,7 +2,7 @@
"name": "linode-manager",
"author": "Linode",
"description": "The Linode Manager website",
- "version": "1.134.0",
+ "version": "1.135.0",
"private": true,
"type": "module",
"bugs": {
diff --git a/packages/ui/.changeset/pr-11480-changed-1736262442937.md b/packages/ui/.changeset/pr-11480-changed-1736262442937.md
deleted file mode 100644
index a366ba78ad5..00000000000
--- a/packages/ui/.changeset/pr-11480-changed-1736262442937.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/ui": Changed
----
-
-Refactor and clean up `Notice` ([#11480](https://github.com/linode/manager/pull/11480))
diff --git a/packages/ui/.changeset/pr-11480-removed-1736802565293.md b/packages/ui/.changeset/pr-11480-removed-1736802565293.md
deleted file mode 100644
index c2d0ddfef3b..00000000000
--- a/packages/ui/.changeset/pr-11480-removed-1736802565293.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/ui": Removed
----
-
-`marketing` variant on `Notice` component ([#11480](https://github.com/linode/manager/pull/11480))
diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md
index 1dfb210c946..a64deb1d125 100644
--- a/packages/ui/CHANGELOG.md
+++ b/packages/ui/CHANGELOG.md
@@ -1,3 +1,14 @@
+## [2025-01-28] - v0.6.0
+
+
+### Changed:
+
+- Refactor and clean up `Notice` ([#11480](https://github.com/linode/manager/pull/11480))
+
+### Removed:
+
+- `marketing` variant on `Notice` component ([#11480](https://github.com/linode/manager/pull/11480))
+
## [2025-01-14] - v0.5.0
### Added:
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 5bc5b0b464f..7dd09bfe9cb 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -2,7 +2,7 @@
"name": "@linode/ui",
"author": "Linode",
"description": "Linode UI component library",
- "version": "0.5.0",
+ "version": "0.6.0",
"type": "module",
"main": "src/index.ts",
"module": "src/index.ts",
diff --git a/packages/validation/.changeset/pr-11487-tech-stories-1736286059147.md b/packages/validation/.changeset/pr-11487-tech-stories-1736286059147.md
deleted file mode 100644
index e41eb5b8aec..00000000000
--- a/packages/validation/.changeset/pr-11487-tech-stories-1736286059147.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/validation": Tech Stories
----
-
-Update `tsconfig.json` to use `bundler` moduleResolution ([#11487](https://github.com/linode/manager/pull/11487))
diff --git a/packages/validation/.changeset/pr-11515-changed-1736786649145.md b/packages/validation/.changeset/pr-11515-changed-1736786649145.md
deleted file mode 100644
index 58592ad97f8..00000000000
--- a/packages/validation/.changeset/pr-11515-changed-1736786649145.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@linode/validation": Changed
----
-
-Allow `cipher_suite` to be `none` in NodeBalancer schemas ([#11515](https://github.com/linode/manager/pull/11515))
diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md
index 1709f51355b..8de86910f9e 100644
--- a/packages/validation/CHANGELOG.md
+++ b/packages/validation/CHANGELOG.md
@@ -1,3 +1,15 @@
+## [2025-01-28] - v0.59.0
+
+
+### Changed:
+
+- Allow `cipher_suite` to be `none` in NodeBalancer schemas ([#11515](https://github.com/linode/manager/pull/11515))
+
+### Tech Stories:
+
+- Update `tsconfig.json` to use `bundler` moduleResolution ([#11487](https://github.com/linode/manager/pull/11487))
+
+
## [2025-01-14] - v0.58.0
### Added:
diff --git a/packages/validation/package.json b/packages/validation/package.json
index b8350e447b5..df077e29fed 100644
--- a/packages/validation/package.json
+++ b/packages/validation/package.json
@@ -1,6 +1,6 @@
{
"name": "@linode/validation",
- "version": "0.58.0",
+ "version": "0.59.0",
"description": "Yup validation schemas for use with the Linode APIv4",
"type": "module",
"main": "lib/index.cjs",
From c6cf128744832407dd35b4a40dd150d6828a0ec5 Mon Sep 17 00:00:00 2001
From: Alban Bailly
Date: Thu, 23 Jan 2025 10:27:47 -0500
Subject: [PATCH 42/42] Update changelos
---
packages/api-v4/CHANGELOG.md | 11 ++++-------
packages/manager/CHANGELOG.md | 34 ++++++++++++++++------------------
2 files changed, 20 insertions(+), 25 deletions(-)
diff --git a/packages/api-v4/CHANGELOG.md b/packages/api-v4/CHANGELOG.md
index ad483030435..c3f91bdc99e 100644
--- a/packages/api-v4/CHANGELOG.md
+++ b/packages/api-v4/CHANGELOG.md
@@ -1,11 +1,5 @@
## [2025-01-28] - v0.133.0
-
-### Added:
-
-- Types for Quotas endpoints ([#11493](https://github.com/linode/manager/pull/11493))
-- Notification Channel related types to cloudpulse/alerts.ts ([#11511](https://github.com/linode/manager/pull/11511))
-
### Changed:
- Allow `cipher_suite` to be `none` in `NodeBalancerConfig` and `CreateNodeBalancerConfig` ([#11515](https://github.com/linode/manager/pull/11515))
@@ -16,7 +10,10 @@
### Upcoming Features:
-- update types for IAM and resources api ([#11429](https://github.com/linode/manager/pull/11429))
+- Update types for IAM and resources API ([#11429](https://github.com/linode/manager/pull/11429))
+- Add types for Quotas endpoints ([#11493](https://github.com/linode/manager/pull/11493))
+- Add Notification Channel related types to cloudpulse/alerts.ts ([#11511](https://github.com/linode/manager/pull/11511))
+
## [2025-01-14] - v0.132.0
diff --git a/packages/manager/CHANGELOG.md b/packages/manager/CHANGELOG.md
index c8d2c8df29e..26b9b97e057 100644
--- a/packages/manager/CHANGELOG.md
+++ b/packages/manager/CHANGELOG.md
@@ -8,23 +8,22 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
### Added:
-- `useCreateUserMutation` for adding new users ([#11402](https://github.com/linode/manager/pull/11402))
-- `AddNotificationChannel` component with Unit tests with necessary changes for constants, `CreateAlertDefinition` and other components. ([#11511](https://github.com/linode/manager/pull/11511))
+- `useCreateUserMutation` for adding new users ([#11402](https://github.com/linode/manager/pull/11402)
- GPU plans in LKE create flow ([#11544](https://github.com/linode/manager/pull/11544))
### Changed:
-- Improved backups banner styles ([#11480](https://github.com/linode/manager/pull/11480))
-- Database Resize: Disable plans when the usable storage equals the used storage of the database cluster ([#11481](https://github.com/linode/manager/pull/11481))
-- add `Asia/Calcutta` zonename in `timezones.ts`, add `disabledTimeZone` property in `DateTimeRangePicker`, add `minDate` property to `DateTimePicker` ([#11495](https://github.com/linode/manager/pull/11495))
-- Tech doc link for Bucket rate limits change ([#11513](https://github.com/linode/manager/pull/11513))
+- Improve backups banner styles ([#11480](https://github.com/linode/manager/pull/11480))
+- Disable resizable plans when the usable storage equals the used storage of the database cluster ([#11481](https://github.com/linode/manager/pull/11481))
+([#11495](https://github.com/linode/manager/pull/11495))
+- Tech doc link for Bucket rate limits ([#11513](https://github.com/linode/manager/pull/11513))
- Search v2 `not equal` syntax ([#11521](https://github.com/linode/manager/pull/11521))
- Revise Disk Encryption description copy in Linode Create flow ([#11536](https://github.com/linode/manager/pull/11536))
### Fixed:
- Spacing for LKE cluster tags at desktop screen sizes ([#11507](https://github.com/linode/manager/pull/11507))
-- Zoom-in icon hover effect fix in CloudPulse ([#11526](https://github.com/linode/manager/pull/11526))
+- Zoom-in icon hover effect in CloudPulse ([#11526](https://github.com/linode/manager/pull/11526))
- Linode Config Dialog misrepresenting primary interface ([#11542](https://github.com/linode/manager/pull/11542))
### Tech Stories:
@@ -39,6 +38,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- Remove `ramda` from `DomainRecords` part 1 ([#11514](https://github.com/linode/manager/pull/11514))
- Remove `ramda` from `CreateDomain.tsx` ([#11505](https://github.com/linode/manager/pull/11505))
- Refactor and convert DomainRecords to functional component ([#11447](https://github.com/linode/manager/pull/11447))
+- Add `Asia/Calcutta` zonename in `timezones.ts`, `disabledTimeZone` property in `DateTimeRangePicker`, and `minDate` property to `DateTimePicker` ([#11495](https://github.com/linode/manager/pull/11495))
### Tests:
@@ -52,18 +52,16 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
### Upcoming Features:
-- Proxy users table, removing users, adding users ([#11402](https://github.com/linode/manager/pull/11402))
-- Add new entities component for iam ([#11429](https://github.com/linode/manager/pull/11429))
-- Add Alert Details Criteria section in Cloud Pulse Alert Details page ([#11477](https://github.com/linode/manager/pull/11477))
-- Update Metrics api request and JWE Token api request in CloudPulse ([#11506](https://github.com/linode/manager/pull/11506))
-- Improve UDP NodeBalancer support ([#11515](https://github.com/linode/manager/pull/11515))
+- Add Proxy users table, removing users, adding users to IAM ([#11402](https://github.com/linode/manager/pull/11402))
+- Add new entities component for IAM ([#11429](https://github.com/linode/manager/pull/11429))
- Display cluster provisioning after an LKE-E cluster is created ([#11518](https://github.com/linode/manager/pull/11518))
-- Add scaffolding for Resources section in Cloud Pulse Alert details page ([#11524](https://github.com/linode/manager/pull/11524))
-- Fix redirects from /account to /iam ([#11539](https://github.com/linode/manager/pull/11539))
-
-### Upcoming:
-
-- Quotas feature flag, queries, and MSW CRUD preset support ([#11493](https://github.com/linode/manager/pull/11493))
+- Add Alert Details Criteria section in CloudPulse Alert Details page ([#11477](https://github.com/linode/manager/pull/11477))
+- Update Metrics API request and JWE Token API request in CloudPulse ([#11506](https://github.com/linode/manager/pull/11506))
+- Improve UDP NodeBalancer support ([#11515](https://github.com/linode/manager/pull/11515))
+- Add scaffolding for Resources section in CloudPulse Alert details page ([#11524](https://github.com/linode/manager/pull/11524))
+- Fix redirects from /account to /iam ([#11539](https://github.com/linode/manager/pull/11539)))
+- Add `AddNotificationChannel` component with unit tests with necessary changes for constants, `CreateAlertDefinition` and other components. ([#11511](https://github.com/linode/manager/pull/11511))
+- Add Quotas feature flag, queries, and MSW CRUD preset support ([#11493](https://github.com/linode/manager/pull/11493))
## [2025-01-14] - v1.134.0