Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EVEREST-1280 | Moving Storage class from first step to Advanced Configurations step #1171

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions ui/apps/everest/src/components/advanced-card/advanced-card.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import React from 'react';
import { Card, CardContent, Typography, Box } from '@mui/material';

type AdvancedCardProps = {
title: string;
description: string | React.ReactNode;
controlComponent: React.ReactNode;
gapFromText?: number;
};

const AdvancedCard: React.FC<AdvancedCardProps> = ({
title,
description,
controlComponent,
gapFromText = 48,
}) => {
return (
<Card variant="outlined" sx={{ marginBottom: 2, padding: 2 }}>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<Card variant="outlined" sx={{ marginBottom: 2, padding: 2 }}>
<Card variant="outlined" sx={{ marginBottom: 2 }}>

<CardContent>
<Box display="flex" alignItems="center" gap={gapFromText}>
<Typography variant="h6" sx={{ flexShrink: 0 }}>
{title}
</Typography>
<Box sx={{ flexGrow: 2, textAlign: 'right' }}>{controlComponent}</Box>
</Box>
{typeof description === 'string' ? (
<Typography variant="body2" color="textSecondary" mt={1}>
{description}
</Typography>
) : (
<Box mt={1}>{description}</Box>
)}
</CardContent>
</Card>
);
};

export default AdvancedCard;
1 change: 1 addition & 0 deletions ui/apps/everest/src/components/advanced-card/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './advanced-card';
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,17 @@ import { Messages } from './messages';
export const advancedConfigurationsSchema = () =>
z
.object({
[AdvancedConfigurationFields.storageClass]: z
.string()
.nullable()
.superRefine((input, ctx) => {
if (!input) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: Messages.errors.storageClass.invalid,
});
}
}),
[AdvancedConfigurationFields.externalAccess]: z.boolean(),
[AdvancedConfigurationFields.sourceRanges]: z.array(
z.object({ sourceRange: z.string().optional() })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,80 @@
// See the License for the specific language governing permissions and
// limitations under the License.

import { SwitchInput, TextArray, TextInput } from '@percona/ui-lib';
import {
AutoCompleteInput,
SwitchInput,
TextArray,
TextInput,
} from '@percona/ui-lib';
import { Messages } from './messages';
import { AdvancedConfigurationFields } from './advanced-configuration.types';
import { useFormContext } from 'react-hook-form';
import { DbType } from '@percona/types';
import { getParamsPlaceholderFromDbType } from './advanced-configuration.utils';
import { Stack } from '@mui/material';
import { useKubernetesClusterInfo } from 'hooks/api/kubernetesClusters/useKubernetesClusterInfo';
import { useEffect } from 'react';
import { DbWizardFormFields } from 'consts';
import { useDatabasePageMode } from 'pages/database-form/useDatabasePageMode';
import AdvancedCard from 'components/advanced-card';

interface AdvancedConfigurationFormProps {
dbType: DbType;
loadingDefaultsForEdition?: boolean;
}

export const AdvancedConfigurationForm = ({
dbType,
loadingDefaultsForEdition,
}: AdvancedConfigurationFormProps) => {
const { watch } = useFormContext();
const { watch, setValue, getFieldState } = useFormContext();
const mode = useDatabasePageMode();
const [externalAccess, engineParametersEnabled] = watch([
AdvancedConfigurationFields.externalAccess,
AdvancedConfigurationFields.engineParametersEnabled,
AdvancedConfigurationFields.storageClass,
]);
const { data: clusterInfo, isLoading: clusterInfoLoading } =
useKubernetesClusterInfo(['wizard-k8-info']);

// setting the storage class default value
useEffect(() => {
const { isTouched: storageClassTouched } = getFieldState(
DbWizardFormFields.storageClass
);

if (
!storageClassTouched &&
mode === 'new' &&
clusterInfo?.storageClassNames &&
clusterInfo.storageClassNames.length > 0
) {
setValue(
DbWizardFormFields.storageClass,
clusterInfo?.storageClassNames[0]
);
}
}, [clusterInfo]);

Check warning on line 70 in ui/apps/everest/src/components/cluster-form/advanced-configuration/advanced-configuration.tsx

View workflow job for this annotation

GitHub Actions / CI_checks (lint)

React Hook useEffect has missing dependencies: 'getFieldState', 'mode', and 'setValue'. Either include them or remove the dependency array
return (
<>
<AdvancedCard
title={Messages.cards.storage.title}
description={Messages.cards.storage.description}
gapFromText={96}
controlComponent={
<AutoCompleteInput
name={AdvancedConfigurationFields.storageClass}
label={Messages.labels.storageClass}
loading={clusterInfoLoading}
options={clusterInfo?.storageClassNames || []}
autoCompleteProps={{
disableClearable: true,
disabled: loadingDefaultsForEdition,
}}
/>
}
/>
<SwitchInput
label={Messages.enableExternalAccess.title}
labelCaption={Messages.enableExternalAccess.caption}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ export enum AdvancedConfigurationFields {
sourceRanges = 'sourceRanges',
engineParametersEnabled = 'engineParametersEnabled',
engineParameters = 'engineParameters',
storageClass = 'storageClass',
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ export const advancedConfigurationModalDefaultValues = (
: dbCluster?.spec?.proxy.ipSourceRanges;

return {
[AdvancedConfigurationFields.storageClass]:
dbCluster?.spec?.engine?.storage?.class || null,
[AdvancedConfigurationFields.externalAccess]: isProxy(
dbCluster?.spec?.proxy
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,23 @@ export const Messages = {
caption:
'Set your database engine configuration to adjust your database system to your workload and performance needs. For configuration format and specific parameters, check your database type documentation.',
},
labels: {
storageClass: 'Storage class',
},
cards: {
storage: {
title: 'Storage',
description:
'Defines the type and performance of storage for your database. Select based on workload needs, such as high IOPS for fast access or cost-effective options for less frequent use.',
},
},
errors: {
sourceRange: {
invalid: INVALID_SOURCE_RANGE_ERROR,
},
storageClass: {
invalid: 'Invalid storage class',
},
engineParameters: {
invalid: 'Invalid',
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ import { fireEvent, render, screen } from '@testing-library/react';
import { FormProvider, useForm } from 'react-hook-form';
import { TestWrapper } from 'utils/test';
import { AdvancedConfigurations } from './advanced-configurations';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

const queryClient = new QueryClient();

const FormProviderWrapper = ({ children }: { children: React.ReactNode }) => {
const methods = useForm({
Expand All @@ -25,7 +28,12 @@ describe('FourthStep', () => {
render(
<TestWrapper>
<FormProviderWrapper>
<AdvancedConfigurations />
<QueryClientProvider client={queryClient}>
<AdvancedConfigurations
loadingDefaultsForEdition={false}
alreadyVisited={false}
/>
</QueryClientProvider>
</FormProviderWrapper>
</TestWrapper>
);
Expand All @@ -45,7 +53,12 @@ describe('FourthStep', () => {
render(
<TestWrapper>
<FormProviderWrapper>
<AdvancedConfigurations />
<QueryClientProvider client={queryClient}>
<AdvancedConfigurations
loadingDefaultsForEdition={false}
alreadyVisited={false}
/>
</QueryClientProvider>
</FormProviderWrapper>
</TestWrapper>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,22 @@ import { DbWizardFormFields } from 'consts.ts';
import { StepHeader } from '../step-header/step-header.tsx';
import AdvancedConfigurationForm from 'components/cluster-form/advanced-configuration/advanced-configuration.tsx';
import { FormGroup } from '@mui/material';
import { StepProps } from 'pages/database-form/database-form.types.ts';

export const AdvancedConfigurations = () => {
export const AdvancedConfigurations = ({
loadingDefaultsForEdition,
}: StepProps) => {
const { watch } = useFormContext();
const dbType = watch(DbWizardFormFields.dbType);

return (
<>
<StepHeader pageTitle={Messages.advanced} />
<FormGroup sx={{ mt: 3 }}>
<AdvancedConfigurationForm dbType={dbType} />
<AdvancedConfigurationForm
dbType={dbType}
loadingDefaultsForEdition={loadingDefaultsForEdition}
/>
</FormGroup>
</>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ export const Messages = {
k8sNamespace: 'Namespace',
dbEnvironment: 'Database environment',
dbVersion: 'Database version',
storageClass: 'Storage class',
shardedCluster: 'Sharded Cluster',
},
placeholders: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ vi.mock('api/kubernetesClusterApi', () => ({
getKubernetesClusterInfoFn: vi.fn(() =>
Promise.resolve({
clusterType: 'generic',
storageClassNames: ['local-path'],
})
),
}));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import {
TextInput,
} from '@percona/ui-lib';
import { dbTypeToDbEngine } from '@percona/utils';
import { useKubernetesClusterInfo } from 'hooks/api/kubernetesClusters/useKubernetesClusterInfo';
import { useFormContext } from 'react-hook-form';
import { DbEngineToolStatus } from 'shared-types/dbEngines.types';
import {
Expand Down Expand Up @@ -57,9 +56,6 @@ export const FirstStep = ({ loadingDefaultsForEdition }: StepProps) => {
const { watch, setValue, getFieldState, resetField, trigger } =
useFormContext();

const { data: clusterInfo, isLoading: clusterInfoLoading } =
useKubernetesClusterInfo(['wizard-k8-info']);

const dbType: DbType = watch(DbWizardFormFields.dbType);
const dbVersion: DbType = watch(DbWizardFormFields.dbVersion);
const dbNamespace = watch(DbWizardFormFields.k8sNamespace);
Expand Down Expand Up @@ -102,25 +98,6 @@ export const FirstStep = ({ loadingDefaultsForEdition }: StepProps) => {
const disableSharding =
mode !== 'new' || notSupportedMongoOperatorVersionForSharding;

// setting the storage class default value
useEffect(() => {
const { isTouched: storageClassTouched } = getFieldState(
DbWizardFormFields.storageClass
);

if (
!storageClassTouched &&
mode === 'new' &&
clusterInfo?.storageClassNames &&
clusterInfo.storageClassNames.length > 0
) {
setValue(
DbWizardFormFields.storageClass,
clusterInfo?.storageClassNames[0]
);
}
}, [clusterInfo]);

const { canCreate, isLoading } =
useNamespacePermissionsForResource('database-clusters');

Expand Down Expand Up @@ -258,16 +235,6 @@ export const FirstStep = ({ loadingDefaultsForEdition }: StepProps) => {
availableVersions={dbEngineData?.availableVersions.engine}
loading={dbEnginesFoDbEngineTypesFetching || isLoading}
/>
<AutoCompleteInput
name={DbWizardFormFields.storageClass}
label={Messages.labels.storageClass}
loading={clusterInfoLoading}
options={clusterInfo?.storageClassNames || []}
autoCompleteProps={{
disableClearable: true,
disabled: loadingDefaultsForEdition,
}}
/>
{dbType === DbType.Mongo && (
<Box sx={{ marginY: '30px' }}>
<ActionableLabeledContent
Expand Down
11 changes: 0 additions & 11 deletions ui/apps/everest/src/pages/database-form/database-form-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,6 @@ const basicInfoSchema = () =>
.nonempty(),
[DbWizardFormFields.k8sNamespace]: z.string().nullable(),
...dbVersionSchemaObject,
[DbWizardFormFields.storageClass]: z
.string()
.nullable()
.superRefine((input, ctx) => {
if (!input) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: Messages.errors.storageClass.invalid,
});
}
}),
[DbWizardFormFields.sharding]: z.boolean(),
})
.passthrough();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@ export const Messages = {
dbName: {
tooLong: errorMessages.tooLong('database'),
},
storageClass: {
invalid: 'Invalid storage class',
},
monitoringEndpoint: {
invalidOption:
'Invalid option. Please make sure you added a monitoring endpoint and select it from the dropdown',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,6 @@ export const DbClusterPayloadToFormValues = (
).toString(),
'G'
).value,
[DbWizardFormFields.storageClass]:
dbCluster?.spec?.engine?.storage?.class || null,

//backups
[DbWizardFormFields.backupsEnabled]: !!backup?.enabled,
[DbWizardFormFields.pitrEnabled]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ export const AdvancedConfigurationsPreviewSection = ({
externalAccess,
engineParametersEnabled,
engineParameters,
storageClass,
}: AdvancedConfigurationType) => (
<>
<PreviewContentText text={`Storage class: ${storageClass ?? ''}`} />
<PreviewContentText
text={`External access ${externalAccess ? 'enabled' : 'disabled'}`}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ export const PreviewSectionOne = ({
dbName,
dbVersion,
dbType,
storageClass,
k8sNamespace,
sharding,
}: SectionProps) => (
Expand All @@ -16,7 +15,6 @@ export const PreviewSectionOne = ({
<PreviewContentText text={`Type: ${beautifyDbTypeName(dbType)}`} />
<PreviewContentText text={`Name: ${dbName}`} />
<PreviewContentText text={`Version: ${dbVersion}`} />
<PreviewContentText text={`Storage class: ${storageClass ?? ''}`} />
{dbType === DbType.Mongo && (
<PreviewContentText
text={`Sharding: ${sharding ? 'enabled' : 'disabled'}`}
Expand Down
Loading
Loading