From 7fbd915e4f236c2a7f78d75bd460404836487a34 Mon Sep 17 00:00:00 2001 From: solovevayaroslavna Date: Tue, 28 Feb 2023 13:09:07 +0400 Subject: [PATCH 1/4] PMM-11667-Adding-DBaaS-templates: add templates field --- .../components/DBCluster/DBCluster.service.ts | 13 ++++++++++++ .../components/DBCluster/DBCluster.types.ts | 20 ++++++++++++++++++ .../DBClusterAdvancedOptions.tsx | 5 +++++ .../DBClusterAdvancedOptions.types.ts | 1 + .../Templates/Templates.messages.tsx | 5 +++++ .../Templates/Templates.service.ts | 18 ++++++++++++++++ .../Templates/Templates.tsx | 21 +++++++++++++++++++ .../Templates/Templates.types.ts | 6 ++++++ .../DBClusterBasicOptions.messages.ts | 10 +++++---- .../DBClusterBasicOptions.tsx | 8 +++---- .../components/DBCluster/PSMDB.service.ts | 6 ++++++ .../components/DBCluster/XtraDB.service.ts | 6 ++++++ .../dbaas/addDBCluster/addDBCluster.ts | 7 +++++++ .../dbaas/updateDBCluster/updateDBCluster.ts | 9 +++++++- 14 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.messages.tsx create mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.service.ts create mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.tsx create mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.types.ts diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts b/public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts index 4a6abc53885ea..9893dad967e84 100644 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts +++ b/public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts @@ -22,6 +22,9 @@ import { DBClusterListResponse, DBClusterSecretsResponse, DBClusterSecretsRequest, + DBClusterTemplatesResponse, + DBClusterTemplatesRequest, + DBClusterType, } from './DBCluster.types'; import { formatResources } from './DBCluster.utils'; @@ -108,4 +111,14 @@ export abstract class DBClusterService { }; }); } + static async getDBClusterTemplates( + kubernetesClusterName: string, + k8sClusterType: DBClusterType + ): Promise { + return apiManagement.post( + '/DBaaS/Templates/List', + { kubernetes_cluster_name: kubernetesClusterName, cluster_type: k8sClusterType }, + true + ); + } } diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts b/public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts index 79cccc760f35e..ebbdfcc3ee7f7 100644 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts +++ b/public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts @@ -15,6 +15,11 @@ export enum DBClusterType { psmdb = 'DB_CLUSTER_TYPE_PSMDB', } +export const DatabaseToDBClusterTypeMapping: Partial> = { + [Databases.mysql]: DBClusterType.pxc, + [Databases.mongodb]: DBClusterType.psmdb, +}; + export interface DBCluster { clusterName: string; kubernetesClusterName: string; @@ -39,6 +44,7 @@ export interface DBCluster { storageClass?: string; backup?: DBaaSBackup; restore?: DBaaSRestore; + template?: DBClusterTemplate; } interface DBaaSBackup { @@ -189,6 +195,7 @@ export interface DBClusterPayload { pxcConfiguration?: string; internet_facing?: boolean; source_ranges?: string[]; + template?: DBClusterTemplate; } export interface DBClusterActionAPI { @@ -243,6 +250,19 @@ export interface DBClusterSecretsRequest { kubernetes_cluster_name: string; } +export interface DBClusterTemplate { + name: string; + kind: string; +} +export interface DBClusterTemplatesResponse { + templates: DBClusterTemplate[]; +} + +export interface DBClusterTemplatesRequest { + kubernetes_cluster_name: string; + cluster_type: DBClusterType; +} + export interface DBClusterSecret { name: string; } diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx index d401a1a96cf1a..d2cb6dbbce9a9 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx @@ -33,6 +33,7 @@ import { getStyles } from './DBClusterAdvancedOptions.styles'; import { AdvancedOptionsFields, DBClusterResources } from './DBClusterAdvancedOptions.types'; import { canGetExpectedResources, nodesValidator, resourceValidator } from './DBClusterAdvancedOptions.utils'; import NetworkAndSecurity from './NetworkAndSecurity/NetworkAndSecurity'; +import Templates from './Templates/Templates'; export interface DBClusterAdvancedOptionsProps extends FormRenderProps { mode: DBClusterPageMode; @@ -206,6 +207,10 @@ export const DBClusterAdvancedOptions: FC = ({ return (
<>{showUnsafeConfigurationWarning && } +
>> { + const dbClusterType = DatabaseToDBClusterTypeMapping[databaseType]; + const templatesResponse = + dbClusterType && (await DBClusterService.getDBClusterTemplates(k8sClusterName, dbClusterType)); + const templates = templatesResponse?.templates || []; + return templates.map((template) => ({ + label: template.name, + value: template.kind, + })); + }, +}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.tsx new file mode 100644 index 0000000000000..b7e2681dd4906 --- /dev/null +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.tsx @@ -0,0 +1,21 @@ +import { AsyncSelectField } from '@percona/platform-core'; +import React, { FC } from 'react'; + +import { AdvancedOptionsFields } from '../DBClusterAdvancedOptions.types'; + +import { Messages } from './Templates.messages'; +import { TemplatesService } from './Templates.service'; +import { TemplatesProps } from './Templates.types'; + +export const Templates: FC = ({ k8sClusterName, databaseType }) => { + return ( + TemplatesService.loadTemplatesOptions(k8sClusterName, databaseType)} + defaultOptions + /> + ); +}; + +export default Templates; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.types.ts new file mode 100644 index 0000000000000..0755f0b8631e3 --- /dev/null +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.types.ts @@ -0,0 +1,6 @@ +import { Databases } from '../../../../../../shared/core'; + +export interface TemplatesProps { + k8sClusterName: string; + databaseType: Databases; +} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.messages.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.messages.ts index eac9d0a108f22..0f79951a104eb 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.messages.ts +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.messages.ts @@ -1,7 +1,9 @@ export const Messages = { - clusterName: 'Cluster Name', - kubernetesCluster: 'Kubernetes Cluster', - databaseType: 'Database Type', - databaseVersion: 'Database Version', noOperatorsMessage: 'No clusters found with installed operators', + labels: { + clusterName: 'Cluster Name', + databaseType: 'Database Type', + databaseVersion: 'Database Version', + kubernetesCluster: 'Kubernetes Cluster', + }, }; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx index 35e7feaa80d4d..61aa1282e2f33 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx @@ -93,7 +93,7 @@ export const DBClusterBasicOptions: FC = ({ kubernet = ({ kubernet disabled={!form.getState().values[BasicOptionsFields.kubernetesCluster] || !databaseOptions.length} dataTestId="dbcluster-database-type-field" name={BasicOptionsFields.databaseType} - label={Messages.databaseType} + label={Messages.labels.databaseType} options={databaseOptions} component={SelectFieldAdapter} validate={optionRequired} @@ -115,7 +115,7 @@ export const DBClusterBasicOptions: FC = ({ kubernet disabled={isDatabaseVersionDisabled} dataTestId="dbcluster-database-version-field" name={BasicOptionsFields.databaseVersion} - label={Messages.databaseVersion} + label={Messages.labels.databaseVersion} component={AsyncSelectFieldAdapter} loading={loadingDatabaseVersions} options={databaseVersions} @@ -124,7 +124,7 @@ export const DBClusterBasicOptions: FC = ({ kubernet
{settings?.backupEnabled && } diff --git a/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts b/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts index 88d4414243ec7..606e85b450c56 100644 --- a/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts +++ b/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts @@ -185,6 +185,12 @@ const toAPI = (dbCluster: DBCluster): DBClusterPayload => ({ }, }), }, + ...(dbCluster.template && { + template: { + name: dbCluster.template.name, + kind: dbCluster.template.kind, + }, + }), }); const toSuspendAPI = (dbCluster: DBCluster) => ({ diff --git a/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts b/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts index c7dffc6b9c96c..274e83e92c427 100644 --- a/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts +++ b/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts @@ -202,6 +202,12 @@ const toAPI = (dbCluster: DBCluster): DBClusterPayload => ({ }, }), }, + ...(dbCluster.template && { + template: { + name: dbCluster.template.name, + kind: dbCluster.template.kind, + }, + }), }); const toSuspendAPI = (dbCluster: DBCluster) => ({ diff --git a/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts b/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts index 4214b70101242..af8675c3542dc 100644 --- a/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts +++ b/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts @@ -71,6 +71,7 @@ export const addDbClusterAction = createAsyncThunk( secretsName, enableRestore, enableBackups, + template, } = args.values; const dbClusterService = newDBClusterService(databaseType.value); @@ -120,6 +121,12 @@ export const addDbClusterAction = createAsyncThunk( secretsName: secretsName?.value || '', }, }), + ...(template && { + template: { + name: template.label, + kind: template.value, + }, + }), }), { successMessage: 'Cluster was successfully added', diff --git a/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts b/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts index bb66923296c6d..a4a80b02e246d 100644 --- a/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts +++ b/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts @@ -42,7 +42,8 @@ const perconaUpdateDBClusterSlice = createSlice({ export const updateDBClusterAction = createAsyncThunk( 'percona/updateDBCluster', async (args: { values: Record; selectedDBCluster: DBCluster }, thunkAPI): Promise => { - const { cpu, memory, disk, nodes, configuration, sourceRanges, expose, internetFacing, storageClass } = args.values; + const { cpu, memory, disk, nodes, configuration, sourceRanges, expose, internetFacing, storageClass, template } = + args.values; const { selectedDBCluster } = args; const dbClusterService = newDBClusterService(selectedDBCluster.databaseType); @@ -63,6 +64,12 @@ export const updateDBClusterAction = createAsyncThunk( configuration, sourceRanges: sourceRanges ? sourceRanges.map((item: any) => item?.sourceRange || '') : [], ...(storageClass?.value && { storageClass: storageClass?.value }), + ...(template && { + template: { + name: template.label, + kind: template.value, + }, + }), }), { successMessage: 'Cluster was successfully updated', From 0d03289a35d08e7d439d3b02584fd3c6b4a852d7 Mon Sep 17 00:00:00 2001 From: solovevayaroslavna Date: Tue, 28 Feb 2023 22:24:35 +0400 Subject: [PATCH 2/4] PMM-11667-Adding-DBaaS-templates: fix update form prefill --- .../EditDBClusterPage.utils.ts | 22 +++++++++---------- .../components/DBCluster/PSMDB.service.ts | 1 + .../components/DBCluster/XtraDB.service.ts | 1 + 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts index c1353ad6adbef..a418b81711625 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts @@ -67,28 +67,28 @@ export const getEditInitialValues = ( selectedDBCluster: DBCluster, configuration: DBClusterPayload | undefined ): UpdateDBClusterFormValues => { - const isCluster = selectedDBCluster.clusterSize > 1; - const sourceRangesArray = configuration?.source_ranges?.map((item) => ({ sourceRange: item })) || [{}]; + const { template, clusterSize, sourceRanges, databaseType, cpu, disk, memory } = selectedDBCluster; + const isCluster = clusterSize > 1; + const sourceRangesArray = sourceRanges?.map((item) => ({ sourceRange: item })) || [{}]; const storageClass = configuration?.params?.replicaset?.storage_class || configuration?.params?.pxc?.storage_class; const clusterParameters: UpdateDBClusterFormValues = { - nodes: isCluster ? selectedDBCluster.clusterSize : MIN_NODES, + nodes: isCluster ? clusterSize : MIN_NODES, databaseType: { - value: selectedDBCluster.databaseType, - label: DATABASE_LABELS[selectedDBCluster.databaseType], + value: databaseType, + label: DATABASE_LABELS[databaseType], }, - cpu: selectedDBCluster.cpu, - disk: selectedDBCluster.disk, - memory: selectedDBCluster.memory, + cpu, + disk, + memory, configuration: configuration?.params?.pxc?.configuration || configuration?.params?.replicaset?.configuration, expose: configuration?.exposed, internetFacing: configuration?.internet_facing, sourceRanges: sourceRangesArray, ...(storageClass && { storageClass: { label: storageClass, value: storageClass } }), + ...(template && { template: { label: template.name, value: template.kind } }), }; const isMatchSize = (type: DBClusterResources) => - DEFAULT_SIZES[type].cpu === selectedDBCluster.cpu && - DEFAULT_SIZES[type].memory === selectedDBCluster.memory && - DEFAULT_SIZES[type].disk === selectedDBCluster.disk; + DEFAULT_SIZES[type].cpu === cpu && DEFAULT_SIZES[type].memory === memory && DEFAULT_SIZES[type].disk === disk; if (isMatchSize(DBClusterResources.small)) { clusterParameters.resources = DBClusterResources.small; diff --git a/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts b/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts index 606e85b450c56..e51c73dbf5efe 100644 --- a/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts +++ b/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts @@ -148,6 +148,7 @@ export class PSMDBService extends DBClusterService { expose: dbCluster.exposed, installedImage: dbCluster.installed_image, availableImage: dbCluster.available_image, + template: dbCluster.template, }; } } diff --git a/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts b/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts index 274e83e92c427..727f9a5879982 100644 --- a/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts +++ b/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts @@ -157,6 +157,7 @@ export class XtraDBService extends DBClusterService { expose: dbCluster.exposed, installedImage: dbCluster.installed_image, availableImage: dbCluster.available_image, + template: dbCluster.template, }; } } From 7615b30fa6e33831c7f578c0a7d0ac3d38bebb92 Mon Sep 17 00:00:00 2001 From: solovevayaroslavna Date: Wed, 1 Mar 2023 09:56:51 +0400 Subject: [PATCH 3/4] PMM-11667-Adding-DBaaS-templates: fix tests --- .../DBClusterAdvancedOptions.test.tsx | 2 ++ .../EditDBClusterPage/hooks/DBClusterHooks.test.tsx | 3 +++ .../components/DBCluster/__mocks__/DBCluster.service.ts | 6 +++++- .../components/DBCluster/__mocks__/dbClustersStubs.ts | 8 ++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.test.tsx index 58943d7758803..d22a44d409650 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.test.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.test.tsx @@ -49,6 +49,7 @@ describe('DBClusterAdvancedOptions::', () => { const advancedOptions = screen.getByTestId('dbCluster-advanced-settings'); waitFor(() => fireEvent.click(advancedOptions)); + expect(await screen.getByTestId('template-field-container')).toBeInTheDocument(); expect(await screen.getByTestId('nodes-number-input')).toBeInTheDocument(); expect(await screen.getByTestId('resources-field-container')).toBeInTheDocument(); expect(await screen.getByTestId('memory-number-input')).toBeInTheDocument(); @@ -81,6 +82,7 @@ describe('DBClusterAdvancedOptions::', () => { ) ); + expect(await screen.getByTestId('template-field-container')).toBeInTheDocument(); expect(await screen.getByTestId('nodes-number-input')).toBeInTheDocument(); expect(await screen.getByTestId('resources-field-container')).toBeInTheDocument(); expect(await screen.getByTestId('memory-number-input')).toBeInTheDocument(); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/DBClusterHooks.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/DBClusterHooks.test.tsx index 289818dd14e0c..fbeccb915a3f1 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/DBClusterHooks.test.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/DBClusterHooks.test.tsx @@ -12,6 +12,7 @@ import { Kubernetes } from '../../../Kubernetes/Kubernetes.types'; import { KubernetesClusterStatus } from '../../../Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; import { KubernetesOperatorStatus } from '../../../Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; import { DBClusterStatus } from '../../DBCluster.types'; +import { dbClusterTemplatesApi } from '../../__mocks__/dbClustersStubs'; import { DBClusterResources } from '../DBClusterAdvancedOptions/DBClusterAdvancedOptions.types'; import { AddDBClusterFormValues, UpdateDBClusterFormValues } from '../EditDBClusterPage.types'; @@ -120,6 +121,7 @@ describe('DBClusterHooks::', () => { disk: 1003, status: DBClusterStatus.unknown, message: 'Error', + template: dbClusterTemplatesApi[0], }, }, }, @@ -138,6 +140,7 @@ describe('DBClusterHooks::', () => { disk: 1003, nodes: 1, resources: DBClusterResources.custom, + template: expect.objectContaining({ value: dbClusterTemplatesApi[0].kind }), }) ); }); diff --git a/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts b/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts index 647b01cbfc5ce..219b6cb526cf6 100644 --- a/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts +++ b/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts @@ -1,6 +1,6 @@ import { DBClusterAllocatedResources } from '../DBCluster.types'; -import { dbCLusterAllocatedResourcesStub, dbClusterLogsAPI } from './dbClustersStubs'; +import { dbCLusterAllocatedResourcesStub, dbClusterLogsAPI, dbClusterTemplatesApi } from './dbClustersStubs'; export class DBClusterService { static async getLogs() { @@ -13,4 +13,8 @@ export class DBClusterService { static async getDBClusters() { return Promise.resolve(); } + + static getDBClusterTemplates() { + return Promise.resolve(dbClusterTemplatesApi); + } } diff --git a/public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts b/public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts index a0b88ee10afc0..3cb6481d12040 100644 --- a/public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts +++ b/public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts @@ -9,6 +9,7 @@ import { DBClusterComponentVersionStatus, DBClusterAllocatedResources, ResourcesWithUnits, + DBClusterTemplate, } from '../DBCluster.types'; import { Operators } from '../EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; @@ -143,6 +144,13 @@ export const dbClusterLogsAPI = { ], }; +export const dbClusterTemplatesApi: DBClusterTemplate[] = [ + { + name: 'template-name', + kind: 'template-kind', + }, +]; + export const dbCLusterAllocatedResourcesStub: DBClusterAllocatedResources = { total: { cpu: { value: 10, units: CpuUnits.MILLI, original: 10 }, From 8f5d00519cf5218320107ee9cf2f5b1107a8d6cd Mon Sep 17 00:00:00 2001 From: solovevayaroslavna Date: Wed, 1 Mar 2023 13:53:30 +0400 Subject: [PATCH 4/4] PMM-11667-Adding-DBaaS-templates: draft --- .../DBClusterAdvancedOptions.tsx | 4 +- .../DBClusterBasicOptions.hooks.ts | 3 +- .../DBClusterBasicOptions.tsx | 1 + .../DBClusterBasicOptions.types.ts | 6 +- .../Restore/Restore.test.tsx | 12 ++-- .../Restore/Restore.types.ts | 4 +- .../DBaaSBackups/DBaaSBackups.tsx | 4 +- .../EditDBClusterPage/EditDBClusterPage.tsx | 8 +-- .../EditDBClusterPage.types.ts | 57 ++++++++++++++++--- .../EditDBClusterPage.utils.ts | 4 ++ 10 files changed, 79 insertions(+), 24 deletions(-) diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx index d2cb6dbbce9a9..b39d6dbbecf85 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx @@ -15,7 +15,7 @@ import { DBCluster, DBClusterAllocatedResources, DBClusterExpectedResources } fr import { getExpectedResourcesDifference, newDBClusterService } from '../../DBCluster.utils'; import { ResourcesBar } from '../../ResourcesBar/ResourcesBar'; import { optionRequired } from '../DBClusterBasicOptions/DBClusterBasicOptions.utils'; -import { DBClusterPageMode } from '../EditDBClusterPage.types'; +import { DBClusterPageMode, EditDBClusterForm } from '../EditDBClusterPage.types'; import { UnsafeConfigurationWarning } from '../UnsafeConfigurationsWarning/UnsafeConfigurationWarning'; import Configurations from './Configurations/Configurations'; @@ -35,7 +35,7 @@ import { canGetExpectedResources, nodesValidator, resourceValidator } from './DB import NetworkAndSecurity from './NetworkAndSecurity/NetworkAndSecurity'; import Templates from './Templates/Templates'; -export interface DBClusterAdvancedOptionsProps extends FormRenderProps { +export interface DBClusterAdvancedOptionsProps extends FormRenderProps { mode: DBClusterPageMode; showUnsafeConfigurationWarning: boolean; setShowUnsafeConfigurationWarning: React.Dispatch>; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.hooks.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.hooks.ts index bef95c5f5f624..75d801c09d7e3 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.hooks.ts +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.hooks.ts @@ -5,12 +5,13 @@ import { useEffect } from 'react'; import { SelectableValue } from '@grafana/data/src'; import { isOptionEmpty, newDBClusterService } from '../../DBCluster.utils'; +import { EditDBClusterForm } from '../EditDBClusterPage.types'; import { BasicOptionsFields } from './DBClusterBasicOptions.types'; import { findDefaultDatabaseVersion } from './DBClusterBasicOptions.utils'; export const useDatabaseVersions = ( - form: FormApi, + form: FormApi>, databaseType: SelectableValue, kubernetesCluster: SelectableValue, setLoadingDatabaseVersions: (loading: boolean) => void, diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx index 61aa1282e2f33..5486185f4b19d 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx @@ -50,6 +50,7 @@ export const DBClusterBasicOptions: FC = ({ kubernet const { required, maxLength } = validators; const { change } = form; const { kubernetesCluster, databaseType } = form.getState().values; + debugger; const [databaseVersions, setDatabaseVersions] = useState([]); const [loadingDatabaseVersions, setLoadingDatabaseVersions] = useState(false); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types.ts index 155dbced16c1e..bec5e242a492f 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types.ts +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types.ts @@ -1,14 +1,16 @@ import { FormApi } from 'final-form'; +import { SelectableValue } from '@grafana/data'; import { Databases } from 'app/percona/shared/core'; import { Kubernetes, OperatorsList } from '../../../Kubernetes/Kubernetes.types'; +import { EditDBClusterForm } from '../EditDBClusterPage.types'; import { RestoreFieldsProps } from './Restore/Restore.types'; export interface DBClusterBasicOptionsProps { kubernetes: Kubernetes[]; - form: FormApi; + form: FormApi>; } export enum Operators { @@ -48,7 +50,7 @@ export enum BasicOptionsFields { export interface BasicOptionsFieldsProps extends RestoreFieldsProps { [BasicOptionsFields.name]?: string; - [BasicOptionsFields.kubernetesCluster]?: KubernetesOption; + [BasicOptionsFields.kubernetesCluster]?: SelectableValue; [BasicOptionsFields.databaseType]?: DatabaseOptionInitial; [BasicOptionsFields.databaseVersion]?: string; } diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.test.tsx index 1948e9c5a3dd2..5047a70402bee 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.test.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.test.tsx @@ -1,10 +1,11 @@ import { screen, render, waitFor, fireEvent } from '@testing-library/react'; import React from 'react'; -import { Form } from 'react-final-form'; +import { Form, FormRenderProps } from 'react-final-form'; import { Provider } from 'react-redux'; import { configureStore } from '../../../../../../../store/configureStore'; import { StoreState } from '../../../../../../../types'; +import { EditDBClusterForm } from '../../EditDBClusterPage.types'; import { Restore } from './Restore'; @@ -26,7 +27,10 @@ describe('DBaaS DBCluster creation Restore section ::', () => { await waitFor(() => render( -
} /> + ) => } + /> ) ); @@ -47,7 +51,7 @@ describe('DBaaS DBCluster creation Restore section ::', () => { value: 'location1', }, }} - render={({ form }) => { + render={({ form }: FormRenderProps) => { return ; }} /> @@ -72,7 +76,7 @@ describe('DBaaS DBCluster creation Restore section ::', () => { value: 'cluster 1', }, }} - render={({ form }) => { + render={({ form }: FormRenderProps) => { return ; }} /> diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.types.ts index 9e1b95f26f05a..b60f50ba94dd4 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.types.ts +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/Restore/Restore.types.ts @@ -2,8 +2,10 @@ import { FormApi } from 'final-form'; import { SelectableValue } from '@grafana/data'; +import { EditDBClusterForm } from '../../EditDBClusterPage.types'; + export interface RestoreFromProps { - form: FormApi; + form: FormApi>; } export enum RestoreFields { diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx index 20b8253cb806f..48d7bec8cd550 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx @@ -10,13 +10,13 @@ import { MAX_RETENTION, MIN_RETENTION } from '../../../../../backup/components/A import { ScheduleSectionFields } from '../../../../../backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields'; import { SelectField } from '../../../../../shared/components/Form/SelectField'; import { getBackupLocations } from '../../../../../shared/core/selectors'; -import { AddDBClusterFormValues } from '../EditDBClusterPage.types'; +import { AddDBClusterFormValues, EditDBClusterForm } from '../EditDBClusterPage.types'; import { Messages } from '././DBaaSBackups.messages'; import { getStyles } from './DBaaSBackups.styles'; import { DBaaSBackupFields } from './DBaaSBackups.types'; -export const DBaaSBackups: FC = ({ values }) => { +export const DBaaSBackups: FC> = ({ values }) => { const styles = useStyles(getStyles); const [enableBackups, setEnableBackups] = useState(false); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx index 5328c4d4d60de..d57501b6acdd7 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/display-name */ import arrayMutators from 'final-form-arrays'; import React, { FC, useCallback, useEffect, useState } from 'react'; -import { Form } from 'react-final-form'; +import { Form as FinalForm } from 'react-final-form'; import { Redirect, useHistory } from 'react-router-dom'; import { Spinner, useStyles2 } from '@grafana/ui/src'; @@ -30,7 +30,7 @@ import DBaaSBackups from './DBaaSBackups/DBaaSBackups'; import { DB_CLUSTER_INVENTORY_URL } from './EditDBClusterPage.constants'; import { Messages } from './EditDBClusterPage.messages'; import { getStyles } from './EditDBClusterPage.styles'; -import { EditDBClusterPageProps } from './EditDBClusterPage.types'; +import { EditDBClusterForm, EditDBClusterPageProps } from './EditDBClusterPage.types'; import { generateUID } from './EditDBClusterPage.utils'; import { useDefaultMode } from './hooks/useDefaultMode'; import { useEditDBClusterFormSubmit } from './hooks/useEditDBClusterFormSubmit'; @@ -80,9 +80,9 @@ export const EditDBClusterPage: FC = () => { ) : kubernetes && kubernetes?.length > 0 ? ( - onSubmit(values)} mutators={{ setClusterName: (databaseTypeValue: string, state, { changeValue }) => { changeValue(state, `${BasicOptionsFields.name}`, () => `${databaseTypeValue}-${generateUID()}`); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts index b1a6f9d1fd8ad..64feffea8d182 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts @@ -1,15 +1,21 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { SelectableValue } from '@grafana/data/src'; -import { ScheduledSectionFieldsValuesProps } from '../../../../backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields.types'; +import { ScheduleSectionFields } from '../../../../backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields.types'; import { Settings } from '../../../../settings/Settings.types'; +import { PeriodType } from '../../../../shared/helpers/cron/types'; import { Kubernetes } from '../../Kubernetes/Kubernetes.types'; import { ConfigurationFields } from './DBClusterAdvancedOptions/Configurations/Configurations.types'; import { AdvancedOptionsFields, DBClusterResources } from './DBClusterAdvancedOptions/DBClusterAdvancedOptions.types'; import { NetworkAndSecurityFields } from './DBClusterAdvancedOptions/NetworkAndSecurity/NetworkAndSecurity.types'; -import { BasicOptionsFields, BasicOptionsFieldsProps } from './DBClusterBasicOptions/DBClusterBasicOptions.types'; -import { DBaaSBackupProps } from './DBaaSBackups/DBaaSBackups.types'; +import { + BasicOptionsFields, + DatabaseOptionInitial, + KubernetesOption, +} from './DBClusterBasicOptions/DBClusterBasicOptions.types'; +import { RestoreFields } from './DBClusterBasicOptions/Restore/Restore.types'; +import { DBaaSBackupFields } from './DBaaSBackups/DBaaSBackups.types'; export type DBClusterPageMode = 'create' | 'edit' | 'list'; export interface EditDBClusterPageProps { @@ -27,12 +33,33 @@ export interface DBClusterCommonFormValues { [NetworkAndSecurityFields.sourceRanges]?: Array<{}> | []; [NetworkAndSecurityFields.internetFacing]?: boolean; } -export interface AddDBClusterFormValues - extends ScheduledSectionFieldsValuesProps, - DBClusterCommonFormValues, - DBaaSBackupProps, - BasicOptionsFieldsProps { +export interface AddDBClusterFormValues { + [BasicOptionsFields.name]?: string; + [BasicOptionsFields.kubernetesCluster]?: KubernetesOption; + [BasicOptionsFields.databaseType]?: DatabaseOptionInitial; + [BasicOptionsFields.databaseVersion]?: string; + [DBaaSBackupFields.location]?: SelectableValue; + [DBaaSBackupFields.retention]?: number; + [AdvancedOptionsFields.nodes]: number; + [AdvancedOptionsFields.memory]: number; + [AdvancedOptionsFields.cpu]: number; + [AdvancedOptionsFields.disk]: number; + [ConfigurationFields.configuration]?: string; + [ConfigurationFields.storageClass]?: SelectableValue; + [NetworkAndSecurityFields.expose]?: boolean; + [NetworkAndSecurityFields.sourceRanges]?: Array<{}> | []; + [NetworkAndSecurityFields.internetFacing]?: boolean; + [ScheduleSectionFields.period]?: SelectableValue; + [ScheduleSectionFields.month]?: Array>; + [ScheduleSectionFields.day]?: Array>; + [ScheduleSectionFields.weekDay]?: Array>; + [ScheduleSectionFields.startHour]?: Array>; + [ScheduleSectionFields.startMinute]?: Array>; [AdvancedOptionsFields.resources]: DBClusterResources; + [RestoreFields.restoreFrom]?: SelectableValue; + + [RestoreFields.backupArtifact]?: SelectableValue; + [RestoreFields.secretsName]?: SelectableValue; } export interface UpdateDBClusterFormValues extends DBClusterCommonFormValues { @@ -47,3 +74,17 @@ export interface DBClusterFormSubmitProps { } export type ClusterSubmit = (values: Record) => Promise; + +// export interface EditDBClusterForm { +// [AdvancedOptionsFields.nodes]: number; +// [AdvancedOptionsFields.memory]: number; +// [AdvancedOptionsFields.cpu]: number; +// [AdvancedOptionsFields.disk]: number; +// [ConfigurationFields.configuration]?: string; +// [ConfigurationFields.storageClass]?: SelectableValue; +// [NetworkAndSecurityFields.expose]?: boolean; +// [NetworkAndSecurityFields.sourceRanges]?: Array<{}> | []; +// [NetworkAndSecurityFields.internetFacing]?: boolean; +// + +export type EditDBClusterForm = AddDBClusterFormValues & UpdateDBClusterFormValues; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts index a418b81711625..2b5f88b285c18 100644 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts +++ b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts @@ -43,6 +43,8 @@ export const getAddInitialValues = ( } } + debugger; + return initialValues; }; @@ -100,5 +102,7 @@ export const getEditInitialValues = ( clusterParameters.resources = DBClusterResources.custom; } + debugger; + return clusterParameters; };