diff --git a/packages/manager/.changeset/pr-10546-tests-1717604850412.md b/packages/manager/.changeset/pr-10546-tests-1717604850412.md
new file mode 100644
index 00000000000..b27e1dccd3e
--- /dev/null
+++ b/packages/manager/.changeset/pr-10546-tests-1717604850412.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Tests
+---
+
+Add assertions regarding Disk Encryption info banner to lke-landing-page.spec.ts ([#10546](https://github.com/linode/manager/pull/10546))
diff --git a/packages/manager/.changeset/pr-10546-upcoming-features-1717603180090.md b/packages/manager/.changeset/pr-10546-upcoming-features-1717603180090.md
new file mode 100644
index 00000000000..fe944b48194
--- /dev/null
+++ b/packages/manager/.changeset/pr-10546-upcoming-features-1717603180090.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Upcoming Features
+---
+
+Add Disk Encryption info banner to Kubernetes landing page ([#10546](https://github.com/linode/manager/pull/10546))
diff --git a/packages/manager/cypress/e2e/core/kubernetes/lke-landing-page.spec.ts b/packages/manager/cypress/e2e/core/kubernetes/lke-landing-page.spec.ts
index a45cb165cb3..734d807b6c8 100644
--- a/packages/manager/cypress/e2e/core/kubernetes/lke-landing-page.spec.ts
+++ b/packages/manager/cypress/e2e/core/kubernetes/lke-landing-page.spec.ts
@@ -4,12 +4,70 @@ import {
mockGetClusterPools,
mockGetKubeconfig,
} from 'support/intercepts/lke';
-import { kubernetesClusterFactory, nodePoolFactory } from 'src/factories';
+import {
+ accountFactory,
+ kubernetesClusterFactory,
+ nodePoolFactory,
+} from 'src/factories';
import { getRegionById } from 'support/util/regions';
import { readDownload } from 'support/util/downloads';
import { ui } from 'support/ui';
+import {
+ mockAppendFeatureFlags,
+ mockGetFeatureFlagClientstream,
+} from 'support/intercepts/feature-flags';
+import { makeFeatureFlagData } from 'support/util/feature-flags';
+import { mockGetAccount } from 'support/intercepts/account';
describe('LKE landing page', () => {
+ it('does not display a Disk Encryption info banner if the LDE feature is disabled', () => {
+ // Mock feature flag -- @TODO LDE: Remove feature flag once LDE is fully rolled out
+ mockAppendFeatureFlags({
+ linodeDiskEncryption: makeFeatureFlagData(false),
+ }).as('getFeatureFlags');
+ mockGetFeatureFlagClientstream().as('getClientStream');
+
+ // Mock responses
+ const mockAccount = accountFactory.build({
+ capabilities: ['Linodes', 'Disk Encryption'],
+ });
+
+ mockGetAccount(mockAccount).as('getAccount');
+
+ // Intercept request
+ cy.visitWithLogin('/kubernetes/clusters');
+ cy.wait('@getAccount');
+
+ // Check if banner is visible
+ cy.findByText('Disk encryption is now standard on Linodes.').should(
+ 'not.exist'
+ );
+ });
+
+ it('displays a Disk Encryption info banner if the LDE feature is enabled', () => {
+ // Mock feature flag -- @TODO LDE: Remove feature flag once LDE is fully rolled out
+ mockAppendFeatureFlags({
+ linodeDiskEncryption: makeFeatureFlagData(true),
+ }).as('getFeatureFlags');
+ mockGetFeatureFlagClientstream().as('getClientStream');
+
+ // Mock responses
+ const mockAccount = accountFactory.build({
+ capabilities: ['Linodes', 'Disk Encryption'],
+ });
+
+ mockGetAccount(mockAccount).as('getAccount');
+
+ // Intercept request
+ cy.visitWithLogin('/kubernetes/clusters');
+ cy.wait('@getAccount');
+
+ // Check if banner is visible
+ cy.contains('Disk encryption is now standard on Linodes.').should(
+ 'be.visible'
+ );
+ });
+
/*
* - Confirms that LKE clusters are listed on landing page.
*/
diff --git a/packages/manager/src/components/DiskEncryption/constants.tsx b/packages/manager/src/components/DiskEncryption/constants.tsx
index 539b19d3a6c..a49b31115c5 100644
--- a/packages/manager/src/components/DiskEncryption/constants.tsx
+++ b/packages/manager/src/components/DiskEncryption/constants.tsx
@@ -11,20 +11,38 @@ export const DISK_ENCRYPTION_GENERAL_DESCRIPTION = (
>
);
-export const DISK_ENCRYPTION_DESCRIPTION_NODE_POOL_REBUILD_CAVEAT =
- 'Encrypt Linode data at rest to improve security. The disk encryption setting for Linodes added to a node pool will not be changed after rebuild.';
+const DISK_ENCRYPTION_UPDATE_PROTECT_CLUSTERS_DOCS_LINK =
+ 'https://www.linode.com/docs/products/compute/compute-instances/guides/local-disk-encryption/';
+
+export const DISK_ENCRYPTION_UPDATE_PROTECT_CLUSTERS_COPY = (
+ <>
+ Disk encryption is now standard on Linodes.{' '}
+
+ Learn how
+ {' '}
+ to update and protect your clusters.
+ >
+);
+
+export const DISK_ENCRYPTION_UPDATE_PROTECT_CLUSTERS_BANNER_KEY =
+ 'disk-encryption-update-protect-clusters-banner';
export const DISK_ENCRYPTION_UNAVAILABLE_IN_REGION_COPY =
'Disk encryption is not available in the selected region.';
-export const DISK_ENCRYPTION_BACKUPS_CAVEAT_COPY =
- 'Virtual Machine Backups are not encrypted.';
-
+// Guidance
export const DISK_ENCRYPTION_NODE_POOL_GUIDANCE_COPY =
'To enable disk encryption, delete the node pool and create a new node pool. New node pools are always encrypted.';
export const UNENCRYPTED_STANDARD_LINODE_GUIDANCE_COPY =
'Rebuild this Linode to enable or disable disk encryption.';
+// Caveats
+export const DISK_ENCRYPTION_DESCRIPTION_NODE_POOL_REBUILD_CAVEAT =
+ 'Encrypt Linode data at rest to improve security. The disk encryption setting for Linodes added to a node pool will not be changed after rebuild.';
+
+export const DISK_ENCRYPTION_BACKUPS_CAVEAT_COPY =
+ 'Virtual Machine Backups are not encrypted.';
+
export const DISK_ENCRYPTION_IMAGES_CAVEAT_COPY =
'Virtual Machine Images are not encrypted.';
diff --git a/packages/manager/src/features/Kubernetes/KubernetesLanding/KubernetesLanding.tsx b/packages/manager/src/features/Kubernetes/KubernetesLanding/KubernetesLanding.tsx
index 086327952c6..3477800a7bb 100644
--- a/packages/manager/src/features/Kubernetes/KubernetesLanding/KubernetesLanding.tsx
+++ b/packages/manager/src/features/Kubernetes/KubernetesLanding/KubernetesLanding.tsx
@@ -3,6 +3,12 @@ import * as React from 'react';
import { useHistory } from 'react-router-dom';
import { CircleProgress } from 'src/components/CircleProgress';
+import {
+ DISK_ENCRYPTION_UPDATE_PROTECT_CLUSTERS_BANNER_KEY,
+ DISK_ENCRYPTION_UPDATE_PROTECT_CLUSTERS_COPY,
+} from 'src/components/DiskEncryption/constants';
+import { useIsDiskEncryptionFeatureEnabled } from 'src/components/DiskEncryption/utils';
+import { DismissibleBanner } from 'src/components/DismissibleBanner/DismissibleBanner';
import { DocumentTitleSegment } from 'src/components/DocumentTitle';
import { ErrorState } from 'src/components/ErrorState/ErrorState';
import { Hidden } from 'src/components/Hidden';
@@ -15,6 +21,7 @@ import { TableHead } from 'src/components/TableHead';
import { TableRow } from 'src/components/TableRow';
import { TableSortCell } from 'src/components/TableSortCell';
import { TransferDisplay } from 'src/components/TransferDisplay/TransferDisplay';
+import { Typography } from 'src/components/Typography';
import { useOrder } from 'src/hooks/useOrder';
import { usePagination } from 'src/hooks/usePagination';
import { useKubernetesClustersQuery } from 'src/queries/kubernetes';
@@ -92,6 +99,10 @@ export const KubernetesLanding = () => {
filter
);
+ const {
+ isDiskEncryptionFeatureEnabled,
+ } = useIsDiskEncryptionFeatureEnabled();
+
const openUpgradeDialog = (
clusterID: number,
clusterLabel: string,
@@ -149,6 +160,17 @@ export const KubernetesLanding = () => {
return (
<>
+ {isDiskEncryptionFeatureEnabled && (
+
+
+ {DISK_ENCRYPTION_UPDATE_PROTECT_CLUSTERS_COPY}
+
+
+ )}