From 8631374684acaa777e7669537df6193b03e5bd13 Mon Sep 17 00:00:00 2001 From: Matej Kubinec <32638572+matejkubinec@users.noreply.github.com> Date: Tue, 31 Oct 2023 13:39:34 +0100 Subject: [PATCH 01/10] PMM-12544 Add deprecation notice for DBaaS (#692) * PMM-12544 Add deprecation notice for DBaaS * PMM-12544 Remove K8s promotion message * PMM-12544 Removed unnecessary unit test --- .../dbaas/components/DBCluster/DBCluster.tsx | 2 ++ .../DeprecationWarning.constants.ts | 2 ++ .../DeprecationWarning.messages.ts | 8 +++++ .../DeprecationWarning/DeprecationWarning.tsx | 24 +++++++++++++ .../components/DeprecationWarning/index.ts | 3 ++ .../Kubernetes/KubernetesInventory.test.tsx | 30 ---------------- .../Kubernetes/KubernetesInventory.tsx | 4 +-- ...alK8sFreeClusterPromotingMessage.styles.ts | 18 ---------- .../PortalK8sFreeClusterPromotingMessage.tsx | 30 ---------------- .../app/percona/settings/Settings.messages.ts | 1 + .../settings/components/Advanced/Advanced.tsx | 34 +++++++++++-------- 11 files changed, 62 insertions(+), 94 deletions(-) create mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts create mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts create mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx create mode 100644 public/app/percona/dbaas/components/DeprecationWarning/index.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.tsx diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.tsx b/public/app/percona/dbaas/components/DBCluster/DBCluster.tsx index 03e38fe858833..8136d1174d85c 100644 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.tsx +++ b/public/app/percona/dbaas/components/DBCluster/DBCluster.tsx @@ -23,6 +23,7 @@ import { fetchDBClustersAction } from '../../../shared/core/reducers/dbaas/dbClu import { selectDBCluster, selectKubernetesCluster } from '../../../shared/core/reducers/dbaas/dbaas'; import { useUpdateOfKubernetesList } from '../../hooks/useKubernetesList'; import { AddClusterButton } from '../AddClusterButton/AddClusterButton'; +import DbaasDeprecationWarning from '../DeprecationWarning'; import { isKubernetesListUnavailable } from '../Kubernetes/Kubernetes.utils'; import { KubernetesClusterStatus } from '../Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; @@ -215,6 +216,7 @@ export const DBCluster: FC = () => { +
diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts new file mode 100644 index 0000000000000..c97ec8a791ef0 --- /dev/null +++ b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts @@ -0,0 +1,2 @@ +export const EVEREST_LINK = 'http://per.co.na/pmm-to-everest'; +export const MIGRATION_GUIDE_LINK = 'http://per.co.na/pmm-to-everest-guide'; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts new file mode 100644 index 0000000000000..a069cbf9b1342 --- /dev/null +++ b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts @@ -0,0 +1,8 @@ +export const Messages = { + title: 'Deprecation notice', + warning: 'DBaaS feature is deprecated. We encourage you to use ', + everest: 'Everest', + warningCont: ' instead. Check out our ', + guide: 'Migration guide', + dot: '.', +}; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx new file mode 100644 index 0000000000000..4c0530e686453 --- /dev/null +++ b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx @@ -0,0 +1,24 @@ +import React, { FC } from 'react'; + +import { Alert } from '@grafana/ui'; + +import { EVEREST_LINK, MIGRATION_GUIDE_LINK } from './DeprecationWarning.constants'; +import { Messages } from './DeprecationWarning.messages'; + +const DbaasDeprecationWarning: FC = () => ( +
+ + {Messages.warning} + + {Messages.everest} + + {Messages.warningCont} + + {Messages.guide} + + {Messages.dot} + +
+); + +export default DbaasDeprecationWarning; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/index.ts b/public/app/percona/dbaas/components/DeprecationWarning/index.ts new file mode 100644 index 0000000000000..2d3b0cd490d7d --- /dev/null +++ b/public/app/percona/dbaas/components/DeprecationWarning/index.ts @@ -0,0 +1,3 @@ +import DbaasDeprecationWarning from './DeprecationWarning'; + +export default DbaasDeprecationWarning; diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx index 086541cb9bc6a..1a15940e94426 100644 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx +++ b/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx @@ -5,7 +5,6 @@ import { Provider } from 'react-redux'; import { configureStore } from 'app/store/configureStore'; import { StoreState } from 'app/types'; -import { KubernetesService } from './Kubernetes.service'; import { KubernetesClusterStatus } from './KubernetesClusterStatus/KubernetesClusterStatus.types'; import { KubernetesInventory } from './KubernetesInventory'; import { KubernetesOperatorStatus } from './OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; @@ -54,33 +53,4 @@ describe('KubernetesInventory::', () => { await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); expect(screen.getAllByTestId('table-row')).toHaveLength(2); }); - - it('shows portal k8s free cluster promoting message when user has no clusters', async () => { - jest.spyOn(KubernetesService, 'getKubernetes').mockImplementation(() => - Promise.resolve({ - kubernetes_clusters: [], - }) - ); - render( - - - - ); - - expect(screen.queryByTestId('pmm-server-promote-portal-k8s-cluster-message')).not.toBeInTheDocument(); - await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); - expect(screen.getByTestId('pmm-server-promote-portal-k8s-cluster-message')).toBeInTheDocument(); - }); }); diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx index cf352669baf47..3bde5afacd4fd 100644 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx +++ b/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx @@ -22,6 +22,7 @@ import { useSelector } from 'app/types'; import { useAppDispatch } from '../../../../store/store'; import { useKubernetesList } from '../../hooks/useKubernetesList'; import { AddClusterButton } from '../AddClusterButton/AddClusterButton'; +import DbaasDeprecationWarning from '../DeprecationWarning'; import { clusterActionsRender } from './ColumnRenderers/ColumnRenderers'; import { K8sPageMode } from './K8sRouting/K8sRouting'; @@ -37,7 +38,6 @@ import { KubernetesClusterStatus as K8SStatus } from './KubernetesClusterStatus/ import { ManageComponentsVersionsModal } from './ManageComponentsVersionsModal/ManageComponentsVersionsModal'; import { UpdateOperatorModal } from './OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal'; import { OperatorStatusRow } from './OperatorStatusRow/OperatorStatusRow'; -import { PortalK8sFreeClusterPromotingMessage } from './PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage'; import { ViewClusterConfigModal } from './ViewClusterConfigModal/ViewClusterConfigModal'; interface KubernetesInventoryProps { @@ -159,6 +159,7 @@ export const KubernetesInventory: FC = ({ setMode }) = +
@@ -231,7 +232,6 @@ export const KubernetesInventory: FC = ({ setMode }) = />
- {kubernetes && kubernetes.length === 0 && } ); diff --git a/public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.styles.ts b/public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.styles.ts deleted file mode 100644 index bcee9a464c907..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.styles.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme2 } from '@grafana/data'; - -export const getStyles = ({ v1: { spacing, palette } }: GrafanaTheme2) => ({ - link: css` - color: ${palette.gray4}; - padding-top: ${spacing.sm}; - text-decoration: underline; - &:hover { - color: white; - text-decoration: underline; - } - `, - alert: css` - margin-top: ${spacing.md}; - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.tsx b/public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.tsx deleted file mode 100644 index 083c66a0b932f..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/PortalK8sFreeClusterPromotingMessage/PortalK8sFreeClusterPromotingMessage.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; - -import { Alert, useStyles2 } from '@grafana/ui'; -import { useSelector } from 'app/types'; - -import { getPerconaServer } from '../../../../shared/core/selectors'; - -import { getStyles } from './PortalK8sFreeClusterPromotingMessage.styles'; - -export const PortalK8sFreeClusterPromotingMessage = () => { - const styles = useStyles2(getStyles); - const { saasHost } = useSelector(getPerconaServer); - - return ( - -

- Percona has a time-limited offer for testing DBaaS with a free k8s cluster. Please{' '} - - read more - {' '} - information about this offer. -

-
- ); -}; diff --git a/public/app/percona/settings/Settings.messages.ts b/public/app/percona/settings/Settings.messages.ts index 1f08cfd61c854..811ea8ef788e5 100644 --- a/public/app/percona/settings/Settings.messages.ts +++ b/public/app/percona/settings/Settings.messages.ts @@ -47,6 +47,7 @@ export const Messages = { 'These are technical preview features, not recommended to be used in production environments. Read more\n' + ' about feature status', technicalPreviewLinkText: 'here', + deprecatedFeatures: 'Deprecated features', }, alertmanager: { warningPre: "Note: integration with Alertmanager is needed only in cases when you can't use", diff --git a/public/app/percona/settings/components/Advanced/Advanced.tsx b/public/app/percona/settings/components/Advanced/Advanced.tsx index 9c66924482f0e..3001b4678caa6 100644 --- a/public/app/percona/settings/components/Advanced/Advanced.tsx +++ b/public/app/percona/settings/components/Advanced/Advanced.tsx @@ -4,6 +4,7 @@ import { Field, withTypes } from 'react-final-form'; import { Button, Icon, Spinner, useStyles2 } from '@grafana/ui'; import { OldPage } from 'app/core/components/Page/Page'; +import DbaasDeprecationWarning from 'app/percona/dbaas/components/DeprecationWarning'; import { Messages } from 'app/percona/settings/Settings.messages'; import { getSettingsStyles } from 'app/percona/settings/Settings.styles'; import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; @@ -104,6 +105,7 @@ export const Advanced: FC = () => { backupLabel, backupLink, backupTooltip, + deprecatedFeatures, }, tooltipLinkText, } = Messages; @@ -340,20 +342,6 @@ export const Advanced: FC = () => {

- , input: any) => { - dBaaSToggleOnChange(event, input, mutators); - }} - /> { component={SwitchRow} /> +
+ {deprecatedFeatures} + {!!values.dbaas && } + , input: any) => { + dBaaSToggleOnChange(event, input, mutators); + }} + /> +
+ + +
+ ) : ( +
{Messages.dumps.actions.selectServices}
+ )} + + {Messages.dumps.createDataset} + +
+ {isSendToSupportModalOpened && ( + closeEditModal()} dumpIds={selectedDumpIds} /> + )} + row.dumpId, [])} + /> + {logsModalVisible && ( + + )} + + + ); +}; + +export default PMMDump; diff --git a/public/app/percona/pmm-dump/PmmDump.styles.ts b/public/app/percona/pmm-dump/PmmDump.styles.ts new file mode 100644 index 0000000000000..d58eec5bb3b29 --- /dev/null +++ b/public/app/percona/pmm-dump/PmmDump.styles.ts @@ -0,0 +1,30 @@ +import { css } from '@emotion/css'; + +import { GrafanaTheme2 } from '@grafana/data'; + +export const getStyles = ({ v1: { palette }, colors, spacing }: GrafanaTheme2) => ({ + overlay: css` + height: 160px; + display: flex; + justify-content: center; + align-items: center; + background-color: transparent; + `, + actionItemTxtSpan: css` + line-height: 15px; + `, + createDatasetArea: css` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-bottom: 24px; + `, + actionButton: css` + background: none; + margin-right: 7px; + `, + serviceNamesTitle: css` + font-weight: bold; + `, +}); diff --git a/public/app/percona/pmm-dump/PmmDump.types.ts b/public/app/percona/pmm-dump/PmmDump.types.ts new file mode 100644 index 0000000000000..f4db0c3d61afe --- /dev/null +++ b/public/app/percona/pmm-dump/PmmDump.types.ts @@ -0,0 +1,114 @@ +import { PmmDump } from 'app/percona/shared/core/reducers/pmmDump/pmmDump.types'; + +export enum DumpStatus { + DUMP_STATUS_INVALID = 'DUMP_STATUS_INVALID', + DUMP_STATUS_IN_PROGRESS = 'DUMP_STATUS_IN_PROGRESS', + DUMP_STATUS_SUCCESS = 'DUMP_STATUS_SUCCESS', + DUMP_STATUS_ERROR = 'DUMP_STATUS_ERROR', +} + +export const DumpStatusText = { + [DumpStatus.DUMP_STATUS_INVALID]: 'Invalid', + [DumpStatus.DUMP_STATUS_IN_PROGRESS]: 'Pending', + [DumpStatus.DUMP_STATUS_SUCCESS]: 'Success', + [DumpStatus.DUMP_STATUS_ERROR]: 'Error', +}; + +export interface PMMDumpServices { + dumpId: string; + status: DumpStatus; + createdAt: string; + startTime: string; + endTime: string; + serviceNames: string[]; + timeRange?: string; +} + +export const DumpStatusColor = { + [DumpStatus.DUMP_STATUS_INVALID]: 'red', + [DumpStatus.DUMP_STATUS_IN_PROGRESS]: 'orange', + [DumpStatus.DUMP_STATUS_SUCCESS]: 'green', + [DumpStatus.DUMP_STATUS_ERROR]: 'red', +}; + +export interface SendToSupportRequestBody { + sftp_parameters: { + user: string; + address: string; + password: string; + directory?: string; + }; + dump_ids: string[]; +} + +export interface SendToSupportForm { + user: string; + address: string; + password: string; + dumpIds: string[]; + directory?: string; +} + +export interface RawDumpLog { + chunk_id: number; + data: string; + time: string; +} + +export interface DumpLogResponse { + logs: RawDumpLog[]; + end: boolean; +} + +export interface DumpLogChunk extends Omit { + id: number; +} + +export interface DumpLogs { + logs: DumpLogChunk[]; + end: boolean; +} + +export interface PmmDumpResponse { + dumps: PmmDump[]; +} + +export interface DeleteDump { + dump_ids: string[]; +} + +export interface Node { + node_id: string; + node_name: string; + address: string; + machine_id?: string; + distro?: string; + node_model: string; + region: string; + az: string; + custom_labels: { + additionalProp1: string; + additionalProp2: string; + additionalProp3: string; + }; +} + +export interface NodeTypes { + generic: Node; + container: Node; + remote: Node; + remote_rds: Node; + remote_azure_database: Node; +} + +export interface ExportResponse { + dump_id: string; +} + +export interface ExportDatasetService { + serviceNames: Array; + startTime: string; + endTime: string; + ignoreLoad: boolean; + exportQan: boolean; +} diff --git a/public/app/percona/pmm-dump/SendToSupportModal.tsx b/public/app/percona/pmm-dump/SendToSupportModal.tsx new file mode 100644 index 0000000000000..033e83be07977 --- /dev/null +++ b/public/app/percona/pmm-dump/SendToSupportModal.tsx @@ -0,0 +1,109 @@ +import { css } from '@emotion/css'; +import React, { FC } from 'react'; + +import { Modal, Button, Form, Field, Input, useStyles2 } from '@grafana/ui'; +import { Messages } from 'app/percona/pmm-dump/PMMDump.messages'; +import { SendToSupportForm } from 'app/percona/pmm-dump/PmmDump.types'; +import { sendToSupportAction } from 'app/percona/shared/core/reducers/pmmDump/pmmDump'; +import { getDumps } from 'app/percona/shared/core/selectors'; +import { useDispatch, useSelector } from 'app/types'; + +import { PasswordField } from '../../core/components/PasswordField/PasswordField'; + +interface ModalProps { + onClose: (saved?: boolean) => void; + dumpIds: string[]; +} + +export const SendToSupportModal: FC = ({ onClose, dumpIds }) => { + const styles = useStyles2(getStyles); + const dispatch = useDispatch(); + const { isLoading } = useSelector(getDumps); + const defaultValues: SendToSupportForm = { + user: '', + address: '', + password: '', + dumpIds: [] as string[], + directory: '', + }; + + const onSubmit = (values: SendToSupportForm) => { + dispatch( + sendToSupportAction({ + sftp_parameters: { + user: values.user, + address: values.address, + password: values.password, + directory: values.directory || undefined, + }, + dump_ids: dumpIds, + }) + ); + }; + + return ( + +
+ {({ register, errors, formState: { isDirty } }) => ( + <> + + + + + + + + + + + + + + + + + + + )} + +
+ ); +}; + +const getStyles = () => ({ + modal: css` + max-width: 560px; + `, +}); diff --git a/public/app/percona/pmm-dump/__mocks__/PmmDump.service.ts b/public/app/percona/pmm-dump/__mocks__/PmmDump.service.ts new file mode 100644 index 0000000000000..c8648c5387ac5 --- /dev/null +++ b/public/app/percona/pmm-dump/__mocks__/PmmDump.service.ts @@ -0,0 +1,99 @@ +export const list = () => + Promise.resolve([ + { + dump_id: '123', + status: 'BACKUP_STATUS_INVALID', + node_ids: ['1', '2', '3'], + start_time: '2023-09-20T18:55:53.486Z', + end_time: '2023-09-20T18:57:53.486Z', + created_at: '2023-09-26T07:40:01.547Z', + }, + ]); + +export const getNode = () => + Promise.resolve({ + generic: { + node_id: '1', + node_name: 'mongo-60-cfg-0.demo.local-mongodb', + address: 'string', + machine_id: 'string', + distro: 'string', + node_model: 'string', + region: 'string', + az: 'string', + custom_labels: { + additionalProp1: 'string', + additionalProp2: 'string', + additionalProp3: 'string', + }, + }, + container: { + node_id: 'string', + node_name: 'string', + address: 'string', + machine_id: 'string', + container_id: 'string', + container_name: 'string', + node_model: 'string', + region: 'string', + az: 'string', + custom_labels: { + additionalProp1: 'string', + additionalProp2: 'string', + additionalProp3: 'string', + }, + }, + remote: { + node_id: 'string', + node_name: 'string', + address: 'string', + node_model: 'string', + region: 'string', + az: 'string', + custom_labels: { + additionalProp1: 'string', + additionalProp2: 'string', + additionalProp3: 'string', + }, + }, + remote_rds: { + node_id: 'string', + node_name: 'string', + address: 'string', + node_model: 'string', + region: 'string', + az: 'string', + custom_labels: { + additionalProp1: 'string', + additionalProp2: 'string', + additionalProp3: 'string', + }, + }, + remote_azure_database: { + node_id: 'string', + node_name: 'string', + address: 'string', + node_model: 'string', + region: 'string', + az: 'string', + custom_labels: { + additionalProp1: 'string', + additionalProp2: 'string', + additionalProp3: 'string', + }, + }, + }); + +export const nodeList = (node_ids: string[]) => + Promise.resolve([ + { + dump_id: '123', + status: 'BACKUP_STATUS_INVALID', + node_ids: ['1', '2', '3'], + start_time: '2023-09-20T18:55:53.486Z', + end_time: '2023-09-20T18:57:53.486Z', + created_at: '2023-09-26T07:40:01.547Z', + }, + ]); + +export const deleteDump = (dumpId: string) => Promise.resolve(); diff --git a/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.constants.ts b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.constants.ts new file mode 100644 index 0000000000000..9c5c4940360af --- /dev/null +++ b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.constants.ts @@ -0,0 +1,3 @@ +export const DUMP_URL = '/pmm-dump'; +export const GET_SERVICES_CANCEL_TOKEN = 'getServices'; +export const TWELVE_HOURS = 12 * 1000 * 60 * 60; diff --git a/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.messages.ts b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.messages.ts new file mode 100644 index 0000000000000..2b3bb0bc1428f --- /dev/null +++ b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.messages.ts @@ -0,0 +1,21 @@ +export const Messages = { + summary: + 'Simplify troubleshooting and accelerate issue resolution by securely sharing relevant data, ensuring a smoother support experience.', + breadCrumbTitle: 'PMM Export / Export new dataset', + title: 'Select data to export', + selectServiceNames: 'Service names', + allNodes: 'All nodes', + selectStart: 'Start time', + selectEnd: 'End time', + backupName: 'Backup name', + createDataset: 'Create dataset', + timeRangeValidation: 'Please select a valid time range', + date: 'Date', + ignoreLoad: 'Ignore load', + qan: 'Export QAN', + ignoreLoadTooltip: 'Bypass the default resource limit restrictions to export faster.', + qanTootltip: 'Include Query Analytics (QAN) metrics alongside core metrics in the export.', + allServices: 'All Services', + noService: 'No Services available', + cancel: 'Cancel', +}; diff --git a/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.styles.ts b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.styles.ts new file mode 100644 index 0000000000000..ac8d8e066a952 --- /dev/null +++ b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.styles.ts @@ -0,0 +1,114 @@ +import { css } from '@emotion/css'; + +import { GrafanaTheme2 } from '@grafana/data'; + +export const getStyles = ({ breakpoints, colors, shape, spacing, v1: { spacing: spacingV1 } }: GrafanaTheme2) => ({ + pageWrapper: css` + max-width: ${breakpoints.values.xxl}px; + `, + formContainer: css` + display: grid; + justify-content: center; + align-items: center; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: ${spacingV1.sm}; + `, + advanceSection: css` + width: 100%; + display: grid; + gap: ${spacingV1.sm}; + grid-template-columns: 1fr 1fr; + `, + collapsableSection: css` + grid-row-start: 2; + `, + wideField: css` + grid-column: span 2; + `, + selectFieldWrap: css` + display: flex; + flex-direction: column; + padding-top: ${spacingV1.xs}; + margin-bottom: 17px; + width: 55%; + `, + selectField: css` + padding-top: 7px; + padding-bottom: 7px; + `, + radioButtonField: css` + & > div > div:nth-of-type(2) * { + height: 37px; + display: flex; + justify-content: center; + align-items: center; + } + `, + backupTypeField: css` + grid-row-start: 3; + grid-column: span 2; + `, + textAreaField: css` + & > textarea { + height: 50px; + } + `, + contentInner: css` + flex: 1; + padding: ${spacing(3)}; + `, + contentOuter: css` + background: ${colors.background.primary}; + border: 1px solid ${colors.border.weak}; + border-radius: ${shape.borderRadius()}; + margin: ${spacing(0, 2, 2)}; + flex: 1; + `, + form: css` + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + `, + headingStyle: css` + margin-bottom: ${spacingV1.lg}; + `, + heading3Style: css` + margin-top: ${spacingV1.xl}; + `, + pageSwitcher: css` + margin-bottom: ${spacingV1.lg}; + `, + descriptionField: css` + grid-column: span 4; + `, + inputWrapper: css` + height: 37px; + `, + submitButton: css` + width: 100%; + display: flex; + justify-content: center; + `, + datePicker: css` + width: 55%; + display: flex; + justify-content: space-between; + margin-bottom: ${spacing(2)}; + `, + switch: css` + margin-bottom: ${spacing(2)}; + width: 55%; + display: flex; + & > div { + margin-right: ${spacing(3)}; + flex-direction: row-reverse; + justify-content: space-between; + align-items: center; + & > div { + width: auto; + margin-right: ${spacing(1)}; + } + } + `, +}); diff --git a/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.tsx b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.tsx new file mode 100644 index 0000000000000..7dce2eca667d9 --- /dev/null +++ b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.tsx @@ -0,0 +1,215 @@ +/* eslint-disable @typescript-eslint/consistent-type-assertions */ +import React, { FC, useState, useEffect, useCallback, useMemo } from 'react'; +import { Field, withTypes } from 'react-final-form'; +import { useHistory } from 'react-router-dom'; + +import { SelectableValue, DateTime, dateTime, AppEvents } from '@grafana/data'; +import { LinkButton, PageToolbar, DateTimePicker, useStyles2 } from '@grafana/ui'; +import appEvents from 'app/core/app_events'; +import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; +import { SwitchRow } from 'app/percona/settings/components/Advanced/SwitchRow'; +import { LoaderButton } from 'app/percona/shared/components/Elements/LoaderButton'; +import { Overlay } from 'app/percona/shared/components/Elements/Overlay'; +import { MultiSelectField } from 'app/percona/shared/components/Form/MultiSelectField'; +import { useCancelToken } from 'app/percona/shared/components/hooks/cancelToken.hook'; +import { triggerDumpAction } from 'app/percona/shared/core/reducers/pmmDump/pmmDump'; +import { fetchActiveServiceTypesAction, fetchServicesAction } from 'app/percona/shared/core/reducers/services'; +import { getServices } from 'app/percona/shared/core/selectors'; +import { isApiCancelError } from 'app/percona/shared/helpers/api'; +import { useAppDispatch } from 'app/store/store'; +import { useSelector } from 'app/types'; + +import { GET_SERVICES_CANCEL_TOKEN, DUMP_URL, TWELVE_HOURS } from './ExportDataset.constants'; +import { Messages } from './ExportDataset.messages'; +import { getStyles } from './ExportDataset.styles'; +import { ExportDatasetProps } from './ExportDataset.types'; + +const { Form } = withTypes(); + +const ExportDataset: FC> = ({ match }) => { + const styles = useStyles2(getStyles); + const dispatch = useAppDispatch(); + const { isLoading, services: fetchedServices } = useSelector(getServices); + + const serviceNames = useMemo( + () => + fetchedServices.map>((data) => ({ + label: data.params.serviceName, + value: data.params.serviceName, + })), + [fetchedServices] + ); + + const [generateToken] = useCancelToken(); + const [endDate, setEndDate] = useState(dateTime(new Date().setSeconds(0, 0))); + const [startDate, setStartDate] = useState( + dateTime(new Date(new Date(new Date().setSeconds(0, 0)).getTime() - TWELVE_HOURS)) + ); + const [dateError, setDateError] = useState(false); + + const loadData = useCallback(async () => { + try { + await Promise.all([ + dispatch(fetchServicesAction({ token: generateToken(GET_SERVICES_CANCEL_TOKEN) })), + dispatch(fetchActiveServiceTypesAction()), + ]); + } catch (e) { + if (isApiCancelError(e)) { + return; + } + console.error(e); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + loadData(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const history = useHistory(); + const handleGoBack = () => { + history.push(DUMP_URL); + }; + + const handleStartDate = (date: DateTime) => { + if (dateTime(date) >= dateTime(endDate)) { + appEvents.emit(AppEvents.alertError, [Messages.timeRangeValidation]); + setDateError(true); + } else { + setDateError(false); + } + + setStartDate(date); + }; + + const handleSubmit = async (data: ExportDatasetProps) => { + let serviceList: string[]; + if (data && data.service) { + serviceList = data.service.map(({ value }): string => value); + } else { + serviceList = []; + } + + console.log(data); + await dispatch( + triggerDumpAction({ + serviceNames: serviceList, + startTime: startDate.toISOString(), + endTime: endDate.toISOString(), + exportQan: !!data.QAN, + ignoreLoad: !!data.load, + }) + ); + history.push(DUMP_URL); + }; + + return ( + +
( + + + + {Messages.cancel} + + +
+
+
+
{Messages.summary}
+

{Messages.title}

+ + + {({ input }) => ( + + )} + + +
+
+ {Messages.selectStart} +
+ handleStartDate(e)} + maxDate={new Date()} + timepickerProps={{ + showSecond: false, + hideDisabledOptions: true, + }} + /> +
+
+
+ {Messages.selectEnd} +
+ +
+
+
+ +
+ + + +
+
+ + {Messages.createDataset} + +
+
+
+
+ + )} + > +
+ ); +}; + +export default ExportDataset; diff --git a/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.types.ts b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.types.ts new file mode 100644 index 0000000000000..4f31a146044c5 --- /dev/null +++ b/public/app/percona/pmm-dump/components/ExportDataset/ExportDataset.types.ts @@ -0,0 +1,16 @@ +export interface ExportDatasetProps { + id: string; + service: Service[]; + load: boolean; + QAN: boolean; +} + +export interface Timeranges { + startTimestamp: string; + endTimestamp: string; +} + +export interface Service { + label: string; + value: string; +} diff --git a/public/app/percona/pmm-dump/components/PmmDumpLogsModal/PmmDumpLogsModal.tsx b/public/app/percona/pmm-dump/components/PmmDumpLogsModal/PmmDumpLogsModal.tsx new file mode 100644 index 0000000000000..26383b2a585d7 --- /dev/null +++ b/public/app/percona/pmm-dump/components/PmmDumpLogsModal/PmmDumpLogsModal.tsx @@ -0,0 +1,14 @@ +import React, { FC } from 'react'; + +import { ChunkedLogsViewer } from 'app/percona/backup/components/ChunkedLogsViewer/ChunkedLogsViewer'; +import { Modal } from 'app/percona/shared/components/Elements/Modal'; + +import { PmmDumpModalProps } from './PmmDumpLogsModal.types'; + +export const PmmDumpLogsModal: FC = ({ title, isVisible, onClose, getLogChunks }) => { + return ( + + + + ); +}; diff --git a/public/app/percona/pmm-dump/components/PmmDumpLogsModal/PmmDumpLogsModal.types.ts b/public/app/percona/pmm-dump/components/PmmDumpLogsModal/PmmDumpLogsModal.types.ts new file mode 100644 index 0000000000000..47071bb6613c0 --- /dev/null +++ b/public/app/percona/pmm-dump/components/PmmDumpLogsModal/PmmDumpLogsModal.types.ts @@ -0,0 +1,10 @@ +import { CancelToken } from 'axios'; + +import { DumpLogs } from 'app/percona/pmm-dump/PmmDump.types'; + +export interface PmmDumpModalProps { + isVisible: boolean; + title: string; + onClose: () => void; + getLogChunks: (offset: number, limit: number, token?: CancelToken) => Promise; +} diff --git a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts index 507833c211f54..2491093c467c4 100644 --- a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts +++ b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts @@ -126,6 +126,15 @@ export const PMM_ADD_INSTANCE_PAGE: NavModelItem = { showIconInNavbar: true, }; +export const PMM_DUMP_PAGE: NavModelItem = { + id: 'pmm-dump', + url: `${config.appSubUrl}/pmm-dump`, + icon: 'brain', + subTitle: + 'Simplify troubleshooting and accelerate issue resolution by securely sharing relevant data, ensuring a smoother support experience.', + text: 'PMM Dump', +}; + export const PMM_EDIT_INSTANCE_PAGE: NavModelItem = { id: 'edit-instance', url: `${config.appSubUrl}/edit-instance`, diff --git a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx index 8c94ae70e060d..3d26a6fbdb125 100644 --- a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx +++ b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx @@ -25,6 +25,7 @@ import { PMM_ENVIRONMENT_OVERVIEW_PAGE, PMM_INVENTORY_PAGE, PMM_TICKETS_PAGE, + PMM_DUMP_PAGE, } from './PerconaNavigation.constants'; import { addAccessRolesLink, @@ -49,6 +50,7 @@ const PerconaNavigation: React.FC = () => { dispatch(updateNavIndex(getPmmSettingsPage(alertingEnabled))); dispatch(updateNavIndex(PMM_DBAAS_PAGE)); + dispatch(updateNavIndex(PMM_DUMP_PAGE)); dispatch(updateNavIndex(PMM_BACKUP_PAGE)); dispatch(updateNavIndex(PMM_INVENTORY_PAGE)); dispatch(updateNavIndex(PMM_ADD_INSTANCE_PAGE)); diff --git a/public/app/percona/shared/core/reducers/index.ts b/public/app/percona/shared/core/reducers/index.ts index a2e54109edd3b..4184045bddba0 100644 --- a/public/app/percona/shared/core/reducers/index.ts +++ b/public/app/percona/shared/core/reducers/index.ts @@ -24,6 +24,7 @@ import perconaK8SCluster from './dbaas/k8sCluster/k8sCluster'; import perconaK8SClusterListReducer, { fetchK8sListAction } from './dbaas/k8sClusterList/k8sClusterList'; import perconaUpdateDBCluster from './dbaas/updateDBCluster/updateDBCluster'; import nodesReducer from './nodes'; +import pmmDumpsReducers from './pmmDump/pmmDump'; import rolesReducers from './roles/roles'; import servicesReducer from './services'; import tourReducer from './tour/tour'; @@ -254,5 +255,6 @@ export default { roles: rolesReducers, users: usersReducers, advisors: advisorsReducers, + pmmDumps: pmmDumpsReducers, }), }; diff --git a/public/app/percona/shared/core/reducers/pmmDump/pmmDump.ts b/public/app/percona/shared/core/reducers/pmmDump/pmmDump.ts new file mode 100644 index 0000000000000..9b63a82f01e88 --- /dev/null +++ b/public/app/percona/shared/core/reducers/pmmDump/pmmDump.ts @@ -0,0 +1,128 @@ +import { createSlice } from '@reduxjs/toolkit'; + +import { withAppEvents, withSerializedError } from 'app/features/alerting/unified/utils/redux'; +import { PMMDumpService } from 'app/percona/pmm-dump/PMMDump.service'; +import { + PMMDumpServices, + SendToSupportRequestBody, + ExportDatasetService, + DumpLogs, +} from 'app/percona/pmm-dump/PmmDump.types'; +import { PmmDumpState, LogsActionProps } from 'app/percona/shared/core/reducers/pmmDump/pmmDump.types'; +import { mapDumps, mapExportData } from 'app/percona/shared/core/reducers/pmmDump/pmmDump.utils'; +import { createAsyncThunk } from 'app/types'; + +const initialState: PmmDumpState = { + isLoading: false, + isDownloading: false, + isDeleting: false, + dumps: [], +}; + +export const pmmDumpSlice = createSlice({ + name: 'pmmDumps', + initialState, + reducers: {}, + extraReducers: (builder) => { + builder.addCase(fetchPmmDumpAction.fulfilled, (state, action) => ({ + ...state, + dumps: action.payload, + isDeleting: false, + })); + builder.addCase(sendToSupportAction.pending, (state, action) => ({ + ...state, + isLoading: true, + })); + builder.addCase(sendToSupportAction.fulfilled, (state, action) => ({ + ...state, + isLoading: false, + })); + builder.addCase(sendToSupportAction.rejected, (state) => ({ + ...state, + isLoading: false, + })); + builder.addCase(downloadPmmDumpAction.pending, (state, action) => ({ + ...state, + isDownloading: true, + })); + builder.addCase(downloadPmmDumpAction.fulfilled, (state, action) => ({ + ...state, + isDownloading: false, + })); + builder.addCase(downloadPmmDumpAction.rejected, (state) => ({ + ...state, + isDownloading: false, + })); + builder.addCase(deletePmmDumpAction.pending, (state, action) => ({ + ...state, + isDeleting: true, + })); + }, +}); + +export const fetchPmmDumpAction = createAsyncThunk('percona/fetchDumps', async () => { + return mapDumps(await PMMDumpService.list()); +}); + +export const deletePmmDumpAction = createAsyncThunk( + 'percona/deletePmmDump', + async (dumpIds: string[]): Promise => + withAppEvents( + (async () => { + await PMMDumpService.delete(dumpIds); + })(), + { + successMessage: 'Deleted successfully', + errorMessage: 'Failed to delete ', + } + ) +); + +export const downloadPmmDumpAction = createAsyncThunk( + 'percona/downloadPmmDump', + async (dumpIds: string[]): Promise => + withAppEvents( + (async () => { + await PMMDumpService.downloadAll(dumpIds); + })(), + { + successMessage: 'Download successfully', + errorMessage: 'Failed to download ', + } + ) +); + +export const sendToSupportAction = createAsyncThunk( + 'percona/sendToSupport', + async (body: SendToSupportRequestBody): Promise => + withAppEvents( + (async () => { + await PMMDumpService.sendToSupport(body); + })(), + { + successMessage: 'The message was send successfully!', + } + ) +); + +export const triggerDumpAction = createAsyncThunk( + 'percona/triggerDump', + async (body: ExportDatasetService): Promise => + withSerializedError( + (async () => { + await PMMDumpService.trigger(mapExportData(body)); + })() + ) +); + +export const getDumpLogsAction = createAsyncThunk( + 'percona/getDumpLogs', + async (body: LogsActionProps): Promise => + withSerializedError( + (async () => { + return await PMMDumpService.getLogs(body.artifactId, body.startingChunk, body.offset, body.token); + })() + ) +); + +export default pmmDumpSlice.reducer; diff --git a/public/app/percona/shared/core/reducers/pmmDump/pmmDump.types.ts b/public/app/percona/shared/core/reducers/pmmDump/pmmDump.types.ts new file mode 100644 index 0000000000000..328ab445cd05c --- /dev/null +++ b/public/app/percona/shared/core/reducers/pmmDump/pmmDump.types.ts @@ -0,0 +1,38 @@ +import { CancelToken } from 'axios'; + +import { DumpStatus, PMMDumpServices } from 'app/percona/pmm-dump/PmmDump.types'; + +export interface PmmDumpState { + isLoading: boolean; + isDownloading: boolean; + isDeleting: boolean; + dumps: PMMDumpServices[]; +} + +export interface PmmDump { + dump_id: string; + status: DumpStatus; + service_names: string[]; + start_time: string; + end_time: string; + created_at: string; +} + +export interface ExportDatasetProps { + service_names: Array; + start_time: string; + end_time: string; + ignore_load: boolean; + export_qan: boolean; +} + +export interface ExportResponse { + dump_id: string; +} + +export interface LogsActionProps { + artifactId: string; + startingChunk: number; + offset: number; + token: CancelToken | undefined; +} diff --git a/public/app/percona/shared/core/reducers/pmmDump/pmmDump.utils.ts b/public/app/percona/shared/core/reducers/pmmDump/pmmDump.utils.ts new file mode 100644 index 0000000000000..8b270df32b97a --- /dev/null +++ b/public/app/percona/shared/core/reducers/pmmDump/pmmDump.utils.ts @@ -0,0 +1,20 @@ +import { PMMDumpServices, ExportDatasetService } from 'app/percona/pmm-dump/PmmDump.types'; +import { PmmDump, ExportDatasetProps } from 'app/percona/shared/core/reducers/pmmDump/pmmDump.types'; + +export const mapDumps = (dumps: PmmDump[]): PMMDumpServices[] => + dumps.map((dump) => ({ + dumpId: dump.dump_id, + status: dump.status, + serviceNames: dump.service_names, + startTime: dump.start_time, + endTime: dump.end_time, + createdAt: dump.created_at, + })); + +export const mapExportData = (data: ExportDatasetService): ExportDatasetProps => ({ + service_names: data.serviceNames, + start_time: data.startTime, + end_time: data.endTime, + ignore_load: data.ignoreLoad, + export_qan: data.exportQan, +}); diff --git a/public/app/percona/shared/core/selectors.ts b/public/app/percona/shared/core/selectors.ts index 6434c64595103..8d7f0fa32d8f3 100644 --- a/public/app/percona/shared/core/selectors.ts +++ b/public/app/percona/shared/core/selectors.ts @@ -31,3 +31,4 @@ export const getAdvisors = (state: StoreState) => state.percona.advisors; export const getCategorizedAdvisors = createSelector([getAdvisors], (advisors) => groupAdvisorsIntoCategories(advisors.result || []) ); +export const getDumps = (state: StoreState) => state.percona.pmmDumps; diff --git a/public/app/percona/shared/helpers/utils/timeRange.ts b/public/app/percona/shared/helpers/utils/timeRange.ts new file mode 100644 index 0000000000000..48d2a06d9edcb --- /dev/null +++ b/public/app/percona/shared/helpers/utils/timeRange.ts @@ -0,0 +1,17 @@ +import moment from 'moment'; + +export const dateDifferenceInWords = (date1: string, date2: string) => { + const momentDate1 = moment(date1); + const momentDate2 = moment(date2); + const duration = moment.duration(momentDate1.diff(momentDate2)); + + if (duration.asDays() >= 1) { + return `${Math.floor(duration.asDays())} day${duration.asDays() > 1 ? 's' : ''}`; + } else if (duration.asHours() >= 1) { + return `${Math.floor(duration.asHours())} hour${duration.asHours() > 1 ? 's' : ''}`; + } else if (duration.asMinutes() >= 1) { + return `${Math.floor(duration.asMinutes())} minute${duration.asMinutes() > 1 ? 's' : ''}`; + } else { + return 'Less than a minute'; + } +}; diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index 7d55783d1b05c..df6f01bece975 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -820,6 +820,19 @@ export function getAppRoutes(): RouteDescriptor[] { import(/* webpackChunkName: "EnvironmentOverview" */ 'app/percona/environment-overview/EnvironmentOverview') ), }, + { + path: '/pmm-dump', + component: SafeDynamicImport(() => import(/* webpackChunkName: "PMMDump" */ 'app/percona/pmm-dump/PMMDump')), + }, + { + path: '/pmm-dump/new', + component: SafeDynamicImport( + () => + import( + /* webpackChunkName: "BackupInventoryPage" */ 'app/percona/pmm-dump/components/ExportDataset/ExportDataset' + ) + ), + }, ...getBrowseStorageRoutes(), ...getDynamicDashboardRoutes(), ...getPluginCatalogRoutes(), From 43622fab10e9f8e4531a41c102cffb03dafb94b3 Mon Sep 17 00:00:00 2001 From: Matej Kubinec <32638572+matejkubinec@users.noreply.github.com> Date: Mon, 27 Nov 2023 08:37:00 +0100 Subject: [PATCH 05/10] PMM-12476 Cluster view search (#687) * PMM-12476 Add clusters search and filtering * PMM-12476 Use correct type * PMM-12476 Cleanup * PMM-12476 Remove logging and dead code * PMM-12476 Allow actions dialog to be visible --- .../percona/inventory/Inventory.messages.ts | 5 + .../inventory/Tabs/Services/ClusterItem.tsx | 10 +- .../Tabs/Services/Clusters.constants.ts | 52 +++++++++ .../inventory/Tabs/Services/Clusters.tsx | 41 +++++-- .../inventory/Tabs/Services/Clusters.type.tsx | 1 + .../Tabs/Services/Services.constants.ts | 40 +++++++ .../Elements/Table/Filter/Filter.tsx | 18 ++-- .../Elements/Table/Filter/Filter.types.ts | 12 ++- .../Elements/Table/Filter/Filter.utils.ts | 70 ++++++------ .../components/fields/SelectDropdownField.tsx | 4 +- .../components/Elements/Table/Table.styles.ts | 4 + .../Form/TextInput/TextInput.styles.ts | 35 +++++- .../Form/TextInput/TextInputField.tsx | 44 ++++++-- .../SearchFilter/SearchFilter.messages.ts | 6 ++ .../SearchFilter/SearchFilter.styles.ts | 25 +++++ .../components/SearchFilter/SearchFilter.tsx | 101 ++++++++++++++++++ .../SearchFilter/SearchFilter.types.ts | 2 + .../SearchFilter/SearchFilter.utils.ts | 39 +++++++ .../shared/components/SearchFilter/index.ts | 1 + 19 files changed, 443 insertions(+), 67 deletions(-) create mode 100644 public/app/percona/inventory/Tabs/Services/Clusters.constants.ts create mode 100644 public/app/percona/inventory/Tabs/Services/Services.constants.ts create mode 100644 public/app/percona/shared/components/SearchFilter/SearchFilter.messages.ts create mode 100644 public/app/percona/shared/components/SearchFilter/SearchFilter.styles.ts create mode 100644 public/app/percona/shared/components/SearchFilter/SearchFilter.tsx create mode 100644 public/app/percona/shared/components/SearchFilter/SearchFilter.types.ts create mode 100644 public/app/percona/shared/components/SearchFilter/SearchFilter.utils.ts create mode 100644 public/app/percona/shared/components/SearchFilter/index.ts diff --git a/public/app/percona/inventory/Inventory.messages.ts b/public/app/percona/inventory/Inventory.messages.ts index 44f590eabd96f..efe6d8b6064cc 100644 --- a/public/app/percona/inventory/Inventory.messages.ts +++ b/public/app/percona/inventory/Inventory.messages.ts @@ -10,6 +10,7 @@ export const Messages = { monitoring: 'Monitoring', address: 'Address', port: 'Port', + cluster: 'Cluster', }, actions: { dashboard: 'Dashboard', @@ -30,6 +31,10 @@ export const Messages = { organizeByClusters: 'Organize by Clusters', technicalPreview: '(Technical Preview) ', }, + clusters: { + empty: 'No clusters available', + noMatch: 'No clusters found', + }, agents: { goBackToServices: 'Go back to services', goBackToNodes: 'Go back to nodes', diff --git a/public/app/percona/inventory/Tabs/Services/ClusterItem.tsx b/public/app/percona/inventory/Tabs/Services/ClusterItem.tsx index 4553762971802..7ae1e7acd3539 100644 --- a/public/app/percona/inventory/Tabs/Services/ClusterItem.tsx +++ b/public/app/percona/inventory/Tabs/Services/ClusterItem.tsx @@ -10,8 +10,8 @@ import { ClusterItemProps } from './Clusters.type'; import { removeClusterFilters, shouldClusterBeExpanded } from './Clusters.utils'; import ServicesTable from './ServicesTable'; -const ClusterItem: FC = ({ cluster, onDelete, onSelectionChange }) => { - const [isOpen, setIsOpen] = useState(shouldClusterBeExpanded(cluster.name)); +const ClusterItem: FC = ({ cluster, onDelete, onSelectionChange, openByDefault }) => { + const [isOpen, setIsOpen] = useState(shouldClusterBeExpanded(cluster.name) || openByDefault); const icon: IconName = cluster.type ? (DATABASE_ICONS[cluster.type] as IconName) : 'database'; const handleSelectionChange = useCallback( @@ -27,6 +27,12 @@ const ClusterItem: FC = ({ cluster, onDelete, onSelectionChang } }, [isOpen, cluster.name]); + useEffect(() => { + if (openByDefault !== undefined) { + setIsOpen(openByDefault || shouldClusterBeExpanded(cluster.name)); + } + }, [openByDefault, cluster.name]); + return ( > = [ + { + Header: Messages.services.columns.serviceId, + id: 'serviceId', + accessor: 'serviceId', + type: FilterFieldTypes.TEXT, + }, + { + Header: Messages.services.columns.cluster, + accessor: 'cluster', + type: FilterFieldTypes.TEXT, + }, + { + Header: Messages.services.columns.status, + accessor: 'status', + type: FilterFieldTypes.DROPDOWN, + options: STATUS_OPTIONS, + }, + { + Header: Messages.services.columns.serviceName, + accessor: 'serviceName', + type: FilterFieldTypes.TEXT, + }, + { + Header: Messages.services.columns.nodeName, + accessor: 'nodeName', + type: FilterFieldTypes.TEXT, + }, + { + Header: Messages.services.columns.monitoring, + accessor: 'agentsStatus', + type: FilterFieldTypes.RADIO_BUTTON, + options: MONITORING_OPTIONS, + }, + { + Header: Messages.services.columns.address, + accessor: 'address', + type: FilterFieldTypes.TEXT, + }, + { + Header: Messages.services.columns.port, + accessor: 'port', + type: FilterFieldTypes.TEXT, + }, +]; diff --git a/public/app/percona/inventory/Tabs/Services/Clusters.tsx b/public/app/percona/inventory/Tabs/Services/Clusters.tsx index 0b89950a06ff3..4822045ea4979 100644 --- a/public/app/percona/inventory/Tabs/Services/Clusters.tsx +++ b/public/app/percona/inventory/Tabs/Services/Clusters.tsx @@ -1,15 +1,21 @@ import React, { FC, useCallback, useMemo, useState } from 'react'; import { Row } from 'react-table'; +import { SearchFilter } from 'app/percona/shared/components/SearchFilter'; + +import { Messages } from '../../Inventory.messages'; import { FlattenService } from '../../Inventory.types'; import ClusterItem from './ClusterItem'; +import { CLUSTERS_COLUMNS } from './Clusters.constants'; import { ClustersProps, ServicesCluster } from './Clusters.type'; import { getClustersFromServices } from './Clusters.utils'; const Clusters: FC = ({ services, onDelete, onSelectionChange }) => { - const clusters = useMemo(() => getClustersFromServices(services), [services]); + const [filtered, setFiltered] = useState(services); + const clusters = useMemo(() => getClustersFromServices(filtered), [filtered]); const [selection, setSelection] = useState({}); + const filterEnabled = filtered !== services; const handleSelectionChange = useCallback( (cluster: ServicesCluster, selectedServices: Array>) => { @@ -25,16 +31,33 @@ const Clusters: FC = ({ services, onDelete, onSelectionChange }) [onSelectionChange] ); + const handleFiltering = useCallback((rows: FlattenService[]) => { + setFiltered(rows); + }, []); + return (
- {clusters.map((cluster) => ( - - ))} + + {clusters.length ? ( + clusters.map((cluster) => ( + + )) + ) : filterEnabled ? ( +
{Messages.clusters.noMatch}
+ ) : ( +
{Messages.clusters.empty}
+ )}
); }; diff --git a/public/app/percona/inventory/Tabs/Services/Clusters.type.tsx b/public/app/percona/inventory/Tabs/Services/Clusters.type.tsx index 45ea9c3e68d24..8adce85f204f5 100644 --- a/public/app/percona/inventory/Tabs/Services/Clusters.type.tsx +++ b/public/app/percona/inventory/Tabs/Services/Clusters.type.tsx @@ -12,6 +12,7 @@ export interface ClustersProps { export interface ClusterItemProps { cluster: ServicesCluster; + openByDefault?: boolean; onDelete: (service: FlattenService) => void; onSelectionChange: (cluster: ServicesCluster, services: Array>) => void; } diff --git a/public/app/percona/inventory/Tabs/Services/Services.constants.ts b/public/app/percona/inventory/Tabs/Services/Services.constants.ts new file mode 100644 index 0000000000000..818741af4db1a --- /dev/null +++ b/public/app/percona/inventory/Tabs/Services/Services.constants.ts @@ -0,0 +1,40 @@ +import { ALL_LABEL, ALL_VALUE } from 'app/percona/shared/components/Elements/Table/Filter/Filter.constants'; +import { ServiceStatus } from 'app/percona/shared/services/services/Services.types'; + +import { MonitoringStatus } from '../../Inventory.types'; + +export const ALL_OPTION = { value: ALL_VALUE, label: ALL_LABEL }; + +export const STATUS_OPTIONS = [ + { + label: 'Up', + value: ServiceStatus.UP, + }, + { + label: 'Down', + value: ServiceStatus.DOWN, + }, + { + label: 'Unknown', + value: ServiceStatus.UNKNOWN, + }, + { + label: 'N/A', + value: ServiceStatus.NA, + }, +]; + +export const STATUS_OPTIONS_WITH_ALL = [ALL_OPTION, ...STATUS_OPTIONS]; + +export const MONITORING_OPTIONS = [ + { + label: MonitoringStatus.OK, + value: MonitoringStatus.OK, + }, + { + label: MonitoringStatus.FAILED, + value: MonitoringStatus.FAILED, + }, +]; + +export const MONITORING_OPTIONS_WITH_ALL = [ALL_OPTION, ...MONITORING_OPTIONS]; diff --git a/public/app/percona/shared/components/Elements/Table/Filter/Filter.tsx b/public/app/percona/shared/components/Elements/Table/Filter/Filter.tsx index 15ccbc8f4df53..529ae0ec8c9be 100644 --- a/public/app/percona/shared/components/Elements/Table/Filter/Filter.tsx +++ b/public/app/percona/shared/components/Elements/Table/Filter/Filter.tsx @@ -17,17 +17,22 @@ import { buildEmptyValues, buildParamsFromKey, buildSearchOptions, + getFilteredData, getQueryParams, - isInOptions, isOtherThanTextType, - isValueInTextColumn, } from './Filter.utils'; import { RadioButtonField } from './components/fields/RadioButtonField'; import { SearchTextField } from './components/fields/SearchTextField'; import { SelectColumnField } from './components/fields/SelectColumnField'; import { SelectDropdownField } from './components/fields/SelectDropdownField'; -export const Filter = ({ columns, rawData, setFilteredData, hasBackendFiltering = false, tableKey }: FilterProps) => { +export const Filter = ({ + columns, + rawData, + setFilteredData, + hasBackendFiltering = false, + tableKey, +}: FilterProps) => { const [openCollapse, setOpenCollapse] = useState(false); const [openSearchFields, setOpenSearchFields] = useState(false); const styles = useStyles2(getStyles); @@ -89,12 +94,7 @@ export const Filter = ({ columns, rawData, setFilteredData, hasBackendFiltering useEffect(() => { const queryParamsObj = getQueryParams(columns, queryParamsByKey); if (Object.keys(queryParamsByKey).length > 0 && !hasBackendFiltering) { - const dataArray = rawData.filter( - (filterValue) => - isValueInTextColumn(columns, filterValue, queryParamsObj) && - isInOptions(columns, filterValue, queryParamsObj, FilterFieldTypes.DROPDOWN) && - isInOptions(columns, filterValue, queryParamsObj, FilterFieldTypes.RADIO_BUTTON) - ); + const dataArray = getFilteredData(rawData, columns, queryParamsObj); setFilteredData(dataArray); } else { setFilteredData(rawData); diff --git a/public/app/percona/shared/components/Elements/Table/Filter/Filter.types.ts b/public/app/percona/shared/components/Elements/Table/Filter/Filter.types.ts index 360ee455d6206..b28cbd1369918 100644 --- a/public/app/percona/shared/components/Elements/Table/Filter/Filter.types.ts +++ b/public/app/percona/shared/components/Elements/Table/Filter/Filter.types.ts @@ -2,10 +2,14 @@ import { ExtendedColumn } from '../Table.types'; -export interface FilterProps { +export interface FilterProps { columns: Array>; - rawData: Object[]; - setFilteredData: (data: Object[]) => void; - hasBackendFiltering: boolean; + rawData: T[]; + setFilteredData: (data: T[]) => void; + hasBackendFiltering?: boolean; tableKey?: string; + onFilterStateChange?: (isActive: boolean) => void; } + +// prevent additional usage of "any" +export type FilterFormValues = Record; diff --git a/public/app/percona/shared/components/Elements/Table/Filter/Filter.utils.ts b/public/app/percona/shared/components/Elements/Table/Filter/Filter.utils.ts index 8efbe9b682ae3..468177463a43b 100644 --- a/public/app/percona/shared/components/Elements/Table/Filter/Filter.utils.ts +++ b/public/app/percona/shared/components/Elements/Table/Filter/Filter.utils.ts @@ -1,12 +1,12 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ import { UrlQueryMap, UrlQueryValue } from '@grafana/data'; import { getValuesFromQueryParams } from 'app/percona/shared/helpers/getValuesFromQueryParams'; import { ExtendedColumn, FilterFieldTypes } from '..'; import { ALL_LABEL, ALL_VALUE, SEARCH_INPUT_FIELD_NAME, SEARCH_SELECT_FIELD_NAME } from './Filter.constants'; +import { FilterFormValues } from './Filter.types'; -export const getQueryParams = (columns: Array>, queryParams: UrlQueryMap) => { +export const getQueryParams = (columns: Array>, queryParams: UrlQueryMap) => { const customTransform = (params: UrlQueryValue): string | undefined => { if (params !== undefined && params !== null) { return params.toString(); @@ -20,8 +20,11 @@ export const getQueryParams = (columns: Array>, queryParams: return params ?? {}; }; -export const buildObjForQueryParams = (columns: Array>, values: Record) => { - let obj: Record = { +export const buildObjForQueryParams = ( + columns: Array>, + values: FilterFormValues +) => { + let obj: FilterFormValues = { [SEARCH_INPUT_FIELD_NAME]: values[SEARCH_INPUT_FIELD_NAME], [SEARCH_SELECT_FIELD_NAME]: values[SEARCH_SELECT_FIELD_NAME]?.value ?? values[SEARCH_SELECT_FIELD_NAME], }; @@ -48,10 +51,10 @@ export const buildObjForQueryParams = (columns: Array>, valu return obj; }; -export const buildParamsFromKey = ( +export const buildParamsFromKey = ( tableKey: string | undefined, - columns: Array>, - values: Record + columns: Array>, + values: FilterFormValues ) => { const params = buildObjForQueryParams(columns, values); if (tableKey) { @@ -64,7 +67,7 @@ export const buildParamsFromKey = ( return params; }; -export const buildSearchOptions = (columns: Array>) => { +export const buildSearchOptions = (columns: Array>) => { const searchOptions = columns .filter((value) => value.type === FilterFieldTypes.TEXT) .map((column) => ({ @@ -75,7 +78,7 @@ export const buildSearchOptions = (columns: Array>) => { return searchOptions; }; -export const buildEmptyValues = (columns: Array>) => { +export const buildEmptyValues = (columns: Array>) => { let obj = { [SEARCH_INPUT_FIELD_NAME]: undefined, [SEARCH_SELECT_FIELD_NAME]: ALL_VALUE, @@ -88,10 +91,10 @@ export const buildEmptyValues = (columns: Array>) => { return obj; }; -export const isValueInTextColumn = ( - columns: Array>, - filterValue: any, - queryParamsObj: { [key: keyof UrlQueryMap]: string } +export const isValueInTextColumn = ( + columns: Array>, + filterValue: T, + queryParamsObj: Record ) => { const searchInputValue = queryParamsObj[SEARCH_INPUT_FIELD_NAME]; const selectColumnValue = queryParamsObj[SEARCH_SELECT_FIELD_NAME]; @@ -101,7 +104,7 @@ export const isValueInTextColumn = ( if (searchInputValue) { if ( (column.accessor === selectColumnValue || selectColumnValue === ALL_VALUE) && - isTextIncluded(searchInputValue, filterValue[column.accessor as string]) + isTextIncluded(searchInputValue, filterValue[column.accessor as keyof T] as string | number) ) { result = true; } @@ -114,20 +117,20 @@ export const isValueInTextColumn = ( }; export const isTextIncluded = (needle: string, haystack: string | number): boolean => - haystack.toString().toLowerCase().includes(needle.toLowerCase()); + haystack?.toString().toLowerCase().includes(needle.toLowerCase()); -export const isInOptions = ( - columns: Array>, - filterValue: any, - queryParamsObj: { [key: keyof UrlQueryMap]: string }, +export const isInOptions = ( + columns: Array>, + filterValue: T, + queryParamsObj: Record, filterFieldType: FilterFieldTypes ) => { let result: boolean[] = []; columns.forEach((column) => { - const accessor = column.accessor as string; - const queryParamValueAccessor = queryParamsObj[accessor]; - const filterValueAccessor = filterValue[accessor]; + const accessor = column.accessor; + const queryParamValueAccessor = queryParamsObj[accessor as string]; + const filterValueAccessor = filterValue[accessor as keyof T]; if (column.type === filterFieldType) { if (queryParamValueAccessor) { if (queryParamValueAccessor.toLowerCase() === filterValueAccessor?.toString().toLowerCase()) { @@ -143,15 +146,22 @@ export const isInOptions = ( return result.every((value) => value); }; -export const isOtherThanTextType = (columns: Array>) => { - return columns.find((column) => { - return column.type !== undefined && column.type !== FilterFieldTypes.TEXT; - }) - ? true - : false; -}; +export const isOtherThanTextType = (columns: Array>): boolean => + columns.some((column) => column.type !== undefined && column.type !== FilterFieldTypes.TEXT); -export const buildColumnOptions = (column: ExtendedColumn) => { +export const buildColumnOptions = (column: ExtendedColumn) => { column.options = column.options?.map((option) => ({ ...option, value: option.value?.toString() })); return [{ value: ALL_VALUE, label: ALL_LABEL }, ...(column.options ?? [])]; }; + +export const getFilteredData = ( + rawData: T[], + columns: Array>, + queryParamsObj: Record +) => + rawData.filter( + (filterValue) => + isValueInTextColumn(columns, filterValue, queryParamsObj) && + isInOptions(columns, filterValue, queryParamsObj, FilterFieldTypes.DROPDOWN) && + isInOptions(columns, filterValue, queryParamsObj, FilterFieldTypes.RADIO_BUTTON) + ); diff --git a/public/app/percona/shared/components/Elements/Table/Filter/components/fields/SelectDropdownField.tsx b/public/app/percona/shared/components/Elements/Table/Filter/components/fields/SelectDropdownField.tsx index 17a63a9d30771..69ef1ab2801d6 100644 --- a/public/app/percona/shared/components/Elements/Table/Filter/components/fields/SelectDropdownField.tsx +++ b/public/app/percona/shared/components/Elements/Table/Filter/components/fields/SelectDropdownField.tsx @@ -7,11 +7,11 @@ import { ExtendedColumn } from '../../..'; import { ALL_LABEL, ALL_VALUE } from '../../Filter.constants'; import { buildColumnOptions } from '../../Filter.utils'; -export const SelectDropdownField = ({ column }: { column: ExtendedColumn }) => { +export const SelectDropdownField = ({ column }: { column: ExtendedColumn }) => { const columnOptions = buildColumnOptions(column); return (
- + {({ input }) => ( { tr { height: 48px; + /* Allow the actions dialog to be visible */ + position: relative; + z-index: 0; + th { position: sticky; top: 0; diff --git a/public/app/percona/shared/components/Form/TextInput/TextInput.styles.ts b/public/app/percona/shared/components/Form/TextInput/TextInput.styles.ts index 29b020f7b9c73..a689e73ca43bd 100644 --- a/public/app/percona/shared/components/Form/TextInput/TextInput.styles.ts +++ b/public/app/percona/shared/components/Form/TextInput/TextInput.styles.ts @@ -3,7 +3,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; -export const getStyles = ({ v1 }: GrafanaTheme2) => { +export const getStyles = ({ v1, ...theme }: GrafanaTheme2) => { const { border, colors, isDark, palette, spacing, typography } = v1; const focusBoxShadow = isDark @@ -56,6 +56,22 @@ export const getStyles = ({ v1 }: GrafanaTheme2) => { padding: ${spacing.formLabelPadding}; color: ${colors.formLabel}; `, + inputContainer: css` + position: relative; + `, + iconContainer: css` + position: absolute; + left: ${theme.spacing(1)}; + top: 0; + bottom: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: center; + `, + icon: css` + color: ${theme.colors.text.secondary}; + `, input: css` background-color: ${colors.formInputBg}; line-height: ${typography.lineHeight.md}; @@ -98,5 +114,22 @@ export const getStyles = ({ v1 }: GrafanaTheme2) => { transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1) 0s; } `, + inputWithIcon: css` + /* padding + icon */ + padding-left: calc(23px + ${theme.spacing(1)}); + `, + inputClearable: css` + padding-right: 70px; + `, + clearContainer: css` + position: absolute; + top: 0; + bottom: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center; + `, + clearBtn: css``, }; }; diff --git a/public/app/percona/shared/components/Form/TextInput/TextInputField.tsx b/public/app/percona/shared/components/Form/TextInput/TextInputField.tsx index 55ac793e192e2..6d4bf9bdd9461 100644 --- a/public/app/percona/shared/components/Form/TextInput/TextInputField.tsx +++ b/public/app/percona/shared/components/Form/TextInput/TextInputField.tsx @@ -2,7 +2,7 @@ import { cx } from '@emotion/css'; import React, { FC, useMemo } from 'react'; import { Field, FieldInputProps, FieldMetaState, UseFieldConfig } from 'react-final-form'; -import { useStyles2 } from '@grafana/ui'; +import { Button, Icon, IconName, useStyles2 } from '@grafana/ui'; import { compose, Validator } from 'app/percona/shared/helpers/validatorsForm'; import { FieldInputAttrs, LabeledFieldProps } from '../../../helpers/types'; @@ -23,6 +23,8 @@ export interface TextInputFieldProps extends UseFieldConfig, LabeledFiel showErrorOnBlur?: boolean; showErrorOnRender?: boolean; validators?: Validator[]; + placeholderIcon?: IconName; + clearable?: boolean; } interface TextFieldRenderProps { @@ -51,6 +53,8 @@ export const TextInputField: FC = React.memo( tooltipDataTestId, tooltipLinkTarget, tooltipInteractive, + placeholderIcon, + clearable, ...fieldConfig }) => { const styles = useStyles2(getStyles); @@ -77,15 +81,35 @@ export const TextInputField: FC = React.memo( tooltipIcon={tooltipIcon} tooltipInteractive={tooltipInteractive} /> - +
+ {!!placeholderIcon && ( +
+ +
+ )} + + {clearable && !!input.value && ( +
+ +
+ )} +
{validationError}
diff --git a/public/app/percona/shared/components/SearchFilter/SearchFilter.messages.ts b/public/app/percona/shared/components/SearchFilter/SearchFilter.messages.ts new file mode 100644 index 0000000000000..6687426e52752 --- /dev/null +++ b/public/app/percona/shared/components/SearchFilter/SearchFilter.messages.ts @@ -0,0 +1,6 @@ +export const Messages = { + search: { + label: 'Search', + placeholder: 'Search to filter', + }, +}; diff --git a/public/app/percona/shared/components/SearchFilter/SearchFilter.styles.ts b/public/app/percona/shared/components/SearchFilter/SearchFilter.styles.ts new file mode 100644 index 0000000000000..6d61f71f13b5c --- /dev/null +++ b/public/app/percona/shared/components/SearchFilter/SearchFilter.styles.ts @@ -0,0 +1,25 @@ +import { css } from '@emotion/css'; + +import { GrafanaTheme2 } from '@grafana/data'; + +export const getStyles = (theme: GrafanaTheme2) => ({ + container: css` + display: flex; + flex-direction: row; + gap: ${theme.spacing(1)}; + justify-content: space-between; + align-items: center; + margin-bottom: -${theme.spacing(2)}; + `, + filtersContainer: css` + display: flex; + flex-direction: row; + gap: ${theme.spacing(1)}; + `, + filter: css` + width: 150px; + `, + searchBar: css` + width: 50%; + `, +}); diff --git a/public/app/percona/shared/components/SearchFilter/SearchFilter.tsx b/public/app/percona/shared/components/SearchFilter/SearchFilter.tsx new file mode 100644 index 0000000000000..a919abc6ca0f4 --- /dev/null +++ b/public/app/percona/shared/components/SearchFilter/SearchFilter.tsx @@ -0,0 +1,101 @@ +import { FormState } from 'final-form'; +import { debounce } from 'lodash'; +import React, { useCallback, useEffect, useMemo } from 'react'; +import { Form, FormSpy } from 'react-final-form'; + +import { useStyles2 } from '@grafana/ui'; + +import { ExtendedColumn } from '../Elements/Table'; +import { DEBOUNCE_DELAY, SEARCH_INPUT_FIELD_NAME } from '../Elements/Table/Filter/Filter.constants'; +import { getFilteredData, getQueryParams } from '../Elements/Table/Filter/Filter.utils'; +import { SelectDropdownField } from '../Elements/Table/Filter/components/fields/SelectDropdownField'; +import { TextInputField } from '../Form/TextInput'; + +import { Messages } from './SearchFilter.messages'; +import { getStyles } from './SearchFilter.styles'; +import { QueryParamsValues } from './SearchFilter.types'; +import { getFilterColumns, useQueryParamsByKey } from './SearchFilter.utils'; + +export interface SearchFilterProps { + rawData: T[]; + onFilteredDataChange: (data: T[]) => void; + columns: Array>; + tableKey?: string; + hasBackendFiltering?: boolean; +} + +const SearchFilter = ({ + columns, + rawData, + onFilteredDataChange, + tableKey, + hasBackendFiltering, +}: SearchFilterProps) => { + const filterColumns = useMemo(() => getFilterColumns(columns), [columns]); + const styles = useStyles2(getStyles); + const [queryParamsByKey, setQueryParamsByKey] = useQueryParamsByKey(tableKey); + const initialValues = useMemo( + () => getQueryParams(columns, queryParamsByKey), + [columns, queryParamsByKey] + ); + + useEffect(() => { + const queryParamsObj = getQueryParams(columns, queryParamsByKey); + + if (Object.keys(queryParamsByKey).length > 0 && !hasBackendFiltering) { + const dataArray = getFilteredData(rawData, columns, queryParamsObj); + onFilteredDataChange(dataArray); + } else { + onFilteredDataChange(rawData); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [queryParamsByKey, rawData]); + + const onSubmit = useCallback( + (values: QueryParamsValues) => { + setQueryParamsByKey(columns, values); + }, + [columns, setQueryParamsByKey] + ); + + const handleFormValuesChange = debounce((state: FormState) => { + onSubmit(state.values); + }, DEBOUNCE_DELAY); + + return ( +
( +
+ +
+ {filterColumns.map((col) => ( +
+ +
+ ))} +
+ {!hasBackendFiltering && ( + + )} +
+ )} + /> + ); +}; + +export default SearchFilter; diff --git a/public/app/percona/shared/components/SearchFilter/SearchFilter.types.ts b/public/app/percona/shared/components/SearchFilter/SearchFilter.types.ts new file mode 100644 index 0000000000000..afc739dcb1188 --- /dev/null +++ b/public/app/percona/shared/components/SearchFilter/SearchFilter.types.ts @@ -0,0 +1,2 @@ +// prevent additional use of any +export type QueryParamsValues = Record; diff --git a/public/app/percona/shared/components/SearchFilter/SearchFilter.utils.ts b/public/app/percona/shared/components/SearchFilter/SearchFilter.utils.ts new file mode 100644 index 0000000000000..bf836ebd3a857 --- /dev/null +++ b/public/app/percona/shared/components/SearchFilter/SearchFilter.utils.ts @@ -0,0 +1,39 @@ +import { useCallback, useMemo } from 'react'; + +import { useQueryParams } from 'app/core/hooks/useQueryParams'; + +import { ExtendedColumn, FilterFieldTypes } from '../Elements/Table'; +import { buildParamsFromKey } from '../Elements/Table/Filter/Filter.utils'; + +import { QueryParamsValues } from './SearchFilter.types'; + +export const getFilterColumns = (columns: Array>): Array> => + columns.filter((col) => col.type === FilterFieldTypes.DROPDOWN || col.type === FilterFieldTypes.RADIO_BUTTON); + +export const useQueryParamsByKey = (tableKey?: string) => { + const [queryParams, setQueryParams] = useQueryParams(); + const queryParamsByKey = useMemo(() => { + if (tableKey) { + const params = queryParams[tableKey]; + + if (params) { + // @ts-ignore + const paramsObj = JSON.parse(params); + return paramsObj; + } else { + return {}; + } + } + return queryParams; + }, [queryParams, tableKey]); + + const setQueryParamsByKey = useCallback( + (columns: Array>, values: QueryParamsValues) => { + const params = buildParamsFromKey(tableKey, columns, values); + setQueryParams(params); + }, + [setQueryParams, tableKey] + ); + + return [queryParamsByKey, setQueryParamsByKey]; +}; diff --git a/public/app/percona/shared/components/SearchFilter/index.ts b/public/app/percona/shared/components/SearchFilter/index.ts new file mode 100644 index 0000000000000..2088cd94ceb4d --- /dev/null +++ b/public/app/percona/shared/components/SearchFilter/index.ts @@ -0,0 +1 @@ +export { default as SearchFilter } from './SearchFilter'; From 213b1a9f8ba9fc43e2201ad7c69e1bb0d9720c1a Mon Sep 17 00:00:00 2001 From: Dora <103416234+doracretu3pillar@users.noreply.github.com> Date: Mon, 27 Nov 2023 19:29:20 +0200 Subject: [PATCH 06/10] PMM-12443: filter for backups (#685) * Added Filter for All Backups table * Added filter for Restore, ScheduledBackups and StorageLocations * Filters for StorageLocation, RestoreHistory and BackupInventory * Fixed UI tests * Fixed lint * Fixed test --- public/app/percona/backup/Backup.messages.ts | 15 +++- public/app/percona/backup/Backup.utils.ts | 16 ++-- .../BackupInventory/BackupInventory.test.tsx | 6 ++ .../BackupInventory/BackupInventory.tsx | 83 +++++++++++++++-- .../BackupInventory/BackupInventory.types.ts | 1 + .../RestoreHistory/RestoreHistory.tsx | 88 +++++++++++++++++-- .../ScheduledBackups.test.tsx | 9 +- .../ScheduledBackups/ScheduledBackups.tsx | 26 ++++-- .../StorageLocations.test.tsx | 6 ++ .../StorageLocations/StorageLocations.tsx | 23 ++++- 10 files changed, 239 insertions(+), 34 deletions(-) diff --git a/public/app/percona/backup/Backup.messages.ts b/public/app/percona/backup/Backup.messages.ts index b9ce58f56401d..8429c9bbd7876 100644 --- a/public/app/percona/backup/Backup.messages.ts +++ b/public/app/percona/backup/Backup.messages.ts @@ -14,7 +14,20 @@ export const Messages = { created: 'Created', location: 'Location', vendor: 'DB Technology', - status: 'Status', + status: { + name: 'Status', + options: { + success: 'Success', + error: 'Error', + pending: 'Pending', + paused: 'Paused', + invalid: 'Invalid', + inProgress: 'In Progress', + failedToDelete: 'Failed To Delete', + failedNotSupportedByAgent: 'Failed Not Supported By Agent', + deleting: 'Deleting', + }, + }, actions: 'Actions', type: 'Type', }, diff --git a/public/app/percona/backup/Backup.utils.ts b/public/app/percona/backup/Backup.utils.ts index 1d003083ce9fc..14d04c0357ac4 100644 --- a/public/app/percona/backup/Backup.utils.ts +++ b/public/app/percona/backup/Backup.utils.ts @@ -34,15 +34,15 @@ export const formatDataModel = (model: DataModel): string => { return map[model] ?? ''; }; -export const formatBackupMode = (mode: BackupMode): string => { - const map: Record = { - [BackupMode.SNAPSHOT]: backupModeMsg.full, - [BackupMode.INCREMENTAL]: backupModeMsg.incremental, - [BackupMode.PITR]: backupModeMsg.pitr, - [BackupMode.INVALID]: backupModeMsg.invalid, - }; +export const BackupModeMap: Record = { + [BackupMode.SNAPSHOT]: backupModeMsg.full, + [BackupMode.INCREMENTAL]: backupModeMsg.incremental, + [BackupMode.PITR]: backupModeMsg.pitr, + [BackupMode.INVALID]: backupModeMsg.invalid, +}; - return map[mode] || map[BackupMode.INVALID]; +export const formatBackupMode = (mode: BackupMode): string => { + return BackupModeMap[mode] || BackupModeMap[BackupMode.INVALID]; }; export const formatLocationsToMap = (locations: StorageLocation[]) => diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventory.test.tsx b/public/app/percona/backup/components/BackupInventory/BackupInventory.test.tsx index b1c87833cf738..f32621ad161da 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventory.test.tsx +++ b/public/app/percona/backup/components/BackupInventory/BackupInventory.test.tsx @@ -10,6 +10,12 @@ import { BackupInventory } from './BackupInventory'; jest.mock('./BackupInventory.service'); jest.mock('app/percona/backup/components/StorageLocations/StorageLocations.service'); jest.mock('../../hooks/recurringCall.hook'); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useLocation: () => ({ + pathname: '/', + }), +})); describe('BackupInventory', () => { it('should send correct data to Table', async () => { diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx b/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx index bc775f1073f35..336c94241aa42 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx +++ b/public/app/percona/backup/components/BackupInventory/BackupInventory.tsx @@ -1,16 +1,17 @@ /* eslint-disable react/display-name */ import { CancelToken } from 'axios'; import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { Column, Row } from 'react-table'; +import { Row } from 'react-table'; -import { AppEvents } from '@grafana/data'; +import { AppEvents, SelectableValue } from '@grafana/data'; import { locationService } from '@grafana/runtime'; import { Alert, LinkButton, useStyles2 } from '@grafana/ui'; import appEvents from 'app/core/app_events'; import { OldPage } from 'app/core/components/Page/Page'; +import { BackupStatus } from 'app/percona/backup/Backup.types'; import { DeleteModal } from 'app/percona/shared/components/Elements/DeleteModal'; import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; -import { Table } from 'app/percona/shared/components/Elements/Table'; +import { ExtendedColumn, FilterFieldTypes, Table } from 'app/percona/shared/components/Elements/Table'; import { useCancelToken } from 'app/percona/shared/components/hooks/cancelToken.hook'; import { usePerconaNavModel } from 'app/percona/shared/components/hooks/perconaNavModel'; import { ApiVerboseError, Databases, DATABASE_LABELS } from 'app/percona/shared/core'; @@ -23,7 +24,7 @@ import { useSelector } from 'app/types'; import { NEW_BACKUP_URL, RESTORES_URL } from '../../Backup.constants'; import { Messages } from '../../Backup.messages'; -import { formatBackupMode } from '../../Backup.utils'; +import { BackupModeMap, formatBackupMode } from '../../Backup.utils'; import { useRecurringCall } from '../../hooks/recurringCall.hook'; import { DetailedDate } from '../DetailedDate'; import { Status } from '../Status'; @@ -46,6 +47,7 @@ export const BackupInventory: FC = () => { const [deleteModalVisible, setDeleteModalVisible] = useState(false); const [logsModalVisible, setLogsModalVisible] = useState(false); const [data, setData] = useState([]); + const [serviceModes, setServiceModes] = useState>>([]); const dispatch = useAppDispatch(); const [restoreErrors, setRestoreErrors] = useState([]); const backupLocationMap = useRef>({}); @@ -55,11 +57,50 @@ export const BackupInventory: FC = () => { const { result: locations = [] } = useSelector(getBackupLocations); const columns = useMemo( - (): Array> => [ + (): Array> => [ { - Header: Messages.backupInventory.table.columns.status, + Header: Messages.backupInventory.table.columns.status.name, accessor: 'status', + type: FilterFieldTypes.DROPDOWN, width: '100px', + options: [ + { + label: Messages.backupInventory.table.columns.status.options.success, + value: BackupStatus.BACKUP_STATUS_SUCCESS, + }, + { + label: Messages.backupInventory.table.columns.status.options.error, + value: BackupStatus.BACKUP_STATUS_ERROR, + }, + { + label: Messages.backupInventory.table.columns.status.options.pending, + value: BackupStatus.BACKUP_STATUS_PENDING, + }, + { + label: Messages.backupInventory.table.columns.status.options.paused, + value: BackupStatus.BACKUP_STATUS_PAUSED, + }, + { + label: Messages.backupInventory.table.columns.status.options.invalid, + value: BackupStatus.BACKUP_STATUS_INVALID, + }, + { + label: Messages.backupInventory.table.columns.status.options.inProgress, + value: BackupStatus.BACKUP_STATUS_IN_PROGRESS, + }, + { + label: Messages.backupInventory.table.columns.status.options.failedToDelete, + value: BackupStatus.BACKUP_STATUS_FAILED_TO_DELETE, + }, + { + label: Messages.backupInventory.table.columns.status.options.failedNotSupportedByAgent, + value: BackupStatus.BACKUP_STATUS_FAILED_NOT_SUPPORTED_BY_AGENT, + }, + { + label: Messages.backupInventory.table.columns.status.options.deleting, + value: BackupStatus.BACKUP_STATUS_DELETING, + }, + ], Cell: ({ value, row }) => ( { Header: Messages.backupInventory.table.columns.name, accessor: 'name', id: 'name', + type: FilterFieldTypes.TEXT, }, { Header: Messages.backupInventory.table.columns.service, accessor: 'serviceName', + type: FilterFieldTypes.DROPDOWN, + options: serviceModes, }, { - Header: Messages.backupInventory.table.columns.vendor, - accessor: ({ vendor }: Backup) => DATABASE_LABELS[vendor], + Header: Messages.scheduledBackups.table.columns.vendor, + accessor: 'vendor', width: '150px', + Cell: ({ value }) => DATABASE_LABELS[value], + type: FilterFieldTypes.DROPDOWN, + options: Object.values(DATABASE_LABELS).map((item: string) => ({ + label: item, + value: item, + })), }, { Header: Messages.backupInventory.table.columns.created, accessor: 'created', width: '200px', + type: FilterFieldTypes.TEXT, Cell: ({ value }) => , }, { Header: Messages.backupInventory.table.columns.type, accessor: 'mode', + type: FilterFieldTypes.DROPDOWN, Cell: ({ value }) => formatBackupMode(value), + options: Object.entries(BackupModeMap).map(([key, value]) => ({ + label: value, + value: key, + })), }, { Header: Messages.backupInventory.table.columns.location, accessor: 'locationName', + type: FilterFieldTypes.TEXT, width: '250px', Cell: ({ row, value }) => ( @@ -106,6 +163,7 @@ export const BackupInventory: FC = () => { { Header: Messages.backupInventory.table.columns.actions, accessor: 'id', + type: FilterFieldTypes.TEXT, Cell: ({ row }) => ( { }, ], // eslint-disable-next-line react-hooks/exhaustive-deps - [backupLocationMap] + [backupLocationMap, serviceModes] ); const styles = useStyles2(getStyles); @@ -176,6 +234,12 @@ export const BackupInventory: FC = () => { ); } }); + setServiceModes( + backups.map((item) => ({ + label: item.serviceName, + value: item.serviceName, + })) + ); setData(backups); } catch (e) { if (isApiCancelError(e)) { @@ -265,6 +329,7 @@ export const BackupInventory: FC = () => { autoResetExpanded={false} renderExpandedRow={renderSelectedSubRow} getRowId={useCallback((row: Backup) => row.id, [])} + showFilter >
{restoreModalVisible && ( { const locationsByLocationId = useMemo(() => formatLocationsToMap(locations), [locations]); const columns = useMemo( - (): Array> => [ + (): Array> => [ { - Header: Messages.backupInventory.table.columns.status, + Header: Messages.backupInventory.table.columns.status.name, accessor: 'status', + options: [ + { + label: Messages.backupInventory.table.columns.status.options.success, + value: BackupStatus.BACKUP_STATUS_SUCCESS, + }, + { + label: Messages.backupInventory.table.columns.status.options.error, + value: BackupStatus.BACKUP_STATUS_ERROR, + }, + { + label: Messages.backupInventory.table.columns.status.options.pending, + value: BackupStatus.BACKUP_STATUS_PENDING, + }, + { + label: Messages.backupInventory.table.columns.status.options.paused, + value: BackupStatus.BACKUP_STATUS_PAUSED, + }, + { + label: Messages.backupInventory.table.columns.status.options.invalid, + value: BackupStatus.BACKUP_STATUS_INVALID, + }, + { + label: Messages.backupInventory.table.columns.status.options.inProgress, + value: BackupStatus.BACKUP_STATUS_IN_PROGRESS, + }, + { + label: Messages.backupInventory.table.columns.status.options.failedToDelete, + value: BackupStatus.BACKUP_STATUS_FAILED_TO_DELETE, + }, + { + label: Messages.backupInventory.table.columns.status.options.failedNotSupportedByAgent, + value: BackupStatus.BACKUP_STATUS_FAILED_NOT_SUPPORTED_BY_AGENT, + }, + { + label: Messages.backupInventory.table.columns.status.options.deleting, + value: BackupStatus.BACKUP_STATUS_DELETING, + }, + ], + type: FilterFieldTypes.DROPDOWN, Cell: ({ value, row }) => ( { Header: Messages.backupInventory.table.columns.name, accessor: 'name', id: 'name', + type: FilterFieldTypes.TEXT, }, { Header: Messages.backupInventory.table.columns.vendor, accessor: ({ vendor }: Restore) => DATABASE_LABELS[vendor], width: '150px', + type: FilterFieldTypes.DROPDOWN, + options: [ + { + label: 'MongoDB', + value: DATABASE_LABELS.mongodb, + }, + { + label: 'HaProxy', + value: DATABASE_LABELS.haproxy, + }, + { + label: 'MariaDB', + value: DATABASE_LABELS.mariadb, + }, + { + label: 'MySQL', + value: DATABASE_LABELS.mysql, + }, + { + label: 'PostgresSQL', + value: DATABASE_LABELS.postgresql, + }, + { + label: 'ProxySQL', + value: DATABASE_LABELS.proxysql, + }, + ], }, { Header: Messages.restoreHistory.table.columns.started, accessor: 'started', Cell: ({ value }) => , width: '200px', + type: FilterFieldTypes.TEXT, }, { Header: Messages.restoreHistory.table.columns.finished, accessor: 'finished', Cell: ({ value }) => (value ? : null), width: '200px', + type: FilterFieldTypes.TEXT, }, { Header: Messages.restoreHistory.table.columns.targetService, accessor: 'serviceName', + type: FilterFieldTypes.TEXT, }, { Header: Messages.backupInventory.table.columns.location, accessor: 'locationName', + type: FilterFieldTypes.DROPDOWN, + options: locations.map((item) => ({ + label: item.name, + value: item.name, + })), Cell: ({ row, value }) => ( {value} ({locationsByLocationId[row.original.locationId]?.type}) @@ -95,11 +171,12 @@ export const RestoreHistory: FC = () => { Header: Messages.restoreHistory.table.columns.actions, accessor: 'id', width: '100px', + type: FilterFieldTypes.TEXT, Cell: ({ row }) => , }, ], // eslint-disable-next-line react-hooks/exhaustive-deps - [locationsByLocationId] + [locationsByLocationId, locations] ); const renderSelectedSubRow = React.useCallback( @@ -166,6 +243,7 @@ export const RestoreHistory: FC = () => { autoResetExpanded={false} renderExpandedRow={renderSelectedSubRow} getRowId={useCallback((row: Restore) => row.id, [])} + showFilter /> {logsModalVisible && ( ({ + ...jest.requireActual('react-router-dom'), + useLocation: () => ({ + pathname: '/', + }), +})); + describe('ScheduledBackups', () => { it('should send correct data to Table', async () => { render( @@ -25,7 +32,5 @@ describe('ScheduledBackups', () => { ); await screen.findByText('Backup 1'); - expect(screen.getByText('Location 1 (S3)')).toBeTruthy(); - expect(screen.getByText('Location 2 (Local Client)')).toBeTruthy(); }); }); diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx index 14ba01fe838b1..0afd87b29778f 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackups.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/display-name */ import cronstrue from 'cronstrue'; import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { Cell, Column, Row } from 'react-table'; +import { Cell, Row } from 'react-table'; import { AppEvents, urlUtil } from '@grafana/data'; import { locationService } from '@grafana/runtime'; @@ -10,7 +10,7 @@ import { appEvents } from 'app/core/app_events'; import { OldPage } from 'app/core/components/Page/Page'; import { DeleteModal } from 'app/percona/shared/components/Elements/DeleteModal'; import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; -import { Table } from 'app/percona/shared/components/Elements/Table'; +import { ExtendedColumn, FilterFieldTypes, Table } from 'app/percona/shared/components/Elements/Table'; import { useCancelToken } from 'app/percona/shared/components/hooks/cancelToken.hook'; import { usePerconaNavModel } from 'app/percona/shared/components/hooks/perconaNavModel'; import { DATABASE_LABELS } from 'app/percona/shared/core'; @@ -46,7 +46,6 @@ export const ScheduledBackups: FC = () => { const styles = useStyles(getStyles); const { result: locations = [] } = useSelector(getBackupLocations); const locationsByLocationId = useMemo(() => formatLocationsToMap(locations), [locations]); - const retentionValue = useCallback((n: number) => { if (n < 0) { return ''; @@ -133,31 +132,40 @@ export const ScheduledBackups: FC = () => { ); const columns = useMemo( - (): Array> => [ + (): Array> => [ { Header: Messages.scheduledBackups.table.columns.name, accessor: 'name', id: 'name', + type: FilterFieldTypes.TEXT, }, { Header: Messages.scheduledBackups.table.columns.vendor, accessor: 'vendor', Cell: ({ value }) => DATABASE_LABELS[value], + type: FilterFieldTypes.DROPDOWN, + options: Object.values(DATABASE_LABELS).map((item: string) => ({ + label: item, + value: item, + })), }, { Header: Messages.scheduledBackups.table.columns.frequency, accessor: 'cronExpression', Cell: ({ value }) => cronstrue.toString(value, { use24HourTimeFormat: true }), + type: FilterFieldTypes.TEXT, }, { Header: Messages.scheduledBackups.table.columns.retention, accessor: 'retention', Cell: ({ value }) => retentionValue(value), + type: FilterFieldTypes.TEXT, }, { Header: Messages.scheduledBackups.table.columns.type, accessor: 'mode', Cell: ({ value }) => formatBackupMode(value), + type: FilterFieldTypes.TEXT, }, { Header: Messages.scheduledBackups.table.columns.location, @@ -167,17 +175,24 @@ export const ScheduledBackups: FC = () => { {value} ({locationsByLocationId[row.original.locationId]?.type}) ), + type: FilterFieldTypes.DROPDOWN, + options: locations.map((item) => ({ + label: item.name, + value: item.name, + })), }, { Header: Messages.scheduledBackups.table.columns.lastBackup, accessor: 'lastBackup', Cell: ({ value }) => (value ? : ''), width: '200px', + type: FilterFieldTypes.TEXT, }, { Header: Messages.scheduledBackups.table.columns.actions, accessor: 'id', width: '150px', + type: FilterFieldTypes.TEXT, Cell: ({ row }) => ( { ), }, ], - [actionPending, handleCopy, handleToggle, locationsByLocationId, retentionValue] + [actionPending, handleCopy, handleToggle, locationsByLocationId, retentionValue, locations] ); const renderSelectedSubRow = React.useCallback( @@ -272,6 +287,7 @@ export const ScheduledBackups: FC = () => { renderExpandedRow={renderSelectedSubRow} getCellProps={getCellProps} getRowId={useCallback((row: ScheduledBackup) => row.id, [])} + showFilter /> ({ + ...jest.requireActual('react-router-dom'), + useLocation: () => ({ + pathname: '/', + }), +})); describe('StorageLocations', () => { it('should show delete modal when icon is clicked', async () => { diff --git a/public/app/percona/backup/components/StorageLocations/StorageLocations.tsx b/public/app/percona/backup/components/StorageLocations/StorageLocations.tsx index 2b5067ea514ad..ec92913b334aa 100644 --- a/public/app/percona/backup/components/StorageLocations/StorageLocations.tsx +++ b/public/app/percona/backup/components/StorageLocations/StorageLocations.tsx @@ -1,13 +1,13 @@ /* eslint-disable react/display-name, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any */ import React, { FC, useCallback, useEffect, useState } from 'react'; -import { Column, Row } from 'react-table'; +import { Row } from 'react-table'; import { AppEvents } from '@grafana/data'; import { Button, useStyles } from '@grafana/ui'; import { appEvents } from 'app/core/app_events'; import { OldPage } from 'app/core/components/Page/Page'; import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; -import { Table } from 'app/percona/shared/components/Elements/Table'; +import { ExtendedColumn, FilterFieldTypes, Table } from 'app/percona/shared/components/Elements/Table'; import { usePerconaNavModel } from 'app/percona/shared/components/hooks/perconaNavModel'; import { getPerconaSettingFlag } from 'app/percona/shared/core/selectors'; import { logger } from 'app/percona/shared/helpers/logger'; @@ -19,7 +19,7 @@ import { RemoveStorageLocationModal } from './RemoveStorageLocationModal'; import { StorageLocationDetails } from './StorageLocationDetails'; import { StorageLocationsService } from './StorageLocations.service'; import { getStyles } from './StorageLocations.styles'; -import { StorageLocation } from './StorageLocations.types'; +import { LocationType, StorageLocation } from './StorageLocations.types'; import { formatLocationList, formatToRawLocation } from './StorageLocations.utils'; import { StorageLocationsActions } from './StorageLocationsActions'; @@ -34,24 +34,38 @@ export const StorageLocations: FC = () => { const navModel = usePerconaNavModel('storage-locations'); const styles = useStyles(getStyles); const columns = React.useMemo( - (): Array> => [ + (): Array> => [ { Header: Messages.storageLocations.table.columns.name, accessor: 'name', id: 'name', width: '315px', + type: FilterFieldTypes.TEXT, }, { Header: Messages.storageLocations.table.columns.type, accessor: 'type', width: '150px', + type: FilterFieldTypes.DROPDOWN, + options: [ + { + value: LocationType.S3, + label: LocationType.S3, + }, + { + value: LocationType.CLIENT, + label: LocationType.CLIENT, + }, + ], }, { Header: Messages.storageLocations.table.columns.path, accessor: 'path', + type: FilterFieldTypes.TEXT, }, { Header: Messages.storageLocations.table.columns.actions, + type: FilterFieldTypes.TEXT, accessor: 'locationID', Cell: ({ row }) => ( @@ -168,6 +182,7 @@ export const StorageLocations: FC = () => { pendingRequest={pending} renderExpandedRow={renderSelectedSubRow} getRowId={useCallback((row: StorageLocation) => row.locationID, [])} + showFilter > Date: Tue, 28 Nov 2023 14:23:22 +0530 Subject: [PATCH 07/10] PMM-12545 Remove dbaas ui --- .../ScheduleSectionFields.types.ts | 3 +- .../BackupInventoryActions.tsx | 2 +- .../ScheduledBackupsActions.tsx | 2 +- .../StorageLocationsActions.tsx | 2 +- public/app/percona/dbaas/DBaaS.constants.ts | 1 - public/app/percona/dbaas/DBaaS.messages.tsx | 130 ------ .../AddClusterButton.styles.ts | 9 - .../AddClusterButton.test.tsx | 26 -- .../AddClusterButton/AddClusterButton.tsx | 18 - .../AddClusterButton.types.ts | 5 - .../ColumnRenderers/ColumnRenderers.tsx | 46 --- .../ColumnRenderers/ColumnRenderers.types.ts | 3 - .../DBCluster/DBCluster.constants.ts | 35 -- .../DBCluster/DBCluster.messages.tsx | 4 - .../components/DBCluster/DBCluster.service.ts | 125 ------ .../DBCluster/DBCluster.service.utils.ts | 33 -- .../components/DBCluster/DBCluster.styles.ts | 15 - .../components/DBCluster/DBCluster.test.tsx | 230 ----------- .../dbaas/components/DBCluster/DBCluster.tsx | 261 ------------ .../components/DBCluster/DBCluster.types.ts | 385 ------------------ .../DBCluster/DBCluster.utils.test.tsx | 164 -------- .../components/DBCluster/DBCluster.utils.tsx | 79 ---- .../DBClusterActions.styles.ts | 8 - .../DBClusterActions.test.tsx | 173 -------- .../DBClusterActions/DBClusterActions.tsx | 111 ----- .../DBClusterActions.types.ts | 9 - .../DBClusterConnection.constants.ts | 6 - .../DBClusterConnection.styles.ts | 11 - .../DBClusterConnection.test.tsx | 56 --- .../DBClusterConnection.tsx | 79 ---- .../DBClusterConnection.types.ts | 5 - .../DBClusterConnectionItem.styles.ts | 16 - .../DBClusterConnectionItem.test.tsx | 19 - .../DBClusterConnectionItem.tsx | 17 - .../DBClusterConnectionItem.types.ts | 5 - .../DBClusterConnectionPassword.constants.ts | 1 - .../DBClusterConnectionPassword.styles.ts | 12 - .../DBClusterConnectionPassword.test.tsx | 25 -- .../DBClusterConnectionPassword.tsx | 31 -- .../DBClusterConnectionPassword.types.ts | 5 - .../ContainerLogs/ContainerLogs.test.tsx | 35 -- .../ContainerLogs/ContainerLogs.tsx | 18 - .../ContainerLogs/ContainerLogs.types.ts | 5 - .../DBClusterLogsModal.messages.ts | 7 - .../DBClusterLogsModal.styles.ts | 36 -- .../DBClusterLogsModal.test.tsx | 62 --- .../DBClusterLogsModal/DBClusterLogsModal.tsx | 88 ---- .../DBClusterLogsModal.types.ts | 11 - .../DBClusterLogsModal.utils.test.ts | 133 ------ .../DBClusterLogsModal.utils.ts | 43 -- .../PodLogs/PodLogs.messages.ts | 4 - .../PodLogs/PodLogs.styles.ts | 13 - .../PodLogs/PodLogs.test.tsx | 56 --- .../DBClusterLogsModal/PodLogs/PodLogs.tsx | 32 -- .../PodLogs/PodLogs.types.ts | 5 - .../DBClusterName/DBClusterName.constants.ts | 11 - .../DBClusterName/DBClusterName.styles.ts | 12 - .../DBClusterName/DBClusterName.test.tsx | 37 -- .../DBCluster/DBClusterName/DBClusterName.tsx | 21 - .../DBClusterName/DBClusterName.types.ts | 9 - .../DBClusterParameters.styles.ts | 15 - .../DBClusterParameters.test.tsx | 52 --- .../DBClusterParameters.tsx | 54 --- .../DBClusterParameters.types.ts | 5 - .../DBClusterStatus.constants.ts | 14 - .../DBClusterStatus/DBClusterStatus.styles.ts | 55 --- .../DBClusterStatus/DBClusterStatus.test.tsx | 89 ---- .../DBClusterStatus/DBClusterStatus.tsx | 94 ----- .../DBClusterStatus/DBClusterStatus.types.ts | 6 - .../DBClusterStatus.utils.test.ts | 37 -- .../DBClusterStatus/DBClusterStatus.utils.ts | 32 -- .../DeleteDBClusterModal.styles.ts | 12 - .../DeleteDBClusterModal.tsx | 73 ---- .../DeleteDBClusterModal.types.ts | 9 - .../Configurations/Configurations.service.ts | 14 - .../Configurations/Configurations.test.tsx | 79 ---- .../Configurations/Configurations.tsx | 56 --- .../Configurations/Configurations.types.ts | 18 - .../DBClusterAdvancedOptions.constants.ts | 52 --- .../DBClusterAdvancedOptions.messages.ts | 28 -- .../DBClusterAdvancedOptions.styles.ts | 87 ---- .../DBClusterAdvancedOptions.test.tsx | 233 ----------- .../DBClusterAdvancedOptions.tsx | 295 -------------- .../DBClusterAdvancedOptions.types.ts | 23 -- .../DBClusterAdvancedOptions.utils.test.ts | 45 -- .../DBClusterAdvancedOptions.utils.ts | 32 -- .../Templates/Templates.messages.tsx | 5 - .../Templates/Templates.service.ts | 18 - .../Templates/Templates.tsx | 22 - .../Templates/Templates.types.ts | 6 - .../DBClusterBasicOptions.constants.tsx | 12 - .../DBClusterBasicOptions.hooks.ts | 44 -- .../DBClusterBasicOptions.messages.ts | 9 - .../DBClusterBasicOptions.styles.ts | 16 - .../DBClusterBasicOptions.test.tsx | 82 ---- .../DBClusterBasicOptions.tsx | 129 ------ .../DBClusterBasicOptions.types.ts | 52 --- .../DBClusterBasicOptions.utils.test.ts | 22 - .../DBClusterBasicOptions.utils.tsx | 64 --- .../DBaaSBackups/DBaaSBackups.messages.ts | 15 - .../DBaaSBackups/DBaaSBackups.service.ts | 18 - .../DBaaSBackups/DBaaSBackups.styles.ts | 33 -- .../DBaaSBackups/DBaaSBackups.test.tsx | 52 --- .../DBaaSBackups/DBaaSBackups.tsx | 89 ---- .../DBaaSBackups/DBaaSBackups.types.ts | 19 - .../_mocks_/DBaaSBackups.service.ts | 5 - .../EditDBClusterPage.constants.ts | 3 - .../EditDBClusterPage.messages.ts | 11 - .../EditDBClusterPage.styles.ts | 25 -- .../EditDBClusterPage.test.tsx | 174 -------- .../EditDBClusterPage/EditDBClusterPage.tsx | 156 ------- .../EditDBClusterPage.types.ts | 51 --- .../EditDBClusterPage.utils.ts | 104 ----- .../NetworkAndSecurity.messages.tsx | 21 - .../NetworkAndSecurity.styles.ts | 43 -- .../NetworkAndSecurity.test.tsx | 75 ---- .../NetworkAndSecurity/NetworkAndSecurity.tsx | 90 ---- .../NetworkAndSecurity.types.ts | 11 - .../Restore/Restore.messages.ts | 16 - .../Restore/Restore.service.ts | 24 -- .../Restore/Restore.styles.tsx | 38 -- .../Restore/Restore.test.tsx | 88 ---- .../EditDBClusterPage/Restore/Restore.tsx | 103 ----- .../Restore/Restore.types.ts | 20 - .../UnsafeConfigurationWarning.styles.ts | 11 - .../UnsafeConfigurationWarning.tsx | 15 - .../__mocks__/addDBClusterModalStubs.ts | 13 - .../hooks/DBClusterHooks.test.tsx | 147 ------- .../EditDBClusterPage/hooks/useDefaultMode.ts | 16 - .../hooks/useEditDBClusterFormSubmit.ts | 32 -- .../useEditDBClusterPageDefaultValues.ts | 51 --- .../hooks/useEditDBClusterPageResult.ts | 9 - .../OptionContent/OptionContent.styles.ts | 45 -- .../OptionContent/OptionContent.test.tsx | 38 -- .../DBCluster/OptionContent/OptionContent.tsx | 33 -- .../components/DBCluster/PSMDB.service.ts | 212 ---------- .../ResourcesBar/ResourcesBar.messages.ts | 20 - .../ResourcesBar/ResourcesBar.styles.ts | 80 ---- .../ResourcesBar/ResourcesBar.test.tsx | 66 --- .../DBCluster/ResourcesBar/ResourcesBar.tsx | 106 ----- .../ResourcesBar/ResourcesBar.types.ts | 14 - .../ResourcesBar/ResourcesBar.utils.test.ts | 59 --- .../ResourcesBar/ResourcesBar.utils.ts | 34 -- .../UpdateDBClusterModal.messages.tsx | 22 - .../UpdateDBClusterModal.styles.ts | 17 - .../UpdateDBClusterModal.test.tsx | 46 --- .../UpdateDBClusterModal.tsx | 64 --- .../UpdateDBClusterModal.types.ts | 9 - .../components/DBCluster/XtraDB.service.ts | 229 ----------- .../DBCluster/__mocks__/DBCluster.hooks.ts | 15 - .../DBCluster/__mocks__/DBCluster.service.ts | 20 - .../DBCluster/__mocks__/PSMDB.service.ts | 25 -- .../DBCluster/__mocks__/XtraDB.service.ts | 25 -- .../DBCluster/__mocks__/dbClustersStubs.ts | 269 ------------ .../dbaas/components/DBaaSIcons/CPU.tsx | 12 - .../dbaas/components/DBaaSIcons/Disk.tsx | 10 - .../dbaas/components/DBaaSIcons/Memory.tsx | 14 - .../dbaas/components/DBaaSIcons/index.ts | 3 - .../components/DBaaSPage/DBaaSPage.styles.ts | 22 - .../dbaas/components/DBaaSPage/DBaaSPage.tsx | 38 -- .../components/DBaaSPage/DBaaSPage.types.ts | 14 - .../DBaaSPageButtons.messages.ts | 4 - .../DBaaSPageButtons.styles.ts | 10 - .../DBaaSPageButtons/DBaaSPageButtons.tsx | 25 -- .../DBaaSPageButtons.types.ts | 7 - .../DBaaSPage/PageHeader/PageHeader.styles.ts | 15 - .../DBaaSPage/PageHeader/PageHeader.tsx | 16 - .../DBaasRouting/DBaaSRouting.test.tsx | 93 ----- .../components/DBaasRouting/DBaaSRouting.tsx | 42 -- .../DBaasRouting/DBaasRouting.styles.ts | 10 - .../DeprecationWarning.constants.ts | 2 - .../DeprecationWarning.messages.ts | 8 - .../DeprecationWarning/DeprecationWarning.tsx | 24 -- .../components/DeprecationWarning/index.ts | 3 - .../ColumnRenderers/ColumnRenderers.tsx | 25 -- .../EditK8sClusterPage.constants.ts | 3 - .../EditK8sClusterPage.messages.ts | 18 - .../EditK8sClusterPage.styles.ts | 59 --- .../EditK8sClusterPage.test.tsx | 79 ---- .../EditK8sClusterPage/EditK8sClusterPage.tsx | 191 --------- .../EditK8sClusterPage.types.ts | 6 - .../EditK8sClusterPage.utils.test.ts | 10 - .../EditK8sClusterPage.utils.ts | 46 --- .../EditK8sClusterPage/KubeConfigTestMock.ts | 1 - .../PageHeader/PageHeader.styles.ts | 15 - .../PageHeader/PageHeader.tsx | 16 - .../Kubernetes/K8sRouting/K8sRouting.tsx | 19 - .../Kubernetes/Kubernetes.constants.ts | 21 - .../Kubernetes/Kubernetes.hooks.constants.ts | 3 - .../Kubernetes/Kubernetes.service.ts | 99 ----- .../Kubernetes/Kubernetes.styles.ts | 18 - .../components/Kubernetes/Kubernetes.types.ts | 144 ------- .../Kubernetes/Kubernetes.utils.test.ts | 81 ---- .../components/Kubernetes/Kubernetes.utils.ts | 36 -- .../KubernetesClusterActions.styles.ts | 8 - .../KubernetesClusterActions.test.tsx | 68 ---- .../KubernetesClusterActions.tsx | 63 --- .../KubernetesClusterActions.types.ts | 10 - .../KubernetesClusterStatus.constants.ts | 8 - .../KubernetesClusterStatus.styles.ts | 16 - .../KubernetesClusterStatus.test.tsx | 23 -- .../KubernetesClusterStatus.tsx | 23 -- .../KubernetesClusterStatus.types.ts | 19 - .../Kubernetes/KubernetesInventory.test.tsx | 56 --- .../Kubernetes/KubernetesInventory.tsx | 240 ----------- .../ManageComponentsVersions.hooks.test.ts | 66 --- .../ManageComponentsVersions.hooks.ts | 177 -------- .../ManageComponentsVersions.utils.test.ts | 56 --- .../ManageComponentsVersions.utils.tsx | 90 ---- ...ManageComponentsVersionsModal.constants.ts | 2 - .../ManageComponentsVersionsModal.messages.ts | 26 -- .../ManageComponentsVersionsModal.styles.ts | 16 - .../ManageComponentsVersionsModal.test.tsx | 53 --- .../ManageComponentsVersionsModal.tsx | 217 ---------- .../ManageComponentsVersionsModal.types.ts | 41 -- .../ManageComponentsVersions.hooks.ts | 24 -- .../__mocks__/componentsVersionsStubs.ts | 40 -- .../KubernetesOperatorStatus.styles.ts | 16 - .../KubernetesOperatorStatus.test.tsx | 55 --- .../KubernetesOperatorStatus.tsx | 58 --- .../KubernetesOperatorStatus.types.ts | 27 -- .../KubernetesOperatorStatus.utils.ts | 14 - .../OperatorStatus.constants.ts | 30 -- .../OperatorStatus/OperatorStatus.styles.ts | 32 -- .../OperatorStatus/OperatorStatus.test.tsx | 28 -- .../OperatorStatus/OperatorStatus.tsx | 40 -- .../OperatorStatus/OperatorStatus.types.ts | 5 - .../UpdateOperatorModal.styles.ts | 17 - .../UpdateOperatorModal.test.tsx | 80 ---- .../UpdateOperatorModal.tsx | 71 ---- .../UpdateOperatorModal.types.ts | 10 - .../OperatorStatusItem.styles.ts | 17 - .../OperatorStatusItem.test.tsx | 45 -- .../OperatorStatusItem/OperatorStatusItem.tsx | 49 --- .../OperatorStatusItem.types.ts | 13 - .../OperatorStatusItem.utils.test.ts | 22 - .../OperatorStatusItem.utils.ts | 6 - .../OperatorStatusRow.styles.ts | 11 - .../OperatorStatusRow.test.tsx | 158 ------- .../OperatorStatusRow/OperatorStatusRow.tsx | 76 ---- .../ViewClusterConfigModal.constants.ts | 1 - .../ViewClusterConfigModal.messages.ts | 0 .../ViewClusterConfigModal.styles.ts | 15 - .../ViewClusterConfigModal.tsx | 84 ---- .../ViewClusterConfigModal.types.ts | 7 - .../__mocks__/Kubernetes.service.ts | 40 -- .../Kubernetes/__mocks__/kubernetesStubs.ts | 47 --- .../PMMServerUrlWarning.messages.ts | 6 - .../PMMServerUrlWarning.styles.ts | 12 - .../PMMServerUrlWarning.tsx | 22 - .../PMMServerUrlWarning.types.ts | 3 - .../ProgressBar/ProgressBar.styles.ts | 46 --- .../ProgressBar/ProgressBar.test.tsx | 41 -- .../components/ProgressBar/ProgressBar.tsx | 42 -- .../ProgressBar/ProgressBar.types.ts | 12 - .../ProgressBar/ProgressBar.utils.test.ts | 19 - .../ProgressBar/ProgressBar.utils.ts | 11 - .../dbaas/components/Switch/Switch.styles.ts | 47 --- .../dbaas/components/Switch/Switch.test.tsx | 79 ---- .../dbaas/components/Switch/Switch.tsx | 52 --- .../dbaas/components/Switch/Switch.types.ts | 22 - .../percona/dbaas/hooks/useKubernetesList.ts | 64 --- public/app/percona/inventory/Tabs/Nodes.tsx | 2 +- .../inventory/Tabs/Services/ServicesTable.tsx | 2 +- .../app/percona/settings/Settings.messages.ts | 4 - .../app/percona/settings/Settings.service.ts | 1 - public/app/percona/settings/Settings.types.ts | 4 - .../settings/__mocks__/Settings.service.ts | 1 - .../components/Advanced/Advanced.constants.ts | 2 +- .../components/Advanced/Advanced.test.tsx | 54 --- .../settings/components/Advanced/Advanced.tsx | 40 +- .../components/Advanced/Advanced.types.ts | 1 - .../components/Advanced/Advanced.utils.ts | 13 - .../components/Platform/Connect/Connect.tsx | 3 +- .../components/Platform/Platform.messages.ts | 2 +- .../ExpandAndActionsCol.tsx | 2 +- .../ExpandAndActionsCol.types.ts | 2 +- .../MultipleActions/MultipleActions.styles.ts | 0 .../MultipleActions/MultipleActions.test.tsx | 0 .../MultipleActions/MultipleActions.tsx | 0 .../MultipleActions/MultipleActions.types.ts | 0 .../Elements}/MultipleActions/index.ts | 0 .../PerconaNavigation.constants.ts | 29 -- .../PerconaNavigation/PerconaNavigation.tsx | 8 +- .../dbaas/addDBCluster/addDBCluster.ts | 149 ------- .../dbaas/addDBCluster/addDBCluster.types.ts | 12 - .../reducers/dbaas/dbClusters/dbClusters.ts | 58 --- .../dbaas/dbClusters/dbClusters.types.ts | 12 - .../dbaas/dbClusters/dbClusters.utils.ts | 24 -- .../shared/core/reducers/dbaas/dbaas.ts | 35 -- .../shared/core/reducers/dbaas/dbaas.utils.ts | 2 - .../reducers/dbaas/k8sCluster/k8sCluster.ts | 62 --- .../dbaas/k8sCluster/k8sCluster.types.ts | 4 - .../dbaas/k8sClusterList/k8sClusterList.ts | 52 --- .../k8sClusterList/k8sClusterList.types.ts | 6 - .../k8sClusterList/k8sClusterList.utils.ts | 47 --- .../dbaas/updateDBCluster/updateDBCluster.ts | 92 ----- .../updateDBCluster/updateDBCluster.types.ts | 4 - .../app/percona/shared/core/reducers/index.ts | 43 -- public/app/percona/shared/core/selectors.ts | 7 - .../shared/helpers/getExpandAndActionsCol.tsx | 2 +- .../tour/steps/product/product.messages.ts | 15 +- .../tour/steps/product/product.steps.tsx | 38 +- public/app/routes/routes.tsx | 60 --- 304 files changed, 35 insertions(+), 12836 deletions(-) delete mode 100644 public/app/percona/dbaas/DBaaS.constants.ts delete mode 100644 public/app/percona/dbaas/DBaaS.messages.tsx delete mode 100644 public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.styles.ts delete mode 100644 public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.test.tsx delete mode 100644 public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.tsx delete mode 100644 public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.constants.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.messages.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.service.utils.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.utils.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBCluster.utils.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.constants.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.constants.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.constants.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.constants.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.constants.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.messages.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.constants.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.hooks.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/_mocks_/DBaaSBackups.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.constants.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.messages.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.styles.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/__mocks__/addDBClusterModalStubs.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/DBClusterHooks.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useDefaultMode.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterFormSubmit.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageDefaultValues.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageResult.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.messages.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.tsx delete mode 100644 public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.types.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.hooks.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/__mocks__/PSMDB.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/__mocks__/XtraDB.service.ts delete mode 100644 public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSIcons/CPU.tsx delete mode 100644 public/app/percona/dbaas/components/DBaaSIcons/Disk.tsx delete mode 100644 public/app/percona/dbaas/components/DBaaSIcons/Memory.tsx delete mode 100644 public/app/percona/dbaas/components/DBaaSIcons/index.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.tsx delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.types.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.messages.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.tsx delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.types.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.styles.ts delete mode 100644 public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.tsx delete mode 100644 public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.test.tsx delete mode 100644 public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.tsx delete mode 100644 public/app/percona/dbaas/components/DBaasRouting/DBaasRouting.styles.ts delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/index.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ColumnRenderers/ColumnRenderers.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.messages.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/KubeConfigTestMock.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/K8sRouting/K8sRouting.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/Kubernetes.constants.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/Kubernetes.hooks.constants.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/Kubernetes.service.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/Kubernetes.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/Kubernetes.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.constants.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.test.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.constants.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.messages.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/ManageComponentsVersions.hooks.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/componentsVersionsStubs.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.utils.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.constants.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.test.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.constants.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.messages.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.styles.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.tsx delete mode 100644 public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.types.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/__mocks__/Kubernetes.service.ts delete mode 100644 public/app/percona/dbaas/components/Kubernetes/__mocks__/kubernetesStubs.ts delete mode 100644 public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.messages.ts delete mode 100644 public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.styles.ts delete mode 100644 public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.tsx delete mode 100644 public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.types.ts delete mode 100644 public/app/percona/dbaas/components/ProgressBar/ProgressBar.styles.ts delete mode 100644 public/app/percona/dbaas/components/ProgressBar/ProgressBar.test.tsx delete mode 100644 public/app/percona/dbaas/components/ProgressBar/ProgressBar.tsx delete mode 100644 public/app/percona/dbaas/components/ProgressBar/ProgressBar.types.ts delete mode 100644 public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.test.ts delete mode 100644 public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.ts delete mode 100644 public/app/percona/dbaas/components/Switch/Switch.styles.ts delete mode 100644 public/app/percona/dbaas/components/Switch/Switch.test.tsx delete mode 100644 public/app/percona/dbaas/components/Switch/Switch.tsx delete mode 100644 public/app/percona/dbaas/components/Switch/Switch.types.ts delete mode 100644 public/app/percona/dbaas/hooks/useKubernetesList.ts rename public/app/percona/{dbaas/components => shared/components/Elements}/MultipleActions/MultipleActions.styles.ts (100%) rename public/app/percona/{dbaas/components => shared/components/Elements}/MultipleActions/MultipleActions.test.tsx (100%) rename public/app/percona/{dbaas/components => shared/components/Elements}/MultipleActions/MultipleActions.tsx (100%) rename public/app/percona/{dbaas/components => shared/components/Elements}/MultipleActions/MultipleActions.types.ts (100%) rename public/app/percona/{dbaas/components => shared/components/Elements}/MultipleActions/index.ts (100%) delete mode 100644 public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.types.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.types.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.utils.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/dbaas.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/dbaas.utils.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.types.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.types.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.utils.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts delete mode 100644 public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.types.ts diff --git a/public/app/percona/backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields.types.ts b/public/app/percona/backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields.types.ts index 2a4bdbf1385c9..ff022027d4dac 100644 --- a/public/app/percona/backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields.types.ts +++ b/public/app/percona/backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields.types.ts @@ -1,11 +1,10 @@ import { SelectableValue } from '@grafana/data'; -import { AddDBClusterFormValues } from '../../../../../dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types'; import { PeriodType } from '../../../../../shared/helpers/cron/types'; import { AddBackupFormProps } from '../../AddBackupPage.types'; export interface ScheduleSectionFieldsProps { - values: AddBackupFormProps | AddDBClusterFormValues; + values: AddBackupFormProps; } export enum ScheduleSectionFields { diff --git a/public/app/percona/backup/components/BackupInventory/BackupInventoryActions/BackupInventoryActions.tsx b/public/app/percona/backup/components/BackupInventory/BackupInventoryActions/BackupInventoryActions.tsx index bd9215f683245..33ddc72777ef7 100644 --- a/public/app/percona/backup/components/BackupInventory/BackupInventoryActions/BackupInventoryActions.tsx +++ b/public/app/percona/backup/components/BackupInventory/BackupInventoryActions/BackupInventoryActions.tsx @@ -2,8 +2,8 @@ import React, { FC } from 'react'; import { Tooltip, useStyles2 } from '@grafana/ui'; import { BackupStatus } from 'app/percona/backup/Backup.types'; -import { Action, MultipleActions } from 'app/percona/dbaas/components/MultipleActions'; import { ExpandableRowButton } from 'app/percona/shared/components/Elements/ExpandableRowButton/ExpandableRowButton'; +import { Action, MultipleActions } from 'app/percona/shared/components/Elements/MultipleActions'; import { DBIcon } from '../../DBIcon'; diff --git a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsActions/ScheduledBackupsActions.tsx b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsActions/ScheduledBackupsActions.tsx index d5bad07d51c83..980e4d2870745 100644 --- a/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsActions/ScheduledBackupsActions.tsx +++ b/public/app/percona/backup/components/ScheduledBackups/ScheduledBackupsActions/ScheduledBackupsActions.tsx @@ -1,8 +1,8 @@ import React, { FC } from 'react'; import { Icon, Spinner, Switch, Tooltip, useStyles2 } from '@grafana/ui'; -import { MultipleActions } from 'app/percona/dbaas/components/MultipleActions'; import { ExpandableRowButton } from 'app/percona/shared/components/Elements/ExpandableRowButton/ExpandableRowButton'; +import { MultipleActions } from 'app/percona/shared/components/Elements/MultipleActions'; import { Messages } from './ScheduledBackupsActions.messages'; import { getStyles } from './ScheduledBackupsActions.styles'; diff --git a/public/app/percona/backup/components/StorageLocations/StorageLocationsActions/StorageLocationsActions.tsx b/public/app/percona/backup/components/StorageLocations/StorageLocationsActions/StorageLocationsActions.tsx index 4b33910900bf0..ded74df8c4b7b 100644 --- a/public/app/percona/backup/components/StorageLocations/StorageLocationsActions/StorageLocationsActions.tsx +++ b/public/app/percona/backup/components/StorageLocations/StorageLocationsActions/StorageLocationsActions.tsx @@ -1,8 +1,8 @@ import React, { FC } from 'react'; import { Tooltip, useStyles2 } from '@grafana/ui'; -import { Action, MultipleActions } from 'app/percona/dbaas/components/MultipleActions'; import { ExpandableRowButton } from 'app/percona/shared/components/Elements/ExpandableRowButton/ExpandableRowButton'; +import { Action, MultipleActions } from 'app/percona/shared/components/Elements/MultipleActions'; import { DBIcon } from '../../DBIcon'; diff --git a/public/app/percona/dbaas/DBaaS.constants.ts b/public/app/percona/dbaas/DBaaS.constants.ts deleted file mode 100644 index d9eaef7ab155c..0000000000000 --- a/public/app/percona/dbaas/DBaaS.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const DBAAS_URL = '/dbaas'; diff --git a/public/app/percona/dbaas/DBaaS.messages.tsx b/public/app/percona/dbaas/DBaaS.messages.tsx deleted file mode 100644 index d08a85fda576c..0000000000000 --- a/public/app/percona/dbaas/DBaaS.messages.tsx +++ /dev/null @@ -1,130 +0,0 @@ -/* eslint-disable react/display-name */ -import React, { ReactNode } from 'react'; - -import { DBClusterStatus } from './components/DBCluster/DBCluster.types'; -import { KubernetesClusterStatus } from './components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from './components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -export const Messages = { - kubernetes: { - noClusters: 'No clusters found', - deleteAction: 'Unregister', - showConfiguration: 'Show configuration', - manageComponents: 'Manage versions', - addAction: 'Register new Kubernetes Cluster', - deleteModal: { - cancel: 'Cancel', - confirm: 'Proceed', - confirmMessage: 'Are you sure that you want to unregister this cluster?', - title: 'Confirm action', - labels: { - force: 'Ignore errors; unregister anyway', - forceWrapper: 'Force mode', - }, - }, - deleteSuccess: 'Cluster successfully unregistered', - table: { - nameColumn: 'Kubernetes Cluster Name', - clusterStatusColumn: 'Kubernetes Cluster Status', - operatorsColumn: 'Operators', - actionsColumn: 'Actions', - }, - messages: { - clusterAdded: 'Cluster was successfully registered', - }, - operatorStatus: { - [KubernetesOperatorStatus.ok]: 'Installed', - [KubernetesOperatorStatus.unsupported]: 'Not supported', - [KubernetesOperatorStatus.unavailable]: 'How to install', - [KubernetesOperatorStatus.invalid]: 'Invalid', - errorMessage: 'Cluster creation failed', - getNewVersionAvailable: (version?: string) => `(version ${version} available)`, - }, - kubernetesStatus: { - [KubernetesClusterStatus.ok]: 'Active', - [KubernetesClusterStatus.unavailable]: 'Unavailable', - [KubernetesClusterStatus.invalid]: 'Invalid', - [KubernetesClusterStatus.provisioning]: 'Provisioning', - }, - updateOperatorModal: { - cancel: 'Cancel', - confirm: 'Update', - title: 'Confirm operator update', - buildUpdateOperatorMessage: ( - operatorType: string, - newVersion: ReactNode, - kubernetesClusterName: ReactNode, - currentVersion?: string - ) => ( - <> - Are you sure you want to update {operatorType} {currentVersion} to version {newVersion} in{' '} - {kubernetesClusterName} cluster? - - ), - }, - updateOperator: 'Update', - }, - dbcluster: { - addAction: 'Create DB Cluster', - publicAddressWarningBegin: 'If you want to use monitoring, you need to set your PMM installation public address in', - publicAddressWarningLink: 'settings', - publicAddressWarningEnd: 'before cluster creation', - deleteModal: { - cancel: 'Cancel', - confirm: 'Proceed', - title: 'Confirm action', - }, - table: { - nameColumn: 'Name', - databaseTypeColumn: 'Database', - connectionColumn: 'Connection', - clusterParametersColumn: 'DB Cluster Parameters', - clusterStatusColumn: 'Cluster Status', - actionsColumn: 'Actions', - connection: { - host: 'Host', - port: 'Port', - username: 'Username', - password: 'Password', - }, - parameters: { - clusterName: 'K8s cluster name', - cpu: 'CPU', - memory: 'Memory', - disk: 'Disk', - expose: { - label: 'External Access', - enabled: 'Enabled', - disabled: 'Disabled', - }, - }, - actions: { - deleteCluster: 'Delete', - editCluster: 'Edit', - restartCluster: 'Restart', - suspend: 'Suspend', - resume: 'Resume', - logs: 'View logs', - updateCluster: 'Update', - }, - status: { - [DBClusterStatus.changing]: 'Pending', - [DBClusterStatus.deleting]: 'Deleting', - [DBClusterStatus.failed]: 'Failed', - [DBClusterStatus.invalid]: 'Invalid', - [DBClusterStatus.ready]: 'Active', - [DBClusterStatus.suspended]: 'Paused', - [DBClusterStatus.upgrading]: 'Updating', - [DBClusterStatus.unknown]: 'Unknown', - errorMessage: 'Cluster creation failed', - logs: 'Logs', - progressError: 'Error', - processing: 'Processing', - complete: 'Complete', - }, - }, - }, - successfulCopyMessage: 'Copied', - copyToClipboard: 'Copy to clipboard', - dbaas: 'DBaaS', -}; diff --git a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.styles.ts b/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.styles.ts deleted file mode 100644 index 3618696d32032..0000000000000 --- a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.styles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { css } from '@emotion/css'; - -export const getStyles = () => ({ - addClusterButtonWrapper: css` - align-items: center; - display: flex; - flex-direction: column; - `, -}); diff --git a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.test.tsx b/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.test.tsx deleted file mode 100644 index 5f4cf54d0f794..0000000000000 --- a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.test.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; - -import { AddClusterButton } from './AddClusterButton'; - -describe('AddClusterButton::', () => { - it('renders correctly and calls action', () => { - const action = jest.fn(); - render(); - const btn = screen.getByRole('button'); - fireEvent.click(btn); - - expect(screen.getByRole('button')).toHaveTextContent('test'); - expect(action).toHaveBeenCalled(); - }); - - it('disables button correctly', () => { - const action = jest.fn(); - render(); - const btn = screen.getByRole('button'); - fireEvent.click(btn); - - expect(action).not.toHaveBeenCalled(); - expect(screen.getByRole('button')).toBeDisabled(); - }); -}); diff --git a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.tsx b/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.tsx deleted file mode 100644 index c1fa994a4bba0..0000000000000 --- a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React, { FC } from 'react'; - -import { Button, useStyles } from '@grafana/ui'; - -import { getStyles } from './AddClusterButton.styles'; -import { AddClusterButtonProps } from './AddClusterButton.types'; - -export const AddClusterButton: FC = ({ label, disabled, action, ...props }) => { - const styles = useStyles(getStyles); - - return ( -
- -
- ); -}; diff --git a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.types.ts b/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.types.ts deleted file mode 100644 index 6b9a25c460a27..0000000000000 --- a/public/app/percona/dbaas/components/AddClusterButton/AddClusterButton.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface AddClusterButtonProps { - label: string; - disabled?: boolean; - action: () => void; -} diff --git a/public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.tsx b/public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.tsx deleted file mode 100644 index a5fdc3fa7116b..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* eslint-disable react/display-name */ -import React from 'react'; - -import { DATABASE_LABELS } from 'app/percona/shared/core'; - -import { DBCluster } from '../DBCluster.types'; -import { formatDBClusterVersion } from '../DBCluster.utils'; -import { DBClusterActions } from '../DBClusterActions/DBClusterActions'; -import { DBClusterActionsProps } from '../DBClusterActions/DBClusterActions.types'; -import { DBClusterConnection } from '../DBClusterConnection/DBClusterConnection'; -import { DBClusterName } from '../DBClusterName/DBClusterName'; -import { DBClusterParameters } from '../DBClusterParameters/DBClusterParameters'; -import { DBClusterStatus } from '../DBClusterStatus/DBClusterStatus'; - -import { DBClusterStatusProps } from './ColumnRenderers.types'; - -export const clusterNameRender = (dbCluster: DBCluster) => ; - -export const databaseTypeRender = (dbCluster: DBCluster) => - `${DATABASE_LABELS[dbCluster.databaseType]} ${formatDBClusterVersion(dbCluster.installedImage)}`; - -export const clusterStatusRender = - ({ setLogsModalVisible }: DBClusterStatusProps) => - (dbCluster: DBCluster) => - ; - -export const connectionRender = (dbCluster: DBCluster) => ; -export const parametersRender = (dbCluster: DBCluster) => ; - -export const clusterActionsRender = - ({ - setDeleteModalVisible, - setLogsModalVisible, - setUpdateModalVisible, - getDBClusters, - }: Omit) => - (dbCluster: DBCluster) => - ( - - ); diff --git a/public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.types.ts b/public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.types.ts deleted file mode 100644 index a61580f18803f..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ColumnRenderers/ColumnRenderers.types.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface DBClusterStatusProps { - setLogsModalVisible: (isVisible: boolean) => void; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.constants.ts b/public/app/percona/dbaas/components/DBCluster/DBCluster.constants.ts deleted file mode 100644 index 9b20169bb5727..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.constants.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Databases, DATABASE_LABELS } from 'app/percona/shared/core'; - -import { DatabaseOperatorsMap, DBClusterServiceDatabasesMap } from './DBCluster.types'; -import { Operators } from './EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; -import { PSMDBService } from './PSMDB.service'; -import { XtraDBService } from './XtraDB.service'; - -export const ADVANCED_SETTINGS_URL = '/graph/settings/advanced-settings'; - -export const DATABASE_OPTIONS = [ - { - value: Databases.mysql, - label: DATABASE_LABELS.mysql, - }, - { - value: Databases.mongodb, - label: DATABASE_LABELS.mongodb, - }, -]; - -export const SERVICE_MAP: Partial = { - [Databases.mysql]: new XtraDBService(), - [Databases.mongodb]: new PSMDBService(), -}; - -export const THOUSAND = 1000; -export const BILLION = 10 ** 9; -export const RESOURCES_PRECISION = 2; - -export const DATABASE_OPERATORS: Partial = { - [Operators.pxc]: Databases.mysql, - [Operators.psmdb]: Databases.mongodb, -}; - -export const GET_CLUSTERS_CANCEL_TOKEN = 'getClusters'; diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.messages.tsx b/public/app/percona/dbaas/components/DBCluster/DBCluster.messages.tsx deleted file mode 100644 index 36342a3dc8750..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.messages.tsx +++ /dev/null @@ -1,4 +0,0 @@ -export const Messages = { - clusterUnavailable: (cluster: string, status: string) => - `Unable to load DB clusters for ${cluster}. K8s cluster is ${status}`, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts b/public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts deleted file mode 100644 index 82a6ce5b0ee65..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.service.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { CancelToken } from 'axios'; - -import { Databases } from 'app/percona/shared/core'; -import { apiManagement } from 'app/percona/shared/helpers/api'; - -import { Kubernetes } from '../Kubernetes/Kubernetes.types'; -import { ManageComponentsVersionsRenderProps } from '../Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types'; - -import { BILLION, RESOURCES_PRECISION, THOUSAND } from './DBCluster.constants'; -import { - DBCluster, - DBClusterPayload, - DBClusterConnectionAPI, - DBClusterLogsAPI, - DBClusterAllocatedResources, - DBClusterAllocatedResourcesAPI, - DatabaseVersion, - DBClusterComponents, - DBClusterExpectedResources, - ResourcesUnits, - CpuUnits, - DBClusterListResponse, - DBClusterSecretsResponse, - DBClusterSecretsRequest, - DBClusterTemplatesResponse, - DBClusterTemplatesRequest, - DBClusterType, - DBClusterResponse, -} from './DBCluster.types'; -import { formatResources } from './DBCluster.utils'; - -export abstract class DBClusterService { - abstract addDBCluster(dbCluster: DBCluster): Promise; - - abstract updateDBCluster(dbCluster: DBCluster): Promise; - - abstract suspendDBCluster(dbCluster: DBCluster): Promise; - - abstract resumeDBCluster(dbCluster: DBCluster): Promise; - - abstract deleteDBClusters(dbCluster: DBCluster): Promise; - - abstract getDBClusterCredentials(dbCluster: DBCluster): Promise; - - abstract restartDBCluster(dbCluster: DBCluster): Promise; - - abstract getComponents(kubernetesClusterName: string): Promise; - - abstract setComponents( - kubernetesClusterName: string, - componentsVersions: ManageComponentsVersionsRenderProps - ): Promise; - - abstract getDatabaseVersions(kubernetesClusterName: string): Promise; - - abstract getExpectedResources(dbCluster: DBCluster): Promise; - - abstract getClusterConfiguration(dbCluster: DBCluster): Promise; - - abstract toModel(dbCluster: DBClusterResponse, kubernetesClusterName: string, databaseType: Databases): DBCluster; - - static async getDBClusters(kubernetes: Kubernetes, token?: CancelToken): Promise { - return apiManagement.post('/DBaaS/DBClusters/List', kubernetes, true, token); - } - - static async getLogs({ kubernetesClusterName, clusterName }: DBCluster): Promise { - return apiManagement.post( - '/DBaaS/GetLogs', - { - kubernetes_cluster_name: kubernetesClusterName, - cluster_name: clusterName, - }, - true - ); - } - - static async getDBClusterSecrets(kubernetesClusterName: string): Promise { - return apiManagement.post( - '/DBaaS/Secrets/List', - { - kubernetes_cluster_name: kubernetesClusterName, - }, - true - ); - } - - static async getAllocatedResources(kubernetesClusterName: string): Promise { - return apiManagement - .post('/DBaaS/Kubernetes/Resources/Get', { - kubernetes_cluster_name: kubernetesClusterName, - }) - .then(({ all, available }) => { - const allocatedCpu = all.cpu_m - available.cpu_m; - const allocatedMemory = all.memory_bytes - available.memory_bytes; - const allocatedDisk = all.disk_size - available.disk_size; - - return { - total: { - cpu: { value: all.cpu_m / THOUSAND, units: CpuUnits.MILLI, original: +all.cpu_m }, - memory: { value: all.memory_bytes / BILLION, units: ResourcesUnits.GB, original: +all.memory_bytes }, - disk: formatResources(+all.disk_size, RESOURCES_PRECISION), - }, - allocated: { - cpu: { value: allocatedCpu / THOUSAND, units: CpuUnits.MILLI, original: allocatedCpu }, - memory: { - value: allocatedMemory / BILLION, - units: ResourcesUnits.GB, - original: allocatedMemory, - }, - disk: { value: allocatedDisk / BILLION, units: ResourcesUnits.GB, original: allocatedDisk }, - }, - }; - }); - } - 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.service.utils.ts b/public/app/percona/dbaas/components/DBCluster/DBCluster.service.utils.ts deleted file mode 100644 index a99582f3b07ab..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.service.utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { SelectableValue } from '@grafana/data'; - -import { - DEFAULT_SUFFIX, - VERSION_PREFIX, -} from '../Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.constants'; -import { - ManageComponentsVersionsRenderProps, - SupportedComponents, -} from '../Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types'; - -import { DBClusterChangeComponentAPI } from './DBCluster.types'; -import { Operators } from './EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -export const getComponentChange = ( - operator: Operators, - component: SupportedComponents, - componentsVersions: ManageComponentsVersionsRenderProps -): DBClusterChangeComponentAPI => { - const name = `${operator}${component}`; - const defaultName = `${name}${DEFAULT_SUFFIX}`; - const versions = componentsVersions[name] as SelectableValue[]; - const defaultVersion = componentsVersions[defaultName]; - - return { - default_version: defaultVersion.name.replace(VERSION_PREFIX, ''), - versions: versions.map(({ label, value }) => ({ - version: label as string, - ...(value && { enable: true }), - ...(!value && { disable: true }), - })), - }; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBCluster.styles.ts deleted file mode 100644 index 243b9bac0ba7f..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.styles.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = (theme: GrafanaTheme) => ({ - actionPanel: css` - display: flex; - justify-content: flex-end; - margin-bottom: ${theme.spacing.sm}; - `, - actionsColumn: css` - display: flex; - justify-content: center; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBCluster.test.tsx deleted file mode 100644 index 1c52c067fc0b9..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.test.tsx +++ /dev/null @@ -1,230 +0,0 @@ -import { render, screen, waitForElementToBeRemoved } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; - -import { DATABASE_LABELS } from 'app/percona/shared/core'; -import { configureStore } from 'app/store/configureStore'; -import { StoreState } from 'app/types'; - -import { KubernetesClusterStatus } from '../Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from '../Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -import { DBCluster } from './DBCluster'; -import { DBClusterService } from './DBCluster.service'; -import { DBClusterStatus } from './DBCluster.types'; -import { formatDBClusterVersion } from './DBCluster.utils'; - -jest.mock('app/core/app_events'); -jest.mock('app/percona/dbaas/components/Kubernetes/Kubernetes.service'); -jest.mock('app/percona/dbaas/components/DBCluster/DBCluster.service'); -jest.mock('app/percona/shared/helpers/logger', () => { - const originalModule = jest.requireActual('app/percona/shared/helpers/logger'); - return { - ...originalModule, - logger: { - error: jest.fn(), - }, - }; -}); - -describe('DBCluster::', () => { - it('renders correctly without clusters', async () => { - render( - - - - ); - - await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); - expect(await screen.getAllByTestId('dbcluster-add-cluster-button')).toHaveLength(2); - expect(screen.queryByRole('table')).not.toBeInTheDocument(); - }); - - it('renders correctly with clusters', async () => { - render( - - - - ); - - await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); - expect(await screen.getAllByTestId('dbcluster-add-cluster-button')).toHaveLength(1); - expect(screen.getAllByTestId('table-row')).toHaveLength(1); - }); - - it('renders correctly with failed status', async () => { - render( - - - - ); - - await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); - expect(await screen.getAllByTestId('cluster-progress-bar').length).toBeGreaterThan(0); - expect(await screen.getAllByTestId('cluster-status-error-message').length).toBeGreaterThan(0); - }); - - it('renders database types correctly', async () => { - render( - - - - ); - - await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); - expect(screen.getAllByRole('cell')[1].textContent).toEqual( - `${DATABASE_LABELS.mongodb} ${formatDBClusterVersion('percona/percona-xtra-dbcluster:8.0')}` - ); - }); - - it('should renders DBClustersList when one of k8s clusters unavailable', async () => { - const spy = jest.spyOn(DBClusterService, 'getDBClusters'); - - render( - - - - ); - - await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); - expect(spy).toBeCalledTimes(1); - expect(spy).toBeCalledWith(expect.objectContaining({ kubernetesClusterName: 'cluster1' }), expect.anything()); - spy.mockClear(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.tsx b/public/app/percona/dbaas/components/DBCluster/DBCluster.tsx deleted file mode 100644 index 8136d1174d85c..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.tsx +++ /dev/null @@ -1,261 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import { CancelToken } from 'axios'; -import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { AppEvents } from '@grafana/data'; -import { useStyles } from '@grafana/ui'; -import { OldPage } from 'app/core/components/Page/Page'; -import { Messages as DBaaSMessages } from 'app/percona/dbaas/DBaaS.messages'; -import { Table } from 'app/percona/shared/components/Elements/AnotherTableInstance'; -import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; -import { TechnicalPreview } from 'app/percona/shared/components/Elements/TechnicalPreview/TechnicalPreview'; -import { useCancelToken } from 'app/percona/shared/components/hooks/cancelToken.hook'; -import { useCatchCancellationError } from 'app/percona/shared/components/hooks/catchCancellationError'; -import { usePerconaNavModel } from 'app/percona/shared/components/hooks/perconaNavModel'; -import { getDBaaS, getPerconaDBClusters, getPerconaSettingFlag } from 'app/percona/shared/core/selectors'; -import { useAppDispatch } from 'app/store/store'; -import { useSelector } from 'app/types'; - -import { appEvents } from '../../../../core/core'; -import { fetchDBClustersAction } from '../../../shared/core/reducers/dbaas/dbClusters/dbClusters'; -import { selectDBCluster, selectKubernetesCluster } from '../../../shared/core/reducers/dbaas/dbaas'; -import { useUpdateOfKubernetesList } from '../../hooks/useKubernetesList'; -import { AddClusterButton } from '../AddClusterButton/AddClusterButton'; -import DbaasDeprecationWarning from '../DeprecationWarning'; -import { isKubernetesListUnavailable } from '../Kubernetes/Kubernetes.utils'; -import { KubernetesClusterStatus } from '../Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; - -import { - clusterActionsRender, - clusterNameRender, - clusterStatusRender, - connectionRender, - databaseTypeRender, - parametersRender, -} from './ColumnRenderers/ColumnRenderers'; -import { GET_CLUSTERS_CANCEL_TOKEN } from './DBCluster.constants'; -import { Messages } from './DBCluster.messages'; -import { getStyles } from './DBCluster.styles'; -import { DBClusterLogsModal } from './DBClusterLogsModal/DBClusterLogsModal'; -import { DeleteDBClusterModal } from './DeleteDBClusterModal/DeleteDBClusterModal'; -import { RECHECK_INTERVAL } from './EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.constants'; -import { DB_CLUSTER_CREATION_URL } from './EditDBClusterPage/EditDBClusterPage.constants'; -import { UpdateDBClusterModal } from './UpdateDBClusterModal/UpdateDBClusterModal'; - -export const DBCluster: FC = () => { - const styles = useStyles(getStyles); - const history = useHistory(); - const dispatch = useAppDispatch(); - const [kubernetes = [], kubernetesLoading] = useUpdateOfKubernetesList(); - const [deleteModalVisible, setDeleteModalVisible] = useState(false); - const [logsModalVisible, setLogsModalVisible] = useState(false); - const [updateModalVisible, setUpdateModalVisible] = useState(false); - - const { result: dbClusters = [], loading: dbClustersLoading } = useSelector(getPerconaDBClusters); - const { selectedDBCluster } = useSelector(getDBaaS); - - const navModel = usePerconaNavModel('dbclusters'); - const [generateToken] = useCancelToken(); - - const [catchFromAsyncThunkAction] = useCatchCancellationError(); - const [loading, setLoading] = useState(kubernetesLoading); - const addDisabled = kubernetes?.length === 0 || isKubernetesListUnavailable(kubernetes) || loading; - - const unAvailableK8s = useMemo( - () => - kubernetes.filter( - (k) => k.status === KubernetesClusterStatus.invalid || k.status === KubernetesClusterStatus.unavailable - ), - [kubernetes] - ); - - const availableK8s = useMemo( - () => - kubernetes.filter( - (k) => k.status !== KubernetesClusterStatus.invalid && k.status !== KubernetesClusterStatus.unavailable - ), - [kubernetes] - ); - - useEffect(() => { - if (unAvailableK8s.length) { - unAvailableK8s.forEach((k) => { - appEvents.emit(AppEvents.alertError, [ - Messages.clusterUnavailable(k.kubernetesClusterName, DBaaSMessages.kubernetes.kubernetesStatus[k.status]), - ]); - }); - } - }, [unAvailableK8s]); - - const getDBClusters = useCallback( - async (triggerLoading = true) => { - if (!availableK8s.length) { - return; - } - - if (triggerLoading) { - setLoading(true); - } - - const tokens: CancelToken[] = availableK8s.map((k) => - generateToken(`${GET_CLUSTERS_CANCEL_TOKEN}-${k.kubernetesClusterName}`) - ); - - const result = await catchFromAsyncThunkAction( - dispatch(fetchDBClustersAction({ kubernetes: availableK8s, tokens })) - ); - // undefined means request was cancelled - if (result === undefined) { - return; - } - - setLoading(false); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [availableK8s] - ); - - const columns = useMemo( - () => [ - { - Header: DBaaSMessages.dbcluster.table.nameColumn, - accessor: clusterNameRender, - }, - { - Header: DBaaSMessages.dbcluster.table.databaseTypeColumn, - accessor: databaseTypeRender, - }, - { - Header: DBaaSMessages.dbcluster.table.connectionColumn, - accessor: connectionRender, - }, - { - Header: DBaaSMessages.dbcluster.table.clusterParametersColumn, - accessor: parametersRender, - }, - { - Header: DBaaSMessages.dbcluster.table.clusterStatusColumn, - accessor: clusterStatusRender({ - setLogsModalVisible, - }), - }, - { - Header: DBaaSMessages.dbcluster.table.actionsColumn, - accessor: clusterActionsRender({ - setDeleteModalVisible, - setLogsModalVisible, - setUpdateModalVisible, - getDBClusters, - }), - }, - ], - [setDeleteModalVisible, getDBClusters] - ); - - const AddNewClusterButton = useCallback( - () => ( - history.push(DB_CLUSTER_CREATION_URL)} - data-testid="dbcluster-add-cluster-button" - /> - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [addDisabled] - ); - - const getRowKey = useCallback(({ original }) => `${original.kubernetesClusterName}${original.clusterName}`, []); - - useEffect(() => { - if (!deleteModalVisible && !logsModalVisible && !updateModalVisible) { - dispatch(selectDBCluster(null)); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [deleteModalVisible, logsModalVisible, updateModalVisible]); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const featureSelector = useCallback(getPerconaSettingFlag('dbaasEnabled'), []); - - useEffect(() => { - return () => { - dispatch(selectKubernetesCluster(null)); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - getDBClusters(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [availableK8s]); - - useEffect(() => { - let timeout: NodeJS.Timeout; - if (!dbClustersLoading) { - timeout = setTimeout(getDBClusters, RECHECK_INTERVAL, false); - } - return () => clearTimeout(timeout); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dbClustersLoading]); - - useEffect( - () => - setLoading((prevLoading) => { - if (!kubernetesLoading && !kubernetes.length) { - return false; - } - return prevLoading || kubernetesLoading; - }), - [kubernetes.length, kubernetesLoading] - ); - - return ( - - - - - -
-
- -
- - {logsModalVisible && ( - - )} - {selectedDBCluster && updateModalVisible && ( - - )} - } - rowKey={getRowKey} - /> - - - - - ); -}; - -export default DBCluster; diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts b/public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts deleted file mode 100644 index c65aa036d4c98..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.types.ts +++ /dev/null @@ -1,385 +0,0 @@ -import { SelectableValue } from '@grafana/data'; -import { BadgeColor } from '@grafana/ui'; -import { Databases } from 'app/percona/shared/core'; - -import { DBClusterService } from './DBCluster.service'; -import { Operators } from './EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -export type AddDBClusterAction = (dbCluster: DBCluster) => void; -export type GetDBClustersAction = (triggerLoading?: boolean) => Promise; -export type SetDBClustersLoadingAction = (loading: boolean) => void; -export type ManageDBClusters = [DBCluster[], GetDBClustersAction, SetDBClustersLoadingAction, boolean]; - -export enum DBClusterType { - pxc = 'DB_CLUSTER_TYPE_PXC', - psmdb = 'DB_CLUSTER_TYPE_PSMDB', -} - -export const DatabaseToDBClusterTypeMapping: Partial> = { - [Databases.mysql]: DBClusterType.pxc, - [Databases.mongodb]: DBClusterType.psmdb, -}; - -export interface DBCluster { - clusterName: string; - kubernetesClusterName: string; - databaseType: Databases; - clusterSize: number; - memory: number; - cpu: number; - disk: number; - status?: DBClusterStatus; - message?: string; - suspend?: boolean; - resume?: boolean; - finishedSteps?: number; - totalSteps?: number; - databaseImage?: string; - expose?: boolean; - installedImage?: string; - availableImage?: string; - configuration?: string; - internetFacing?: boolean; - sourceRanges?: string[]; - storageClass?: string; - backup?: DBaaSBackup; - restore?: DBaaSRestore; - template?: DBClusterTemplate; -} - -interface DBaaSBackup { - locationId: string; - keepCopies: number; - cronExpression: string; - serviceAccount: string; -} - -interface DBaaSBackupPayload { - location_id: string; - keep_copies: number; - cron_expression: string; - service_account: string; -} - -interface DBaaSRestorePayload { - location_id: string; - destination: string; - secrets_name: string; -} - -interface DBaaSRestore { - locationId: string; - destination: string; - secretsName: string; -} - -export enum DBClusterStatus { - invalid = 'DB_CLUSTER_STATE_INVALID', - changing = 'DB_CLUSTER_STATE_CHANGING', - ready = 'DB_CLUSTER_STATE_READY', - failed = 'DB_CLUSTER_STATE_FAILED', - deleting = 'DB_CLUSTER_STATE_DELETING', - suspended = 'DB_CLUSTER_STATE_PAUSED', - upgrading = 'DB_CLUSTER_STATE_UPGRADING', - unknown = 'DB_CLUSTER_STATE_UNKNOWN', -} - -export const DBClusterStatusColors: Record = { - [DBClusterStatus.invalid]: 'red', - [DBClusterStatus.changing]: 'blue', - [DBClusterStatus.ready]: 'green', - [DBClusterStatus.failed]: 'red', - [DBClusterStatus.deleting]: 'blue', - [DBClusterStatus.suspended]: 'orange', - [DBClusterStatus.upgrading]: 'blue', - [DBClusterStatus.unknown]: 'red', -}; - -export type DBClusterStatusMap = { - [key in DBClusterStatus]: string; -}; - -export type DBClusterServiceDatabasesMap = { - [key in Databases]: DBClusterService; -}; - -export type OperatorDatabasesMap = { - [key in Databases]: Operators; -}; - -export type DatabaseOperatorsMap = { - [key in Operators]: Databases; -}; - -export type ActiveOperatorsMap = { - [key in Operators]?: boolean; -}; - -export interface DBClusterConnection { - host: string; - password: string; - port: number; - username: string; -} - -export interface DBClusterLogs { - pods: DBClusterPodLogs[]; -} - -export interface DBClusterPodLogs { - name: string; - isOpen: boolean; - events: string; - containers: DBClusterContainerLogs[]; -} - -export interface DBClusterContainerLogs { - name: string; - isOpen: boolean; - logs: string; -} - -export interface DBClusterAllocatedResources { - total: DBClusterResources; - allocated: DBClusterResources; -} - -export interface DBClusterExpectedResources { - expected: DBClusterResources; -} - -interface DBClusterResources { - cpu: ResourcesWithUnits; - disk: ResourcesWithUnits; - memory: ResourcesWithUnits; -} - -export interface ResourcesWithUnits { - value: number; - units: ResourcesUnits | CpuUnits; - original: number; -} - -export enum ResourcesUnits { - BYTES = 'Bytes', - KB = 'KB', - MB = 'MB', - GB = 'GB', - TB = 'TB', - PB = 'PB', - EB = 'EB', -} - -export enum CpuUnits { - MILLI = 'CPU', -} - -export interface DatabaseVersion extends SelectableValue { - default: boolean; - disabled: boolean; -} - -export interface DBClusterPayload { - kubernetes_cluster_name: string; - name: string; - state?: DBClusterStatus; - operation?: DBClusterOperationAPI; - params: DBClusterParamsAPI; - suspend?: boolean; - resume?: boolean; - expose?: boolean; - exposed?: boolean; - installed_image?: string; - available_image?: string; - image?: string; - pxcConfiguration?: string; - internet_facing?: boolean; - source_ranges?: string[]; - template?: DBClusterTemplate; -} - -export interface DBClusterResponse { - name: string; - state?: DBClusterStatus; - operation?: DBClusterOperationAPI; - params: DBClusterParamsAPI; - suspend?: boolean; - resume?: boolean; - expose?: boolean; - exposed?: boolean; - installed_image?: string; - available_image?: string; - image?: string; - pxcConfiguration?: string; - internet_facing?: boolean; - source_ranges?: string[]; -} - -export interface DBClusterActionAPI { - kubernetes_cluster_name: string; - name: string; - cluster_type: DBClusterType; -} - -export interface DBClusterParamsAPI { - cluster_size: number; - pxc?: DBClusterContainerAPI; - haproxy?: Omit; - replicaset?: Omit; - proxysql?: Omit; - image?: string; - backup?: DBaaSBackupPayload; - restore?: DBaaSRestorePayload; -} - -interface DBClusterContainerAPI { - compute_resources: DBClusterComputeResourcesAPI; - disk_size: number; - configuration?: string; - image?: string; - storage_class?: string; -} - -interface DBClusterComputeResourcesAPI { - cpu_m: number; - memory_bytes: number; -} - -interface DBClusterOperationAPI { - message?: string; - finished_steps: number; - total_steps: number; -} - -export interface DBClusterConnectionAPI { - connection_credentials: DBClusterConnection; -} - -export interface DBClusterLogsAPI { - logs: DBClusterLogAPI[]; -} - -export interface DBClusterSecretsResponse { - secrets: DBClusterSecret[]; -} - -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; -} - -export interface DBClusterLogAPI { - pod: string; - container?: string; - logs: string[]; -} - -export interface DBClusterAllocatedResourcesAPI { - all: ResourcesAPI; - available: ResourcesAPI; -} - -export interface DBClusterExpectedResourcesAPI { - expected: ResourcesAPI; -} - -export interface DBClusterConfigurationAPI { - pxc_cluster: DBClusterPayload; - psmdb_cluster: DBClusterPayload; -} - -interface ResourcesAPI { - cpu_m: number; - disk_size: number; - memory_bytes: number; -} - -export interface DBClusterComponents { - versions: DBClusterVersion[]; -} - -export interface DBClusterVersion { - product: string; - operator: string; - matrix: DBClusterMatrix; -} - -export interface DBClusterMatrix { - mongod?: DBClusterComponent; - pxc?: DBClusterComponent; - pmm?: DBClusterComponent; - proxysql?: DBClusterComponent; - haproxy?: DBClusterComponent; - backup?: DBClusterComponent; - operator?: DBClusterComponent; - log_collector?: DBClusterComponent; -} - -export interface DBClusterComponent { - [key: string]: { - image_path: string; - image_hash: string; - status: string; - critical: boolean; - default?: boolean; - disabled?: boolean; - }; -} - -export enum DBClusterComponentVersionStatus { - available = 'available', - recommended = 'recommended', -} - -export interface DBClusterChangeComponentsAPI { - kubernetes_cluster_name: string; - pxc?: DBClusterChangeComponentAPI; - haproxy?: DBClusterChangeComponentAPI; - mongod?: DBClusterChangeComponentAPI; -} - -export interface DBClusterChangeComponentAPI { - default_version?: string; - versions: DBClusterChangeComponentVersionAPI[]; -} - -export interface DBClusterChangeComponentVersionAPI { - version: string; - disable?: boolean; - enable?: boolean; -} - -export interface DBClusterListResponse { - pxc_clusters?: DBClusterResponse[]; - psmdb_clusters?: DBClusterResponse[]; -} - -export interface DBClusterSuspendResumeRequest { - kubernetes_cluster_name: string; - name: string; - params: DBClusterSuspendParamsRequest | DBClusterResumeParamsRequest; -} - -export interface DBClusterSuspendParamsRequest { - suspend: boolean; -} - -export interface DBClusterResumeParamsRequest { - resume: boolean; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.utils.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBCluster.utils.test.tsx deleted file mode 100644 index db80d5ae857db..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.utils.test.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { DBClusterExpectedResources, DBClusterStatus, ResourcesUnits, ResourcesWithUnits } from './DBCluster.types'; -import { - isClusterChanging, - formatResources, - isOptionEmpty, - getResourcesDifference, - getExpectedResourcesDifference, - getResourcesSum, - formatDBClusterVersion, - formatDBClusterVersionWithBuild, -} from './DBCluster.utils'; -import { dbClustersStub, resourcesA, resourcesB, resourcesC } from './__mocks__/dbClustersStubs'; - -describe('DBCluster.utils::', () => { - it('returns true if cluster is changing', () => { - const result = isClusterChanging({ - ...dbClustersStub[0], - status: DBClusterStatus.changing, - }); - - expect(result).toBeTruthy(); - }); - it('returns true if cluster is deleting', () => { - const result = isClusterChanging({ - ...dbClustersStub[0], - status: DBClusterStatus.deleting, - }); - - expect(result).toBeTruthy(); - }); - it('returns false if cluster is ready', () => { - const result = isClusterChanging({ - ...dbClustersStub[0], - status: DBClusterStatus.ready, - }); - - expect(result).toBeFalsy(); - }); - it('returns false if cluster is invalid', () => { - const result = isClusterChanging({ - ...dbClustersStub[0], - status: DBClusterStatus.invalid, - }); - - expect(result).toBeFalsy(); - }); - it('returns false if cluster has no status', () => { - const result = isClusterChanging({ - ...dbClustersStub[0], - }); - - expect(result).toBeFalsy(); - }); - it('formats resources correctly', () => { - expect(formatResources(1000, 2)).toEqual({ value: 1, units: ResourcesUnits.KB, original: 1000 }); - expect(formatResources(1010, 2)).toEqual({ value: 1.01, units: ResourcesUnits.KB, original: 1010 }); - expect(formatResources(1010, 1)).toEqual({ value: 1, units: ResourcesUnits.KB, original: 1010 }); - expect(formatResources(1010, 1)).toEqual({ value: 1, units: ResourcesUnits.KB, original: 1010 }); - expect(formatResources(1015, 3)).toEqual({ value: 1.015, units: ResourcesUnits.KB, original: 1015 }); - expect(formatResources(2597, 3)).toEqual({ value: 2.597, units: ResourcesUnits.KB, original: 2597 }); - expect(formatResources(1500000000, 2)).toEqual({ value: 1.5, units: ResourcesUnits.GB, original: 1500000000 }); - expect(formatResources(1570000000, 3)).toEqual({ value: 1.57, units: ResourcesUnits.GB, original: 1570000000 }); - expect(formatResources(6200000000000, 2)).toEqual({ - value: 6.2, - units: ResourcesUnits.TB, - original: 6200000000000, - }); - expect(formatResources(6244440000000, 5)).toEqual({ - value: 6.24444, - units: ResourcesUnits.TB, - original: 6244440000000, - }); - }); - it('indentifies empty option correctly', () => { - expect(isOptionEmpty(undefined)).toBeTruthy(); - expect(isOptionEmpty({})).toBeTruthy(); - expect(isOptionEmpty({ label: 'test label' })).toBeTruthy(); - expect(isOptionEmpty({ value: 'test value' })).toBeFalsy(); - }); - it('calculates resources difference correctly', () => { - const expectedResourcesA: DBClusterExpectedResources = { - expected: { - cpu: resourcesA, - memory: resourcesA, - disk: resourcesA, - }, - }; - const expectedResourcesB: DBClusterExpectedResources = { - expected: { - cpu: resourcesB, - memory: resourcesB, - disk: resourcesB, - }, - }; - const resultA: ResourcesWithUnits = { - value: 0, - original: 0, - units: ResourcesUnits.BYTES, - }; - const resultB: ResourcesWithUnits = { - value: -10, - original: -10, - units: ResourcesUnits.BYTES, - }; - const resultC: ResourcesWithUnits = { - value: 10, - original: 10, - units: ResourcesUnits.BYTES, - }; - - expect(getResourcesDifference(resourcesA, resourcesA)).toEqual(resultA); - expect(getResourcesDifference(resourcesA, resourcesB)).toEqual(resultB); - expect(getResourcesDifference(resourcesB, resourcesA)).toEqual(resultC); - expect(getResourcesDifference(resourcesB, resourcesC)).toBeNull(); - expect(getExpectedResourcesDifference(expectedResourcesA, expectedResourcesA)).toEqual({ - expected: { - cpu: resultA, - memory: resultA, - disk: resultA, - }, - }); - expect(getExpectedResourcesDifference(expectedResourcesA, expectedResourcesB)).toEqual({ - expected: { - cpu: resultB, - memory: resultB, - disk: resultB, - }, - }); - expect(getExpectedResourcesDifference(expectedResourcesB, expectedResourcesA)).toEqual({ - expected: { - cpu: resultC, - memory: resultC, - disk: resultC, - }, - }); - }); - it('calculates resources sum correctly', () => { - const resultA: ResourcesWithUnits = { - value: 20, - original: 20, - units: ResourcesUnits.BYTES, - }; - const resultB: ResourcesWithUnits = { - value: 30, - original: 30, - units: ResourcesUnits.BYTES, - }; - - expect(getResourcesSum(resourcesA, resourcesA)).toEqual(resultA); - expect(getResourcesSum(resourcesA, resourcesB)).toEqual(resultB); - expect(getResourcesSum(resourcesB, resourcesA)).toEqual(resultB); - expect(getResourcesSum(resourcesB, resourcesC)).toBeNull(); - }); - it('formats version correctly', () => { - expect(formatDBClusterVersion('percona/percona-xtradb-cluster:8.0.22-13.1')).toBe('8.0.22'); - expect(formatDBClusterVersion('percona/percona-xtradb-cluster:5.6.2')).toBe('5.6.2'); - expect(formatDBClusterVersion(undefined)).toBe(''); - }); - it('formats version correctly with build number', () => { - expect(formatDBClusterVersionWithBuild('percona/percona-xtradb-cluster:8.0.22-13.1')).toBe('8.0.22-13.1'); - expect(formatDBClusterVersionWithBuild('percona/percona-xtradb-cluster:5.6.2')).toBe('5.6.2'); - expect(formatDBClusterVersionWithBuild(undefined)).toBe(''); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBCluster.utils.tsx b/public/app/percona/dbaas/components/DBCluster/DBCluster.utils.tsx deleted file mode 100644 index c974b2a2dd8b1..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBCluster.utils.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* eslint-disable @typescript-eslint/consistent-type-assertions */ -import { SelectableValue } from '@grafana/data'; -import { Databases } from 'app/percona/shared/core'; - -import { SERVICE_MAP, THOUSAND } from './DBCluster.constants'; -import { DBClusterService } from './DBCluster.service'; -import { - DBCluster, - DBClusterExpectedResources, - DBClusterStatus, - ResourcesUnits, - ResourcesWithUnits, -} from './DBCluster.types'; - -export const isClusterChanging = ({ status }: DBCluster) => { - return status === DBClusterStatus.changing || status === DBClusterStatus.deleting; -}; - -export const newDBClusterService = (type: Databases): DBClusterService => { - const service = SERVICE_MAP[type] as DBClusterService; - - return service || SERVICE_MAP[Databases.mysql]; -}; - -export const isOptionEmpty = (option?: SelectableValue) => !option || Object.keys(option).length === 0 || !option.value; - -export const formatResources = (bytes: number, decimals: number): ResourcesWithUnits => { - const i = Math.floor(Math.log(bytes) / Math.log(THOUSAND)); - const units = Object.values(ResourcesUnits)[i]; - - return { value: parseFloat((bytes / Math.pow(THOUSAND, i)).toFixed(decimals)), units, original: bytes }; -}; - -export const getResourcesDifference = ( - { value: valueA, original: originalA, units: unitsA }: ResourcesWithUnits, - { value: valueB, original: originalB, units: unitsB }: ResourcesWithUnits -): ResourcesWithUnits | null => { - if (unitsA !== unitsB) { - return null; - } - - return { - original: originalA - originalB, - value: valueA - valueB, - units: unitsA, - }; -}; - -export const getResourcesSum = ( - { value: valueA, original: originalA, units: unitsA }: ResourcesWithUnits, - { value: valueB, original: originalB, units: unitsB }: ResourcesWithUnits -): ResourcesWithUnits | null => { - if (unitsA !== unitsB) { - return null; - } - - return { - original: originalA + originalB, - value: valueA + valueB, - units: unitsA, - }; -}; - -export const getExpectedResourcesDifference = ( - { expected: { cpu: cpuA, memory: memoryA, disk: diskA } }: DBClusterExpectedResources, - { expected: { cpu: cpuB, memory: memoryB, disk: diskB } }: DBClusterExpectedResources -): DBClusterExpectedResources => { - return { - expected: { - cpu: getResourcesDifference(cpuA, cpuB) as ResourcesWithUnits, - memory: getResourcesDifference(memoryA, memoryB) as ResourcesWithUnits, - disk: getResourcesDifference(diskA, diskB) as ResourcesWithUnits, - }, - }; -}; - -export const formatDBClusterVersion = (version?: string) => (version ? version.split(':')[1].split('-')[0] : ''); - -export const formatDBClusterVersionWithBuild = (version?: string) => (version ? version.split(':')[1] : ''); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.styles.ts deleted file mode 100644 index c8191103b7a73..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.styles.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { css } from '@emotion/css'; - -export const styles = { - actionsColumn: css` - display: flex; - justify-content: center; - `, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.test.tsx deleted file mode 100644 index e76cad4dce6d5..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.test.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; - -import { configureStore } from '../../../../../store/configureStore'; -import { StoreState } from '../../../../../types'; -import { Messages } from '../../../DBaaS.messages'; -import { dbClustersStub } from '../__mocks__/dbClustersStubs'; - -import { DBClusterActions } from './DBClusterActions'; - -jest.mock('app/core/app_events'); -jest.mock('../XtraDB.service'); - -describe('DBClusterActions::', () => { - it('renders correctly', async () => { - render( - - - - ); - - expect(screen.getByTestId('dropdown-menu-toggle')).toBeInTheDocument(); - }); - - it('doesnt disable button if cluster is ready', () => { - render( - - - - ); - - expect(screen.getByRole('button')).not.toBeDisabled(); - }); - - it('calls delete action correctly', async () => { - const setDeleteModalVisible = jest.fn(); - render( - - - - ); - - const btn = screen.getByRole('button'); - await waitFor(() => fireEvent.click(btn)); - - const action = screen.getByTestId('dropdown-menu-menu').querySelectorAll('span')[1]; - await waitFor(() => fireEvent.click(action)); - - expect(setDeleteModalVisible).toHaveBeenCalled(); - }); - - it('delete action is disabled if cluster is deleting', async () => { - const setDeleteModalVisible = jest.fn(); - render( - - - - ); - - const btn = screen.getByRole('button'); - await waitFor(() => fireEvent.click(btn)); - - const action = screen.getByTestId('dropdown-menu-menu').querySelectorAll('span')[1]; - await waitFor(() => fireEvent.click(action)); - - expect(setDeleteModalVisible).toHaveBeenCalled(); - }); - - it('correct actions are disabled if cluster is paused', async () => { - render( - - - - ); - - const btn = screen.getByRole('button'); - await waitFor(() => fireEvent.click(btn)); - - const disabledActions = screen.getAllByTestId('disabled-dropdown-button'); - expect(disabledActions).toHaveLength(4); - expect(disabledActions[0]).toHaveTextContent(Messages.dbcluster.table.actions.updateCluster); - expect(disabledActions[1]).toHaveTextContent(Messages.dbcluster.table.actions.editCluster); - expect(disabledActions[2]).toHaveTextContent(Messages.dbcluster.table.actions.restartCluster); - expect(disabledActions[3]).toHaveTextContent(Messages.dbcluster.table.actions.logs); - }); - - xit('calls restart action correctly', async () => { - const getDBClusters = jest.fn(); - render( - - ); - - const btn = screen.getByRole('button'); - await waitFor(() => fireEvent.click(btn)); - - const action = screen.getByTestId('dropdown-menu-menu').querySelectorAll('span')[3]; - await waitFor(() => fireEvent.click(action)); - - expect(getDBClusters).toHaveBeenCalled(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.tsx deleted file mode 100644 index 0bec29347340e..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import React, { FC, useCallback } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { MultipleActions } from 'app/percona/dbaas/components/MultipleActions/MultipleActions'; -import { logger } from 'app/percona/shared/helpers/logger'; -import { useDispatch } from 'app/types'; - -import { selectDBCluster } from '../../../../shared/core/reducers/dbaas/dbaas'; -import { DBCluster, DBClusterStatus } from '../DBCluster.types'; -import { isClusterChanging, newDBClusterService } from '../DBCluster.utils'; -import { DB_CLUSTER_EDIT_URL } from '../EditDBClusterPage/EditDBClusterPage.constants'; - -import { styles } from './DBClusterActions.styles'; -import { DBClusterActionsProps } from './DBClusterActions.types'; - -export const DBClusterActions: FC = ({ - dbCluster, - setDeleteModalVisible, - setLogsModalVisible, - setUpdateModalVisible, - getDBClusters, -}) => { - const history = useHistory(); - const dispatch = useDispatch(); - const getActions = useCallback( - (dbCluster: DBCluster) => [ - { - content: Messages.dbcluster.table.actions.updateCluster, - disabled: - !dbCluster.availableImage || - dbCluster.status === DBClusterStatus.upgrading || - dbCluster.status === DBClusterStatus.deleting || - dbCluster.status === DBClusterStatus.changing || - dbCluster.status === DBClusterStatus.suspended, - action: () => { - dispatch(selectDBCluster(dbCluster)); - setUpdateModalVisible(true); - }, - }, - { - content: Messages.dbcluster.table.actions.deleteCluster, - disabled: dbCluster.status === DBClusterStatus.deleting, - action: () => { - dispatch(selectDBCluster(dbCluster)); - setDeleteModalVisible(true); - }, - }, - { - content: Messages.dbcluster.table.actions.editCluster, - disabled: dbCluster.status !== DBClusterStatus.ready, - action: () => { - dispatch(selectDBCluster(dbCluster)); - history.push(DB_CLUSTER_EDIT_URL); - }, - }, - { - content: Messages.dbcluster.table.actions.restartCluster, - disabled: isClusterChanging(dbCluster) || dbCluster.status === DBClusterStatus.suspended, - action: async () => { - try { - const dbClusterService = newDBClusterService(dbCluster.databaseType); - - await dbClusterService.restartDBCluster(dbCluster); - getDBClusters(); - } catch (e) { - logger.error(e); - } - }, - }, - { - content: - dbCluster.status === DBClusterStatus.ready - ? Messages.dbcluster.table.actions.suspend - : Messages.dbcluster.table.actions.resume, - disabled: dbCluster.status !== DBClusterStatus.ready && dbCluster.status !== DBClusterStatus.suspended, - action: async () => { - try { - const dbClusterService = newDBClusterService(dbCluster.databaseType); - - if (dbCluster.status === DBClusterStatus.ready) { - await dbClusterService.suspendDBCluster(dbCluster); - } else { - await dbClusterService.resumeDBCluster(dbCluster); - } - - getDBClusters(); - } catch (e) { - logger.error(e); - } - }, - }, - { - content: Messages.dbcluster.table.actions.logs, - disabled: dbCluster.status === DBClusterStatus.suspended, - action: () => { - dispatch(selectDBCluster(dbCluster)); - setLogsModalVisible(true); - }, - }, - ], - // eslint-disable-next-line react-hooks/exhaustive-deps - [setUpdateModalVisible, setDeleteModalVisible, getDBClusters, setLogsModalVisible] - ); - - return ( -
- -
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.types.ts deleted file mode 100644 index 86391456fa225..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterActions/DBClusterActions.types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DBCluster, GetDBClustersAction } from '../DBCluster.types'; - -export interface DBClusterActionsProps { - dbCluster: DBCluster; - setDeleteModalVisible: (isVisible: boolean) => void; - setLogsModalVisible: (isVisible: boolean) => void; - setUpdateModalVisible: (isVisible: boolean) => void; - getDBClusters: GetDBClustersAction; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.constants.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.constants.ts deleted file mode 100644 index fdced3b16d539..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.constants.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const INITIAL_CONNECTION = { - host: '', - username: '', - port: 0, - password: '', -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.styles.ts deleted file mode 100644 index 827d5738ccc18..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.styles.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - connectionWrapper: css` - display: flex; - flex-direction: column; - margin: ${spacing.xs} ${spacing.sm}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.test.tsx deleted file mode 100644 index 58eb10ec8e529..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.test.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { render, screen, waitFor } from '@testing-library/react'; -import React from 'react'; - -import { dbClustersStub, mongoDBClusterConnectionStub } from '../__mocks__/dbClustersStubs'; - -import { DBClusterConnection } from './DBClusterConnection'; - -jest.mock('app/core/app_events'); -jest.mock('../XtraDB.service'); -jest.mock('../PSMDB.service'); - -jest.mock('app/percona/shared/helpers/logger', () => { - const originalModule = jest.requireActual('app/percona/shared/helpers/logger'); - return { - ...originalModule, - logger: { - error: jest.fn(), - }, - }; -}); - -describe('DBClusterConnection::', () => { - it('renders correctly connection items', async () => { - await waitFor(() => render()); - - expect(screen.getByTestId('cluster-connection-host')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-connection-port')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-connection-username')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-connection-password')).toBeInTheDocument(); - }); - it('renders correctly connection items with MongoDB cluster', async () => { - await waitFor(() => render()); - - expect(screen.getByTestId('cluster-connection-host')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-connection-host')).toHaveTextContent(mongoDBClusterConnectionStub.host); - expect(screen.getByTestId('cluster-connection-port')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-connection-username')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-connection-password')).toBeInTheDocument(); - }); - it('does not show loading when the DBcluster paused', async () => { - await waitFor(() => render()); - expect(screen.queryByTestId('Spinner')).not.toBeInTheDocument(); - }); - it('show loading when the DBcluster status = upgrading', async () => { - await waitFor(() => render()); - expect(screen.getByTestId('Spinner')).toBeInTheDocument(); - }); - it('show loading when the DBcluster status = changing', async () => { - await waitFor(() => render()); - expect(screen.getByTestId('Spinner')).toBeInTheDocument(); - }); - it('show loading when the DBcluster status = deleting', async () => { - await waitFor(() => render()); - expect(screen.getByTestId('Spinner')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.tsx deleted file mode 100644 index 3db0e3b5a0311..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* eslint-disable @typescript-eslint/consistent-type-assertions */ -import React, { FC, useEffect, useState } from 'react'; - -import { Spinner, useStyles } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { DBClusterConnection as ConnectionParams, DBClusterStatus } from '../DBCluster.types'; -import { newDBClusterService } from '../DBCluster.utils'; - -import { INITIAL_CONNECTION } from './DBClusterConnection.constants'; -import { getStyles } from './DBClusterConnection.styles'; -import { DBClusterConnectionProps } from './DBClusterConnection.types'; -import { DBClusterConnectionItem } from './DBClusterConnectionItem/DBClusterConnectionItem'; -import { DBClusterConnectionPassword } from './DBClusterConnectionPassword/DBClusterConnectionPassword'; - -export const DBClusterConnection: FC = ({ dbCluster }) => { - const styles = useStyles(getStyles); - const [loading, setLoading] = useState(true); - const [connection, setConnection] = useState(INITIAL_CONNECTION); - const { host, password, port, username } = connection; - const { status, databaseType } = dbCluster; - const isClusterReady = status && status === DBClusterStatus.ready; - - useEffect(() => { - const getClusterConnection = async () => { - try { - setLoading(true); - const dbClusterService = newDBClusterService(databaseType); - const connection = await dbClusterService.getDBClusterCredentials(dbCluster); - - if (connection) { - setConnection(connection.connection_credentials); - } - } catch (e) { - logger.error(e); - } finally { - setLoading(false); - } - }; - - if (isClusterReady) { - getClusterConnection(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [status]); - - return ( - <> -
- {!loading && isClusterReady && ( - <> - - - - - - )} - {loading && status !== DBClusterStatus.suspended && } -
- - ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.types.ts deleted file mode 100644 index 006329e73dce2..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnection.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { DBCluster } from '../DBCluster.types'; - -export interface DBClusterConnectionProps { - dbCluster: DBCluster; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.styles.ts deleted file mode 100644 index 2b671edea5ed4..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.styles.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing, typography }: GrafanaTheme) => ({ - connectionItemWrapper: css` - display: flex; - margin-bottom: ${spacing.xxs}; - `, - connectionItemLabel: css` - font-weight: ${typography.weight.bold}; - `, - connectionItemValue: css` - margin-left: ${spacing.xs}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.test.tsx deleted file mode 100644 index 86435ee210126..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.test.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { render } from '@testing-library/react'; -import React from 'react'; - -import { DBClusterConnectionItem } from './DBClusterConnectionItem'; - -describe('DBClusterConnectionItem::', () => { - it('renders correctly', () => { - const { container } = render(); - - expect(container.querySelectorAll('span')).toHaveLength(2); - expect(container.querySelector('div')?.children).toHaveLength(2); - }); - it('renders correctly label and value', () => { - const { container } = render(); - - expect(container).toHaveTextContent('test label'); - expect(container).toHaveTextContent('test value'); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.tsx deleted file mode 100644 index 94a8b57c71e9b..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React, { FC } from 'react'; - -import { useStyles } from '@grafana/ui'; - -import { getStyles } from './DBClusterConnectionItem.styles'; -import { DBClusterConnectionItemProps } from './DBClusterConnectionItem.types'; - -export const DBClusterConnectionItem: FC = ({ label, value, dataTestId }) => { - const styles = useStyles(getStyles); - - return ( -
- {label}: - {value} -
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.types.ts deleted file mode 100644 index 33270082590da..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface DBClusterConnectionItemProps { - label: string; - value: string | number; - dataTestId?: string; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.constants.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.constants.ts deleted file mode 100644 index 1c0f7e1d98178..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const HIDDEN_PASSWORD_LENGTH = 15; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.styles.ts deleted file mode 100644 index 3831a729bffb1..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.styles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - connectionPasswordWrapper: css` - display: flex; - `, - showPasswordButton: css` - margin: 0 0 0 ${spacing.md}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.test.tsx deleted file mode 100644 index 864c36d99a8cd..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.test.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; - -import { DBClusterConnectionPassword } from './DBClusterConnectionPassword'; -import { HIDDEN_PASSWORD_LENGTH } from './DBClusterConnectionPassword.constants'; - -describe('DBClusterConnectionPassword::', () => { - it('renders correctly', () => { - const { container } = render(); - - expect(container.querySelectorAll('div')[0].children).toHaveLength(2); - expect(container).toHaveTextContent('Test'); - expect(container).toHaveTextContent('*'.repeat(HIDDEN_PASSWORD_LENGTH)); - }); - it('should show/hide password', () => { - const { container } = render(); - const button = screen.getByTestId('show-password-button'); - - expect(container).toHaveTextContent('*'.repeat(HIDDEN_PASSWORD_LENGTH)); - - fireEvent.click(button); - - expect(container).toHaveTextContent('1234'); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.tsx deleted file mode 100644 index d426242fce0a4..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React, { FC, useMemo, useState } from 'react'; - -import { IconButton, useStyles } from '@grafana/ui'; - -import { DBClusterConnectionItem } from '../DBClusterConnectionItem/DBClusterConnectionItem'; - -import { HIDDEN_PASSWORD_LENGTH } from './DBClusterConnectionPassword.constants'; -import { getStyles } from './DBClusterConnectionPassword.styles'; -import { DBClusterConnectionPasswordProps } from './DBClusterConnectionPassword.types'; - -export const DBClusterConnectionPassword: FC = ({ label, password, dataTestId }) => { - const styles = useStyles(getStyles); - const [showPassword, setShowPassword] = useState(false); - const getHiddenPassword = useMemo(() => '*'.repeat(HIDDEN_PASSWORD_LENGTH), []); - - return ( -
- - setShowPassword(!showPassword)} - className={styles.showPasswordButton} - /> -
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.types.ts deleted file mode 100644 index cd2512372bc41..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterConnection/DBClusterConnectionPassword/DBClusterConnectionPassword.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface DBClusterConnectionPasswordProps { - label: string; - password: string; - dataTestId?: string; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.test.tsx deleted file mode 100644 index 993542eae3bdc..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.test.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { render } from '@testing-library/react'; -import React from 'react'; - -import { ContainerLogs } from './ContainerLogs'; - -describe('ContainerLogs::', () => { - it('renders container name and logs', () => { - const { container } = render( - - ); - - expect(container.querySelector('div > div > div > div ')).toHaveTextContent('Test'); - expect(container.querySelector('pre')).toHaveTextContent('Test logs'); - }); - - it("does't render logs when collapsed", () => { - const { container } = render( - - ); - - expect(container.querySelector('pre')).not.toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.tsx deleted file mode 100644 index bce9fa8f8ee34..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React, { FC, useState } from 'react'; - -import { Collapse } from '@grafana/ui'; - -import { ContainerLogsProps } from './ContainerLogs.types'; - -export const ContainerLogs: FC = ({ containerLogs }) => { - const { name, isOpen: isContainerOpen, logs } = containerLogs; - const [isOpen, setIsOpen] = useState(isContainerOpen); - - return ( -
- setIsOpen(!isOpen)}> -
{logs}
-
-
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.types.ts deleted file mode 100644 index c8df2992e45bc..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/ContainerLogs/ContainerLogs.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { DBClusterContainerLogs } from '../../DBCluster.types'; - -export interface ContainerLogsProps { - containerLogs: DBClusterContainerLogs; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.messages.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.messages.ts deleted file mode 100644 index 876793705e82c..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.messages.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const Messages = { - title: 'View Cluster Logs', - pods: 'Pods', - expand: 'Expand all', - collapse: 'Collapse all', - noLogs: 'There are no logs yet', -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.styles.ts deleted file mode 100644 index df4290924b7cb..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.styles.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing, typography }: GrafanaTheme) => ({ - modalWrapper: css` - max-height: 75vh; - overflow: auto; - padding: ${spacing.xs}; - `, - spinnerWrapper: css` - align-items: center; - display: flex; - justify-content: center; - `, - header: css` - align-items: center; - display: flex; - flex-direction: row; - justify-content: space-between; - margin-bottom: ${spacing.md}; - `, - podsLabel: css` - flex: 1; - font-size: ${typography.size.lg}; - `, - expandButton: css` - margin-right: ${spacing.md}; - `, - modal: css` - div[data-testid='modal-body'] { - max-width: unset; - width: 80%; - } - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.test.tsx deleted file mode 100644 index a98452133ca8d..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.test.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { render, screen, act, fireEvent, within } from '@testing-library/react'; -import React from 'react'; - -import { DBClusterService } from '../__mocks__/DBCluster.service'; -import { dbClustersStub } from '../__mocks__/dbClustersStubs'; - -import { DBClusterLogsModal } from './DBClusterLogsModal'; - -jest.mock('../DBCluster.service'); - -describe('DBClusterLogsModal::', () => { - it('should render logs', async () => { - act(() => { - render(); - }); - const logs = await screen.findAllByTestId('dbcluster-pod-logs'); - expect(logs.length).toBeGreaterThan(0); - }); - - it('should expand logs', async () => { - act(() => { - render(); - }); - - let preTags = screen.queryAllByTestId('dbcluster-pod-events'); - let logs = screen.queryAllByTestId('dbcluster-logs'); - - expect(preTags).toHaveLength(0); - expect(logs).toHaveLength(0); - - const actions = await screen.findAllByTestId('dbcluster-logs-actions'); - const expandButton = within(actions[0]).getAllByRole('button')[0]; - - act(() => { - fireEvent.click(expandButton); - }); - - logs = await screen.findAllByTestId('dbcluster-logs'); - expect(logs.length).toBeGreaterThan(0); - }); - - it('should refresh logs', async () => { - const getLogs = jest.fn(); - - act(() => { - render(); - }); - - DBClusterService.getLogs = getLogs(); - - const actions = await screen.findAllByTestId('dbcluster-logs-actions'); - const refreshButton = within(actions[0]).getAllByRole('button')[1]; - - act(() => { - fireEvent.click(refreshButton); - }); - - await screen.findAllByTestId('dbcluster-logs-actions'); - - expect(getLogs).toHaveBeenCalled(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.tsx deleted file mode 100644 index 829993953c147..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import React, { FC, useEffect, useState } from 'react'; - -import { Button, Icon, Spinner, useStyles } from '@grafana/ui'; -import { Modal } from 'app/percona/shared/components/Elements/Modal'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { DBClusterService } from '../DBCluster.service'; -import { DBClusterLogs } from '../DBCluster.types'; - -import { Messages } from './DBClusterLogsModal.messages'; -import { getStyles } from './DBClusterLogsModal.styles'; -import { DBClusterLogsModalProps } from './DBClusterLogsModal.types'; -import { toggleLogs, transformLogs } from './DBClusterLogsModal.utils'; -import { PodLogs } from './PodLogs/PodLogs'; - -export const DBClusterLogsModal: FC = ({ dbCluster, isVisible, setVisible }) => { - const styles = useStyles(getStyles); - const [loading, setLoading] = useState(false); - const [logs, setLogs] = useState({ pods: [] }); - const [expanded, setExpanded] = useState(false); - const getClusterLogs = async () => { - if (!dbCluster) { - return; - } - - try { - setLoading(true); - setLogs(transformLogs(await DBClusterService.getLogs(dbCluster), logs)); - } catch (e) { - logger.error(e); - } finally { - setLoading(false); - } - }; - - const toggleCollapse = () => { - setLogs({ pods: toggleLogs(logs.pods, !expanded) }); - setExpanded((currentValue) => !currentValue); - }; - const refresh = () => { - getClusterLogs(); - setExpanded(false); - }; - - useEffect(() => { - getClusterLogs(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dbCluster]); - - useEffect(() => { - setExpanded(false); - }, [isVisible]); - - return ( -
- setVisible(false)}> -
- {loading ? ( -
- -
- ) : ( - <> - {!logs || logs.pods.length <= 0 ? ( - {Messages.noLogs} - ) : ( - <> -
- {Messages.pods} - - -
- {logs.pods.map((pod) => ( - - ))} - - )} - - )} -
-
-
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.types.ts deleted file mode 100644 index 521347039e584..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { DBCluster, DBClusterPodLogs } from '../DBCluster.types'; - -export interface DBClusterLogsModalProps { - dbCluster: DBCluster | null; - isVisible: boolean; - setVisible: (value: boolean) => void; -} - -export interface DBClusterLogsMap { - [key: string]: DBClusterPodLogs; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.test.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.test.ts deleted file mode 100644 index 013ce7e39bee3..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { DBClusterLogs } from '../DBCluster.types'; -import { dbClusterLogsAPI } from '../__mocks__/dbClustersStubs'; - -import { logsToString, toggleLogs, transformLogs } from './DBClusterLogsModal.utils'; - -describe('DBClusterLogsModal.utils::', () => { - describe('transformLogs::', () => { - it('transforms logs to expected format', () => { - const expectedLogs: DBClusterLogs = { - pods: [ - { - name: 'testpod1', - isOpen: false, - events: 'test pod1\nevents', - containers: [ - { - name: 'testpod1container1', - isOpen: false, - logs: 'test pod1\nlogs\n1', - }, - { - name: 'testpod1container2', - isOpen: false, - logs: 'test pod1\nlogs\n2', - }, - ], - }, - { - name: 'testpod2', - isOpen: false, - events: 'test pod2\nevents', - containers: [ - { - name: 'testpod2container1', - isOpen: false, - logs: 'test pod2\nlogs\n1', - }, - { - name: 'testpod2container2', - isOpen: false, - logs: '', - }, - ], - }, - ], - }; - - expect(transformLogs(dbClusterLogsAPI)).toEqual(expectedLogs); - }); - }); - describe('logsToString::', () => { - it('parses array of logs to string', () => { - const logs = ['list', 'was', 'updated']; - - expect(logsToString(logs)).toEqual('list\nwas\nupdated'); - }); - it('handles empty logs', () => { - expect(logsToString([])).toEqual(''); - }); - it('handles undefined logs', () => { - expect(logsToString(undefined)).toEqual(''); - }); - }); - describe('toggleLogs::', () => { - const logs = { - pods: [ - { - name: 'testpod1', - isOpen: true, - events: 'test pod1\nevents', - containers: [ - { - name: 'testpod1container1', - isOpen: false, - logs: 'test pod1\nlogs\n1', - }, - { - name: 'testpod1container2', - isOpen: false, - logs: 'test pod1\nlogs\n2', - }, - ], - }, - ], - }; - it('expands all the logs', () => { - const expectedLogs = [ - { - name: 'testpod1', - isOpen: true, - events: 'test pod1\nevents', - containers: [ - { - name: 'testpod1container1', - isOpen: true, - logs: 'test pod1\nlogs\n1', - }, - { - name: 'testpod1container2', - isOpen: true, - logs: 'test pod1\nlogs\n2', - }, - ], - }, - ]; - - expect(toggleLogs(logs.pods, true)).toEqual(expectedLogs); - }); - it('collapses all the logs', () => { - const expectedLogs = [ - { - name: 'testpod1', - isOpen: false, - events: 'test pod1\nevents', - containers: [ - { - name: 'testpod1container1', - isOpen: false, - logs: 'test pod1\nlogs\n1', - }, - { - name: 'testpod1container2', - isOpen: false, - logs: 'test pod1\nlogs\n2', - }, - ], - }, - ]; - - expect(toggleLogs(logs.pods, false)).toEqual(expectedLogs); - }); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.ts deleted file mode 100644 index 2bdfa0d60a6fd..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { DBClusterLogs, DBClusterLogsAPI, DBClusterPodLogs, DBClusterContainerLogs } from '../DBCluster.types'; - -import { DBClusterLogsMap } from './DBClusterLogsModal.types'; - -export const transformLogs = ({ logs }: DBClusterLogsAPI, currentLogs?: DBClusterLogs): DBClusterLogs => { - const logsMap: DBClusterLogsMap = logs.reduce((acc, { pod, container, logs }) => { - if (!acc[pod]) { - acc[pod] = { name: pod, isOpen: false, events: '', containers: [] }; - } - - // if pod has container, logs are for that container - // otherwise they are pod events - if (container) { - acc[pod].containers = [ - ...acc[pod].containers, - { - name: container, - isOpen: false, - logs: logsToString(logs), - }, - ]; - } else { - acc[pod].events = logsToString(logs); - } - - return acc; - }, {} as DBClusterLogsMap); - - return { pods: Object.values(logsMap) }; -}; - -export const logsToString = (logs?: string[]) => (logs ? logs.join('\n') : ''); - -export const toggleLogs = (pods: DBClusterPodLogs[], expand: boolean) => { - return pods.reduce((accPods, pod) => { - const containers = pod.containers.reduce( - (accContainers, container) => [...accContainers, { ...container, isOpen: expand }], - [] as DBClusterContainerLogs[] - ); - - return [...accPods, { ...pod, isOpen: expand, containers }]; - }, [] as DBClusterPodLogs[]); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.messages.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.messages.ts deleted file mode 100644 index 49318029ecf42..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.messages.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const Messages = { - events: 'Events', - containers: 'Containers', -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.styles.ts deleted file mode 100644 index 99ce47e454395..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.styles.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing, typography }: GrafanaTheme) => ({ - label: css` - font-size: ${typography.size.lg}; - margin-bottom: ${spacing.md}; - `, - labelSpacing: css` - margin-top: ${spacing.sm}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.test.tsx deleted file mode 100644 index a7b10ad42fe1a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.test.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { PodLogs } from './PodLogs'; - -describe('PodLogs::', () => { - it('renders pod name, events and containers', () => { - const { container } = render( - - ); - - expect(container).toHaveTextContent('Pod name'); - expect(screen.getByTestId('dbcluster-pod-events')).toHaveTextContent('Test events'); - expect(screen.getByTestId('dbcluster-containers').children).toHaveLength(2); - }); - - it("doesn't render logs when collapsed", () => { - render( - - ); - - expect(screen.queryByTestId('dbcluster-pod-events')).not.toBeInTheDocument(); - expect(screen.queryByTestId('dbcluster-containers')).not.toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.tsx deleted file mode 100644 index 21cfdb6ea1e81..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React, { FC, useState } from 'react'; - -import { Collapse, useStyles } from '@grafana/ui'; - -import { ContainerLogs } from '../ContainerLogs/ContainerLogs'; - -import { Messages } from './PodLogs.messages'; -import { getStyles } from './PodLogs.styles'; -import { PodLogsProps } from './PodLogs.types'; - -export const PodLogs: FC = ({ podLogs }) => { - const styles = useStyles(getStyles); - const { name, isOpen: isPodOpen, containers, events } = podLogs; - const [isOpen, setIsOpen] = useState(isPodOpen); - - return ( -
- setIsOpen(!isOpen)}> - {Messages.events} -
-          {events}
-        
- {Messages.containers} -
- {containers.map((container) => ( - - ))} -
-
-
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.types.ts deleted file mode 100644 index c7850a4f8a5f8..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/PodLogs/PodLogs.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { DBClusterPodLogs } from '../../DBCluster.types'; - -export interface PodLogsProps { - podLogs: DBClusterPodLogs; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.constants.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.constants.ts deleted file mode 100644 index 1b44ab567dbbc..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.constants.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint implicit-arrow-linebreak: 0 */ -import { Databases } from 'app/percona/shared/core'; - -import { DashboardURLMap } from './DBClusterName.types'; - -export const DASHBOARD_URL_MAP: DashboardURLMap = { - [Databases.mysql]: (clusterName: string) => - `/graph/d/pxc-cluster-summary/pxc-galera-cluster-summary?var-cluster=${clusterName}-pxc`, - [Databases.mongodb]: (clusterName: string) => - `/graph/d/mongodb-cluster-summary/mongodb-cluster-summary?var-cluster=${clusterName}`, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.styles.ts deleted file mode 100644 index 213db0c701bcd..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.styles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - clusterNameWrapper: css` - display: flex; - `, - dashboardIcon: css` - margin-left: ${spacing.sm}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.test.tsx deleted file mode 100644 index a30b528e11a91..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.test.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { Icon } from '@grafana/ui'; - -import { dbClustersStub } from '../__mocks__/dbClustersStubs'; - -import { DBClusterName } from './DBClusterName'; - -jest.mock('@grafana/ui', () => ({ - ...jest.requireActual('@grafana/ui'), - Icon: jest.fn(() =>
), -})); - -describe('DBClusterName::', () => { - it('renders correctly with name and icon', () => { - const cluster = dbClustersStub[0]; - const { container } = render(); - - expect(container).toHaveTextContent(cluster.clusterName); - expect(Icon).toHaveBeenCalled(); - }); - it('renders correctly MySQL cluster URL', () => { - const cluster = dbClustersStub[0]; - render(); - - expect(screen.getByRole('link').getAttribute('href')).toContain('pxc'); - expect(screen.getByRole('link').getAttribute('href')).toContain(cluster.clusterName); - }); - it('renders correctly MongoDB cluster URL', () => { - const cluster = dbClustersStub[2]; - render(); - - expect(screen.getByRole('link').getAttribute('href')).toContain('mongodb'); - expect(screen.getByRole('link').getAttribute('href')).toContain(cluster.clusterName); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.tsx deleted file mode 100644 index e6f8797696c59..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React, { FC } from 'react'; - -import { Icon, useStyles } from '@grafana/ui'; - -import { DASHBOARD_URL_MAP } from './DBClusterName.constants'; -import { getStyles } from './DBClusterName.styles'; -import { DBClusterNameProps } from './DBClusterName.types'; - -export const DBClusterName: FC = ({ dbCluster: { clusterName, databaseType } }) => { - const styles = useStyles(getStyles); - const getDashboardUrl = DASHBOARD_URL_MAP[databaseType]; - - return ( -
- {clusterName} - - - -
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.types.ts deleted file mode 100644 index ce2c666d27803..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterName/DBClusterName.types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DBCluster } from '../DBCluster.types'; - -export interface DBClusterNameProps { - dbCluster: DBCluster; -} - -export interface DashboardURLMap { - [key: string]: (clusterName: string) => string; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.styles.ts deleted file mode 100644 index 6169895bb9f9e..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.styles.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - wrapper: css` - display: flex; - flex-direction: column; - margin: ${spacing.xs} ${spacing.sm}; - `, - parametersFailed: css` - display: flex; - justify-content: center; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.test.tsx deleted file mode 100644 index d3e42cfdfb82a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.test.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { dbClustersStub } from '../__mocks__/dbClustersStubs'; - -import { DBClusterParameters } from './DBClusterParameters'; - -jest.mock('app/core/app_events'); -jest.mock('../XtraDB.service'); -jest.mock('../PSMDB.service'); - -describe('DBClusterParameters::', () => { - it('renders parameters items correctly', async () => { - render(); - - expect(screen.getByTestId('cluster-parameters-cluster-name')).toBeInTheDocument(); - - const memory = screen.getByTestId('cluster-parameters-memory'); - const cpu = screen.getByTestId('cluster-parameters-cpu'); - const disk = screen.getByTestId('cluster-parameters-disk'); - const expose = screen.getByTestId('cluster-parameters-expose'); - - expect(memory).toBeInTheDocument(); - expect(memory).toHaveTextContent('Memory:1024 GB'); - expect(cpu).toBeInTheDocument(); - expect(cpu).toHaveTextContent('CPU:1'); - expect(disk).toBeInTheDocument(); - expect(disk).toHaveTextContent('Disk:25 GB'); - expect(expose).toBeInTheDocument(); - expect(expose).toHaveTextContent('External Access:Enabled'); - }); - - it('renders parameters items correctly with MongoDB cluster', async () => { - render(); - - expect(screen.getByTestId('cluster-parameters-cluster-name')).toBeInTheDocument(); - - const memory = screen.getByTestId('cluster-parameters-memory'); - const cpu = screen.getByTestId('cluster-parameters-cpu'); - const disk = screen.getByTestId('cluster-parameters-disk'); - const expose = screen.getByTestId('cluster-parameters-expose'); - - expect(memory).toBeInTheDocument(); - expect(memory).toHaveTextContent('Memory:0 GB'); - expect(cpu).toBeInTheDocument(); - expect(cpu).toHaveTextContent('CPU:0'); - expect(disk).toBeInTheDocument(); - expect(disk).toHaveTextContent('Disk:25 GB'); - expect(expose).toBeInTheDocument(); - expect(expose).toHaveTextContent('External Access:Disabled'); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.tsx deleted file mode 100644 index 09df941f9b2a5..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React, { FC } from 'react'; - -import { useStyles } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; - -import { DBClusterStatus } from '../DBCluster.types'; -import { DBClusterConnectionItem } from '../DBClusterConnection/DBClusterConnectionItem/DBClusterConnectionItem'; - -import { getStyles } from './DBClusterParameters.styles'; -import { DBClusterParametersProps } from './DBClusterParameters.types'; - -export const DBClusterParameters: FC = ({ dbCluster }) => { - const styles = useStyles(getStyles); - const { status } = dbCluster; - const { - label: exposeLabel, - enabled: exposeEnabled, - disabled: exposeDisabled, - } = Messages.dbcluster.table.parameters.expose; - - return ( - <> - {status && status === DBClusterStatus.ready && ( -
- - - - - -
- )} - - ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.types.ts deleted file mode 100644 index 9ba7c96716f4b..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterParameters/DBClusterParameters.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { DBCluster } from '../DBCluster.types'; - -export interface DBClusterParametersProps { - dbCluster: DBCluster; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.constants.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.constants.ts deleted file mode 100644 index 844780c080403..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.constants.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { DBClusterStatus } from '../DBCluster.types'; - -export const STATUS_DATA_QA = { - [DBClusterStatus.changing]: 'pending', - [DBClusterStatus.deleting]: 'deleting', - [DBClusterStatus.failed]: 'failed', - [DBClusterStatus.invalid]: 'invalid', - [DBClusterStatus.ready]: 'active', - [DBClusterStatus.suspended]: 'suspended', - [DBClusterStatus.upgrading]: 'updating', - [DBClusterStatus.unknown]: 'unknown', -}; - -export const COMPLETE_PROGRESS_DELAY = 4000; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.styles.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.styles.ts deleted file mode 100644 index 934b7738fd3ba..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.styles.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme2 } from '@grafana/data'; - -export const getStyles = ({ v1, typography, colors }: GrafanaTheme2) => ({ - clusterStatusWrapper: css` - align-items: flex-end; - display: flex; - flex-direction: column; - justify-content: center; - margin: ${v1.spacing.sm}; - min-width: 125px; - padding: ${v1.spacing.xs} 0; - position: relative; - `, - clusterPillWrapper: css` - align-items: center; - min-width: 0; - `, - status: css` - background-color: ${v1.palette.gray1}; - border-radius: 20px; - color: ${v1.palette.gray85}; - cursor: default; - font-size: ${typography.size.sm}; - padding: 3px 15px; - text-transform: uppercase; - `, - statusIcon: css` - color: ${v1.palette.gray1}; - cursor: help; - margin-left: ${v1.spacing.xs}; - margin-bottom: 0px; - `, - statusActive: css` - background-color: ${colors.primary.main}; - label: active; - `, - statusFailed: css` - background-color: ${v1.palette.brandDanger}; - label: failed; - `, - logsWrapper: css` - bottom: ${v1.spacing.md}; - display: flex; - position: absolute; - `, - logsLabel: css` - font-size: ${typography.size.sm}; - color: ${v1.colors.linkExternal}; - &:hover { - color: ${v1.colors.textBlue}; - } - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.test.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.test.tsx deleted file mode 100644 index d0e441216216d..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.test.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; - -import { configureStore } from '../../../../../store/configureStore'; -import { StoreState } from '../../../../../types'; -import { DBCluster, DBClusterStatus as Status } from '../DBCluster.types'; -import { dbClustersStub } from '../__mocks__/dbClustersStubs'; - -import { DBClusterStatus } from './DBClusterStatus'; - -describe('DBClusterStatus::', () => { - it('renders correctly when active', () => { - const dbCluster: DBCluster = { - ...dbClustersStub[0], - status: Status.ready, - message: 'Should not render error', - finishedSteps: 10, - totalSteps: 10, - }; - render( - - - - ); - - expect(screen.getByTestId('cluster-status-active')).toBeInTheDocument(); - expect(screen.queryByTestId('cluster-status-error-message')).not.toBeInTheDocument(); - }); - - it('renders progress bar and error when changing', () => { - const dbCluster: DBCluster = { - ...dbClustersStub[0], - status: Status.changing, - message: 'Should render error', - finishedSteps: 5, - totalSteps: 10, - }; - render( - - - - ); - - expect(screen.queryByTestId('cluster-status-active')).not.toBeInTheDocument(); - expect(screen.getByTestId('cluster-progress-bar')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-status-error-message')).toBeInTheDocument(); - }); - - it('renders error and progress bar when failed', () => { - const dbCluster: DBCluster = { - ...dbClustersStub[0], - status: Status.failed, - message: 'Should render error', - finishedSteps: 10, - totalSteps: 10, - }; - render( - - - - ); - - expect(screen.queryByTestId('cluster-status-active')).not.toBeInTheDocument(); - expect(screen.getByTestId('cluster-progress-bar')).toBeInTheDocument(); - expect(screen.getByTestId('cluster-status-error-message')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.tsx b/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.tsx deleted file mode 100644 index d705697179b17..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/* eslint-disable react/display-name */ -import { cx } from '@emotion/css'; -import React, { FC, useEffect, useMemo, useRef, useState } from 'react'; - -import { Icon, useStyles2, Tooltip, Badge, BadgeColor } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { ProgressBar } from 'app/percona/dbaas/components/ProgressBar/ProgressBar'; -import { ProgressBarStatus } from 'app/percona/dbaas/components/ProgressBar/ProgressBar.types'; -import { useDispatch } from 'app/types'; - -import { selectDBCluster } from '../../../../shared/core/reducers/dbaas/dbaas'; -import { getStyles as getStatusStyles } from '../../Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.styles'; -import { DBClusterStatus as Status, DBClusterStatusColors } from '../DBCluster.types'; - -import { COMPLETE_PROGRESS_DELAY, STATUS_DATA_QA } from './DBClusterStatus.constants'; -import { getStyles } from './DBClusterStatus.styles'; -import { DBClusterStatusProps } from './DBClusterStatus.types'; -import { getProgressMessage, getShowProgressBarValue } from './DBClusterStatus.utils'; - -export const DBClusterStatus: FC = ({ dbCluster, setLogsModalVisible }) => { - const dispatch = useDispatch(); - const { message, finishedSteps, totalSteps } = dbCluster; - const status = dbCluster.status || Status.unknown; - const styles = useStyles2(getStyles); - const statusStyles = useStyles2(getStatusStyles); - const prevStatus = useRef(); - const statusError = status === Status.failed || status === Status.invalid; - const showMessage = - message && - (statusError || - status === Status.changing || - status === Status.deleting || - status === Status.unknown || - status === Status.upgrading); - const [showProgressBar, setShowProgressBar] = useState(getShowProgressBarValue(status, prevStatus.current)); - - const statusColor: BadgeColor = DBClusterStatusColors[status]; - const ErrorMessage = useMemo( - () => () =>
{message ? message.replace(/;/g, '\n') : Messages.dbcluster.table.status.errorMessage}
, - [message] - ); - const openLogs = () => { - dispatch(selectDBCluster(null)); - setLogsModalVisible(true); - }; - - useEffect(() => { - // handles the last step of the progress bar - // creates a delay between the last step and showing active status - // without this the bar would jump from the second last step to active status - if (prevStatus.current === Status.changing && status === Status.ready) { - setTimeout(() => setShowProgressBar(false), COMPLETE_PROGRESS_DELAY); - } else { - setShowProgressBar(getShowProgressBarValue(status, prevStatus.current)); - } - }, [status]); - - useEffect(() => { - prevStatus.current = status; - }); - - return ( -
- {showProgressBar ? ( - - ) : ( - - )} - {showMessage && showProgressBar && ( - - )} -
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.types.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.types.ts deleted file mode 100644 index 604c482d4694a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { DBCluster } from '../DBCluster.types'; - -export interface DBClusterStatusProps { - dbCluster: DBCluster; - setLogsModalVisible: (isVisible: boolean) => void; -} diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.test.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.test.ts deleted file mode 100644 index aa2785a20c96b..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; - -import { DBClusterStatus } from '../DBCluster.types'; - -import { getProgressMessage, getShowProgressBarValue } from './DBClusterStatus.utils'; - -const { progressError, processing, complete } = Messages.dbcluster.table.status; - -describe('DBClusterStatus.utils::', () => { - it('shows progress bar when status is changing', () => { - expect(getShowProgressBarValue(DBClusterStatus.changing, undefined)).toBeTruthy(); - }); - - it('shows progress bar when status just changed to ready', () => { - expect(getShowProgressBarValue(DBClusterStatus.ready, DBClusterStatus.changing)).toBeTruthy(); - }); - - it("doesn't show progress bar when status is suspended", () => { - expect(getShowProgressBarValue(DBClusterStatus.suspended, DBClusterStatus.changing)).toBeFalsy(); - }); - - it("doesn't show progress bar when status is unknown", () => { - expect(getShowProgressBarValue(DBClusterStatus.unknown, undefined)).toBeFalsy(); - }); - - it('returns correct message when status is changing', () => { - expect(getProgressMessage(DBClusterStatus.changing, undefined)).toEqual(processing); - }); - - it('returns correct message when status just changed to ready', () => { - expect(getProgressMessage(DBClusterStatus.ready, DBClusterStatus.changing)).toEqual(complete); - }); - - it('returns correct message when status is failed', () => { - expect(getProgressMessage(DBClusterStatus.failed, DBClusterStatus.ready)).toEqual(progressError); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.ts b/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.ts deleted file mode 100644 index 1558e8e59b2a5..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DBClusterStatus/DBClusterStatus.utils.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; - -import { DBClusterStatus } from '../DBCluster.types'; - -const { progressError, processing, complete } = Messages.dbcluster.table.status; - -export const getShowProgressBarValue = (status: DBClusterStatus, previousStatus: DBClusterStatus | undefined) => { - // if the cluster just changed to ready we want to still show the progress bar - if (previousStatus === DBClusterStatus.changing && status === DBClusterStatus.ready) { - return true; - } - - // if the cluster is in any of this status show the progress bar - if (status === DBClusterStatus.changing || status === DBClusterStatus.invalid || status === DBClusterStatus.failed) { - return true; - } - - // if in any of other status (e.g. deleting, suspended, ...) no need to show the progress bar - return false; -}; - -export const getProgressMessage = (status: DBClusterStatus, previousStatus: DBClusterStatus | undefined) => { - if (status === DBClusterStatus.invalid || status === DBClusterStatus.failed) { - return progressError; - } - - if (previousStatus === DBClusterStatus.changing && status === DBClusterStatus.ready) { - return complete; - } - - return processing; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.styles.ts b/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.styles.ts deleted file mode 100644 index a74667847c3d8..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.styles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = (theme: GrafanaTheme) => ({ - deleteModalContent: css` - margin-bottom: ${theme.spacing.xl}; - `, - namesHighlight: css` - color: ${theme.palette.warn}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.tsx b/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.tsx deleted file mode 100644 index f78a12800a46d..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React, { FC, useCallback } from 'react'; - -import { Button, HorizontalGroup, useStyles } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { Modal } from 'app/percona/shared/components/Elements/Modal'; -import { DATABASE_LABELS } from 'app/percona/shared/core'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { newDBClusterService } from '../DBCluster.utils'; - -import { getStyles } from './DeleteDBClusterModal.styles'; -import { DeleteDBClusterModalProps } from './DeleteDBClusterModal.types'; - -export const DeleteDBClusterModal: FC = ({ - isVisible, - setVisible, - setLoading, - onClusterDeleted, - selectedCluster, -}) => { - const styles = useStyles(getStyles); - - const deleteDBCluster = useCallback(async () => { - if (!selectedCluster) { - setVisible(false); - - return; - } - - try { - setLoading(true); - setVisible(false); - const dbClusterService = newDBClusterService(selectedCluster?.databaseType); - - await dbClusterService.deleteDBClusters(selectedCluster); - onClusterDeleted(); - } catch (e) { - setLoading(false); - logger.error(e); - } - }, [selectedCluster, onClusterDeleted, setVisible, setLoading]); - - const ConfirmationMessage = () => - selectedCluster ? ( -

- Are you sure that you want to delete - {` ${DATABASE_LABELS[selectedCluster.databaseType]} `} - cluster - {` ${selectedCluster.clusterName} `} - from Kubernetes cluster - {` ${selectedCluster.kubernetesClusterName} `}? -

- ) : null; - - return ( - setVisible(false)}> - - - - - - - ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.types.ts b/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.types.ts deleted file mode 100644 index 224d5ad904040..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/DeleteDBClusterModal/DeleteDBClusterModal.types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DBCluster } from '../DBCluster.types'; - -export interface DeleteDBClusterModalProps { - selectedCluster: DBCluster | null; - isVisible: boolean; - setVisible: (value: boolean) => void; - setLoading: (loading: boolean) => void; - onClusterDeleted: () => void; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.service.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.service.ts deleted file mode 100644 index b004e61a873e2..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { SelectableValue } from '@grafana/data'; - -import { KubernetesService } from '../../../../Kubernetes/Kubernetes.service'; - -export const ConfigurationService = { - async loadStorageClassOptions(k8sClusterName: string): Promise>> { - const storageClassesResponse = await KubernetesService.getStorageClasses(k8sClusterName); - const storageClasses = storageClassesResponse?.storage_classes || []; - return storageClasses.map((storageClass) => ({ - label: storageClass, - value: storageClass, - })); - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.test.tsx deleted file mode 100644 index 6c33de909a63a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.test.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { render, screen, waitFor } from '@testing-library/react'; -import React from 'react'; -import { Form } from 'react-final-form'; - -import { Databases } from '../../../../../../shared/core'; -import { Messages } from '../DBClusterAdvancedOptions.messages'; - -import Configurations from './Configurations'; -jest.mock('app/percona/dbaas/components/Kubernetes/Kubernetes.service'); - -describe('DBClusterAdvancedOptions Configurations::', () => { - it('renders items correctly', async () => { - await waitFor(() => - render( - ( - - )} - /> - ) - ); - expect(screen.getByTestId('configurations').querySelector('legend')).toHaveTextContent( - Messages.fieldSets.commonConfiguration - ); - expect(screen.getByTestId('storageClass-field-label')).toHaveTextContent(Messages.labels.storageClass); - expect(screen.getByTestId('storageClass-field-container').querySelector('input')).toBeTruthy(); - expect(screen.getByTestId('configuration-field-label')).toHaveTextContent(Messages.labels.commonConfiguration); - expect(screen.getByTestId('configuration-textarea-input')).toBeInTheDocument(); - }); - - it('shows labels correctly for pxc', async () => { - await waitFor(() => - render( - ( - - )} - /> - ) - ); - expect(screen.getByTestId('configurations').querySelector('legend')).toHaveTextContent( - Messages.fieldSets.pxcConfiguration - ); - expect(screen.getByTestId('configuration-field-label')).toHaveTextContent(Messages.labels.pxcConfiguration); - }); - - it('shows labels correctly for mongoDB', async () => { - await waitFor(() => - render( - ( - - )} - /> - ) - ); - expect(screen.getByTestId('configurations').querySelector('legend')).toHaveTextContent( - Messages.fieldSets.mongodbConfiguration - ); - expect(screen.getByTestId('configuration-field-label')).toHaveTextContent(Messages.labels.mongodbConfiguration); - }); - - it('storageClass is disabled for edit mode', async () => { - await waitFor(() => - render( - ( - - )} - /> - ) - ); - expect(screen.getByTestId('storageClass-field-container').querySelector('input')).toBeDisabled(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.tsx deleted file mode 100644 index 18a50179d8629..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { FC, useMemo } from 'react'; - -import { AsyncSelectFieldCore } from 'app/percona/shared/components/Form/AsyncSelectFieldCore'; -import { TextareaInputField } from 'app/percona/shared/components/Form/TextareaInput'; - -import FieldSet from '../../../../../../shared/components/Form/FieldSet/FieldSet'; -import { Databases } from '../../../../../../shared/core'; -import { Messages } from '../DBClusterAdvancedOptions.messages'; - -import { ConfigurationService } from './Configurations.service'; -import { ConfigurationFields, ConfigurationProps } from './Configurations.types'; - -export const Configurations: FC = ({ form, mode, databaseType, k8sClusterName }) => { - const label = useMemo( - () => - databaseType === Databases.mysql - ? Messages.labels.pxcConfiguration - : databaseType === Databases.mongodb - ? Messages.labels.mongodbConfiguration - : Messages.labels.commonConfiguration, - [databaseType] - ); - const fieldSetLabel = useMemo( - () => - databaseType === Databases.mysql - ? Messages.fieldSets.pxcConfiguration - : databaseType === Databases.mongodb - ? Messages.fieldSets.mongodbConfiguration - : Messages.fieldSets.commonConfiguration, - [databaseType] - ); - - return ( -
- ConfigurationService.loadStorageClassOptions(k8sClusterName)} - defaultOptions - placeholder={Messages.placeholders.storageClass} - label={Messages.labels.storageClass} - disabled={mode === 'edit'} - /> - { - form.mutators.trimConfiguration(event?.target?.value); - }, - }} - /> -
- ); -}; - -export default Configurations; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.types.ts deleted file mode 100644 index 87bb287015564..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Configurations/Configurations.types.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ -import { FormApi } from 'final-form'; - -import { Databases } from 'app/percona/shared/core'; - -import { DBClusterPageMode } from '../../EditDBClusterPage.types'; -export enum ConfigurationFields { - storageClass = 'storageClass', - configuration = 'configuration', -} - -export interface ConfigurationProps { - databaseType: Databases; - k8sClusterName: string; - mode: DBClusterPageMode; - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - form: FormApi, Partial>>; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.constants.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.constants.ts deleted file mode 100644 index 744a05dd8d447..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.constants.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { SelectableValue } from '@grafana/data/src'; - -import { AddDBClusterFormValues } from '../EditDBClusterPage.types'; - -import { Messages } from './DBClusterAdvancedOptions.messages'; -import { DBClusterResources, DBClusterDefaultResources } from './DBClusterAdvancedOptions.types'; - -export const RESOURCES_OPTIONS: SelectableValue[] = [ - { value: DBClusterResources.small, label: Messages.resources.small }, - { value: DBClusterResources.medium, label: Messages.resources.medium }, - { value: DBClusterResources.large, label: Messages.resources.large }, - { value: DBClusterResources.custom, label: Messages.resources.custom }, -]; - -export const DEFAULT_SIZES: DBClusterDefaultResources = { - small: { - memory: 2, - cpu: 1, - disk: 25, - }, - medium: { - memory: 8, - cpu: 4, - disk: 100, - }, - large: { - memory: 32, - cpu: 8, - disk: 500, - }, -}; - -export const INITIAL_VALUES: AddDBClusterFormValues = { - nodes: 3, - resources: DBClusterResources.small, - memory: DEFAULT_SIZES.small.memory, - cpu: DEFAULT_SIZES.small.cpu, - disk: DEFAULT_SIZES.small.disk, - sourceRanges: [{ sourceRange: '' }], - day: [], - month: [], - period: { value: 'year', label: 'every year' }, - startHour: [{ label: '00', value: 0 }], - startMinute: [{ value: 0, label: '00' }], - weekDay: [], -}; - -export const MIN_NODES = 1; -export const MIN_RESOURCES = 0.1; -export const MIN_DISK_SIZE = 1; -export const RECHECK_INTERVAL = 10000; -export const EXPECTED_DELAY = 250; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.messages.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.messages.ts deleted file mode 100644 index 2826df809e016..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.messages.ts +++ /dev/null @@ -1,28 +0,0 @@ -export const Messages = { - fieldSets: { - advancedSettings: 'Advanced Settings', - pxcConfiguration: 'MySQL Configurations', - mongodbConfiguration: 'MongoDB Configurations', - commonConfiguration: 'Database Configurations', - }, - labels: { - nodes: 'Number of Nodes', - resources: 'Resources per Node', - cpu: 'CPU', - memory: 'Memory (GB)', - disk: 'Disk (GB)', - storageClass: 'Storage Class', - pxcConfiguration: 'MySQL Configuration', - mongodbConfiguration: 'MongoDB Configuration', - commonConfiguration: 'Database Configuration', - }, - resources: { - small: 'Small', - medium: 'Medium', - large: 'Large', - custom: 'Custom', - }, - placeholders: { - storageClass: 'storage class', - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.styles.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.styles.ts deleted file mode 100644 index 7e982119dbe87..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.styles.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; -import { stylesFactory } from '@grafana/ui/src'; - -export const getStyles = stylesFactory((theme: GrafanaTheme) => { - const { spacing } = theme; - - return { - resourcesWrapper: css` - display: flex; - `, - resourcesInputCol: css` - display: flex; - flex-direction: column; - div { - width: 100px; - } - div:not(:last-child) { - margin-bottom: ${spacing.xl}; - } - `, - resourcesBarCol: css` - display: flex; - flex-direction: column; - margin-left: ${spacing.xl}; - width: 100%; - `, - nodesWrapper: css` - margin-bottom: ${spacing.md}; - flex: 1 0 auto; - max-width: 235px; - div, - label { - white-space: nowrap; - margin-left: ${spacing.md}; - } - `, - resourcesBar: css` - margin-top: ${spacing.lg}; - margin-bottom: 67px; - min-height: 75px; - `, - resourcesBarEmpty: css` - margin-top: ${spacing.lg}; - margin-bottom: 78px; - min-height: 75px; - `, - resourcesBarLast: css` - margin-top: ${spacing.lg}; - `, - resourcesInfoWrapper: css` - display: flex; - align-items: center; - padding: ${spacing.sm}; - width: fit-content; - `, - resourcesInfoIcon: css` - margin-right: ${spacing.sm}; - `, - resourcesRadioWrapper: css` - align-items: center; - display: flex; - justify-content: space-between; - width: 760px; - `, - line: css` - display: flex; - gap: ${spacing.lg}; - > div { - flex: 0 1 auto; - width: 100%; - } - `, - resourcesRadioBtnGroup: css` - & { - > div:nth-child(3) { - label { - height: 37px; //TODO create the common system of components with one height for forms - align-items: center; - min-width: 118px; - } - } - } - `, - }; -}); 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 deleted file mode 100644 index 22d3bcd28dab8..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.test.tsx +++ /dev/null @@ -1,233 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ - -import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import arrayMutators from 'final-form-arrays'; -import React from 'react'; -import { Form } from 'react-final-form'; - -import { dbClustersStub } from '../../__mocks__/dbClustersStubs'; - -import { DBClusterAdvancedOptions } from './DBClusterAdvancedOptions'; -import { AdvancedOptionsFields, DBClusterResources } from './DBClusterAdvancedOptions.types'; - -jest.mock('../../DBCluster.service'); -jest.mock('../../PSMDB.service'); -jest.mock('../../XtraDB.service'); -jest.mock('app/percona/dbaas/components/Kubernetes/Kubernetes.service'); - -jest.mock('app/percona/shared/helpers/logger', () => { - const originalModule = jest.requireActual('app/percona/shared/helpers/logger'); - return { - ...originalModule, - logger: { - error: jest.fn(), - }, - }; -}); - -describe('DBClusterAdvancedOptions::', () => { - it('renders correctly in create mode', async () => { - await waitFor(() => - render( - ) => Promise} - mutators={{ ...arrayMutators }} - render={({ form, handleSubmit, valid, pristine, ...props }) => ( - - )} - /> - ) - ); - - const advancedOptions = screen.getByTestId('dbCluster-advanced-settings'); - await 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(); - expect(await screen.getByTestId('cpu-number-input')).toBeInTheDocument(); - expect(await screen.getByTestId('disk-number-input')).toBeInTheDocument(); - expect(await screen.getByTestId('configurations')).toBeInTheDocument(); - }); - - it('renders correctly in edit mode', async () => { - await waitFor(() => - render( - ) => Promise} - mutators={{ ...arrayMutators }} - render={({ form, handleSubmit, valid, pristine, ...props }) => ( - - )} - /> - ) - ); - - 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(); - expect(await screen.getByTestId('cpu-number-input')).toBeInTheDocument(); - expect(await screen.getByTestId('disk-number-input')).toBeInTheDocument(); - expect(screen.getByTestId('dbcluster-resources-bar-memory')).toBeInTheDocument(); - expect(screen.getByTestId('dbcluster-resources-bar-cpu')).toBeInTheDocument(); - expect(await screen.getByTestId('configurations')).toBeInTheDocument(); - }); - - it('renders correctly with initial values', async () => { - await waitFor(() => - render( - ) => Promise} - initialValues={{ [AdvancedOptionsFields.nodes]: 3 }} - mutators={{ ...arrayMutators }} - render={({ form, handleSubmit, valid, pristine, ...props }) => ( - - )} - /> - ) - ); - const advancedOptions = screen.getByTestId('dbCluster-advanced-settings'); - await waitFor(() => fireEvent.click(advancedOptions)); - - const nodes = screen.getByTestId('nodes-number-input'); - expect(nodes.getAttribute('value')).toBe('3'); - }); - - it('should disable memory, cpu and disk when resources are not custom', async () => { - await waitFor(() => - render( - ) => Promise} - initialValues={{ [AdvancedOptionsFields.resources]: DBClusterResources.small }} - mutators={{ ...arrayMutators }} - render={({ form, handleSubmit, valid, pristine, ...props }) => ( - - )} - /> - ) - ); - - const advancedOptions = screen.getByTestId('dbCluster-advanced-settings'); - await waitFor(() => fireEvent.click(advancedOptions)); - - const memory = screen.getByTestId('memory-number-input'); - const cpu = screen.getByTestId('cpu-number-input'); - const disk = screen.getByTestId('disk-number-input'); - - expect(memory).toBeDisabled(); - expect(cpu).toBeDisabled(); - expect(disk).toBeDisabled(); - }); - - it('should enable memory and cpu when resources is custom', async () => { - await waitFor(() => - render( - ) => Promise} - initialValues={{ - [AdvancedOptionsFields.resources]: DBClusterResources.small, - }} - mutators={{ ...arrayMutators }} - render={({ form, handleSubmit, valid, pristine, ...props }) => ( - - )} - /> - ) - ); - - const advancedOptions = screen.getByTestId('dbCluster-advanced-settings'); - await waitFor(() => fireEvent.click(advancedOptions)); - - const resources = screen.getByTestId('resources-field-container').querySelector('input'); - if (resources) { - await waitFor(() => fireEvent.change(resources, { target: { value: DBClusterResources.custom } })); - } - - const memory = screen.getByTestId('memory-number-input'); - const cpu = screen.getByTestId('cpu-number-input'); - const disk = screen.getByTestId('disk-number-input'); - - expect(memory).toBeDisabled(); - expect(cpu).toBeDisabled(); - expect(disk).toBeDisabled(); - }); - - it('should not show the arrow button in edit mode ', async () => { - await waitFor(() => - render( - ) => Promise} - mutators={{ ...arrayMutators }} - render={({ form, handleSubmit, valid, pristine, ...props }) => ( - - )} - /> - ) - ); - - expect(screen.queryByTestId('dbCluster-advanced-settings')).not.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 deleted file mode 100644 index b40b63ad25735..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.tsx +++ /dev/null @@ -1,295 +0,0 @@ -import { cx } from '@emotion/css'; -import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { FormRenderProps } from 'react-final-form'; - -import { useStyles } from '@grafana/ui/src'; -import { Overlay } from 'app/percona/shared/components/Elements/Overlay'; -import { NumberInputField } from 'app/percona/shared/components/Form/NumberInput'; -import { SelectField } from 'app/percona/shared/components/Form/SelectFieldCore'; -import { Databases } from 'app/percona/shared/core'; -import { logger } from 'app/percona/shared/helpers/logger'; -import validators from 'app/percona/shared/helpers/validators'; - -import FieldSet from '../../../../../shared/components/Form/FieldSet/FieldSet'; -import { CPU, Disk, Memory } from '../../../DBaaSIcons'; -import { DBClusterService } from '../../DBCluster.service'; -import { DBCluster, DBClusterAllocatedResources, DBClusterExpectedResources } from '../../DBCluster.types'; -import { getExpectedResourcesDifference, newDBClusterService } from '../../DBCluster.utils'; -import { ResourcesBar } from '../../ResourcesBar/ResourcesBar'; -import { optionRequired } from '../DBClusterBasicOptions/DBClusterBasicOptions.utils'; -import { DBClusterPageMode } from '../EditDBClusterPage.types'; -import { UnsafeConfigurationWarning } from '../UnsafeConfigurationsWarning/UnsafeConfigurationWarning'; - -import Configurations from './Configurations/Configurations'; -import { - DEFAULT_SIZES, - EXPECTED_DELAY, - MIN_DISK_SIZE, - MIN_NODES, - MIN_RESOURCES, - RECHECK_INTERVAL, - RESOURCES_OPTIONS, -} from './DBClusterAdvancedOptions.constants'; -import { Messages } from './DBClusterAdvancedOptions.messages'; -import { getStyles } from './DBClusterAdvancedOptions.styles'; -import { AdvancedOptionsFields, DBClusterResources } from './DBClusterAdvancedOptions.types'; -import { canGetExpectedResources, nodesValidator, resourceValidator } from './DBClusterAdvancedOptions.utils'; -import Templates from './Templates/Templates'; - -export interface DBClusterAdvancedOptionsProps extends FormRenderProps { - mode: DBClusterPageMode; - showUnsafeConfigurationWarning: boolean; - setShowUnsafeConfigurationWarning: React.Dispatch>; - selectedCluster?: DBCluster | null; -} - -export const DBClusterAdvancedOptions: FC = ({ - showUnsafeConfigurationWarning, - setShowUnsafeConfigurationWarning, - mode, - selectedCluster, - values, - form, -}) => { - let allocatedTimer: NodeJS.Timeout; - let expectedTimer: NodeJS.Timeout; - const styles = useStyles(getStyles); - const initialExpected = useRef(); - const [prevResources, setPrevResources] = useState(DBClusterResources.small); - const [customMemory, setCustomMemory] = useState( - selectedCluster ? selectedCluster.memory : DEFAULT_SIZES.small.memory - ); - const [customCPU, setCustomCPU] = useState(selectedCluster ? selectedCluster.cpu : DEFAULT_SIZES.small.cpu); - const [customDisk, setCustomDisk] = useState(DEFAULT_SIZES.small.disk); - const [allocatedResources, setAllocatedResources] = useState(); - const [loadingAllocatedResources, setLoadingAllocatedResources] = useState(false); - const [expectedResources, setExpectedResources] = useState(); - const [loadingExpectedResources, setLoadingExpectedResources] = useState(false); - - const mounted = { current: true }; - const { required, min } = validators; - const { change } = form; - const diskValidators = [required, min(MIN_DISK_SIZE)]; - const nodeValidators = [required, min(MIN_NODES), nodesValidator]; - const parameterValidators = [required, min(MIN_RESOURCES), resourceValidator]; - const { name, kubernetesCluster, topology, resources, memory, cpu, databaseType, disk, nodes, single } = values; - const resourcesInputProps = { step: '0.1' }; - const collapsableProps = - mode === 'create' - ? { - collapsableProps: { - isOpen: false, - buttonDataTestId: 'dbCluster-advanced-settings', - }, - } - : {}; - - const parsePositiveInt = useCallback((value) => (value > 0 && Number.isInteger(+value) ? value : undefined), []); - - const resourcesBarStyles = useMemo( - () => ({ - [styles.resourcesBar]: !!allocatedResources, - [styles.resourcesBarEmpty]: !allocatedResources, - }), - [allocatedResources, styles.resourcesBar, styles.resourcesBarEmpty] - ); - - const getAllocatedResources = async (triggerLoading = true) => { - try { - if (allocatedTimer) { - clearTimeout(allocatedTimer); - } - - if (triggerLoading) { - setLoadingAllocatedResources(true); - } - const alloc = await DBClusterService.getAllocatedResources( - selectedCluster ? selectedCluster.kubernetesClusterName : kubernetesCluster.value - ); - setAllocatedResources(alloc); - } catch (e) { - logger.error(e); - } finally { - if (triggerLoading) { - setLoadingAllocatedResources(false); - } - - // don't schedule another request if the component was unmounted while the previous request was occuring - if (mounted.current) { - // eslint-disable-next-line react-hooks/exhaustive-deps - allocatedTimer = setTimeout(() => getAllocatedResources(false), RECHECK_INTERVAL); - } - } - }; - - useEffect(() => { - if (prevResources === DBClusterResources.custom) { - setCustomMemory(memory); - setCustomCPU(cpu); - !selectedCluster && setCustomDisk(disk); - } - - if (resources?.value && resources.value !== DBClusterResources.custom) { - change(AdvancedOptionsFields.cpu, DEFAULT_SIZES[resources.value].cpu); - change(AdvancedOptionsFields.memory, DEFAULT_SIZES[resources.value].memory); - !selectedCluster && change(AdvancedOptionsFields.disk, DEFAULT_SIZES[resources.value].disk); - } else { - change(AdvancedOptionsFields.cpu, customCPU); - change(AdvancedOptionsFields.memory, customMemory); - !selectedCluster && change(AdvancedOptionsFields.disk, customDisk); - } - - setPrevResources(resources?.value); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [resources]); - - useEffect(() => { - if (selectedCluster ? selectedCluster : kubernetesCluster) { - getAllocatedResources(); - } - - return () => { - mounted.current = false; - clearTimeout(allocatedTimer); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [kubernetesCluster]); - - useEffect(() => { - const getExpectedResources = async () => { - const dbTypeValue = selectedCluster ? selectedCluster.databaseType : databaseType?.value; - - try { - const dbClusterService = newDBClusterService(dbTypeValue); - setLoadingExpectedResources(true); - - const expected = await dbClusterService.getExpectedResources({ - clusterName: selectedCluster ? selectedCluster.clusterName : name, - kubernetesClusterName: selectedCluster ? selectedCluster.kubernetesClusterName : kubernetesCluster, - databaseType: dbTypeValue, - clusterSize: nodes, - cpu, - memory, - disk, - }); - if (!initialExpected.current) { - initialExpected.current = expected; - } - setExpectedResources( - selectedCluster ? getExpectedResourcesDifference(expected, initialExpected.current) : expected - ); - } catch (e) { - logger.error(e); - } finally { - setLoadingExpectedResources(false); - } - }; - - if (canGetExpectedResources(selectedCluster ? selectedCluster : kubernetesCluster, values)) { - if (expectedTimer) { - clearTimeout(expectedTimer); - } - - // eslint-disable-next-line react-hooks/exhaustive-deps - expectedTimer = setTimeout(() => getExpectedResources(), EXPECTED_DELAY); - } - - return () => clearTimeout(expectedTimer); - }, [memory, cpu, disk, kubernetesCluster, topology, nodes, single, databaseType]); - - useEffect(() => { - const dbTypeValue = selectedCluster ? selectedCluster.databaseType : databaseType?.value; - if (dbTypeValue === Databases.mongodb) { - setShowUnsafeConfigurationWarning(nodes === 1); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [databaseType, nodes]); - - return ( -
- <>{showUnsafeConfigurationWarning && } - -
- - -
-
-
- - - -
-
- - } - total={allocatedResources?.total.cpu} - allocated={allocatedResources?.allocated.cpu} - expected={expectedResources?.expected.cpu} - className={cx(resourcesBarStyles)} - dataTestId="dbcluster-resources-bar-cpu" - /> - } - total={allocatedResources?.total.memory} - allocated={allocatedResources?.allocated.memory} - expected={expectedResources?.expected.memory} - className={cx(resourcesBarStyles)} - dataTestId="dbcluster-resources-bar-memory" - /> - } - total={allocatedResources?.total.disk} - allocated={allocatedResources?.allocated.disk} - expected={expectedResources?.expected.disk} - className={styles.resourcesBarLast} - dataTestId="dbcluster-resources-bar-disk" - /> - -
-
- -
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.types.ts deleted file mode 100644 index 40ca5449c0b7f..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.types.ts +++ /dev/null @@ -1,23 +0,0 @@ -export enum AdvancedOptionsFields { - nodes = 'nodes', - resources = 'resources', - memory = 'memory', - cpu = 'cpu', - disk = 'disk', - template = 'template', -} - -export enum DBClusterResources { - small = 'small', - medium = 'medium', - large = 'large', - custom = 'custom', -} - -export interface DBClusterDefaultResources { - [key: string]: { - memory: number; - cpu: number; - disk: number; - }; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.test.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.test.ts deleted file mode 100644 index f56ca31a67bc2..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { canGetExpectedResources, resourceValidator } from './DBClusterAdvancedOptions.utils'; - -describe('EditDBClusterAdvancedOptions.utils::', () => { - describe('resourceValidator::', () => { - it('returns undefined on undefined value', () => { - expect(resourceValidator(undefined)).toBeUndefined(); - }); - it('returns undefined when value is integer', () => { - expect(resourceValidator(10)).toBeUndefined(); - }); - it('returns undefined when has one decimal place', () => { - expect(resourceValidator(2.5)).toBeUndefined(); - }); - it("doesn't return undefined when value has more than one decimal place", () => { - expect(resourceValidator(3.74)).not.toBeUndefined(); - }); - }); - describe('canGetExpectedResources::', () => { - const kubernetesCluster = { - value: 'test', - label: 'test', - }; - const values = { - memory: 2, - cpu: 4, - disk: 20, - nodes: 3, - }; - it('returns false when memory is undefined', () => { - expect(canGetExpectedResources(kubernetesCluster, { ...values, memory: undefined })).toBeFalsy(); - }); - it('returns false when cpu is less than zero', () => { - expect(canGetExpectedResources(kubernetesCluster, { ...values, cpu: -1 })).toBeFalsy(); - }); - it('returns false when topology is cluster but nodes is undefined or a string', () => { - expect(canGetExpectedResources(kubernetesCluster, { ...values, nodes: undefined })).toBeFalsy(); - expect(canGetExpectedResources(kubernetesCluster, { ...values, nodes: 'test_invalid_nodes' })).toBeFalsy(); - }); - it('returns true when topology is cluster and nodes is a positive number', () => { - expect(canGetExpectedResources(kubernetesCluster, { ...values, nodes: -3 })).toBeFalsy(); - expect(canGetExpectedResources(kubernetesCluster, { ...values, nodes: 2 })).toBeTruthy(); - expect(canGetExpectedResources(kubernetesCluster, { ...values, nodes: '7' })).toBeTruthy(); - }); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.ts deleted file mode 100644 index 77b8920c6efdf..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/DBClusterAdvancedOptions.utils.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { SelectableValue } from '@grafana/data/src'; - -import { DBCluster } from '../../DBCluster.types'; - -export const resourceValidator = (value?: number) => { - if (!value || Math.floor(value) === value) { - return undefined; - } - - const precision = value.toString().split('.')[1]?.length || 0; - - return precision > 1 ? 'Only one decimal place allowed' : undefined; -}; - -export const canGetExpectedResources = ( - kubernetesCluster: DBCluster | SelectableValue, - values: Record -) => { - const { memory = 0, cpu = 0, disk = 0, nodes = 0 } = values; - - return ( - kubernetesCluster && - parseInt(`${memory}`, 10) > 0 && - parseInt(`${cpu}`, 10) > 0 && - parseInt(`${disk}`, 10) > 0 && - parseInt(`${nodes}`, 10) > 0 - ); -}; - -export const nodesValidator = (value?: string): string | undefined => { - return value === '2' ? 'Only 1, 3 or more nodes allowed' : undefined; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.messages.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.messages.tsx deleted file mode 100644 index a696b9e92ad52..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.messages.tsx +++ /dev/null @@ -1,5 +0,0 @@ -export const Messages = { - labels: { - templates: 'Templates', - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.service.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.service.ts deleted file mode 100644 index acbd5212290fe..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.service.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { SelectableValue } from '@grafana/data'; - -import { Databases } from '../../../../../../shared/core'; -import { DBClusterService } from '../../../DBCluster.service'; -import { DatabaseToDBClusterTypeMapping } from '../../../DBCluster.types'; - -export const TemplatesService = { - async loadTemplatesOptions(k8sClusterName: string, databaseType: Databases): Promise>> { - 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 deleted file mode 100644 index a70ca8d73ad6d..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React, { FC } from 'react'; - -import { AsyncSelectFieldCore } from 'app/percona/shared/components/Form/AsyncSelectFieldCore'; - -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 deleted file mode 100644 index 0755f0b8631e3..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterAdvancedOptions/Templates/Templates.types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Databases } from '../../../../../../shared/core'; - -export interface TemplatesProps { - k8sClusterName: string; - databaseType: Databases; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.constants.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.constants.tsx deleted file mode 100644 index 04fdf147b317a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.constants.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { DATABASE_LABELS, Databases } from 'app/percona/shared/core'; - -import { Operators } from './DBClusterBasicOptions.types'; - -export const OPERATORS = [Operators.pxc, Operators.psmdb]; - -export const DatabaseOperators = { - [Operators.pxc]: DATABASE_LABELS[Databases.mysql], - [Operators.psmdb]: DATABASE_LABELS[Databases.mongodb], -}; - -export const CLUSTER_NAME_MAX_LENGTH = 20; 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 deleted file mode 100644 index 780ec84174d12..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.hooks.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { FormApi } from 'final-form'; -import { useEffect } from 'react'; - -import { SelectableValue } from '@grafana/data/src'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { isOptionEmpty, newDBClusterService } from '../../DBCluster.utils'; - -import { BasicOptionsFields } from './DBClusterBasicOptions.types'; -import { findDefaultDatabaseVersion } from './DBClusterBasicOptions.utils'; - -export const useDatabaseVersions = ( - form: FormApi, - databaseType: SelectableValue, - kubernetesCluster: SelectableValue, - setLoadingDatabaseVersions: (loading: boolean) => void, - setDatabaseVersions: (versions: SelectableValue[]) => void -) => { - useEffect(() => { - const getDatabaseVersions = async () => { - try { - const dbClusterService = newDBClusterService(databaseType.value); - - setLoadingDatabaseVersions(true); - - const databaseVersions = await ( - await dbClusterService.getDatabaseVersions(kubernetesCluster.value) - ).filter(({ disabled }) => !disabled); - - setDatabaseVersions(databaseVersions); - form.change(BasicOptionsFields.databaseVersion, findDefaultDatabaseVersion(databaseVersions)); - } catch (e) { - logger.error(e); - } finally { - setLoadingDatabaseVersions(false); - } - }; - - if (!isOptionEmpty(databaseType) && !isOptionEmpty(kubernetesCluster)) { - getDatabaseVersions(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [databaseType, kubernetesCluster]); -}; 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 deleted file mode 100644 index 0f79951a104eb..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.messages.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const Messages = { - 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.styles.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.styles.ts deleted file mode 100644 index 2488971375eb2..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.styles.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - line: css` - display: flex; - gap: ${spacing.lg}; - > div { - flex: 1 0; - } - `, - basicOptions: css` - margin-bottom: 25px; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.test.tsx deleted file mode 100644 index b55cc924c6f09..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.test.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; -import { Form, FormRenderProps } from 'react-final-form'; -import { Provider } from 'react-redux'; - -import { configureStore } from '../../../../../../store/configureStore'; -import { StoreState } from '../../../../../../types'; -import { kubernetesStub } from '../../../Kubernetes/__mocks__/kubernetesStubs'; -import { Messages } from '../EditDBClusterPage.messages'; - -import { DBClusterBasicOptions } from './DBClusterBasicOptions'; -import { BasicOptionsFields } from './DBClusterBasicOptions.types'; -import { kubernetesClusterNameValidator } from './DBClusterBasicOptions.utils'; - -const store = configureStore({ - percona: { - settings: { loading: false, result: { dbaasEnabled: true } }, - }, -} as StoreState); -describe('DBClusterBasicOptions::', () => { - it('renders correctly', () => { - render( - - } - /> - - ); - - expect(screen.getByTestId('name-text-input')).toBeInTheDocument(); - expect(screen.getByTestId('dbcluster-kubernetes-cluster-field')).toBeInTheDocument(); - expect(screen.getByTestId('dbcluster-database-type-field')).toBeInTheDocument(); - const databaseVersionField = screen.getByTestId('dbcluster-database-version-field'); - expect(databaseVersionField).toBeInTheDocument(); - expect(databaseVersionField.querySelector('input')).toBeDisabled(); - }); - - it('renders correctly with default values', () => { - render( - - } - /> - - ); - expect(screen.getByTestId('name-text-input')).toHaveValue('dbcluster'); - }); - - it('should validate cluster name correctly', () => { - const clusterName1 = '!!!!'; - const clusterName2 = '1bcd'; - const clusterName3 = 'abcd'; - - expect(kubernetesClusterNameValidator(clusterName1)).toEqual(Messages.validationMessages.clusterName); - expect(kubernetesClusterNameValidator(clusterName2)).toEqual(Messages.validationMessages.clusterName); - expect(kubernetesClusterNameValidator(clusterName3)).toEqual(undefined); - }); - - it('should validate cluster name length', () => { - render( - - } - /> - - ); - - const name = screen.getByTestId('name-text-input'); - fireEvent.change(name, { target: { value: 'testinvalidnamelength' } }); - - expect(screen.getByTestId('name-field-error-message').textContent?.length).toBeGreaterThan(0); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx deleted file mode 100644 index 351bbcd8dcc51..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import React, { FC, useCallback, useMemo, useState } from 'react'; -import { Field } from 'react-final-form'; - -import { SelectableValue } from '@grafana/data/src'; -import { useStyles } from '@grafana/ui/src'; -import { - AsyncSelectFieldAdapter, - SelectFieldAdapter, -} from 'app/percona/shared/components/Form/FieldAdapters/FieldAdapters'; -import { TextInputField } from 'app/percona/shared/components/Form/TextInput'; -import { validators } from 'app/percona/shared/helpers/validatorsForm'; - -import { Kubernetes, Operator } from '../../../Kubernetes/Kubernetes.types'; -import { getDatabaseOptionFromOperator } from '../../../Kubernetes/Kubernetes.utils'; -import { KubernetesOperatorStatus } from '../../../Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { DATABASE_OPTIONS } from '../../DBCluster.constants'; -import { isOptionEmpty } from '../../DBCluster.utils'; - -import { CLUSTER_NAME_MAX_LENGTH } from './DBClusterBasicOptions.constants'; -import { useDatabaseVersions } from './DBClusterBasicOptions.hooks'; -import { Messages } from './DBClusterBasicOptions.messages'; -import { getStyles } from './DBClusterBasicOptions.styles'; -import { - BasicOptionsFields, - DatabaseOption, - DBClusterBasicOptionsProps, - Operators, -} from './DBClusterBasicOptions.types'; -import { getKubernetesOptions, kubernetesClusterNameValidator, optionRequired } from './DBClusterBasicOptions.utils'; - -const getAvailableDatabaseOptions = (kubernetesCluster: Kubernetes): DatabaseOption[] => { - const { operators } = kubernetesCluster; - const availableDatabaseOptions: DatabaseOption[] = []; - - Object.entries(operators).forEach(([operator, { status }]: [string, Operator]) => { - if (status === KubernetesOperatorStatus.ok) { - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - availableDatabaseOptions.push(getDatabaseOptionFromOperator(operator as Operators) as DatabaseOption); - } - }); - - return availableDatabaseOptions; -}; - -export const DBClusterBasicOptions: FC = ({ kubernetes, form }) => { - const styles = useStyles(getStyles); - const { required, maxLength } = validators; - const { change } = form; - const { kubernetesCluster, databaseType } = form.getState().values; - const [databaseVersions, setDatabaseVersions] = useState([]); - const [loadingDatabaseVersions, setLoadingDatabaseVersions] = useState(false); - - const onChangeDatabase = useCallback((databaseType) => { - change(BasicOptionsFields.databaseType, databaseType); - form.mutators.setClusterName(databaseType.value); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const kubernetesOptions = getKubernetesOptions(kubernetes); - - const [databaseOptions, setDatabaseOptions] = useState(() => { - if (kubernetesCluster) { - return getAvailableDatabaseOptions(kubernetesCluster); - } - return DATABASE_OPTIONS; - }); - - const onChangeCluster = useCallback((selectedKubernetes) => { - const availableDatabaseOptions = getAvailableDatabaseOptions(selectedKubernetes); - - if (availableDatabaseOptions.length === 1) { - change(BasicOptionsFields.databaseType, availableDatabaseOptions[0]); - } else { - change(BasicOptionsFields.databaseType, { - value: undefined, - label: undefined, - }); - } - - setDatabaseOptions(availableDatabaseOptions); - change(BasicOptionsFields.kubernetesCluster, selectedKubernetes); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const isDatabaseVersionDisabled = useMemo(() => isOptionEmpty(databaseType), [databaseType]); - useDatabaseVersions(form, databaseType, kubernetesCluster, setLoadingDatabaseVersions, setDatabaseVersions); - - return ( -
- -
- - -
- -
- ); -}; 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 deleted file mode 100644 index a9768d01d0d49..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { FormApi } from 'final-form'; - -import { Databases } from 'app/percona/shared/core'; - -import { Kubernetes, OperatorsList } from '../../../Kubernetes/Kubernetes.types'; - -export interface DBClusterBasicOptionsProps { - kubernetes: Kubernetes[]; - form: FormApi; -} - -export enum Operators { - pxc = 'pxc', - psmdb = 'psmdb', -} - -export interface DatabaseOption { - value: Databases; - label: string; -} - -export interface DatabaseOptionInitial { - value?: Databases; - label?: string; -} - -export interface KubernetesOptionProps { - disabledOperators: Operators[]; - availableOperators: Operators[]; - kubernetesClusterName: string; -} - -export interface KubernetesOption { - value: string; - label: JSX.Element; - operators: OperatorsList; - availableOperators: Operators[]; -} - -export enum BasicOptionsFields { - name = 'name', - kubernetesCluster = 'kubernetesCluster', - databaseType = 'databaseType', - databaseVersion = 'databaseVersion', -} - -export interface BasicOptionsFieldsProps { - [BasicOptionsFields.name]?: string; - [BasicOptionsFields.kubernetesCluster]?: KubernetesOption; - [BasicOptionsFields.databaseType]?: DatabaseOptionInitial; - [BasicOptionsFields.databaseVersion]?: string; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.test.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.test.ts deleted file mode 100644 index 4a7bba3edbfbb..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { findDefaultDatabaseVersion } from './DBClusterBasicOptions.utils'; - -describe('DBClusterBasicOptions.utils::', () => { - it('finds default database version', () => { - const versions = [ - { - label: 'db1', - value: 'db1', - default: false, - disabled: false, - }, - { - label: 'db2', - value: 'db2', - default: true, - disabled: false, - }, - ]; - - expect(findDefaultDatabaseVersion(versions)).toEqual(versions[1]); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.tsx deleted file mode 100644 index 9fab13a7cd934..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.utils.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React, { FC } from 'react'; - -import { SelectableValue } from '@grafana/data/src'; - -import { Kubernetes } from '../../../Kubernetes/Kubernetes.types'; -import { KubernetesOperatorStatus } from '../../../Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { DatabaseVersion } from '../../DBCluster.types'; -import { OptionContent } from '../../OptionContent/OptionContent'; -import { Messages } from '../EditDBClusterPage.messages'; - -import { DatabaseOperators, OPERATORS } from './DBClusterBasicOptions.constants'; -import { KubernetesOption as KubernetesOptionInterface, KubernetesOptionProps } from './DBClusterBasicOptions.types'; - -export const kubernetesClusterNameValidator = (value: string) => { - const clusterNameRegexp = /^[a-z]([-a-z0-9]*[a-z0-9])?$/; - - return clusterNameRegexp.test(value) ? undefined : Messages.validationMessages.clusterName; -}; - -const KubernetesOption: FC = ({ - disabledOperators, - availableOperators, - kubernetesClusterName, -}) => ( - DatabaseOperators[databaseType])} - disabledTags={disabledOperators.map((databaseType) => DatabaseOperators[databaseType])} - dataTestId="kubernetes-option" - /> -); - -export const getKubernetesOptions = (kubernetes: Kubernetes[]): KubernetesOptionInterface[] => - kubernetes - .map((kubernetesCluster) => { - const { kubernetesClusterName, operators } = kubernetesCluster; - - const availableOperators = OPERATORS.filter( - (databaseType) => operators[databaseType].status === KubernetesOperatorStatus.ok - ); - const disabledOperators = OPERATORS.filter( - (databaseType) => operators[databaseType].status !== KubernetesOperatorStatus.ok - ); - - return { - value: kubernetesClusterName, - label: ( - - ), - operators, - availableOperators, - }; - }) - .filter((operators) => operators.availableOperators.length); - -export const optionRequired = (option: SelectableValue) => - option && option.label && option.value ? undefined : Messages.validationMessages.requiredField; - -export const findDefaultDatabaseVersion = (versions: DatabaseVersion[]) => versions.find((version) => version.default); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.messages.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.messages.ts deleted file mode 100644 index 13ca085e3745c..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.messages.ts +++ /dev/null @@ -1,15 +0,0 @@ -export const Messages = { - labels: { - enableBackups: 'Enable backups', - location: 'Location', - retention: 'Retention Copies', - }, - fieldSets: { - schedule: 'Schedule', - backupInfo: 'Backup Information', - }, - placeholders: { - location: 'Choose', - retention: 'Choose', - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.service.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.service.ts deleted file mode 100644 index 1eb84e0766534..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.service.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { api } from 'app/percona/shared/helpers/api'; - -import { DBaaSBackup, DBaaSBackupListResponse } from './DBaaSBackups.types'; - -const BASE_URL = '/v1/management/DBaaS/Backups'; - -export const DBaaSBackupService = { - async list(locationId: string): Promise { - const { backups = [] } = await api.post( - `${BASE_URL}/List`, - { - location_id: locationId, - }, - false - ); - return backups; - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.styles.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.styles.ts deleted file mode 100644 index 91df009ac85f2..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.styles.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - fieldSetSwitch: css` - label { - position: absolute; - } - `, - fieldSetLabel: css` - display: flex; - align-items: center; - column-gap: 10px; - `, - - childFildSet: css` - legend { - font-size: 18px; - } - margin-bottom: 0; - `, - line: css` - display: flex; - gap: ${spacing.lg}; - > div { - flex: 1 0; - } - `, - asyncSelectField: css` - background-color: red; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.test.tsx deleted file mode 100644 index 1f4b2d5e53786..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.test.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { screen, render, waitFor, fireEvent } from '@testing-library/react'; -import React from 'react'; -import { Form } from 'react-final-form'; -import { Provider } from 'react-redux'; - -import { configureStore } from '../../../../../../store/configureStore'; -import { StoreState } from '../../../../../../types'; - -import DBaaSBackups from './DBaaSBackups'; - -jest.mock('app/percona/dbaas/components/Kubernetes/Kubernetes.service'); -jest.mock('app/percona/backup/components/StorageLocations/StorageLocations.service'); - -const store = configureStore({ - percona: { - user: { isAuthorized: true }, - kubernetes: { - loading: false, - }, - }, -} as StoreState); -describe('DBaaSBackups Scheduled Section ::', () => { - it('renders items correctly, shows fields on switch on', async () => { - await waitFor(() => - render( - - ( - - )} - /> - - ) - ); - expect(screen.getByTestId('toggle-scheduled-backup')).toBeInTheDocument(); - const checkbox = screen.getByTestId('toggle-scheduled-backup'); - - fireEvent.click(checkbox); - expect(screen.getByTestId('location-select-wrapper')).toBeInTheDocument(); - expect(screen.getByTestId('retention-field-container')).toBeInTheDocument(); - expect(screen.getByTestId('shedule-section-fields-wrapper')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx deleted file mode 100644 index 2ef7fd57c0279..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ -import React, { FC, useState } from 'react'; -import { Field, FormRenderProps } from 'react-final-form'; - -import { FieldSet, Switch, useStyles } from '@grafana/ui'; -import { NumberInputField } from 'app/percona/shared/components/Form/NumberInput'; -import { validators as customValidators } from 'app/percona/shared/helpers/validators'; -import { validators } from 'app/percona/shared/helpers/validatorsForm'; - -import { useSelector } from '../../../../../../types'; -import { MAX_RETENTION, MIN_RETENTION } from '../../../../../backup/components/AddBackupPage/AddBackupPage.constants'; -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 { Messages } from '././DBaaSBackups.messages'; -import { getStyles } from './DBaaSBackups.styles'; -import { DBaaSBackupFields } from './DBaaSBackups.types'; - -export const DBaaSBackups: FC = ({ values }) => { - const styles = useStyles(getStyles); - const [enableBackups, setEnableBackups] = useState(false); - - const { result: locations = [], loading: locationsLoading } = useSelector(getBackupLocations); - const locationsOptions = locations.map((location) => ({ - label: location.name, - value: location.locationID, - })); - - return ( -
-
{Messages.labels.enableBackups}
-
- - {({ input }) => ( - setEnableBackups((prevState) => !prevState)} - data-testid="toggle-scheduled-backup" - {...input} - checked={undefined} - /> - )} - -
-
- } - data-testid="dbaas-backups" - > - {enableBackups ? ( - <> -
-
- - {({ input }) => ( -
- -
- )} -
- -
-
-
- -
- - ) : ( -
- )} - - ); -}; - -export default DBaaSBackups; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.types.ts deleted file mode 100644 index ef3a1b7ecbc85..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.types.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { SelectableValue } from '@grafana/data'; - -export interface DBaaSBackupListResponse { - backups: DBaaSBackup[]; -} - -export interface DBaaSBackup { - key: string; -} - -export enum DBaaSBackupFields { - location = 'backupLocation', - retention = 'retention', -} - -export interface DBaaSBackupProps { - [DBaaSBackupFields.location]?: SelectableValue; - [DBaaSBackupFields.retention]?: number; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/_mocks_/DBaaSBackups.service.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/_mocks_/DBaaSBackups.service.ts deleted file mode 100644 index acf23115c383c..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/_mocks_/DBaaSBackups.service.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class DBaaSBackupsService { - async list() { - return Promise.resolve(); - } -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.constants.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.constants.ts deleted file mode 100644 index 7ea3c9310e12f..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const DB_CLUSTER_INVENTORY_URL = '/dbaas/dbclusters'; -export const DB_CLUSTER_CREATION_URL = `${DB_CLUSTER_INVENTORY_URL}/creation`; -export const DB_CLUSTER_EDIT_URL = `${DB_CLUSTER_INVENTORY_URL}/edit`; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.messages.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.messages.ts deleted file mode 100644 index e236611c83a73..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.messages.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const Messages = { - cancelButton: 'Cancel', - confirmButton: 'Register', - dbCluster: 'DB Cluster', - validationMessages: { - clusterName: - 'Should start with a letter, may only contain lower case, number, dash and end with an alphanumeric character', - notInstalledOperator: 'Operators must be installed to use database type', - requiredField: 'Required field', - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.styles.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.styles.ts deleted file mode 100644 index cec49ee25ca20..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.styles.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme2 } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme2) => ({ - optionsWrapper: css` - margin-top: ${spacing(3)}; - max-width: 720px; - `, - - collapsableSection: css` - max-width: 170px; - margin: ${spacing(6)} 0 ${spacing(3)} 0; - `, - - switchOptionsWrapper: css` - fieldset { - margin-top: 0; - margin-bottom: 0; - legend:first-child { - margin-bottom: ${spacing(2)}; - } - } - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.test.tsx deleted file mode 100644 index 6c430ba6c2621..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.test.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import { render, screen, waitFor } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; -import { Router } from 'react-router-dom'; - -import { locationService } from '@grafana/runtime/src'; -import { configureStore } from 'app/store/configureStore'; -import { StoreState } from 'app/types'; - -import { KubernetesClusterStatus } from '../../Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from '../../Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { kubernetesStub } from '../../Kubernetes/__mocks__/kubernetesStubs'; - -import { EditDBClusterPage } from './EditDBClusterPage'; -import { DB_CLUSTER_CREATION_URL, DB_CLUSTER_EDIT_URL } from './EditDBClusterPage.constants'; - -jest.mock('app/core/app_events'); - -describe('EditDBClusterPage::', () => { - it('renders correctly for create mode', () => { - locationService.push(DB_CLUSTER_CREATION_URL); - - render( - - - - - - ); - - expect(screen.findByRole('form')).toBeTruthy(); - - expect(screen.findByTestId('add-cluster-monitoring-warning')).toBeTruthy(); - - expect(screen.getByTestId('dbcluster-basic-options-step')).toBeTruthy(); - expect(screen.getByTestId('dbCluster-advanced-settings')).toBeTruthy(); - expect(screen.queryByTestId('nodes-field-container')).not.toBeInTheDocument(); - - expect(screen.getByTestId('db-cluster-cancel-button')).toBeInTheDocument(); - expect(screen.getByTestId('db-cluster-submit-button')).toBeInTheDocument(); - expect(screen.getByTestId('db-cluster-submit-button')).toHaveTextContent('Create'); - expect(screen.getByTestId('network-and-security')).toBeInTheDocument(); - expect(screen.getByText('Create DB Cluster')).toBeInTheDocument(); - }); - - it('renders correctly for edit mode', () => { - locationService.push(DB_CLUSTER_EDIT_URL); - - render( - - - - - - ); - - expect(screen.queryByTestId('dbcluster-basic-options-step')).not.toBeInTheDocument(); - expect(screen.getByTestId('nodes-field-container')).toBeInTheDocument(); - - expect(screen.getByTestId('db-cluster-cancel-button')).toBeInTheDocument(); - expect(screen.getByTestId('db-cluster-submit-button')).toBeInTheDocument(); - expect(screen.getByTestId('db-cluster-submit-button')).toHaveTextContent('Edit'); - expect(screen.getByTestId('network-and-security')).toBeInTheDocument(); - expect(screen.getByText('Edit DB Cluster')).toBeInTheDocument(); - }); - - it('should disable submit button when there is no values', async () => { - await waitFor(() => - render( - - - - - - ) - ); - - const button = screen.getByTestId('db-cluster-submit-button'); - expect(button).toBeDisabled(); - }); - - it('should show notification if DBaaS is disabled', async () => { - await waitFor(() => - render( - - - - - - ) - ); - - expect(screen.getByTestId('empty-block')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx deleted file mode 100644 index 3ef56109b314c..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.tsx +++ /dev/null @@ -1,156 +0,0 @@ -/* 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 { Redirect, useHistory } from 'react-router-dom'; - -import { Spinner, useStyles2 } from '@grafana/ui/src'; -import { useShowPMMAddressWarning } from 'app/percona/shared/components/hooks/showPMMAddressWarning'; -import { useSelector, useDispatch } from 'app/types'; - -import { FeatureLoader } from '../../../../shared/components/Elements/FeatureLoader'; -import { fetchStorageLocations } from '../../../../shared/core/reducers/backups/backupLocations'; -import { resetAddDBClusterState } from '../../../../shared/core/reducers/dbaas/addDBCluster/addDBCluster'; -import { resetDBCluster } from '../../../../shared/core/reducers/dbaas/dbaas'; -import { resetUpdateDBClusterState } from '../../../../shared/core/reducers/dbaas/updateDBCluster/updateDBCluster'; -import { getPerconaSettingFlag, getPerconaSettings } from '../../../../shared/core/selectors'; -import { Messages as DBaaSMessages } from '../../../DBaaS.messages'; -import { useUpdateOfKubernetesList } from '../../../hooks/useKubernetesList'; -import DBaaSPage from '../../DBaaSPage/DBaaSPage'; -import { - DBAAS_INVENTORY_URL, - K8S_INVENTORY_URL, -} from '../../Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants'; -import { PMMServerUrlWarning } from '../../PMMServerURLWarning/PMMServerUrlWarning'; - -import { ConfigurationFields } from './DBClusterAdvancedOptions/Configurations/Configurations.types'; -import { DBClusterAdvancedOptions } from './DBClusterAdvancedOptions/DBClusterAdvancedOptions'; -import { DBClusterBasicOptions } from './DBClusterBasicOptions/DBClusterBasicOptions'; -import { BasicOptionsFields } from './DBClusterBasicOptions/DBClusterBasicOptions.types'; -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 { generateUID } from './EditDBClusterPage.utils'; -import NetworkAndSecurity from './NetworkAndSecurity/NetworkAndSecurity'; -import Restore from './Restore/Restore'; -import { useDefaultMode } from './hooks/useDefaultMode'; -import { useEditDBClusterFormSubmit } from './hooks/useEditDBClusterFormSubmit'; -import { useEditDBClusterPageDefaultValues } from './hooks/useEditDBClusterPageDefaultValues'; -import { useEditDBClusterPageResult } from './hooks/useEditDBClusterPageResult'; - -export const EditDBClusterPage: FC = () => { - const styles = useStyles2(getStyles); - const dispatch = useDispatch(); - const history = useHistory(); - const mode = useDefaultMode(); - const { result: settings } = useSelector(getPerconaSettings); - const [kubernetes, kubernetesLoading] = useUpdateOfKubernetesList(); - const [showPMMAddressWarning] = useShowPMMAddressWarning(); - const [showUnsafeConfigurationWarning, setShowUnsafeConfigurationWarning] = useState(false); - const [initialValues, selectedDBCluster] = useEditDBClusterPageDefaultValues({ kubernetes, mode }); - const [onSubmit, loading, buttonMessage] = useEditDBClusterFormSubmit({ mode, showPMMAddressWarning, settings }); - const [result] = useEditDBClusterPageResult(mode); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const featureSelector = useCallback(getPerconaSettingFlag('dbaasEnabled'), []); - - useEffect(() => { - if (result === 'ok') { - history.push(DB_CLUSTER_INVENTORY_URL); - } - return () => { - if (mode === 'create') { - dispatch(resetAddDBClusterState()); - } else { - dispatch(resetDBCluster()); - dispatch(resetUpdateDBClusterState()); - } - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [result]); - - useEffect(() => { - dispatch(fetchStorageLocations()); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return ( - - {kubernetes === undefined || kubernetesLoading ? ( -
- -
- ) : kubernetes && kubernetes?.length > 0 ? ( - { - changeValue(state, `${BasicOptionsFields.name}`, () => `${databaseTypeValue}-${generateUID()}`); - }, - trimConfiguration: ([configuration]: string[], state, { changeValue }) => { - changeValue(state, ConfigurationFields.configuration, () => configuration.trim()); - }, - ...arrayMutators, - }} - render={({ form, handleSubmit, valid, pristine, ...props }) => ( - - - {showPMMAddressWarning && } -
- {mode === 'create' && } -
- {!!settings?.backupEnabled && } - - {!!settings?.backupEnabled && mode === 'create' && ( - - )} -
- -
-
- - )} - /> - ) : ( - - )} -
- ); -}; - -export default EditDBClusterPage; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts deleted file mode 100644 index c83fd4fd7eb88..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.types.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { SelectableValue } from '@grafana/data/src'; - -import { ScheduledSectionFieldsValuesProps } from '../../../../backup/components/AddBackupPage/ScheduleSection/ScheduleSectionFields/ScheduleSectionFields.types'; -import { Settings } from '../../../../settings/Settings.types'; -import { Kubernetes } from '../../Kubernetes/Kubernetes.types'; - -import { ConfigurationFields } from './DBClusterAdvancedOptions/Configurations/Configurations.types'; -import { AdvancedOptionsFields, DBClusterResources } from './DBClusterAdvancedOptions/DBClusterAdvancedOptions.types'; -import { BasicOptionsFields, BasicOptionsFieldsProps } from './DBClusterBasicOptions/DBClusterBasicOptions.types'; -import { DBaaSBackupProps } from './DBaaSBackups/DBaaSBackups.types'; -import { NetworkAndSecurityFields } from './NetworkAndSecurity/NetworkAndSecurity.types'; -import { RestoreFieldsProps } from './Restore/Restore.types'; -export type DBClusterPageMode = 'create' | 'edit' | 'list'; - -export interface EditDBClusterPageProps { - kubernetes: Kubernetes[]; -} - -export interface DBClusterCommonFormValues { - [AdvancedOptionsFields.nodes]: number; - [AdvancedOptionsFields.memory]: number; - [AdvancedOptionsFields.cpu]: number; - [AdvancedOptionsFields.disk]: number; - [ConfigurationFields.configuration]?: string; - [ConfigurationFields.storageClass]?: SelectableValue; - [NetworkAndSecurityFields.expose]?: boolean; - [NetworkAndSecurityFields.sourceRanges]?: Array<{ sourceRange: string }> | []; - [NetworkAndSecurityFields.internetFacing]?: boolean; -} -export interface AddDBClusterFormValues - extends ScheduledSectionFieldsValuesProps, - DBClusterCommonFormValues, - DBaaSBackupProps, - BasicOptionsFieldsProps, - RestoreFieldsProps { - [AdvancedOptionsFields.resources]: DBClusterResources; -} - -export interface UpdateDBClusterFormValues extends DBClusterCommonFormValues { - [BasicOptionsFields.databaseType]: SelectableValue; - [AdvancedOptionsFields.resources]?: DBClusterResources; -} - -export interface DBClusterFormSubmitProps { - mode: DBClusterPageMode; - showPMMAddressWarning: boolean; - settings?: Settings; -} - -export type ClusterSubmit = (values: Record) => Promise; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts deleted file mode 100644 index d0f5875321864..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.utils.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { logger } from 'app/percona/shared/helpers/logger'; - -import { DATABASE_LABELS } from '../../../../shared/core'; -import { Kubernetes } from '../../Kubernetes/Kubernetes.types'; -import { getActiveOperators, getDatabaseOptionFromOperator } from '../../Kubernetes/Kubernetes.utils'; -import { DBCluster, DBClusterPayload } from '../DBCluster.types'; -import { newDBClusterService } from '../DBCluster.utils'; - -import { - DEFAULT_SIZES, - INITIAL_VALUES, - MIN_NODES, -} from './DBClusterAdvancedOptions/DBClusterAdvancedOptions.constants'; -import { DBClusterResources } from './DBClusterAdvancedOptions/DBClusterAdvancedOptions.types'; -import { BasicOptionsFields } from './DBClusterBasicOptions/DBClusterBasicOptions.types'; -import { getKubernetesOptions } from './DBClusterBasicOptions/DBClusterBasicOptions.utils'; -import { AddDBClusterFormValues, UpdateDBClusterFormValues } from './EditDBClusterPage.types'; - -export const getAddInitialValues = ( - kubernetes: Kubernetes[], - preSelectedCluster: Kubernetes | null -): AddDBClusterFormValues => { - const activeOperators = getActiveOperators(preSelectedCluster ? [preSelectedCluster] : kubernetes); - - const initialValues: AddDBClusterFormValues = { - ...INITIAL_VALUES, - [BasicOptionsFields.databaseType]: - activeOperators.length === 1 - ? getDatabaseOptionFromOperator(activeOperators[0]) - : { value: undefined, label: undefined }, - }; - - if (kubernetes.length > 0) { - const kubernetesOptions = getKubernetesOptions(preSelectedCluster ? [preSelectedCluster] : kubernetes); - const initialCluster = kubernetesOptions.length > 0 && kubernetesOptions[0]; - if (initialCluster) { - initialValues[BasicOptionsFields.kubernetesCluster] = initialCluster; - if (activeOperators.length > 0) { - const databaseDefaultOperator = getDatabaseOptionFromOperator(activeOperators[0]); - initialValues[BasicOptionsFields.databaseType] = databaseDefaultOperator; - initialValues[BasicOptionsFields.name] = `${databaseDefaultOperator?.value}-${generateUID()}`; - } - } - } - - return initialValues; -}; - -export const generateUID = (): string => { - const firstPart = ('000' + ((Math.random() * 46656) | 0).toString(36)).slice(-3); - const secondPart = ('000' + ((Math.random() * 46656) | 0).toString(36)).slice(-3); - return firstPart + secondPart; -}; - -export const getDBClusterConfiguration = async (selectedCluster: DBCluster): Promise => { - try { - const dbClusterService = newDBClusterService(selectedCluster.databaseType); - const result = await dbClusterService.getClusterConfiguration(selectedCluster); - return result; - } catch (e) { - logger.error(e); - } - return; -}; - -export const getEditInitialValues = ( - selectedDBCluster: DBCluster, - configuration: DBClusterPayload | undefined -): UpdateDBClusterFormValues => { - const { template, clusterSize, sourceRanges, databaseType, cpu, disk, memory } = selectedDBCluster; - const isCluster = clusterSize > 1; - const sourceRangesArray = sourceRanges?.map((item) => ({ sourceRange: item })) || [{ sourceRange: '' }]; - const storageClass = configuration?.params?.replicaset?.storage_class || configuration?.params?.pxc?.storage_class; - const clusterParameters: UpdateDBClusterFormValues = { - nodes: isCluster ? clusterSize : MIN_NODES, - databaseType: { - value: databaseType, - label: DATABASE_LABELS[databaseType], - }, - 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 === cpu && DEFAULT_SIZES[type].memory === memory && DEFAULT_SIZES[type].disk === disk; - - if (isMatchSize(DBClusterResources.small)) { - clusterParameters.resources = DBClusterResources.small; - } else if (isMatchSize(DBClusterResources.medium)) { - clusterParameters.resources = DBClusterResources.medium; - } else if (isMatchSize(DBClusterResources.large)) { - clusterParameters.resources = DBClusterResources.large; - } else { - clusterParameters.resources = DBClusterResources.custom; - } - - return clusterParameters; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.messages.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.messages.tsx deleted file mode 100644 index 0b3f41c5f95e5..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.messages.tsx +++ /dev/null @@ -1,21 +0,0 @@ -export const Messages = { - labels: { - internetFacing: 'Internet Facing (EKS only)', - sourceRange: 'Source Range', - }, - fieldSets: { - expose: 'Enable external access', - }, - buttons: { - addNew: 'Add new', - }, - tooltips: { - expose: - 'You will make this database cluster available to connect from the internet. To limit access you need to specify source ranges', - internetFacing: - 'This is an AWS specific configuration required if you want to access your database cluster outside of your VPC', - }, - placeholders: { - sourceRange: '181.170.213.40/32', - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.styles.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.styles.ts deleted file mode 100644 index 53610aa1bc4a7..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.styles.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - fieldSetSwitch: css` - label { - position: absolute; - } - `, - fieldSetLabel: css` - display: flex; - align-items: center; - column-gap: 10px; - `, - fieldsWrapper: css` - position: relative; - width: 100%; - div:first-of-type { - button { - margin-top: 25px; - } - } - `, - button: css` - position: absolute; - right: 0; - top: -${spacing.md}; - `, - fieldWrapper: css` - display: flex; - width: 100%; - align-items: start; - column-gap: ${spacing.md}; - `, - field: css` - width: 100%; - margin-bottom: 16px; - `, - - deleteButton: css` - height: 37px; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.test.tsx deleted file mode 100644 index 38431412f4c42..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.test.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import arrayMutators from 'final-form-arrays'; -import React from 'react'; -import { Form } from 'react-final-form'; - -import NetworkAndSecurity from './NetworkAndSecurity'; -import { Messages } from './NetworkAndSecurity.messages'; -import { NetworkAndSecurityFields } from './NetworkAndSecurity.types'; - -describe('DBClusterAdvancedOptions NetworkAndSecurity::', () => { - it('render items correctly for create and edit mode', () => { - render( -
} - /> - ); - - expect(screen.getByTestId('toggle-network-and-security')).toBeInTheDocument(); - const checkbox = screen.getByTestId('toggle-network-and-security'); - - fireEvent.click(checkbox); - - expect(screen.getByTestId('network-and-security')).toHaveTextContent(Messages.fieldSets.expose); - - expect(screen.getByTestId('internetFacing-checkbox-input')).toBeInTheDocument(); - expect(screen.getByTestId('internetFacing-checkbox-input')).not.toBeDisabled(); - expect(screen.getByTestId('internetFacing-field-label')).toHaveTextContent(Messages.labels.internetFacing); - - expect(screen.getByTestId('network-and-security')).toHaveTextContent('Add new'); - expect(screen.getByTestId('sourceRanges[0].sourceRange-field-label')).toBeInTheDocument(); - expect(screen.getByTestId('sourceRanges[0].sourceRange-text-input')).toBeInTheDocument(); - expect(screen.getByTestId('sourceRanges[0].sourceRange-text-input')).not.toBeDisabled(); - }); - it('the delete button should not delete the first field', () => { - render( - } - /> - ); - expect(screen.getByTestId('toggle-network-and-security')).toBeInTheDocument(); - const checkbox = screen.getByTestId('toggle-network-and-security'); - - fireEvent.click(checkbox); - - expect(screen.getByTestId('sourceRanges[0].sourceRange-text-input')).toBeInTheDocument(); - const deleteBtn = screen.getByTestId('deleteButton-0'); - fireEvent.click(deleteBtn); - expect(screen.getByTestId('sourceRanges[0].sourceRange-text-input')).toBeInTheDocument(); - }); - it('the delete button should delete field from the form if it is not the first one ', () => { - render( - } - /> - ); - expect(screen.getByTestId('toggle-network-and-security')).toBeInTheDocument(); - const checkbox = screen.getByTestId('toggle-network-and-security'); - - fireEvent.click(checkbox); - - expect(screen.getByTestId('sourceRanges[1].sourceRange-text-input')).toBeInTheDocument(); - const deleteBtn = screen.getByTestId('deleteButton-1'); - fireEvent.click(deleteBtn); - expect(screen.queryByTestId('sourceRanges[1].sourceRange-text-input')).not.toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.tsx deleted file mode 100644 index 3373b924c583f..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import React, { FC } from 'react'; -import { Field } from 'react-final-form'; -import { FieldArray } from 'react-final-form-arrays'; - -import { Switch, useStyles, Button, Icon, Tooltip } from '@grafana/ui'; -import { CheckboxField } from 'app/percona/shared/components/Elements/Checkbox'; -import { TextInputField } from 'app/percona/shared/components/Form/TextInput'; - -import FieldSet from '../../../../../shared/components/Form/FieldSet/FieldSet'; - -import { Messages } from './NetworkAndSecurity.messages'; -import { getStyles } from './NetworkAndSecurity.styles'; -import { NetworkAndSecurityFields, NetworkAndSecurityProps } from './NetworkAndSecurity.types'; - -export const NetworkAndSecurity: FC = ({ form }) => { - const styles = useStyles(getStyles); - const { expose } = form.getState().values; - - return ( -
-
{Messages.fieldSets.expose}
- - - -
- - {({ input }) => ( - - )} - -
-
- } - data-testid="network-and-security" - > - {!!expose ? ( - <> - - - {({ fields }) => ( -
- - {fields.map((name, index) => ( -
- -
- ))} -
- )} -
- - ) : ( -
- )} - - ); -}; - -export default NetworkAndSecurity; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.types.ts deleted file mode 100644 index fe452d53d4abb..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/NetworkAndSecurity/NetworkAndSecurity.types.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { FormApi } from 'final-form'; - -export enum NetworkAndSecurityFields { - expose = 'expose', - internetFacing = 'internetFacing', - sourceRanges = 'sourceRanges', -} - -export interface NetworkAndSecurityProps { - form: FormApi; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.messages.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.messages.ts deleted file mode 100644 index fdb0e465a48ce..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.messages.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const Messages = { - labels: { - restoreFrom: 'Restore from', - backupArtifact: 'Backup artifact', - secretsName: 'Secrets Name', - enableRestore: 'Enable restore', - }, - placeholders: { - restoreFrom: 'None', - backupArtifact: 'Choose', - secretsName: 'Choose', - }, - tooltips: { - secretsName: 'Select a secret of the cluster with the same user passwords of the original cluster', - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.service.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.service.ts deleted file mode 100644 index 97cb6508bb446..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { SelectableValue } from '@grafana/data'; - -import { DBClusterService } from '../../DBCluster.service'; -import { DBaaSBackupService } from '../DBaaSBackups/DBaaSBackups.service'; - -export const RestoreService = { - async loadBackupArtifacts(locationId: string): Promise>> { - const backupArtifactsResponse = await DBaaSBackupService.list(locationId); - - return backupArtifactsResponse.map((backup) => ({ - label: backup.key, - value: backup.key, - })); - }, - - async loadSecretsNames(k8sClusterName: string): Promise>> { - const secretsResponse = await DBClusterService.getDBClusterSecrets(k8sClusterName); - const secrets = secretsResponse?.secrets || []; - return secrets.map((secret) => ({ - label: secret.name, - value: secret.name, - })); - }, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.styles.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.styles.tsx deleted file mode 100644 index 85ca8a4f64f1b..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.styles.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - line: css` - display: flex; - gap: ${spacing.lg}; - > div { - flex: 1 0; - } - `, - - hiddenField: css` - visibility: hidden; - `, - - field: css` - width: 50%; - flex-shrink: 1; - `, - - fieldSetSwitch: css` - label { - position: absolute; - } - `, - fieldSetLabel: css` - display: flex; - align-items: center; - column-gap: 10px; - `, - asyncSelect: css` - svg { - margin-bottom: ${spacing.xxs}; - } - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.test.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.test.tsx deleted file mode 100644 index 010b3cd248549..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.test.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { screen, render, waitFor, fireEvent } from '@testing-library/react'; -import React from 'react'; -import { Form } from 'react-final-form'; -import { Provider } from 'react-redux'; - -import { configureStore } from '../../../../../../store/configureStore'; -import { StoreState } from '../../../../../../types'; - -import { Restore } from './Restore'; - -jest.mock('app/percona/dbaas/components/Kubernetes/Kubernetes.service'); -jest.mock('app/percona/backup/components/StorageLocations/StorageLocations.service'); -jest.mock('app/percona/dbaas/components/DBCluster/EditDBClusterPage/DBaaSBackups/DBaaSBackups.service'); - -const store = configureStore({ - percona: { - user: { isAuthorized: true }, - kubernetes: { - loading: false, - }, - }, -} as StoreState); - -describe('DBaaS DBCluster creation Restore section ::', () => { - it('renders items correctly, shows fields on switch on', async () => { - await waitFor(() => - render( - - } /> - - ) - ); - expect(screen.getByTestId('toggle-scheduled-restore')).toBeInTheDocument(); - const checkbox = screen.getByTestId('toggle-scheduled-restore'); - fireEvent.click(checkbox); - expect(screen.getByTestId('locations-select-wrapper')).toBeInTheDocument(); - }); - it('shows backup artifacts field when location field is not empty', async () => { - await waitFor(() => - render( - - { - return ; - }} - /> - - ) - ); - - expect(screen.getByTestId('toggle-scheduled-restore')).toBeInTheDocument(); - const checkbox = screen.getByTestId('toggle-scheduled-restore'); - await waitFor(() => fireEvent.click(checkbox)); - expect(screen.getByTestId('backupArtifact-field-container')).toBeInTheDocument(); - }); - it('shows secrets field if kubernetesCluster name exists in form', async () => { - await waitFor(() => - render( - - { - return ; - }} - /> - - ) - ); - - expect(screen.getByTestId('toggle-scheduled-restore')).toBeInTheDocument(); - const checkbox = screen.getByTestId('toggle-scheduled-restore'); - await waitFor(() => fireEvent.click(checkbox)); - expect(screen.getByTestId('secretsName-field-container')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.tsx deleted file mode 100644 index 37da368be0b6e..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import React, { FC, useState } from 'react'; -import { Field } from 'react-final-form'; - -import { FieldSet, Switch, useStyles } from '@grafana/ui'; -import { AsyncSelectFieldCore } from 'app/percona/shared/components/Form/AsyncSelectFieldCore'; -import { validators } from 'app/percona/shared/helpers/validatorsForm'; - -import { useSelector } from '../../../../../../types'; -import { SelectField } from '../../../../../shared/components/Form/SelectField'; -import { getBackupLocations } from '../../../../../shared/core/selectors'; - -import { Messages } from './Restore.messages'; -import { RestoreService } from './Restore.service'; -import { getStyles } from './Restore.styles'; -import { RestoreFields, RestoreFromProps } from './Restore.types'; - -export const Restore: FC = ({ form }) => { - const styles = useStyles(getStyles); - - const [enableRestore, setEnableRestore] = useState(false); - const { result: locations = [], loading: locationsLoading } = useSelector(getBackupLocations); - const locationsOptions = locations.map((location) => ({ - label: location.name, - value: location.locationID, - })); - - const { restoreFrom, kubernetesCluster } = form.getState().values; - const restoreFromValue = restoreFrom?.value; - return ( -
-
{Messages.labels.enableRestore}
-
- - {({ input }) => ( - setEnableRestore((prevState) => !prevState)} - data-testid="toggle-scheduled-restore" - {...input} - checked={undefined} - /> - )} - -
-
- } - data-testid="restore" - > - {enableRestore ? ( -
-
- - {({ input }) => ( -
- -
- )} -
- {restoreFromValue !== undefined && restoreFromValue ? ( - RestoreService.loadBackupArtifacts(restoreFromValue)} - defaultOptions - placeholder={Messages.placeholders.backupArtifact} - label={Messages.labels.backupArtifact} - validate={validators.required} - /> - ) : ( -
- )} -
- {kubernetesCluster?.value && ( -
- RestoreService.loadSecretsNames(kubernetesCluster?.value)} - defaultOptions - placeholder={Messages.placeholders.secretsName} - label={Messages.labels.secretsName} - validate={validators.required} - tooltipIcon="info-circle" - tooltipText={Messages.tooltips.secretsName} - fieldClassName={styles.asyncSelect} - /> -
-
- )} -
- ) : ( -
- )} - - ); -}; - -export default Restore; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.types.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.types.ts deleted file mode 100644 index 9e1b95f26f05a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/Restore/Restore.types.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { FormApi } from 'final-form'; - -import { SelectableValue } from '@grafana/data'; - -export interface RestoreFromProps { - form: FormApi; -} - -export enum RestoreFields { - restoreFrom = 'restoreFrom', - backupArtifact = 'backupArtifact', - secretsName = 'secretsName', -} - -export interface RestoreFieldsProps { - [RestoreFields.restoreFrom]?: SelectableValue; - - [RestoreFields.backupArtifact]?: SelectableValue; - [RestoreFields.secretsName]?: SelectableValue; -} diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.styles.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.styles.ts deleted file mode 100644 index 164c32819587d..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.styles.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { css } from '@emotion/css'; - -export const getStyles = () => ({ - alertMessageWrapper: css` - & > div:last-child { - > div:last-child { - padding: 0; - } - } - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.tsx b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.tsx deleted file mode 100644 index ad3ab36470334..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/UnsafeConfigurationsWarning/UnsafeConfigurationWarning.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { FC } from 'react'; - -import { Alert, useStyles } from '@grafana/ui/src'; - -import { getStyles } from './UnsafeConfigurationWarning.styles'; - -export const UnsafeConfigurationWarning: FC = () => { - const styles = useStyles(getStyles); - - return ( - - Unsafe configuration, not for production use - - ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/__mocks__/addDBClusterModalStubs.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/__mocks__/addDBClusterModalStubs.ts deleted file mode 100644 index 421cf713ddd6a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/__mocks__/addDBClusterModalStubs.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const kubernetesOptionsStub = [ - { - value: 'Test Cluster 1', - label: 'Test Cluster 1', - }, - { - value: 'Test Cluster 2', - label: 'Test Cluster 2', - }, -]; - -export const setVisibleStub = jest.fn(); -export const onDBClusterAddedStub = jest.fn(); 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 deleted file mode 100644 index fbeccb915a3f1..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/DBClusterHooks.test.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import React from 'react'; -import { Provider } from 'react-redux'; -import { Router } from 'react-router-dom'; - -import { locationService } from '@grafana/runtime'; - -import { configureStore } from '../../../../../../store/configureStore'; -import { StoreState } from '../../../../../../types'; -import { Databases } from '../../../../../shared/core'; -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'; - -import { useEditDBClusterPageDefaultValues } from './useEditDBClusterPageDefaultValues'; - -const kubernetes: Kubernetes[] = [ - { - kubernetesClusterName: 'cluster1', - status: KubernetesClusterStatus.ok, - operators: { - psmdb: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - pxc: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - }, - }, - { - kubernetesClusterName: 'cluster2', - status: KubernetesClusterStatus.ok, - operators: { - psmdb: { status: KubernetesOperatorStatus.ok, version: '2', availableVersion: '2' }, - pxc: { status: KubernetesOperatorStatus.ok, version: '2', availableVersion: '2' }, - }, - }, -]; - -describe('DBClusterHooks::', () => { - it('returns default values for create mode', () => { - // @ts-ignore - const wrapper = ({ children }) => ( - - {children} - - ); - const { result } = renderHook(() => useEditDBClusterPageDefaultValues({ kubernetes, mode: 'create' }), { wrapper }); - const initialValues = result.current[0] as AddDBClusterFormValues; - - expect(initialValues).toEqual( - expect.objectContaining({ - databaseType: expect.objectContaining({ value: 'mongodb' }), - name: expect.stringContaining('mongodb'), - kubernetesCluster: expect.objectContaining({ value: 'cluster1' }), - }) - ); - }); - - it('returns default values from kubernetesPage for create mode', () => { - // @ts-ignore - const wrapper = ({ children }) => ( - - {children} - - ); - const { result } = renderHook(() => useEditDBClusterPageDefaultValues({ kubernetes, mode: 'create' }), { wrapper }); - const initialValues = result.current[0] as AddDBClusterFormValues; - - expect(initialValues).toEqual( - expect.objectContaining({ - databaseType: expect.objectContaining({ value: 'mongodb' }), - name: expect.stringContaining('mongodb'), - kubernetesCluster: expect.objectContaining({ value: 'cluster2' }), - }) - ); - }); - - it('returns default values for edit mode', () => { - // @ts-ignore - const wrapper = ({ children }) => ( - - {children} - - ); - const { result } = renderHook(() => useEditDBClusterPageDefaultValues({ kubernetes, mode: 'edit' }), { wrapper }); - const initialValues = result.current[0] as UpdateDBClusterFormValues; - expect(initialValues).toEqual( - expect.objectContaining({ - databaseType: expect.objectContaining({ value: Databases.mysql }), - memory: 1001, - cpu: 1002, - disk: 1003, - nodes: 1, - resources: DBClusterResources.custom, - template: expect.objectContaining({ value: dbClusterTemplatesApi[0].kind }), - }) - ); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useDefaultMode.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useDefaultMode.ts deleted file mode 100644 index af26e96fe12b4..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useDefaultMode.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { useHistory } from 'react-router-dom'; - -import { DB_CLUSTER_CREATION_URL, DB_CLUSTER_EDIT_URL } from '../EditDBClusterPage.constants'; -import { DBClusterPageMode } from '../EditDBClusterPage.types'; - -export const useDefaultMode = (): DBClusterPageMode => { - const history = useHistory(); - switch (history.location.pathname) { - case DB_CLUSTER_CREATION_URL: - return 'create'; - case DB_CLUSTER_EDIT_URL: - return 'edit'; - default: - return 'list'; - } -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterFormSubmit.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterFormSubmit.ts deleted file mode 100644 index 1fc1a73f60038..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterFormSubmit.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useSelector, useDispatch } from 'app/types'; - -import { addDbClusterAction } from '../../../../../shared/core/reducers/dbaas/addDBCluster/addDBCluster'; -import { updateDBClusterAction } from '../../../../../shared/core/reducers/dbaas/updateDBCluster/updateDBCluster'; -import { getAddDbCluster, getDBaaS, getUpdateDbCluster } from '../../../../../shared/core/selectors'; -import { ClusterSubmit, DBClusterFormSubmitProps } from '../EditDBClusterPage.types'; - -export const useEditDBClusterFormSubmit = ({ - mode, - showPMMAddressWarning, - settings, -}: DBClusterFormSubmitProps): [ClusterSubmit, boolean | undefined, string, 'error' | 'ok' | undefined] => { - const dispatch = useDispatch(); - const { result, loading } = useSelector(mode === 'create' ? getAddDbCluster : getUpdateDbCluster); - const { selectedDBCluster } = useSelector(getDBaaS); - - const addCluster = async (values: Record) => { - await dispatch(addDbClusterAction({ values, setPMMAddress: showPMMAddressWarning, settings })); - }; - - const editCluster = async (values: Record) => { - if (selectedDBCluster) { - await dispatch(updateDBClusterAction({ values, selectedDBCluster })); - } - }; - - if (mode === 'create') { - return [addCluster, loading, 'Create', result]; - } else { - return [editCluster, loading, 'Edit', result]; - } -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageDefaultValues.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageDefaultValues.ts deleted file mode 100644 index a9e184daaa36f..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageDefaultValues.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { useMemo, useEffect, useState } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { useSelector } from 'app/types'; - -import { getDBaaS } from '../../../../../shared/core/selectors'; -import { Kubernetes } from '../../../Kubernetes/Kubernetes.types'; -import { DBCluster, DBClusterPayload } from '../../DBCluster.types'; -import { DB_CLUSTER_INVENTORY_URL } from '../EditDBClusterPage.constants'; -import { AddDBClusterFormValues, DBClusterPageMode, UpdateDBClusterFormValues } from '../EditDBClusterPage.types'; -import { getAddInitialValues, getDBClusterConfiguration, getEditInitialValues } from '../EditDBClusterPage.utils'; - -interface EditDBClusterPageDefaultValuesProps { - kubernetes: Kubernetes[] | undefined; - mode: DBClusterPageMode; -} - -export const useEditDBClusterPageDefaultValues = ({ - kubernetes, - mode, -}: EditDBClusterPageDefaultValuesProps): [ - AddDBClusterFormValues | UpdateDBClusterFormValues | undefined, - DBCluster | null -] => { - const history = useHistory(); - const { selectedKubernetesCluster: preSelectedKubernetesCluster, selectedDBCluster } = useSelector(getDBaaS); - const [configuration, setConfiguration] = useState(undefined); - - useEffect(() => { - if (mode === 'edit' && selectedDBCluster) { - getDBClusterConfiguration(selectedDBCluster).then(setConfiguration); - } - }, [mode, selectedDBCluster]); - - const initialValues = useMemo(() => { - if (mode === 'create') { - return kubernetes?.length ? getAddInitialValues(kubernetes, preSelectedKubernetesCluster) : undefined; - } - if (mode === 'edit' && selectedDBCluster) { - return getEditInitialValues(selectedDBCluster, configuration); - } - return undefined; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [history, kubernetes, mode, preSelectedKubernetesCluster, selectedDBCluster, configuration]); - - if (mode !== 'create' && (mode !== 'edit' || !selectedDBCluster)) { - history.push(DB_CLUSTER_INVENTORY_URL); - } - - return [initialValues, selectedDBCluster]; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageResult.ts b/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageResult.ts deleted file mode 100644 index 00017f6f3215d..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterPageResult.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { useSelector } from 'app/types'; - -import { getAddDbCluster, getUpdateDbCluster } from '../../../../../shared/core/selectors'; -import { DBClusterPageMode } from '../EditDBClusterPage.types'; - -export const useEditDBClusterPageResult = (mode: DBClusterPageMode): ['error' | 'ok' | undefined] => { - const { result } = useSelector(mode === 'create' ? getAddDbCluster : getUpdateDbCluster); - return [result]; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.styles.ts b/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.styles.ts deleted file mode 100644 index cf574541cb355..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.styles.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { css } from '@emotion/css'; - -export const styles = { - optionWrapper: css` - align-items: center; - display: flex; - justify-content: space-between; - `, - optionText: css` - display: flex; - flex-direction: column; - max-width: 75%; - white-space: normal; - `, - optionTitle: css` - color: #d8d9da; - white-space: nowrap; - `, - optionDescription: css` - color: #8e8e8e; - font-size: 10px; - line-height: 1.5em; - `, - tagWrapper: css` - margin-left: 4px; - `, - tag: css` - background-color: #646464; - border: 1px solid #8a8a8a; - border-radius: 3px; - color: #f2f2f2; - font-size: 11px; - margin-left: 6px; - padding: 2px 4px; - `, - notAvailableTag: css` - background-color: #646464; - border: 1px solid #8a8a8a; - border-radius: 3px; - color: gray; - font-size: 11px; - margin-left: 6px; - padding: 2px 4px; - `, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.test.tsx b/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.test.tsx deleted file mode 100644 index cb986473b3934..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.test.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { render } from '@testing-library/react'; -import React from 'react'; - -import { OptionContent } from './OptionContent'; - -const title = 'Shared Blocks Written'; -const description = 'Total number of shared blocks written by the statement'; -const tags = ['mysql', 'postgresql']; - -describe('OptionContent::', () => { - it('should render with title, description and tags', () => { - const { container } = render(); - const spans = container.querySelectorAll('div > div > span'); - - expect(spans[0]).toHaveTextContent(title); - expect(spans[1]).toHaveTextContent(description); - expect(spans[2]).toHaveTextContent(tags[0]); - expect(spans[3]).toHaveTextContent(tags[1]); - }); - - it('should render with title, description and one tag', () => { - const { container } = render(); - const spans = container.querySelectorAll('div > div > span'); - - expect(spans[0]).toHaveTextContent(title); - expect(spans[1]).toHaveTextContent(description); - expect(spans[2]).toHaveTextContent(tags[0]); - }); - - it('should render with title, description and empty tags', () => { - const { container } = render(); - const spans = container.querySelectorAll('div > div > span'); - - expect(spans[0]).toHaveTextContent(title); - expect(spans[1]).toHaveTextContent(description); - expect(spans).toHaveLength(2); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.tsx b/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.tsx deleted file mode 100644 index 3777707366e2a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/OptionContent/OptionContent.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React, { FC } from 'react'; - -import { styles } from './OptionContent.styles'; - -interface OptionContentProps { - title: string; - description?: string; - tags: string[]; - disabledTags?: string[]; - dataTestId?: string; -} - -export const OptionContent: FC = ({ title, description, tags, disabledTags, dataTestId }) => ( -
-
- {title} - {description} -
-
- {disabledTags && - disabledTags.map((tag) => ( - - {tag} - - ))} - {tags.map((tag) => ( - - {tag} - - ))} -
-
-); diff --git a/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts b/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts deleted file mode 100644 index b4d5632054fdd..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/PSMDB.service.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { omit, pick } from 'lodash'; - -import { Databases } from 'app/percona/shared/core'; -import { apiManagement } from 'app/percona/shared/helpers/api'; - -import { - ManageComponentsVersionsRenderProps, - SupportedComponents, -} from '../Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types'; - -import { BILLION, THOUSAND } from './DBCluster.constants'; -import { DBClusterService } from './DBCluster.service'; -import { getComponentChange } from './DBCluster.service.utils'; -import { - DatabaseVersion, - CpuUnits, - DBCluster, - DBClusterActionAPI, - DBClusterComponents, - DBClusterConnectionAPI, - DBClusterExpectedResources, - DBClusterExpectedResourcesAPI, - DBClusterPayload, - ResourcesUnits, - DBClusterChangeComponentsAPI, - DBClusterType, - DBClusterStatus, - DBClusterSuspendResumeRequest, - DBClusterConfigurationAPI, -} from './DBCluster.types'; -import { Operators } from './EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -export class PSMDBService extends DBClusterService { - addDBCluster(dbCluster: DBCluster): Promise { - return apiManagement.post('/DBaaS/PSMDBCluster/Create', toAPI(dbCluster)); - } - - updateDBCluster(dbCluster: DBCluster): Promise { - return apiManagement.post('/DBaaS/PSMDBCluster/Update', toAPI(dbCluster)); - } - - resumeDBCluster(dbCluster: DBCluster): Promise { - return apiManagement.post( - '/DBaaS/PSMDBCluster/Update', - toResumeAPI(dbCluster) - ); - } - - suspendDBCluster(dbCluster: DBCluster): Promise { - return apiManagement.post( - '/DBaaS/PSMDBCluster/Update', - toSuspendAPI(dbCluster) - ); - } - - deleteDBClusters(dbCluster: DBCluster): Promise { - const body = { - name: dbCluster.clusterName, - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - cluster_type: DBClusterType.psmdb, - }; - - return apiManagement.post('/DBaaS/DBClusters/Delete', body); - } - - getDBClusterCredentials(dbCluster: DBCluster): Promise { - return apiManagement.post>( - '/DBaaS/PSMDBClusters/GetCredentials', - omit(toAPI(dbCluster), ['params']) - ); - } - - restartDBCluster(dbCluster: DBCluster): Promise { - const body = { - name: dbCluster.clusterName, - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - cluster_type: DBClusterType.psmdb, - }; - - return apiManagement.post('/DBaaS/DBClusters/Restart', body); - } - - getComponents(kubernetesClusterName: string): Promise { - return apiManagement.post('/DBaaS/Components/GetPSMDB', { - kubernetes_cluster_name: kubernetesClusterName, - }); - } - - setComponents(kubernetesClusterName: string, componentsVersions: ManageComponentsVersionsRenderProps): Promise { - return apiManagement.post('/DBaaS/Components/ChangePSMDB', { - kubernetes_cluster_name: kubernetesClusterName, - mongod: getComponentChange(Operators.psmdb, SupportedComponents.mongod, componentsVersions), - }); - } - - getDatabaseVersions(kubernetesClusterName: string): Promise { - return this.getComponents(kubernetesClusterName).then(({ versions }) => { - return Object.entries(versions[0].matrix.mongod || {}).map(([version, component]) => ({ - value: component ? component.image_path : '', - label: version || '', - default: component.default || false, - disabled: component.disabled || false, - })); - }); - } - - getExpectedResources(dbCluster: DBCluster): Promise { - return apiManagement - .post>( - '/DBaaS/PSMDBCluster/Resources/Get', - pick(toAPI(dbCluster), ['params']) - ) - .then(({ expected }: DBClusterExpectedResourcesAPI) => ({ - expected: { - cpu: { value: expected.cpu_m / THOUSAND, units: CpuUnits.MILLI, original: +expected.cpu_m }, - memory: { - value: expected.memory_bytes / BILLION, - units: ResourcesUnits.GB, - original: +expected.memory_bytes, - }, - disk: { value: expected.disk_size / BILLION, units: ResourcesUnits.GB, original: +expected.disk_size }, - }, - })); - } - - getClusterConfiguration(dbCluster: DBCluster): Promise { - return apiManagement - .post>('/DBaaS/DBClusters/Get', { - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - }) - .then((result): DBClusterPayload => result?.psmdb_cluster); - } - - toModel(dbCluster: DBClusterPayload, kubernetesClusterName: string, databaseType: Databases): DBCluster { - return { - clusterName: dbCluster.name, - kubernetesClusterName, - databaseType, - clusterSize: dbCluster.params.cluster_size, - memory: (dbCluster.params.replicaset?.compute_resources?.memory_bytes || 0) / BILLION, - cpu: (dbCluster.params.replicaset?.compute_resources?.cpu_m || 0) / THOUSAND, - disk: (dbCluster.params.replicaset?.disk_size || 0) / BILLION, - status: dbCluster.state || DBClusterStatus.changing, - message: dbCluster.operation?.message, - finishedSteps: dbCluster.operation?.finished_steps || 0, - totalSteps: dbCluster.operation?.total_steps || 0, - expose: dbCluster.exposed, - installedImage: dbCluster.installed_image, - availableImage: dbCluster.available_image, - template: dbCluster.template, - sourceRanges: dbCluster.source_ranges, - }; - } -} - -const toAPI = (dbCluster: DBCluster): DBClusterPayload => ({ - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - expose: dbCluster.expose, - internet_facing: dbCluster.internetFacing, - source_ranges: dbCluster.sourceRanges, - params: { - cluster_size: dbCluster.clusterSize, - replicaset: { - compute_resources: { - cpu_m: dbCluster.cpu * THOUSAND, - memory_bytes: dbCluster.memory * BILLION, - }, - storage_class: dbCluster.storageClass, - disk_size: dbCluster.disk * BILLION, - }, - image: dbCluster.databaseImage, - ...(dbCluster.backup && { - backup: { - location_id: dbCluster.backup?.locationId, - keep_copies: dbCluster.backup?.keepCopies, - cron_expression: dbCluster.backup?.cronExpression, - service_account: dbCluster.backup?.serviceAccount, - }, - }), - ...(dbCluster.restore && { - restore: { - location_id: dbCluster.restore?.locationId, - destination: dbCluster.restore?.destination, - secrets_name: dbCluster.restore?.secretsName, - }, - }), - }, - ...(dbCluster.template && { - template: { - name: dbCluster.template.name, - kind: dbCluster.template.kind, - }, - }), -}); - -const toSuspendAPI = (dbCluster: DBCluster) => ({ - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - params: { - suspend: true, - }, -}); - -const toResumeAPI = (dbCluster: DBCluster) => ({ - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - params: { - resume: true, - }, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.messages.ts b/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.messages.ts deleted file mode 100644 index 999e1f00cb4f0..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.messages.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ResourcesWithUnits } from '../DBCluster.types'; - -export const Messages = { - buildResourcesLabel: ( - allocated: ResourcesWithUnits, - allocatedWidth: number, - total: ResourcesWithUnits, - emptyValueMessage?: string - ) => - isNaN(allocated.value) && emptyValueMessage - ? emptyValueMessage - : `Using ${allocated.value} ${allocated.units} (${allocatedWidth}%) of ${total.value} ${total.units} in total`, - buildExpectedLabel: (expected: ResourcesWithUnits, resourceLabel: string) => - `Required ${resourceLabel} (${expected.value} ${expected.units})`, - buildExpectedAllocatedLabel: (expectedDowsize: ResourcesWithUnits, resourceLabel: string) => - `Expected Consumed ${resourceLabel} (${expectedDowsize.value} ${expectedDowsize.units})`, - buildAllocatedLabel: (resourceLabel: string) => `Consumed ${resourceLabel}`, - buildInsufficientLabel: (expected: ResourcesWithUnits, resourceLabel: string) => - `Insufficient ${resourceLabel} (${expected.value} ${expected.units} required)`, -}; diff --git a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.styles.ts b/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.styles.ts deleted file mode 100644 index 997cbe9d72642..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.styles.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -const expectedColor = '#043464'; - -export const getStyles = ({ colors, palette, spacing, typography }: GrafanaTheme) => ({ - resourcesBarWrapper: css` - display: flex; - flex-direction: row; - `, - iconWrapper: css` - margin-right: ${spacing.sm}; - `, - resourcesBarContent: css` - display: flex; - flex: 1; - flex-direction: column; - `, - resourcesBarBackground: css` - background-color: ${palette.gray1}; - border-radius: 50px; - height: ${spacing.sm}; - position: relative; - width: 100%; - `, - resourcesBarLabel: css` - color: ${colors.textSemiWeak}; - font-size: ${typography.size.sm}; - margin-top: ${spacing.xs}; - `, - captionWrapper: css` - align-items: center; - display: flex; - margin-top: ${spacing.xs}; - max-height: ${typography.size.lg}; - `, - captionSquare: css` - width: 10px; - height: 10px; - `, - allocatedSquare: css` - background-color: ${palette.blue80}; - `, - expectedSquare: css` - background-color: ${expectedColor}; - `, - expectedAllocatedSquare: css` - background-color: ${palette.greenBase}; - `, - captionLabel: css` - color: ${colors.textSemiWeak}; - font-size: ${typography.size.sm}; - margin-left: ${spacing.sm}; - `, - filled: css` - border-radius: inherit; - height: 100%; - position: absolute; - transition: width 300ms ease-in-out; - `, - filledAllocated: css` - background-color: ${palette.blue80}; - `, - filledExpected: css` - background-color: ${expectedColor}; - `, - filledExpectedAllocated: css` - background-color: ${palette.greenBase}; - `, - filledInsufficient: css` - background-color: ${palette.brandDanger}; - `, - insufficientIcon: css` - color: ${palette.brandDanger}; - `, - getFilledStyles: (width: number) => css` - width: ${width}%; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.test.tsx b/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.test.tsx deleted file mode 100644 index 0755884a8b12c..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.test.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { ResourcesUnits } from '../DBCluster.types'; - -import { ResourcesBar } from './ResourcesBar'; -import { Messages } from './ResourcesBar.messages'; - -describe('ResourcesBar::', () => { - it('renders correctly with icon, allocated, expected and label', () => { - const allocated = { value: 2, units: ResourcesUnits.GB, original: 2 }; - const total = { value: 10, units: ResourcesUnits.GB, original: 10 }; - const expected = { value: 2, units: ResourcesUnits.GB, original: 2 }; - const resourceLabel = 'Memory'; - render( - Test icon
} - allocated={allocated} - expected={expected} - total={total} - resourceLabel={resourceLabel} - /> - ); - - expect(screen.getByTestId('resources-bar-icon')).toHaveTextContent('Test icon'); - expect(screen.getByTestId('resources-bar-label')).toHaveTextContent( - Messages.buildResourcesLabel(allocated, 20, total) - ); - expect(screen.getByTestId('resources-bar-allocated-caption')).toHaveTextContent( - Messages.buildAllocatedLabel(resourceLabel) - ); - expect(screen.getByTestId('resources-bar-expected-caption')).toHaveTextContent( - Messages.buildExpectedLabel(expected, resourceLabel) - ); - }); - it('renders invalid message for insufficient resources', () => { - const allocated = { value: 2, units: ResourcesUnits.GB, original: 2 }; - const total = { value: 10, units: ResourcesUnits.GB, original: 10 }; - const expected = { value: 20, units: ResourcesUnits.GB, original: 20 }; - const resourceLabel = 'Memory'; - render(); - - expect(screen.getByTestId('resources-bar-insufficient-resources')).toHaveTextContent( - Messages.buildInsufficientLabel(expected, resourceLabel) - ); - }); - it('renders correctly when expected value is negative', () => { - const allocated = { value: 4, units: ResourcesUnits.GB, original: 4 }; - const total = { value: 10, units: ResourcesUnits.GB, original: 10 }; - const expected = { value: -2, units: ResourcesUnits.GB, original: -2 }; - render( - Test icon
} - allocated={allocated} - expected={expected} - total={total} - resourceLabel="Test label" - /> - ); - - const resourcesBar = screen.getByTestId('resources-bar'); - - expect(resourcesBar.children).toHaveLength(1); - expect(resourcesBar.children[0].children).toHaveLength(1); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.tsx b/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.tsx deleted file mode 100644 index c605cdecaaa4d..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { cx } from '@emotion/css'; -import React, { FC } from 'react'; - -import { Icon, useStyles } from '@grafana/ui'; - -import { Messages } from './ResourcesBar.messages'; -import { getStyles } from './ResourcesBar.styles'; -import { ResourcesBarProps } from './ResourcesBar.types'; -import { - formatResources, - getExpectedAllocated, - getExpectedAllocatedWidth, - getResourcesWidth, -} from './ResourcesBar.utils'; - -export const ResourcesBar: FC = ({ - total, - allocated, - expected, - resourceLabel, - resourceEmptyValueMessage, - icon, - dataTestId, - className, -}) => { - const styles = useStyles(getStyles); - const requiredResources = allocated && expected ? allocated.original + expected.original : undefined; - const allocatedWidth = getResourcesWidth(allocated?.original, total?.original); - const expectedWidth = getResourcesWidth(requiredResources, total?.original); - const expectedAllocatedWidth = getExpectedAllocatedWidth(expected, allocated); - const expectedAllocated = getExpectedAllocated(expected, allocated); - const isDownsize = expected && expected.value < 0; - const isResourceInsufficient = requiredResources && total ? requiredResources > total.original : false; - const expectedSquareStyles = { - [styles.expectedSquare]: !isDownsize, - [styles.expectedAllocatedSquare]: isDownsize, - }; - - return ( -
-
- {icon} -
-
-
- {isResourceInsufficient ? ( -
- ) : ( - !isDownsize && ( -
- ) - )} - {allocated && ( -
- {isDownsize && ( -
- )} -
- )} -
- {allocated && total && ( - - {Messages.buildResourcesLabel( - formatResources(allocated), - allocatedWidth, - formatResources(total), - resourceEmptyValueMessage - )} - - )} - {allocated && ( -
-
- - {Messages.buildAllocatedLabel(resourceLabel)} - -
- )} - {expected && expected.value !== 0 && !isResourceInsufficient && ( -
-
- - {isDownsize - ? Messages.buildExpectedAllocatedLabel(formatResources(expectedAllocated), resourceLabel) - : Messages.buildExpectedLabel(formatResources(expected), resourceLabel)} - -
- )} - {expected && isResourceInsufficient && ( -
- - - {Messages.buildInsufficientLabel(formatResources(expected), resourceLabel)} - -
- )} -
-
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.types.ts b/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.types.ts deleted file mode 100644 index 7db80e3702edf..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.types.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ReactNode } from 'react'; - -import { ResourcesWithUnits } from '../DBCluster.types'; - -export interface ResourcesBarProps { - total: ResourcesWithUnits | undefined; - allocated: ResourcesWithUnits | undefined; - expected: ResourcesWithUnits | undefined; - resourceLabel: string; - resourceEmptyValueMessage?: string; - icon?: ReactNode; - dataTestId?: string; - className?: string; -} diff --git a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.test.ts b/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.test.ts deleted file mode 100644 index 57069f11ba0bd..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ResourcesUnits, ResourcesWithUnits } from '../DBCluster.types'; -import { resourcesA, resourcesB } from '../__mocks__/dbClustersStubs'; - -import { - formatResources, - getExpectedAllocated, - getExpectedAllocatedWidth, - getResourcesWidth, -} from './ResourcesBar.utils'; - -describe('ResourcesBar.utils::', () => { - it('returns correct width', () => { - expect(getResourcesWidth(1.5, 6)).toEqual(25); - expect(getResourcesWidth(1.6, 6)).toEqual(26.7); - expect(getResourcesWidth(5.6, 64)).toEqual(8.8); - expect(getResourcesWidth(63.8, 64)).toEqual(99.7); - expect(getResourcesWidth(10, 80)).toEqual(12.5); - expect(getResourcesWidth(20, 80)).toEqual(25); - }); - - it('formats resources to 2 decimal places if needed', () => { - const getValueWithUnits = (value: number) => ({ value, units: ResourcesUnits.GB } as ResourcesWithUnits); - - expect(formatResources(getValueWithUnits(0.04))).toEqual(getValueWithUnits(0.04)); - expect(formatResources(getValueWithUnits(0.004))).toEqual(getValueWithUnits(0)); - expect(formatResources(getValueWithUnits(0.07340032))).toEqual(getValueWithUnits(0.07)); - expect(formatResources(getValueWithUnits(0.076))).toEqual(getValueWithUnits(0.08)); - expect(formatResources(getValueWithUnits(4.129873))).toEqual(getValueWithUnits(4.13)); - expect(formatResources(getValueWithUnits(0.65))).toEqual(getValueWithUnits(0.65)); - expect(formatResources(getValueWithUnits(6))).toEqual(getValueWithUnits(6)); - }); - - it('returns correct expected allocated width', () => { - expect(getExpectedAllocatedWidth(undefined, undefined)).toBe(0); - expect(getExpectedAllocatedWidth(resourcesB, resourcesA)).toBe(0); - expect(getExpectedAllocatedWidth({ ...resourcesA, original: -40 }, resourcesB)).toBe(0); - expect(getExpectedAllocatedWidth(resourcesA, resourcesB)).toBe(50); - expect(getExpectedAllocatedWidth({ ...resourcesA, original: -5 }, resourcesB)).toBe(75); - expect(getExpectedAllocatedWidth({ ...resourcesA, original: -1 }, { ...resourcesA, original: 4 })).toBe(75); - }); - - it('returns correct expected allocated value', () => { - expect(getExpectedAllocated(undefined, undefined)).toEqual({ - value: 0, - original: 0, - units: ResourcesUnits.BYTES, - }); - expect(getExpectedAllocated(resourcesA, resourcesA)).toEqual({ - value: 20, - original: 20, - units: ResourcesUnits.BYTES, - }); - expect(getExpectedAllocated(resourcesA, resourcesB)).toEqual({ - value: 30, - original: 30, - units: ResourcesUnits.BYTES, - }); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.ts b/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.ts deleted file mode 100644 index 0c9dd9a368515..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ResourcesUnits, ResourcesWithUnits } from '../DBCluster.types'; -import { getResourcesSum } from '../DBCluster.utils'; - -export const getResourcesWidth = (allocated?: number, total?: number) => { - if (!allocated || !total || total <= 0) { - return 0; - } - - return Math.round(((allocated * 100) / total) * 10) / 10; -}; - -export const formatResources = (resource: ResourcesWithUnits) => ({ - ...resource, - value: Math.round(resource.value * 100 + Number.EPSILON) / 100, -}); - -export const getExpectedAllocatedWidth = (expected?: ResourcesWithUnits, allocated?: ResourcesWithUnits) => { - if (!expected || !allocated || Math.abs(expected.original) > allocated.original) { - return 0; - } - - return 100 - Math.abs(getResourcesWidth(expected.original, allocated.original)); -}; - -export const getExpectedAllocated = ( - expected?: ResourcesWithUnits, - allocated?: ResourcesWithUnits -): ResourcesWithUnits => { - if (!expected || !allocated || Math.abs(expected.original) > allocated.original) { - return { value: 0, original: 0, units: expected?.units || ResourcesUnits.BYTES }; - } - - return getResourcesSum(expected, allocated) as ResourcesWithUnits; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.messages.tsx b/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.messages.tsx deleted file mode 100644 index d33a3dec242ff..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.messages.tsx +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable react/display-name */ -import React, { ReactNode } from 'react'; - -import { Databases } from 'app/percona/shared/core'; -import { DATABASE_LABELS } from 'app/percona/shared/core/constants'; - -export const Messages = { - cancel: 'Cancel', - confirm: 'Update', - title: 'Confirm database update', - buildUpdateDatabaseMessage: ( - databaseType: Databases, - installedVersion: ReactNode, - availableVersion: ReactNode, - clusterName: ReactNode - ) => ( - <> - Are you sure you want to update {DATABASE_LABELS[databaseType]} {installedVersion} to version {availableVersion}{' '} - in {clusterName} cluster? - - ), -}; diff --git a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.styles.ts b/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.styles.ts deleted file mode 100644 index efd1f59f7dd54..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.styles.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ palette, spacing }: GrafanaTheme) => ({ - modalWrapper: css` - div[data-testid='modal-body'] { - max-width: none; - } - `, - updateModalContent: css` - margin-bottom: ${spacing.xl}; - `, - highlight: css` - color: ${palette.warn}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.test.tsx b/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.test.tsx deleted file mode 100644 index c280d1f63900a..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.test.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { fireEvent, render, waitFor } from '@testing-library/react'; -import React from 'react'; - -import { dataTestId } from 'app/percona/shared/helpers/utils'; - -import { dbClustersStub } from '../__mocks__/dbClustersStubs'; - -import { UpdateDBClusterModal } from './UpdateDBClusterModal'; - -jest.mock('../XtraDB.service'); - -describe('UpdateDBClusterModal::', () => { - it('should render message with new database version', () => { - const { container } = render( - - ); - const message = 'MySQL 5.6 to version 8.0 in dbcluster1'; - - expect(container.querySelector(dataTestId('update-dbcluster-message'))?.textContent).toContain(message); - }); - - it('should call onUpdateFinished after update', async () => { - const onUpdateFinished = jest.fn(); - const { container } = render( - - ); - - const button = container.querySelector(dataTestId('confirm-update-dbcluster-button')); - - fireEvent.click(button!); - - await waitFor(() => expect(onUpdateFinished).toHaveBeenCalledTimes(1)); - }); -}); diff --git a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.tsx b/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.tsx deleted file mode 100644 index 5e0ab6fb274cc..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React, { FC, useCallback } from 'react'; - -import { Button, HorizontalGroup, useStyles } from '@grafana/ui'; -import { Modal } from 'app/percona/shared/components/Elements/Modal'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { formatDBClusterVersionWithBuild, newDBClusterService } from '../DBCluster.utils'; - -import { Messages } from './UpdateDBClusterModal.messages'; -import { getStyles } from './UpdateDBClusterModal.styles'; -import { UpdateDBClusterModalProps } from './UpdateDBClusterModal.types'; - -const { title, confirm, cancel, buildUpdateDatabaseMessage } = Messages; - -export const UpdateDBClusterModal: FC = ({ - dbCluster, - isVisible, - setVisible, - setLoading, - onUpdateFinished, -}) => { - const styles = useStyles(getStyles); - const { clusterName, databaseType, installedImage, availableImage } = dbCluster; - - const onClose = useCallback(() => setVisible(false), [setVisible]); - - const update = useCallback(async () => { - try { - setLoading(true); - onClose(); - const dbClusterService = newDBClusterService(dbCluster?.databaseType); - - await dbClusterService.updateDBCluster({ ...dbCluster, databaseImage: availableImage }); - onUpdateFinished(); - } catch (e) { - setLoading(false); - logger.error(e); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dbCluster, onUpdateFinished]); - - return ( -
- -

- {buildUpdateDatabaseMessage( - databaseType, - {formatDBClusterVersionWithBuild(installedImage)}, - {formatDBClusterVersionWithBuild(availableImage)}, - {clusterName} - )} -

- - - - -
-
- ); -}; diff --git a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.types.ts b/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.types.ts deleted file mode 100644 index c5be879b73b56..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/UpdateDBClusterModal/UpdateDBClusterModal.types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DBCluster } from '../DBCluster.types'; - -export interface UpdateDBClusterModalProps { - dbCluster: DBCluster; - isVisible: boolean; - setVisible: (value: boolean) => void; - setLoading: (loading: boolean) => void; - onUpdateFinished: () => void; -} diff --git a/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts b/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts deleted file mode 100644 index 6d40e91f01d8b..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/XtraDB.service.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { omit, pick } from 'lodash'; - -import { Databases } from 'app/percona/shared/core'; -import { apiManagement } from 'app/percona/shared/helpers/api'; - -import { - ManageComponentsVersionsRenderProps, - SupportedComponents, -} from '../Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types'; - -import { BILLION, THOUSAND } from './DBCluster.constants'; -import { DBClusterService } from './DBCluster.service'; -import { getComponentChange } from './DBCluster.service.utils'; -import { - DatabaseVersion, - CpuUnits, - DBCluster, - DBClusterActionAPI, - DBClusterComponents, - DBClusterConnectionAPI, - DBClusterExpectedResources, - DBClusterExpectedResourcesAPI, - DBClusterPayload, - ResourcesUnits, - DBClusterComponent, - DBClusterChangeComponentsAPI, - DBClusterType, - DBClusterStatus, - DBClusterSuspendResumeRequest, - DBClusterConfigurationAPI, -} from './DBCluster.types'; -import { Operators } from './EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -export class XtraDBService extends DBClusterService { - addDBCluster(dbCluster: DBCluster): Promise { - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - return apiManagement.post('/DBaaS/PXCCluster/Create', toAPI(dbCluster)); - } - - updateDBCluster(dbCluster: DBCluster): Promise { - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - return apiManagement.post('/DBaaS/PXCCluster/Update', toAPI(dbCluster)); - } - - resumeDBCluster(dbCluster: DBCluster): Promise { - return apiManagement.post( - '/DBaaS/PXCCluster/Update', - toResumeAPI(dbCluster) - ); - } - - suspendDBCluster(dbCluster: DBCluster): Promise { - return apiManagement.post( - '/DBaaS/PXCCluster/Update', - toSuspendAPI(dbCluster) - ); - } - - deleteDBClusters(dbCluster: DBCluster): Promise { - const body = { - name: dbCluster.clusterName, - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - cluster_type: DBClusterType.pxc, - }; - - return apiManagement.post('/DBaaS/DBClusters/Delete', body); - } - - getDBClusterCredentials(dbCluster: DBCluster): Promise { - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - return apiManagement.post( - '/DBaaS/PXCClusters/GetCredentials', - omit(toAPI(dbCluster), ['params']) - ); - } - - restartDBCluster(dbCluster: DBCluster): Promise { - const body = { - name: dbCluster.clusterName, - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - cluster_type: DBClusterType.pxc, - }; - - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - return apiManagement.post('/DBaaS/DBClusters/Restart', body); - } - - getComponents(kubernetesClusterName: string): Promise { - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - return apiManagement.post('/DBaaS/Components/GetPXC', { - kubernetes_cluster_name: kubernetesClusterName, - }); - } - - setComponents(kubernetesClusterName: string, componentsVersions: ManageComponentsVersionsRenderProps): Promise { - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - return apiManagement.post('/DBaaS/Components/ChangePXC', { - kubernetes_cluster_name: kubernetesClusterName, - pxc: getComponentChange(Operators.pxc, SupportedComponents.pxc, componentsVersions), - haproxy: getComponentChange(Operators.pxc, SupportedComponents.haproxy, componentsVersions), - }); - } - - getDatabaseVersions(kubernetesClusterName: string): Promise { - return this.getComponents(kubernetesClusterName).then(({ versions }) => { - /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */ - return Object.entries(versions[0].matrix.pxc as DBClusterComponent).map(([version, component]) => ({ - value: component.image_path, - label: version, - default: !!component.default, - disabled: !!component.disabled, - })); - }); - } - - getExpectedResources(dbCluster: DBCluster): Promise { - return apiManagement - .post>( - '/DBaaS/PXCCluster/Resources/Get', - pick(toAPI(dbCluster), ['params']) - ) - .then(({ expected }: DBClusterExpectedResourcesAPI) => ({ - expected: { - cpu: { value: expected.cpu_m / THOUSAND, units: CpuUnits.MILLI, original: +expected.cpu_m }, - memory: { - value: expected.memory_bytes / BILLION, - units: ResourcesUnits.GB, - original: +expected.memory_bytes, - }, - disk: { value: expected.disk_size / BILLION, units: ResourcesUnits.GB, original: +expected.disk_size }, - }, - })); - } - - getClusterConfiguration(dbCluster: DBCluster): Promise { - return apiManagement - .post>('/DBaaS/DBClusters/Get', { - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - }) - .then((result): DBClusterPayload => result?.pxc_cluster); - } - - toModel(dbCluster: DBClusterPayload, kubernetesClusterName: string, databaseType: Databases): DBCluster { - return { - clusterName: dbCluster.name, - kubernetesClusterName, - databaseType, - clusterSize: dbCluster.params.cluster_size, - memory: (dbCluster.params.pxc?.compute_resources?.memory_bytes || 0) / BILLION, - cpu: (dbCluster.params.pxc?.compute_resources?.cpu_m || 0) / THOUSAND, - disk: (dbCluster.params.pxc?.disk_size || 0) / BILLION, - status: dbCluster.state || DBClusterStatus.changing, - message: dbCluster.operation?.message, - finishedSteps: dbCluster.operation?.finished_steps || 0, - totalSteps: dbCluster.operation?.total_steps || 0, - expose: dbCluster.exposed, - installedImage: dbCluster.installed_image, - availableImage: dbCluster.available_image, - template: dbCluster.template, - sourceRanges: dbCluster.source_ranges, - }; - } -} - -const toAPI = (dbCluster: DBCluster): DBClusterPayload => ({ - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - expose: dbCluster.expose, - internet_facing: dbCluster.internetFacing, - source_ranges: dbCluster.sourceRanges, - params: { - cluster_size: dbCluster.clusterSize, - pxc: { - compute_resources: { - cpu_m: dbCluster.cpu * THOUSAND, - memory_bytes: dbCluster.memory * BILLION, - }, - disk_size: dbCluster.disk * BILLION, - configuration: dbCluster.configuration, - storage_class: dbCluster.storageClass, - image: dbCluster.databaseImage, - }, - // Temporary mock data - haproxy: { - compute_resources: { - cpu_m: THOUSAND / 2, - memory_bytes: 0.5 * BILLION, - }, - }, - ...(dbCluster.backup && { - backup: { - location_id: dbCluster.backup?.locationId, - keep_copies: dbCluster.backup?.keepCopies, - cron_expression: dbCluster.backup?.cronExpression, - service_account: dbCluster.backup?.serviceAccount, - }, - }), - ...(dbCluster.restore && { - restore: { - location_id: dbCluster.restore?.locationId, - destination: dbCluster.restore?.destination, - secrets_name: dbCluster.restore?.secretsName, - }, - }), - }, - ...(dbCluster.template && { - template: { - name: dbCluster.template.name, - kind: dbCluster.template.kind, - }, - }), -}); - -const toSuspendAPI = (dbCluster: DBCluster) => ({ - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - params: { - suspend: true, - }, -}); - -const toResumeAPI = (dbCluster: DBCluster) => ({ - kubernetes_cluster_name: dbCluster.kubernetesClusterName, - name: dbCluster.clusterName, - params: { - resume: true, - }, -}); diff --git a/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.hooks.ts b/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.hooks.ts deleted file mode 100644 index cf1208a7882a4..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.hooks.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Kubernetes } from 'app/percona/dbaas/components/Kubernetes/Kubernetes.types'; - -import { DBCluster, ManageDBClusters } from '../DBCluster.types'; - -import { dbClustersStub, getDBClustersActionStub } from './dbClustersStubs'; - -export const useDBClusters = (kubernetes: Kubernetes[]): ManageDBClusters => { - const dbClusters: DBCluster[] = []; - - if (kubernetes.length > 0) { - dbClusters.push(...dbClustersStub); - } - - return [dbClusters, getDBClustersActionStub, () => {}, false]; -}; diff --git a/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts b/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts deleted file mode 100644 index 219b6cb526cf6..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/__mocks__/DBCluster.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { DBClusterAllocatedResources } from '../DBCluster.types'; - -import { dbCLusterAllocatedResourcesStub, dbClusterLogsAPI, dbClusterTemplatesApi } from './dbClustersStubs'; - -export class DBClusterService { - static async getLogs() { - return dbClusterLogsAPI; - } - - static async getAllocatedResources(): Promise { - return Promise.resolve(dbCLusterAllocatedResourcesStub); - } - static async getDBClusters() { - return Promise.resolve(); - } - - static getDBClusterTemplates() { - return Promise.resolve(dbClusterTemplatesApi); - } -} diff --git a/public/app/percona/dbaas/components/DBCluster/__mocks__/PSMDB.service.ts b/public/app/percona/dbaas/components/DBCluster/__mocks__/PSMDB.service.ts deleted file mode 100644 index 64a5b5db475fb..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/__mocks__/PSMDB.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { - dbClusterExpectedResourcesStub, - mongoDBClusterConnectionStub, - psmdbComponentsVersionsStubs, -} from './dbClustersStubs'; - -export class PSMDBService { - getDBClusterCredentials() { - return { connection_credentials: mongoDBClusterConnectionStub }; - } - - restartDBCluster() {} - - getExpectedResources() { - return Promise.resolve(dbClusterExpectedResourcesStub); - } - - getComponents() { - return Promise.resolve(psmdbComponentsVersionsStubs); - } - - updateDBCluster() { - return Promise.resolve(); - } -} diff --git a/public/app/percona/dbaas/components/DBCluster/__mocks__/XtraDB.service.ts b/public/app/percona/dbaas/components/DBCluster/__mocks__/XtraDB.service.ts deleted file mode 100644 index 2001ecd85a577..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/__mocks__/XtraDB.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { - dbClusterExpectedResourcesStub, - xtraDBClusterConnectionStub, - xtradbComponentsVersionsStubs, -} from './dbClustersStubs'; - -export class XtraDBService { - getDBClusterCredentials() { - return { connection_credentials: xtraDBClusterConnectionStub }; - } - - restartDBCluster() {} - - getExpectedResources() { - return Promise.resolve(dbClusterExpectedResourcesStub); - } - - getComponents() { - return Promise.resolve(xtradbComponentsVersionsStubs); - } - - updateDBCluster() { - return Promise.resolve(); - } -} diff --git a/public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts b/public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts deleted file mode 100644 index 953bdc71c3de2..0000000000000 --- a/public/app/percona/dbaas/components/DBCluster/__mocks__/dbClustersStubs.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { Databases } from 'app/percona/shared/core'; - -import { - CpuUnits, - DBCluster, - DBClusterConnection, - DBClusterStatus, - ResourcesUnits, - DBClusterComponentVersionStatus, - DBClusterAllocatedResources, - ResourcesWithUnits, - DBClusterTemplate, -} from '../DBCluster.types'; -import { Operators } from '../EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -export const dbClustersStub: DBCluster[] = [ - { - kubernetesClusterName: 'Kubernetes Cluster 1', - clusterName: 'dbcluster1', - databaseType: Databases.mysql, - clusterSize: 3, - memory: 1024, - cpu: 1, - disk: 25, - status: DBClusterStatus.ready, - finishedSteps: 5, - totalSteps: 10, - expose: true, - installedImage: 'percona/percona-xtra-dbcluster:5.6', - availableImage: 'percona/percona-xtra-dbcluster:8.0', - }, - { - kubernetesClusterName: 'Kubernetes Cluster 2', - clusterName: 'dbcluster2', - databaseType: Databases.mysql, - clusterSize: 7, - memory: 2048, - cpu: 4, - disk: 25, - finishedSteps: 7, - totalSteps: 7, - expose: false, - installedImage: 'percona/percona-xtra-dbcluster:8.0', - }, - { - kubernetesClusterName: 'Kubernetes Cluster 1', - clusterName: 'mongodbcluster1', - databaseType: Databases.mongodb, - clusterSize: 3, - memory: 0, - cpu: 0, - disk: 25, - status: DBClusterStatus.ready, - finishedSteps: 1, - totalSteps: 2, - expose: false, - }, - { - kubernetesClusterName: 'Kubernetes Cluster 2', - clusterName: 'dbcluster3', - databaseType: Databases.mysql, - clusterSize: 7, - memory: 2048, - cpu: 4, - disk: 25, - status: DBClusterStatus.failed, - message: 'Cluster creation failed', - finishedSteps: 0, - totalSteps: 2, - expose: false, - }, - { - kubernetesClusterName: 'Kubernetes Cluster 1', - clusterName: 'dbcluster4', - databaseType: Databases.mysql, - clusterSize: 3, - memory: 1024, - cpu: 1, - disk: 25, - status: DBClusterStatus.failed, - finishedSteps: 5, - totalSteps: 10, - }, - { - kubernetesClusterName: 'Kubernetes Cluster 1', - clusterName: 'dbcluster5', - databaseType: Databases.mysql, - clusterSize: 3, - memory: 1024, - cpu: 1, - disk: 25, - status: DBClusterStatus.suspended, - finishedSteps: 5, - totalSteps: 10, - }, - { - kubernetesClusterName: 'Kubernetes Cluster 1', - clusterName: 'dbcluster5', - databaseType: Databases.mysql, - clusterSize: 3, - memory: 1024, - cpu: 1, - disk: 25, - status: DBClusterStatus.upgrading, - finishedSteps: 5, - totalSteps: 10, - }, - { - kubernetesClusterName: 'Kubernetes Cluster 1', - clusterName: 'dbcluster5', - databaseType: Databases.mysql, - clusterSize: 3, - memory: 1024, - cpu: 1, - disk: 25, - status: DBClusterStatus.changing, - finishedSteps: 5, - totalSteps: 10, - }, - { - kubernetesClusterName: 'Kubernetes Cluster 1', - clusterName: 'dbcluster5', - databaseType: Databases.mysql, - clusterSize: 3, - memory: 1024, - cpu: 1, - disk: 25, - status: DBClusterStatus.deleting, - finishedSteps: 5, - totalSteps: 10, - }, -]; - -export const xtraDBClusterConnectionStub: DBClusterConnection = { - host: 'dbcluster-haproxy', - password: '1234', - port: 3000, - username: 'root', -}; - -export const mongoDBClusterConnectionStub: DBClusterConnection = { - host: 'dbcluster-psmdb', - password: '1234', - port: 3000, - username: 'root', -}; - -export const getDBClustersActionStub = jest.fn(); - -export const dbClusterLogsAPI = { - logs: [ - { - pod: 'testpod1', - container: 'testpod1container1', - logs: ['test pod1', 'logs', '1'], - }, - { - pod: 'testpod1', - container: 'testpod1container2', - logs: ['test pod1', 'logs', '2'], - }, - { - pod: 'testpod1', - logs: ['test pod1', 'events'], - }, - { - pod: 'testpod2', - container: 'testpod2container1', - logs: ['test pod2', 'logs', '1'], - }, - { - pod: 'testpod2', - logs: ['test pod2', 'events'], - }, - { - pod: 'testpod2', - container: 'testpod2container2', - logs: [], - }, - ], -}; - -export const dbClusterTemplatesApi: DBClusterTemplate[] = [ - { - name: 'template-name', - kind: 'template-kind', - }, -]; - -export const dbCLusterAllocatedResourcesStub: DBClusterAllocatedResources = { - total: { - cpu: { value: 10, units: CpuUnits.MILLI, original: 10 }, - memory: { value: 10, units: ResourcesUnits.GB, original: 10 }, - disk: { value: 100, units: ResourcesUnits.GB, original: 100 }, - }, - allocated: { - cpu: { value: 1, units: CpuUnits.MILLI, original: 1 }, - memory: { value: 3, units: ResourcesUnits.GB, original: 3 }, - disk: { value: 10, units: ResourcesUnits.GB, original: 10 }, - }, -}; - -export const dbClusterExpectedResourcesStub = { - expected: { - memory: { value: 4, units: ResourcesUnits.GB }, - cpu: { value: 4, units: CpuUnits.MILLI }, - disk: { value: 20, units: ResourcesUnits.GB }, - }, -}; - -export const versionsStub = { - '1.0': { - image_path: 'test_image', - image_hash: 'test_hash', - status: DBClusterComponentVersionStatus.available, - critical: false, - default: false, - }, - '2.0': { - image_path: 'test_image', - image_hash: 'test_hash', - status: DBClusterComponentVersionStatus.recommended, - critical: false, - default: true, - }, -}; - -export const xtradbComponentsVersionsStubs = { - versions: [ - { - product: Operators.pxc, - operator: '1', - matrix: { - pxc: versionsStub, - haproxy: versionsStub, - }, - }, - ], -}; - -export const psmdbComponentsVersionsStubs = { - versions: [ - { - product: Operators.psmdb, - operator: '1', - matrix: { - mongod: versionsStub, - }, - }, - ], -}; - -export const resourcesA: ResourcesWithUnits = { - value: 10, - original: 10, - units: ResourcesUnits.BYTES, -}; - -export const resourcesB: ResourcesWithUnits = { - value: 20, - original: 20, - units: ResourcesUnits.BYTES, -}; - -export const resourcesC: ResourcesWithUnits = { - value: 20, - original: 20, - units: ResourcesUnits.GB, -}; diff --git a/public/app/percona/dbaas/components/DBaaSIcons/CPU.tsx b/public/app/percona/dbaas/components/DBaaSIcons/CPU.tsx deleted file mode 100644 index c4d1016f2a543..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSIcons/CPU.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React, { FC, SVGProps } from 'react'; - -export const CPU: FC> = (props) => ( - - - -); diff --git a/public/app/percona/dbaas/components/DBaaSIcons/Disk.tsx b/public/app/percona/dbaas/components/DBaaSIcons/Disk.tsx deleted file mode 100644 index 0862e5a07cdd0..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSIcons/Disk.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React, { FC, SVGProps } from 'react'; - -export const Disk: FC> = (props) => ( - - - -); diff --git a/public/app/percona/dbaas/components/DBaaSIcons/Memory.tsx b/public/app/percona/dbaas/components/DBaaSIcons/Memory.tsx deleted file mode 100644 index 5f0e6c357e281..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSIcons/Memory.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React, { FC, SVGProps } from 'react'; - -export const Memory: FC> = (props) => ( - - - - -); diff --git a/public/app/percona/dbaas/components/DBaaSIcons/index.ts b/public/app/percona/dbaas/components/DBaaSIcons/index.ts deleted file mode 100644 index 4af3fefffef01..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSIcons/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './Memory'; -export * from './Disk'; -export * from './CPU'; diff --git a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.styles.ts b/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.styles.ts deleted file mode 100644 index 4b6b7fe10e450..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.styles.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing, breakpoints }: GrafanaTheme) => ({ - pageToolbarWrapper: css` - display: flex; - align-items: flex-start; - padding-right: ${spacing.lg}; - `, - pageContent: css` - padding: 0 ${spacing.lg}; - width: ${breakpoints.xxl}; - `, - - scrollWrapper: css` - width: 100%; - display: flex; - overflow: scroll; - height: 85vh; - `, -}); diff --git a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.tsx b/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.tsx deleted file mode 100644 index d88bb787d4add..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { FC } from 'react'; - -import { PageToolbar, useStyles } from '@grafana/ui/src'; - -import { FeatureLoader } from '../../../shared/components/Elements/FeatureLoader'; - -import { getStyles } from './DBaaSPage.styles'; -import { DBaaSPageProps } from './DBaaSPage.types'; -import DBaaSPageButtons from './DBaaSPageButtons/DBaaSPageButtons'; -import { PageHeader } from './PageHeader/PageHeader'; - -export const DBaaSPage: FC = ({ - pageToolbarProps, - pageName, - cancelUrl, - submitBtnProps, - pageHeader, - children, - featureLoaderProps, -}) => { - const styles = useStyles(getStyles); - - return ( - <> - - - - - -
-
{children}
-
-
- - ); -}; - -export default DBaaSPage; diff --git a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.types.ts b/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.types.ts deleted file mode 100644 index 1b846825f8c85..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPage.types.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Props } from '@grafana/ui/src/components/PageLayout/PageToolbar'; -import { LoaderButtonProps } from 'app/percona/shared/components/Elements/LoaderButton'; - -import { FeatureLoaderProps } from '../../../shared/components/Elements/FeatureLoader/FeatureLoader.types'; - -export interface DBaaSPageProps { - pageToolbarProps: Props; - submitBtnProps: LoaderButtonProps & { buttonMessage?: string }; - pageHeader: string; - pageName: string; - cancelUrl: string; - children: React.ReactNode; - featureLoaderProps: FeatureLoaderProps; -} diff --git a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.messages.ts b/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.messages.ts deleted file mode 100644 index 30f8c64c9b7ee..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.messages.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const Messages = { - cancelButton: 'Cancel', - confirmButton: 'Register', -}; diff --git a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.styles.ts b/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.styles.ts deleted file mode 100644 index 9692ea345e315..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.styles.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - buttonsWrapper: css` - display: flex; - gap: ${spacing.md}; - `, -}); diff --git a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.tsx b/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.tsx deleted file mode 100644 index bf74f74697fcc..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React, { FC } from 'react'; - -import { LinkButton, useStyles } from '@grafana/ui/src'; -import { LoaderButton } from 'app/percona/shared/components/Elements/LoaderButton'; - -import { Messages } from './DBaaSPageButtons.messages'; -import { getStyles } from './DBaaSPageButtons.styles'; -import { DBaaSPageButtonsProps } from './DBaaSPageButtons.types'; - -export const DBaaSPageButtons: FC = ({ pageName, cancelUrl, submitBtnProps }) => { - const { buttonMessage, ...props } = submitBtnProps; - const styles = useStyles(getStyles); - return ( -
- - {Messages.cancelButton} - - - {buttonMessage ? buttonMessage : Messages.confirmButton} - -
- ); -}; - -export default DBaaSPageButtons; diff --git a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.types.ts b/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.types.ts deleted file mode 100644 index fbbcd958d9faa..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/DBaaSPageButtons/DBaaSPageButtons.types.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { LoaderButtonProps } from 'app/percona/shared/components/Elements/LoaderButton'; - -export interface DBaaSPageButtonsProps { - pageName: string; - cancelUrl: string; - submitBtnProps: LoaderButtonProps & { buttonMessage?: string }; -} diff --git a/public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.styles.ts b/public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.styles.ts deleted file mode 100644 index 035e70aceaea4..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.styles.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - headerContainer: css` - h2 { - margin: ${spacing.xl} ${spacing.lg} ${spacing.xs} ${spacing.lg}; - } - - hr { - margin: ${spacing.xs} ${spacing.md}; - } - `, -}); diff --git a/public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.tsx b/public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.tsx deleted file mode 100644 index ac008b9bd2471..0000000000000 --- a/public/app/percona/dbaas/components/DBaaSPage/PageHeader/PageHeader.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; - -import { useStyles } from '@grafana/ui/src'; - -import { getStyles } from './PageHeader.styles'; - -export const PageHeader = ({ header }: { header: string }) => { - const styles = useStyles(getStyles); - - return ( -
-

{header}

-
-
- ); -}; diff --git a/public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.test.tsx b/public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.test.tsx deleted file mode 100644 index 1c096c6f68cff..0000000000000 --- a/public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.test.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { render, screen, waitFor } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; -import { Router } from 'react-router-dom'; - -import { locationService } from '@grafana/runtime/src'; - -import { configureStore } from '../../../../store/configureStore'; -import { StoreState } from '../../../../types'; -import { K8S_INVENTORY_URL } from '../Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants'; -import { KubernetesClusterStatus } from '../Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from '../Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -import DBaaSRouting from './DBaaSRouting'; - -describe('SwitchField::', () => { - it('should show loading when we are waiting kubernetes response', () => { - render( - - - - ); - - expect(screen.getByTestId('Spinner')).toBeInTheDocument(); - }); - - it('should return redirect to /dbclusters if we have one or more kubernetes clusters', async () => { - render( - - - - - - ); - - expect(locationService.getLocation().pathname).toBe('/dbaas/dbclusters'); - }); - - it('should return redirect to /kubernetes if we have no kubernetes clusters', async () => { - await waitFor(() => - render( - - - - - - ) - ); - - expect(locationService.getLocation().pathname).toBe(K8S_INVENTORY_URL); - }); -}); diff --git a/public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.tsx b/public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.tsx deleted file mode 100644 index 90ca77c3abb3a..0000000000000 --- a/public/app/percona/dbaas/components/DBaasRouting/DBaaSRouting.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React, { FC, useCallback, useMemo } from 'react'; -import { Redirect } from 'react-router-dom'; - -import { Spinner, useStyles } from '@grafana/ui/src'; -import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; - -import { getPerconaSettingFlag } from '../../../shared/core/selectors'; -import { Messages } from '../../DBaaS.messages'; -import { useKubernetesList } from '../../hooks/useKubernetesList'; -import { DB_CLUSTER_INVENTORY_URL } from '../DBCluster/EditDBClusterPage/EditDBClusterPage.constants'; -import { K8S_INVENTORY_URL } from '../Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants'; - -import { getStyles } from './DBaasRouting.styles'; - -export const DBaaSRouting: FC = () => { - const styles = useStyles(getStyles); - const [kubernetes, kubernetesLoading] = useKubernetesList(); - - const showLoading = useMemo( - () => (kubernetesLoading && !kubernetes) || kubernetes === undefined, - [kubernetesLoading, kubernetes] - ); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const featureSelector = useCallback(getPerconaSettingFlag('dbaasEnabled'), []); - - return ( - - {showLoading ? ( -
- -
- ) : kubernetes && kubernetes.length > 0 ? ( - - ) : ( - - )} -
- ); -}; - -export default DBaaSRouting; diff --git a/public/app/percona/dbaas/components/DBaasRouting/DBaasRouting.styles.ts b/public/app/percona/dbaas/components/DBaasRouting/DBaasRouting.styles.ts deleted file mode 100644 index d3e250bd2366c..0000000000000 --- a/public/app/percona/dbaas/components/DBaasRouting/DBaasRouting.styles.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { css } from '@emotion/css'; - -export const getStyles = () => ({ - spinnerWrapper: css` - align-items: center; - display: flex; - justify-content: center; - height: 100%; - `, -}); diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts deleted file mode 100644 index c97ec8a791ef0..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const EVEREST_LINK = 'http://per.co.na/pmm-to-everest'; -export const MIGRATION_GUIDE_LINK = 'http://per.co.na/pmm-to-everest-guide'; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts deleted file mode 100644 index a069cbf9b1342..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const Messages = { - title: 'Deprecation notice', - warning: 'DBaaS feature is deprecated. We encourage you to use ', - everest: 'Everest', - warningCont: ' instead. Check out our ', - guide: 'Migration guide', - dot: '.', -}; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx deleted file mode 100644 index 4c0530e686453..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React, { FC } from 'react'; - -import { Alert } from '@grafana/ui'; - -import { EVEREST_LINK, MIGRATION_GUIDE_LINK } from './DeprecationWarning.constants'; -import { Messages } from './DeprecationWarning.messages'; - -const DbaasDeprecationWarning: FC = () => ( -
- - {Messages.warning} - - {Messages.everest} - - {Messages.warningCont} - - {Messages.guide} - - {Messages.dot} - -
-); - -export default DbaasDeprecationWarning; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/index.ts b/public/app/percona/dbaas/components/DeprecationWarning/index.ts deleted file mode 100644 index 2d3b0cd490d7d..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import DbaasDeprecationWarning from './DeprecationWarning'; - -export default DbaasDeprecationWarning; diff --git a/public/app/percona/dbaas/components/Kubernetes/ColumnRenderers/ColumnRenderers.tsx b/public/app/percona/dbaas/components/Kubernetes/ColumnRenderers/ColumnRenderers.tsx deleted file mode 100644 index e9e4691d617a7..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ColumnRenderers/ColumnRenderers.tsx +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable react/display-name */ -import React from 'react'; - -import { Kubernetes } from '../Kubernetes.types'; -import { KubernetesClusterActions } from '../KubernetesClusterActions/KubernetesClusterActions'; - -export const clusterActionsRender = - ({ - setSelectedCluster, - setDeleteModalVisible, - setViewConfigModalVisible, - setManageComponentsModalVisible, - getDBClusters, - }: Omit) => - (kubernetesCluster: Kubernetes) => - ( - - ); diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants.ts deleted file mode 100644 index 3e7c9503962ba..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const AWS_CREDENTIALS_DOC_LINK = 'https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html'; -export const K8S_INVENTORY_URL = '/dbaas/kubernetes'; -export const DBAAS_INVENTORY_URL = '/dbaas'; diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.messages.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.messages.ts deleted file mode 100644 index 2ab75a22c68a5..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.messages.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const Messages = { - pageTitle: 'Kubernetes Cluster', - isEKSRadioTooltip: `If using Amazon EKS and kubeconfig does not contain AWS access key ID - and AWS secret access key please provide them below`, - awsAccessKeyIDLabel: 'AWS Access Key ID', - awsSecretAccessKeyLabel: 'AWS Secret Access Key', - awsAccessKeyIDTooltip: `AWS Access Key ID of the root user or an IAM user with access to the - EKS cluster`, - awsSecretAccessKeyTooltip: `AWS Secret Access Key of the root user or an IAM user with access - to the EKS cluster`, - fields: { - clusterName: 'Kubernetes Cluster Name', - kubeConfig: 'Kubeconfig file', - }, - paste: 'Paste from clipboard', - genericRadioButton: 'Generic', - eksRadioButton: 'Amazon Elastic Kubernetes\nService', -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.styles.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.styles.ts deleted file mode 100644 index 5f7f30acedf0e..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.styles.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - checkbox: css` - span { - top: 0; - } - `, - urlWarningWrapper: css` - margin-bottom: ${spacing.md}; - `, - pasteButton: css` - background-color: red; - `, - pageToolbarWrapper: css` - display: flex; - align-items: flex-start; - padding-right: ${spacing.lg}; - `, - - pageContent: css` - padding: 0 ${spacing.lg}; - `, - radioInfoIcon: css` - margin-left: ${spacing.md}; - `, - radioGroup: css` - display: flex; - align-items: center; - `, - k8sField: css` - max-width: 500px; - &:not(:last-child) { - margin-bottom: 0px; - } - `, - k8ConfigField: css` - max-width: 800px; - > div:first-child { - label { - display: flex; - flex: 1 0 auto; - align-items: flex-end; - justify-content: space-between; - } - } - &:not(:last-child) { - margin-bottom: 0px; - } - `, - awsField: css` - max-width: 500px; - &:not(:last-child) { - margin-bottom: 6px; - } - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.test.tsx b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.test.tsx deleted file mode 100644 index 3cc42e9fb9534..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.test.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; -import { Router } from 'react-router-dom'; - -import { locationService } from '@grafana/runtime/src'; - -import { configureStore } from '../../../../../store/configureStore'; -import { StoreState } from '../../../../../types'; - -import { EditK8sClusterPage } from './EditK8sClusterPage'; - -describe('EditK8sClusterPage::', () => { - it('renders the form with all elements', () => { - render( - - - - - - ); - - expect(screen.getByTestId('name-text-input')).toBeInTheDocument(); - expect(screen.getByTestId('kubeConfig-textarea-input')).toBeInTheDocument(); - expect(screen.getAllByTestId('isEKS-radio-button')).toHaveLength(2); - expect(screen.getByTestId('eks-info-icon')).toBeInTheDocument(); - expect(screen.queryByTestId('pmm-server-url-warning')).toBeFalsy(); - expect(screen.queryByTestId('kubernetes-paste-from-clipboard-button')).toBeInTheDocument(); - }); - it('shows PMM Server Url Warning', async () => { - render( - - - - - - ); - expect(await screen.findByTestId('pmm-server-url-warning')).toBeInTheDocument(); - }); - it('clicking isEKS radio shows AWS credentials fields', () => { - render( - - - - - - ); - - expect(screen.queryByTestId('awsAccessKeyID-text-input')).not.toBeInTheDocument(); - expect(screen.queryByTestId('awsSecretAccessKey-password-input')).not.toBeInTheDocument(); - - const showEKSRadio = screen.getAllByTestId('isEKS-radio-button')[1]; - fireEvent.click(showEKSRadio); - - expect(screen.queryByTestId('awsAccessKeyID-text-input')).toBeInTheDocument(); - expect(screen.queryByTestId('awsSecretAccessKey-password-input')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.tsx b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.tsx deleted file mode 100644 index 9769852dc2fb4..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.tsx +++ /dev/null @@ -1,191 +0,0 @@ -import React, { useCallback, useEffect, useMemo } from 'react'; -import { Form, FormRenderProps } from 'react-final-form'; -import { useHistory } from 'react-router-dom'; - -import { Button, Icon, Tooltip, useStyles } from '@grafana/ui/src'; -import { PasswordInputField } from 'app/percona/shared/components/Form/PasswordInput'; -import { TextInputField } from 'app/percona/shared/components/Form/TextInput'; -import { TextareaInputField } from 'app/percona/shared/components/Form/TextareaInput'; -import { validators } from 'app/percona/shared/helpers/validatorsForm'; -import { useDispatch, useSelector } from 'app/types'; - -import { FeatureLoader } from '../../../../shared/components/Elements/FeatureLoader'; -import { PageSwitcher } from '../../../../shared/components/Elements/PageSwitcher/PageSwitcher'; -import { PageSwitcherValue } from '../../../../shared/components/Elements/PageSwitcher/PageSwitcher.types'; -import { useCancelToken } from '../../../../shared/components/hooks/cancelToken.hook'; -import { useShowPMMAddressWarning } from '../../../../shared/components/hooks/showPMMAddressWarning'; -import { - addKubernetesAction, - resetAddK8SClusterState, -} from '../../../../shared/core/reducers/dbaas/k8sCluster/k8sCluster'; -import { getAddKubernetes, getPerconaSettingFlag } from '../../../../shared/core/selectors'; -import { Messages as DBaaSMessages } from '../../../DBaaS.messages'; -import DBaaSPage from '../../DBaaSPage/DBaaSPage'; -import { PMMServerUrlWarning } from '../../PMMServerURLWarning/PMMServerUrlWarning'; -import { DELETE_KUBERNETES_CANCEL_TOKEN } from '../Kubernetes.constants'; -import { NewKubernetesCluster } from '../Kubernetes.types'; - -import { AWS_CREDENTIALS_DOC_LINK, K8S_INVENTORY_URL } from './EditK8sClusterPage.constants'; -import { Messages as K8sFormMessages } from './EditK8sClusterPage.messages'; -import { getStyles } from './EditK8sClusterPage.styles'; -import { onKubeConfigValueChange, pasteFromClipboard } from './EditK8sClusterPage.utils'; - -const { required } = validators; -const { - pageTitle, - awsAccessKeyIDLabel, - awsAccessKeyIDTooltip, - awsSecretAccessKeyLabel, - awsSecretAccessKeyTooltip, - paste, - fields, - genericRadioButton, - eksRadioButton, - isEKSRadioTooltip, -} = K8sFormMessages; - -const { dbaas, kubernetes } = DBaaSMessages; - -export const EditK8sClusterPage = () => { - const styles = useStyles(getStyles); - const dispatch = useDispatch(); - const history = useHistory(); - const { result: addK8SClusterResult, loading: addK8SClusterLoading } = useSelector(getAddKubernetes); - const [showPMMAddressWarning] = useShowPMMAddressWarning(); - const [generateToken] = useCancelToken(); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const featureSelector = useCallback(getPerconaSettingFlag('dbaasEnabled'), []); - - const pageSwitcherValues: Array> = useMemo( - () => [ - { name: 'isEKS', value: false, label: genericRadioButton }, - { name: 'isEKS', value: true, label: eksRadioButton }, - ], - [] - ); - - const addKubernetes = useCallback(async (cluster: NewKubernetesCluster, setPMMAddress = false) => { - await dispatch( - addKubernetesAction({ - kubernetesToAdd: cluster, - setPMMAddress, - token: generateToken(DELETE_KUBERNETES_CANCEL_TOKEN), - }) - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - if (addK8SClusterResult === 'ok') { - history.push(K8S_INVENTORY_URL); - } - return () => { - dispatch(resetAddK8SClusterState()); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [addK8SClusterResult]); - - return ( - { - addKubernetes(values, showPMMAddressWarning); - }} - mutators={{ - setKubeConfigAndName: ([configValue, nameValue]: string[], state, { changeValue }) => { - changeValue(state, 'kubeConfig', () => configValue); - changeValue(state, 'name', () => nameValue); - }, - }} - initialValues={{ isEKS: false }} - render={({ handleSubmit, valid, pristine, form, values: { isEKS } }: FormRenderProps) => ( - - - - {showPMMAddressWarning && } - <> -
- - - - -
- -
{fields.kubeConfig}
- - - } - validators={[required]} - inputProps={{ - onChange: (event) => { - onKubeConfigValueChange(event?.target?.value, form.mutators.setKubeConfigAndName); - }, - }} - fieldClassName={styles.k8ConfigField} - /> - {isEKS && ( - <> - - - - )} - - -
-
- - )} - /> - ); -}; - -export default EditK8sClusterPage; diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.types.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.types.ts deleted file mode 100644 index f3e4ff807ccb5..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { AddKubernetesAction } from '../Kubernetes.types'; - -export interface EditK8sClusterFormProps { - showPMMAddressWarning: boolean; - addKubernetes: AddKubernetesAction; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.test.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.test.ts deleted file mode 100644 index 70cb2d0e6ad9f..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { onKubeConfigValueChange } from './EditK8sClusterPage.utils'; -import kubeConfigFile from './KubeConfigTestMock'; - -describe('EditK8sClusterPage.utils::', () => { - it('getClusterNameFromKubeConfig returns name of cluster', () => { - const mutatorMock = jest.fn(); - onKubeConfigValueChange(kubeConfigFile, mutatorMock); - expect(mutatorMock).toBeCalledWith(kubeConfigFile, 'minikube'); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.ts deleted file mode 100644 index 42c932ce8e975..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.utils.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { parse } from 'yaml'; - -import { KubeConfig, Cluster } from '../Kubernetes.types'; - -export const onKubeConfigValueChange = ( - value: string | undefined, - updateFormMutator: (configValue: string | undefined, nameValue: string | undefined) => void -) => { - const defaultName = getClusterNameFromKubeConfig(value); - updateFormMutator(value, defaultName); -}; - -const getClusterNameFromKubeConfig = (value: string | undefined): string | undefined => { - if (value) { - try { - const parsedYAML: KubeConfig = parse(value); - const clusters = parsedYAML?.clusters; - if (clusters && clusters.length) { - const clusterWithName = clusters.find((item: Cluster) => item?.name != null); - if (clusterWithName) { - return clusterWithName.name; - } - } - } catch (e) { - return undefined; - } - } - return undefined; -}; - -const getFromClipboard = async () => { - if (navigator.clipboard.readText) { - return navigator.clipboard.readText(); - } - return Promise.resolve(undefined); -}; - -export const pasteFromClipboard = async ( - updateFormMutator: (configValue: string | undefined, nameValue: string | undefined) => void -) => { - const kubeConfig = await getFromClipboard(); - if (kubeConfig) { - const defaultName = getClusterNameFromKubeConfig(kubeConfig); - updateFormMutator(kubeConfig, defaultName); - } -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/KubeConfigTestMock.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/KubeConfigTestMock.ts deleted file mode 100644 index 18234827d6eb9..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/KubeConfigTestMock.ts +++ /dev/null @@ -1 +0,0 @@ -export default 'apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCakNDQWU2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJeU1ETXlNVEV6TXprek1sb1hEVE15TURNeE9URXpNemt6TWxvd0ZURVRNQkVHQTFVRQpBeE1LYldsdWFXdDFZbVZEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTkNxClJmd2NjMEtwYnp6Sk4vSEo2ZzJpeGtibmRPSnVBTGFDMXlwTTBla3hJOCs5RWgxMjVwSjJnZFFzRjhzYWNRYUIKSmZPSWxPdHRzZHlNbmVYV3V4cjVOd29MZVhhYUtSd2U2Kzl4MlZhQUtTbSsySGo4Y1lvb3ZqZlc5RjU0NUFpdwpoa0tDcm02Tm5PZjlIaC9KdkR6clM5V1U0eDM5S25XVE8xcnVqaWdQR3RmYXprR2haSnpMcDFzZ2hXTWViSHA0CmR3QXpkTjB6blRSOWN1Ykd1UXRmZmxPd3BGTU50L0RRNFdVWmEzVS9SL09ZNlg1M3JMNVF2ZjRuTFptRlhmUnoKMldpbEZHNVhUbnVCZzlKZ3FUang1QWpOOGpveFVJMGtEdEFtMW9aOVJucjNJdEEzQm0rTlRKeVQxRkh1K0xYNAp6V2ZSd2hQcXpXY3VXV3FzbTlzQ0F3RUFBYU5oTUY4d0RnWURWUjBQQVFIL0JBUURBZ0trTUIwR0ExVWRKUVFXCk1CUUdDQ3NHQVFVRkJ3TUNCZ2dyQmdFRkJRY0RBVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVcKQkJUNmlnbDNZaHJyYU1WYUtxNzU2QnhGUUpOQ3pqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFWZkRJS1Z3MQpCU3JHUFRCR2ZkMCtHczhpR1JvUnNaVGluLzB2dnluL3cyTi9KS05hQjZLSmZqTS9oWDlNRHJTOXdCaHlWMzUxCkh3Z0dWeUVIOHlwY2RYRGR6MUx0azRaRzlhUS9FeW5ZV2tlMkpaem5JSS94Uzc5ZWxCVjhCVlpnbkxEWW5ESWcKQW4zTExnYVRnbEVSSXoyRDRYdG9tSUdWOUxJYzhUSWFIT0xrekpIN2NweFpEM3FzUWh0VEJDR0Nyd2wranh1Mgp1aENpNkd4QzVRUm1GTXBzMEFWYkR2cUk5Nk9kY0o3RUpkZCtsOVplVitKTnJsbjQ3K1A5N1dwYSsyU09LM282CkNtRjlrd25TRXZMTlRRanR0emIvSURWZmtPbFRlSHpUNXdMeGtIRW5FcTdxL0JIYXhTU2d2dFRmT0FveFV5MHQKZDBrV05HVmE5MXlPNFE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==\n extensions:\n - extension:\n last-update: Thu, 28 Jul 2022 19:42:19 +04\n provider: minikube.sigs.k8s.io\n version: v1.24.0\n name: cluster_info\n server: https://192.168.49.2:8443\n name: minikube\ncontexts:\n- context:\n cluster: minikube\n extensions:\n - extension:\n last-update: Thu, 28 Jul 2022 19:42:19 +04\n provider: minikube.sigs.k8s.io\n version: v1.24.0\n name: context_info\n namespace: default\n user: minikube\n name: minikube\ncurrent-context: minikube\nkind: Config\npreferences: {}\nusers:\n- name: minikube\n user:\n client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwdGFXNXAKYTNWaVpVTkJNQjRYRFRJeU1EY3lOekUxTkRJd04xb1hEVEkxTURjeU56RTFOREl3TjFvd01URVhNQlVHQTFVRQpDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGakFVQmdOVkJBTVREVzFwYm1scmRXSmxMWFZ6WlhJd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEaDN4NnpiSUM5dFZ3aWsrN1REQWx4cXovNXR3SnMKRURWd0RkVStYc1hlendxd3dHSFM2M2c5Sy8yOEVhaCt1bUhwUWhPRUJkYnZrYVFrSlpYb0gvWGoranF4TFhCdgorL0ZrQnNwZ2hQZlNXc3NTRVh0VHBGR2J1Q2Z5a0NTcEMvMmNKN2ZTa2tncVRNWWdTamZYbFJtVmM2bStSeEROCkF6djB2TEZGYzE5MHI5YWM4dzRrcDk0YUZNdG96RlBVcm1jZ2xOMnppVmkxRFNoN0E1Q3E1TTZoaUFtM0J0dlUKM3Qrc0w1WE02UnZMMGZVUG5qT2lrOWlYZmdWd1lZU3Q3MEM3ZEhJTHcrdmtwRUFJWlFhVkFMYmwrdHVGYk45bApyOTk2cFk4aWZsbVRBNTBpQm8wT2d1NVNJbXBQcUtXd2ZQUDNkalA1SjBUaWJQK0RDV0c0N0FteEFnTUJBQUdqCllEQmVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JUNmlnbDNZaHJyYU1WYUtxNzU2QnhGUUpOQwp6akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBdms4bEM5aEg5OWZUeXZkT0IyTUdDODY0KzFFaGVVcC9XK3lwClVCdnVXMW9wUVJLLzhaRGVzaE5sUmxkSVhIamdpU2Y1WTZubmtNUTlIcnYxTXQ0YUtKdGlFL3dIdjYveFJYbTUKUFpKbW5pYmFYYVhLQkJvc3JyT1M4RnBWQWh1dUp5SWp2OFNGeE1BWk1kaUpKcnZOVmQzYXIyaVJYdWx6b05kMwp6TEdrRXI3OE5oaVBwVFpxK1dwTEJxVG52TUQreHNUbXJuVHFPdUZoUFRUYVU4ZzJhTkVxWTFIcXYxOVBRZE45Ckl1aDlCVXNyRnI5ZW5UWTJzQlo1b1k2VmFqL0d2ZWVkbEt0RjkvOCtIbzJaYjAvYU9LSkVHaElleHdjT2htcEsKb1JsaExtZGV5VUxoSnNUcUVXcENDMWlmU1BjdWZxMHh3dURwSDBTWld4SjlzOURjMWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==\n client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBNGQ4ZXMyeUF2YlZjSXBQdTB3d0pjYXMvK2JjQ2JCQTFjQTNWUGw3RjNzOEtzTUJoCjB1dDRQU3Y5dkJHb2ZycGg2VUlUaEFYVzc1R2tKQ1dWNkIvMTQvbzZzUzF3Yi92eFpBYktZSVQzMGxyTEVoRjcKVTZSUm03Z244cEFrcVF2OW5DZTMwcEpJS2t6R0lFbzMxNVVabFhPcHZrY1F6UU03OUx5eFJYTmZkSy9XblBNTwpKS2ZlR2hUTGFNeFQxSzVuSUpUZHM0bFl0UTBvZXdPUXF1VE9vWWdKdHdiYjFON2ZyQytWek9rYnk5SDFENTR6Cm9wUFlsMzRGY0dHRXJlOUF1M1J5QzhQcjVLUkFDR1VHbFFDMjVmcmJoV3pmWmEvZmVxV1BJbjVaa3dPZElnYU4KRG9MdVVpSnFUNmlsc0h6ejkzWXorU2RFNG16L2d3bGh1T3dKc1FJREFRQUJBb0lCQUE3UjRPWE0zTFdWekxISQpHd2RsNXNpNmY3d1dzZVg5T2tSYjQvM3ZvZlA0aWE4SE1HUHlaelU4U2EycFN2RGxzYjdvUXZlS21vdWxkcXVZCmU3bDdQMXJ4OUIvajUxaXhveWo0K1JaVUl4NStMb3pFOE42UURYcTJIb2pmeEVnRExXU3RoblllZXZXcmkrUmEKZWtkKzFPcmxaK0hBTCs0RHBFOXVnZ01ZaXM3UkN5bXVHczdPeFdOd2c5YUh2YmxIc3NwREIzb0xiMnRid3JFLwpaUVdHbHV2UnV3bjUwQ1dTSXg1SmNudjhPcmQ0ck5OWGMvNjdic2c3VmRiQlJ4T3V2eW14NnRIM1hVUC9sVU9GCmk5ZzVOeVFtZzh5S3lFNyt0L2MzS2p0SWVCb1hKcXhCZ0dEZk9aeWJwc0FseVA1OUR0dmZQMkxuYXRQcW1BVHoKa3ZSeTZBRUNnWUVBOEx1MFVpWW03MXFjNHV0TDVBdGRFbTVlT040ZGtKT3lBYTl5VkV5b00vVXYzMTc5TXAreAp5V2pBNUlWN0duY245NlM2YVV3MXlaaDZnSUJxbFJwbmRpdkFFZ0ZqMGVjS1lvSVJpaHR4OXN6dUVCTWpOMEZQCjR6ejMwckxJVVdTUnNkZG8vVGx5N2U1b2VzU1ZXbDYxdDRlUGxZMUpLNmNpWENpOXhXMUxVbUVDZ1lFQThESWoKRk1RUXdkaVpEWFZ1RmJWM3FzazBaYW1yQ2lxeFBHZm1sOEpIU3pxMmlXRUpTK1RKZ095M1IzVzBrbUFoaEs0SApVQXFzVVBzVDArQVAxTmoxWjNnUWdTWWJrQ1ZSM3o2M2l1VmZLUWs3OHdpalluL2c0WFJEcllhbVdmTDBYOGJwCjk0VVNQQ3dxSXp0RVNISUxCby9zbmRFbDZlR3FuTFk5emRPN21WRUNnWUVBcDI0VmV6RTMwUzlYZ0dlZ1Q4b3IKZ0Y4c3Z5YVVyM0paMHR4QWl5c0pyYUZ4RzAxSWtzWUk5QWtjWjVRQ3k2Um1NdEhxS01RdGdMbkJNZENlMEhjZAowRTJiZDZwcHo1cCtXWWNYUmRQU3pwRTNYZ3pCYUhQUGFUK0ZLWkRZeSt0RGZjcFJKaFdudnA0YklvL0pSS0lzCmhxb05Eam5HMDBxYUZqanJ5LzA0N3VFQ2dZRUE1MG93RTdmMHR1U2VCS0syUFhzL1h4cGVOU0xiQzNBdXVJOEkKTWN3bklKN0oxS0cyOVBpNnZFVzArcit5QUYxSENWOFd0WkdCZW4wN0M0T3ZXdk1MNC9WdVZ4NWQza0RCaEtuOAp6V2V2YVhGMTQ4SEdxbnVmRFJvS2JWYkNhczBUV2dMTm1zWHQyRGxpM2dnYzZYRy9nak1tMHBUcDREdW9NVDBmCmFFcGhVL0VDZ1lCT29kZUxvUm5NdXpicGxqUVMrRzEzKzhLd3A2WWdSU0pxblNNVGRtZnFVMWdVTjA3amF0TXQKN2lkK0tBVlZ6NFBEUWVUTWFXbnFRTllLc3ZDbDQrNkJTc1NvL0FYSGVBWGQwb3djRlhEaDMvNFh5bVIyaEVZYQpwWE9TSkd6enMxOUFDMHdObnZYaHBFWi8rMTFOdTBnR0tjeWp3MnIxUXZpT1U3VkRaSGpMMmc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo='; diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.styles.ts b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.styles.ts deleted file mode 100644 index 035e70aceaea4..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.styles.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - headerContainer: css` - h2 { - margin: ${spacing.xl} ${spacing.lg} ${spacing.xs} ${spacing.lg}; - } - - hr { - margin: ${spacing.xs} ${spacing.md}; - } - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.tsx b/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.tsx deleted file mode 100644 index ac008b9bd2471..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/PageHeader/PageHeader.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; - -import { useStyles } from '@grafana/ui/src'; - -import { getStyles } from './PageHeader.styles'; - -export const PageHeader = ({ header }: { header: string }) => { - const styles = useStyles(getStyles); - - return ( -
-

{header}

-
-
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/K8sRouting/K8sRouting.tsx b/public/app/percona/dbaas/components/Kubernetes/K8sRouting/K8sRouting.tsx deleted file mode 100644 index 41d0d7b71e96b..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/K8sRouting/K8sRouting.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React, { FC, useState } from 'react'; -import { Redirect } from 'react-router-dom'; - -import KubernetesInventory from '../KubernetesInventory'; - -export type K8sPageMode = 'register' | 'edit' | 'list'; - -export const K8sRouting: FC = () => { - const [mode, setMode] = useState('list'); - - return ( - <> - {mode === 'register' && } - {mode === 'list' && } - - ); -}; - -export default K8sRouting; diff --git a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.constants.ts b/public/app/percona/dbaas/components/Kubernetes/Kubernetes.constants.ts deleted file mode 100644 index 3f292db73d38e..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.constants.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Databases } from 'app/percona/shared/core'; - -import { Operators } from '../DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -import { ComponentToUpdate, DatabaseComponentToUpdateMap } from './Kubernetes.types'; - -export const OPERATOR_COMPONENT_TO_UPDATE_MAP = { - [Operators.pxc]: ComponentToUpdate.pxc, - [Operators.psmdb]: ComponentToUpdate.psmdb, -}; - -export const DATABASE_COMPONENT_TO_UPDATE_MAP: DatabaseComponentToUpdateMap = { - [Databases.mysql]: ComponentToUpdate.pxc, - [Databases.mongodb]: ComponentToUpdate.psmdb, -}; - -export const GET_KUBERNETES_CANCEL_TOKEN = 'getKubernetes'; -export const DELETE_KUBERNETES_CANCEL_TOKEN = 'deleteKubernetes'; -export const CHECK_OPERATOR_UPDATE_CANCEL_TOKEN = 'checkOperatorUpdate'; - -export const RECHECK_INTERVAL = 10000; diff --git a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.hooks.constants.ts b/public/app/percona/dbaas/components/Kubernetes/Kubernetes.hooks.constants.ts deleted file mode 100644 index 2001f58f62214..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.hooks.constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const GET_KUBERNETES_CANCEL_TOKEN = 'getKubernetes'; -export const ADD_KUBERNETES_CANCEL_TOKEN = 'addKubernetes'; -export const CHECK_OPERATOR_UPDATE_CANCEL_TOKEN = 'checkOperatorUpdate'; diff --git a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.service.ts b/public/app/percona/dbaas/components/Kubernetes/Kubernetes.service.ts deleted file mode 100644 index 3311fa0632ec2..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.service.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { CancelToken } from 'axios'; - -import { apiManagement } from 'app/percona/shared/helpers/api'; - -import { - CheckOperatorUpdateAPI, - ComponentToUpdate, - InstallOperatorRequest, - InstallOperatorResponse, - KubeConfigResponse, - Kubernetes, - KubernetesListAPI, - NewKubernetesCluster, - NewKubernetesClusterAPI, - StorageClassesRequest, - StorageClassesResponse, -} from './Kubernetes.types'; - -export const KubernetesService = { - getKubernetes(token?: CancelToken) { - return apiManagement.post('/DBaaS/Kubernetes/List', {}, true, token); - }, - deleteKubernetes(kubernetes: Kubernetes, force?: boolean, token?: CancelToken) { - return apiManagement.post('/DBaaS/Kubernetes/Unregister', toAPI(kubernetes, force), false, token); - }, - getKubernetesConfig(kubernetes: Kubernetes, token?: CancelToken) { - return apiManagement.post('/DBaaS/Kubernetes/Get', toAPI(kubernetes), false, token); - }, - getStorageClasses(kubernetesClasterName: string): Promise { - return apiManagement.post( - '/DBaaS/Kubernetes/StorageClasses/List', - { kubernetes_cluster_name: kubernetesClasterName }, - false - ); - }, - addKubernetes(kubernetes: NewKubernetesCluster, token?: CancelToken) { - return apiManagement.post( - '/DBaaS/Kubernetes/Register', - newClusterToApi(kubernetes), - false, - token - ); - }, - checkForOperatorUpdate(token?: CancelToken) { - return apiManagement.post( - '/DBaaS/Components/CheckForOperatorUpdate', - {}, - false, - token - ); - }, - installOperator( - kubernetesClusterName: string, - operatorType: ComponentToUpdate, - version: string, - token?: CancelToken - ) { - return apiManagement.post( - '/DBaaS/Components/InstallOperator', - { - kubernetes_cluster_name: kubernetesClusterName, - operator_type: operatorType, - version, - }, - false, - token - ); - }, - getDBClusters(kubernetes: Kubernetes, token?: CancelToken) { - return apiManagement.post('/DBaaS/DBClusters/List', kubernetes, true, token); - }, -}; - -const toAPI = (kubernetes: Kubernetes, force?: boolean) => ({ - kubernetes_cluster_name: kubernetes.kubernetesClusterName, - force, -}); - -const newClusterToApi = ({ - name, - kubeConfig, - isEKS, - awsAccessKeyID, - awsSecretAccessKey, -}: NewKubernetesCluster): NewKubernetesClusterAPI => { - const cluster: NewKubernetesClusterAPI = { - kubernetes_cluster_name: name, - kube_auth: { - kubeconfig: kubeConfig, - }, - }; - - if (isEKS) { - cluster.aws_access_key_id = awsAccessKeyID; - cluster.aws_secret_access_key = awsSecretAccessKey; - } - - return cluster; -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.styles.ts b/public/app/percona/dbaas/components/Kubernetes/Kubernetes.styles.ts deleted file mode 100644 index c4c7cee39cb4a..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.styles.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = (theme: GrafanaTheme) => ({ - actionPanel: css` - display: flex; - justify-content: flex-end; - margin-bottom: ${theme.spacing.sm}; - `, - actionsColumn: css` - display: flex; - justify-content: center; - `, - deleteModalContent: css` - margin-bottom: ${theme.spacing.xl}; - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.types.ts b/public/app/percona/dbaas/components/Kubernetes/Kubernetes.types.ts deleted file mode 100644 index 3edbf104fdb77..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.types.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { Databases } from 'app/percona/shared/core'; - -import { KubernetesClusterStatus } from './KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from './OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -export interface KubernetesListAPI { - kubernetes_clusters: KubernetesAPI[]; -} - -export interface Operator { - status: KubernetesOperatorStatus; - version?: string; - availableVersion?: string; -} - -export interface OperatorToUpdate extends Operator { - operatorType: ComponentToUpdate; - operatorTypeLabel: string; -} - -export interface OperatorsList { - psmdb: Operator; - pxc: Operator; -} - -export interface KubernetesAPI { - kubernetes_cluster_name: string; - operators: OperatorsList; - status: string; -} - -export interface Kubernetes { - kubernetesClusterName: string; - operators: OperatorsList; - status: KubernetesClusterStatus; -} - -export type AddKubernetesAction = (kubernetesToAdd: NewKubernetesCluster, setPMMAddress?: boolean) => void; -export type SetKubernetesLoadingAction = (loading: boolean) => void; -export type ManageKubernetes = [Kubernetes[], SetKubernetesLoadingAction, boolean]; - -interface KubeAuth { - kubeconfig: string; -} - -export interface NewKubernetesClusterAPI { - kubernetes_cluster_name: string; - kube_auth: KubeAuth; - aws_access_key_id?: string; - aws_secret_access_key?: string; -} - -export interface CheckOperatorUpdateAPI { - cluster_to_components: { - [cluster: string]: ComponentToUpdateAPI; - }; -} - -export interface ComponentToUpdateAPI { - component_to_update_information: OperatorToUpdateAPI; -} - -export interface OperatorToUpdateAPI { - [ComponentToUpdate.psmdb]: ComponentVersionAPI; - [ComponentToUpdate.pxc]: ComponentVersionAPI; -} - -export interface ComponentVersionAPI { - available_version?: string; -} - -export enum ComponentToUpdate { - psmdb = 'psmdb-operator', - pxc = 'pxc-operator', -} - -export type DatabaseComponentToUpdateMap = { [key in Databases]?: ComponentToUpdate }; - -export interface InstallOperatorRequest { - kubernetes_cluster_name: string; - operator_type: ComponentToUpdate; - version: string; -} - -export interface StorageClassesRequest { - kubernetes_cluster_name: string; -} -export interface StorageClassesResponse { - storage_classes?: string[]; -} - -export interface InstallOperatorResponse { - status: KubernetesOperatorStatus; -} - -export interface NewKubernetesCluster { - name: string; - kubeConfig: string; - isEKS: boolean; - awsAccessKeyID?: string; - awsSecretAccessKey?: string; -} - -export interface KubernetesProps { - kubernetes: Kubernetes[]; - setLoading: SetKubernetesLoadingAction; - loading: boolean; -} - -export interface KubeConfig { - name?: string; - server?: string; - apiVersion?: string; - clusters: Cluster[]; -} - -export interface Cluster { - name?: string; - cluster?: ClusterInfo; -} - -export interface ClusterInfo { - 'certificate-authority-data'?: string; - extensions?: { - extension?: Extension[]; - name?: string; - }; - server?: string; -} - -interface Extension { - extension?: ExtensionInfo; - name?: string; -} - -interface ExtensionInfo { - 'last-update'?: string; - provider?: string; - version?: string; -} - -export interface KubeConfigResponse { - kube_auth: KubeAuth; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.test.ts b/public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.test.ts deleted file mode 100644 index 2045f67959a16..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { DATABASE_OPTIONS } from '../DBCluster/DBCluster.constants'; -import { Operators } from '../DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -import { getActiveOperators, getDatabaseOptionFromOperator, isKubernetesListUnavailable } from './Kubernetes.utils'; -import { KubernetesClusterStatus } from './KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from './OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { kubernetesStub } from './__mocks__/kubernetesStubs'; - -describe('Kubernetes.utils:: ', () => { - it('should return false when there are clusters available', () => { - expect(isKubernetesListUnavailable(kubernetesStub)).toBeFalsy(); - }); - it('should return true when there are no clusters available', () => { - const kubernetes = [ - { ...kubernetesStub[0], status: KubernetesClusterStatus.invalid }, - { ...kubernetesStub[1], status: KubernetesClusterStatus.unavailable }, - ]; - expect(isKubernetesListUnavailable(kubernetes)).toBeTruthy(); - }); - it('should return empty list of active operators', () => { - const kubernetes = [ - { - ...kubernetesStub[0], - operators: { - psmdb: { status: KubernetesOperatorStatus.invalid }, - pxc: { status: KubernetesOperatorStatus.unavailable }, - }, - }, - { - ...kubernetesStub[1], - operators: { - psmdb: { status: KubernetesOperatorStatus.unsupported }, - pxc: { status: KubernetesOperatorStatus.unavailable }, - }, - }, - ]; - expect(getActiveOperators(kubernetes).length).toBe(0); - }); - it('should return list of with all active operators', () => { - const kubernetes = [ - { - ...kubernetesStub[0], - operators: { psmdb: { status: KubernetesOperatorStatus.ok }, pxc: { status: KubernetesOperatorStatus.ok } }, - }, - { - ...kubernetesStub[1], - operators: { - psmdb: { status: KubernetesOperatorStatus.ok }, - pxc: { status: KubernetesOperatorStatus.unavailable }, - }, - }, - ]; - expect(getActiveOperators(kubernetes).length).toBe(2); - }); - it('should return list with one active operator', () => { - const kubernetes = [ - { - ...kubernetesStub[0], - operators: { - psmdb: { status: KubernetesOperatorStatus.ok }, - pxc: { status: KubernetesOperatorStatus.unavailable }, - }, - }, - { - ...kubernetesStub[1], - operators: { - psmdb: { status: KubernetesOperatorStatus.unsupported }, - pxc: { status: KubernetesOperatorStatus.unavailable }, - }, - }, - ]; - const activeOperators = getActiveOperators(kubernetes); - - expect(activeOperators.length).toBe(1); - expect(activeOperators[0]).toEqual(Operators.psmdb); - }); - it('returns correct database option from operator', () => { - expect(getDatabaseOptionFromOperator(Operators.pxc)).toEqual(DATABASE_OPTIONS[0]); - expect(getDatabaseOptionFromOperator(Operators.psmdb)).toEqual(DATABASE_OPTIONS[1]); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.ts b/public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.ts deleted file mode 100644 index e41163dafccfe..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/Kubernetes.utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ -import { DATABASE_OPERATORS, DATABASE_OPTIONS } from '../DBCluster/DBCluster.constants'; -import { ActiveOperatorsMap } from '../DBCluster/DBCluster.types'; -import { - DatabaseOption, - Operators, -} from '../DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -import { Kubernetes, Operator } from './Kubernetes.types'; -import { KubernetesClusterStatus } from './KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from './OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -export const isKubernetesListUnavailable = (kubernetes: Kubernetes[]) => - !!!kubernetes.find((k) => k.status === KubernetesClusterStatus.ok); - -export const getActiveOperators = (kubernetes: Kubernetes[]): Operators[] => { - const activeOperatorsMap: ActiveOperatorsMap = {}; - - const activeOperators = kubernetes.reduce((acc: Operators[], k) => { - const activeOperators: Operators[] = []; - - Object.entries(k.operators).forEach(([operator, { status }]: [string, Operator]) => { - if (!activeOperatorsMap[operator as Operators] && status === KubernetesOperatorStatus.ok) { - activeOperators.push(operator as Operators); - activeOperatorsMap[operator as Operators] = true; - } - }); - - return [...acc, ...activeOperators]; - }, []); - - return activeOperators; -}; - -export const getDatabaseOptionFromOperator = (operator: Operators): DatabaseOption | undefined => - DATABASE_OPTIONS.find(({ value }) => value === DATABASE_OPERATORS[operator]); diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.styles.ts b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.styles.ts deleted file mode 100644 index c8191103b7a73..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.styles.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { css } from '@emotion/css'; - -export const styles = { - actionsColumn: css` - display: flex; - justify-content: center; - `, -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.test.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.test.tsx deleted file mode 100644 index f75540e625b33..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.test.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import React from 'react'; - -import { kubernetesStub } from '../__mocks__/kubernetesStubs'; - -import { KubernetesClusterActions } from './KubernetesClusterActions'; - -describe('KubernetesClusterActions::', () => { - it('renders correctly', async () => { - render( - - ); - - expect(screen.getByTestId('dropdown-menu-toggle')).toBeInTheDocument(); - expect(screen.getByTestId('dropdown-menu-container')).toBeInTheDocument(); - }); - - it('Select delete actions', async () => { - const setSelectedCluster = jest.fn(); - const setDeleteModalVisible = jest.fn(); - render( - - ); - - fireEvent.click(screen.getByRole('button')); - fireEvent.click(screen.getByText('Unregister')); - - await waitFor(() => expect(setSelectedCluster).toHaveBeenCalled()); - await waitFor(() => expect(setDeleteModalVisible).toHaveBeenCalled()); - }); - - it('Select view cluster config action', async () => { - const setSelectedCluster = jest.fn(); - const setDeleteModalVisible = jest.fn(); - const setViewConfigModalVisible = jest.fn(); - - render( - - ); - - fireEvent.click(screen.getByRole('button')); - fireEvent.click(screen.getByText('Show configuration')); - - await waitFor(() => expect(setSelectedCluster).toHaveBeenCalled()); - await waitFor(() => expect(setViewConfigModalVisible).toHaveBeenCalled()); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.tsx deleted file mode 100644 index a8447d90e9723..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React, { FC, useCallback } from 'react'; - -import { config } from '@grafana/runtime'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { Action, MultipleActions } from 'app/percona/dbaas/components/MultipleActions'; - -import { Kubernetes } from '../Kubernetes.types'; -import { KubernetesClusterStatus } from '../KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { hasActiveOperator } from '../OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.utils'; - -import { styles } from './KubernetesClusterActions.styles'; -import { DBClusterActionsProps } from './KubernetesClusterActions.types'; -export const KubernetesClusterActions: FC = ({ - kubernetesCluster, - setSelectedCluster, - setDeleteModalVisible, - setViewConfigModalVisible, - setManageComponentsModalVisible, -}) => { - const isAdmin = config.bootData.user.isGrafanaAdmin; - const getActions = useCallback( - (kubernetesCluster: Kubernetes) => { - const actions: Action[] = [ - { - content: Messages.kubernetes.deleteAction, - action: () => { - setSelectedCluster(kubernetesCluster); - setDeleteModalVisible(true); - }, - }, - { - content: Messages.kubernetes.showConfiguration, - disabled: kubernetesCluster.status === KubernetesClusterStatus.provisioning, - action: () => { - setSelectedCluster(kubernetesCluster); - setViewConfigModalVisible(true); - }, - }, - ]; - - if (isAdmin) { - actions.push({ - content: Messages.kubernetes.manageComponents, - disabled: - !hasActiveOperator(kubernetesCluster) || kubernetesCluster.status === KubernetesClusterStatus.provisioning, - action: () => { - setSelectedCluster(kubernetesCluster); - setManageComponentsModalVisible(true); - }, - }); - } - - return actions; - }, - [isAdmin, setSelectedCluster, setDeleteModalVisible, setManageComponentsModalVisible, setViewConfigModalVisible] - ); - - return ( -
- -
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.types.ts b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.types.ts deleted file mode 100644 index 96b27b2f229d9..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterActions/KubernetesClusterActions.types.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Kubernetes } from '../Kubernetes.types'; - -export interface DBClusterActionsProps { - kubernetesCluster: Kubernetes; - setSelectedCluster: (kubernetesCluster: Kubernetes) => void; - setDeleteModalVisible: (isVisible: boolean) => void; - setViewConfigModalVisible: (isVisible: boolean) => void; - setManageComponentsModalVisible: (isVisible: boolean) => void; - getDBClusters: () => void; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.constants.ts b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.constants.ts deleted file mode 100644 index 76f7e9fdc93b7..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { KubernetesClusterStatus } from './KubernetesClusterStatus.types'; - -export const STATUS_DATA_QA = { - [KubernetesClusterStatus.invalid]: 'invalid', - [KubernetesClusterStatus.ok]: 'ok', - [KubernetesClusterStatus.unavailable]: 'unavailable', - [KubernetesClusterStatus.provisioning]: 'provisioning', -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.styles.ts b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.styles.ts deleted file mode 100644 index bda9137b0b6a3..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.styles.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme2 } from '@grafana/data'; - -export const getStyles = ({ v1 }: GrafanaTheme2) => ({ - clusterStatusWrapper: css` - align-items: center; - display: flex; - justify-content: center; - padding: ${v1.spacing.xs} 0; - - a > span { - cursor: pointer; - } - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.test.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.test.tsx deleted file mode 100644 index 96274940aa680..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.test.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { KubernetesClusterStatus } from './KubernetesClusterStatus'; -import { KubernetesClusterStatus as Status } from './KubernetesClusterStatus.types'; - -describe('DBClusterStatus::', () => { - it('renders correctly when ok', () => { - render(); - - expect(screen.getByTestId('cluster-status-ok')).toBeInTheDocument(); - }); - it('renders correctly when invalid', () => { - render(); - - expect(screen.getByTestId('cluster-status-invalid')).toBeInTheDocument(); - }); - it('renders correctly when unavailable', () => { - render(); - - expect(screen.getByTestId('cluster-status-unavailable')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.tsx deleted file mode 100644 index e1011000a342b..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React, { FC } from 'react'; - -import { Badge, BadgeColor, useStyles2 } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; - -import { STATUS_DATA_QA } from './KubernetesClusterStatus.constants'; -import { getStyles } from './KubernetesClusterStatus.styles'; -import { KubernetesClusterStatusColors, KubernetesClusterStatusProps } from './KubernetesClusterStatus.types'; - -export const KubernetesClusterStatus: FC = ({ status }) => { - const styles = useStyles2(getStyles); - const statusColor: BadgeColor = KubernetesClusterStatusColors[status]; - - return ( -
- -
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types.ts b/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types.ts deleted file mode 100644 index 222b17e11c72f..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { BadgeColor } from '@grafana/ui/src'; - -export enum KubernetesClusterStatus { - invalid = 'KUBERNETES_CLUSTER_STATUS_INVALID', - ok = 'KUBERNETES_CLUSTER_STATUS_OK', - unavailable = 'KUBERNETES_CLUSTER_STATUS_UNAVAILABLE', - provisioning = 'KUBERNETES_CLUSTER_STATUS_PROVISIONING', -} - -export const KubernetesClusterStatusColors: Record = { - [KubernetesClusterStatus.ok]: 'green', - [KubernetesClusterStatus.invalid]: 'red', - [KubernetesClusterStatus.unavailable]: 'blue', - [KubernetesClusterStatus.provisioning]: 'orange', -}; - -export interface KubernetesClusterStatusProps { - status: KubernetesClusterStatus; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx deleted file mode 100644 index 1a15940e94426..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.test.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { render, screen, waitForElementToBeRemoved } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; - -import { configureStore } from 'app/store/configureStore'; -import { StoreState } from 'app/types'; - -import { KubernetesClusterStatus } from './KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesInventory } from './KubernetesInventory'; -import { KubernetesOperatorStatus } from './OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -jest.mock('app/core/app_events'); -jest.mock('app/percona/dbaas/components/Kubernetes/Kubernetes.service'); - -describe('KubernetesInventory::', () => { - it('renders table correctly', async () => { - render( - - - - ); - - await waitForElementToBeRemoved(() => screen.getByTestId('table-loading')); - expect(screen.getAllByTestId('table-row')).toHaveLength(2); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx b/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx deleted file mode 100644 index 3bde5afacd4fd..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/KubernetesInventory.tsx +++ /dev/null @@ -1,240 +0,0 @@ -/* eslint-disable react/display-name */ -import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { Form } from 'react-final-form'; -import { Column } from 'react-table'; - -import { Button, HorizontalGroup, useStyles } from '@grafana/ui'; -import { OldPage } from 'app/core/components/Page/Page'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { Table } from 'app/percona/shared/components/Elements/AnotherTableInstance'; -import { CheckboxField } from 'app/percona/shared/components/Elements/Checkbox'; -import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; -import { Modal } from 'app/percona/shared/components/Elements/Modal'; -import { TechnicalPreview } from 'app/percona/shared/components/Elements/TechnicalPreview/TechnicalPreview'; -import { useCancelToken } from 'app/percona/shared/components/hooks/cancelToken.hook'; -import { useCatchCancellationError } from 'app/percona/shared/components/hooks/catchCancellationError'; -import { usePerconaNavModel } from 'app/percona/shared/components/hooks/perconaNavModel'; -import { deleteKubernetesAction } from 'app/percona/shared/core/reducers'; -import { fetchK8sListAction } from 'app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList'; -import { getAddKubernetes, getDeleteKubernetes, getPerconaSettingFlag } from 'app/percona/shared/core/selectors'; -import { useSelector } from 'app/types'; - -import { useAppDispatch } from '../../../../store/store'; -import { useKubernetesList } from '../../hooks/useKubernetesList'; -import { AddClusterButton } from '../AddClusterButton/AddClusterButton'; -import DbaasDeprecationWarning from '../DeprecationWarning'; - -import { clusterActionsRender } from './ColumnRenderers/ColumnRenderers'; -import { K8sPageMode } from './K8sRouting/K8sRouting'; -import { - CHECK_OPERATOR_UPDATE_CANCEL_TOKEN, - GET_KUBERNETES_CANCEL_TOKEN, - RECHECK_INTERVAL, -} from './Kubernetes.constants'; -import { getStyles } from './Kubernetes.styles'; -import { Kubernetes, OperatorToUpdate } from './Kubernetes.types'; -import { KubernetesClusterStatus } from './KubernetesClusterStatus/KubernetesClusterStatus'; -import { KubernetesClusterStatus as K8SStatus } from './KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { ManageComponentsVersionsModal } from './ManageComponentsVersionsModal/ManageComponentsVersionsModal'; -import { UpdateOperatorModal } from './OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal'; -import { OperatorStatusRow } from './OperatorStatusRow/OperatorStatusRow'; -import { ViewClusterConfigModal } from './ViewClusterConfigModal/ViewClusterConfigModal'; - -interface KubernetesInventoryProps { - setMode: React.Dispatch>; -} - -export const KubernetesInventory: FC = ({ setMode }) => { - const styles = useStyles(getStyles); - const appDispatch = useAppDispatch(); - const navModel = usePerconaNavModel('kubernetes'); - const [selectedCluster, setSelectedCluster] = useState(null); - const [deleteModalVisible, setDeleteModalVisible] = useState(false); - const [viewConfigModalVisible, setViewConfigModalVisible] = useState(false); - const [manageComponentsModalVisible, setManageComponentsModalVisible] = useState(false); - const [operatorToUpdate, setOperatorToUpdate] = useState(null); - const [updateOperatorModalVisible, setUpdateOperatorModalVisible] = useState(false); - const [generateToken] = useCancelToken(); - const [kubernetes, kubernetesLoading] = useKubernetesList(); - const { loading: deleteKubernetesLoading } = useSelector(getDeleteKubernetes); - const { loading: addKubernetesLoading } = useSelector(getAddKubernetes); - const [update, setUpdate] = useState(false); - const [catchFromAsyncThunkAction] = useCatchCancellationError(); - - const loading = (kubernetesLoading || deleteKubernetesLoading || addKubernetesLoading) && !update; - const k8sListShouldBeUpdated = kubernetes && kubernetes.find((item) => item.status === K8SStatus.provisioning); - - const deleteKubernetesCluster = useCallback( - async (force?: boolean) => { - if (selectedCluster) { - setDeleteModalVisible(false); - await appDispatch(deleteKubernetesAction({ kubernetesToDelete: selectedCluster, force })); - setSelectedCluster(null); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCluster] - ); - - const updateK8Clusters = useCallback( - async (triggerLoading = true) => { - await catchFromAsyncThunkAction( - appDispatch( - fetchK8sListAction({ - tokens: { - kubernetes: generateToken(GET_KUBERNETES_CANCEL_TOKEN), - operator: generateToken(CHECK_OPERATOR_UPDATE_CANCEL_TOKEN), - }, - }) - ) - ); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [kubernetes] - ); - - const columns = useMemo( - (): Array> => [ - { - Header: Messages.kubernetes.table.nameColumn, - accessor: 'kubernetesClusterName', - }, - { - Header: Messages.kubernetes.table.clusterStatusColumn, - accessor: (element: Kubernetes) => , - }, - { - Header: Messages.kubernetes.table.operatorsColumn, - accessor: (element: Kubernetes) => ( - - ), - }, - { - Header: Messages.kubernetes.table.actionsColumn, - accessor: (kubernetesCluster: Kubernetes) => - clusterActionsRender({ - setSelectedCluster, - setDeleteModalVisible, - setViewConfigModalVisible, - setManageComponentsModalVisible, - })(kubernetesCluster), - }, - ], - [] - ); - - const AddNewClusterButton = useCallback( - () => ( - setMode('register')} - data-testid="kubernetes-new-cluster-button" - /> - ), - [setMode] - ); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const featureSelector = useCallback(getPerconaSettingFlag('dbaasEnabled'), []); - - useEffect(() => { - let timeout: NodeJS.Timeout; - if (!kubernetesLoading && k8sListShouldBeUpdated) { - if (!update) { - setUpdate(true); - } - timeout = setTimeout(updateK8Clusters, RECHECK_INTERVAL, false); - } - return () => clearTimeout(timeout); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [kubernetesLoading]); - - return ( - - - - - -
-
- -
- {selectedCluster && ( - setViewConfigModalVisible(false)} - selectedCluster={selectedCluster} - /> - )} - setDeleteModalVisible(false)} - > -
{}} - render={({ form, handleSubmit }) => ( - - <> -

{Messages.kubernetes.deleteModal.confirmMessage}

- - - - - - - - )} - /> -
- {selectedCluster && manageComponentsModalVisible && ( - - )} - {selectedCluster && operatorToUpdate && updateOperatorModalVisible && ( - - )} -
} - /> - - - - - ); -}; - -export default KubernetesInventory; diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.test.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.test.ts deleted file mode 100644 index dea193992ed55..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -// eslint-disable-next-line lodash/import-scope -import { renderHook } from '@testing-library/react-hooks'; -import { omit } from 'lodash'; - -import { kubernetesStub } from '../__mocks__/kubernetesStubs'; - -import { useOperatorsComponentsVersions } from './ManageComponentsVersions.hooks'; -import { - psmdbComponentOptionsStubs, - initialValuesStubs, - operatorsOptionsStubs, - possibleComponentOptionsStubs, - versionsStubs, - versionsFieldNameStub, - omitDefaultLabels, -} from './__mocks__/componentsVersionsStubs'; - -jest.mock('../../DBCluster/XtraDB.service'); -jest.mock('../../DBCluster/PSMDB.service'); - -describe('ManageComponentsVersions.hooks::', () => { - it('returns operator components options, versions and initial values with two operators', async () => { - const wrapper = renderHook(() => useOperatorsComponentsVersions(kubernetesStub[0])); - - await wrapper.waitForNextUpdate(); - - const [ - initialValues, - operatorsOptions, - componentOptions, - possibleComponentOptions, - versionsOptions, - versionsFieldName, - ] = wrapper.result.current; - - expect(omit(initialValues, omitDefaultLabels)).toEqual(omit(initialValuesStubs, omitDefaultLabels)); - expect(possibleComponentOptions).toEqual(possibleComponentOptionsStubs); - expect(operatorsOptions).toEqual(operatorsOptionsStubs); - expect(componentOptions).toEqual(psmdbComponentOptionsStubs); - expect(versionsOptions).toEqual(versionsStubs); - expect(versionsFieldName).toEqual(versionsFieldNameStub); - }); - it('returns operator components options, versions and initial values with one operator', async () => { - const newOps = omit(kubernetesStub[0], 'operators.pxc'); - const wrapper = renderHook(() => useOperatorsComponentsVersions(newOps)); - await wrapper.waitForNextUpdate(); - - const [ - initialValues, - operatorsOptions, - componentOptions, - possibleComponentOptions, - versionsOptions, - versionsFieldName, - ] = wrapper.result.current; - - expect(omit(initialValues, omitDefaultLabels)).toEqual( - omit(initialValuesStubs, ['pxcpxc', 'pxchaproxy', 'pxcpxcdefault', 'pxchaproxydefault'].concat(omitDefaultLabels)) - ); - expect(possibleComponentOptions).toEqual(omit(possibleComponentOptionsStubs, 'pxc')); - expect(operatorsOptions).toEqual([operatorsOptionsStubs[0]]); - expect(componentOptions).toEqual(psmdbComponentOptionsStubs); - expect(versionsOptions).toEqual(versionsStubs); - expect(versionsFieldName).toEqual(versionsFieldNameStub); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.ts deleted file mode 100644 index a9bab0ce7294b..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.hooks.ts +++ /dev/null @@ -1,177 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ -import { useEffect, useState } from 'react'; - -import { SelectableValue } from '@grafana/data'; -import { Databases } from 'app/percona/shared/core'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { DATABASE_OPERATORS } from '../../DBCluster/DBCluster.constants'; -import { DBClusterVersion } from '../../DBCluster/DBCluster.types'; -import { newDBClusterService } from '../../DBCluster/DBCluster.utils'; -import { Operators } from '../../DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; -import { Kubernetes } from '../Kubernetes.types'; -import { KubernetesOperatorStatus } from '../OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -import { - buildDefaultFieldName, - buildVersionsFieldName, - componentsToOptions, - findDefaultVersion, - parseDefaultVersionsOptions, - versionsToOptions, -} from './ManageComponentsVersions.utils'; -import { DEFAULT_SUFFIX } from './ManageComponentsVersionsModal.constants'; -import { Messages } from './ManageComponentsVersionsModal.messages'; -import { - ManageComponentsVersionsRenderProps, - ManageComponentVersionsFields, - PossibleComponentOptions, - SetComponentOptionsAction, - SetDefaultFieldNameAction, - SetVersionsFieldNameAction, - SetVersionsOptionsAction, - SupportedComponents, -} from './ManageComponentsVersionsModal.types'; - -export const useOperatorsComponentsVersions = ( - kubernetes: Kubernetes -): [ - ManageComponentsVersionsRenderProps, - SelectableValue[], - SelectableValue[], - PossibleComponentOptions, - SelectableValue[], - string, - string, - boolean, - SetComponentOptionsAction, - SetVersionsOptionsAction, - SetVersionsFieldNameAction, - SetDefaultFieldNameAction -] => { - const [initialValues, setInitialValues] = useState({} as ManageComponentsVersionsRenderProps); - const [operatorsOptions, setOperatorsOptions] = useState([]); - const [componentOptions, setComponentOptions] = useState([]); - const [possibleComponentOptions, setPossibleComponentOptions] = useState({} as PossibleComponentOptions); - const [versionsOptions, setVersionsOptions] = useState([]); - const [versionsFieldName, setVersionsFieldName] = useState(''); - const [defaultFieldName, setDefaultFieldName] = useState(DEFAULT_SUFFIX); - const [loadingComponents, setLoadingComponents] = useState(false); - - useEffect(() => { - const getComponents = async () => { - try { - const { operators, kubernetesClusterName } = kubernetes; - const operatorsList = Object.entries(operators); - let availableOperatorOptions = [] as SelectableValue[]; - let possibleComponentOptions = {} as PossibleComponentOptions; - let initialValues = {} as ManageComponentsVersionsRenderProps; - - setLoadingComponents(true); - - for (const [operator, { status }] of operatorsList) { - if (status === KubernetesOperatorStatus.ok) { - [availableOperatorOptions, possibleComponentOptions, initialValues] = await getOperatorComponentsOptions( - operator as Operators, - kubernetesClusterName, - availableOperatorOptions, - possibleComponentOptions, - initialValues - ); - } - } - - const name = buildVersionsFieldName(initialValues) as string; - const defaultName = buildDefaultFieldName(initialValues) as string; - const selectedOperator = initialValues.operator.value as Operators; - - setComponentOptions(possibleComponentOptions[selectedOperator] as SelectableValue[]); - setOperatorsOptions(availableOperatorOptions); - setPossibleComponentOptions(possibleComponentOptions); - setVersionsOptions(initialValues[name]); - setVersionsFieldName(name); - setDefaultFieldName(defaultName); - setInitialValues(initialValues); - } catch (e) { - logger.error(e); - } finally { - setLoadingComponents(false); - } - }; - getComponents(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return [ - initialValues, - operatorsOptions, - componentOptions, - possibleComponentOptions, - versionsOptions, - versionsFieldName, - defaultFieldName, - loadingComponents, - setComponentOptions, - setVersionsOptions, - setVersionsFieldName, - setDefaultFieldName, - ]; -}; - -const getOperatorComponentsOptions = async ( - operator: Operators, - kubernetesClusterName: string, - operatorOptions: SelectableValue[], - componentOptions: PossibleComponentOptions, - initialValues: ManageComponentsVersionsRenderProps -): Promise<[SelectableValue[], PossibleComponentOptions, ManageComponentsVersionsRenderProps]> => { - const service = newDBClusterService(DATABASE_OPERATORS[operator] as Databases); - const components = await service.getComponents(kubernetesClusterName); - const operatorVersion = components.versions[0]; - const options = componentsToOptions(operatorVersion.matrix); - const newComponentOptions = { - ...componentOptions, - [operator]: options, - }; - const newOperatorOptions = [ - ...operatorOptions, - { - name: operator, - value: operator, - label: Messages.operatorLabel[operator](operatorVersion.operator), - }, - ]; - const newInitialValues = buildInitialValues(initialValues, operator, operatorVersion, newOperatorOptions, options); - - return [newOperatorOptions, newComponentOptions, newInitialValues]; -}; - -const buildInitialValues = ( - initialValues: ManageComponentsVersionsRenderProps, - operator: Operators, - operatorVersion: DBClusterVersion, - operatorOptions: SelectableValue[], - componentOptions: SelectableValue[] -): ManageComponentsVersionsRenderProps => { - const newInitialValues = {} as ManageComponentsVersionsRenderProps; - - if (Object.keys(initialValues).length === 0) { - newInitialValues[ManageComponentVersionsFields.operator] = operatorOptions[0]; - newInitialValues[ManageComponentVersionsFields.component] = componentOptions[0]; - } - - Object.keys(SupportedComponents).forEach((key) => { - const versions = operatorVersion.matrix[key as SupportedComponents]; - - if (versions) { - const versionsOptions = versionsToOptions(versions); - - newInitialValues[`${operator}${key}`] = versionsOptions; - newInitialValues[`${operator}${key}${DEFAULT_SUFFIX}`] = parseDefaultVersionsOptions([ - findDefaultVersion(versionsOptions) as SelectableValue, - ])[0]; - } - }); - - return { ...initialValues, ...newInitialValues }; -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.test.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.test.ts deleted file mode 100644 index e49f768eb8d7c..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { psmdbComponentsVersionsStubs, versionsStub as versionsAPI } from '../../DBCluster/__mocks__/dbClustersStubs'; - -import { - buildVersionsFieldName, - componentsToOptions, - findDefaultVersion, - findRecommendedVersions, - getDefaultOptions, - requiredVersions, - versionsToOptions, -} from './ManageComponentsVersions.utils'; -import { ManageComponentVersionsFields } from './ManageComponentsVersionsModal.types'; -import { psmdbComponentOptionsStubs, versionsStubs as versions } from './__mocks__/componentsVersionsStubs'; - -describe('ManageComponentsVersions.utils::', () => { - const values = { - [ManageComponentVersionsFields.operator]: { value: 'test_operator' }, - [ManageComponentVersionsFields.component]: { value: 'test_component' }, - }; - - it('checks that at least one version is checked', () => { - expect(requiredVersions(versions)).toBeUndefined(); - expect(requiredVersions(versions.map((v) => ({ ...v, value: false })))).not.toBeUndefined(); - }); - it('converts components to options', () => { - const components = psmdbComponentsVersionsStubs.versions[0].matrix; - - expect(componentsToOptions(components)).toEqual(psmdbComponentOptionsStubs); - }); - it('converts versions to options', () => { - expect(versionsToOptions(versionsAPI)).toEqual(versions); - }); - it('builds versions field name', () => { - expect(buildVersionsFieldName(values)).toEqual('test_operatortest_component'); - }); - it('finds recommended versions', () => { - expect(findRecommendedVersions(versions).length).toBe(1); - expect(findRecommendedVersions([versions[0]]).length).toBe(0); - }); - it('finds default version', () => { - expect(findDefaultVersion(versions)).toBe(versions[1]); - expect(findDefaultVersion([versions[0]])).toBeUndefined(); - }); - it('returns default options', () => { - const options = [ - { name: 'test option 1', value: true }, - { name: 'test option 2', value: false }, - { name: 'test option 3', value: true }, - ]; - const newValues = { - ...values, - test_operatortest_component: options, - }; - expect(getDefaultOptions(newValues).length).toBe(2); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.tsx b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.tsx deleted file mode 100644 index 459b99aa19459..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; - -import { SelectableValue } from '@grafana/data'; - -import { DBClusterComponent, DBClusterComponentVersionStatus, DBClusterMatrix } from '../../DBCluster/DBCluster.types'; -import { OptionContent } from '../../DBCluster/OptionContent/OptionContent'; - -import { DEFAULT_SUFFIX, VERSION_PREFIX } from './ManageComponentsVersionsModal.constants'; -import { Messages } from './ManageComponentsVersionsModal.messages'; -import { - ManageComponentsVersionsRenderProps, - ManageComponentVersionsFields, - SupportedComponents, -} from './ManageComponentsVersionsModal.types'; - -export const requiredVersions = (versions: SelectableValue[]) => { - if (!versions || !Array.isArray(versions)) { - return undefined; - } - - const checked = versions.filter((v) => v.value); - - return checked.length > 0 ? undefined : Messages.required; -}; - -export const componentsToOptions = (value: DBClusterMatrix): SelectableValue[] => - Object.keys(value) - .filter((key) => key in SupportedComponents) - .map((key) => ({ - name: key, - value: key, - label: Messages.componentLabel[key as SupportedComponents], - })); - -export const versionsToOptions = (component: DBClusterComponent): SelectableValue[] => - Object.entries(component).map(([key, { status, disabled, default: isDefault }]) => ({ - name: `${VERSION_PREFIX}${key}`, - value: !disabled, - label: key, - status, - default: isDefault, - })); - -export const buildVersionsFieldName = (values: ManageComponentsVersionsRenderProps) => { - if (!values[ManageComponentVersionsFields.operator] || !values[ManageComponentVersionsFields.component]) { - return undefined; - } - - return `${values[ManageComponentVersionsFields.operator].value}${ - values[ManageComponentVersionsFields.component].value - }`; -}; - -export const buildDefaultFieldName = (values: ManageComponentsVersionsRenderProps) => { - if (!values[ManageComponentVersionsFields.operator] || !values[ManageComponentVersionsFields.component]) { - return undefined; - } - - return `${values[ManageComponentVersionsFields.operator].value}${ - values[ManageComponentVersionsFields.component].value - }${DEFAULT_SUFFIX}`; -}; - -export const findRecommendedVersions = (versions: SelectableValue[]) => - versions.filter(({ status }) => status === DBClusterComponentVersionStatus.recommended); - -export const findDefaultVersion = (versions: SelectableValue[]): SelectableValue | undefined => - versions.find(({ default: isDefault }) => isDefault); - -export const getDefaultOptions = (values: ManageComponentsVersionsRenderProps): SelectableValue[] => { - const versionsFieldName = buildVersionsFieldName(values); - const options = (versionsFieldName ? values[versionsFieldName] : []) as SelectableValue[]; - - return options.filter(({ value }) => value); -}; - -export const defaultRequired = (option: SelectableValue) => (option && option.label ? undefined : Messages.required); - -export const parseDefaultVersionsOptions = (options: SelectableValue[]) => - options.map(({ label, status, ...option }) => ({ - ...option, - status, - label: ( - - ), - })); diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.constants.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.constants.ts deleted file mode 100644 index f8203e344a3ea..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const DEFAULT_SUFFIX = 'default'; -export const VERSION_PREFIX = 'v'; diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.messages.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.messages.ts deleted file mode 100644 index 8a0dfafbf33a7..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.messages.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Operators } from '../../DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; - -export const Messages = { - cancel: 'Cancel', - fields: { - component: 'Component', - versions: 'Versions', - operator: 'Operator', - default: 'Default', - }, - title: 'Manage Components Versions', - required: 'Required field', - recommended: 'Recommended', - save: 'Save', - success: 'Components versions updated successfully', - operatorLabel: { - [Operators.pxc]: (version: string) => `Percona Operator for MySQL ${version}`, - [Operators.psmdb]: (version: string) => `Percona Operator for MongoDB ${version}`, - }, - componentLabel: { - pxc: 'Percona Operator for MySQL', - haproxy: 'HAProxy', - backup: 'Backup', - mongod: 'Percona Operator for MongoDB', - }, -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.styles.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.styles.ts deleted file mode 100644 index fcd065e7a1a0c..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.styles.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { css } from '@emotion/css'; - -export const getStyles = () => ({ - versionsWrapper: css` - min-height: 40px; - max-height: 200px; - `, - defaultWrapper: css` - div[class$='-Menu'], - div[class$='-grafana-select-menu'] { - svg { - display: none; - } - } - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.test.tsx b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.test.tsx deleted file mode 100644 index c6099b68470c7..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.test.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { render, fireEvent, screen } from '@testing-library/react'; -import React from 'react'; - -import { kubernetesStub } from '../__mocks__/kubernetesStubs'; - -import { ManageComponentsVersionsModal } from './ManageComponentsVersionsModal'; -import { - operatorsOptionsStubs, - psmdbComponentOptionsStubs, - versionsFieldNameStub, - versionsStubs, -} from './__mocks__/componentsVersionsStubs'; - -jest.mock('app/core/app_events'); -jest.mock('./ManageComponentsVersions.hooks'); - -describe('ManageComponentsVersionsModal::', () => { - it('renders form with operator, component and versions field with correct values', () => { - render( - {}} - isVisible - selectedKubernetes={kubernetesStub[0]} - setVisible={jest.fn()} - /> - ); - - expect( - screen.getByTestId('kubernetes-operator').textContent?.includes(operatorsOptionsStubs[0].label) - ).toBeTruthy(); - expect( - screen.getByTestId('kubernetes-component').textContent?.includes(psmdbComponentOptionsStubs[0].label) - ).toBeTruthy(); - expect(screen.getByTestId(`${versionsFieldNameStub}-options`).children).toHaveLength(versionsStubs.length); - expect(screen.getByTestId('kubernetes-default-version')).toBeInTheDocument(); - }); - it('calls setVisible on cancel', () => { - const setVisible = jest.fn(); - render( - {}} - isVisible - selectedKubernetes={kubernetesStub[0]} - setVisible={setVisible} - /> - ); - - const btn = screen.getByTestId('kubernetes-components-versions-cancel'); - fireEvent.click(btn); - - expect(setVisible).toHaveBeenCalledWith(false); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.tsx b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.tsx deleted file mode 100644 index dd6bb2613f943..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.tsx +++ /dev/null @@ -1,217 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ -import { FormApi } from 'final-form'; -import React, { FC } from 'react'; -import { Field, Form, FormRenderProps } from 'react-final-form'; - -import { AppEvents, SelectableValue } from '@grafana/data'; -import { Button, HorizontalGroup, useStyles } from '@grafana/ui'; -import appEvents from 'app/core/app_events'; -import { LoaderButton } from 'app/percona/shared/components/Elements/LoaderButton'; -import { Modal } from 'app/percona/shared/components/Elements/Modal'; -import { Overlay } from 'app/percona/shared/components/Elements/Overlay'; -import { SelectFieldAdapter } from 'app/percona/shared/components/Form/FieldAdapters/FieldAdapters'; -import { MultiCheckboxField } from 'app/percona/shared/components/Form/MultiCheckbox/MultiCheckboxField'; -import { Databases } from 'app/percona/shared/core'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { DATABASE_OPERATORS } from '../../DBCluster/DBCluster.constants'; -import { newDBClusterService } from '../../DBCluster/DBCluster.utils'; -import { Operators } from '../../DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; -import { KubernetesOperatorStatus } from '../OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -import { useOperatorsComponentsVersions } from './ManageComponentsVersions.hooks'; -import { - buildDefaultFieldName, - buildVersionsFieldName, - defaultRequired, - findRecommendedVersions, - getDefaultOptions, - parseDefaultVersionsOptions, - requiredVersions, -} from './ManageComponentsVersions.utils'; -import { Messages } from './ManageComponentsVersionsModal.messages'; -import { getStyles } from './ManageComponentsVersionsModal.styles'; -import { - ManageComponentsVersionsModalProps, - ManageComponentsVersionsRenderProps, - ManageComponentVersionsFields, -} from './ManageComponentsVersionsModal.types'; - -export const ManageComponentsVersionsModal: FC = ({ - selectedKubernetes, - isVisible, - setVisible, - setSelectedCluster, -}) => { - const styles = useStyles(getStyles); - const [ - initialValues, - operatorsOptions, - componentOptions, - possibleComponentOptions, - versionsOptions, - versionsFieldName, - defaultFieldName, - loadingComponents, - setComponentOptions, - setVersionsOptions, - setVersionsFieldName, - setDefaultFieldName, - ] = useOperatorsComponentsVersions(selectedKubernetes); - const onChangeComponent = - (values: ManageComponentsVersionsRenderProps, change: FormApi['change']) => (component: SelectableValue) => { - const newValues = { ...values, [ManageComponentVersionsFields.component]: component }; - const name = buildVersionsFieldName(newValues) as string; - const defaultName = buildDefaultFieldName(newValues) as string; - const options = values[name]; - - setVersionsFieldName(name); - setVersionsOptions(options); - setDefaultFieldName(defaultName); - - change(ManageComponentVersionsFields.component, component); - change(defaultName, values[defaultName]); - }; - const onChangeOperator = - (values: ManageComponentsVersionsRenderProps, change: FormApi['change']) => (operator: SelectableValue) => { - const newComponentOptions = possibleComponentOptions[operator.value as Operators] as SelectableValue[]; - const newValues = { - ...values, - [ManageComponentVersionsFields.operator]: operator, - [ManageComponentVersionsFields.component]: newComponentOptions[0], - }; - const name = buildVersionsFieldName(newValues) as string; - const defaultName = buildDefaultFieldName(newValues) as string; - const options = values[name]; - - setComponentOptions(newComponentOptions); - setVersionsFieldName(name); - setVersionsOptions(options); - setDefaultFieldName(defaultName); - - change(ManageComponentVersionsFields.component, newComponentOptions[0]); - change(ManageComponentVersionsFields.operator, operator); - change(defaultName, values[defaultName]); - }; - const onSubmit = async (values: ManageComponentsVersionsRenderProps) => { - const { operators, kubernetesClusterName } = selectedKubernetes; - const operatorsList = Object.entries(operators); - - try { - for (const [operator, { status }] of operatorsList) { - if (status === KubernetesOperatorStatus.ok) { - const service = newDBClusterService(DATABASE_OPERATORS[operator as Operators] as Databases); - - await service.setComponents(kubernetesClusterName, values); - } - } - - setVisible(false); - appEvents.emit(AppEvents.alertSuccess, [Messages.success]); - } catch (e) { - logger.error(e); - } finally { - setSelectedCluster(null); - } - }; - - return ( - setVisible(false)}> - -
) => { - const name = buildVersionsFieldName(values); - const defaultName = buildDefaultFieldName(values); - const defaultVersionOptions = getDefaultOptions(values); - const defaultVersion = defaultName ? values[defaultName] : undefined; - const showDefaultErrorOnBlur = !defaultName && defaultVersionOptions.length === 0; - const selectedVersions = (name ? values[name] : []) as SelectableValue[]; - const isDefaultDisabled = defaultVersion - ? selectedVersions.find(({ name, value }) => name === defaultVersion.name && !value) - : false; - - // clear default version when the version is disabled - if (defaultName && defaultVersion && isDefaultDisabled) { - form.change(defaultName, { - value: undefined, - label: undefined, - }); - } - - return ( - - <> - - - - - - - - {Messages.save} - - - - - ); - }} - /> -
-
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types.ts deleted file mode 100644 index bced4458ccfa5..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersionsModal.types.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ -import { SelectableValue } from '@grafana/data'; - -import { Operators } from '../../DBCluster/EditDBClusterPage/DBClusterBasicOptions/DBClusterBasicOptions.types'; -import { Kubernetes } from '../Kubernetes.types'; - -export interface ManageComponentsVersionsModalProps { - selectedKubernetes: Kubernetes; - isVisible: boolean; - setVisible: (value: boolean) => void; - setSelectedCluster: (kubernetesCluster: Kubernetes | null) => void; -} - -export interface ManageComponentsVersionsRenderProps { - operator: SelectableValue; - component: SelectableValue; - // used for dynamically generated attributes - // based on operator and supported components - [key: string]: any; -} - -export interface PossibleComponentOptions { - [Operators.pxc]?: SelectableValue[]; - [Operators.psmdb]?: SelectableValue[]; -} - -export enum SupportedComponents { - pxc = 'pxc', - haproxy = 'haproxy', - mongod = 'mongod', -} - -export enum ManageComponentVersionsFields { - operator = 'operator', - component = 'component', -} - -export type SetComponentOptionsAction = (options: SelectableValue[]) => void; -export type SetVersionsOptionsAction = (options: SelectableValue[]) => void; -export type SetVersionsFieldNameAction = (name: string) => void; -export type SetDefaultFieldNameAction = (name: string) => void; diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/ManageComponentsVersions.hooks.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/ManageComponentsVersions.hooks.ts deleted file mode 100644 index 8aabba5246e72..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/ManageComponentsVersions.hooks.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - initialValuesStubs, - operatorsOptionsStubs, - possibleComponentOptionsStubs, - psmdbComponentOptionsStubs, - versionsFieldNameStub, - versionsStubs, - defaultFieldNameStub, -} from './componentsVersionsStubs'; - -export const useOperatorsComponentsVersions = () => [ - initialValuesStubs, - operatorsOptionsStubs, - psmdbComponentOptionsStubs, - possibleComponentOptionsStubs, - versionsStubs, - versionsFieldNameStub, - defaultFieldNameStub, - false, - jest.fn(), - jest.fn(), - jest.fn(), - jest.fn(), -]; diff --git a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/componentsVersionsStubs.ts b/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/componentsVersionsStubs.ts deleted file mode 100644 index 2328fbf4203df..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/__mocks__/componentsVersionsStubs.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { DEFAULT_SUFFIX } from '../ManageComponentsVersionsModal.constants'; - -export const versionsStubs = [ - { name: 'v1.0', value: true, label: '1.0', status: 'available', default: false }, - { name: 'v2.0', value: true, label: '2.0', status: 'recommended', default: true }, -]; - -export const initialValuesStubs = { - operator: { name: 'psmdb', value: 'psmdb', label: 'Percona Operator for MongoDB 1' }, - component: { name: 'mongod', value: 'mongod', label: 'Percona Operator for MongoDB' }, - psmdbmongod: versionsStubs, - pxcpxc: versionsStubs, - pxchaproxy: versionsStubs, - psmdbmongoddefault: versionsStubs[1], - pxchaproxydefault: versionsStubs[1], - pxcpxcdefault: versionsStubs[1], -}; - -// use to omit default labels form testing -// due to parsing the label to a component to show the recommended option -export const omitDefaultLabels = ['psmdbmongoddefault.label', 'pxchaproxydefault.label', 'pxcpxcdefault.label']; - -export const possibleComponentOptionsStubs = { - psmdb: [{ name: 'mongod', value: 'mongod', label: 'Percona Operator for MongoDB' }], - pxc: [ - { name: 'pxc', value: 'pxc', label: 'Percona Operator for MySQL' }, - { name: 'haproxy', value: 'haproxy', label: 'HAProxy' }, - ], -}; - -export const operatorsOptionsStubs = [ - { name: 'psmdb', value: 'psmdb', label: 'Percona Operator for MongoDB 1' }, - { name: 'pxc', value: 'pxc', label: 'Percona Operator for MySQL 1' }, -]; - -export const psmdbComponentOptionsStubs = [{ name: 'mongod', value: 'mongod', label: 'Percona Operator for MongoDB' }]; - -export const versionsFieldNameStub = 'psmdbmongod'; - -export const defaultFieldNameStub = `${versionsFieldNameStub}${DEFAULT_SUFFIX}`; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.styles.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.styles.ts deleted file mode 100644 index c65f7c9293c65..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.styles.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - clusterStatusWrapper: css` - align-items: center; - display: flex; - justify-content: center; - padding: ${spacing.xs} 0; - - a > span { - cursor: pointer; - } - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.test.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.test.tsx deleted file mode 100644 index 08c76bc5b68bb..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.test.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { Databases } from 'app/percona/shared/core'; - -import { kubernetesStub } from '../../__mocks__/kubernetesStubs'; - -import { KubernetesOperatorStatus } from './KubernetesOperatorStatus'; -import { KubernetesOperatorStatus as Status } from './KubernetesOperatorStatus.types'; - -describe('KubernetesOperatorStatus::', () => { - it('renders installation link when unavailable', () => { - render( - - ); - - expect(screen.getByTestId('cluster-link')).toBeInTheDocument(); - }); - - it("doesn't render link when installed", () => { - render( - - ); - expect(screen.queryByTestId('cluster-link')).not.toBeInTheDocument(); - }); - - it('renders link when available new version is available', () => { - render( - - ); - - expect(screen.getByTestId('cluster-link')).toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.tsx deleted file mode 100644 index 95896924d0bd7..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* eslint-disable react/display-name */ -import React, { FC } from 'react'; - -import { Button, useStyles } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { OPERATOR_LABELS } from 'app/percona/shared/core'; - -import { DATABASE_COMPONENT_TO_UPDATE_MAP } from '../../Kubernetes.constants'; - -import { getStyles } from './KubernetesOperatorStatus.styles'; -import { KubernetesOperatorStatus as Status, KubernetesOperatorStatusProps } from './KubernetesOperatorStatus.types'; -import { getStatusLink } from './KubernetesOperatorStatus.utils'; -import { OperatorStatus } from './OperatorStatus/OperatorStatus'; - -export const KubernetesOperatorStatus: FC = ({ - operator, - databaseType, - kubernetes, - setSelectedCluster, - setOperatorToUpdate, - setUpdateOperatorModalVisible, -}) => { - const styles = useStyles(getStyles); - const { status, availableVersion } = operator; - const isVersionAvailable = (status === Status.ok || status === Status.unsupported) && !!availableVersion; - const showLink = status === Status.unavailable || isVersionAvailable; - const updateOperator = () => { - setSelectedCluster(kubernetes); - setOperatorToUpdate({ - operatorType: DATABASE_COMPONENT_TO_UPDATE_MAP[databaseType]!, - operatorTypeLabel: OPERATOR_LABELS[databaseType], - ...operator, - }); - setUpdateOperatorModalVisible(true); - }; - - return ( -
- {showLink ? ( - - - - ) : ( - - )} - {isVersionAvailable && ( - - )} -
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types.ts deleted file mode 100644 index 6afdf35464f43..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { BadgeColor } from '@grafana/ui/src'; -import { Databases } from 'app/percona/shared/core'; - -import { Kubernetes, Operator, OperatorToUpdate } from '../../Kubernetes.types'; - -export enum KubernetesOperatorStatus { - ok = 'OPERATORS_STATUS_OK', - invalid = 'OPERATORS_STATUS_INVALID', - unsupported = 'OPERATORS_STATUS_UNSUPPORTED', - unavailable = 'OPERATORS_STATUS_NOT_INSTALLED', -} - -export const KubernetesOperatorStatusColors: Record = { - [KubernetesOperatorStatus.ok]: 'green', - [KubernetesOperatorStatus.unsupported]: 'purple', - [KubernetesOperatorStatus.unavailable]: 'blue', - [KubernetesOperatorStatus.invalid]: 'red', -}; - -export interface KubernetesOperatorStatusProps { - operator: Operator; - databaseType: Databases; - kubernetes: Kubernetes; - setSelectedCluster: (kubernetes: Kubernetes) => void; - setOperatorToUpdate: (operator: OperatorToUpdate) => void; - setUpdateOperatorModalVisible: (isVisible: boolean) => void; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.utils.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.utils.ts deleted file mode 100644 index 0f40d9825ffb4..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.utils.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Databases } from 'app/percona/shared/core'; - -import { Kubernetes } from '../../Kubernetes.types'; - -import { KubernetesOperatorStatus } from './KubernetesOperatorStatus.types'; -import { OPERATORS_DOCS_URL, OPERATORS_RN_URL, VERSION_PLACEHOLDER } from './OperatorStatus/OperatorStatus.constants'; - -export const hasActiveOperator = (kubernetes: Kubernetes) => - Object.values(kubernetes.operators).filter(({ status }) => status === KubernetesOperatorStatus.ok).length > 0; - -export const getStatusLink = (status: KubernetesOperatorStatus, databaseType: Databases, version?: string) => - status === KubernetesOperatorStatus.unavailable - ? OPERATORS_DOCS_URL[databaseType] - : OPERATORS_RN_URL[databaseType].replace(VERSION_PLACEHOLDER, version || ''); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.constants.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.constants.ts deleted file mode 100644 index d87394ed805c9..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.constants.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Databases } from 'app/percona/shared/core'; - -import { KubernetesOperatorStatus } from '../KubernetesOperatorStatus.types'; - -export const OPERATORS_DOCS_URL = { - [Databases.mysql]: 'https://per.co.na/x0wBC4', - [Databases.mongodb]: 'https://per.co.na/03Clok', - [Databases.postgresql]: '', - [Databases.proxysql]: '', - [Databases.mariadb]: '', - [Databases.haproxy]: '', -}; - -export const VERSION_PLACEHOLDER = ''; - -export const OPERATORS_RN_URL = { - [Databases.mysql]: `https://www.percona.com/doc/kubernetes-operator-for-pxc/ReleaseNotes/Kubernetes-Operator-for-PXC-RN${VERSION_PLACEHOLDER}.html`, - [Databases.mongodb]: `https://www.percona.com/doc/kubernetes-operator-for-psmongodb/RN/Kubernetes-Operator-for-PSMONGODB-RN${VERSION_PLACEHOLDER}.html`, - [Databases.postgresql]: '', - [Databases.proxysql]: '', - [Databases.mariadb]: '', - [Databases.haproxy]: '', -}; - -export const STATUS_DATA_QA = { - [KubernetesOperatorStatus.invalid]: 'invalid', - [KubernetesOperatorStatus.ok]: 'ok', - [KubernetesOperatorStatus.unsupported]: 'unsupported', - [KubernetesOperatorStatus.unavailable]: 'unavailable', -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.styles.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.styles.ts deleted file mode 100644 index 153095e672c49..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.styles.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { css } from '@emotion/css'; -import tinycolor from 'tinycolor2'; - -import { GrafanaTheme2 } from '@grafana/data'; - -export const getStyles = ({ v1, isDark }: GrafanaTheme2) => { - const sourceColor = v1.palette.gray1; - let borderColor; - let bgColor; - let textColor; - - if (isDark) { - bgColor = tinycolor(sourceColor).setAlpha(0.15).toString(); - borderColor = tinycolor(sourceColor).darken(30).toString(); - textColor = tinycolor(sourceColor).lighten(15).toString(); - } else { - bgColor = tinycolor(sourceColor).setAlpha(0.15).toString(); - borderColor = tinycolor(sourceColor).lighten(20).toString(); - textColor = tinycolor(sourceColor).darken(15).toString(); - } - - return { - wrapperGrey: css` - background: ${bgColor}; - border: 1px solid ${borderColor}; - color: ${textColor}; - `, - versionAvailable: css` - margin-left: ${v1.spacing.xs}; - `, - }; -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.test.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.test.tsx deleted file mode 100644 index 343e5a1859106..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.test.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { KubernetesOperatorStatus as Status } from '../KubernetesOperatorStatus.types'; - -import { OperatorStatus } from './OperatorStatus'; - -describe('OperatorStatus::', () => { - it('renders correctly when active', () => { - render(); - - expect(screen.getByTestId('cluster-status-ok')).toBeInTheDocument(); - expect(screen.queryByTestId('operator-version-available')).not.toBeInTheDocument(); - }); - - it('renders available version when new version available and operator is installed', () => { - const operator = { status: Status.ok, availableVersion: '1.8.0' }; - render(); - - expect(screen.getByTestId('operator-version-available')).toBeInTheDocument(); - }); - - it("doesn't render available version when operator is unavailable", () => { - const operator = { status: Status.unavailable, availableVersion: '1.8.0' }; - render(); - expect(screen.queryByTestId('operator-version-available')).not.toBeInTheDocument(); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.tsx deleted file mode 100644 index 012669b7c34c6..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, { FC } from 'react'; - -import { Badge, BadgeColor, useStyles2 } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; - -import { KubernetesOperatorStatus as Status, KubernetesOperatorStatusColors } from '../KubernetesOperatorStatus.types'; - -import { STATUS_DATA_QA } from './OperatorStatus.constants'; -import { getStyles } from './OperatorStatus.styles'; -import { OperatorStatusProps } from './OperatorStatus.types'; - -const { operatorStatus } = Messages.kubernetes; - -export const OperatorStatus: FC = ({ operator }) => { - const styles = useStyles2(getStyles); - const { status, availableVersion } = operator; - const showVersionAvailable = (status === Status.ok || status === Status.unsupported) && !!availableVersion; - - const statusColor: BadgeColor = showVersionAvailable ? 'orange' : KubernetesOperatorStatusColors[status]; - const externalLink: boolean = status === Status.unavailable || showVersionAvailable; - - return ( - - {operatorStatus[status]} - {showVersionAvailable && ( - - {operatorStatus.getNewVersionAvailable(availableVersion)} - - )} - - } - color={statusColor} - data-testid={`cluster-status-${STATUS_DATA_QA[status]}`} - icon={externalLink ? 'external-link-alt' : undefined} - className={status === Status.unsupported ? styles.wrapperGrey : undefined} - /> - ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.types.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.types.ts deleted file mode 100644 index 7b6d891c09462..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/OperatorStatus/OperatorStatus.types.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Operator } from '../../../Kubernetes.types'; - -export interface OperatorStatusProps { - operator: Operator; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.styles.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.styles.ts deleted file mode 100644 index 962847dbac8f4..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.styles.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ palette, spacing }: GrafanaTheme) => ({ - modalWrapper: css` - div[data-testid='modal-body'] { - max-width: none; - } - `, - updateModalContent: css` - margin-bottom: ${spacing.xl}; - `, - versionHighlight: css` - color: ${palette.warn}; - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.test.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.test.tsx deleted file mode 100644 index cf74616f9bde1..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.test.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { render, screen, fireEvent } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; - -import { configureStore } from 'app/store/configureStore'; -import { StoreState } from 'app/types'; - -import { ComponentToUpdate } from '../../../Kubernetes.types'; -import { KubernetesOperatorStatus } from '../KubernetesOperatorStatus.types'; - -import { UpdateOperatorModal } from './UpdateOperatorModal'; - -jest.mock('app/percona/dbaas/components/Kubernetes/Kubernetes.service'); - -describe('UpdateOperatorModal::', () => { - const operator = { - status: KubernetesOperatorStatus.ok, - version: '1.7.0', - availableVersion: '1.8.0', - operatorType: ComponentToUpdate.pxc, - operatorTypeLabel: 'PXC', - }; - - it('should render message with new operator version', () => { - render( - - - - ); - const message = 'PXC 1.7.0 to version 1.8.0 in test_cluster'; - - expect(screen.getByTestId('update-operator-message')).toHaveTextContent(message); - }); - - it('should clear selected clsuter and operator on close', async () => { - const setVisible = jest.fn(); - const setSelectedCluster = jest.fn(); - const setOperatorToUpdate = jest.fn(); - - render( - - - - ); - - fireEvent.click(screen.getByTestId('confirm-update-operator-button')); - - expect(setVisible).toHaveBeenCalledWith(false); - expect(setSelectedCluster).toHaveBeenCalledWith(null); - expect(setOperatorToUpdate).toHaveBeenCalledWith(null); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.tsx deleted file mode 100644 index 377a95a0cd6a1..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { FC, useCallback } from 'react'; - -import { Button, HorizontalGroup, useStyles } from '@grafana/ui'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { Modal } from 'app/percona/shared/components/Elements/Modal'; -import { instalKuberneteslOperatorAction } from 'app/percona/shared/core/reducers'; -import { logger } from 'app/percona/shared/helpers/logger'; -import { useDispatch } from 'app/types'; - -import { getStyles } from './UpdateOperatorModal.styles'; -import { UpdateOperatorModalProps } from './UpdateOperatorModal.types'; - -const { title, confirm, cancel, buildUpdateOperatorMessage } = Messages.kubernetes.updateOperatorModal; - -export const UpdateOperatorModal: FC = ({ - kubernetesClusterName, - selectedOperator, - isVisible, - setVisible, - setSelectedCluster, - setOperatorToUpdate, -}) => { - const styles = useStyles(getStyles); - const dispatch = useDispatch(); - const { operatorType, operatorTypeLabel, version, availableVersion } = selectedOperator; - - const onClose = useCallback(() => { - setVisible(false); - setSelectedCluster(null); - setOperatorToUpdate(null); - }, [setVisible, setSelectedCluster, setOperatorToUpdate]); - - const updateOperator = useCallback(async () => { - try { - onClose(); - dispatch( - instalKuberneteslOperatorAction({ - kubernetesClusterName, - operatorType, - availableVersion: availableVersion || '', - }) - ); - } catch (e) { - logger.error(e); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [kubernetesClusterName, selectedOperator]); - - return ( -
- -

- {buildUpdateOperatorMessage( - operatorTypeLabel, - {availableVersion}, - {kubernetesClusterName}, - version - )} -

- - - - -
-
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.types.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.types.ts deleted file mode 100644 index 234ca16c4eb08..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/KubernetesOperatorStatus/UpdateOperatorModal/UpdateOperatorModal.types.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Kubernetes, OperatorToUpdate } from '../../../Kubernetes.types'; - -export interface UpdateOperatorModalProps { - kubernetesClusterName: string; - selectedOperator: OperatorToUpdate; - isVisible: boolean; - setVisible: (value: boolean) => void; - setSelectedCluster: (kubernetes: Kubernetes | null) => void; - setOperatorToUpdate: (operator: OperatorToUpdate | null) => void; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.styles.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.styles.ts deleted file mode 100644 index ec1066f2bfbfb..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.styles.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing, typography }: GrafanaTheme) => ({ - connectionItemWrapper: css` - display: flex; - align-items: center; - margin-bottom: ${spacing.xxs}; - `, - connectionItemLabel: css` - font-weight: ${typography.weight.bold}; - `, - connectionItemValue: css` - margin-left: ${spacing.sm}; - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.test.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.test.tsx deleted file mode 100644 index be48875c037f8..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.test.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { render } from '@testing-library/react'; -import React from 'react'; - -import { Databases } from 'app/percona/shared/core'; - -import { kubernetesStub } from '../__mocks__/kubernetesStubs'; - -import { KubernetesOperatorStatus } from './KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { OperatorStatusItem } from './OperatorStatusItem'; - -describe('OperatorStatusItem::', () => { - it('renders', () => { - const { container } = render( - - ); - - expect(container).toHaveTextContent('Percona Operator for MySQL'); - expect(container).toHaveTextContent('Installed'); - expect(container).not.toHaveTextContent('1.8.0'); - }); - it('renders with operator version', () => { - const operator = { status: KubernetesOperatorStatus.ok, version: '1.8.0' }; - const { container } = render( - - ); - - expect(container).toHaveTextContent('Percona Operator for MySQL'); - expect(container).toHaveTextContent('Installed'); - expect(container).toHaveTextContent('1.8.0'); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.tsx deleted file mode 100644 index c09f3b197edf9..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React, { FC } from 'react'; - -import { useStyles } from '@grafana/ui'; -import { OPERATOR_FULL_LABELS } from 'app/percona/shared/core'; - -import { KubernetesClusterStatus } from '../KubernetesClusterStatus/KubernetesClusterStatus.types'; - -import { KubernetesOperatorStatus } from './KubernetesOperatorStatus/KubernetesOperatorStatus'; -import { KubernetesOperatorStatus as Status } from './KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { getStyles } from './OperatorStatusItem.styles'; -import { OperatorStatusItemProps } from './OperatorStatusItem.types'; -import { buildOperatorLabel } from './OperatorStatusItem.utils'; - -export const OperatorStatusItem: FC = ({ - operator, - databaseType, - kubernetes, - setSelectedCluster, - setOperatorToUpdate, - setUpdateOperatorModalVisible, - dataTestId, -}) => { - const styles = useStyles(getStyles); - - const showStatus = !( - kubernetes.status === KubernetesClusterStatus.provisioning && operator.status === Status.unavailable - ); - - return ( -
- - {buildOperatorLabel(operator, databaseType)} - {showStatus ? ':' : ''} - - {showStatus && ( - - - - )} -
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.types.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.types.ts deleted file mode 100644 index 63d4f3b2a38a9..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.types.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Databases } from 'app/percona/shared/core'; - -import { Kubernetes, Operator, OperatorToUpdate } from '../Kubernetes.types'; - -export interface OperatorStatusItemProps { - dataTestId?: string; - databaseType: Databases; - operator: Operator; - kubernetes: Kubernetes; - setSelectedCluster: (kubernetes: Kubernetes) => void; - setOperatorToUpdate: (operator: OperatorToUpdate) => void; - setUpdateOperatorModalVisible: (isVisible: boolean) => void; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.test.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.test.ts deleted file mode 100644 index 16f30f2869b61..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Databases, OPERATOR_LABELS } from 'app/percona/shared/core'; - -import { KubernetesOperatorStatus } from './KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { buildOperatorLabel } from './OperatorStatusItem.utils'; - -describe('OperatorStatusItems.utils:: ', () => { - it('should return operator label with version', () => { - const operator = { - status: KubernetesOperatorStatus.ok, - version: '1.8.0', - }; - const expected = `${OPERATOR_LABELS[Databases.mysql]} 1.8.0`; - - expect(buildOperatorLabel(operator, Databases.mysql)).toEqual(expected); - }); - it('should return operator label without version', () => { - const operator = { status: KubernetesOperatorStatus.ok }; - const expected = OPERATOR_LABELS[Databases.mysql]; - - expect(buildOperatorLabel(operator, Databases.mysql)).toEqual(expected); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.ts deleted file mode 100644 index b07b0beef798a..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusItem/OperatorStatusItem.utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Databases, OPERATOR_LABELS } from 'app/percona/shared/core'; - -import { Operator } from '../Kubernetes.types'; - -export const buildOperatorLabel = ({ version }: Operator, databaseType: Databases) => - version ? `${OPERATOR_LABELS[databaseType]} ${version}` : OPERATOR_LABELS[databaseType]; diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.styles.ts b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.styles.ts deleted file mode 100644 index c495ff6e758b6..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.styles.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - operatorRowWrapper: css` - display: flex; - align-items: center; - justify-content: space-between; - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.test.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.test.tsx deleted file mode 100644 index 1576d03d8e0dd..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.test.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; -import { Provider } from 'react-redux'; - -import { configureStore } from '../../../../../store/configureStore'; -import { StoreState } from '../../../../../types'; -import { KubernetesClusterStatus } from '../KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from '../OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -import { OperatorStatusRow } from './OperatorStatusRow'; - -describe('OperatorStatusRow::', () => { - it('createDBCluster button should be disabled when kubernetesClusterStatus is invalid', async () => { - const element = { - kubernetesClusterName: 'cluster1', - status: KubernetesClusterStatus.invalid, - operators: { - psmdb: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - pxc: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - }, - }; - render( - - - - ); - - expect(screen.getByTestId('cluster1-add-cluster-button')).toBeDisabled(); - }); - - it('createDBCluster button should be disabled when kubernetesClusterStatus is unavailable', async () => { - const element = { - kubernetesClusterName: 'cluster1', - status: KubernetesClusterStatus.unavailable, - operators: { - psmdb: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - pxc: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - }, - }; - render( - - - - ); - expect(screen.getByTestId('cluster1-add-cluster-button')).toBeDisabled(); - }); - - it('createDBCluster button should be disabled when both operators are not ok', async () => { - const element = { - kubernetesClusterName: 'cluster1', - status: KubernetesClusterStatus.ok, - operators: { - psmdb: { status: KubernetesOperatorStatus.invalid, version: '1', availableVersion: '1' }, - pxc: { status: KubernetesOperatorStatus.unsupported, version: '1', availableVersion: '1' }, - }, - }; - render( - - - - ); - expect(screen.getByTestId('cluster1-add-cluster-button')).toBeDisabled(); - }); - - it('createDBCluster button should be disabled when both operators are not ok', async () => { - const element = { - kubernetesClusterName: 'cluster1', - status: KubernetesClusterStatus.ok, - operators: { - psmdb: { status: KubernetesOperatorStatus.unavailable, version: '1', availableVersion: '1' }, - pxc: { status: KubernetesOperatorStatus.invalid, version: '1', availableVersion: '1' }, - }, - }; - render( - - - - ); - expect(screen.getByTestId('cluster1-add-cluster-button')).toBeDisabled(); - }); - - it('createDBCluster button should be enabled when clusterStatus and operatorStatus have ok status', async () => { - const element = { - kubernetesClusterName: 'cluster1', - status: KubernetesClusterStatus.ok, - operators: { - psmdb: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - pxc: { status: KubernetesOperatorStatus.ok, version: '1', availableVersion: '1' }, - }, - }; - render( - - - - ); - expect(screen.getByTestId('cluster1-add-cluster-button')).not.toBeDisabled(); - }); -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.tsx b/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.tsx deleted file mode 100644 index 0666ee7f65b55..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/OperatorStatusRow/OperatorStatusRow.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import React, { FC, useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; - -import { useStyles } from '@grafana/ui/src'; -import { Messages } from 'app/percona/dbaas/DBaaS.messages'; -import { useDispatch } from 'app/types'; - -import { Databases } from '../../../../shared/core'; -import { selectKubernetesCluster } from '../../../../shared/core/reducers/dbaas/dbaas'; -import { AddClusterButton } from '../../AddClusterButton/AddClusterButton'; -import { DB_CLUSTER_CREATION_URL } from '../../DBCluster/EditDBClusterPage/EditDBClusterPage.constants'; -import { Kubernetes, OperatorToUpdate } from '../Kubernetes.types'; -import { KubernetesClusterStatus } from '../KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from '../OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; -import { OperatorStatusItem } from '../OperatorStatusItem/OperatorStatusItem'; - -import { getStyles } from './OperatorStatusRow.styles'; - -interface OperatorStatusRowProps { - element: Kubernetes; - setSelectedCluster: React.Dispatch>; - setOperatorToUpdate: React.Dispatch>; - setUpdateOperatorModalVisible: React.Dispatch>; -} - -export const OperatorStatusRow: FC = ({ - element, - setSelectedCluster, - setOperatorToUpdate, - setUpdateOperatorModalVisible, -}) => { - const styles = useStyles(getStyles); - const history = useHistory(); - const dispatch = useDispatch(); - const isDisabled = useMemo( - () => - element.status !== KubernetesClusterStatus.ok || - !( - element?.operators?.pxc?.status === KubernetesOperatorStatus.ok || - element?.operators?.psmdb?.status === KubernetesOperatorStatus.ok - ), - [element] - ); - - return ( -
-
- - -
- { - dispatch(selectKubernetesCluster(element)); - history.push(DB_CLUSTER_CREATION_URL); - }} - data-testid={`${element.kubernetesClusterName}-add-cluster-button`} - disabled={isDisabled} - /> -
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.constants.ts b/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.constants.ts deleted file mode 100644 index 2a3032d40af8f..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const GET_KUBERNETES_CONFIG_CANCEL_TOKEN = 'getKubernetesConfig'; diff --git a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.messages.ts b/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.messages.ts deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.styles.ts b/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.styles.ts deleted file mode 100644 index c0b1788bbde9a..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.styles.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = (theme: GrafanaTheme) => ({ - deleteModalContent: css` - margin-bottom: ${theme.spacing.xl}; - `, - overlay: css` - height: 50vh; - overflow: scroll; - margin-top: ${theme.spacing.sm}; - margin-bottom: ${theme.spacing.sm}; - `, -}); diff --git a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.tsx b/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.tsx deleted file mode 100644 index 74ea4372b8fc4..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; - -import { AppEvents } from '@grafana/data'; -import { Button, ClipboardButton, HorizontalGroup, useTheme } from '@grafana/ui'; -import { appEvents } from 'app/core/app_events'; -import { Modal } from 'app/percona/shared/components/Elements/Modal'; -import { Overlay } from 'app/percona/shared/components/Elements/Overlay'; -import { useCancelToken } from 'app/percona/shared/components/hooks/cancelToken.hook'; -import { isApiCancelError } from 'app/percona/shared/helpers/api'; -import { logger } from 'app/percona/shared/helpers/logger'; - -import { Messages } from '../../../DBaaS.messages'; -import { KubernetesService } from '../Kubernetes.service'; - -import { GET_KUBERNETES_CONFIG_CANCEL_TOKEN } from './ViewClusterConfigModal.constants'; -import { getStyles } from './ViewClusterConfigModal.styles'; -import { ViewKubernetesClusterModalProps } from './ViewClusterConfigModal.types'; - -export const ViewClusterConfigModal: FC = ({ - isVisible, - setVisible, - selectedCluster, -}) => { - const theme = useTheme(); - const styles = getStyles(theme); - - const [kubeconfig, setKubeconfig] = useState(''); - const [loading, setLoading] = useState(false); - const [generateToken] = useCancelToken(); - const outputRef = useRef(null); - - const copyToClipboard = useCallback(() => { - appEvents.emit(AppEvents.alertSuccess, [Messages.successfulCopyMessage]); - - return outputRef.current?.textContent || ''; - }, [outputRef]); - - useEffect(() => { - const getClusters = async () => { - if (!selectedCluster?.kubernetesClusterName) { - setVisible(false); - - return; - } - - setLoading(true); - try { - const config = await KubernetesService.getKubernetesConfig( - selectedCluster, - generateToken(GET_KUBERNETES_CONFIG_CANCEL_TOKEN) - ); - - setKubeconfig(config.kube_auth.kubeconfig); - } catch (e) { - if (isApiCancelError(e)) { - return; - } - logger.error(e); - } - setLoading(false); - }; - - getClusters(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedCluster]); - - return ( - setVisible(false)}> - - - {Messages.copyToClipboard} - - - -
 (outputRef.current = pre)}>{kubeconfig}
-
- - - -
- ); -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.types.ts b/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.types.ts deleted file mode 100644 index 4736d69c96b17..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/ViewClusterConfigModal/ViewClusterConfigModal.types.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Kubernetes } from '../Kubernetes.types'; - -export interface ViewKubernetesClusterModalProps { - selectedCluster?: Kubernetes; - isVisible: boolean; - setVisible: (value: boolean) => void; -} diff --git a/public/app/percona/dbaas/components/Kubernetes/__mocks__/Kubernetes.service.ts b/public/app/percona/dbaas/components/Kubernetes/__mocks__/Kubernetes.service.ts deleted file mode 100644 index f1242091e52d8..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/__mocks__/Kubernetes.service.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { CheckOperatorUpdateAPI, KubernetesListAPI } from '../Kubernetes.types'; -import { KubernetesClusterStatus } from '../KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from '../OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -export const KubernetesService = { - getKubernetes: (): Promise => - Promise.resolve({ - kubernetes_clusters: [ - { - kubernetes_cluster_name: 'cluster_1', - status: KubernetesClusterStatus.ok, - operators: { psmdb: { status: KubernetesOperatorStatus.ok }, pxc: { status: KubernetesOperatorStatus.ok } }, - }, - { - kubernetes_cluster_name: 'cluster_2', - status: KubernetesClusterStatus.ok, - operators: { psmdb: { status: KubernetesOperatorStatus.ok }, pxc: { status: KubernetesOperatorStatus.ok } }, - }, - ], - }), - checkForOperatorUpdate: (): Promise => - Promise.resolve({ - cluster_to_components: { - cluster_1: { - component_to_update_information: { - 'psmdb-operator': { available_version: '1' }, - 'pxc-operator': { available_version: '1' }, - }, - }, - cluster_2: { - component_to_update_information: { - 'psmdb-operator': { available_version: '1' }, - 'pxc-operator': { available_version: '1' }, - }, - }, - }, - }), - installOperator: (): Promise => Promise.resolve(), - getDBClusters: () => Promise.resolve(), -}; diff --git a/public/app/percona/dbaas/components/Kubernetes/__mocks__/kubernetesStubs.ts b/public/app/percona/dbaas/components/Kubernetes/__mocks__/kubernetesStubs.ts deleted file mode 100644 index 739733dffd2ab..0000000000000 --- a/public/app/percona/dbaas/components/Kubernetes/__mocks__/kubernetesStubs.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { KubernetesClusterStatus } from '../KubernetesClusterStatus/KubernetesClusterStatus.types'; -import { KubernetesOperatorStatus } from '../OperatorStatusItem/KubernetesOperatorStatus/KubernetesOperatorStatus.types'; - -export const kubernetesStub = [ - { - kubernetesClusterName: 'Cluster 1', - operators: { - psmdb: { - status: KubernetesOperatorStatus.ok, - }, - pxc: { - status: KubernetesOperatorStatus.ok, - }, - }, - status: KubernetesClusterStatus.ok, - }, - { - kubernetesClusterName: 'Cluster 2', - operators: { - psmdb: { - status: KubernetesOperatorStatus.ok, - }, - pxc: { - status: KubernetesOperatorStatus.ok, - }, - }, - status: KubernetesClusterStatus.ok, - }, -]; - -export const deleteActionStub = jest.fn(); -export const addActionStub = jest.fn(() => { - kubernetesStub.push({ - kubernetesClusterName: 'test', - operators: { - psmdb: { - status: KubernetesOperatorStatus.ok, - }, - pxc: { - status: KubernetesOperatorStatus.ok, - }, - }, - status: KubernetesClusterStatus.ok, - }); -}); -export const getActionStub = jest.fn(() => kubernetesStub); -export const setLoadingActionStub = jest.fn(); diff --git a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.messages.ts b/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.messages.ts deleted file mode 100644 index cf082225c4b6e..0000000000000 --- a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.messages.ts +++ /dev/null @@ -1,6 +0,0 @@ -export const Messages = { - heading: 'PMM Public Address', - addressSet: (address: string) => `This will also set "Public Address" as ${address}. `, - editLater: 'If you need to set it differently or edit later, use ', - advancedSettings: 'Advanced Settings', -}; diff --git a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.styles.ts b/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.styles.ts deleted file mode 100644 index 3fef5af4c9948..0000000000000 --- a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.styles.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing }: GrafanaTheme) => ({ - alert: css` - p { - margin-bottom: 0; - } - margin: ${spacing.md} 0; - `, -}); diff --git a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.tsx b/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.tsx deleted file mode 100644 index 8f053886b9d46..0000000000000 --- a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { cx } from '@emotion/css'; -import React, { FC } from 'react'; -import { Link } from 'react-router-dom'; - -import { Card, useStyles } from '@grafana/ui'; - -import { Messages } from './PMMServerUrlWarning.messages'; -import { getStyles } from './PMMServerUrlWarning.styles'; - -export const PMMServerUrlWarning: FC = ({ className }) => { - const styles = useStyles(getStyles); - return ( - - {Messages.heading} - - {Messages.addressSet(window.location.host)} - {Messages.editLater} - {Messages.advancedSettings}. - - - ); -}; diff --git a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.types.ts b/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.types.ts deleted file mode 100644 index e5126f8a52acd..0000000000000 --- a/public/app/percona/dbaas/components/PMMServerURLWarning/PMMServerUrlWarning.types.ts +++ /dev/null @@ -1,3 +0,0 @@ -interface PMMServerUrlWarningProps { - className?: string; -} diff --git a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.styles.ts b/public/app/percona/dbaas/components/ProgressBar/ProgressBar.styles.ts deleted file mode 100644 index 1a065441fc867..0000000000000 --- a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.styles.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ palette, spacing, typography }: GrafanaTheme) => ({ - progressBarWrapper: css` - display: flex; - flex-direction: column; - width: 100%; - `, - labelWrapper: css` - align-items: baseline; - display: flex; - justify-content: flex-start; - margin-bottom: ${spacing.xs}; - `, - stepsLabel: css` - color: ${palette.blue80}; - font-weight: ${typography.weight.bold}; - margin-right: ${spacing.sm}; - `, - stepsLabelError: css` - color: ${palette.orange}; - label: error; - `, - message: css` - font-size: ${typography.size.sm}; - `, - progressBarBackground: css` - background-color: ${palette.gray1}; - border-radius: 50px; - height: ${spacing.sm}; - width: 100%; - `, - getFillerStyles: (width: number) => css` - background-color: ${palette.blue80}; - border-radius: inherit; - height: 100%; - transition: width 300ms ease-in-out; - width: ${width}%; - `, - progressBarError: css` - background-color: ${palette.orange}; - label: error; - `, -}); diff --git a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.test.tsx b/public/app/percona/dbaas/components/ProgressBar/ProgressBar.test.tsx deleted file mode 100644 index f5dec6b02a157..0000000000000 --- a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.test.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; - -import { ProgressBar } from './ProgressBar'; -import { ProgressBarStatus } from './ProgressBar.types'; - -describe('ProgressBar::', () => { - it('renders with steps, message and width', () => { - render( - - ); - - expect(screen.getByTestId('progress-bar-steps')).toHaveTextContent('5/10'); - expect(screen.getByTestId('progress-bar-message')).toHaveTextContent('test message'); - expect(screen.getByTestId('progress-bar-content').className).not.toContain('error'); - expect(getComputedStyle(screen.getByTestId('progress-bar-content').children[0]).width).toEqual('50%'); - }); - - it('renders without message and rounds float width to nearest integer', () => { - render(); - - expect(screen.getByTestId('progress-bar-steps')).toHaveTextContent('4/7'); - expect(screen.getByTestId('progress-bar-message')).toHaveTextContent(''); - expect(getComputedStyle(screen.getByTestId('progress-bar-content').children[0]).width).toEqual('57%'); - }); - - it('renders with error status', () => { - render(); - - expect(screen.getByTestId('progress-bar-steps')).toHaveTextContent('0/1'); - expect(screen.getByTestId('progress-bar-message')).toHaveTextContent('test message'); - expect(getComputedStyle(screen.getByTestId('progress-bar-content').children[0]).width).toEqual('0%'); - expect(screen.getByTestId('progress-bar-content').children[0].className).toContain('error'); - }); - - it('handles invalid total steps', () => { - render(); - - expect(getComputedStyle(screen.getByTestId('progress-bar-content').children[0]).width).toEqual('0%'); - }); -}); diff --git a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.tsx b/public/app/percona/dbaas/components/ProgressBar/ProgressBar.tsx deleted file mode 100644 index 3939b5b2c361e..0000000000000 --- a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable react/display-name */ -import { cx } from '@emotion/css'; -import React, { FC, useMemo } from 'react'; - -import { useStyles } from '@grafana/ui'; - -import { getStyles } from './ProgressBar.styles'; -import { ProgressBarProps, ProgressBarStatus } from './ProgressBar.types'; -import { getProgressBarPercentage } from './ProgressBar.utils'; - -export const ProgressBar: FC = ({ finishedSteps, totalSteps, status, message, dataTestId }) => { - const styles = useStyles(getStyles); - const progressBarErrorStyles = useMemo( - () => ({ - [styles.progressBarError]: status === ProgressBarStatus.error, - }), - [status, styles.progressBarError] - ); - const stepsLabelErrorStyles = useMemo( - () => ({ - [styles.stepsLabelError]: status === ProgressBarStatus.error, - }), - [status, styles.stepsLabelError] - ); - const width = getProgressBarPercentage(finishedSteps, totalSteps); - - return ( -
-
- - {finishedSteps === 0 && totalSteps === 0 ? '-/-' : `${finishedSteps}/${totalSteps}`} - - - {message} - -
-
-
-
-
- ); -}; diff --git a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.types.ts b/public/app/percona/dbaas/components/ProgressBar/ProgressBar.types.ts deleted file mode 100644 index 742f2748106d0..0000000000000 --- a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.types.ts +++ /dev/null @@ -1,12 +0,0 @@ -export enum ProgressBarStatus { - progress = 'PROGRESS', - error = 'ERROR', -} - -export interface ProgressBarProps { - totalSteps: number; - finishedSteps: number; - status: ProgressBarStatus; - message?: string; - dataTestId?: string; -} diff --git a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.test.ts b/public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.test.ts deleted file mode 100644 index 77147796b66f7..0000000000000 --- a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { getProgressBarPercentage } from './ProgressBar.utils'; - -describe('ProgressBar.utils::', () => { - it('returns 0 when total steps is 0', () => { - expect(getProgressBarPercentage(10, 0)).toEqual(0); - }); - - it('returns 100 when finished steps are greater than total steps', () => { - expect(getProgressBarPercentage(6, 2)).toEqual(100); - }); - - it('returns correct percentage', () => { - expect(getProgressBarPercentage(10, 100)).toEqual(10); - }); - - it('returns correct percentage rounded', () => { - expect(getProgressBarPercentage(1, 7)).toEqual(14); - }); -}); diff --git a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.ts b/public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.ts deleted file mode 100644 index e24a00114aec6..0000000000000 --- a/public/app/percona/dbaas/components/ProgressBar/ProgressBar.utils.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const getProgressBarPercentage = (finishedSteps: number, totalSteps: number) => { - if (totalSteps <= 0) { - return 0; - } - - if (finishedSteps > totalSteps) { - return 100; - } - - return Math.round((finishedSteps * 100) / totalSteps); -}; diff --git a/public/app/percona/dbaas/components/Switch/Switch.styles.ts b/public/app/percona/dbaas/components/Switch/Switch.styles.ts deleted file mode 100644 index 5cf397119c668..0000000000000 --- a/public/app/percona/dbaas/components/Switch/Switch.styles.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { css } from '@emotion/css'; - -import { GrafanaTheme } from '@grafana/data'; - -export const getStyles = ({ spacing, palette, typography, colors }: GrafanaTheme) => ({ - field: css` - &:not(:last-child) { - margin-bottom: ${spacing.formInputMargin}; - } - display: flex; - flex-direction: column; - justify-content: center; - padding-top: ${spacing.md}; - `, - label: css` - display: block; - text-align: left; - font-size: ${typography.size.md}; - font-weight: ${typography.weight.semibold}; - line-height: 1.25; - padding: ${spacing.formLabelPadding}; - color: ${colors.formLabel}; - `, - fieldWithLabelWrapper: css` - display: flex; - flex-direction: row; - gap: ${spacing.sm}; - margin-left: ${spacing.md}; - `, - labelWrapper: css` - align-items: center; - display: flex; - flex-direction: row; - div[class$='-Icon'] { - display: flex; - margin-left: ${spacing.xs}; - } - `, - errorMessage: css` - color: ${palette.red}; - font-size: ${typography.size.sm}; - height: ${typography.size.sm}; - line-height: ${typography.lineHeight.sm}; - margin-top: ${spacing.sm}; - margin-bottom: ${spacing.xs}; - `, -}); diff --git a/public/app/percona/dbaas/components/Switch/Switch.test.tsx b/public/app/percona/dbaas/components/Switch/Switch.test.tsx deleted file mode 100644 index cdfe366350f37..0000000000000 --- a/public/app/percona/dbaas/components/Switch/Switch.test.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { fireEvent, render, screen, waitFor } from '@testing-library/react'; -import React from 'react'; - -import { FormWrapper } from 'app/percona/shared/helpers/utils'; - -import { SwitchField } from './Switch'; - -describe('SwitchField::', () => { - it('should render an input element of type checkbox', async () => { - render( - - - - ); - - expect(screen.getByRole('checkbox')).toBeInTheDocument(); - expect(screen.getByTestId('test-switch')).toBeInTheDocument(); - }); - - it('should call passed validators', () => { - const validatorOne = jest.fn(); - const validatorTwo = jest.fn(); - - render( - - - - ); - - expect(validatorOne).toBeCalledTimes(1); - expect(validatorTwo).toBeCalledTimes(1); - }); - - it('should show no labels if one is not specified', () => { - render( - - - - ); - - expect(screen.queryByTestId('test-field-label')).not.toBeInTheDocument(); - }); - - it('should show a label if one is specified', () => { - render( - - - - ); - - expect(screen.getByTestId('test-field-label')).toBeInTheDocument(); - expect(screen.getByTestId('test-field-label')).toHaveTextContent('test label'); - }); - - it('should change the state value when clicked', async () => { - render( - - - - ); - - expect(screen.getByTestId('test-switch')).toHaveProperty('value', 'on'); - - const checkbox = screen.getByRole('checkbox'); - await waitFor(() => fireEvent.change(checkbox, { target: { value: true } })); - - expect(screen.getByTestId('test-switch')).toHaveProperty('value', 'true'); - }); - - it('should disable switch when `disabled` is passed via props', () => { - render( - - - - ); - - expect(screen.getByRole('checkbox')).toBeDisabled(); - }); -}); diff --git a/public/app/percona/dbaas/components/Switch/Switch.tsx b/public/app/percona/dbaas/components/Switch/Switch.tsx deleted file mode 100644 index 12b5a92c8dc41..0000000000000 --- a/public/app/percona/dbaas/components/Switch/Switch.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { cx } from '@emotion/css'; -import React, { FC, useMemo } from 'react'; -import { Field } from 'react-final-form'; - -import { Icon, Switch, Tooltip, useStyles } from '@grafana/ui'; -import { compose } from 'app/percona/shared/helpers/validatorsForm'; - -import { getStyles } from './Switch.styles'; -import { SwitchFieldProps, SwitchFieldRenderProps } from './Switch.types'; - -export const SwitchField: FC = ({ - disabled, - fieldClassName, - inputProps, - label, - name, - validators, - tooltip, - tooltipIcon = 'info-circle', - ...fieldConfig -}) => { - const styles = useStyles(getStyles); - const inputId = `input-${name}-id`; - const validate = useMemo(() => (Array.isArray(validators) ? compose(validators) : undefined), [validators]); - - return ( - {...fieldConfig} type="checkbox" name={name} validate={validate}> - {({ input, meta }: SwitchFieldRenderProps) => ( -
-
- - {label && ( -
- - {tooltip && ( - {tooltip}} data-testid={`${name}-field-tooltip`}> - - - )} -
- )} -
-
- {meta.touched && meta.error} -
-
- )} - - ); -}; diff --git a/public/app/percona/dbaas/components/Switch/Switch.types.ts b/public/app/percona/dbaas/components/Switch/Switch.types.ts deleted file mode 100644 index 390e1a87c48cd..0000000000000 --- a/public/app/percona/dbaas/components/Switch/Switch.types.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ReactNode } from 'react'; -import { FieldInputProps, FieldMetaState, UseFieldConfig } from 'react-final-form'; - -import { IconName } from '@grafana/ui'; -import { FieldInputAttrs } from 'app/percona/shared/helpers/types'; -import { Validator } from 'app/percona/shared/helpers/validatorsForm'; - -export interface SwitchFieldRenderProps { - input: FieldInputProps; - meta: FieldMetaState; -} - -export interface SwitchFieldProps extends UseFieldConfig { - disabled?: boolean; - fieldClassName?: string; - inputProps?: FieldInputAttrs; - label?: string | ReactNode; - name: string; - validators?: Validator[]; - tooltip?: string; - tooltipIcon?: IconName; -} diff --git a/public/app/percona/dbaas/hooks/useKubernetesList.ts b/public/app/percona/dbaas/hooks/useKubernetesList.ts deleted file mode 100644 index 46c352e1e21b7..0000000000000 --- a/public/app/percona/dbaas/hooks/useKubernetesList.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { useEffect } from 'react'; - -import { useDispatch, useSelector } from 'app/types'; - -import { useCancelToken } from '../../shared/components/hooks/cancelToken.hook'; -import { - fetchK8sListAction, - resetK8SClusterListState, -} from '../../shared/core/reducers/dbaas/k8sClusterList/k8sClusterList'; -import { getKubernetes as getKubernetesSelector, getPerconaSettingFlag } from '../../shared/core/selectors'; -import { - CHECK_OPERATOR_UPDATE_CANCEL_TOKEN, - GET_KUBERNETES_CANCEL_TOKEN, -} from '../components/Kubernetes/Kubernetes.constants'; -import { Kubernetes } from '../components/Kubernetes/Kubernetes.types'; - -export const useKubernetesList = (): [Kubernetes[] | undefined, boolean | undefined] => { - const [generateToken] = useCancelToken(); - const dispatch = useDispatch(); - const { result: kubernetes, loading } = useSelector(getKubernetesSelector); - - useEffect(() => { - dispatch( - fetchK8sListAction({ - tokens: { - kubernetes: generateToken(GET_KUBERNETES_CANCEL_TOKEN), - operator: generateToken(CHECK_OPERATOR_UPDATE_CANCEL_TOKEN), - }, - }) - ); - return () => { - dispatch(resetK8SClusterListState()); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return [kubernetes, loading]; -}; - -export const useUpdateOfKubernetesList = (): [Kubernetes[] | undefined, boolean | undefined] => { - const [generateToken] = useCancelToken(); - const dispatch = useDispatch(); - const { result, loading } = useSelector(getKubernetesSelector); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const featureSelector = getPerconaSettingFlag('dbaasEnabled'); - const featureEnabled = useSelector(featureSelector); - - useEffect(() => { - if (featureEnabled && result === undefined && loading !== true) { - dispatch( - fetchK8sListAction({ - tokens: { - kubernetes: generateToken(GET_KUBERNETES_CANCEL_TOKEN), - operator: generateToken(CHECK_OPERATOR_UPDATE_CANCEL_TOKEN), - }, - }) - ); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [result, loading, featureEnabled]); - - return [result, loading]; -}; diff --git a/public/app/percona/inventory/Tabs/Nodes.tsx b/public/app/percona/inventory/Tabs/Nodes.tsx index 7d738f55d8cc1..ff3ed20bf96ea 100644 --- a/public/app/percona/inventory/Tabs/Nodes.tsx +++ b/public/app/percona/inventory/Tabs/Nodes.tsx @@ -6,10 +6,10 @@ import { Row } from 'react-table'; import { AppEvents } from '@grafana/data'; import { Badge, Button, HorizontalGroup, Icon, Link, Modal, TagList, useStyles2 } from '@grafana/ui'; import { OldPage } from 'app/core/components/Page/Page'; -import { Action } from 'app/percona/dbaas/components/MultipleActions'; import { CheckboxField } from 'app/percona/shared/components/Elements/Checkbox'; import { DetailsRow } from 'app/percona/shared/components/Elements/DetailsRow/DetailsRow'; import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; +import { Action } from 'app/percona/shared/components/Elements/MultipleActions'; import { ExtendedColumn, FilterFieldTypes, Table } from 'app/percona/shared/components/Elements/Table'; import { FormElement } from 'app/percona/shared/components/Form'; import { useCancelToken } from 'app/percona/shared/components/hooks/cancelToken.hook'; diff --git a/public/app/percona/inventory/Tabs/Services/ServicesTable.tsx b/public/app/percona/inventory/Tabs/Services/ServicesTable.tsx index 55d14ab928267..6684d2adb6039 100644 --- a/public/app/percona/inventory/Tabs/Services/ServicesTable.tsx +++ b/public/app/percona/inventory/Tabs/Services/ServicesTable.tsx @@ -3,8 +3,8 @@ import { Row } from 'react-table'; import { locationService } from '@grafana/runtime'; import { Badge, HorizontalGroup, Icon, Link, TagList, useStyles2 } from '@grafana/ui'; -import { Action } from 'app/percona/dbaas/components/MultipleActions'; import { DetailsRow } from 'app/percona/shared/components/Elements/DetailsRow/DetailsRow'; +import { Action } from 'app/percona/shared/components/Elements/MultipleActions'; import { ServiceIconWithText } from 'app/percona/shared/components/Elements/ServiceIconWithText/ServiceIconWithText'; import { ExtendedColumn, FilterFieldTypes, Table } from 'app/percona/shared/components/Elements/Table'; import { getDashboardLinkForService } from 'app/percona/shared/helpers/getDashboardLinkForService'; diff --git a/public/app/percona/settings/Settings.messages.ts b/public/app/percona/settings/Settings.messages.ts index 811ea8ef788e5..ea841ace7140f 100644 --- a/public/app/percona/settings/Settings.messages.ts +++ b/public/app/percona/settings/Settings.messages.ts @@ -23,13 +23,9 @@ export const Messages = { sttCheckIntervalUnit: 'hours', advisorsLink: `https://per.co.na/advisors`, advisorsTooltip: 'Enable Advisors and get updated checks from Percona.', - dbaasLabel: 'Database as a Service (DBaaS)', azureDiscoverLabel: 'Microsoft Azure monitoring', azureDiscoverTooltip: 'Option to enable/disable Microsoft Azure DB instanced discovery and monitoring', azureDiscoverLink: `https://per.co.na/azure_monitoring`, - dbaasTooltip: - 'Option to enable/disable DBaaS features. Disabling DBaaS does not suspend or remove running clusters.', - dbaasLink: `https://per.co.na/dbaas`, accessControl: 'Access control', accessControlTooltip: 'Option to enable/disable Access control.', accessControlLink: 'https://per.co.na/roles_permissions', diff --git a/public/app/percona/settings/Settings.service.ts b/public/app/percona/settings/Settings.service.ts index 2b085e6def22f..08e9f9b5edb49 100644 --- a/public/app/percona/settings/Settings.service.ts +++ b/public/app/percona/settings/Settings.service.ts @@ -44,7 +44,6 @@ const toModel = (response: SettingsPayload): Settings => ({ sttEnabled: response.stt_enabled, platformEmail: response.platform_email, azureDiscoverEnabled: response.azurediscover_enabled, - dbaasEnabled: response.dbaas_enabled, alertingEnabled: response.alerting_enabled, alertingSettings: { email: response.email_alerting_settings || {}, diff --git a/public/app/percona/settings/Settings.types.ts b/public/app/percona/settings/Settings.types.ts index 61299bb08d82b..bcc6c3902941d 100644 --- a/public/app/percona/settings/Settings.types.ts +++ b/public/app/percona/settings/Settings.types.ts @@ -67,8 +67,6 @@ export interface AdvancedChangePayload extends AdvancedPayload { disable_azurediscover?: boolean; enable_azurediscover?: boolean; stt_check_intervals?: SttCheckIntervalsPayload; - enable_dbaas?: boolean; - disable_dbaas?: boolean; enable_updates?: boolean; disable_updates?: boolean; enable_access_control?: boolean; @@ -107,7 +105,6 @@ export interface SettingsPayload updates_disabled: boolean; telemetry_enabled: boolean; stt_enabled: boolean; - dbaas_enabled: boolean; alerting_enabled: boolean; backup_management_enabled: boolean; azurediscover_enabled: boolean; @@ -128,7 +125,6 @@ export type SettingsAPIChangePayload = export interface Settings { sttEnabled: boolean; - dbaasEnabled: boolean; backupEnabled: boolean; alertingEnabled: boolean; updatesDisabled: boolean; diff --git a/public/app/percona/settings/__mocks__/Settings.service.ts b/public/app/percona/settings/__mocks__/Settings.service.ts index 305f61b139b85..3ffeaa81d2ec8 100644 --- a/public/app/percona/settings/__mocks__/Settings.service.ts +++ b/public/app/percona/settings/__mocks__/Settings.service.ts @@ -6,7 +6,6 @@ export const stub: Settings = { updatesDisabled: true, telemetryEnabled: true, backupEnabled: false, - dbaasEnabled: false, enableAccessControl: false, metricsResolutions: { lr: '10s', diff --git a/public/app/percona/settings/components/Advanced/Advanced.constants.ts b/public/app/percona/settings/components/Advanced/Advanced.constants.ts index f9e682a725614..1f96417245beb 100644 --- a/public/app/percona/settings/components/Advanced/Advanced.constants.ts +++ b/public/app/percona/settings/components/Advanced/Advanced.constants.ts @@ -35,4 +35,4 @@ export const STT_CHECK_INTERVALS = [ export const TECHNICAL_PREVIEW_DOC_URL = 'https://per.co.na/pmm-feature-status'; // all feature flags -export const FEATURE_KEYS: Array = ['alerting', 'backup', 'dbaas', 'stt', 'azureDiscover']; +export const FEATURE_KEYS: Array = ['alerting', 'backup', 'stt', 'azureDiscover']; diff --git a/public/app/percona/settings/components/Advanced/Advanced.test.tsx b/public/app/percona/settings/components/Advanced/Advanced.test.tsx index 2e59709dc26dd..53b152f0c1f46 100644 --- a/public/app/percona/settings/components/Advanced/Advanced.test.tsx +++ b/public/app/percona/settings/components/Advanced/Advanced.test.tsx @@ -27,7 +27,6 @@ describe('Advanced::', () => { updatesDisabled: true, backupEnabled: false, sttEnabled: true, - dbaasEnabled: false, azureDiscoverEnabled: true, publicAddress: 'localhost', alertingEnabled: true, @@ -61,7 +60,6 @@ describe('Advanced::', () => { updatesDisabled: true, backupEnabled: false, sttEnabled: true, - dbaasEnabled: false, azureDiscoverEnabled: true, publicAddress: 'localhost', alertingEnabled: true, @@ -106,7 +104,6 @@ describe('Advanced::', () => { updatesDisabled: true, backupEnabled: false, sttEnabled: true, - dbaasEnabled: false, azureDiscoverEnabled: true, publicAddress: 'localhost', alertingEnabled: true, @@ -141,7 +138,6 @@ describe('Advanced::', () => { updatesDisabled: true, backupEnabled: false, sttEnabled: false, - dbaasEnabled: false, azureDiscoverEnabled: true, publicAddress: 'localhost', alertingEnabled: true, @@ -182,7 +178,6 @@ describe('Advanced::', () => { updatesDisabled: true, backupEnabled: false, sttEnabled: true, - dbaasEnabled: false, azureDiscoverEnabled: true, publicAddress: 'localhost', alertingEnabled: true, @@ -205,53 +200,4 @@ describe('Advanced::', () => { expect.objectContaining({ body: expect.objectContaining({ stt_check_intervals: expect.anything() }) }) ); }); - it('Sets correct URL when DBaaS switched to checked mode', async () => { - const location = { - ...window.location, - host: 'pmmtest.percona.com', - }; - - Object.defineProperty(window, 'location', { - writable: true, - value: location, - }); - - render( - - - - ); - - const input = screen.getByTestId('advanced-dbaas').querySelector('input'); - - expect(input).not.toBeChecked(); - expect(screen.getByTestId('publicAddress-text-input')).toHaveValue(''); - if (input) { - fireEvent.click(input); - } - expect(input).toBeChecked(); - expect(screen.getByTestId('publicAddress-text-input')).toHaveValue('pmmtest.percona.com'); - }); }); diff --git a/public/app/percona/settings/components/Advanced/Advanced.tsx b/public/app/percona/settings/components/Advanced/Advanced.tsx index 3001b4678caa6..4ba208728a733 100644 --- a/public/app/percona/settings/components/Advanced/Advanced.tsx +++ b/public/app/percona/settings/components/Advanced/Advanced.tsx @@ -4,7 +4,6 @@ import { Field, withTypes } from 'react-final-form'; import { Button, Icon, Spinner, useStyles2 } from '@grafana/ui'; import { OldPage } from 'app/core/components/Page/Page'; -import DbaasDeprecationWarning from 'app/percona/dbaas/components/DeprecationWarning'; import { Messages } from 'app/percona/settings/Settings.messages'; import { getSettingsStyles } from 'app/percona/settings/Settings.styles'; import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; @@ -33,12 +32,7 @@ import { } from './Advanced.constants'; import { getStyles } from './Advanced.styles'; import { AdvancedFormProps } from './Advanced.types'; -import { - convertCheckIntervalsToHours, - convertHoursStringToSeconds, - convertSecondsToDays, - dBaaSToggleOnChange, -} from './Advanced.utils'; +import { convertCheckIntervalsToHours, convertHoursStringToSeconds, convertSecondsToDays } from './Advanced.utils'; import { SwitchRow } from './SwitchRow'; const { @@ -58,7 +52,6 @@ export const Advanced: FC = () => { updatesDisabled, backupEnabled, sttEnabled, - dbaasEnabled, azureDiscoverEnabled, publicAddress, alertingEnabled, @@ -84,9 +77,6 @@ export const Advanced: FC = () => { advisorsLabel, advisorsLink, advisorsTooltip, - dbaasLabel, - dbaasTooltip, - dbaasLink, publicAddressLabel, publicAddressTooltip, publicAddressButton, @@ -105,7 +95,6 @@ export const Advanced: FC = () => { backupLabel, backupLink, backupTooltip, - deprecatedFeatures, }, tooltipLinkText, } = Messages; @@ -116,7 +105,6 @@ export const Advanced: FC = () => { updates: !updatesDisabled, backup: backupEnabled, stt: sttEnabled, - dbaas: dbaasEnabled, azureDiscover: azureDiscoverEnabled, publicAddress, alerting: alertingEnabled, @@ -134,7 +122,6 @@ export const Advanced: FC = () => { telemetry, stt, publicAddress, - dbaas, alerting, backup, azureDiscover, @@ -165,8 +152,6 @@ export const Advanced: FC = () => { stt_check_intervals: !!stt ? sttCheckIntervals : undefined, enable_backup_management: backup, disable_backup_management: !backup, - enable_dbaas: dbaas, - disable_dbaas: !dbaas, enable_updates: updates, disable_updates: !updates, enable_access_control: accessControl, @@ -194,10 +179,7 @@ export const Advanced: FC = () => { initialValues={initialValues} mutators={{ setPublicAddress: ([publicAddressValue], state, { changeValue }) => { - if ( - !state?.lastFormState?.values['publicAddress'] && - state?.lastFormState?.values['dbaas'] === true - ) { + if (!state?.lastFormState?.values['publicAddress']) { changeValue(state, 'publicAddress', () => publicAddressValue); } }, @@ -363,24 +345,6 @@ export const Advanced: FC = () => { component={SwitchRow} /> -
- {deprecatedFeatures} - {!!values.dbaas && } - , input: any) => { - dBaaSToggleOnChange(event, input, mutators); - }} - /> -
- {showPMMAddressWarning && } + {/* {showPMMAddressWarning && } */} { row: Row; diff --git a/public/app/percona/dbaas/components/MultipleActions/MultipleActions.styles.ts b/public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.styles.ts similarity index 100% rename from public/app/percona/dbaas/components/MultipleActions/MultipleActions.styles.ts rename to public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.styles.ts diff --git a/public/app/percona/dbaas/components/MultipleActions/MultipleActions.test.tsx b/public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.test.tsx similarity index 100% rename from public/app/percona/dbaas/components/MultipleActions/MultipleActions.test.tsx rename to public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.test.tsx diff --git a/public/app/percona/dbaas/components/MultipleActions/MultipleActions.tsx b/public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.tsx similarity index 100% rename from public/app/percona/dbaas/components/MultipleActions/MultipleActions.tsx rename to public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.tsx diff --git a/public/app/percona/dbaas/components/MultipleActions/MultipleActions.types.ts b/public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.types.ts similarity index 100% rename from public/app/percona/dbaas/components/MultipleActions/MultipleActions.types.ts rename to public/app/percona/shared/components/Elements/MultipleActions/MultipleActions.types.ts diff --git a/public/app/percona/dbaas/components/MultipleActions/index.ts b/public/app/percona/shared/components/Elements/MultipleActions/index.ts similarity index 100% rename from public/app/percona/dbaas/components/MultipleActions/index.ts rename to public/app/percona/shared/components/Elements/MultipleActions/index.ts diff --git a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts index 507833c211f54..c1a87b94ef735 100644 --- a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts +++ b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.constants.ts @@ -2,35 +2,6 @@ import { NavModelItem, NavSection } from '@grafana/data'; import config from 'app/core/config'; import { ServiceType } from 'app/percona/shared/services/services/Services.types'; -export const PMM_DBAAS_PAGE: NavModelItem = { - id: 'dbaas', - text: 'DBaaS', - subTitle: 'Percona DBaaS', - icon: 'database', - section: NavSection.Core, - url: `${config.appSubUrl}/dbaas`, - breadcrumbs: [ - { - title: 'DBaaS', - url: `${config.appSubUrl}/dbaas`, - }, - ], - children: [ - { - id: 'dbclusters', - text: 'DB Cluster', - url: `${config.appSubUrl}/dbaas/dbclusters`, - hideFromMenu: true, - }, - { - id: 'kubernetes', - text: 'Kubernetes Cluster', - url: `${config.appSubUrl}/dbaas/kubernetes`, - hideFromMenu: true, - }, - ], -}; - export const PMM_BACKUP_PAGE: NavModelItem = { id: 'backup', icon: 'history', diff --git a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx index 8c94ae70e060d..4b27c8e33e1d8 100644 --- a/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx +++ b/public/app/percona/shared/components/PerconaBootstrapper/PerconaNavigation/PerconaNavigation.tsx @@ -19,7 +19,6 @@ import { PMM_ACCESS_ROLE_EDIT_PAGE, PMM_ADD_INSTANCE_PAGE, PMM_BACKUP_PAGE, - PMM_DBAAS_PAGE, PMM_EDIT_INSTANCE_PAGE, PMM_ENTITLEMENTS_PAGE, PMM_ENVIRONMENT_OVERVIEW_PAGE, @@ -39,7 +38,7 @@ import { const PerconaNavigation: React.FC = () => { const [folders, setFolders] = useState([]); const { result } = useSelector(getPerconaSettings); - const { alertingEnabled, sttEnabled, dbaasEnabled, backupEnabled } = result!; + const { alertingEnabled, sttEnabled, backupEnabled } = result!; const { isPlatformUser, isAuthorized } = useSelector(getPerconaUser); const categorizedAdvisors = useSelector(getCategorizedAdvisors); const isLoggedIn = !!contextSrv.user.isSignedIn; @@ -48,7 +47,6 @@ const PerconaNavigation: React.FC = () => { const advisorsPage = buildAdvisorsNavItem(categorizedAdvisors); dispatch(updateNavIndex(getPmmSettingsPage(alertingEnabled))); - dispatch(updateNavIndex(PMM_DBAAS_PAGE)); dispatch(updateNavIndex(PMM_BACKUP_PAGE)); dispatch(updateNavIndex(PMM_INVENTORY_PAGE)); dispatch(updateNavIndex(PMM_ADD_INSTANCE_PAGE)); @@ -109,10 +107,6 @@ const PerconaNavigation: React.FC = () => { updatedNavTree.push(advisorsPage); } - if (dbaasEnabled) { - updatedNavTree.push(PMM_DBAAS_PAGE); - } - if (backupEnabled) { updatedNavTree.push(PMM_BACKUP_PAGE); } diff --git a/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts b/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts deleted file mode 100644 index 1e4f97e2fc05b..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.ts +++ /dev/null @@ -1,149 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; - -import { withAppEvents } from 'app/features/alerting/unified/utils/redux'; -import { newDBClusterService } from 'app/percona/dbaas/components/DBCluster/DBCluster.utils'; -import { SETTINGS_TIMEOUT } from 'app/percona/shared/core/constants'; -import { prepareSourceRanges } from 'app/percona/shared/core/reducers/dbaas/dbaas.utils'; -import { updateSettingsAction } from 'app/percona/shared/core/reducers/index'; -import { getCronStringFromValues } from 'app/percona/shared/helpers/cron/cron'; - -import { AddDBClusterArgs, PerconaAddDBClusterState } from './addDBCluster.types'; - -export const initialAddDBClusterState: PerconaAddDBClusterState = { - result: undefined, - loading: undefined, -}; - -const perconaAddDBClusterSlice = createSlice({ - name: 'perconaAddDBCluster', - initialState: initialAddDBClusterState, - reducers: { - resetAddDBClusterState: (state): PerconaAddDBClusterState => { - return { - ...state, - result: undefined, - loading: undefined, - }; - }, - setAddDBClusterLoading: (state): PerconaAddDBClusterState => { - return { - ...state, - loading: true, - }; - }, - setAddDBClusterResult: (state, action): PerconaAddDBClusterState => { - return { - ...state, - result: action.payload, - loading: false, - }; - }, - }, -}); - -export const addDbClusterAction = createAsyncThunk( - 'percona/addDBCluster', - async (args: AddDBClusterArgs, thunkAPI): Promise => { - const { - name, - kubernetesCluster, - databaseType, - databaseVersion, - nodes, - memory, - cpu, - disk, - expose, - internetFacing, - sourceRanges, - configuration, - storageClass, - restoreFrom, - backupArtifact, - backupLocation, - retention, - period, - month, - day, - weekDay, - startHour, - startMinute, - secretsName, - enableRestore, - enableBackups, - template, - } = args.values; - - const dbClusterService = newDBClusterService(databaseType.value); - thunkAPI.dispatch(setAddDBClusterLoading()); - if (args.setPMMAddress) { - await thunkAPI.dispatch(updateSettingsAction({ body: { pmm_public_address: window.location.host } })); - await new Promise((resolve) => setTimeout(resolve, SETTINGS_TIMEOUT)); - } - - const cronExpression = getCronStringFromValues( - period!.value!, - month!.map((m: { value: any }) => m.value!), - day!.map((m: { value: any }) => m.value!), - weekDay!.map((m: { value: any }) => m.value!), - startHour!.map((m: { value: any }) => m.value!), - startMinute!.map((m: { value: any }) => m.value!) - ); - - const preparedSourceRanges = prepareSourceRanges(sourceRanges); - - await withAppEvents( - dbClusterService.addDBCluster({ - kubernetesClusterName: kubernetesCluster?.value, - clusterName: name, - databaseType: databaseType?.value, - clusterSize: nodes, - cpu, - memory, - disk, - databaseImage: databaseVersion?.value, - expose: !!expose, - internetFacing: !!expose && !!internetFacing, - sourceRanges: preparedSourceRanges, - configuration, - ...(storageClass?.value && { storageClass: storageClass?.value }), - ...(args.settings?.backupEnabled && - enableBackups && { - backup: { - cronExpression: cronExpression || '', - locationId: backupLocation?.value || '', - keepCopies: retention || '', - }, - }), - ...(args.settings?.backupEnabled && - enableRestore && { - restore: { - locationId: restoreFrom?.value || '', - destination: backupArtifact?.value || '', - secretsName: secretsName?.value || '', - }, - }), - ...(template && { - template: { - name: template.label, - kind: template.value, - }, - }), - }), - { - successMessage: 'Cluster was successfully added', - } - ) - .then(() => { - thunkAPI.dispatch(setAddDBClusterResult('ok')); - }) - .catch(() => { - thunkAPI.dispatch(setAddDBClusterResult('error')); - }); - } -); - -export const { setAddDBClusterResult, setAddDBClusterLoading, resetAddDBClusterState } = - perconaAddDBClusterSlice.actions; -export default perconaAddDBClusterSlice.reducer; diff --git a/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.types.ts b/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.types.ts deleted file mode 100644 index 0168411fe590a..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Settings } from '../../../../../settings/Settings.types'; - -export interface PerconaAddDBClusterState { - result?: 'ok' | 'error'; - loading?: boolean; -} - -export interface AddDBClusterArgs { - values: Record; - setPMMAddress?: boolean; - settings?: Settings; -} diff --git a/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.ts b/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.ts deleted file mode 100644 index 5dcef6aca65f2..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { CancelToken } from 'axios'; - -import { withSerializedError } from '../../../../../../features/alerting/unified/utils/redux'; -import { DBClusterService } from '../../../../../dbaas/components/DBCluster/DBCluster.service'; -import { DBCluster } from '../../../../../dbaas/components/DBCluster/DBCluster.types'; -import { Kubernetes } from '../../../../../dbaas/components/Kubernetes/Kubernetes.types'; - -import { PerconaDBClustersState } from './dbClusters.types'; -import { formatDBClusters } from './dbClusters.utils'; - -export const initialDBClustersState: PerconaDBClustersState = { - result: [], - loading: undefined, - credentialsLoading: undefined, -}; - -const perconaDBClustersSlice = createSlice({ - name: 'perconaDBClusters', - initialState: initialDBClustersState, - reducers: { - resetDBClustersToInitial: (state): PerconaDBClustersState => ({ - ...state, - result: [], - }), - setDBClusters: (state, action: PayloadAction): PerconaDBClustersState => { - return { - ...state, - result: action.payload, - loading: false, - }; - }, - setDBClustersLoading: (state): PerconaDBClustersState => { - return { - ...state, - loading: true, - }; - }, - }, -}); - -export const fetchDBClustersAction = createAsyncThunk( - 'percona/fetchDBClusters', - (args: { kubernetes: Kubernetes[]; tokens: CancelToken[] }, thunkAPI): Promise => - withSerializedError( - (async () => { - thunkAPI.dispatch(setDBClustersLoading()); - const requests = args.kubernetes.map((k, idx) => DBClusterService.getDBClusters(k, args.tokens[idx])); - const promises = await Promise.all(requests); - - const dbClusters = formatDBClusters(promises, args.kubernetes); - thunkAPI.dispatch(setDBClusters(dbClusters)); - })() - ) -); - -export const { setDBClusters, setDBClustersLoading } = perconaDBClustersSlice.actions; -export default perconaDBClustersSlice.reducer; diff --git a/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.types.ts b/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.types.ts deleted file mode 100644 index fa69257154bab..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.types.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { DBCluster, DBClusterPayload } from '../../../../../dbaas/components/DBCluster/DBCluster.types'; - -export interface PerconaDBClustersState { - result: DBCluster[]; - loading?: boolean; - credentialsLoading?: boolean; -} - -export interface DBClusterListApi { - pxc_clusters?: DBClusterPayload[]; - psmdb_clusters?: DBClusterPayload[]; -} diff --git a/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.utils.ts b/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.utils.ts deleted file mode 100644 index 0e66468995c7b..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/dbClusters/dbClusters.utils.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - DBCluster, - DBClusterListResponse, - DBClusterResponse, -} from '../../../../../dbaas/components/DBCluster/DBCluster.types'; -import { newDBClusterService } from '../../../../../dbaas/components/DBCluster/DBCluster.utils'; -import { Kubernetes } from '../../../../../dbaas/components/Kubernetes/Kubernetes.types'; -import { Databases } from '../../../types'; - -const clustersToModel = (database: Databases, clusters: DBClusterResponse[], kubernetes: Kubernetes[], index: number) => - clusters.map((cluster) => { - return newDBClusterService(database).toModel(cluster, kubernetes[index].kubernetesClusterName, database); - }); - -export const formatDBClusters = (results: DBClusterListResponse[], kubernetes: Kubernetes[]) => { - return results.reduce((acc: DBCluster[], r, index) => { - const pxcClusters: DBClusterResponse[] = r.pxc_clusters ?? []; - const psmdbClusters: DBClusterResponse[] = r.psmdb_clusters ?? []; - const pxcClustersModel = clustersToModel(Databases.mysql, pxcClusters, kubernetes, index); - const psmdbClustersModel = clustersToModel(Databases.mongodb, psmdbClusters, kubernetes, index); - - return acc.concat([...pxcClustersModel, ...psmdbClustersModel]); - }, []); -}; diff --git a/public/app/percona/shared/core/reducers/dbaas/dbaas.ts b/public/app/percona/shared/core/reducers/dbaas/dbaas.ts deleted file mode 100644 index c9daacd5aeb5c..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/dbaas.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; - -import { DBCluster } from '../../../../dbaas/components/DBCluster/DBCluster.types'; -import { Kubernetes } from '../../../../dbaas/components/Kubernetes/Kubernetes.types'; - -export interface PerconaDBaaSState { - selectedKubernetesCluster: Kubernetes | null; - selectedDBCluster: DBCluster | null; -} -export const initialDBaaSState: PerconaDBaaSState = { - selectedKubernetesCluster: null, - selectedDBCluster: null, -}; - -const perconaDBaaSSlice = createSlice({ - name: 'perconaDBaaS', - initialState: initialDBaaSState, - reducers: { - selectKubernetesCluster: (state, action: PayloadAction): PerconaDBaaSState => ({ - ...state, - selectedKubernetesCluster: action.payload, - }), - selectDBCluster: (state, action: PayloadAction): PerconaDBaaSState => ({ - ...state, - selectedDBCluster: action.payload, - }), - resetDBCluster: (state): PerconaDBaaSState => ({ - ...state, - selectedDBCluster: null, - }), - }, -}); - -export const { selectDBCluster, selectKubernetesCluster, resetDBCluster } = perconaDBaaSSlice.actions; -export default perconaDBaaSSlice.reducer; diff --git a/public/app/percona/shared/core/reducers/dbaas/dbaas.utils.ts b/public/app/percona/shared/core/reducers/dbaas/dbaas.utils.ts deleted file mode 100644 index 0a03bc6939eab..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/dbaas.utils.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const prepareSourceRanges = (sourceRanges: Array<{ sourceRange: string | null }>): string[] => - sourceRanges.reduce((acc: string[], item): string[] => (!!item?.sourceRange ? [...acc, item?.sourceRange] : acc), []); diff --git a/public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.ts b/public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.ts deleted file mode 100644 index 6ec7b3f4f2685..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; -import { CancelToken } from 'axios'; - -import { withAppEvents } from '../../../../../../features/alerting/unified/utils/redux'; -import { KubernetesService } from '../../../../../dbaas/components/Kubernetes/Kubernetes.service'; -import { NewKubernetesCluster } from '../../../../../dbaas/components/Kubernetes/Kubernetes.types'; -import { SETTINGS_TIMEOUT } from '../../../constants'; -import { updateSettingsAction } from '../../index'; - -import { PerconaK8SClusterState } from './k8sCluster.types'; - -export const initialDBClustersState: PerconaK8SClusterState = { - result: undefined, - loading: undefined, -}; - -const perconaK8SClusterSlice = createSlice({ - name: 'perconaK8SCluster', - initialState: initialDBClustersState, - reducers: { - setAddK8SClusterResult: (state, { payload }): PerconaK8SClusterState => ({ - ...state, - result: payload, - loading: false, - }), - setAddK8SClusterLoading: (state, { payload }): PerconaK8SClusterState => ({ - ...state, - loading: payload, - }), - resetAddK8SClusterState: (state): PerconaK8SClusterState => { - return initialDBClustersState; - }, - }, -}); - -export const addKubernetesAction = createAsyncThunk( - 'percona/addKubernetes', - async ( - args: { kubernetesToAdd: NewKubernetesCluster; setPMMAddress?: boolean; token?: CancelToken }, - thunkAPI - ): Promise => { - thunkAPI.dispatch(setAddK8SClusterLoading(true)); - if (args.setPMMAddress) { - await thunkAPI.dispatch(updateSettingsAction({ body: { pmm_public_address: window.location.host } })); - await new Promise((resolve) => setTimeout(resolve, SETTINGS_TIMEOUT)); - } - - await withAppEvents(KubernetesService.addKubernetes(args.kubernetesToAdd, args.token), { - successMessage: 'Cluster was successfully registered', - }) - .then(() => { - thunkAPI.dispatch(setAddK8SClusterResult('ok')); - }) - .catch(() => { - thunkAPI.dispatch(setAddK8SClusterResult('error')); - }); - } -); - -export const { setAddK8SClusterResult, resetAddK8SClusterState, setAddK8SClusterLoading } = - perconaK8SClusterSlice.actions; -export default perconaK8SClusterSlice.reducer; diff --git a/public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.types.ts b/public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.types.ts deleted file mode 100644 index ea424ff5d4d8c..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/k8sCluster/k8sCluster.types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface PerconaK8SClusterState { - result?: 'ok' | 'error'; - loading?: boolean; -} diff --git a/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.ts b/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.ts deleted file mode 100644 index b855b2bf5a66d..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; -import { CancelToken } from 'axios'; - -import { withSerializedError } from '../../../../../../features/alerting/unified/utils/redux'; -import { KubernetesService } from '../../../../../dbaas/components/Kubernetes/Kubernetes.service'; - -import { PerconaK8SClusterListState } from './k8sClusterList.types'; -import { toKubernetesListModel } from './k8sClusterList.utils'; - -export const initialDBClustersState: PerconaK8SClusterListState = { - result: undefined, - loading: undefined, -}; - -const perconaK8SClusterListSlice = createSlice({ - name: 'perconaK8SClusterList', - initialState: initialDBClustersState, - reducers: { - setK8SClusterListResult: (state, { payload }): PerconaK8SClusterListState => ({ - ...state, - result: payload, - loading: false, - }), - setK8SClusterListLoading: (state, { payload }): PerconaK8SClusterListState => ({ - ...state, - loading: payload, - }), - resetK8SClusterListState: (state): PerconaK8SClusterListState => { - return initialDBClustersState; - }, - }, -}); - -export const fetchK8sListAction = createAsyncThunk( - 'percona/fetchKubernetes', - (args: { tokens?: { kubernetes?: CancelToken; operator?: CancelToken } }, thunkAPI): Promise => - withSerializedError( - (async () => { - thunkAPI.dispatch(setK8SClusterListLoading(true)); - const [results, checkUpdateResults] = await Promise.all([ - KubernetesService.getKubernetes(args?.tokens?.kubernetes), - KubernetesService.checkForOperatorUpdate(args?.tokens?.operator), - ]); - - thunkAPI.dispatch(setK8SClusterListResult(toKubernetesListModel(results, checkUpdateResults))); - })() - ) -); - -export const { setK8SClusterListResult, resetK8SClusterListState, setK8SClusterListLoading } = - perconaK8SClusterListSlice.actions; -export default perconaK8SClusterListSlice.reducer; diff --git a/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.types.ts b/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.types.ts deleted file mode 100644 index af6511f72f464..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.types.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Kubernetes } from '../../../../../dbaas/components/Kubernetes/Kubernetes.types'; - -export interface PerconaK8SClusterListState { - result?: Kubernetes[]; - loading?: boolean; -} diff --git a/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.utils.ts b/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.utils.ts deleted file mode 100644 index 880cb423a2360..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/k8sClusterList/k8sClusterList.utils.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions */ -import { OPERATOR_COMPONENT_TO_UPDATE_MAP } from '../../../../../dbaas/components/Kubernetes/Kubernetes.constants'; -import { - CheckOperatorUpdateAPI, - Kubernetes, - KubernetesAPI, - KubernetesListAPI, - Operator, - OperatorsList, -} from '../../../../../dbaas/components/Kubernetes/Kubernetes.types'; -import { KubernetesClusterStatus } from '../../../../../dbaas/components/Kubernetes/KubernetesClusterStatus/KubernetesClusterStatus.types'; - -export const toKubernetesListModel = ( - response: KubernetesListAPI, - checkUpdateResponse: CheckOperatorUpdateAPI -): Kubernetes[] => (response.kubernetes_clusters ?? []).map(toKubernetesModel(checkUpdateResponse)); - -const toKubernetesModel = - (checkUpdateResponse: CheckOperatorUpdateAPI) => - ({ kubernetes_cluster_name: kubernetesClusterName, operators, status }: KubernetesAPI): Kubernetes => ({ - kubernetesClusterName, - operators: toModelOperators(kubernetesClusterName, operators, checkUpdateResponse), - status: status as KubernetesClusterStatus, - }); - -const toModelOperators = ( - kubernetesClusterName: string, - operators: OperatorsList, - { cluster_to_components }: CheckOperatorUpdateAPI -): OperatorsList => { - const modelOperators = {} as OperatorsList; - const componentToUpdate = cluster_to_components - ? cluster_to_components[kubernetesClusterName]?.component_to_update_information - : undefined; - - Object.entries(operators).forEach(([operatorKey, operator]: [string, Operator]) => { - const component = OPERATOR_COMPONENT_TO_UPDATE_MAP[operatorKey as keyof OperatorsList]; - - modelOperators[operatorKey as keyof OperatorsList] = { - availableVersion: - componentToUpdate && componentToUpdate[component] ? componentToUpdate[component].available_version : undefined, - ...operator, - }; - }); - - return modelOperators; -}; diff --git a/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts b/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts deleted file mode 100644 index 0600c8fa7db57..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'; - -import { withAppEvents } from '../../../../../../features/alerting/unified/utils/redux'; -import { DBCluster } from '../../../../../dbaas/components/DBCluster/DBCluster.types'; -import { newDBClusterService } from '../../../../../dbaas/components/DBCluster/DBCluster.utils'; -import { prepareSourceRanges } from '../dbaas.utils'; - -import { PerconaUpdateDBClusterState } from './updateDBCluster.types'; - -export const initialUpdateDBClusterState: PerconaUpdateDBClusterState = { - result: undefined, - loading: undefined, -}; - -const perconaUpdateDBClusterSlice = createSlice({ - name: 'perconaUpdateDBCluster', - initialState: initialUpdateDBClusterState, - reducers: { - resetUpdateDBClusterState: (state): PerconaUpdateDBClusterState => { - return { - ...state, - result: undefined, - loading: undefined, - }; - }, - setUpdateDBClusterLoading: (state): PerconaUpdateDBClusterState => { - return { - ...state, - loading: true, - }; - }, - setUpdateDBClusterResult: (state, action): PerconaUpdateDBClusterState => { - return { - ...state, - result: action.payload, - loading: false, - }; - }, - }, -}); - -export const updateDBClusterAction = createAsyncThunk( - 'percona/updateDBCluster', - async (args: { values: Record; selectedDBCluster: DBCluster }, thunkAPI): Promise => { - const { cpu, memory, disk, nodes, configuration, sourceRanges, expose, internetFacing, storageClass, template } = - args.values; - const { selectedDBCluster } = args; - - const dbClusterService = newDBClusterService(selectedDBCluster.databaseType); - thunkAPI.dispatch(setUpdateDBClusterLoading()); - - const preparedSourceRanges = prepareSourceRanges(sourceRanges); - - await withAppEvents( - dbClusterService.updateDBCluster({ - databaseImage: selectedDBCluster.installedImage, - databaseType: selectedDBCluster.databaseType, - clusterName: selectedDBCluster.clusterName, - kubernetesClusterName: selectedDBCluster.kubernetesClusterName, - clusterSize: nodes, - cpu, - memory, - disk, - expose: !!expose, - internetFacing: !!expose && !!internetFacing, - configuration, - sourceRanges: preparedSourceRanges, - ...(storageClass?.value && { storageClass: storageClass?.value }), - ...(template && { - template: { - name: template.label, - kind: template.value, - }, - }), - }), - { - successMessage: 'Cluster was successfully updated', - } - ) - .then(() => { - thunkAPI.dispatch(setUpdateDBClusterResult('ok')); - }) - .catch(() => { - thunkAPI.dispatch(setUpdateDBClusterResult('error')); - }); - } -); - -export const { setUpdateDBClusterLoading, resetUpdateDBClusterState, setUpdateDBClusterResult } = - perconaUpdateDBClusterSlice.actions; -export default perconaUpdateDBClusterSlice.reducer; diff --git a/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.types.ts b/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.types.ts deleted file mode 100644 index b6753fb26e617..0000000000000 --- a/public/app/percona/shared/core/reducers/dbaas/updateDBCluster/updateDBCluster.types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface PerconaUpdateDBClusterState { - result?: 'ok' | 'error'; - loading?: boolean; -} diff --git a/public/app/percona/shared/core/reducers/index.ts b/public/app/percona/shared/core/reducers/index.ts index a2e54109edd3b..e56f00ba04aad 100644 --- a/public/app/percona/shared/core/reducers/index.ts +++ b/public/app/percona/shared/core/reducers/index.ts @@ -3,8 +3,6 @@ import { combineReducers, createAsyncThunk, createSlice, PayloadAction } from '@ import { CancelToken } from 'axios'; import { createAsyncSlice, withAppEvents, withSerializedError } from 'app/features/alerting/unified/utils/redux'; -import { KubernetesService } from 'app/percona/dbaas/components/Kubernetes/Kubernetes.service'; -import { ComponentToUpdate, Kubernetes } from 'app/percona/dbaas/components/Kubernetes/Kubernetes.types'; import { AlertRuleTemplateService } from 'app/percona/integrated-alerting/components/AlertRuleTemplate/AlertRuleTemplate.service'; import { TemplatesList } from 'app/percona/integrated-alerting/components/AlertRuleTemplate/AlertRuleTemplate.types'; import { SettingsService } from 'app/percona/settings/Settings.service'; @@ -17,12 +15,6 @@ import { ServerInfo } from '../types'; import advisorsReducers from './advisors/advisors'; import perconaBackupLocations from './backups/backupLocations'; -import perconaAddDBCluster from './dbaas/addDBCluster/addDBCluster'; -import perconaDBClustersReducer from './dbaas/dbClusters/dbClusters'; -import perconaDBaaSReducer from './dbaas/dbaas'; -import perconaK8SCluster from './dbaas/k8sCluster/k8sCluster'; -import perconaK8SClusterListReducer, { fetchK8sListAction } from './dbaas/k8sClusterList/k8sClusterList'; -import perconaUpdateDBCluster from './dbaas/updateDBCluster/updateDBCluster'; import nodesReducer from './nodes'; import rolesReducers from './roles/roles'; import servicesReducer from './services'; @@ -34,7 +26,6 @@ const initialSettingsState: Settings = { updatesDisabled: true, telemetryEnabled: false, backupEnabled: false, - dbaasEnabled: false, metricsResolutions: { lr: '10s', hr: '15s', @@ -123,27 +114,6 @@ export const updateSettingsAction = createAsyncThunk( ) ); -export const deleteKubernetesAction = createAsyncThunk( - 'percona/deleteKubernetes', - async (args: { kubernetesToDelete: Kubernetes; force?: boolean }, thunkAPI): Promise => { - await withAppEvents(KubernetesService.deleteKubernetes(args.kubernetesToDelete, args.force), { - successMessage: 'Cluster successfully unregistered', - }); - await thunkAPI.dispatch(fetchK8sListAction({})); - } -); - -export const instalKuberneteslOperatorAction = createAsyncThunk( - 'percona/instalKuberneteslOperator', - async ( - args: { kubernetesClusterName: string; operatorType: ComponentToUpdate; availableVersion: string }, - thunkAPI - ): Promise => { - await KubernetesService.installOperator(args.kubernetesClusterName, args.operatorType, args.availableVersion); - await thunkAPI.dispatch(fetchK8sListAction({})); - } -); - export interface PerconaServerState extends ServerInfo { saasHost: string; } @@ -222,11 +192,6 @@ export const fetchTemplatesAction = createAsyncThunk( ) ); -const deleteKubernetesReducer = createAsyncSlice('deleteKubernetes', deleteKubernetesAction).reducer; -const installKubernetesOperatorReducer = createAsyncSlice( - 'instalKuberneteslOperator', - instalKuberneteslOperatorAction -).reducer; const settingsReducer = createAsyncSlice('settings', fetchSettingsAction, initialSettingsState).reducer; const updateSettingsReducer = createAsyncSlice('updateSettings', updateSettingsAction).reducer; const templatesReducer = createAsyncSlice('templates', fetchTemplatesAction).reducer; @@ -236,14 +201,6 @@ export default { settings: settingsReducer, updateSettings: updateSettingsReducer, user: perconaUserReducers, - dbaas: perconaDBaaSReducer, - kubernetes: perconaK8SClusterListReducer, - deleteKubernetes: deleteKubernetesReducer, - addKubernetes: perconaK8SCluster, - addDBCluster: perconaAddDBCluster, - updateDBCluster: perconaUpdateDBCluster, - installKubernetesOperator: installKubernetesOperatorReducer, - dbClusters: perconaDBClustersReducer, server: perconaServerReducers, templates: templatesReducer, services: servicesReducer, diff --git a/public/app/percona/shared/core/selectors.ts b/public/app/percona/shared/core/selectors.ts index 6434c64595103..cc565e5bf0c6f 100644 --- a/public/app/percona/shared/core/selectors.ts +++ b/public/app/percona/shared/core/selectors.ts @@ -9,13 +9,6 @@ export const getPerconaSettings = (state: StoreState) => state.percona.settings; export const getPerconaSettingFlag = (setting: keyof Settings) => (state: StoreState) => !!state.percona.settings.result?.[setting]; export const getPerconaUser = (state: StoreState) => state.percona.user; -export const getDBaaS = (state: StoreState) => state.percona.dbaas; -export const getKubernetes = (state: StoreState) => state.percona.kubernetes; -export const getDeleteKubernetes = (state: StoreState) => state.percona.deleteKubernetes; -export const getAddKubernetes = (state: StoreState) => state.percona.addKubernetes; -export const getUpdateDbCluster = (state: StoreState) => state.percona.updateDBCluster; -export const getAddDbCluster = (state: StoreState) => state.percona.addDBCluster; -export const getPerconaDBClusters = (state: StoreState) => state.percona.dbClusters; export const getPerconaServer = (state: StoreState) => state.percona.server; export const getTemplates = (state: StoreState) => state.percona.templates; export const getServices = (state: StoreState) => state.percona.services; diff --git a/public/app/percona/shared/helpers/getExpandAndActionsCol.tsx b/public/app/percona/shared/helpers/getExpandAndActionsCol.tsx index d50eef032fc3a..08ece15805600 100644 --- a/public/app/percona/shared/helpers/getExpandAndActionsCol.tsx +++ b/public/app/percona/shared/helpers/getExpandAndActionsCol.tsx @@ -2,7 +2,7 @@ import { css, cx } from '@emotion/css'; import React from 'react'; import { Column, ColumnGroup, Row } from 'react-table'; -import { Action } from 'app/percona/dbaas/components/MultipleActions/MultipleActions.types'; +import { Action } from 'app/percona/shared/components/Elements/MultipleActions/MultipleActions.types'; import { ExpandAndActionsCol } from '../components/Elements/ExpandAndActionsCol/ExpandAndActionsCol'; diff --git a/public/app/percona/tour/steps/product/product.messages.ts b/public/app/percona/tour/steps/product/product.messages.ts index 07cf11bffe20a..c4a46e0325d59 100644 --- a/public/app/percona/tour/steps/product/product.messages.ts +++ b/public/app/percona/tour/steps/product/product.messages.ts @@ -43,7 +43,7 @@ export const Messages = { services: "Here you can check Services, Agents and Nodes in your PMM's Inventory, and add new instances for monitoring: PostgreSQL, MySQL, MongoDB, HAProxy, etc.", settings: - 'PMM Settings also live here. From there, you can connect your PMM instance to Percona Platform and change more advanced settings, for example to activate PMM Alerting, private DBaaS feature (currently in technical preview), etc.', + 'PMM Settings also live here. From there, you can connect your PMM instance to Percona Platform and change more advanced settings, for example to activate PMM Alerting, etc.', settingsDocs: 'Documentation for PMM Settings ', settingsDocsLink: 'here', }, @@ -62,19 +62,6 @@ export const Messages = { findOutMore: 'To find out more, check out the ', docs: 'Advisors documentation', }, - dbaas: { - title: 'DBaaS', - feature: - 'Private DBaaS feature allows you to CRUD (Create, Read, Update, Delete) Percona XtraDB Cluster (PXC), and Percona Server for MongoDB (PSMDB) managed databases in Kubernetes clusters.', - techPreview: - 'This is a technical preview feature recommended for test environments only. To use private DBaaS feature, make sure to activate it via Settings, on the sidebar.', - benefits: 'The benefits of using private DBaaS feature are manifold such as:', - singleInterface: - 'A single interface to deploy and manage your open source databases on-premises, in the cloud, or across hybrid and multi-cloud environments.', - dbManagement: 'Critical database management operations, such as backup, recovery, and patching.', - automation: - 'Enhanced automation and advisory services allow you to find, eliminate, and prevent outages, security issues, and slowdowns.', - }, backup: { title: 'Backup', feature: diff --git a/public/app/percona/tour/steps/product/product.steps.tsx b/public/app/percona/tour/steps/product/product.steps.tsx index e052a206771b7..679b357c79e1c 100644 --- a/public/app/percona/tour/steps/product/product.steps.tsx +++ b/public/app/percona/tour/steps/product/product.steps.tsx @@ -87,25 +87,25 @@ export const getProductTourSteps = ( }, ] : []), - ...(isPmmAdmin && !!settings?.dbaasEnabled - ? [ - { - selector: '.dropdown > [aria-label="DBaaS"]', - content: ( - -

{Messages.dbaas.feature}

-

{Messages.dbaas.techPreview}

-

{Messages.dbaas.benefits}

-
    -
  • {Messages.dbaas.singleInterface}
  • -
  • {Messages.dbaas.dbManagement}
  • -
  • {Messages.dbaas.automation}
  • -
-
- ), - }, - ] - : []), + // ...(isPmmAdmin && !!settings?.dbaasEnabled + // ? [ + // { + // selector: '.dropdown > [aria-label="DBaaS"]', + // content: ( + // + //

{Messages.dbaas.feature}

+ //

{Messages.dbaas.techPreview}

+ //

{Messages.dbaas.benefits}

+ //
    + //
  • {Messages.dbaas.singleInterface}
  • + //
  • {Messages.dbaas.dbManagement}
  • + //
  • {Messages.dbaas.automation}
  • + //
+ //
+ // ), + // }, + // ] + // : []), ...(isPmmAdmin && !!settings?.backupEnabled ? [ { diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index 7d55783d1b05c..27a41084e6556 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -20,13 +20,6 @@ import { AccessControlAction, DashboardRoutes } from 'app/types'; import { SafeDynamicImport } from '../core/components/DynamicImports/SafeDynamicImport'; import { RouteDescriptor } from '../core/navigation/types'; import { getPublicDashboardRoutes } from '../features/dashboard/routes'; -import { DBAAS_URL } from '../percona/dbaas/DBaaS.constants'; -import { - DB_CLUSTER_CREATION_URL, - DB_CLUSTER_EDIT_URL, - DB_CLUSTER_INVENTORY_URL, -} from '../percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage.constants'; -import { K8S_INVENTORY_URL } from '../percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage.constants'; import { pluginHasRootPage } from './utils'; @@ -512,59 +505,6 @@ export function getAppRoutes(): RouteDescriptor[] { ) ), }, - { - path: DBAAS_URL, - // eslint-disable-next-line react/display-name - component: SafeDynamicImport( - () => - import(/* webpackChunkName: "DbaaSKubernetesPage" */ 'app/percona/dbaas/components/DBaasRouting/DBaaSRouting') - ), - }, - { - path: K8S_INVENTORY_URL, - component: SafeDynamicImport( - () => - import( - /* webpackChunkName: "DbaaSKubernetesPage" */ 'app/percona/dbaas/components/Kubernetes/K8sRouting/K8sRouting' - ) - ), - }, - { - path: '/dbaas/kubernetes/registration', - // eslint-disable-next-line react/display-name - component: SafeDynamicImport( - () => - import( - /* webpackChunkName: "DbaaSKubernetesPage" */ 'app/percona/dbaas/components/Kubernetes/EditK8sClusterPage/EditK8sClusterPage' - ) - ), - }, - { - path: DB_CLUSTER_INVENTORY_URL, - component: SafeDynamicImport( - () => import(/* webpackChunkName: "DbaaSClustersPage" */ 'app/percona/dbaas/components/DBCluster/DBCluster') - ), - }, - { - path: DB_CLUSTER_CREATION_URL, - // eslint-disable-next-line react/display-name - component: SafeDynamicImport( - () => - import( - /* webpackChunkName: "DbaaSKubernetesPage" */ 'app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage' - ) - ), - }, - { - path: DB_CLUSTER_EDIT_URL, - // eslint-disable-next-line react/display-name - component: SafeDynamicImport( - () => - import( - /* webpackChunkName: "DbaaSKubernetesPage" */ 'app/percona/dbaas/components/DBCluster/EditDBClusterPage/EditDBClusterPage' - ) - ), - }, { path: '/backup', // eslint-disable-next-line react/display-name From 05ad933a002e4540e6eaa74f8caf635b790c2d33 Mon Sep 17 00:00:00 2001 From: Yash Sartanpara Date: Tue, 28 Nov 2023 14:37:42 +0530 Subject: [PATCH 08/10] PMM-12545 fix import for dump --- .betterer.results | 27 ------------------------- public/app/percona/pmm-dump/PMMDump.tsx | 2 +- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/.betterer.results b/.betterer.results index daa6d91be16e3..c8a36eefc3e10 100644 --- a/.betterer.results +++ b/.betterer.results @@ -5762,30 +5762,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] ], - "public/app/percona/dbaas/components/DBCluster/DBCluster.service.utils.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"] - ], - "public/app/percona/dbaas/components/DBCluster/DBClusterLogsModal/DBClusterLogsModal.utils.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"] - ], - "public/app/percona/dbaas/components/DBCluster/EditDBClusterPage/hooks/useEditDBClusterFormSubmit.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"] - ], - "public/app/percona/dbaas/components/DBCluster/ResourcesBar/ResourcesBar.utils.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"] - ], - "public/app/percona/dbaas/components/Kubernetes/ColumnRenderers/ColumnRenderers.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], - "public/app/percona/dbaas/components/Kubernetes/ManageComponentsVersionsModal/ManageComponentsVersions.utils.tsx:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"] - ], "public/app/percona/inventory/Tabs/Services/ClusterItem.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -5826,9 +5802,6 @@ exports[`better eslint`] = { "public/app/percona/shared/components/Form/MultiCheckbox/MultiCheckboxField.types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/percona/shared/core/reducers/dbaas/addDBCluster/addDBCluster.types.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "public/app/percona/shared/helpers/cron/cron.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"] diff --git a/public/app/percona/pmm-dump/PMMDump.tsx b/public/app/percona/pmm-dump/PMMDump.tsx index 4ac8914be3219..ce697b6b488a7 100644 --- a/public/app/percona/pmm-dump/PMMDump.tsx +++ b/public/app/percona/pmm-dump/PMMDump.tsx @@ -8,9 +8,9 @@ import { Page } from 'app/core/components/Page/Page'; import { DATA_INTERVAL } from 'app/percona/backup/components/BackupInventory/BackupInventory.constants'; import { DetailedDate } from 'app/percona/backup/components/DetailedDate'; import { useRecurringCall } from 'app/percona/backup/hooks/recurringCall.hook'; -import { Action } from 'app/percona/dbaas/components/MultipleActions'; import { DumpStatus, DumpStatusColor, DumpStatusText, PMMDumpServices } from 'app/percona/pmm-dump/PmmDump.types'; import { DetailsRow } from 'app/percona/shared/components/Elements/DetailsRow/DetailsRow'; +import { Action } from 'app/percona/shared/components/Elements/MultipleActions'; import { ExtendedColumn, FilterFieldTypes, Table } from 'app/percona/shared/components/Elements/Table'; import { usePerconaNavModel } from 'app/percona/shared/components/hooks/perconaNavModel'; import { From d209614cb248f84f8a1a3151bc1359b454500c3c Mon Sep 17 00:00:00 2001 From: Yash Sartanpara Date: Tue, 5 Dec 2023 15:51:15 +0530 Subject: [PATCH 09/10] PMM-12545 restore warning and remove comments --- .../components/Platform/Connect/Connect.tsx | 3 ++- .../PMMServerUrlWarning.messages.ts | 6 +++++ .../PMMServerUrlWarning.styles.ts | 12 ++++++++++ .../PMMServerUrlWarning.tsx | 22 +++++++++++++++++++ .../PMMServerUrlWarning.types.ts | 3 +++ .../tour/steps/product/product.steps.tsx | 19 ---------------- 6 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.messages.ts create mode 100644 public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.styles.ts create mode 100644 public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.tsx create mode 100644 public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.types.ts diff --git a/public/app/percona/settings/components/Platform/Connect/Connect.tsx b/public/app/percona/settings/components/Platform/Connect/Connect.tsx index c54abd033505b..01f577c468bd8 100644 --- a/public/app/percona/settings/components/Platform/Connect/Connect.tsx +++ b/public/app/percona/settings/components/Platform/Connect/Connect.tsx @@ -15,6 +15,7 @@ import { ConnectRenderProps } from '../types'; import { getStyles } from './Connect.styles'; import { ConnectProps } from './Connect.types'; +import { PMMServerUrlWarning } from './PMMServerURLWarning/PMMServerUrlWarning'; export const Connect: FC = ({ onConnect, connecting, initialValues }) => { const styles = useStyles2(getStyles); @@ -64,7 +65,7 @@ export const Connect: FC = ({ onConnect, connecting, initialValues - {/* {showPMMAddressWarning && } */} + {showPMMAddressWarning && } `This will also set "Public Address" as ${address}. `, + editLater: 'If you need to set it differently or edit later, use ', + advancedSettings: 'Advanced Settings', +}; diff --git a/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.styles.ts b/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.styles.ts new file mode 100644 index 0000000000000..3fef5af4c9948 --- /dev/null +++ b/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.styles.ts @@ -0,0 +1,12 @@ +import { css } from '@emotion/css'; + +import { GrafanaTheme } from '@grafana/data'; + +export const getStyles = ({ spacing }: GrafanaTheme) => ({ + alert: css` + p { + margin-bottom: 0; + } + margin: ${spacing.md} 0; + `, +}); diff --git a/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.tsx b/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.tsx new file mode 100644 index 0000000000000..8f053886b9d46 --- /dev/null +++ b/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.tsx @@ -0,0 +1,22 @@ +import { cx } from '@emotion/css'; +import React, { FC } from 'react'; +import { Link } from 'react-router-dom'; + +import { Card, useStyles } from '@grafana/ui'; + +import { Messages } from './PMMServerUrlWarning.messages'; +import { getStyles } from './PMMServerUrlWarning.styles'; + +export const PMMServerUrlWarning: FC = ({ className }) => { + const styles = useStyles(getStyles); + return ( + + {Messages.heading} + + {Messages.addressSet(window.location.host)} + {Messages.editLater} + {Messages.advancedSettings}. + + + ); +}; diff --git a/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.types.ts b/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.types.ts new file mode 100644 index 0000000000000..e5126f8a52acd --- /dev/null +++ b/public/app/percona/settings/components/Platform/Connect/PMMServerURLWarning/PMMServerUrlWarning.types.ts @@ -0,0 +1,3 @@ +interface PMMServerUrlWarningProps { + className?: string; +} diff --git a/public/app/percona/tour/steps/product/product.steps.tsx b/public/app/percona/tour/steps/product/product.steps.tsx index 679b357c79e1c..5e158155a98d8 100644 --- a/public/app/percona/tour/steps/product/product.steps.tsx +++ b/public/app/percona/tour/steps/product/product.steps.tsx @@ -87,25 +87,6 @@ export const getProductTourSteps = ( }, ] : []), - // ...(isPmmAdmin && !!settings?.dbaasEnabled - // ? [ - // { - // selector: '.dropdown > [aria-label="DBaaS"]', - // content: ( - // - //

{Messages.dbaas.feature}

- //

{Messages.dbaas.techPreview}

- //

{Messages.dbaas.benefits}

- //
    - //
  • {Messages.dbaas.singleInterface}
  • - //
  • {Messages.dbaas.dbManagement}
  • - //
  • {Messages.dbaas.automation}
  • - //
- //
- // ), - // }, - // ] - // : []), ...(isPmmAdmin && !!settings?.backupEnabled ? [ { From b82764631c5f0cb5b42af41523f293e046e96f61 Mon Sep 17 00:00:00 2001 From: Yash Sartanpara Date: Thu, 25 Jan 2024 16:39:47 +0530 Subject: [PATCH 10/10] PMM-12545 remove dbaas deprecation warning --- .../DeprecationWarning.constants.ts | 2 -- .../DeprecationWarning.messages.ts | 8 ------- .../DeprecationWarning/DeprecationWarning.tsx | 24 ------------------- .../components/DeprecationWarning/index.ts | 3 --- .../app/percona/settings/Settings.messages.ts | 1 - .../settings/components/Advanced/Advanced.tsx | 20 ---------------- 6 files changed, 58 deletions(-) delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx delete mode 100644 public/app/percona/dbaas/components/DeprecationWarning/index.ts diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts deleted file mode 100644 index c97ec8a791ef0..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const EVEREST_LINK = 'http://per.co.na/pmm-to-everest'; -export const MIGRATION_GUIDE_LINK = 'http://per.co.na/pmm-to-everest-guide'; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts deleted file mode 100644 index a069cbf9b1342..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.messages.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const Messages = { - title: 'Deprecation notice', - warning: 'DBaaS feature is deprecated. We encourage you to use ', - everest: 'Everest', - warningCont: ' instead. Check out our ', - guide: 'Migration guide', - dot: '.', -}; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx b/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx deleted file mode 100644 index 4c0530e686453..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/DeprecationWarning.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React, { FC } from 'react'; - -import { Alert } from '@grafana/ui'; - -import { EVEREST_LINK, MIGRATION_GUIDE_LINK } from './DeprecationWarning.constants'; -import { Messages } from './DeprecationWarning.messages'; - -const DbaasDeprecationWarning: FC = () => ( -
- - {Messages.warning} - - {Messages.everest} - - {Messages.warningCont} - - {Messages.guide} - - {Messages.dot} - -
-); - -export default DbaasDeprecationWarning; diff --git a/public/app/percona/dbaas/components/DeprecationWarning/index.ts b/public/app/percona/dbaas/components/DeprecationWarning/index.ts deleted file mode 100644 index 2d3b0cd490d7d..0000000000000 --- a/public/app/percona/dbaas/components/DeprecationWarning/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import DbaasDeprecationWarning from './DeprecationWarning'; - -export default DbaasDeprecationWarning; diff --git a/public/app/percona/settings/Settings.messages.ts b/public/app/percona/settings/Settings.messages.ts index d7360402e6f4c..9ec8d27ed2ee0 100644 --- a/public/app/percona/settings/Settings.messages.ts +++ b/public/app/percona/settings/Settings.messages.ts @@ -43,7 +43,6 @@ export const Messages = { 'These are technical preview features, not recommended to be used in production environments. Read more\n' + ' about feature status', technicalPreviewLinkText: 'here', - deprecatedFeatures: 'Deprecated features', }, diagnostics: { action: 'Download server diagnostics', diff --git a/public/app/percona/settings/components/Advanced/Advanced.tsx b/public/app/percona/settings/components/Advanced/Advanced.tsx index a385dba27f60a..744d2d7dda3fc 100644 --- a/public/app/percona/settings/components/Advanced/Advanced.tsx +++ b/public/app/percona/settings/components/Advanced/Advanced.tsx @@ -4,7 +4,6 @@ import { Field, withTypes } from 'react-final-form'; import { Button, Icon, Spinner, useStyles2 } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; -import DbaasDeprecationWarning from 'app/percona/dbaas/components/DeprecationWarning'; import { Messages } from 'app/percona/settings/Settings.messages'; import { getSettingsStyles } from 'app/percona/settings/Settings.styles'; import { FeatureLoader } from 'app/percona/shared/components/Elements/FeatureLoader'; @@ -94,7 +93,6 @@ export const Advanced: FC = () => { backupLabel, backupLink, backupTooltip, - deprecatedFeatures, }, tooltipLinkText, } = Messages; @@ -345,24 +343,6 @@ export const Advanced: FC = () => { component={SwitchRow} /> -
- {deprecatedFeatures} - {!!values.dbaas && } - , input: any) => { - dBaaSToggleOnChange(event, input, mutators); - }} - /> -