diff --git a/packages/manager/.changeset/pr-13043-added-1761922908861.md b/packages/manager/.changeset/pr-13043-added-1761922908861.md
new file mode 100644
index 00000000000..faac2e7fd6c
--- /dev/null
+++ b/packages/manager/.changeset/pr-13043-added-1761922908861.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Added
+---
+
+IAM: add a permission check for delete nodebalancer drawer ([#13043](https://github.com/linode/manager/pull/13043))
diff --git a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx
index fbd4a2875e6..710fa0e4116 100644
--- a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx
+++ b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.test.tsx
@@ -22,6 +22,15 @@ const queryMocks = vi.hoisted(() => ({
useMatch: vi.fn(() => ({})),
useNavigate: vi.fn(() => navigate),
usePreferences: vi.fn().mockReturnValue({}),
+ userPermissions: vi.fn(() => ({
+ data: {
+ delete_nodebalancer: true,
+ },
+ })),
+}));
+
+vi.mock('src/features/IAM/hooks/usePermissions', () => ({
+ usePermissions: queryMocks.userPermissions,
}));
vi.mock('@linode/queries', async () => {
@@ -77,4 +86,26 @@ describe('NodeBalancerDeleteDialog', () => {
await userEvent.click(getByText('Cancel'));
expect(navigate).toHaveBeenCalled();
});
+
+ it('enables inputs and buttons if there is a delete_nodebalancer permissions', () => {
+ const { getByTestId } = renderWithTheme(
+
+ );
+
+ expect(getByTestId('textfield-input')).toBeEnabled();
+ });
+
+ it('disables inputs and buttons if no delete_nodebalancer permission', () => {
+ queryMocks.userPermissions.mockReturnValue({
+ data: {
+ delete_nodebalancer: false,
+ },
+ });
+ const { getByTestId } = renderWithTheme(
+
+ );
+
+ expect(getByTestId('confirm')).toBeDisabled();
+ expect(getByTestId('textfield-input')).toBeDisabled();
+ });
});
diff --git a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx
index f2b81b3076a..f95623429ab 100644
--- a/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx
+++ b/packages/manager/src/features/NodeBalancers/NodeBalancerDeleteDialog.tsx
@@ -5,6 +5,9 @@ import * as React from 'react';
import { TypeToConfirmDialog } from 'src/components/TypeToConfirmDialog/TypeToConfirmDialog';
+import { getRestrictedResourceText } from '../Account/utils';
+import { usePermissions } from '../IAM/hooks/usePermissions';
+
import type { APIError, NodeBalancer } from '@linode/api-v4';
interface Props {
@@ -28,6 +31,12 @@ export const NodeBalancerDeleteDialog = ({
selectedNodeBalancer?.id ?? -1
);
+ const { data: permissions } = usePermissions(
+ 'nodebalancer',
+ ['delete_nodebalancer'],
+ selectedNodeBalancer?.id,
+ open
+ );
const label = selectedNodeBalancer?.label;
const onDelete = async () => {
@@ -37,6 +46,8 @@ export const NodeBalancerDeleteDialog = ({
return (
+ {!permissions.delete_nodebalancer && (
+
+ )}
Deleting this NodeBalancer is permanent and can’t be undone.