diff --git a/packages/manager/.changeset/pr-11180-changed-1730803608188.md b/packages/manager/.changeset/pr-11180-changed-1730803608188.md
new file mode 100644
index 00000000000..53ae4f23340
--- /dev/null
+++ b/packages/manager/.changeset/pr-11180-changed-1730803608188.md
@@ -0,0 +1,5 @@
+---
+"@linode/manager": Changed
+---
+
+Refactored DatabaseResize to use shared components for node selection and summary section. ([#11180](https://github.com/linode/manager/pull/11180))
diff --git a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx
index d2407183f9a..06bc649e980 100644
--- a/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx
+++ b/packages/manager/src/features/Databases/DatabaseCreate/DatabaseCreate.tsx
@@ -138,7 +138,7 @@ const DatabaseCreate = () => {
...values,
allow_list: _allow_list,
};
- if (isDatabasesV2Enabled || isDatabasesV2GA) {
+ if (isDatabasesV2Enabled) {
delete createPayload.replication_type;
}
try {
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 a29ae8a5bfe..b8b17ed60a8 100644
--- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx
+++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.test.tsx
@@ -2,6 +2,7 @@ import {
queryByAttribute,
waitForElementToBeRemoved,
} from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
import { createMemoryHistory } from 'history';
import * as React from 'react';
import { Router } from 'react-router-dom';
@@ -16,7 +17,6 @@ import { HttpResponse, http, server } from 'src/mocks/testServer';
import { mockMatchMedia, renderWithTheme } from 'src/utilities/testHelpers';
import { DatabaseResize } from './DatabaseResize';
-import userEvent from '@testing-library/user-event';
const loadingTestId = 'circle-progress';
@@ -169,6 +169,20 @@ describe('database resize', () => {
});
describe('on rendering of page and isDatabasesV2GA is true and the Shared CPU tab is preselected ', () => {
+ const mockDatabase = databaseFactory.build({
+ cluster_size: 3,
+ engine: 'mysql',
+ platform: 'rdbms-default',
+ type: 'g6-nanode-1',
+ });
+
+ const flags = {
+ dbaasV2: {
+ beta: false,
+ enabled: true,
+ },
+ };
+
beforeEach(() => {
// Mock database types
const standardTypes = [
@@ -206,17 +220,6 @@ describe('database resize', () => {
});
it('should render set node section', async () => {
- const flags = {
- dbaasV2: {
- beta: false,
- enabled: true,
- },
- };
- const mockDatabase = databaseFactory.build({
- cluster_size: 3,
- type: 'g6-nanode-1',
- engine: 'mysql',
- });
const { getByTestId, getByText } = renderWithTheme(
,
{ flags }
@@ -232,16 +235,6 @@ describe('database resize', () => {
});
it('should render the correct number of node radio buttons, associated costs, and summary', async () => {
- const flags = {
- dbaasV2: {
- beta: false,
- enabled: true,
- },
- };
- const mockDatabase = databaseFactory.build({
- cluster_size: 3,
- type: 'g6-nanode-1',
- });
const { getByTestId } = renderWithTheme(
,
{ flags }
@@ -252,10 +245,12 @@ describe('database resize', () => {
expect(nodeRadioBtns).toHaveTextContent('$60/month $0.09/hr');
expect(nodeRadioBtns).toHaveTextContent('$140/month $0.21/hr');
- const expectedCurrentSummary =
- 'Current Cluster: New DBaaS - Nanode 1 GB $60/month 3 Nodes - HA $140/month';
const currentSummary = getByTestId('currentSummary');
- expect(currentSummary).toHaveTextContent(expectedCurrentSummary);
+ const selectedPlanText =
+ 'Current Cluster: New DBaaS - Nanode 1 GB $60/month';
+ expect(currentSummary).toHaveTextContent(selectedPlanText);
+ const selectedNodesText = '3 Nodes - HA $140/month';
+ expect(currentSummary).toHaveTextContent(selectedNodesText);
const expectedResizeSummary =
'Resized Cluster: Please select a plan or set the number of nodes.';
@@ -264,16 +259,6 @@ describe('database resize', () => {
});
it('should preselect cluster size in Set Number of Nodes', async () => {
- const flags = {
- dbaasV2: {
- beta: false,
- enabled: true,
- },
- };
- const mockDatabase = databaseFactory.build({
- cluster_size: 3,
- type: 'g6-nanode-1',
- });
const { getByTestId } = renderWithTheme(
,
{ flags }
@@ -286,16 +271,6 @@ describe('database resize', () => {
});
it('should disable visible lower node selections', async () => {
- const flags = {
- dbaasV2: {
- beta: false,
- enabled: true,
- },
- };
- const mockDatabase = databaseFactory.build({
- cluster_size: 3,
- type: 'g6-nanode-1',
- });
const { getByTestId } = renderWithTheme(
,
{ flags }
@@ -307,14 +282,9 @@ describe('database resize', () => {
});
it('should set price, enable resize button, and update resize summary when a new number of nodes is selected', async () => {
- const flags = {
- dbaasV2: {
- beta: false,
- enabled: true,
- },
- };
const mockDatabase = databaseFactory.build({
cluster_size: 1,
+ platform: 'rdbms-default',
type: 'g6-nanode-1',
});
const { getByTestId, getByText } = renderWithTheme(
@@ -331,21 +301,18 @@ describe('database resize', () => {
) as HTMLButtonElement;
expect(resizeButton.disabled).toBeFalsy();
- const expectedSummaryText =
- 'Resized Cluster: New DBaaS - Nanode 1 GB $60/month 3 Nodes - HA $140/month';
const summary = getByTestId('resizeSummary');
- expect(summary).toHaveTextContent(expectedSummaryText);
+ const selectedPlanText =
+ 'Resized Cluster: New DBaaS - Nanode 1 GB $60/month';
+ expect(summary).toHaveTextContent(selectedPlanText);
+ const selectedNodesText = '3 Nodes - HA $140/month';
+ expect(summary).toHaveTextContent(selectedNodesText);
});
it('should disable the resize button if node selection is set back to current', async () => {
- const flags = {
- dbaasV2: {
- beta: false,
- enabled: true,
- },
- };
const mockDatabase = databaseFactory.build({
cluster_size: 1,
+ platform: 'rdbms-default',
type: 'g6-nanode-1',
});
const { getByTestId, getByText } = renderWithTheme(
@@ -416,8 +383,9 @@ describe('database resize', () => {
it('should render node selection for dedicated tab with default summary', async () => {
const mockDatabase = databaseFactory.build({
- type: 'g6-dedicated-2',
cluster_size: 3,
+ platform: 'rdbms-default',
+ type: 'g6-dedicated-2',
});
const flags = {
@@ -441,8 +409,9 @@ describe('database resize', () => {
it('should disable lower node selections', async () => {
const mockDatabase = databaseFactory.build({
- type: 'g6-dedicated-2',
cluster_size: 3,
+ platform: 'rdbms-default',
+ type: 'g6-dedicated-2',
});
const flags = {
@@ -452,8 +421,14 @@ describe('database resize', () => {
},
};
+ // Mock route history so the Plan Selection table displays prices without requiring a region in the DB resize flow.
+ const history = createMemoryHistory();
+ history.push(`databases/${database.engine}/${database.id}/resize`);
+
const { getByTestId } = renderWithTheme(
- ,
+
+
+ ,
{ flags }
);
expect(getByTestId(loadingTestId)).toBeInTheDocument();
diff --git a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.tsx b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.tsx
index d18366b16a6..89e06beb12f 100644
--- a/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.tsx
+++ b/packages/manager/src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResize.tsx
@@ -2,34 +2,29 @@ import { Box, Paper } from '@linode/ui';
import { useSnackbar } from 'notistack';
import * as React from 'react';
import { useHistory } from 'react-router-dom';
-import { makeStyles } from 'tss-react/mui';
import { CircleProgress } from 'src/components/CircleProgress';
import { Divider } from 'src/components/Divider';
import { ErrorState } from 'src/components/ErrorState/ErrorState';
-import { FormControlLabel } from 'src/components/FormControlLabel';
import { Notice } from 'src/components/Notice/Notice';
-import { Radio } from 'src/components/Radio/Radio';
-import { RadioGroup } from 'src/components/RadioGroup';
import { TypeToConfirmDialog } from 'src/components/TypeToConfirmDialog/TypeToConfirmDialog';
import { Typography } from 'src/components/Typography';
-import { StyledChip } from 'src/features/components/PlansPanel/PlanSelection.styles';
import { determineInitialPlanCategoryTab } from 'src/features/components/PlansPanel/utils';
+import { DatabaseNodeSelector } from 'src/features/Databases/DatabaseCreate/DatabaseNodeSelector';
+import { DatabaseSummarySection } from 'src/features/Databases/DatabaseCreate/DatabaseSummarySection';
+import { DatabaseResizeCurrentConfiguration } from 'src/features/Databases/DatabaseDetail/DatabaseResize/DatabaseResizeCurrentConfiguration';
+import { useIsDatabasesEnabled } from 'src/features/Databases/utilities';
import { typeLabelDetails } from 'src/features/Linodes/presentation';
-import { useDatabaseTypesQuery } from 'src/queries/databases/databases';
import { useDatabaseMutation } from 'src/queries/databases/databases';
+import { useDatabaseTypesQuery } from 'src/queries/databases/databases';
import { formatStorageUnits } from 'src/utilities/formatStorageUnits';
-import { useIsDatabasesEnabled } from '../../utilities';
import {
StyledGrid,
- StyledPlanSummarySpan,
StyledPlansPanel,
StyledResizeButton,
} from './DatabaseResize.style';
-import { DatabaseResizeCurrentConfiguration } from './DatabaseResizeCurrentConfiguration';
-import type { NodePricing } from '../../DatabaseCreate/DatabaseNodeSelector';
import type {
ClusterSize,
Database,
@@ -39,56 +34,19 @@ import type {
Engine,
UpdateDatabasePayload,
} from '@linode/api-v4';
-import type { Theme } from '@mui/material/styles';
import type { PlanSelectionWithDatabaseType } from 'src/features/components/PlansPanel/types';
-const useStyles = makeStyles()((theme: Theme) => ({
- disabledOptionLabel: {
- color:
- theme.palette.mode === 'dark' ? theme.color.grey6 : theme.color.grey1,
- },
- formControlLabel: {
- marginBottom: theme.spacing(),
- },
- nodeSpanSpacing: {
- marginRight: theme.spacing(1),
- },
- summarySpanBorder: {
- borderRight: `1px solid ${theme.borderColors.borderTypography}`,
- color: theme.textColors.tableStatic,
- marginLeft: theme.spacing(1),
- marginRight: theme.spacing(1),
- paddingRight: theme.spacing(1),
- },
-}));
-
interface Props {
database: Database;
disabled?: boolean;
}
export const DatabaseResize = ({ database, disabled = false }: Props) => {
- const { classes } = useStyles();
const history = useHistory();
- const [planSelected, setPlanSelected] = React.useState(
- database.type
- );
- const [summaryText, setSummaryText] = React.useState<{
- basePrice: string;
- numberOfNodes: ClusterSize;
- plan: string;
- price: string;
- }>();
- const [nodePricing, setNodePricing] = React.useState<
- NodePricing | undefined
- >();
- // This will be set to `false` once one of the configuration is selected from available plan. This is used to disable the
- // "Resize" button unless there have been changes to the form.
- const [
- shouldSubmitBeDisabled,
- setShouldSubmitBeDisabled,
- ] = React.useState(true);
+ const [selectedPlanId, setSelectedPlanId] = React.useState<
+ string | undefined
+ >(database.type);
const [
isResizeConfirmationDialogOpen,
@@ -96,7 +54,9 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
] = React.useState(false);
const [selectedTab, setSelectedTab] = React.useState(0);
- const { isDatabasesV2Enabled, isDatabasesV2GA } = useIsDatabasesEnabled();
+ const { isDatabasesV2GA } = useIsDatabasesEnabled();
+ const isNewDatabaseGA =
+ isDatabasesV2GA && database.platform !== 'rdbms-legacy';
const [clusterSize, setClusterSize] = React.useState(
database.cluster_size
);
@@ -122,8 +82,8 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
payload.cluster_size = clusterSize;
}
- if (planSelected) {
- payload.type = planSelected;
+ if (selectedPlanId) {
+ payload.type = selectedPlanId;
}
updateDatabase(payload).then(() => {
@@ -144,49 +104,51 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
>
);
- const resizeSummary = (
- ({
- marginTop: theme.spacing(2),
- })}
- data-testid="resizeSummary"
- >
- {summaryText ? (
- <>
-
- {isDatabasesV2GA
- ? 'Resized Cluster: ' + summaryText.plan
- : summaryText.plan}
- {' '}
- {isDatabasesV2GA ? (
-
- {summaryText.basePrice}
-
- ) : null}
-
- {' '}
- {summaryText.numberOfNodes} Node
- {summaryText.numberOfNodes > 1 ? 's' : ''}
- {!isDatabasesV2GA ? ': ' : ' - HA '}
-
- {summaryText.price}
- >
- ) : isDatabasesV2GA ? (
- <>
- Resized Cluster: Please
- select a plan or set the number of nodes.
- >
- ) : (
- 'Please select a plan.'
- )}
-
- );
+ const selectedEngine = database.engine.split('/')[0] as Engine;
+
+ const summaryText = React.useMemo(() => {
+ const nodeSelected = clusterSize && clusterSize > database.cluster_size;
+
+ const isSamePlanSelected = selectedPlanId === database.type;
+ if (!dbTypes) {
+ return undefined;
+ }
+ // Set default message and disable submit when no new selection is made
+ if (!nodeSelected && (!selectedPlanId || isSamePlanSelected)) {
+ return undefined;
+ }
+
+ const selectedPlanType = dbTypes.find(
+ (type: DatabaseType) => type.id === selectedPlanId
+ );
+
+ if (!selectedPlanType || !clusterSize) {
+ return undefined;
+ }
+
+ const price = selectedPlanType.engines[selectedEngine].find(
+ (cluster: DatabaseClusterSizeObject) => cluster.quantity === clusterSize
+ )?.price as DatabasePriceObject;
+ const resizeBasePrice = selectedPlanType.engines[selectedEngine][0]
+ .price as DatabasePriceObject;
+ const currentPlanPrice = `$${resizeBasePrice?.monthly}/month`;
+
+ return {
+ basePrice: currentPlanPrice,
+ numberOfNodes: clusterSize,
+ plan: formatStorageUnits(selectedPlanType.label),
+ price: isNewDatabaseGA
+ ? `$${price?.monthly}/month`
+ : `$${price?.monthly}/month or $${price?.hourly}/hour`,
+ };
+ }, [selectedPlanId, clusterSize, selectedTab]);
const costSummary = (
{`The cost of the resized database is ${summaryText?.price}.`}
);
+
const confirmationPopUpMessage =
database.cluster_size === 1 ? (
<>
@@ -204,93 +166,6 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
>
);
- const setSummaryAndPrices = (
- databaseTypeId: string,
- engine: Engine,
- dbTypes: DatabaseType[]
- ) => {
- const selectedPlanType = dbTypes.find(
- (type: DatabaseType) => type.id === databaseTypeId
- );
- if (selectedPlanType) {
- // When plan is found, set node pricing
- const nodePricingDetails = {
- double: selectedPlanType.engines[engine]?.find(
- (cluster: DatabaseClusterSizeObject) => cluster.quantity === 2
- )?.price,
- multi: selectedPlanType.engines[engine]?.find(
- (cluster: DatabaseClusterSizeObject) => cluster.quantity === 3
- )?.price,
- single: selectedPlanType.engines[engine]?.find(
- (cluster: DatabaseClusterSizeObject) => cluster.quantity === 1
- )?.price,
- };
- setNodePricing(nodePricingDetails);
- } else {
- // If plan is not found, clear plan selection
- setPlanSelected(undefined);
- }
-
- if (!selectedPlanType || !clusterSize) {
- setSummaryText(undefined);
- setShouldSubmitBeDisabled(true);
- return;
- }
-
- const price = selectedPlanType.engines[engine].find(
- (cluster: DatabaseClusterSizeObject) => cluster.quantity === clusterSize
- )?.price as DatabasePriceObject;
- const resizeBasePrice = selectedPlanType.engines[engine][0]
- .price as DatabasePriceObject;
- const currentPlanPrice = `$${resizeBasePrice?.monthly}/month`;
-
- setSummaryText({
- basePrice: currentPlanPrice,
- numberOfNodes: clusterSize,
- plan: formatStorageUnits(selectedPlanType.label),
- price: isDatabasesV2GA
- ? `$${price?.monthly}/month`
- : `$${price?.monthly}/month or $${price?.hourly}/hour`,
- });
-
- setShouldSubmitBeDisabled(false);
- return;
- };
-
- React.useEffect(() => {
- const nodeSelected = clusterSize && clusterSize > database.cluster_size;
- const isSamePlanSelected = planSelected === database.type;
- if (!dbTypes) {
- return;
- }
- // Set default message and disable submit when no new selection is made
- if (!nodeSelected && (!planSelected || isSamePlanSelected)) {
- setShouldSubmitBeDisabled(true);
- setSummaryText(undefined);
- return;
- }
- const engineType = database.engine.split('/')[0] as Engine;
- // When only a higher node selection is made and plan has not been changed
- if (isDatabasesV2GA && nodeSelected && isSamePlanSelected) {
- setSummaryAndPrices(database.type, engineType, dbTypes);
- }
- // No plan selection or plan selection is unchanged
- if (!planSelected || isSamePlanSelected) {
- return;
- }
- // When a new plan is selected
- setSummaryAndPrices(planSelected, engineType, dbTypes);
- }, [
- dbTypes,
- database.engine,
- database.type,
- planSelected,
- database.cluster_size,
- clusterSize,
- ]);
-
- const selectedEngine = database.engine.split('/')[0] as Engine;
-
const displayTypes: PlanSelectionWithDatabaseType[] = React.useMemo(() => {
if (!dbTypes) {
return [];
@@ -321,78 +196,36 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
}, [database.cluster_size, dbTypes, selectedEngine]);
const currentPlan = displayTypes?.find((type) => type.id === database.type);
- const currentPlanDisk = currentPlan ? currentPlan.disk : 0;
- const disabledPlans = displayTypes?.filter((type) =>
- type.class === 'dedicated'
- ? type.disk < currentPlanDisk
- : type.disk <= currentPlanDisk
- );
- const currentEngine = database.engine.split('/')[0] as Engine;
- const currentPrice = currentPlan?.engines[currentEngine].find(
- (cluster: DatabaseClusterSizeObject) =>
- cluster.quantity === database.cluster_size
- )?.price as DatabasePriceObject;
- const currentBasePrice = currentPlan?.engines[currentEngine][0]
- .price as DatabasePriceObject;
- const currentNodePrice = `$${currentPrice?.monthly}/month`;
- const currentPlanPrice = `$${currentBasePrice?.monthly}/month`;
- const currentSummary = (
-
-
- Current Cluster: {currentPlan?.heading}
- {' '}
-
- {currentPlanPrice}
-
-
- {' '}
- {database.cluster_size} Node
- {database.cluster_size > 1 ? 's - HA ' : ' '}
-
- {currentNodePrice}
-
- );
-
- const isDisabledSharedTab = database.cluster_size === 2;
React.useEffect(() => {
const initialTab = determineInitialPlanCategoryTab(
displayTypes,
- planSelected,
+ database.type,
currentPlan?.heading
);
setSelectedTab(initialTab);
+ }, [database.type, displayTypes]);
- if (isDatabasesV2GA) {
- const engineType = database.engine.split('/')[0] as Engine;
- const nodePricingDetails = {
- double: currentPlan?.engines[engineType]?.find(
- (cluster: DatabaseClusterSizeObject) => cluster.quantity === 2
- )?.price,
- multi: currentPlan?.engines[engineType]?.find(
- (cluster: DatabaseClusterSizeObject) => cluster.quantity === 3
- )?.price,
- single: currentPlan?.engines[engineType]?.find(
- (cluster: DatabaseClusterSizeObject) => cluster.quantity === 1
- )?.price,
- };
- setNodePricing(nodePricingDetails);
- }
- }, [dbTypes, displayTypes]);
+ const currentPlanDisk = currentPlan ? currentPlan.disk : 0;
+ const disabledPlans = displayTypes?.filter((type) =>
+ type.class === 'dedicated'
+ ? type.disk < currentPlanDisk
+ : type.disk <= currentPlanDisk
+ );
+ const isDisabledSharedTab = database.cluster_size === 2;
+
+ const shouldSubmitBeDisabled = React.useMemo(() => {
+ return !summaryText;
+ }, [summaryText]);
- const handleNodeChange = (
- event: React.ChangeEvent
- ): void => {
- const size = Number(event.currentTarget.value) as ClusterSize;
+ const handleNodeChange = (size: ClusterSize | undefined): void => {
const selectedPlanTab = determineInitialPlanCategoryTab(
displayTypes,
- planSelected
+ selectedPlanId
);
// If 2 Nodes is selected for an incompatible plan, clear selected plan and related information
if (size === 2 && selectedPlanTab !== 0) {
- setNodePricing(undefined);
- setPlanSelected(undefined);
- setSummaryText(undefined);
+ setSelectedPlanId(undefined);
}
setClusterSize(size);
};
@@ -401,95 +234,24 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
if (selectedTab === index) {
return;
}
- // Clear plan and related info when when 2 nodes option is selected for incompatible plan.
- if (isDatabasesV2GA && selectedTab === 0 && clusterSize === 2) {
- setClusterSize(undefined);
- setPlanSelected(undefined);
- setNodePricing(undefined);
- setSummaryText(undefined);
- }
- setSelectedTab(index);
- };
-
- const nodeOptions = React.useMemo(() => {
- const hasDedicated = displayTypes.some(
- (type) => type.class === 'dedicated'
- );
- const currentChip = (
-
+ const initialTab = determineInitialPlanCategoryTab(
+ displayTypes,
+ database.type,
+ currentPlan?.heading
);
- const isDisabled = (nodeSize: ClusterSize) => {
- return nodeSize < database.cluster_size;
- };
-
- const options = [
- {
- label: (
-
- 1 Node {` `}
- {database.cluster_size === 1 && currentChip}
-
-
- {`$${nodePricing?.single?.monthly || 0}/month $${
- nodePricing?.single?.hourly || 0
- }/hr`}
-
-
- ),
- value: 1,
- },
- ];
-
- if (hasDedicated && selectedTab === 0 && isDatabasesV2Enabled) {
- options.push({
- label: (
-
- 2 Nodes - High Availability
- {database.cluster_size === 2 && currentChip}
-
-
- {`$${nodePricing?.double?.monthly || 0}/month $${
- nodePricing?.double?.hourly || 0
- }/hr`}
-
-
- ),
- value: 2,
- });
+ if (isNewDatabaseGA) {
+ if (initialTab === index) {
+ setSelectedPlanId(database.type);
+ setClusterSize(database.cluster_size);
+ } else {
+ setClusterSize(undefined);
+ setSelectedPlanId(undefined);
+ }
}
-
- options.push({
- label: (
-
- 3 Nodes - High Availability (recommended)
- {database.cluster_size === 3 && currentChip}
-
-
- {`$${nodePricing?.multi?.monthly || 0}/month $${
- nodePricing?.multi?.hourly || 0
- }/hr`}
-
-
- ),
- value: 3,
- });
-
- return options;
- }, [selectedTab, nodePricing, displayTypes, isDatabasesV2Enabled]);
+ setSelectedTab(index);
+ };
if (typesLoading) {
return ;
@@ -498,6 +260,7 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
if (typesError) {
return ;
}
+
return (
<>
@@ -515,56 +278,41 @@ export const DatabaseResize = ({ database, disabled = false }: Props) => {
disabledTabs={isDisabledSharedTab ? ['shared'] : []}
handleTabChange={handleTabChange}
header="Choose a Plan"
- onSelect={(selected: string) => setPlanSelected(selected)}
- selectedId={planSelected}
- tabDisabledMessage="Resizing a 2-nodes cluster is only allowed with Dedicated plans."
+ onSelect={(selected: string) => setSelectedPlanId(selected)}
+ selectedId={selectedPlanId}
+ tabDisabledMessage="Resizing a 2-node cluster is only allowed with Dedicated plans."
types={displayTypes}
/>
- {isDatabasesV2GA && (
+ {isNewDatabaseGA && (
<>
-
-
- Set Number of Nodes{' '}
-
-
- We recommend 3 nodes in a database cluster to avoid downtime
- during upgrades and maintenance.
-
-
-
- {nodeOptions.map((nodeOption) => (
- }
- data-qa-radio={nodeOption.label}
- data-testid={`database-node-${nodeOption.value}`}
- disabled={nodeOption.value < database.cluster_size}
- key={nodeOption.value}
- label={nodeOption.label}
- value={nodeOption.value}
- />
- ))}
-
+ {
+ handleNodeChange(size);
+ }}
+ selectedPlan={displayTypes?.find(
+ (type) => type.id === selectedPlanId
+ )}
+ currentClusterSize={database.cluster_size}
+ currentPlan={currentPlan}
+ displayTypes={displayTypes}
+ selectedClusterSize={clusterSize}
+ selectedEngine={selectedEngine}
+ selectedTab={selectedTab}
+ />
>
)}
- ({
- marginBottom: isDatabasesV2GA ? theme.spacing(2) : 0,
- })}
- variant="h2"
- >
- Summary {isDatabasesV2GA ? database.label : ''}
-
- {isDatabasesV2GA && currentPlan ? currentSummary : null}
- {resizeSummary}
+
import('./DatabaseSummary'));
const DatabaseBackups = React.lazy(
@@ -72,11 +72,6 @@ export const DatabaseDetail = () => {
setEditableLabelError,
} = useEditableLabelState();
- const {
- isDatabasesMonitorEnabled,
- isDatabasesMonitorBeta,
- } = useIsDatabasesEnabled();
-
if (error) {
return (
{
}
const isDefault = database.platform === 'rdbms-default';
- const isMonitorEnabled = isDefault && isDatabasesMonitorEnabled;
+ const isMonitorEnabled = isDefault && flags.dbaasV2MonitorMetrics?.enabled;
const tabs: Tab[] = [
{
@@ -118,9 +113,9 @@ export const DatabaseDetail = () => {
if (isMonitorEnabled) {
tabs.splice(1, 0, {
+ chip: flags.dbaasV2MonitorMetrics?.beta ? : null,
routeName: `/databases/${engine}/${id}/monitor`,
title: 'Monitor',
- chip: isDatabasesMonitorBeta ? : null,
});
}
diff --git a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.tsx b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.tsx
index 80c6bb91b6d..d66ca38c4e0 100644
--- a/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.tsx
+++ b/packages/manager/src/features/Databases/DatabaseLanding/DatabaseLanding.tsx
@@ -181,7 +181,7 @@ const DatabaseLanding = () => {
onButtonClick={() => history.push('/databases/create')}
title="Database Clusters"
/>
- {showTabs && }
+ {showTabs && !isDatabasesV2GA && }
{showTabs ? (
diff --git a/packages/manager/src/features/Databases/utilities.ts b/packages/manager/src/features/Databases/utilities.ts
index 4da443b71e6..9f01754f3fa 100644
--- a/packages/manager/src/features/Databases/utilities.ts
+++ b/packages/manager/src/features/Databases/utilities.ts
@@ -15,8 +15,6 @@ import type { DatabaseFork } from '@linode/api-v4';
export interface IsDatabasesEnabled {
isDatabasesEnabled: boolean;
- isDatabasesMonitorBeta?: boolean;
- isDatabasesMonitorEnabled?: boolean;
isDatabasesV2Beta: boolean;
isDatabasesV2Enabled: boolean;
isDatabasesV2GA: boolean;