From accdc74d4ab68cdcaa2abf84ebb44355cc86c8cf Mon Sep 17 00:00:00 2001 From: Filip Mikes Date: Sun, 18 Feb 2024 18:42:17 +0100 Subject: [PATCH 1/4] EVEREST-629 Allowed pitr restore to new db cluster --- .../api/db-cluster/useCreateDbCluster.ts | 4 +++ .../restore-db-modal/restore-db-modal.tsx | 33 +++++++++++++------ .../src/pages/database-form/database-form.tsx | 4 +++ .../database-form/steps/pitr/pitr-step.tsx | 2 +- .../src/shared-types/dbCluster.types.ts | 6 ++++ 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts b/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts index 4ab517fed..f28ea463b 100644 --- a/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts +++ b/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts @@ -123,6 +123,10 @@ const formValuesToPayloadMapping = ( ...(backupDataSource?.dbClusterBackupName && { dataSource: { dbClusterBackupName: backupDataSource.dbClusterBackupName, + pitr: backupDataSource.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 a0aa99908..dfce377c4 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 @@ -52,7 +52,9 @@ const RestoreDbModal = ({ dbCluster.metadata.name, namespace ); - + console.log(pitrData?.latestBackupName); + console.log(dbCluster.metadata.name); + console.log(backups); const { mutate: restoreBackupFromBackup, isLoading: restoringFromBackup } = useDbClusterRestoreFromBackup(dbCluster.metadata.name); const { @@ -83,14 +85,26 @@ const RestoreDbModal = ({ 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: pitrData!.latestBackupName, + namespace, + backupStorageName: selectedBackup, + pointInTimeDate: pitrBackup!.toISOString().split('.')[0] + 'Z', + }, + }); + } } else { if (backupType === BackuptypeValues.fromBackup) { restoreBackupFromBackup( @@ -152,7 +166,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 b89221aa1..4d8ba06a7 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 7972fcd63..f2c871c71 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 @@ -133,7 +133,7 @@ const PITRStep = () => { {pitrEnabled && (dbType === DbType.Mongo || dbType === DbType.Postresql) && ( - {Messages.matchedStorageType(storageLocation.name)} + {Messages.matchedStorageType(storageLocation?.name)} )} 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 { From c42e1dc05cd7f89003ba9e07f809e9926e2670f0 Mon Sep 17 00:00:00 2001 From: Filip Mikes Date: Tue, 20 Feb 2024 14:47:46 +0100 Subject: [PATCH 2/4] EVEREST-629 Removed console.log --- apps/everest/src/modals/restore-db-modal/restore-db-modal.tsx | 4 +--- apps/everest/src/pages/databases/DbClusterView.tsx | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) 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 dfce377c4..4692a3027 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 @@ -52,9 +52,7 @@ const RestoreDbModal = ({ dbCluster.metadata.name, namespace ); - console.log(pitrData?.latestBackupName); - console.log(dbCluster.metadata.name); - console.log(backups); + const { mutate: restoreBackupFromBackup, isLoading: restoringFromBackup } = useDbClusterRestoreFromBackup(dbCluster.metadata.name); const { diff --git a/apps/everest/src/pages/databases/DbClusterView.tsx b/apps/everest/src/pages/databases/DbClusterView.tsx index e5a77cc65..6c327fa41 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); From a4acf2e8a6f894b1736b0389cbcfe5c4dd0e717b Mon Sep 17 00:00:00 2001 From: Filip Mikes Date: Wed, 21 Feb 2024 16:40:04 +0100 Subject: [PATCH 3/4] EVEREST-629 refactor pointInTimeDate, pitrBackupName --- .../restore-db-modal/restore-db-modal.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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 4692a3027..845093486 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,6 +78,17 @@ 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( @@ -96,10 +107,10 @@ const RestoreDbModal = ({ navigate('/databases/new', { state: { selectedDbCluster: dbCluster.metadata.name, - backupName: pitrData!.latestBackupName, + backupName: pitrBackupName, namespace, backupStorageName: selectedBackup, - pointInTimeDate: pitrBackup!.toISOString().split('.')[0] + 'Z', + pointInTimeDate: pointInTimeDate, }, }); } @@ -117,9 +128,9 @@ const RestoreDbModal = ({ } else { restoreBackupFromPointInTime( { - backupName: pitrData!.latestBackupName, + backupName: pitrBackupName, namespace, - pointInTimeDate: pitrBackup!.toISOString().split('.')[0] + 'Z', + pointInTimeDate: pointInTimeDate, }, { onSuccess() { From 1209e9994eafe3253c88ad7de3f7cd6926e7f994 Mon Sep 17 00:00:00 2001 From: Filip Mikes Date: Thu, 22 Feb 2024 16:54:00 +0100 Subject: [PATCH 4/4] EVEREST-629 after review fix --- .../hooks/api/db-cluster/useCreateDbCluster.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts b/apps/everest/src/hooks/api/db-cluster/useCreateDbCluster.ts index a26ddb1d9..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,10 +123,12 @@ const formValuesToPayloadMapping = ( ...(backupDataSource?.dbClusterBackupName && { dataSource: { dbClusterBackupName: backupDataSource.dbClusterBackupName, - pitr: backupDataSource.pitr && { - date: backupDataSource.pitr.date, - type: 'date', - }, + ...(backupDataSource?.pitr && { + pitr: { + date: backupDataSource.pitr.date, + type: 'date', + }, + }), }, }), },