diff --git a/public/app/percona/backup/Backup.service.ts b/public/app/percona/backup/Backup.service.ts index 8dcf7859860a9..e0ece5ce7ea44 100644 --- a/public/app/percona/backup/Backup.service.ts +++ b/public/app/percona/backup/Backup.service.ts @@ -4,7 +4,7 @@ import { api } from 'app/percona/shared/helpers/api'; import { getCronStringFromValues } from '../shared/helpers/cron/cron'; -import { BackupMode, BackupType, DataModel, RetryMode } from './Backup.types'; +import { BackupMode, BackupType, Compression, DataModel, RetryMode } from './Backup.types'; import { AddBackupFormProps } from './components/AddBackupPage/AddBackupPage.types'; const BASE_URL = '/v1/backups'; @@ -32,6 +32,7 @@ export const BackupService = { type, dataModel, folder, + compression, } = values; const strRetryInterval = `${retryInterval}s`; const resultRetryTimes = retryMode === RetryMode.MANUAL ? 0 : retryTimes; @@ -46,6 +47,7 @@ export const BackupService = { resultRetryTimes!, dataModel, folder, + compression.value!, token ); } else { @@ -66,7 +68,8 @@ export const BackupService = { description ?? '', strRetryInterval, resultRetryTimes!, - retention! + retention!, + compression.value! ); } else { return this.scheduleBackup( @@ -81,7 +84,8 @@ export const BackupService = { active!, mode, dataModel, - folder + folder, + compression.value! ); } } @@ -95,6 +99,7 @@ export const BackupService = { retryTimes: number, dataModel: DataModel, folder: string, + compression: Compression, token?: CancelToken ) { return api.post( @@ -108,6 +113,7 @@ export const BackupService = { retries: retryTimes, data_model: dataModel, folder, + compression, }, false, token @@ -125,7 +131,8 @@ export const BackupService = { enabled: boolean, mode: BackupMode, dataModel: DataModel, - folder: string + folder: string, + compression: Compression ) { return api.post(`${BASE_URL}:schedule`, { service_id: serviceId, @@ -140,6 +147,7 @@ export const BackupService = { mode, data_model: dataModel, folder, + compression, }); }, async changeScheduleBackup( @@ -150,7 +158,8 @@ export const BackupService = { description: string, retryInterval: string, retryTimes: number, - retention: number + retention: number, + compression: Compression ) { return api.put(`${BASE_URL}:changeScheduled`, { scheduled_backup_id: id, @@ -161,6 +170,7 @@ export const BackupService = { retry_interval: retryInterval, retries: retryTimes, retention, + compression, }); }, }; diff --git a/public/app/percona/backup/Backup.types.ts b/public/app/percona/backup/Backup.types.ts index b30b9d5943d7f..5c2db43e7d87a 100644 --- a/public/app/percona/backup/Backup.types.ts +++ b/public/app/percona/backup/Backup.types.ts @@ -40,6 +40,18 @@ export enum BackupType { SCHEDULED = 'SCHEDULED', } +export enum Compression { + DEFAULT = 'BACKUP_COMPRESSION_DEFAULT', + NONE = 'BACKUP_COMPRESSION_NONE', + QUICKLZ = 'BACKUP_COMPRESSION_QUICKLZ', + ZSTD = 'BACKUP_COMPRESSION_ZSTD', + LZ4 = 'BACKUP_COMPRESSION_LZ4', + S2 = 'BACKUP_COMPRESSION_S2', + GZIP = 'BACKUP_COMPRESSION_GZIP', + SNAPPY = 'BACKUP_COMPRESSION_SNAPPY', + PGZIP = 'BACKUP_COMPRESSION_PGZIP', +} + export interface RawBackupLog { chunk_id: number; data: string; diff --git a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.constants.ts b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.constants.ts index 57349465b45ff..089736ed93f3f 100644 --- a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.constants.ts +++ b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.constants.ts @@ -87,3 +87,4 @@ export const MIN_RETENTION = 0; export const MAX_RETENTION = 99; export const MAX_BACKUP_NAME = 100; + diff --git a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.messages.ts b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.messages.ts index 9dfb45e2e45b1..13aa26cb5c2d5 100644 --- a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.messages.ts +++ b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.messages.ts @@ -13,6 +13,10 @@ export const Messages = { folder: 'Folder', location: 'Location', retryMode: 'Retry mode', + compression: 'Compression', + compressionTooltip: + 'Choose the compression algorithm for the backup. Different algorithms offer different trade-offs between compression ratio and speed.', + selectCompression: 'Select compression type', cancelAction: 'Cancel', retryTimes: 'Retry, times', retryInterval: 'Retry interval, seconds', diff --git a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.test.tsx b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.test.tsx index 4064a753296d2..6650529053e26 100644 --- a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.test.tsx +++ b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.test.tsx @@ -1,5 +1,5 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { FC, PropsWithChildren } from 'react'; +import { act, FC, PropsWithChildren } from 'react'; import { Provider } from 'react-redux'; import { MemoryRouter } from 'react-router-dom-v5-compat'; @@ -154,4 +154,26 @@ describe('AddBackupPage', () => { await fireEvent.click(button); expect(screen.getByText('Create Backup on demand')).toBeInTheDocument(); }); + + it('should render compression field in advanced settings', async () => { + render( + + + + + + ); + + await waitFor(() => expect(screen.getAllByText('Choose')).toHaveLength(2)); + + const advancedSettingsButton = screen.getByTestId('add-backup-advanced-settings'); + act(() => { + fireEvent.click(advancedSettingsButton); + }); + + await waitFor(() => { + expect(screen.getByTestId('compression-select-input')).toBeInTheDocument(); + expect(screen.getByText(Messages.compression)).toBeInTheDocument(); + }); + }); }); diff --git a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.tsx b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.tsx index c61f88222e492..5228c0dec367a 100644 --- a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.tsx +++ b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.tsx @@ -32,7 +32,7 @@ import { PageSwitcherCard } from '../../../shared/components/Elements/PageSwitch import { BACKUP_INVENTORY_URL, BACKUP_SCHEDULED_URL } from '../../Backup.constants'; import { Messages as MessagesBackup } from '../../Backup.messages'; import { BackupService } from '../../Backup.service'; -import { BackupMode, BackupType, DataModel } from '../../Backup.types'; +import { BackupMode, BackupType, Compression, DataModel } from '../../Backup.types'; import { BackupErrorSection } from '../BackupErrorSection/BackupErrorSection'; import { BACKUP_CANCEL_TOKEN, LIST_ARTIFACTS_CANCEL_TOKEN } from '../BackupInventory/BackupInventory.constants'; import { BackupInventoryService } from '../BackupInventory/BackupInventory.service'; @@ -49,6 +49,7 @@ import { getStyles } from './AddBackupPage.styles'; import { AddBackupFormProps, SelectableService } from './AddBackupPage.types'; import { getBackupModeOptions, + getCompressionOptionFromValue, getDataModelFromVendor, getLabelForStorageOption, isDataModelDisabled, @@ -113,6 +114,14 @@ const AddBackupPage: FC = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const loadCompressionOptions = useCallback(async (serviceId?: string) => { + if (!serviceId) { + return [getCompressionOptionFromValue(Compression.DEFAULT)]; + } + const methods = await BackupInventoryService.listServiceCompressions(serviceId); + return methods.map((m) => getCompressionOptionFromValue(m)); + }, []); + const handleBackup = async (values: AddBackupFormProps) => { try { await BackupService.backup(values, generateToken(BACKUP_CANCEL_TOKEN)); @@ -356,6 +365,23 @@ const AddBackupPage: FC = () => { buttonDataTestId="add-backup-advanced-settings" > + + + {({ input }) => ( + loadCompressionOptions(values.service?.value?.id)} + className={styles.selectField} + data-testid="compression-select-input" + {...input} + /> + )} + + ; } diff --git a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.utils.ts b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.utils.ts index 9f7a3c7b175a0..578b8bd5b101f 100644 --- a/public/app/percona/backup/components/AddBackupPage/AddBackupPage.utils.ts +++ b/public/app/percona/backup/components/AddBackupPage/AddBackupPage.utils.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/consistent-type-assertions */ import { SelectableValue } from '@grafana/data'; -import { BackupMode, BackupType, DataModel, RetryMode } from 'app/percona/backup/Backup.types'; +import { BackupMode, BackupType, DataModel, RetryMode, Compression } from 'app/percona/backup/Backup.types'; import { Databases } from 'app/percona/shared/core'; import { getPeriodFromCronparts, parseCronString } from 'app/percona/shared/helpers/cron/cron'; import { PeriodType } from 'app/percona/shared/helpers/cron/types'; @@ -54,6 +54,16 @@ const getBackupType = (backup: Backup | ScheduledBackup | null): BackupType => { return BackupType.DEMAND; }; +const compressionValueToKeyMap: Record = Object.fromEntries( + Object.entries(Compression).map(([key, val]) => [val, key]) +); + +export const getCompressionOptionFromValue = (value: Compression): SelectableValue => ({ + value, + label: compressionValueToKeyMap[value] ?? value, +}); + + export const toFormBackup = (backup: Backup | ScheduledBackup | null, scheduleMode?: boolean): AddBackupFormProps => { if (!backup) { return { @@ -79,6 +89,7 @@ export const toFormBackup = (backup: Backup | ScheduledBackup | null, scheduleMo mode: BackupMode.SNAPSHOT, type: scheduleMode ? BackupType.SCHEDULED : getBackupType(backup), folder: '', + compression: getCompressionOptionFromValue(Compression.DEFAULT), }; } @@ -130,6 +141,7 @@ export const toFormBackup = (backup: Backup | ScheduledBackup | null, scheduleMo mode, type: BackupType.SCHEDULED, folder, + compression: getCompressionOptionFromValue(backup.compression), }; } else { return { @@ -146,6 +158,7 @@ export const toFormBackup = (backup: Backup | ScheduledBackup | null, scheduleMo retryInterval: 30, type: BackupType.DEMAND, folder, + compression: getCompressionOptionFromValue(backup.compression), }; } }; diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventory.service.ts b/public/app/percona/backup/components/BackupInventory/BackupInventory.service.ts index 29c4de04f9ad0..8520f30950b30 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventory.service.ts +++ b/public/app/percona/backup/components/BackupInventory/BackupInventory.service.ts @@ -4,9 +4,9 @@ import { SelectableValue } from '@grafana/data'; import { DBServiceList, CompatibleServiceListPayload } from 'app/percona/inventory/Inventory.types'; import { api } from 'app/percona/shared/helpers/api'; -import { BackupLogResponse, BackupLogs, DataModel } from '../../Backup.types'; +import { BackupLogResponse, BackupLogs, Compression, DataModel } from '../../Backup.types'; -import { Backup, BackupResponse, Timeranges, TimerangesResponse } from './BackupInventory.types'; +import { Backup, BackupResponse, CompressionResponse, Timeranges, TimerangesResponse } from './BackupInventory.types'; import { formatDate } from './BackupInventory.utils'; const BASE_URL = '/v1/backups'; @@ -28,6 +28,7 @@ export const BackupInventoryService = { vendor, mode, folder, + compression, }): Backup => ({ id: artifact_id, name, @@ -41,6 +42,7 @@ export const BackupInventoryService = { vendor, mode, folder, + compression, }) ); }, @@ -122,4 +124,10 @@ export const BackupInventoryService = { return result; }, + async listServiceCompressions(serviceId: string): Promise { + const { compression_methods = [] } = await api.get( + `${BASE_URL}/services/${serviceId}/compression` + ); + return compression_methods; + }, }; diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx b/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx index 562a17cafd191..7c37035f0aa45 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx +++ b/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx @@ -280,6 +280,7 @@ export const BackupInventory: FC = () => { status={row.original.status} dataModel={row.original.dataModel} folder={row.original.folder} + compression={row.original.compression} /> ), [] diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventory.types.ts b/public/app/percona/backup/components/BackupInventory/BackupInventory.types.ts index abe3ee75fb232..ee944d2aaed70 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventory.types.ts +++ b/public/app/percona/backup/components/BackupInventory/BackupInventory.types.ts @@ -1,6 +1,6 @@ import { Databases } from 'app/percona/shared/core'; -import { DataModel, BackupStatus, BackupMode } from '../../Backup.types'; +import { DataModel, BackupStatus, BackupMode, Compression } from '../../Backup.types'; import { StorageLocation } from '../StorageLocations/StorageLocations.types'; export interface Backup { @@ -17,6 +17,7 @@ export interface Backup { mode: BackupMode; folder: string; type?: Databases | 'external'; + compression: Compression; } export interface BackupRow extends Backup { @@ -36,6 +37,7 @@ export interface RawBackup { vendor: Databases; mode: BackupMode; folder: string; + compression: Compression; } export interface BackupResponse { @@ -55,3 +57,7 @@ export interface Timeranges { export interface TimerangesResponse { timeranges: RawTimeranges[]; } + +export interface CompressionResponse { + compression_methods: Compression[]; +} diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.messages.ts b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.messages.ts index 0a40c7935e4a6..2576f17b67ada 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.messages.ts +++ b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.messages.ts @@ -3,4 +3,5 @@ export const Messages = { testResuts: 'Test results', dataModel: 'Data model', folder: 'Folder', + compression: 'Compression', }; diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.test.tsx b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.test.tsx index 36e4549dc35f3..2531d560062ab 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.test.tsx +++ b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.test.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; -import { DataModel, BackupStatus } from 'app/percona/backup/Backup.types'; +import { Compression, DataModel, BackupStatus } from 'app/percona/backup/Backup.types'; import { BackupInventoryDetails } from './BackupInventoryDetails'; @@ -12,10 +12,12 @@ describe('BackupInventoryDetails', () => { status={BackupStatus.BACKUP_STATUS_PAUSED} dataModel={DataModel.LOGICAL} folder="folder1" + compression={Compression.NONE} /> ); expect(screen.getByTestId('backup-artifact-details-name')).toBeInTheDocument(); expect(screen.getByTestId('backup-artifact-details-data-model')).toBeInTheDocument(); expect(screen.getByTestId('backup-artifact-details-folder')).toBeInTheDocument(); + expect(screen.getByTestId('backup-artifact-details-compression')).toBeInTheDocument(); }); }); diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.tsx b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.tsx index a7cc6810f23e8..c3f9db24839b5 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.tsx +++ b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.tsx @@ -7,7 +7,7 @@ import { Messages } from './BackupInventoryDetails.messages'; import { getStyles } from './BackupInventoryDetails.styles'; import { BackupInventoryDetailsProps } from './BackupInventoryDetails.types'; -export const BackupInventoryDetails: FC = ({ name, folder, dataModel }) => { +export const BackupInventoryDetails: FC = ({ name, folder, dataModel, compression }) => { const styles = useStyles(getStyles); const dataModelMsg = formatDataModel(dataModel); @@ -24,6 +24,11 @@ export const BackupInventoryDetails: FC = ({ name, {Messages.folder} {folder} )} + {compression && ( + + {Messages.compression} {compression} + + )} ); }; diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.types.ts b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.types.ts index 1e8f5b563ebc4..5d8a9f4503b2a 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.types.ts +++ b/public/app/percona/backup/components/BackupInventory/BackupInventoryDetails/BackupInventoryDetails.types.ts @@ -1,8 +1,9 @@ -import { BackupStatus, DataModel, RestoreStatus } from 'app/percona/backup/Backup.types'; +import { BackupStatus, Compression, DataModel, RestoreStatus } from 'app/percona/backup/Backup.types'; export interface BackupInventoryDetailsProps { name: string; status: BackupStatus | RestoreStatus; dataModel: DataModel; folder: string; + compression: Compression; } diff --git a/public/app/percona/backup/components/BackupInventory/RestoreBackupModal/RestoreBackupModal.test.tsx b/public/app/percona/backup/components/BackupInventory/RestoreBackupModal/RestoreBackupModal.test.tsx index 42b812651f5b8..c472ea319a4d7 100644 --- a/public/app/percona/backup/components/BackupInventory/RestoreBackupModal/RestoreBackupModal.test.tsx +++ b/public/app/percona/backup/components/BackupInventory/RestoreBackupModal/RestoreBackupModal.test.tsx @@ -1,6 +1,6 @@ import { fireEvent, render, screen } from '@testing-library/react'; -import { BackupMode, BackupStatus, DataModel } from 'app/percona/backup/Backup.types'; +import { BackupMode, BackupStatus, DataModel, Compression } from 'app/percona/backup/Backup.types'; import { Databases } from 'app/percona/shared/core'; import { Backup } from '../BackupInventory.types'; @@ -21,6 +21,7 @@ describe('RestoreBackupModal', () => { vendor: Databases.mongodb, mode: BackupMode.SNAPSHOT, folder: 'folder1', + compression: Compression.NONE, }; it('should render', () => { diff --git a/public/app/percona/backup/components/BackupInventory/__mocks__/BackupInventory.service.ts b/public/app/percona/backup/components/BackupInventory/__mocks__/BackupInventory.service.ts index 1b2a954ffb9f4..1ca63836d94ba 100644 --- a/public/app/percona/backup/components/BackupInventory/__mocks__/BackupInventory.service.ts +++ b/public/app/percona/backup/components/BackupInventory/__mocks__/BackupInventory.service.ts @@ -1,4 +1,4 @@ -import { DataModel, BackupStatus, BackupMode } from 'app/percona/backup/Backup.types'; +import { DataModel, BackupStatus, BackupMode, Compression } from 'app/percona/backup/Backup.types'; import { Databases } from 'app/percona/shared/core'; import * as service from '../BackupInventory.service'; @@ -18,6 +18,7 @@ export const stubs: Backup[] = [ vendor: Databases.mysql, mode: BackupMode.SNAPSHOT, folder: 'folder1', + compression: Compression.NONE, }, { id: 'backup_2', @@ -32,6 +33,7 @@ export const stubs: Backup[] = [ vendor: Databases.mysql, mode: BackupMode.SNAPSHOT, folder: 'folder1', + compression: Compression.NONE, }, ]; diff --git a/public/app/percona/backup/components/RestoreHistory/RestoreHistory.types.ts b/public/app/percona/backup/components/RestoreHistory/RestoreHistory.types.ts index 9fbd123399f40..1ae6e361a8fff 100644 --- a/public/app/percona/backup/components/RestoreHistory/RestoreHistory.types.ts +++ b/public/app/percona/backup/components/RestoreHistory/RestoreHistory.types.ts @@ -13,7 +13,7 @@ export interface RestoreResponse { items: RawRestore[]; } -export interface Restore extends Omit { +export interface Restore extends Omit { id: string; artifactId: string; started: number; diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.service.ts b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.service.ts index 37c270f25781f..64e7e418314d0 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.service.ts +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.service.ts @@ -34,6 +34,7 @@ export const ScheduledBackupsService = { retention = 0, mode, folder, + compression, }) => ({ id: scheduled_backup_id, name, @@ -53,6 +54,7 @@ export const ScheduledBackupsService = { retryInterval: retry_interval, enabled: !!enabled, folder, + compression, }) ); }, diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx index 78a6e40a797c9..5d661a822b53b 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx @@ -87,6 +87,7 @@ export const ScheduledBackups: FC = () => { mode, dataModel, folder, + compression, } = backup; const newName = `${Messages.scheduledBackups.copyOf}${name}`; setActionPending(true); @@ -103,7 +104,8 @@ export const ScheduledBackups: FC = () => { false, mode, dataModel, - folder + folder, + compression ); getData(); } catch (e) { @@ -216,6 +218,7 @@ export const ScheduledBackups: FC = () => { description={row.original.description} cronExpression={row.original.cronExpression} folder={row.original.folder} + compression={row.original.compression} /> ), [] diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.types.ts b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.types.ts index 035be76a5edb1..74a8e6c5bb992 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.types.ts +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.types.ts @@ -1,6 +1,6 @@ import { Databases } from 'app/percona/shared/core'; -import { BackupMode, DataModel } from '../../Backup.types'; +import { BackupMode, Compression, DataModel } from '../../Backup.types'; export interface RawScheduledBackup { scheduled_backup_id: string; @@ -21,6 +21,7 @@ export interface RawScheduledBackup { retention: number; mode: BackupMode; folder: string; + compression: Compression; } export interface ScheduledBackupResponse { @@ -46,4 +47,5 @@ export interface ScheduledBackup { mode: BackupMode; enabled: boolean; folder: string; + compression: Compression; } diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.messages.ts b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.messages.ts index 2032ee15697ed..3a0b0b920a72d 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.messages.ts +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.messages.ts @@ -4,4 +4,5 @@ export const Messages = { dataModel: 'Data model', cronExpression: 'Cron expression', folder: 'Folder', + compression: 'Compression', }; diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.test.tsx b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.test.tsx index a30e632d7b8d4..c7905cb4817d6 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.test.tsx +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.test.tsx @@ -1,6 +1,6 @@ import { render, screen } from '@testing-library/react'; -import { DataModel } from 'app/percona/backup/Backup.types'; +import { Compression, DataModel } from 'app/percona/backup/Backup.types'; import { ScheduledBackupDetails } from './ScheduledBackupsDetails'; @@ -13,6 +13,7 @@ describe('ScheduledBackupsDetails', () => { dataModel={DataModel.PHYSICAL} cronExpression=" * * * 1,3 0" folder="folder1" + compression={Compression.NONE} /> ); expect(screen.getByTestId('scheduled-backup-details-wrapper')).toBeInTheDocument(); @@ -21,5 +22,6 @@ describe('ScheduledBackupsDetails', () => { expect(screen.getByTestId('scheduled-backup-details-cron')).toBeInTheDocument(); expect(screen.getByTestId('scheduled-backup-details-data-model')).toBeInTheDocument(); expect(screen.getByTestId('scheduled-backup-details-folder')).toBeInTheDocument(); + expect(screen.getByTestId('scheduled-backup-details-compression')).toBeInTheDocument(); }); }); diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.tsx b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.tsx index 4af9cd9753081..b59d4cf06e541 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.tsx +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.tsx @@ -15,6 +15,7 @@ export const ScheduledBackupDetails: FC = ({ dataModel, cronExpression, folder, + compression, }) => { const styles = useStyles(getStyles); const dataModelMsg = formatDataModel(dataModel); @@ -38,6 +39,11 @@ export const ScheduledBackupDetails: FC = ({ {Messages.folder} {folder} )} + {compression && ( + + {Messages.compression} {compression} + + )} ); }; diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.types.ts b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.types.ts index d92c5f53ffb96..d3f07ae35f784 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.types.ts +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsDetails/ScheduledBackupsDetails.types.ts @@ -1,4 +1,4 @@ -import { DataModel } from 'app/percona/backup/Backup.types'; +import { Compression, DataModel } from 'app/percona/backup/Backup.types'; export interface ScheduledBackupDetailsProps { name: string; @@ -6,4 +6,5 @@ export interface ScheduledBackupDetailsProps { dataModel: DataModel; cronExpression: string; folder: string; + compression: Compression; } diff --git a/public/app/percona/backup/components/ScheduledBackups/__mocks__/ScheduledBackups.service.ts b/public/app/percona/backup/components/ScheduledBackups/__mocks__/ScheduledBackups.service.ts index 29af28d3fd4d7..390d7101b4ac2 100644 --- a/public/app/percona/backup/components/ScheduledBackups/__mocks__/ScheduledBackups.service.ts +++ b/public/app/percona/backup/components/ScheduledBackups/__mocks__/ScheduledBackups.service.ts @@ -1,4 +1,4 @@ -import { BackupMode, DataModel } from 'app/percona/backup/Backup.types'; +import { BackupMode, DataModel, Compression } from 'app/percona/backup/Backup.types'; import { Databases } from 'app/percona/shared/core'; import * as service from '../ScheduledBackups.service'; @@ -24,6 +24,7 @@ export const stubs: ScheduledBackup[] = [ retryInterval: '10s', retryTimes: 1, folder: 'folder1', + compression: Compression.NONE, }, { id: 'backup_2', @@ -44,6 +45,7 @@ export const stubs: ScheduledBackup[] = [ retryInterval: '0s', retryTimes: 1, folder: 'folder1', + compression: Compression.NONE, }, ];