diff --git a/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts b/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts index 79ce569fd..11c18fb8f 100644 --- a/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts +++ b/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts @@ -14,15 +14,15 @@ // limitations under the License. import { dbTypeToDbEngine } from '@percona/utils'; -import { createDbClusterFn, getDbClusterCredentialsFn } from 'api/dbClusterApi'; -import { getCronExpressionFromFormValues } from 'components/time-selection/time-selection.utils.ts'; -import { DbWizardType } from 'pages/database-form/database-form-schema.ts'; -import { generateShortUID } from 'pages/database-form/steps/first/utils.ts'; import { UseMutationOptions, useMutation, useQuery, } from '@tanstack/react-query'; +import { createDbClusterFn, getDbClusterCredentialsFn } from 'api/dbClusterApi'; +import { getCronExpressionFromFormValues } from 'components/time-selection/time-selection.utils.ts'; +import { DbWizardType } from 'pages/database-form/database-form-schema.ts'; +import { generateShortUID } from 'pages/database-form/steps/first/utils.ts'; import { ClusterCredentials, DataSource, @@ -123,6 +123,12 @@ const formValuesToPayloadMapping = ( ...(backupDataSource?.dbClusterBackupName && { dataSource: { dbClusterBackupName: backupDataSource.dbClusterBackupName, + ...(backupDataSource?.pitr && { + pitr: { + date: backupDataSource.pitr.date, + type: 'date', + }, + }), }, }), }, diff --git a/apps/everest/src/modals/restore-db-modal/restore-db-modal.tsx b/apps/everest/src/modals/restore-db-modal/restore-db-modal.tsx index a91a59a06..089eb3f17 100644 --- a/apps/everest/src/modals/restore-db-modal/restore-db-modal.tsx +++ b/apps/everest/src/modals/restore-db-modal/restore-db-modal.tsx @@ -78,19 +78,42 @@ const RestoreDbModal = ({ defaultValues={defaultValues} values={{ ...defaultValues, pitrBackup: pitrData?.latestDate }} onSubmit={({ backupName, backupType, pitrBackup }) => { + let pointInTimeDate = ''; + let pitrBackupName = ''; + + if (pitrData) { + pitrBackupName = pitrData.latestBackupName; + } + + if (pitrBackup && pitrBackup instanceof Date) { + pointInTimeDate = pitrBackup.toISOString().split('.')[0] + 'Z'; + } + if (isNewClusterMode) { closeModal(); const selectedBackup = backups?.find( (backup) => backup.name === backupName ); - navigate('/databases/new', { - state: { - selectedDbCluster: dbCluster.metadata.name, - backupName, - namespace, - backupStorageName: selectedBackup, - }, - }); + if (backupType === BackuptypeValues.fromBackup) { + navigate('/databases/new', { + state: { + selectedDbCluster: dbCluster.metadata.name, + backupName, + namespace, + backupStorageName: selectedBackup, + }, + }); + } else { + navigate('/databases/new', { + state: { + selectedDbCluster: dbCluster.metadata.name, + backupName: pitrBackupName, + namespace, + backupStorageName: selectedBackup, + pointInTimeDate: pointInTimeDate, + }, + }); + } } else { if (backupType === BackuptypeValues.fromBackup) { restoreBackupFromBackup( @@ -105,9 +128,9 @@ const RestoreDbModal = ({ } else { restoreBackupFromPointInTime( { - backupName: pitrData!.latestBackupName, + backupName: pitrBackupName, namespace, - pointInTimeDate: pitrBackup!.toISOString().split('.')[0] + 'Z', + pointInTimeDate: pointInTimeDate, }, { onSuccess() { @@ -152,7 +175,6 @@ const RestoreDbModal = ({ { label: Messages.fromPitr, value: BackuptypeValues.fromPitr, - disabled: isNewClusterMode, }, ]} /> diff --git a/apps/everest/src/pages/database-form/database-form.tsx b/apps/everest/src/pages/database-form/database-form.tsx index 5bcafd70c..93b63e3ba 100644 --- a/apps/everest/src/pages/database-form/database-form.tsx +++ b/apps/everest/src/pages/database-form/database-form.tsx @@ -114,6 +114,10 @@ export const DatabasePage = () => { ...(mode === 'restoreFromBackup' && { backupDataSource: { dbClusterBackupName: state?.backupName, + pitr: { + date: state?.pointInTimeDate, + type: 'date', + }, }, }), }, diff --git a/apps/everest/src/pages/database-form/steps/pitr/pitr-step.tsx b/apps/everest/src/pages/database-form/steps/pitr/pitr-step.tsx index 6c166fcfd..df4dc8d89 100644 --- a/apps/everest/src/pages/database-form/steps/pitr/pitr-step.tsx +++ b/apps/everest/src/pages/database-form/steps/pitr/pitr-step.tsx @@ -20,8 +20,8 @@ import { useEffect } from 'react'; import { useFormContext } from 'react-hook-form'; import { DbWizardFormFields } from '../../database-form.types'; import { StepHeader } from '../step-header/step-header'; -import { Messages } from './pitr.messages'; import PitrStorage from './pitr-storage'; +import { Messages } from './pitr.messages'; const PITRStep = () => { const { control, watch, setValue } = useFormContext(); diff --git a/apps/everest/src/pages/databases/DbClusterView.tsx b/apps/everest/src/pages/databases/DbClusterView.tsx index 845faad70..5dddde86d 100644 --- a/apps/everest/src/pages/databases/DbClusterView.tsx +++ b/apps/everest/src/pages/databases/DbClusterView.tsx @@ -33,6 +33,7 @@ import { useMemo, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { DbClusterStatus } from 'shared-types/dbCluster.types'; import { DbEngineType } from 'shared-types/dbEngines.types'; +import { useDBClustersForNamespaces } from '../../hooks/api/db-clusters/useDbClusters'; import { DB_CLUSTER_STATUS_TO_BASE_STATUS } from './DbClusterView.constants'; import { beautifyDbClusterStatus, @@ -42,7 +43,6 @@ import { Messages } from './dbClusterView.messages'; import { DbClusterTableElement } from './dbClusterView.types'; import { DbTypeIconProvider } from './dbTypeIconProvider/DbTypeIconProvider'; import { ExpandedRow } from './expandedRow/ExpandedRow'; -import { useDBClustersForNamespaces } from '../../hooks/api/db-clusters/useDbClusters'; export const DbClusterView = () => { const [isNewClusterMode, setIsNewClusterMode] = useState(false); diff --git a/apps/everest/src/shared-types/dbCluster.types.ts b/apps/everest/src/shared-types/dbCluster.types.ts index 8f89a0b3b..99786b5e9 100644 --- a/apps/everest/src/shared-types/dbCluster.types.ts +++ b/apps/everest/src/shared-types/dbCluster.types.ts @@ -78,6 +78,12 @@ interface Proxy { export interface DataSource { dbClusterBackupName: string; + pitr?: DataSourcePitr; +} + +export interface DataSourcePitr { + date: string; + type: 'date'; } export interface Monitoring {