From b031c82408ba58f45a1a98d6a0983ee066a80c4a Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Wed, 14 Aug 2024 14:14:43 -0400 Subject: [PATCH 1/8] feat: [UIE-8054] - DBaaS enhancements 1 --- packages/api-v4/src/account/types.ts | 1 + packages/api-v4/src/databases/types.ts | 6 +- packages/api-v4/src/regions/types.ts | 1 + packages/manager/src/__data__/regionsData.ts | 5 ++ packages/manager/src/assets/icons/db-logo.svg | 23 ++++++++ .../src/components/PrimaryNav/PrimaryNav.tsx | 4 +- packages/manager/src/factories/account.ts | 2 +- packages/manager/src/factories/databases.ts | 57 +++++++++++++++---- .../DatabaseLanding/DatabaseLogo.tsx | 36 ++++++++++++ .../src/features/Databases/utilities.test.ts | 28 ++++++++- .../src/features/Databases/utilities.ts | 10 +++- .../SupportTicketProductSelectionFields.tsx | 4 +- packages/manager/src/mocks/serverHandlers.ts | 2 +- 13 files changed, 157 insertions(+), 22 deletions(-) create mode 100644 packages/manager/src/assets/icons/db-logo.svg create mode 100644 packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx diff --git a/packages/api-v4/src/account/types.ts b/packages/api-v4/src/account/types.ts index dad426d63d7..4e266b064e0 100644 --- a/packages/api-v4/src/account/types.ts +++ b/packages/api-v4/src/account/types.ts @@ -72,6 +72,7 @@ export type AccountCapability = | 'LKE HA Control Planes' | 'Machine Images' | 'Managed Databases' + | 'Managed Databases V2' | 'NodeBalancers' | 'Object Storage Access Key Regions' | 'Object Storage Endpoint Types' diff --git a/packages/api-v4/src/databases/types.ts b/packages/api-v4/src/databases/types.ts index 71c526be374..47eecc883c7 100644 --- a/packages/api-v4/src/databases/types.ts +++ b/packages/api-v4/src/databases/types.ts @@ -65,7 +65,7 @@ type MemberType = 'primary' | 'failover'; // DatabaseInstance is the interface for the shape of data returned by the /databases/instances endpoint. export interface DatabaseInstance { - id: number; + id: string; label: string; engine: Engine; type: string; @@ -81,9 +81,11 @@ export interface DatabaseInstance { * A key/value object where the key is an IP address and the value is a member type. */ members: Record; + platform?: string; } -export type ClusterSize = 1 | 3; +export type ClusterSize = 1 | 2 | 3; + type ReadonlyCount = 0 | 2; export type MySQLReplicationType = 'none' | 'semi_synch' | 'asynch'; diff --git a/packages/api-v4/src/regions/types.ts b/packages/api-v4/src/regions/types.ts index cb159254e95..c17934076bb 100644 --- a/packages/api-v4/src/regions/types.ts +++ b/packages/api-v4/src/regions/types.ts @@ -12,6 +12,7 @@ export type Capabilities = | 'Kubernetes' | 'Linodes' | 'Managed Databases' + | 'Managed Databases V2' | 'Metadata' | 'NodeBalancers' | 'Object Storage' diff --git a/packages/manager/src/__data__/regionsData.ts b/packages/manager/src/__data__/regionsData.ts index 0a3ab6eaf2e..836fbcafea7 100644 --- a/packages/manager/src/__data__/regionsData.ts +++ b/packages/manager/src/__data__/regionsData.ts @@ -98,6 +98,7 @@ export const regions: Region[] = [ 'Vlans', 'VPCs', 'Managed Databases', + 'Managed Databases V2', 'Metadata', 'Premium Plans', 'Placement Group', @@ -129,6 +130,7 @@ export const regions: Region[] = [ 'Vlans', 'VPCs', 'Managed Databases', + 'Managed Databases V2', 'Metadata', 'Premium Plans', ], @@ -484,6 +486,7 @@ export const regions: Region[] = [ 'VPCs', 'Block Storage Migrations', 'Managed Databases', + 'Managed Databases V2', 'Placement Group', ], country: 'us', @@ -511,6 +514,7 @@ export const regions: Region[] = [ 'Cloud Firewall', 'Block Storage Migrations', 'Managed Databases', + 'Managed Databases V2', 'Placement Group', ], country: 'us', @@ -542,6 +546,7 @@ export const regions: Region[] = [ 'VPCs', 'Block Storage Migrations', 'Managed Databases', + 'Managed Databases V2', 'Placement Group', ], country: 'us', diff --git a/packages/manager/src/assets/icons/db-logo.svg b/packages/manager/src/assets/icons/db-logo.svg new file mode 100644 index 00000000000..5776006d284 --- /dev/null +++ b/packages/manager/src/assets/icons/db-logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx b/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx index 65233b9bed3..8732c73f5cb 100644 --- a/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx +++ b/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx @@ -108,7 +108,7 @@ export const PrimaryNav = (props: PrimaryNavProps) => { const { isACLPEnabled } = useIsACLPEnabled(); const { isPlacementGroupsEnabled } = useIsPlacementGroupsEnabled(); - const { isDatabasesEnabled } = useIsDatabasesEnabled(); + const { isDatabasesEnabled, isDatabasesV2Enabled } = useIsDatabasesEnabled(); const prefetchMarketplace = () => { if (!enableMarketplacePrefetch) { @@ -187,7 +187,7 @@ export const PrimaryNav = (props: PrimaryNavProps) => { hide: !isDatabasesEnabled, href: '/databases', icon: , - isBeta: flags.databaseBeta, + isBeta: isDatabasesV2Enabled, }, { activeLinks: ['/kubernetes/create'], diff --git a/packages/manager/src/factories/account.ts b/packages/manager/src/factories/account.ts index eff241f37d5..241deeea45f 100644 --- a/packages/manager/src/factories/account.ts +++ b/packages/manager/src/factories/account.ts @@ -45,7 +45,7 @@ export const accountFactory = Factory.Sync.makeFactory({ 'Linodes', 'LKE HA Control Planes', 'Machine Images', - 'Managed Databases', + 'Managed Databases V2', 'NodeBalancers', 'Object Storage Access Key Regions', 'Object Storage Endpoint Types', diff --git a/packages/manager/src/factories/databases.ts b/packages/manager/src/factories/databases.ts index b9188b54d62..2c9634943e4 100644 --- a/packages/manager/src/factories/databases.ts +++ b/packages/manager/src/factories/databases.ts @@ -1,10 +1,12 @@ -import { +import type { + ClusterSize, Database, DatabaseBackup, DatabaseEngine, DatabaseInstance, DatabaseStatus, DatabaseType, + Engine, MySQLReplicationType, PostgresReplicationType, } from '@linode/api-v4/lib/databases/types'; @@ -35,10 +37,35 @@ export const possiblePostgresReplicationTypes: PostgresReplicationType[] = [ 'asynch', ]; +export const possibleTypes: string[] = [ + 'g6-nanode-1', + 'g6-standard-2', + 'g6-standard-4', + 'g6-standard-6', + 'g6-standard-20', + 'g6-dedicated-32', + 'g6-dedicated-50', + 'g6-dedicated-56', + 'g6-dedicated-64', +]; + +export const possibleRegions: string[] = [ + 'ap-south', + 'ap-southeast', + 'ap-west', + 'ca-central', + 'eu-central', + 'fr-par', + 'us-east', + 'us-iad', + 'us-ord', +]; + export const IPv4List = ['192.0.2.1', '196.0.0.0', '198.0.0.2']; export const databaseTypeFactory = Factory.Sync.makeFactory({ class: 'standard', + disk: Factory.each((i) => i * 20480), engines: { mongodb: [ { @@ -134,32 +161,38 @@ export const databaseTypeFactory = Factory.Sync.makeFactory({ ], }, id: Factory.each((i) => `g6-standard-${i}`), - disk: Factory.each((i) => i * 20480), label: Factory.each((i) => `Linode ${i} GB`), memory: Factory.each((i) => i * 2048), vcpus: Factory.each((i) => i * 2), }); +const adb10 = (i: number) => i % 2 === 0; + export const databaseInstanceFactory = Factory.Sync.makeFactory( { - cluster_size: Factory.each(() => pickRandom([1, 3])), + cluster_size: Factory.each((i) => + adb10(i) + ? ([1, 3][i % 2] as ClusterSize) + : ([1, 2, 3][i % 3] as ClusterSize) + ), created: '2021-12-09T17:15:12', - engine: 'mysql', + engine: Factory.each((i) => ['mysql', 'postgresql'][i % 2] as Engine), hosts: { - primary: 'db-mysql-primary-0.b.linodeb.net', - secondary: 'db-mysql-secondary-0.b.linodeb.net', + primary: 'db-primary-0.b.linodeb.net', + secondary: 'db-secondary-0.b.linodeb.net', }, - id: Factory.each((i) => i), + id: Factory.each((i) => (i % 2 ? i.toString() : `a${i}`)), instance_uri: '', - label: Factory.each((i) => `database-${i}`), + label: Factory.each((i) => `example.com-database-${i}`), members: { '2.2.2.2': 'primary', }, - region: 'us-east', - status: Factory.each(() => pickRandom(possibleStatuses)), - type: databaseTypeFactory.build().id, + platform: Factory.each((i) => (adb10(i) ? 'adb10' : 'adb20')), + region: Factory.each((i) => possibleRegions[i % possibleRegions.length]), + status: Factory.each((i) => possibleStatuses[i % possibleStatuses.length]), + type: Factory.each((i) => possibleTypes[i % possibleTypes.length]), updated: '2021-12-16T17:15:12', - version: '5.8.13', + version: Factory.each((i) => ['8.0.30', '15.7'][i % 2]), } ); diff --git a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx new file mode 100644 index 00000000000..b6f23eeb7b4 --- /dev/null +++ b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import Logo from 'src/assets/icons/db-logo.svg'; +import { BetaChip } from 'src/components/BetaChip/BetaChip'; +import { Box } from 'src/components/Box'; +import { Typography } from 'src/components/Typography'; + +interface BrandingProps { + style?: React.CSSProperties; +} + +export const DatabaseLogo = ({ style }: BrandingProps) => { + return ( + + + ({ + backgroundColor: '#727272', + color: '#ffffff', + })} + component="span" + /> + + Powered by + + + + ); +}; + +export default DatabaseLogo; diff --git a/packages/manager/src/features/Databases/utilities.test.ts b/packages/manager/src/features/Databases/utilities.test.ts index c7171996fcb..233b9eaea9d 100644 --- a/packages/manager/src/features/Databases/utilities.test.ts +++ b/packages/manager/src/features/Databases/utilities.test.ts @@ -23,7 +23,33 @@ describe('useIsDatabasesEnabled', () => { wrapper: wrapWithTheme, }); - await waitFor(() => expect(result.current.isDatabasesEnabled).toBe(true)); + await waitFor(() => { + expect(result.current.isDatabasesEnabled).toBe(true); + expect(result.current.isDatabasesV1Enabled).toBe(true); + expect(result.current.isDatabasesV2Enabled).toBe(false); + }); + }); + + it('should return true for an unrestricted user with the account capability V2', async () => { + const account = accountFactory.build({ + capabilities: ['Managed Databases V2'], + }); + + server.use( + http.get('*/v4/account', () => { + return HttpResponse.json(account); + }) + ); + + const { result } = renderHook(() => useIsDatabasesEnabled(), { + wrapper: wrapWithTheme, + }); + + await waitFor(() => { + expect(result.current.isDatabasesEnabled).toBe(true); + expect(result.current.isDatabasesV1Enabled).toBe(false); + expect(result.current.isDatabasesV2Enabled).toBe(true); + }); }); it('should return false for an unrestricted user without the account capability', async () => { diff --git a/packages/manager/src/features/Databases/utilities.ts b/packages/manager/src/features/Databases/utilities.ts index 6fa5593aeaa..9deb3c63ee2 100644 --- a/packages/manager/src/features/Databases/utilities.ts +++ b/packages/manager/src/features/Databases/utilities.ts @@ -26,8 +26,16 @@ export const useIsDatabasesEnabled = () => { const { data: engines } = useDatabaseEnginesQuery(checkRestrictedUser); if (account) { + const isDatabasesV1Enabled = account.capabilities.includes( + 'Managed Databases' + ); + const isDatabasesV2Enabled = account.capabilities.includes( + 'Managed Databases V2' + ); return { - isDatabasesEnabled: account.capabilities.includes('Managed Databases'), + isDatabasesEnabled: isDatabasesV1Enabled || isDatabasesV2Enabled, + isDatabasesV1Enabled, + isDatabasesV2Enabled, }; } diff --git a/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx b/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx index 57deb302df3..7773d4b2147 100644 --- a/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx +++ b/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx @@ -92,7 +92,7 @@ export const SupportTicketProductSelectionFields = (props: Props) => { isLoading: vpcsLoading, } = useAllVPCsQuery(entityType === 'vpc_id'); - const getEntityOptions = (): { label: string; value: number }[] => { + const getEntityOptions = (): { label: string; value: number | string }[] => { const reactQueryEntityDataMap = { database_id: databases, domain_id: domains, @@ -124,7 +124,7 @@ export const SupportTicketProductSelectionFields = (props: Props) => { return ( reactQueryEntityDataMap[entityType]?.map( - ({ id, label }: { id: number; label: string }) => ({ + ({ id, label }: { id: number | string; label: string }) => ({ label, value: id, }) diff --git a/packages/manager/src/mocks/serverHandlers.ts b/packages/manager/src/mocks/serverHandlers.ts index 8a1a0572734..a0fec0918d3 100644 --- a/packages/manager/src/mocks/serverHandlers.ts +++ b/packages/manager/src/mocks/serverHandlers.ts @@ -188,7 +188,7 @@ const entityTransfers = [ const databases = [ http.get('*/databases/instances', () => { - const databases = databaseInstanceFactory.buildList(5); + const databases = databaseInstanceFactory.buildList(9); return HttpResponse.json(makeResourcePage(databases)); }), From bc69b237300fb42a1d1cd0a555377c55f17a80c2 Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Wed, 14 Aug 2024 15:03:27 -0400 Subject: [PATCH 2/8] Added changeset: Update DBaaS menu item with V1 or V2 capability, add mock data --- packages/api-v4/.changeset/pr-10786-added-1723662117687.md | 5 +++++ .../.changeset/pr-10786-upcoming-features-1723662207016.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 packages/api-v4/.changeset/pr-10786-added-1723662117687.md create mode 100644 packages/manager/.changeset/pr-10786-upcoming-features-1723662207016.md diff --git a/packages/api-v4/.changeset/pr-10786-added-1723662117687.md b/packages/api-v4/.changeset/pr-10786-added-1723662117687.md new file mode 100644 index 00000000000..9a353c7be8a --- /dev/null +++ b/packages/api-v4/.changeset/pr-10786-added-1723662117687.md @@ -0,0 +1,5 @@ +--- +"@linode/api-v4": Added +--- + +Add DBaaS V2 capabilites ([#10786](https://github.com/linode/manager/pull/10786)) diff --git a/packages/manager/.changeset/pr-10786-upcoming-features-1723662207016.md b/packages/manager/.changeset/pr-10786-upcoming-features-1723662207016.md new file mode 100644 index 00000000000..60c3e568960 --- /dev/null +++ b/packages/manager/.changeset/pr-10786-upcoming-features-1723662207016.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Upcoming Features +--- + +Update DBaaS menu item with V1 or V2 capability, add mock data ([#10786](https://github.com/linode/manager/pull/10786)) From 9b0a2e4447c5b569edad452636838af5c1714719 Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Fri, 16 Aug 2024 11:38:27 -0400 Subject: [PATCH 3/8] Review comments --- packages/manager/src/factories/databases.ts | 2 +- ...atabaseResizeCurrentConfiguration.test.tsx | 4 +-- .../DatabaseLanding/DatabaseLogo.tsx | 33 ++++++++++++------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/packages/manager/src/factories/databases.ts b/packages/manager/src/factories/databases.ts index 2c9634943e4..501a8725501 100644 --- a/packages/manager/src/factories/databases.ts +++ b/packages/manager/src/factories/databases.ts @@ -222,7 +222,7 @@ export const databaseFactory = Factory.Sync.makeFactory({ ssl_connection: false, status: pickRandom(possibleStatuses), total_disk_size_gb: 15, - type: 'g6-standard-0', + type: 'g6-nanode-1', updated: '2021-12-16T17:15:12', updates: { day_of_week: 1, diff --git a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx index c94327ec954..00307ddfa9e 100644 --- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx +++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration.test.tsx @@ -28,7 +28,7 @@ describe('database current configuration section', () => { const standardTypes = [ databaseTypeFactory.build({ class: 'nanode', - id: 'g6-standard-0', + id: 'g6-nanode-1', label: `Nanode 1 GB`, memory: 1024, }), @@ -63,7 +63,7 @@ describe('database current configuration section', () => { getByText('1 GB'); getByText('CPUs'); - getByText('4'); + getByText('2'); getByText('Total Disk Size'); getByText('15 GB'); diff --git a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx index b6f23eeb7b4..fc4c25a20c7 100644 --- a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx +++ b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx @@ -1,31 +1,40 @@ -import React from 'react'; +import * as React from 'react'; +import { makeStyles } from 'tss-react/mui'; import Logo from 'src/assets/icons/db-logo.svg'; import { BetaChip } from 'src/components/BetaChip/BetaChip'; import { Box } from 'src/components/Box'; import { Typography } from 'src/components/Typography'; -interface BrandingProps { +import type { Theme } from '@mui/material/styles'; + +interface Props { style?: React.CSSProperties; } -export const DatabaseLogo = ({ style }: BrandingProps) => { +const useStyles = makeStyles()((theme: Theme) => ({ + betaChip: { + backgroundColor: '#727272', + color: theme.color.white, + }, + logo: { + color: '#32363C', + display: 'flex', + marginTop: '8px', + }, +})); + +export const DatabaseLogo = ({ style }: Props) => { + const { classes } = useStyles(); return ( - ({ - backgroundColor: '#727272', - color: '#ffffff', - })} - component="span" - /> - + + Powered by From 67a1726f8850792cdb7a9a09ffc87caabb49af45 Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Fri, 16 Aug 2024 16:54:59 -0400 Subject: [PATCH 4/8] feature flag --- .../src/components/PrimaryNav/PrimaryNav.tsx | 6 +++--- .../manager/src/dev-tools/FeatureFlagTool.tsx | 2 ++ packages/manager/src/featureFlags.ts | 1 + .../Databases/DatabaseCreate/DatabaseCreate.tsx | 17 +---------------- .../manager/src/features/Databases/utilities.ts | 10 +++++++--- 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx b/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx index 8732c73f5cb..e28aca7b644 100644 --- a/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx +++ b/packages/manager/src/components/PrimaryNav/PrimaryNav.tsx @@ -108,7 +108,7 @@ export const PrimaryNav = (props: PrimaryNavProps) => { const { isACLPEnabled } = useIsACLPEnabled(); const { isPlacementGroupsEnabled } = useIsPlacementGroupsEnabled(); - const { isDatabasesEnabled, isDatabasesV2Enabled } = useIsDatabasesEnabled(); + const { isDatabasesEnabled } = useIsDatabasesEnabled(); const prefetchMarketplace = () => { if (!enableMarketplacePrefetch) { @@ -187,7 +187,7 @@ export const PrimaryNav = (props: PrimaryNavProps) => { hide: !isDatabasesEnabled, href: '/databases', icon: , - isBeta: isDatabasesV2Enabled, + isBeta: flags.dbaasV2?.beta, }, { activeLinks: ['/kubernetes/create'], @@ -249,7 +249,7 @@ export const PrimaryNav = (props: PrimaryNavProps) => { isDatabasesEnabled, isManaged, allowMarketplacePrefetch, - flags.databaseBeta, + flags.dbaasV2, isPlacementGroupsEnabled, flags.placementGroups, isACLPEnabled, diff --git a/packages/manager/src/dev-tools/FeatureFlagTool.tsx b/packages/manager/src/dev-tools/FeatureFlagTool.tsx index 3de0659ba92..67de298235c 100644 --- a/packages/manager/src/dev-tools/FeatureFlagTool.tsx +++ b/packages/manager/src/dev-tools/FeatureFlagTool.tsx @@ -32,6 +32,8 @@ const options: { flag: keyof Flags; label: string }[] = [ { flag: 'placementGroups', label: 'Placement Groups' }, { flag: 'selfServeBetas', label: 'Self Serve Betas' }, { flag: 'supportTicketSeverity', label: 'Support Ticket Severity' }, + { flag: 'dbaasV2', label: 'Databases V2 Beta' }, + { flag: 'databaseResize', label: 'Database Resize' }, ]; export const FeatureFlagTool = withFeatureFlagProvider(() => { diff --git a/packages/manager/src/featureFlags.ts b/packages/manager/src/featureFlags.ts index d534c64be97..97a136364c0 100644 --- a/packages/manager/src/featureFlags.ts +++ b/packages/manager/src/featureFlags.ts @@ -90,6 +90,7 @@ export interface Flags { databaseBeta: boolean; databaseResize: boolean; databases: boolean; + dbaasV2: BetaFeatureFlag; disableLargestGbPlans: boolean; eventMessagesV2: boolean; gecko: boolean; // @TODO gecko: delete this after next release diff --git a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx index db6e037c3dd..d80243be3aa 100644 --- a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx +++ b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx @@ -452,7 +452,7 @@ const DatabaseCreate = () => { }, ], labelOptions: { - suffixComponent: flags.databaseBeta ? ( + suffixComponent: flags.dbaasV2?.beta ? ( ) : null, }, @@ -564,21 +564,6 @@ const DatabaseCreate = () => { ))} - - {flags.databaseBeta ? ( - - - Notice: There is no charge for database clusters during beta. - {' '} - Database clusters will be subject to charges when the beta - period ends on May 2nd, 2022.{' '} - - View pricing - - . - - ) : undefined} - diff --git a/packages/manager/src/features/Databases/utilities.ts b/packages/manager/src/features/Databases/utilities.ts index 9deb3c63ee2..73e64f1f8e3 100644 --- a/packages/manager/src/features/Databases/utilities.ts +++ b/packages/manager/src/features/Databases/utilities.ts @@ -1,3 +1,4 @@ +import { useFlags } from 'src/hooks/useFlags'; import { useAccount } from 'src/queries/account/account'; import { useDatabaseEnginesQuery } from 'src/queries/databases/databases'; @@ -24,14 +25,17 @@ export const useIsDatabasesEnabled = () => { const checkRestrictedUser = !account; const { data: engines } = useDatabaseEnginesQuery(checkRestrictedUser); + const flags = useFlags(); if (account) { const isDatabasesV1Enabled = account.capabilities.includes( 'Managed Databases' ); - const isDatabasesV2Enabled = account.capabilities.includes( - 'Managed Databases V2' - ); + + const isDatabasesV2Enabled = + account.capabilities.includes('Managed Databases V2') && + flags.dbaasV2?.enabled; + return { isDatabasesEnabled: isDatabasesV1Enabled || isDatabasesV2Enabled, isDatabasesV1Enabled, From cb9d2811717e12d51a76c86c5f41cd80b6ecd80a Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Thu, 22 Aug 2024 11:33:46 -0400 Subject: [PATCH 5/8] review comments --- .../.changeset/pr-10786-added-1723662117687.md | 2 +- .../DatabaseResize/DatabaseResize.test.tsx | 4 ++-- .../manager/src/features/Databases/utilities.test.ts | 12 +++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/api-v4/.changeset/pr-10786-added-1723662117687.md b/packages/api-v4/.changeset/pr-10786-added-1723662117687.md index 9a353c7be8a..960ca5330b4 100644 --- a/packages/api-v4/.changeset/pr-10786-added-1723662117687.md +++ b/packages/api-v4/.changeset/pr-10786-added-1723662117687.md @@ -2,4 +2,4 @@ "@linode/api-v4": Added --- -Add DBaaS V2 capabilites ([#10786](https://github.com/linode/manager/pull/10786)) +Managed Databases V2` capability and types ([#10786](https://github.com/linode/manager/pull/10786)) diff --git a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx index 820807f5139..f9ed2e10136 100644 --- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx +++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx @@ -38,7 +38,7 @@ describe('database resize', () => { const standardTypes = [ databaseTypeFactory.build({ class: 'nanode', - id: 'g6-standard-0', + id: 'g6-nanode-1', label: `Nanode 1 GB`, memory: 1024, }), @@ -75,7 +75,7 @@ describe('database resize', () => { const standardTypes = [ databaseTypeFactory.build({ class: 'nanode', - id: 'g6-standard-0', + id: 'g6-nanode-1', label: `Nanode 1 GB`, memory: 1024, }), diff --git a/packages/manager/src/features/Databases/utilities.test.ts b/packages/manager/src/features/Databases/utilities.test.ts index 233b9eaea9d..dd981780f18 100644 --- a/packages/manager/src/features/Databases/utilities.test.ts +++ b/packages/manager/src/features/Databases/utilities.test.ts @@ -8,7 +8,7 @@ import { wrapWithTheme } from 'src/utilities/testHelpers'; import { useIsDatabasesEnabled } from './utilities'; describe('useIsDatabasesEnabled', () => { - it('should return true for an unrestricted user with the account capability', async () => { + it('should return true for an unrestricted user with the account capability V1', async () => { const account = accountFactory.build({ capabilities: ['Managed Databases'], }); @@ -20,7 +20,10 @@ describe('useIsDatabasesEnabled', () => { ); const { result } = renderHook(() => useIsDatabasesEnabled(), { - wrapper: wrapWithTheme, + wrapper: (ui) => + wrapWithTheme(ui, { + flags: { dbaasV2: { beta: false, enabled: false } }, + }), }); await waitFor(() => { @@ -42,7 +45,10 @@ describe('useIsDatabasesEnabled', () => { ); const { result } = renderHook(() => useIsDatabasesEnabled(), { - wrapper: wrapWithTheme, + wrapper: (ui) => + wrapWithTheme(ui, { + flags: { dbaasV2: { beta: true, enabled: true } }, + }), }); await waitFor(() => { From 05dfa2ee04006a6bba961a00bcbd2696611d2595 Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Thu, 22 Aug 2024 11:44:18 -0400 Subject: [PATCH 6/8] review comments --- .../src/features/Databases/DatabaseCreate/DatabaseCreate.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx index d80243be3aa..349347ce978 100644 --- a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx +++ b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx @@ -76,6 +76,7 @@ const useStyles = makeStyles()((theme: Theme) => ({ }, }, chip: { + marginLeft: 6, marginTop: 4, }, createBtn: { From b23641bc1477d009d8a51752be055188a30be5c4 Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Fri, 23 Aug 2024 10:30:58 -0400 Subject: [PATCH 7/8] review comments --- packages/api-v4/src/databases/types.ts | 2 +- packages/manager/src/factories/databases.ts | 11 ++++++----- .../Databases/DatabaseLanding/DatabaseLogo.tsx | 2 -- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/api-v4/src/databases/types.ts b/packages/api-v4/src/databases/types.ts index 47eecc883c7..3221a8c61b6 100644 --- a/packages/api-v4/src/databases/types.ts +++ b/packages/api-v4/src/databases/types.ts @@ -65,7 +65,7 @@ type MemberType = 'primary' | 'failover'; // DatabaseInstance is the interface for the shape of data returned by the /databases/instances endpoint. export interface DatabaseInstance { - id: string; + id: number; label: string; engine: Engine; type: string; diff --git a/packages/manager/src/factories/databases.ts b/packages/manager/src/factories/databases.ts index 501a8725501..87ee964126f 100644 --- a/packages/manager/src/factories/databases.ts +++ b/packages/manager/src/factories/databases.ts @@ -1,3 +1,8 @@ +import { v4 } from 'uuid'; + +import Factory from 'src/factories/factoryProxy'; +import { pickRandom, randomDate } from 'src/utilities/random'; + import type { ClusterSize, Database, @@ -10,10 +15,6 @@ import type { MySQLReplicationType, PostgresReplicationType, } from '@linode/api-v4/lib/databases/types'; -import Factory from 'src/factories/factoryProxy'; -import { v4 } from 'uuid'; - -import { pickRandom, randomDate } from 'src/utilities/random'; // These are not all of the possible statuses, but these are some common ones. export const possibleStatuses: DatabaseStatus[] = [ @@ -181,7 +182,7 @@ export const databaseInstanceFactory = Factory.Sync.makeFactory (i % 2 ? i.toString() : `a${i}`)), + id: Factory.each((i) => i), instance_uri: '', label: Factory.each((i) => `example.com-database-${i}`), members: { diff --git a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx index fc4c25a20c7..bce0caa0a2b 100644 --- a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx +++ b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLogo.tsx @@ -41,5 +41,3 @@ export const DatabaseLogo = ({ style }: Props) => { ); }; - -export default DatabaseLogo; From 33488a8ace8e49cba9f4bbd4df9a8e223b4c18d5 Mon Sep 17 00:00:00 2001 From: Conal Ryan Date: Fri, 23 Aug 2024 12:02:43 -0400 Subject: [PATCH 8/8] review comments --- .../SupportTickets/SupportTicketProductSelectionFields.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx b/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx index 7773d4b2147..57deb302df3 100644 --- a/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx +++ b/packages/manager/src/features/Support/SupportTickets/SupportTicketProductSelectionFields.tsx @@ -92,7 +92,7 @@ export const SupportTicketProductSelectionFields = (props: Props) => { isLoading: vpcsLoading, } = useAllVPCsQuery(entityType === 'vpc_id'); - const getEntityOptions = (): { label: string; value: number | string }[] => { + const getEntityOptions = (): { label: string; value: number }[] => { const reactQueryEntityDataMap = { database_id: databases, domain_id: domains, @@ -124,7 +124,7 @@ export const SupportTicketProductSelectionFields = (props: Props) => { return ( reactQueryEntityDataMap[entityType]?.map( - ({ id, label }: { id: number | string; label: string }) => ({ + ({ id, label }: { id: number; label: string }) => ({ label, value: id, })