From 8d8af3cec952f5d3362558fa66adba36c8886b30 Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Fri, 31 May 2024 14:31:10 -0400 Subject: [PATCH 1/7] Add lke_cluster_id to Linode interface; display encryption status in Linode Detail header; adjust several mocks and test files based on update to Linode type --- packages/api-v4/src/linodes/types.ts | 1 + packages/manager/src/__data__/linodes.ts | 4 ++ .../components/DiskEncryption/constants.tsx | 6 +++ packages/manager/src/factories/linodes.ts | 1 + .../NodePoolsDisplay/NodeTable.tsx | 6 ++- .../features/Linodes/LinodeEntityDetail.tsx | 2 + .../Linodes/LinodeEntityDetailBody.tsx | 53 +++++++++++++++++-- .../LinodesCreate/AddonsPanel.test.tsx | 3 ++ .../LinodeRow/LinodeRow.test.tsx | 1 + .../Linodes/LinodesLanding/ListView.tsx | 3 +- 10 files changed, 73 insertions(+), 7 deletions(-) diff --git a/packages/api-v4/src/linodes/types.ts b/packages/api-v4/src/linodes/types.ts index 05f52e39d96..c3e1f6be296 100644 --- a/packages/api-v4/src/linodes/types.ts +++ b/packages/api-v4/src/linodes/types.ts @@ -27,6 +27,7 @@ export interface Linode { ipv4: string[]; ipv6: string | null; label: string; + lke_cluster_id: number | null; placement_group?: PlacementGroupPayload; // If not in a placement group, this will be excluded from the response. type: string | null; status: LinodeStatus; diff --git a/packages/manager/src/__data__/linodes.ts b/packages/manager/src/__data__/linodes.ts index 22ffdfee42d..ab5ad7a97ca 100644 --- a/packages/manager/src/__data__/linodes.ts +++ b/packages/manager/src/__data__/linodes.ts @@ -24,6 +24,7 @@ export const linode1: Linode = { ipv4: ['97.107.143.78', '98.107.143.78', '99.107.143.78'], ipv6: '2600:3c03::f03c:91ff:fe0a:109a/64', label: 'test', + lke_cluster_id: null, placement_group: { affinity_type: 'anti_affinity:local', id: 1, @@ -69,6 +70,7 @@ export const linode2: Linode = { ipv4: ['97.107.143.49'], ipv6: '2600:3c03::f03c:91ff:fe0a:0d7a/64', label: 'another-test', + lke_cluster_id: null, placement_group: { affinity_type: 'anti_affinity:local', id: 1, @@ -114,6 +116,7 @@ export const linode3: Linode = { ipv4: ['97.107.143.49'], ipv6: '2600:3c03::f03c:91ff:fe0a:0d7a/64', label: 'another-test', + lke_cluster_id: null, placement_group: { affinity_type: 'anti_affinity:local', id: 1, @@ -159,6 +162,7 @@ export const linode4: Linode = { ipv4: ['97.107.143.49'], ipv6: '2600:3c03::f03c:91ff:fe0a:0d7a/64', label: 'another-test-eu', + lke_cluster_id: null, placement_group: { affinity_type: 'anti_affinity:local', id: 1, diff --git a/packages/manager/src/components/DiskEncryption/constants.tsx b/packages/manager/src/components/DiskEncryption/constants.tsx index 5d0ffe10ec8..5b5395f8a0c 100644 --- a/packages/manager/src/components/DiskEncryption/constants.tsx +++ b/packages/manager/src/components/DiskEncryption/constants.tsx @@ -22,3 +22,9 @@ export const DISK_ENCRYPTION_BACKUPS_CAVEAT_COPY = 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 = + 'Use Rebuild to enable or disable disk encryption.'; + +export const UNENCRYPTED_LKE_LINODE_GUIDANCE_COPY = + 'To enable disk encryption, delete the node pool and create a new node pool. New node pools are always encrypted.'; diff --git a/packages/manager/src/factories/linodes.ts b/packages/manager/src/factories/linodes.ts index 63f5b0e8ad0..735dac98182 100644 --- a/packages/manager/src/factories/linodes.ts +++ b/packages/manager/src/factories/linodes.ts @@ -263,6 +263,7 @@ export const linodeFactory = Factory.Sync.makeFactory({ ipv4: ['50.116.6.212', '192.168.203.1'], ipv6: '2600:3c00::f03c:92ff:fee2:6c40/64', label: Factory.each((i) => `linode-${i}`), + lke_cluster_id: null, placement_group: placementGroupFactory.build({ affinity_type: 'anti_affinity:local', id: 1, diff --git a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/NodeTable.tsx b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/NodeTable.tsx index be95c8ab1df..3ba84624448 100644 --- a/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/NodeTable.tsx +++ b/packages/manager/src/features/Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/NodeTable.tsx @@ -214,8 +214,10 @@ export const EncryptedStatus = ({ ) : encryptionStatus === 'disabled' ? ( <> - - Not Encrypted + + + Not Encrypted + {tooltipText ? : null} ) : null; diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx index b61b2862a35..f9478caa2d0 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetail.tsx @@ -108,10 +108,12 @@ export const LinodeEntityDetail = (props: Props) => { body={ { const { configInterfaceWithVPC, + encryptionStatus, gbRAM, gbStorage, ipv4, ipv6, + isLKELinode, isVPCOnlyLinode, linodeId, linodeIsInEdgeRegion, @@ -77,6 +92,14 @@ export const LinodeEntityDetailBody = React.memo((props: BodyProps) => { const theme = useTheme(); + const { + isDiskEncryptionFeatureEnabled, + } = useIsDiskEncryptionFeatureEnabled(); + + // @ TODO LDE: Remove usages of this variable once LDE is fully rolled out (being used to determine formatting adjustments currently) + const isDisplayingEncryptedStatus = + isDiskEncryptionFeatureEnabled && Boolean(encryptionStatus); + // Filter and retrieve subnets associated with a specific Linode ID const linodeAssociatedSubnets = vpcLinodeIsAssignedTo?.subnets.filter( (subnet) => subnet.linodes.some((linode) => linode.id === linodeId) @@ -97,11 +120,14 @@ export const LinodeEntityDetailBody = React.memo((props: BodyProps) => { - + Summary @@ -121,9 +147,28 @@ export const LinodeEntityDetailBody = React.memo((props: BodyProps) => { {pluralize('Volume', 'Volumes', numVolumes)} + {isDiskEncryptionFeatureEnabled && encryptionStatus && ( + + + + + + )} - + { ipv6={linode.ipv6 || ''} key={`linode-row-${1}`} label={linode.label} + lke_cluster_id={linode.lke_cluster_id} placement_group={linode.placement_group} region={linode.region} specs={linode.specs} diff --git a/packages/manager/src/features/Linodes/LinodesLanding/ListView.tsx b/packages/manager/src/features/Linodes/LinodesLanding/ListView.tsx index ac316735313..d8b35d2adf8 100644 --- a/packages/manager/src/features/Linodes/LinodesLanding/ListView.tsx +++ b/packages/manager/src/features/Linodes/LinodesLanding/ListView.tsx @@ -46,6 +46,8 @@ export const ListView = (props: RenderLinodesProps) => { ipv6={linode.ipv6 || ''} key={`linode-row-${idx}`} label={linode.label} + lke_cluster_id={linode.lke_cluster_id} + maintenance={linode.maintenance} placement_group={linode.placement_group} region={linode.region} specs={linode.specs} @@ -54,7 +56,6 @@ export const ListView = (props: RenderLinodesProps) => { type={linode.type} updated={linode.updated} watchdog_enabled={linode.watchdog_enabled} - maintenance={linode.maintenance} /> ))} From 104ae7a04792e79fa4d3cf4e4de0ee2c3080df9b Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Fri, 31 May 2024 14:52:12 -0400 Subject: [PATCH 2/7] Unit tests --- .../Linodes/LinodeEntityDetail.test.tsx | 59 +++++++++++++++++++ .../Linodes/LinodeEntityDetailBody.tsx | 3 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx index 54c368bab8d..981cca15e03 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetail.test.tsx @@ -13,6 +13,7 @@ import { HttpResponse, http, server } from 'src/mocks/testServer'; import { queryClientFactory } from 'src/queries/base'; import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers'; +import { encryptionStatusTestId } from '../Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/NodeTable'; import { LinodeEntityDetail } from './LinodeEntityDetail'; import { getSubnetsString } from './LinodeEntityDetailBody'; import { LinodeHandlers } from './LinodesLanding/LinodesLanding'; @@ -34,6 +35,29 @@ describe('Linode Entity Detail', () => { const vpcSectionTestId = 'vpc-section-title'; const assignedVPCLabelTestId = 'assigned-vpc-label'; + const mocks = vi.hoisted(() => { + return { + useIsDiskEncryptionFeatureEnabled: vi.fn(), + }; + }); + + vi.mock('src/components/DiskEncryption/utils.ts', async () => { + const actual = await vi.importActual( + 'src/components/DiskEncryption/utils.ts' + ); + return { + ...actual, + __esModule: true, + useIsDiskEncryptionFeatureEnabled: mocks.useIsDiskEncryptionFeatureEnabled.mockImplementation( + () => { + return { + isDiskEncryptionFeatureEnabled: false, // indicates the feature flag is off or account capability is absent + }; + } + ), + }; + }); + it('should not display the VPC section if the linode is not assigned to a VPC', async () => { const account = accountFactory.build({ capabilities: [...accountCapabilitiesWithoutVPC, 'VPCs'], @@ -104,6 +128,41 @@ describe('Linode Entity Detail', () => { expect(getByTestId(assignedVPCLabelTestId).innerHTML).toEqual('test-vpc'); }); }); + + it('should not display the encryption status of the linode if the account lacks the capability or the feature flag is off', () => { + // situation where isDiskEncryptionFeatureEnabled === false + const { queryByTestId } = renderWithTheme( + + ); + const encryptionStatusFragment = queryByTestId(encryptionStatusTestId); + + expect(encryptionStatusFragment).not.toBeInTheDocument(); + }); + + it('should display the encryption status of the linode when Disk Encryption is enabled and the user has the account capability', () => { + mocks.useIsDiskEncryptionFeatureEnabled.mockImplementationOnce(() => { + return { + isDiskEncryptionFeatureEnabled: true, + }; + }); + + const { queryByTestId } = renderWithTheme( + + ); + const encryptionStatusFragment = queryByTestId(encryptionStatusTestId); + + expect(encryptionStatusFragment).toBeInTheDocument(); + }); }); describe('getSubnetsString function', () => { diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx index f3c37069ff1..fce8bc98dba 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx @@ -17,6 +17,7 @@ import { AccessTable } from 'src/features/Linodes/AccessTable'; import { useProfile } from 'src/queries/profile'; import { pluralize } from 'src/utilities/pluralize'; +import { encryptionStatusTestId } from '../Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/NodeTable'; import { EncryptedStatus } from '../Kubernetes/KubernetesClusterDetail/NodePoolsDisplay/NodeTable'; import { StyledBodyGrid, @@ -151,7 +152,7 @@ export const LinodeEntityDetailBody = React.memo((props: BodyProps) => { From 3fa0164978c088716b9c4acd4a2efdbc60cee4a5 Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Fri, 31 May 2024 15:10:33 -0400 Subject: [PATCH 3/7] Added changeset: Add Encrypted / Not Encrypted status to Linode Detail header --- packages/manager/.changeset/pr-10537-added-1717182633416.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-10537-added-1717182633416.md diff --git a/packages/manager/.changeset/pr-10537-added-1717182633416.md b/packages/manager/.changeset/pr-10537-added-1717182633416.md new file mode 100644 index 00000000000..2c24830f15f --- /dev/null +++ b/packages/manager/.changeset/pr-10537-added-1717182633416.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Added +--- + +Add Encrypted / Not Encrypted status to Linode Detail header ([#10537](https://github.com/linode/manager/pull/10537)) From 4801a3a883aa9a984153af4e7ab0a000b66f3e73 Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Fri, 31 May 2024 15:12:35 -0400 Subject: [PATCH 4/7] Added changeset: Add lke_cluster_id to Linode interface --- packages/api-v4/.changeset/pr-10537-changed-1717182754934.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/api-v4/.changeset/pr-10537-changed-1717182754934.md diff --git a/packages/api-v4/.changeset/pr-10537-changed-1717182754934.md b/packages/api-v4/.changeset/pr-10537-changed-1717182754934.md new file mode 100644 index 00000000000..15cf633a71e --- /dev/null +++ b/packages/api-v4/.changeset/pr-10537-changed-1717182754934.md @@ -0,0 +1,5 @@ +--- +"@linode/api-v4": Changed +--- + +Add lke_cluster_id to Linode interface ([#10537](https://github.com/linode/manager/pull/10537)) From bfb983f74181a5224083de54d06447bf529009cd Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Mon, 3 Jun 2024 17:26:54 -0400 Subject: [PATCH 5/7] Adjust changeset from Added --> Upcoming Features; remove duplicated constant --- ...82633416.md => pr-10537-upcoming-features-1717182633416.md} | 2 +- packages/manager/src/components/DiskEncryption/constants.tsx | 3 --- .../manager/src/features/Linodes/LinodeEntityDetailBody.tsx | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) rename packages/manager/.changeset/{pr-10537-added-1717182633416.md => pr-10537-upcoming-features-1717182633416.md} (77%) diff --git a/packages/manager/.changeset/pr-10537-added-1717182633416.md b/packages/manager/.changeset/pr-10537-upcoming-features-1717182633416.md similarity index 77% rename from packages/manager/.changeset/pr-10537-added-1717182633416.md rename to packages/manager/.changeset/pr-10537-upcoming-features-1717182633416.md index 2c24830f15f..0ffeb21d36f 100644 --- a/packages/manager/.changeset/pr-10537-added-1717182633416.md +++ b/packages/manager/.changeset/pr-10537-upcoming-features-1717182633416.md @@ -1,5 +1,5 @@ --- -"@linode/manager": Added +"@linode/manager": Upcoming Features --- Add Encrypted / Not Encrypted status to Linode Detail header ([#10537](https://github.com/linode/manager/pull/10537)) diff --git a/packages/manager/src/components/DiskEncryption/constants.tsx b/packages/manager/src/components/DiskEncryption/constants.tsx index 5b5395f8a0c..451859b7c85 100644 --- a/packages/manager/src/components/DiskEncryption/constants.tsx +++ b/packages/manager/src/components/DiskEncryption/constants.tsx @@ -25,6 +25,3 @@ export const DISK_ENCRYPTION_NODE_POOL_GUIDANCE_COPY = export const UNENCRYPTED_STANDARD_LINODE_GUIDANCE_COPY = 'Use Rebuild to enable or disable disk encryption.'; - -export const UNENCRYPTED_LKE_LINODE_GUIDANCE_COPY = - 'To enable disk encryption, delete the node pool and create a new node pool. New node pools are always encrypted.'; diff --git a/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx b/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx index fce8bc98dba..ea552bf409f 100644 --- a/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx +++ b/packages/manager/src/features/Linodes/LinodeEntityDetailBody.tsx @@ -7,7 +7,7 @@ import { HashLink } from 'react-router-hash-link'; import { Box } from 'src/components/Box'; import { - UNENCRYPTED_LKE_LINODE_GUIDANCE_COPY, + DISK_ENCRYPTION_NODE_POOL_GUIDANCE_COPY as UNENCRYPTED_LKE_LINODE_GUIDANCE_COPY, UNENCRYPTED_STANDARD_LINODE_GUIDANCE_COPY, } from 'src/components/DiskEncryption/constants'; import { useIsDiskEncryptionFeatureEnabled } from 'src/components/DiskEncryption/utils'; From 9dd1d2bbb625a2c20311cdf4e91a0c3b069568fb Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Tue, 4 Jun 2024 13:09:22 -0400 Subject: [PATCH 6/7] Revised copy for UNENCRYPTED_STANDARD_LINODE_GUIDANCE_COPY --- packages/manager/src/components/DiskEncryption/constants.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/manager/src/components/DiskEncryption/constants.tsx b/packages/manager/src/components/DiskEncryption/constants.tsx index 758757b1e99..539b19d3a6c 100644 --- a/packages/manager/src/components/DiskEncryption/constants.tsx +++ b/packages/manager/src/components/DiskEncryption/constants.tsx @@ -24,7 +24,7 @@ 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 = - 'Use Rebuild to enable or disable disk encryption.'; + 'Rebuild this Linode to enable or disable disk encryption.'; export const DISK_ENCRYPTION_IMAGES_CAVEAT_COPY = 'Virtual Machine Images are not encrypted.'; From 3f8bff45f6015bb69f15f7972d1280cb9042414b Mon Sep 17 00:00:00 2001 From: Dajahi Wiley Date: Tue, 4 Jun 2024 14:26:15 -0400 Subject: [PATCH 7/7] add to <Unlock /> and <Lock /> svg's --- packages/manager/src/assets/icons/lock.svg | 1 + packages/manager/src/assets/icons/unlock.svg | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/manager/src/assets/icons/lock.svg b/packages/manager/src/assets/icons/lock.svg index ca135909b4f..62caf228e55 100644 --- a/packages/manager/src/assets/icons/lock.svg +++ b/packages/manager/src/assets/icons/lock.svg @@ -1,3 +1,4 @@ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<title>Encrypted diff --git a/packages/manager/src/assets/icons/unlock.svg b/packages/manager/src/assets/icons/unlock.svg index ce413046282..ae99e8d9a24 100644 --- a/packages/manager/src/assets/icons/unlock.svg +++ b/packages/manager/src/assets/icons/unlock.svg @@ -1,4 +1,5 @@ +Not Encrypted