ydb-embedded-ui 21.0.0 → 22.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ComponentsProvider/ComponentsProvider.d.ts +0 -4
- package/dist/components/ComponentsProvider/componentsRegistry.d.ts +0 -2
- package/dist/components/ComponentsProvider/componentsRegistry.js +1 -3
- package/dist/components/ComponentsProvider/componentsRegistry.js.map +1 -1
- package/dist/components/ContentWithPopup/ContentWithPopup.d.ts +1 -1
- package/dist/components/ContentWithPopup/ContentWithPopup.js +4 -2
- package/dist/components/ContentWithPopup/ContentWithPopup.js.map +1 -1
- package/dist/components/CriticalActionDialog/CriticalActionDialog.js +10 -6
- package/dist/components/CriticalActionDialog/CriticalActionDialog.js.map +1 -1
- package/dist/components/CriticalActionDialog/i18n/en.json +1 -2
- package/dist/components/CriticalActionDialog/i18n/index.d.ts +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.d.ts +2 -1
- package/dist/components/DropdownMenu/DropdownMenu.js +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
- package/dist/components/HoverPopup/HoverPopup.js +27 -4
- package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
- package/dist/components/HoverPopup/getPopupScrollContainer.d.ts +1 -0
- package/dist/components/HoverPopup/getPopupScrollContainer.js +20 -0
- package/dist/components/HoverPopup/getPopupScrollContainer.js.map +1 -0
- package/dist/components/MetricChart/reducer.d.ts +2 -2
- package/dist/components/SegmentedProgress/SegmentedProgress.d.ts +22 -1
- package/dist/components/SegmentedProgress/SegmentedProgress.js +44 -3
- package/dist/components/SegmentedProgress/SegmentedProgress.js.map +1 -1
- package/dist/components/SegmentedProgress/SegmentedProgress.scss +5 -0
- package/dist/components/StorageGroupInfo/StorageGroupInfo.js +1 -13
- package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
- package/dist/components/StorageGroupInfo/i18n/en.json +0 -1
- package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
- package/dist/components/nodesColumns/i18n/index.d.ts +1 -1
- package/dist/containers/App/App.js +3 -3
- package/dist/containers/App/App.js.map +1 -1
- package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js +8 -5
- package/dist/containers/Cluster/ClusterInfo/ClusterInfo.js.map +1 -1
- package/dist/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
- package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.d.ts +4 -3
- package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js +62 -25
- package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.js.map +1 -1
- package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
- package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.d.ts +22 -0
- package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js +49 -0
- package/dist/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.js.map +1 -0
- package/dist/containers/Cluster/i18n/en.json +13 -4
- package/dist/containers/Cluster/i18n/index.d.ts +1 -1
- package/dist/containers/Header/HeaderActionsMenu.js +19 -3
- package/dist/containers/Header/HeaderActionsMenu.js.map +1 -1
- package/dist/containers/Header/hooks/useSharedDatabasePath.d.ts +4 -1
- package/dist/containers/Header/hooks/useSharedDatabasePath.js +14 -10
- package/dist/containers/Header/hooks/useSharedDatabasePath.js.map +1 -1
- package/dist/containers/Header/i18n/en.json +1 -0
- package/dist/containers/Header/i18n/index.d.ts +1 -1
- package/dist/containers/Node/Node.js +20 -17
- package/dist/containers/Node/Node.js.map +1 -1
- package/dist/containers/Node/NodePages.d.ts +3 -9
- package/dist/containers/Node/NodePages.js +2 -10
- package/dist/containers/Node/NodePages.js.map +1 -1
- package/dist/containers/Node/i18n/en.json +0 -3
- package/dist/containers/Node/i18n/index.d.ts +1 -1
- package/dist/containers/Nodes/NodesTable.js +2 -2
- package/dist/containers/Nodes/NodesTable.js.map +1 -1
- package/dist/containers/Operations/columns.js +2 -2
- package/dist/containers/Operations/columns.js.map +1 -1
- package/dist/containers/Operations/i18n/en.json +2 -2
- package/dist/containers/PDiskPage/DecommissionButton/DecommissionButton.js +1 -1
- package/dist/containers/PDiskPage/DecommissionButton/DecommissionButton.js.map +1 -1
- package/dist/containers/PDiskPage/PDiskPage.js +1 -1
- package/dist/containers/PDiskPage/PDiskPage.js.map +1 -1
- package/dist/containers/PDiskPage/i18n/en.json +3 -3
- package/dist/containers/Storage/PDisks/PDisks.js +1 -1
- package/dist/containers/Storage/PDisks/PDisks.js.map +1 -1
- package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js +0 -1
- package/dist/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.js.map +1 -1
- package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js +2 -3
- package/dist/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.js.map +1 -1
- package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/constants.d.ts +2 -2
- package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.d.ts +1 -1
- package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js +2 -3
- package/dist/containers/Storage/PaginatedStorageGroupsTable/getGroups.js.map +1 -1
- package/dist/containers/StorageGroupPage/StorageGroupPage.js +2 -3
- package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
- package/dist/containers/Tablet/components/TabletControls/TabletControls.js +1 -1
- package/dist/containers/Tablet/components/TabletControls/TabletControls.js.map +1 -1
- package/dist/containers/Tablet/i18n/en.json +3 -3
- package/dist/containers/Tablets/TabletsTable.js +1 -1
- package/dist/containers/Tablets/TabletsTable.js.map +1 -1
- package/dist/containers/Tablets/i18n/en.json +1 -1
- package/dist/containers/Tenant/Diagnostics/Partitions/utils/constants.d.ts +2 -2
- package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.js +3 -1
- package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js +2 -2
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js +1 -3
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.js.map +1 -1
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/useTenantStorageNewData.d.ts +5 -5
- package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js +2 -4
- package/dist/containers/Tenant/Diagnostics/useDiagnosticsPages.js.map +1 -1
- package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +10 -2
- package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
- package/dist/routes.d.ts +1 -0
- package/dist/routes.js.map +1 -1
- package/dist/services/api/viewer.d.ts +1 -2
- package/dist/services/api/viewer.js +0 -11
- package/dist/services/api/viewer.js.map +1 -1
- package/dist/store/configureStore.d.ts +12 -12
- package/dist/store/defaultStore.d.ts +6 -6
- package/dist/store/reducers/api.d.ts +1 -1
- package/dist/store/reducers/api.js +3 -0
- package/dist/store/reducers/api.js.map +1 -1
- package/dist/store/reducers/authentication/authentication.d.ts +4 -4
- package/dist/store/reducers/cancelQuery.d.ts +2 -2
- package/dist/store/reducers/capabilities/capabilities.d.ts +43 -43
- package/dist/store/reducers/capabilities/hooks.d.ts +5 -6
- package/dist/store/reducers/capabilities/hooks.js +0 -3
- package/dist/store/reducers/capabilities/hooks.js.map +1 -1
- package/dist/store/reducers/cluster/cluster.d.ts +5 -5
- package/dist/store/reducers/cluster/cluster.js +3 -2
- package/dist/store/reducers/cluster/cluster.js.map +1 -1
- package/dist/store/reducers/clusters/clusters.d.ts +2 -2
- package/dist/store/reducers/clusters/clusters.js +2 -1
- package/dist/store/reducers/clusters/clusters.js.map +1 -1
- package/dist/store/reducers/codeAssist/codeAssist.d.ts +6 -6
- package/dist/store/reducers/configs.d.ts +3 -3
- package/dist/store/reducers/entityDataTags.d.ts +21 -0
- package/dist/store/reducers/entityDataTags.js +24 -0
- package/dist/store/reducers/entityDataTags.js.map +1 -0
- package/dist/store/reducers/environments/environments.d.ts +2 -2
- package/dist/store/reducers/executeTopQueries/executeTopQueries.d.ts +4 -4
- package/dist/store/reducers/healthcheckInfo/healthcheckInfo.d.ts +111 -111
- package/dist/store/reducers/heatmap.d.ts +2 -2
- package/dist/store/reducers/hotKeys/hotKeys.d.ts +2 -2
- package/dist/store/reducers/index.d.ts +8 -8
- package/dist/store/reducers/network/network.d.ts +2 -2
- package/dist/store/reducers/node/node.d.ts +2 -5
- package/dist/store/reducers/node/node.js +0 -12
- package/dist/store/reducers/node/node.js.map +1 -1
- package/dist/store/reducers/node/types.d.ts +0 -14
- package/dist/store/reducers/nodes/nodes.d.ts +2 -2
- package/dist/store/reducers/nodesList.d.ts +12 -12
- package/dist/store/reducers/operations.d.ts +5 -5
- package/dist/store/reducers/overview/overview.d.ts +2 -2
- package/dist/store/reducers/partitions/partitions.d.ts +3 -3
- package/dist/store/reducers/pdisk/pdisk.d.ts +2 -2
- package/dist/store/reducers/planToSvg.d.ts +2 -2
- package/dist/store/reducers/preview.d.ts +2 -2
- package/dist/store/reducers/query/api.d.ts +4 -4
- package/dist/store/reducers/replication.d.ts +2 -2
- package/dist/store/reducers/schema/schema.d.ts +16 -16
- package/dist/store/reducers/schemaAcl/schemaAcl.d.ts +40 -40
- package/dist/store/reducers/settings/api.d.ts +4 -4
- package/dist/store/reducers/settings/settings.d.ts +1 -1
- package/dist/store/reducers/shardsWorkload/shardsWorkload.d.ts +2 -2
- package/dist/store/reducers/showCreateTable/showCreateTable.d.ts +2 -2
- package/dist/store/reducers/storage/requestStorageData.d.ts +2 -4
- package/dist/store/reducers/storage/requestStorageData.js +4 -10
- package/dist/store/reducers/storage/requestStorageData.js.map +1 -1
- package/dist/store/reducers/storage/storage.d.ts +4 -6
- package/dist/store/reducers/storage/storage.js.map +1 -1
- package/dist/store/reducers/storage/types.d.ts +0 -9
- package/dist/store/reducers/storage/utils.d.ts +1 -2
- package/dist/store/reducers/storage/utils.js +3 -114
- package/dist/store/reducers/storage/utils.js.map +1 -1
- package/dist/store/reducers/storageUsage/StorageUsage.d.ts +2 -2
- package/dist/store/reducers/streamingQuery/streamingQuery.d.ts +2 -2
- package/dist/store/reducers/table/table.d.ts +4 -4
- package/dist/store/reducers/tableData.d.ts +1 -1
- package/dist/store/reducers/tablePartitioning/tablePartitioning.d.ts +2 -2
- package/dist/store/reducers/tableSchemaData.d.ts +2 -2
- package/dist/store/reducers/tablet.d.ts +8 -8
- package/dist/store/reducers/tablets.d.ts +3 -3
- package/dist/store/reducers/tenant/tenant.d.ts +2 -2
- package/dist/store/reducers/tenant/tenant.js +14 -1
- package/dist/store/reducers/tenant/tenant.js.map +1 -1
- package/dist/store/reducers/tenantOverview/executeTopTables/executeTopTables.d.ts +2 -2
- package/dist/store/reducers/tenantOverview/storage/tenantOverviewStorage.d.ts +2 -2
- package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.d.ts +2 -2
- package/dist/store/reducers/tenants/tenants.d.ts +3 -3
- package/dist/store/reducers/tenants/tenants.js +2 -1
- package/dist/store/reducers/tenants/tenants.js.map +1 -1
- package/dist/store/reducers/topic/topic.d.ts +84 -84
- package/dist/store/reducers/vdisk/vdisk.d.ts +3 -3
- package/dist/store/reducers/viewSchema/viewSchema.d.ts +2 -2
- package/dist/store/state-url-mapping.js +5 -1
- package/dist/store/state-url-mapping.js.map +1 -1
- package/dist/types/api/storage.d.ts +2 -111
- package/dist/types/api/storage.js.map +1 -1
- package/dist/uiFactory/types.d.ts +8 -0
- package/dist/uiFactory/uiFactory.js +5 -2
- package/dist/uiFactory/uiFactory.js.map +1 -1
- package/dist/utils/hooks/useWhoami.d.ts +5 -5
- package/package.json +2 -2
- package/src/components/ComponentsProvider/componentsRegistry.ts +1 -4
- package/src/components/ContentWithPopup/ContentWithPopup.tsx +7 -0
- package/src/components/CriticalActionDialog/CriticalActionDialog.tsx +12 -25
- package/src/components/CriticalActionDialog/i18n/en.json +1 -2
- package/src/components/DropdownMenu/DropdownMenu.tsx +3 -2
- package/src/components/HoverPopup/HoverPopup.tsx +32 -3
- package/src/components/HoverPopup/getPopupScrollContainer.ts +20 -0
- package/src/components/SegmentedProgress/SegmentedProgress.scss +5 -0
- package/src/components/SegmentedProgress/SegmentedProgress.tsx +99 -10
- package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +0 -13
- package/src/components/StorageGroupInfo/i18n/en.json +0 -1
- package/src/containers/App/App.tsx +3 -3
- package/src/containers/Cluster/ClusterInfo/ClusterInfo.scss +8 -0
- package/src/containers/Cluster/ClusterInfo/ClusterInfo.tsx +12 -11
- package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.scss +18 -0
- package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/DiskGroupsStats.tsx +143 -58
- package/src/containers/Cluster/ClusterInfo/components/DiskGroupsStatsBars/utils.ts +89 -0
- package/src/containers/Cluster/i18n/en.json +13 -4
- package/src/containers/Header/HeaderActionsMenu.tsx +22 -2
- package/src/containers/Header/hooks/useSharedDatabasePath.ts +33 -26
- package/src/containers/Header/i18n/en.json +1 -0
- package/src/containers/Node/Node.tsx +32 -18
- package/src/containers/Node/NodePages.ts +5 -10
- package/src/containers/Node/i18n/en.json +0 -4
- package/src/containers/Nodes/NodesTable.tsx +7 -1
- package/src/containers/Operations/columns.tsx +4 -0
- package/src/containers/Operations/i18n/en.json +2 -2
- package/src/containers/PDiskPage/DecommissionButton/DecommissionButton.tsx +2 -0
- package/src/containers/PDiskPage/PDiskPage.tsx +3 -1
- package/src/containers/PDiskPage/i18n/en.json +3 -3
- package/src/containers/Storage/PDisks/PDisks.tsx +1 -1
- package/src/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.tsx +0 -1
- package/src/containers/Storage/PaginatedStorageGroupsTable/PaginatedStorageGroupsTable.tsx +2 -6
- package/src/containers/Storage/PaginatedStorageGroupsTable/columns/constants.ts +2 -2
- package/src/containers/Storage/PaginatedStorageGroupsTable/getGroups.ts +40 -47
- package/src/containers/StorageGroupPage/StorageGroupPage.tsx +2 -6
- package/src/containers/Tablet/components/TabletControls/TabletControls.tsx +7 -1
- package/src/containers/Tablet/i18n/en.json +3 -3
- package/src/containers/Tablets/TabletsTable.tsx +3 -1
- package/src/containers/Tablets/i18n/en.json +1 -1
- package/src/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx +3 -1
- package/src/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +2 -2
- package/src/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx +1 -6
- package/src/containers/Tenant/Diagnostics/useDiagnosticsPages.ts +1 -4
- package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +16 -1
- package/src/routes.ts +1 -1
- package/src/services/api/viewer.ts +1 -25
- package/src/store/reducers/api.ts +4 -0
- package/src/store/reducers/capabilities/hooks.ts +0 -4
- package/src/store/reducers/cluster/cluster.ts +3 -2
- package/src/store/reducers/clusters/clusters.ts +2 -1
- package/src/store/reducers/entityDataTags.ts +34 -0
- package/src/store/reducers/node/node.ts +0 -11
- package/src/store/reducers/node/types.ts +0 -18
- package/src/store/reducers/storage/requestStorageData.ts +5 -17
- package/src/store/reducers/storage/storage.ts +2 -6
- package/src/store/reducers/storage/types.ts +0 -9
- package/src/store/reducers/storage/utils.ts +5 -178
- package/src/store/reducers/tenant/tenant.ts +17 -1
- package/src/store/reducers/tenants/tenants.ts +2 -1
- package/src/store/state-url-mapping.ts +5 -1
- package/src/types/api/storage.ts +7 -131
- package/src/uiFactory/types.ts +9 -0
- package/src/uiFactory/uiFactory.ts +12 -2
- package/dist/containers/Node/NodeStructure/NodeStructure.d.ts +0 -7
- package/dist/containers/Node/NodeStructure/NodeStructure.js +0 -76
- package/dist/containers/Node/NodeStructure/NodeStructure.js.map +0 -1
- package/dist/containers/Node/NodeStructure/NodeStructure.scss +0 -155
- package/dist/containers/Node/NodeStructure/PDiskTitleBadge.d.ts +0 -7
- package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js +0 -7
- package/dist/containers/Node/NodeStructure/PDiskTitleBadge.js.map +0 -1
- package/dist/containers/Node/NodeStructure/Pdisk.d.ts +0 -10
- package/dist/containers/Node/NodeStructure/Pdisk.js +0 -125
- package/dist/containers/Node/NodeStructure/Pdisk.js.map +0 -1
- package/dist/store/reducers/node/selectors.d.ts +0 -47
- package/dist/store/reducers/node/selectors.js +0 -43
- package/dist/store/reducers/node/selectors.js.map +0 -1
- package/src/containers/Node/NodeStructure/NodeStructure.scss +0 -155
- package/src/containers/Node/NodeStructure/NodeStructure.tsx +0 -121
- package/src/containers/Node/NodeStructure/PDiskTitleBadge.tsx +0 -18
- package/src/containers/Node/NodeStructure/Pdisk.tsx +0 -274
- package/src/store/reducers/node/selectors.ts +0 -68
|
@@ -190,7 +190,9 @@ function TabletActions(tablet: TTabletStateInfo) {
|
|
|
190
190
|
<ButtonWithConfirmDialog
|
|
191
191
|
buttonView="outlined"
|
|
192
192
|
dialogHeader={i18n('dialog.kill-header')}
|
|
193
|
-
|
|
193
|
+
dialogText={i18n('dialog.kill-text')}
|
|
194
|
+
applyButtonText={i18n('dialog.kill-header')}
|
|
195
|
+
applyButtonView="action"
|
|
194
196
|
onConfirmAction={() => {
|
|
195
197
|
return killTablet({id}).unwrap();
|
|
196
198
|
}}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"Generation": "Generation",
|
|
11
11
|
"Uptime": "Uptime",
|
|
12
12
|
"dialog.kill-header": "Restart tablet",
|
|
13
|
-
"dialog.kill-text": "The tablet will be
|
|
13
|
+
"dialog.kill-text": "The tablet will restart. A portion of table data will be temporarily unavailable. Active transactions and scans will be interrupted with a retriable error and can be retried.",
|
|
14
14
|
"controls.kill-not-allowed": "You don't have enough rights to restart tablet",
|
|
15
15
|
"controls.kill-impossible-follower": "It's impossible to restart a follower",
|
|
16
16
|
"controls.search-placeholder": "Tablet ID",
|
|
@@ -7,6 +7,7 @@ import {healthcheckApi} from '../../../../../store/reducers/healthcheckInfo/heal
|
|
|
7
7
|
import {SelfCheckResult} from '../../../../../types/api/healthcheck';
|
|
8
8
|
import {cn} from '../../../../../utils/cn';
|
|
9
9
|
import {useAutoRefreshInterval} from '../../../../../utils/hooks';
|
|
10
|
+
import {useClusterNameFromQuery} from '../../../../../utils/hooks/useDatabaseFromQuery';
|
|
10
11
|
import {isEnumMember} from '../../../../../utils/typecheckers';
|
|
11
12
|
import {HEALTHCHECK_RESULT_TO_TEXT} from '../../../constants';
|
|
12
13
|
import {useTenantQueryParams} from '../../../useTenantQueryParams';
|
|
@@ -24,6 +25,7 @@ interface HealthcheckPreviewProps {
|
|
|
24
25
|
|
|
25
26
|
export function HealthcheckPreview(props: HealthcheckPreviewProps) {
|
|
26
27
|
const {database} = props;
|
|
28
|
+
const clusterName = useClusterNameFromQuery();
|
|
27
29
|
const [autoRefreshInterval] = useAutoRefreshInterval();
|
|
28
30
|
|
|
29
31
|
const {handleShowHealthcheckChange} = useTenantQueryParams();
|
|
@@ -33,7 +35,7 @@ export function HealthcheckPreview(props: HealthcheckPreviewProps) {
|
|
|
33
35
|
isFetching,
|
|
34
36
|
error,
|
|
35
37
|
} = healthcheckApi.useGetHealthcheckInfoQuery(
|
|
36
|
-
{database},
|
|
38
|
+
{database, clusterName},
|
|
37
39
|
{
|
|
38
40
|
pollingInterval: autoRefreshInterval,
|
|
39
41
|
},
|
|
@@ -311,11 +311,11 @@ export function TenantOverview({
|
|
|
311
311
|
|
|
312
312
|
// Use healthcheck self_check_result as the database status color when available;
|
|
313
313
|
// fall back to tenantinfo.Overall (e.g. for Serverless databases where healthcheck is skipped).
|
|
314
|
-
// Polling is managed by HealthcheckPreview
|
|
314
|
+
// Polling is managed by HealthcheckPreview via the same {database, clusterName} cache key. The database
|
|
315
315
|
// status badge is only rendered when !isV2NavigationEnabled, so skip the query in V2 mode
|
|
316
316
|
// and until tenant info is loaded to avoid spurious requests.
|
|
317
317
|
const {currentData: healthcheckData} = healthcheckApi.useGetHealthcheckInfoQuery(
|
|
318
|
-
{database},
|
|
318
|
+
{database, clusterName},
|
|
319
319
|
{
|
|
320
320
|
skip: shouldSkipHealthcheck({isServerless, isV2NavigationEnabled, tenant}),
|
|
321
321
|
},
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
|
|
3
3
|
import {ResizeableDataTable} from '../../../../../components/ResizeableDataTable/ResizeableDataTable';
|
|
4
|
-
import {
|
|
5
|
-
useCapabilitiesLoaded,
|
|
6
|
-
useStorageGroupsHandlerAvailable,
|
|
7
|
-
} from '../../../../../store/reducers/capabilities/hooks';
|
|
4
|
+
import {useCapabilitiesLoaded} from '../../../../../store/reducers/capabilities/hooks';
|
|
8
5
|
import {storageApi} from '../../../../../store/reducers/storage/storage';
|
|
9
6
|
import type {GroupsRequiredField} from '../../../../../types/api/storage';
|
|
10
7
|
import {
|
|
@@ -45,7 +42,6 @@ interface TopGroupsProps {
|
|
|
45
42
|
|
|
46
43
|
export function TopGroups({tenant, capacityMetricsEnabled}: TopGroupsProps) {
|
|
47
44
|
const capabilitiesLoaded = useCapabilitiesLoaded();
|
|
48
|
-
const groupsHandlerAvailable = useStorageGroupsHandlerAvailable();
|
|
49
45
|
const [autoRefreshInterval] = useAutoRefreshInterval();
|
|
50
46
|
|
|
51
47
|
const {columns, fieldsRequired, sort} = React.useMemo(
|
|
@@ -59,7 +55,6 @@ export function TopGroups({tenant, capacityMetricsEnabled}: TopGroupsProps) {
|
|
|
59
55
|
sort,
|
|
60
56
|
with: 'all',
|
|
61
57
|
limit: TENANT_OVERVIEW_TABLES_LIMIT,
|
|
62
|
-
shouldUseGroupsHandler: groupsHandlerAvailable,
|
|
63
58
|
fieldsRequired,
|
|
64
59
|
},
|
|
65
60
|
{
|
|
@@ -3,7 +3,6 @@ import React from 'react';
|
|
|
3
3
|
import {
|
|
4
4
|
useConfigAvailable,
|
|
5
5
|
useNewStorageViewEnabled,
|
|
6
|
-
useStorageGroupsHandlerAvailable,
|
|
7
6
|
useStorageStatsAvailable,
|
|
8
7
|
useTopicDataAvailable,
|
|
9
8
|
} from '../../../store/reducers/capabilities/hooks';
|
|
@@ -42,10 +41,8 @@ export function useDiagnosticsPages({
|
|
|
42
41
|
|
|
43
42
|
const hasConfigs = useConfigAvailable();
|
|
44
43
|
const newStorageViewEnabled = useNewStorageViewEnabled();
|
|
45
|
-
const storageGroupsAvailable = useStorageGroupsHandlerAvailable();
|
|
46
44
|
const storageStatsAvailable = useStorageStatsAvailable();
|
|
47
|
-
const
|
|
48
|
-
const hasStorageUsage = newStorageViewEnabled && hasStorageUsageCapabilities;
|
|
45
|
+
const hasStorageUsage = newStorageViewEnabled && storageStatsAvailable;
|
|
49
46
|
const hasTopicData = useTopicDataAvailable();
|
|
50
47
|
const isViewerUser = useIsViewerUser();
|
|
51
48
|
const userPermissions = useUserPermissions();
|
|
@@ -7,6 +7,7 @@ import {DrawerWrapper} from '../../../../components/Drawer';
|
|
|
7
7
|
import type {DrawerControl} from '../../../../components/Drawer';
|
|
8
8
|
import {EnableFullscreenButton} from '../../../../components/EnableFullscreenButton/EnableFullscreenButton';
|
|
9
9
|
import type {SelfCheckResult} from '../../../../types/api/healthcheck';
|
|
10
|
+
import {uiFactory} from '../../../../uiFactory/uiFactory';
|
|
10
11
|
import {createAndDownloadJsonFile} from '../../../../utils/downloadFile';
|
|
11
12
|
|
|
12
13
|
import {HealthcheckDrawerTitle} from './HealthcheckDrawerTitle';
|
|
@@ -42,6 +43,20 @@ export function HealthcheckDrawer({
|
|
|
42
43
|
downloadTooltip,
|
|
43
44
|
isDownloadDisabled,
|
|
44
45
|
}: HealthcheckDrawerProps) {
|
|
46
|
+
const renderDrawerExtension = uiFactory.healthcheck.renderDrawerExtension;
|
|
47
|
+
const renderContentWithExtension = React.useCallback(() => {
|
|
48
|
+
if (!renderDrawerExtension) {
|
|
49
|
+
return renderDrawerContent();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<React.Fragment>
|
|
54
|
+
{renderDrawerExtension()}
|
|
55
|
+
{renderDrawerContent()}
|
|
56
|
+
</React.Fragment>
|
|
57
|
+
);
|
|
58
|
+
}, [renderDrawerContent, renderDrawerExtension]);
|
|
59
|
+
|
|
45
60
|
const handleDownload = React.useCallback(
|
|
46
61
|
(event: React.MouseEvent<HTMLButtonElement>) => {
|
|
47
62
|
event.stopPropagation();
|
|
@@ -86,7 +101,7 @@ export function HealthcheckDrawer({
|
|
|
86
101
|
isDrawerVisible={isDrawerVisible}
|
|
87
102
|
onCloseDrawer={onCloseDrawer}
|
|
88
103
|
onTransitionInComplete={onTransitionInComplete}
|
|
89
|
-
renderDrawerContent={
|
|
104
|
+
renderDrawerContent={renderContentWithExtension}
|
|
90
105
|
drawerId={drawerId}
|
|
91
106
|
storageKey={storageKey}
|
|
92
107
|
detectClickOutside
|
package/src/routes.ts
CHANGED
|
@@ -169,7 +169,7 @@ export function getStorageGroupPath(groupId: string | number, query: Query = {})
|
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
export function getDefaultNodePath(
|
|
172
|
-
params: {id: string | number; activeTab?: NodeTab},
|
|
172
|
+
params: {id: string | number; activeTab?: NodeTab; environment?: string},
|
|
173
173
|
query: NodePageQuery = {},
|
|
174
174
|
options?: CreateHrefOptions,
|
|
175
175
|
) {
|
|
@@ -28,12 +28,7 @@ import type {
|
|
|
28
28
|
import type {JsonRenderRequestParams, JsonRenderResponse} from '../../types/api/render';
|
|
29
29
|
import type {DescribeReplicationResult} from '../../types/api/replication';
|
|
30
30
|
import type {TEvDescribeSchemeResult} from '../../types/api/schema';
|
|
31
|
-
import type {
|
|
32
|
-
StorageRequestParams,
|
|
33
|
-
StorageStatsRequestParams,
|
|
34
|
-
StorageStatsResponse,
|
|
35
|
-
TStorageInfo,
|
|
36
|
-
} from '../../types/api/storage';
|
|
31
|
+
import type {StorageStatsRequestParams, StorageStatsResponse} from '../../types/api/storage';
|
|
37
32
|
import type {TEvSystemStateResponse} from '../../types/api/systemState';
|
|
38
33
|
import type {
|
|
39
34
|
TDomainKey,
|
|
@@ -524,25 +519,6 @@ export class ViewerAPI extends BaseYdbAPI {
|
|
|
524
519
|
);
|
|
525
520
|
}
|
|
526
521
|
|
|
527
|
-
getStorageInfo(
|
|
528
|
-
{database, nodeId, groupId, pDiskId, filter, ...params}: StorageRequestParams,
|
|
529
|
-
{concurrentId, signal}: AxiosOptions = {},
|
|
530
|
-
) {
|
|
531
|
-
return this.get<TStorageInfo>(
|
|
532
|
-
this.getPath(`/viewer/json/storage?enums=true`),
|
|
533
|
-
{
|
|
534
|
-
database,
|
|
535
|
-
node_id: nodeId,
|
|
536
|
-
group_id: groupId,
|
|
537
|
-
pdisk_id: pDiskId,
|
|
538
|
-
// Do not send empty string
|
|
539
|
-
filter: filter || undefined,
|
|
540
|
-
...params,
|
|
541
|
-
},
|
|
542
|
-
{concurrentId, requestConfig: {signal}},
|
|
543
|
-
);
|
|
544
|
-
}
|
|
545
|
-
|
|
546
522
|
getStorageStats(
|
|
547
523
|
{
|
|
548
524
|
database,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type {BaseQueryFn} from '@reduxjs/toolkit/query';
|
|
2
2
|
import {createApi} from '@reduxjs/toolkit/query/react';
|
|
3
3
|
|
|
4
|
+
import {CLUSTER_DATA_TAG, DATABASE_DATA_TAG} from './entityDataTags';
|
|
5
|
+
|
|
4
6
|
export const api = createApi({
|
|
5
7
|
baseQuery: fakeBaseQuery(),
|
|
6
8
|
/**
|
|
@@ -27,6 +29,8 @@ export const api = createApi({
|
|
|
27
29
|
'Backups',
|
|
28
30
|
'BackupsSchedule',
|
|
29
31
|
'OperationList',
|
|
32
|
+
DATABASE_DATA_TAG,
|
|
33
|
+
CLUSTER_DATA_TAG,
|
|
30
34
|
],
|
|
31
35
|
});
|
|
32
36
|
|
|
@@ -81,10 +81,6 @@ export const useTracingLevelOptionAvailable = () => {
|
|
|
81
81
|
return useGetFeatureVersion('/viewer/query') > 2;
|
|
82
82
|
};
|
|
83
83
|
|
|
84
|
-
export const useStorageGroupsHandlerAvailable = () => {
|
|
85
|
-
return useGetFeatureVersion('/storage/groups') > 2;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
84
|
export const useStorageStatsAvailable = () => {
|
|
89
85
|
return useGetFeatureVersion('/viewer/storage_stats') > 0;
|
|
90
86
|
};
|
|
@@ -13,6 +13,7 @@ import {useIsViewerUser} from '../../../utils/hooks/useIsUserAllowedToMakeChange
|
|
|
13
13
|
import {isQueryErrorResponse} from '../../../utils/query';
|
|
14
14
|
import type {RootState} from '../../defaultStore';
|
|
15
15
|
import {api} from '../api';
|
|
16
|
+
import {getClusterDataTag} from '../entityDataTags';
|
|
16
17
|
import {selectNodesMap} from '../nodesList';
|
|
17
18
|
|
|
18
19
|
import {
|
|
@@ -117,7 +118,7 @@ export const clusterApi = api.injectEndpoints({
|
|
|
117
118
|
return {error};
|
|
118
119
|
}
|
|
119
120
|
},
|
|
120
|
-
providesTags: ['All'],
|
|
121
|
+
providesTags: (_result, _error, clusterName) => ['All', getClusterDataTag(clusterName)],
|
|
121
122
|
}),
|
|
122
123
|
getClusterBaseInfo: builder.query({
|
|
123
124
|
queryFn: async (clusterName: string, {signal}) => {
|
|
@@ -131,7 +132,7 @@ export const clusterApi = api.injectEndpoints({
|
|
|
131
132
|
return {error};
|
|
132
133
|
}
|
|
133
134
|
},
|
|
134
|
-
providesTags: ['All'],
|
|
135
|
+
providesTags: (_result, _error, clusterName) => ['All', getClusterDataTag(clusterName)],
|
|
135
136
|
}),
|
|
136
137
|
}),
|
|
137
138
|
overrideExisting: 'throw',
|
|
@@ -2,6 +2,7 @@ import {createSlice} from '@reduxjs/toolkit';
|
|
|
2
2
|
import type {PayloadAction} from '@reduxjs/toolkit';
|
|
3
3
|
|
|
4
4
|
import {api} from '../api';
|
|
5
|
+
import {CLUSTER_DATA_LIST_TAG} from '../entityDataTags';
|
|
5
6
|
|
|
6
7
|
import type {ClustersFilters} from './types';
|
|
7
8
|
import {prepareClustersData} from './utils';
|
|
@@ -43,7 +44,7 @@ export const clustersApi = api.injectEndpoints({
|
|
|
43
44
|
return {error};
|
|
44
45
|
}
|
|
45
46
|
},
|
|
46
|
-
providesTags: ['All'],
|
|
47
|
+
providesTags: ['All', CLUSTER_DATA_LIST_TAG],
|
|
47
48
|
}),
|
|
48
49
|
}),
|
|
49
50
|
overrideExisting: 'throw',
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const DATABASE_DATA_TAG = 'DatabaseData';
|
|
2
|
+
export const CLUSTER_DATA_TAG = 'ClusterData';
|
|
3
|
+
|
|
4
|
+
const ENTITY_DATA_LIST_TAG_ID = 'LIST';
|
|
5
|
+
|
|
6
|
+
export const DATABASE_DATA_LIST_TAG = {
|
|
7
|
+
type: DATABASE_DATA_TAG,
|
|
8
|
+
id: ENTITY_DATA_LIST_TAG_ID,
|
|
9
|
+
} as const;
|
|
10
|
+
|
|
11
|
+
export const CLUSTER_DATA_LIST_TAG = {
|
|
12
|
+
type: CLUSTER_DATA_TAG,
|
|
13
|
+
id: ENTITY_DATA_LIST_TAG_ID,
|
|
14
|
+
} as const;
|
|
15
|
+
|
|
16
|
+
export function getDatabaseDataTag({
|
|
17
|
+
clusterName,
|
|
18
|
+
database,
|
|
19
|
+
}: {
|
|
20
|
+
clusterName?: string;
|
|
21
|
+
database: string;
|
|
22
|
+
}) {
|
|
23
|
+
return {
|
|
24
|
+
type: DATABASE_DATA_TAG,
|
|
25
|
+
id: JSON.stringify([clusterName ?? null, database]),
|
|
26
|
+
} as const;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getClusterDataTag(clusterName?: string) {
|
|
30
|
+
return {
|
|
31
|
+
type: CLUSTER_DATA_TAG,
|
|
32
|
+
id: JSON.stringify(clusterName ?? null),
|
|
33
|
+
} as const;
|
|
34
|
+
}
|
|
@@ -15,17 +15,6 @@ export const nodeApi = api.injectEndpoints({
|
|
|
15
15
|
},
|
|
16
16
|
providesTags: ['All'],
|
|
17
17
|
}),
|
|
18
|
-
getNodeStructure: build.query({
|
|
19
|
-
queryFn: async ({nodeId}: {nodeId: string}, {signal}) => {
|
|
20
|
-
try {
|
|
21
|
-
const data = await window.api.viewer.getStorageInfo({nodeId}, {signal});
|
|
22
|
-
return {data};
|
|
23
|
-
} catch (error) {
|
|
24
|
-
return {error};
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
providesTags: ['All'],
|
|
28
|
-
}),
|
|
29
18
|
}),
|
|
30
19
|
overrideExisting: 'throw',
|
|
31
20
|
});
|
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
import type {PreparedPDisk, PreparedVDisk} from '../../../utils/disks/types';
|
|
2
1
|
import type {PreparedNodeSystemState} from '../../../utils/nodes';
|
|
3
2
|
|
|
4
|
-
interface RawStructurePDisk extends PreparedPDisk {
|
|
5
|
-
vDisks: Record<string, PreparedVDisk>;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export type RawNodeStructure = Record<string, RawStructurePDisk>;
|
|
9
|
-
|
|
10
|
-
export interface PreparedStructureVDisk extends PreparedVDisk {
|
|
11
|
-
id: string;
|
|
12
|
-
order: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface PreparedStructurePDisk extends PreparedPDisk {
|
|
16
|
-
vDisks: PreparedStructureVDisk[];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export type PreparedNodeStructure = Record<string, PreparedStructurePDisk>;
|
|
20
|
-
|
|
21
3
|
export interface PreparedNode extends Partial<PreparedNodeSystemState> {}
|
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
import type {AxiosOptions} from '../../../services/api/base';
|
|
2
|
-
import type {GroupsRequestParams
|
|
2
|
+
import type {GroupsRequestParams} from '../../../types/api/storage';
|
|
3
3
|
|
|
4
|
-
import {prepareGroupsResponse
|
|
4
|
+
import {prepareGroupsResponse} from './utils';
|
|
5
5
|
|
|
6
|
-
export async function requestStorageData(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
shouldUseGroupsHandler,
|
|
10
|
-
...params
|
|
11
|
-
}: StorageRequestParams & GroupsRequestParams & {shouldUseGroupsHandler?: boolean},
|
|
12
|
-
options?: AxiosOptions,
|
|
13
|
-
) {
|
|
14
|
-
if (shouldUseGroupsHandler && version !== 'v1') {
|
|
15
|
-
const result = await window.api.storage.getStorageGroups({...params}, options);
|
|
16
|
-
return prepareGroupsResponse(result);
|
|
17
|
-
} else {
|
|
18
|
-
const result = await window.api.viewer.getStorageInfo({version, ...params}, options);
|
|
19
|
-
return prepareStorageResponse(result);
|
|
20
|
-
}
|
|
6
|
+
export async function requestStorageData(params: GroupsRequestParams, options?: AxiosOptions) {
|
|
7
|
+
const result = await window.api.storage.getStorageGroups(params, options);
|
|
8
|
+
return prepareGroupsResponse(result);
|
|
21
9
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type {NodesRequestParams} from '../../../types/api/nodes';
|
|
2
|
-
import type {GroupsRequestParams
|
|
2
|
+
import type {GroupsRequestParams} from '../../../types/api/storage';
|
|
3
3
|
import {api} from '../api';
|
|
4
4
|
|
|
5
5
|
import {requestStorageData} from './requestStorageData';
|
|
@@ -22,11 +22,7 @@ export const storageApi = api.injectEndpoints({
|
|
|
22
22
|
providesTags: ['All', 'StorageData'],
|
|
23
23
|
}),
|
|
24
24
|
getStorageGroupsInfo: builder.query({
|
|
25
|
-
queryFn: async (
|
|
26
|
-
params: StorageRequestParams &
|
|
27
|
-
GroupsRequestParams & {shouldUseGroupsHandler?: boolean},
|
|
28
|
-
{signal},
|
|
29
|
-
) => {
|
|
25
|
+
queryFn: async (params: GroupsRequestParams, {signal}) => {
|
|
30
26
|
try {
|
|
31
27
|
const result = await requestStorageData(params, {signal});
|
|
32
28
|
return {data: result};
|
|
@@ -83,16 +83,7 @@ export interface PreparedStorageGroup {
|
|
|
83
83
|
VDisks?: PreparedVDisk[];
|
|
84
84
|
|
|
85
85
|
Kind?: string;
|
|
86
|
-
ChangeTime?: number | string;
|
|
87
86
|
GroupGeneration?: string;
|
|
88
|
-
Latency?: EFlag;
|
|
89
|
-
AcquiredUnits?: string;
|
|
90
|
-
AcquiredIOPS?: number;
|
|
91
|
-
AcquiredThroughput?: string;
|
|
92
|
-
AcquiredSize?: string;
|
|
93
|
-
MaximumIOPS?: number;
|
|
94
|
-
MaximumThroughput?: string;
|
|
95
|
-
MaximumSize?: string;
|
|
96
87
|
|
|
97
88
|
AllocationUnits?: string | number;
|
|
98
89
|
GroupSizeInUnits?: number;
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
import type {EFlag} from '../../../types/api/enums';
|
|
2
2
|
import type {TNodeInfo, TNodesInfo} from '../../../types/api/nodes';
|
|
3
3
|
import {TPDiskState} from '../../../types/api/pdisk';
|
|
4
|
-
import type {
|
|
5
|
-
StorageGroupsResponse,
|
|
6
|
-
TGroupsStorageGroupInfo,
|
|
7
|
-
TStorageGroupInfo,
|
|
8
|
-
TStorageGroupInfoV2,
|
|
9
|
-
TStorageInfo,
|
|
10
|
-
TStoragePoolInfo,
|
|
11
|
-
} from '../../../types/api/storage';
|
|
12
|
-
import {EVDiskState} from '../../../types/api/vdisk';
|
|
13
|
-
import type {TVDiskStateInfo} from '../../../types/api/vdisk';
|
|
4
|
+
import type {StorageGroupsResponse, TGroupsStorageGroupInfo} from '../../../types/api/storage';
|
|
14
5
|
import {
|
|
15
6
|
getColorSeverity,
|
|
16
7
|
getDataSeverityColor,
|
|
@@ -21,7 +12,6 @@ import {
|
|
|
21
12
|
prepareWhiteboardVDiskData,
|
|
22
13
|
} from '../../../utils/disks/prepareDisks';
|
|
23
14
|
import {prepareNodeSystemState} from '../../../utils/nodes';
|
|
24
|
-
import {getUsage} from '../../../utils/storage';
|
|
25
15
|
import {parseUsToMs} from '../../../utils/timeParsers';
|
|
26
16
|
import {parseOptionalNonNegativeNumber} from '../../../utils/utils';
|
|
27
17
|
|
|
@@ -47,7 +37,7 @@ const normalizeMaxPercent = (value: number | string | null | undefined): number
|
|
|
47
37
|
|
|
48
38
|
// ==== Prepare groups ====
|
|
49
39
|
|
|
50
|
-
function getGroupDiskSpaceStatus(group:
|
|
40
|
+
function getGroupDiskSpaceStatus(group: TGroupsStorageGroupInfo): EFlag {
|
|
51
41
|
const {DiskSpace, VDisks = []} = group;
|
|
52
42
|
|
|
53
43
|
if (DiskSpace) {
|
|
@@ -61,157 +51,6 @@ function getGroupDiskSpaceStatus(group: TStorageGroupInfo | TGroupsStorageGroupI
|
|
|
61
51
|
return getDataSeverityColor(maxSeverity);
|
|
62
52
|
}
|
|
63
53
|
|
|
64
|
-
const prepareVDisk = (vDisk: TVDiskStateInfo, poolName: string | undefined) => {
|
|
65
|
-
const preparedVDisk = prepareWhiteboardVDiskData(vDisk);
|
|
66
|
-
|
|
67
|
-
// VDisk doesn't have its own StoragePoolName when located inside StoragePool data
|
|
68
|
-
return {
|
|
69
|
-
...preparedVDisk,
|
|
70
|
-
StoragePoolName: poolName,
|
|
71
|
-
Donors: preparedVDisk?.Donors?.map((donor) => ({
|
|
72
|
-
...donor,
|
|
73
|
-
StoragePoolName: poolName,
|
|
74
|
-
})),
|
|
75
|
-
};
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const prepareStorageGroupData = (
|
|
79
|
-
group: TStorageGroupInfo,
|
|
80
|
-
pool: TStoragePoolInfo,
|
|
81
|
-
): PreparedStorageGroup => {
|
|
82
|
-
let missing = 0;
|
|
83
|
-
let usedSpaceBytes = 0;
|
|
84
|
-
let limitSizeBytes = 0;
|
|
85
|
-
let readSpeedBytesPerSec = 0;
|
|
86
|
-
let writeSpeedBytesPerSec = 0;
|
|
87
|
-
let mediaType: string | undefined;
|
|
88
|
-
|
|
89
|
-
const {Name: poolName, MediaType: poolMediaType} = pool;
|
|
90
|
-
|
|
91
|
-
if (group.VDisks) {
|
|
92
|
-
for (const vDisk of group.VDisks) {
|
|
93
|
-
const {
|
|
94
|
-
Replicated,
|
|
95
|
-
VDiskState,
|
|
96
|
-
AvailableSize,
|
|
97
|
-
AllocatedSize,
|
|
98
|
-
PDisk,
|
|
99
|
-
ReadThroughput,
|
|
100
|
-
WriteThroughput,
|
|
101
|
-
} = vDisk;
|
|
102
|
-
|
|
103
|
-
const {
|
|
104
|
-
Type: PDiskType,
|
|
105
|
-
State: PDiskState,
|
|
106
|
-
AvailableSize: PDiskAvailableSize,
|
|
107
|
-
} = prepareWhiteboardPDiskData(PDisk);
|
|
108
|
-
|
|
109
|
-
if (
|
|
110
|
-
Replicated === false ||
|
|
111
|
-
PDiskState !== TPDiskState.Normal ||
|
|
112
|
-
VDiskState !== EVDiskState.OK
|
|
113
|
-
) {
|
|
114
|
-
missing += 1;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const available = Number(AvailableSize ?? PDiskAvailableSize) || 0;
|
|
118
|
-
const allocated = Number(AllocatedSize) || 0;
|
|
119
|
-
|
|
120
|
-
usedSpaceBytes += allocated;
|
|
121
|
-
limitSizeBytes += available + allocated;
|
|
122
|
-
|
|
123
|
-
readSpeedBytesPerSec += Number(ReadThroughput) || 0;
|
|
124
|
-
writeSpeedBytesPerSec += Number(WriteThroughput) || 0;
|
|
125
|
-
|
|
126
|
-
mediaType = PDiskType && (PDiskType === mediaType || !mediaType) ? PDiskType : 'Mixed';
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const vDisks = group.VDisks?.map((vdisk) => prepareVDisk(vdisk, poolName));
|
|
131
|
-
|
|
132
|
-
// Do not calculate usage if there is no limit
|
|
133
|
-
const usage = limitSizeBytes
|
|
134
|
-
? getUsage({Used: usedSpaceBytes, Limit: limitSizeBytes}, 5)
|
|
135
|
-
: undefined;
|
|
136
|
-
|
|
137
|
-
const diskSpaceStatus = getGroupDiskSpaceStatus(group);
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
...group,
|
|
141
|
-
GroupGeneration: group.GroupGeneration ? String(group.GroupGeneration) : undefined,
|
|
142
|
-
GroupId: group.GroupID,
|
|
143
|
-
Overall: group.Overall,
|
|
144
|
-
VDisks: vDisks,
|
|
145
|
-
Usage: usage,
|
|
146
|
-
Read: readSpeedBytesPerSec,
|
|
147
|
-
Write: writeSpeedBytesPerSec,
|
|
148
|
-
PoolName: poolName,
|
|
149
|
-
Used: usedSpaceBytes,
|
|
150
|
-
Limit: limitSizeBytes,
|
|
151
|
-
Degraded: missing,
|
|
152
|
-
MediaType: poolMediaType || mediaType || undefined,
|
|
153
|
-
DiskSpace: diskSpaceStatus,
|
|
154
|
-
};
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const prepareStorageGroupDataV2 = (group: TStorageGroupInfoV2): PreparedStorageGroup => {
|
|
158
|
-
const {
|
|
159
|
-
VDisks = [],
|
|
160
|
-
PoolName,
|
|
161
|
-
Usage = 0,
|
|
162
|
-
Read = 0,
|
|
163
|
-
Write = 0,
|
|
164
|
-
Used = 0,
|
|
165
|
-
Limit = 0,
|
|
166
|
-
Degraded = 0,
|
|
167
|
-
Kind,
|
|
168
|
-
MediaType,
|
|
169
|
-
GroupID,
|
|
170
|
-
Overall,
|
|
171
|
-
GroupGeneration,
|
|
172
|
-
} = group;
|
|
173
|
-
|
|
174
|
-
const vDisks = VDisks.map((vdisk) => prepareVDisk(vdisk, PoolName));
|
|
175
|
-
const usage = Number(Usage) * 100;
|
|
176
|
-
|
|
177
|
-
const diskSpaceStatus = getGroupDiskSpaceStatus(group);
|
|
178
|
-
|
|
179
|
-
return {
|
|
180
|
-
...group,
|
|
181
|
-
PoolName,
|
|
182
|
-
GroupId: GroupID,
|
|
183
|
-
MediaType: MediaType || Kind,
|
|
184
|
-
VDisks: vDisks,
|
|
185
|
-
Usage: usage,
|
|
186
|
-
Overall,
|
|
187
|
-
GroupGeneration: GroupGeneration ? String(GroupGeneration) : undefined,
|
|
188
|
-
Read: Number(Read),
|
|
189
|
-
Write: Number(Write),
|
|
190
|
-
Used: Number(Used),
|
|
191
|
-
Limit: Number(Limit),
|
|
192
|
-
Degraded: Number(Degraded),
|
|
193
|
-
DiskSpace: diskSpaceStatus,
|
|
194
|
-
};
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
const prepareStorageGroups = (
|
|
198
|
-
StorageGroups?: TStorageGroupInfoV2[],
|
|
199
|
-
StoragePools?: TStoragePoolInfo[],
|
|
200
|
-
) => {
|
|
201
|
-
let preparedGroups: PreparedStorageGroup[] = [];
|
|
202
|
-
if (StorageGroups) {
|
|
203
|
-
preparedGroups = StorageGroups.map(prepareStorageGroupDataV2);
|
|
204
|
-
} else {
|
|
205
|
-
StoragePools?.forEach((pool) => {
|
|
206
|
-
pool.Groups?.forEach((group) => {
|
|
207
|
-
preparedGroups.push(prepareStorageGroupData(group, pool));
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
return preparedGroups;
|
|
213
|
-
};
|
|
214
|
-
|
|
215
54
|
// ==== Prepare nodes ====
|
|
216
55
|
|
|
217
56
|
const prepareStorageNodeData = (
|
|
@@ -237,10 +76,10 @@ const prepareStorageNodeData = (
|
|
|
237
76
|
}).length || 0;
|
|
238
77
|
|
|
239
78
|
const pDisks = PDisks?.map((pDisk) => {
|
|
240
|
-
return {
|
|
241
|
-
...
|
|
79
|
+
return prepareWhiteboardPDiskData({
|
|
80
|
+
...pDisk,
|
|
242
81
|
NodeId,
|
|
243
|
-
};
|
|
82
|
+
});
|
|
244
83
|
});
|
|
245
84
|
const vDisks = VDisks?.map((vDisk) => {
|
|
246
85
|
return {
|
|
@@ -361,18 +200,6 @@ export const prepareStorageNodesResponse = (data: TNodesInfo): PreparedStorageRe
|
|
|
361
200
|
};
|
|
362
201
|
};
|
|
363
202
|
|
|
364
|
-
export const prepareStorageResponse = (data: TStorageInfo): PreparedStorageResponse => {
|
|
365
|
-
const {StoragePools, StorageGroups, TotalGroups, FoundGroups} = data;
|
|
366
|
-
|
|
367
|
-
const preparedGroups = prepareStorageGroups(StorageGroups, StoragePools);
|
|
368
|
-
|
|
369
|
-
return {
|
|
370
|
-
groups: preparedGroups,
|
|
371
|
-
total: Number(TotalGroups) || preparedGroups.length,
|
|
372
|
-
found: Number(FoundGroups),
|
|
373
|
-
};
|
|
374
|
-
};
|
|
375
|
-
|
|
376
203
|
export function prepareGroupsResponse(data: StorageGroupsResponse): PreparedStorageResponse {
|
|
377
204
|
const {FoundGroups, TotalGroups, StorageGroups = [], StorageGroupGroups} = data;
|
|
378
205
|
const preparedGroups: PreparedStorageGroup[] = StorageGroups.map((group) => {
|
|
@@ -5,6 +5,7 @@ import type {TTenantInfo} from '../../../types/api/tenant';
|
|
|
5
5
|
import {useClusterNameFromQuery} from '../../../utils/hooks/useDatabaseFromQuery';
|
|
6
6
|
import {useDatabasesV2} from '../../../utils/hooks/useDatabasesV2';
|
|
7
7
|
import {api} from '../api';
|
|
8
|
+
import {getDatabaseDataTag} from '../entityDataTags';
|
|
8
9
|
import {prepareTenants} from '../tenants/utils';
|
|
9
10
|
|
|
10
11
|
import {TENANT_DIAGNOSTICS_TABS_IDS, TENANT_METRICS_TABS_IDS} from './constants';
|
|
@@ -90,7 +91,22 @@ export const tenantApi = api.injectEndpoints({
|
|
|
90
91
|
return {error};
|
|
91
92
|
}
|
|
92
93
|
},
|
|
93
|
-
providesTags:
|
|
94
|
+
providesTags: (result, _error, {clusterName, database}) => {
|
|
95
|
+
const databaseAliases = new Set([database]);
|
|
96
|
+
if (result?.Id) {
|
|
97
|
+
databaseAliases.add(result.Id);
|
|
98
|
+
}
|
|
99
|
+
if (result?.Name) {
|
|
100
|
+
databaseAliases.add(result.Name);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return [
|
|
104
|
+
'All' as const,
|
|
105
|
+
...Array.from(databaseAliases, (databaseAlias) =>
|
|
106
|
+
getDatabaseDataTag({clusterName, database: databaseAlias}),
|
|
107
|
+
),
|
|
108
|
+
];
|
|
109
|
+
},
|
|
94
110
|
serializeQueryArgs: ({queryArgs}) => {
|
|
95
111
|
const {clusterName, database} = queryArgs;
|
|
96
112
|
return {clusterName, database};
|