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.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/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx index d401a1a96cf1a..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'; @@ -33,8 +33,9 @@ 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 { +export interface DBClusterAdvancedOptionsProps extends FormRenderProps { mode: DBClusterPageMode; showUnsafeConfigurationWarning: boolean; setShowUnsafeConfigurationWarning: React.Dispatch>; @@ -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.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.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..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); @@ -93,7 +94,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 +116,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 +125,7 @@ export const DBClusterBasicOptions: FC = ({ kubernet
{settings?.backupEnabled && } 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 c1353ad6adbef..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; }; @@ -67,28 +69,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; @@ -100,5 +102,7 @@ export const getEditInitialValues = ( clusterParameters.resources = DBClusterResources.custom; } + debugger; + return clusterParameters; }; 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/PSMDB.service.ts b/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts index 88d4414243ec7..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, }; } } @@ -185,6 +186,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..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, }; } } @@ -202,6 +203,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/__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 }, 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',