ydb-embedded-ui 4.16.0 → 4.16.2
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/CHANGELOG.md +15 -0
- package/dist/components/BasicNodeViewer/BasicNodeViewer.tsx +5 -5
- package/dist/components/NodeHostWrapper/NodeHostWrapper.tsx +2 -1
- package/dist/containers/Cluster/Cluster.tsx +5 -5
- package/dist/containers/Node/Node.tsx +6 -4
- package/dist/containers/Node/NodeStructure/NodeStructure.tsx +7 -5
- package/dist/containers/Node/NodeStructure/Pdisk.tsx +2 -2
- package/dist/containers/Nodes/Nodes.tsx +5 -4
- package/dist/containers/Nodes/getNodesColumns.tsx +3 -1
- package/dist/containers/Storage/Storage.tsx +5 -4
- package/dist/containers/Storage/StorageNodes/StorageNodes.tsx +4 -4
- package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.tsx +4 -3
- package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +5 -4
- package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +5 -4
- package/dist/containers/Tenant/ObjectGeneral/ObjectGeneral.tsx +6 -5
- package/dist/containers/Tenant/Tenant.tsx +5 -4
- package/dist/containers/Tenant/utils/queryTemplates.ts +23 -23
- package/dist/containers/Tenants/Tenants.tsx +1 -3
- package/dist/types/additionalProps.ts +8 -1
- package/dist/utils/nodes.ts +0 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [4.16.2](https://github.com/ydb-platform/ydb-embedded-ui/compare/v4.16.1...v4.16.2) (2023-08-28)
|
4
|
+
|
5
|
+
|
6
|
+
### Bug Fixes
|
7
|
+
|
8
|
+
* fix topic templates ([#524](https://github.com/ydb-platform/ydb-embedded-ui/issues/524)) ([f593b57](https://github.com/ydb-platform/ydb-embedded-ui/commit/f593b575fb64d0c69b56e743fd4cd6faba1e9d0e))
|
9
|
+
* rename additionalInfo params to additionalProps ([#525](https://github.com/ydb-platform/ydb-embedded-ui/issues/525)) ([dd2b040](https://github.com/ydb-platform/ydb-embedded-ui/commit/dd2b04039cd80072fe11744f3490c176fe21b16b))
|
10
|
+
|
11
|
+
## [4.16.1](https://github.com/ydb-platform/ydb-embedded-ui/compare/v4.16.0...v4.16.1) (2023-08-25)
|
12
|
+
|
13
|
+
|
14
|
+
### Bug Fixes
|
15
|
+
|
16
|
+
* fix types for external props ([#522](https://github.com/ydb-platform/ydb-embedded-ui/issues/522)) ([173081f](https://github.com/ydb-platform/ydb-embedded-ui/commit/173081f2f0d2814b2311757988d91fbffc2a509f))
|
17
|
+
|
3
18
|
## [4.16.0](https://github.com/ydb-platform/ydb-embedded-ui/compare/v4.15.1...v4.16.0) (2023-08-25)
|
4
19
|
|
5
20
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import cn from 'bem-cn-lite';
|
2
2
|
|
3
3
|
import type {TSystemStateInfo} from '../../types/api/nodes';
|
4
|
-
import type {
|
4
|
+
import type {AdditionalNodesProps} from '../../types/additionalProps';
|
5
5
|
|
6
6
|
import EntityStatus from '../EntityStatus/EntityStatus';
|
7
7
|
import {Tags} from '../Tags';
|
@@ -13,13 +13,13 @@ const b = cn('basic-node-viewer');
|
|
13
13
|
|
14
14
|
interface BasicNodeViewerProps {
|
15
15
|
node: TSystemStateInfo;
|
16
|
-
|
16
|
+
additionalNodesProps?: AdditionalNodesProps;
|
17
17
|
className?: string;
|
18
18
|
}
|
19
19
|
|
20
|
-
export const BasicNodeViewer = ({node,
|
21
|
-
const nodeHref =
|
22
|
-
?
|
20
|
+
export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNodeViewerProps) => {
|
21
|
+
const nodeHref = additionalNodesProps?.getNodeRef
|
22
|
+
? additionalNodesProps.getNodeRef(node) + 'internal'
|
23
23
|
: undefined;
|
24
24
|
|
25
25
|
return (
|
@@ -3,8 +3,9 @@ import block from 'bem-cn-lite';
|
|
3
3
|
import {Button, Popover, PopoverBehavior} from '@gravity-ui/uikit';
|
4
4
|
|
5
5
|
import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
|
6
|
+
import type {NodeAddress} from '../../types/additionalProps';
|
6
7
|
import {getDefaultNodePath} from '../../containers/Node/NodePages';
|
7
|
-
import {isUnavailableNode
|
8
|
+
import {isUnavailableNode} from '../../utils/nodes';
|
8
9
|
|
9
10
|
import EntityStatus from '../EntityStatus/EntityStatus';
|
10
11
|
import {NodeEndpointsTooltipContent} from '../TooltipsContent';
|
@@ -10,8 +10,8 @@ import type {
|
|
10
10
|
AdditionalClusterProps,
|
11
11
|
AdditionalTenantsProps,
|
12
12
|
AdditionalVersionsProps,
|
13
|
+
AdditionalNodesProps,
|
13
14
|
} from '../../types/additionalProps';
|
14
|
-
import type {AdditionalNodesInfo} from '../../utils/nodes';
|
15
15
|
import routes from '../../routes';
|
16
16
|
|
17
17
|
import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
|
@@ -35,7 +35,7 @@ const b = cn('cluster');
|
|
35
35
|
|
36
36
|
interface ClusterProps {
|
37
37
|
additionalTenantsProps?: AdditionalTenantsProps;
|
38
|
-
|
38
|
+
additionalNodesProps?: AdditionalNodesProps;
|
39
39
|
additionalClusterProps?: AdditionalClusterProps;
|
40
40
|
additionalVersionsProps?: AdditionalVersionsProps;
|
41
41
|
}
|
@@ -43,7 +43,7 @@ interface ClusterProps {
|
|
43
43
|
function Cluster({
|
44
44
|
additionalClusterProps,
|
45
45
|
additionalTenantsProps,
|
46
|
-
|
46
|
+
additionalNodesProps,
|
47
47
|
additionalVersionsProps,
|
48
48
|
}: ClusterProps) {
|
49
49
|
const dispatch = useDispatch();
|
@@ -104,10 +104,10 @@ function Cluster({
|
|
104
104
|
return <Tenants additionalTenantsProps={additionalTenantsProps} />;
|
105
105
|
}
|
106
106
|
case clusterTabsIds.nodes: {
|
107
|
-
return <Nodes
|
107
|
+
return <Nodes additionalNodesProps={additionalNodesProps} />;
|
108
108
|
}
|
109
109
|
case clusterTabsIds.storage: {
|
110
|
-
return <Storage
|
110
|
+
return <Storage additionalNodesProps={additionalNodesProps} />;
|
111
111
|
}
|
112
112
|
case clusterTabsIds.versions: {
|
113
113
|
return <Versions versionToColor={versionToColor} />;
|
@@ -21,6 +21,8 @@ import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
|
|
21
21
|
import {AutoFetcher} from '../../utils/autofetcher';
|
22
22
|
import {useTypedSelector} from '../../utils/hooks';
|
23
23
|
|
24
|
+
import type {AdditionalNodesProps} from '../../types/additionalProps';
|
25
|
+
|
24
26
|
import {clusterTabsIds} from '../Cluster/utils';
|
25
27
|
|
26
28
|
import './Node.scss';
|
@@ -32,7 +34,7 @@ export const STORAGE_ROLE = 'Storage';
|
|
32
34
|
const autofetcher = new AutoFetcher();
|
33
35
|
|
34
36
|
interface NodeProps {
|
35
|
-
|
37
|
+
additionalNodesProps?: AdditionalNodesProps;
|
36
38
|
className?: string;
|
37
39
|
}
|
38
40
|
|
@@ -113,7 +115,7 @@ function Node(props: NodeProps) {
|
|
113
115
|
);
|
114
116
|
};
|
115
117
|
const renderTabContent = () => {
|
116
|
-
const {
|
118
|
+
const {additionalNodesProps} = props;
|
117
119
|
|
118
120
|
switch (activeTab) {
|
119
121
|
case STORAGE: {
|
@@ -136,7 +138,7 @@ function Node(props: NodeProps) {
|
|
136
138
|
<NodeStructure
|
137
139
|
className={b('node-page-wrapper')}
|
138
140
|
nodeId={nodeId}
|
139
|
-
|
141
|
+
additionalNodesProps={additionalNodesProps}
|
140
142
|
/>
|
141
143
|
);
|
142
144
|
}
|
@@ -155,7 +157,7 @@ function Node(props: NodeProps) {
|
|
155
157
|
<div className={b(null, props.className)}>
|
156
158
|
<BasicNodeViewer
|
157
159
|
node={node}
|
158
|
-
|
160
|
+
additionalNodesProps={props.additionalNodesProps}
|
159
161
|
className={b('header')}
|
160
162
|
/>
|
161
163
|
|
@@ -13,6 +13,8 @@ import {selectNodeStructure} from '../../../store/reducers/node/selectors';
|
|
13
13
|
import {AutoFetcher} from '../../../utils/autofetcher';
|
14
14
|
import {useTypedSelector} from '../../../utils/hooks';
|
15
15
|
|
16
|
+
import type {AdditionalNodesProps} from '../../../types/additionalProps';
|
17
|
+
|
16
18
|
import {PDisk} from './Pdisk';
|
17
19
|
|
18
20
|
import './NodeStructure.scss';
|
@@ -30,12 +32,12 @@ function generateId({type, id}: {type: 'pdisk' | 'vdisk'; id: string}) {
|
|
30
32
|
interface NodeStructureProps {
|
31
33
|
nodeId: string;
|
32
34
|
className?: string;
|
33
|
-
|
35
|
+
additionalNodesProps?: AdditionalNodesProps;
|
34
36
|
}
|
35
37
|
|
36
38
|
const autofetcher = new AutoFetcher();
|
37
39
|
|
38
|
-
function NodeStructure({nodeId, className,
|
40
|
+
function NodeStructure({nodeId, className, additionalNodesProps}: NodeStructureProps) {
|
39
41
|
const dispatch = useDispatch();
|
40
42
|
|
41
43
|
const nodeStructure = useTypedSelector(selectNodeStructure);
|
@@ -44,10 +46,10 @@ function NodeStructure({nodeId, className, additionalNodesInfo}: NodeStructurePr
|
|
44
46
|
const nodeData = useTypedSelector((state) => state.node?.data?.SystemStateInfo?.[0]);
|
45
47
|
|
46
48
|
const nodeHref = useMemo(() => {
|
47
|
-
return
|
48
|
-
?
|
49
|
+
return additionalNodesProps?.getNodeRef
|
50
|
+
? additionalNodesProps.getNodeRef(nodeData)
|
49
51
|
: undefined;
|
50
|
-
}, [nodeData,
|
52
|
+
}, [nodeData, additionalNodesProps]);
|
51
53
|
|
52
54
|
const {pdiskId: pdiskIdFromUrl, vdiskId: vdiskIdFromUrl} = url.parse(
|
53
55
|
window.location.href,
|
@@ -27,7 +27,7 @@ interface PDiskProps {
|
|
27
27
|
unfolded?: boolean;
|
28
28
|
id: string;
|
29
29
|
selectedVdiskId?: string;
|
30
|
-
nodeHref?: string;
|
30
|
+
nodeHref?: string | null;
|
31
31
|
}
|
32
32
|
|
33
33
|
enum VDiskTableColumnsIds {
|
@@ -62,7 +62,7 @@ function getColumns({
|
|
62
62
|
}: {
|
63
63
|
pDiskId: number;
|
64
64
|
selectedVdiskId?: string;
|
65
|
-
nodeHref?: string;
|
65
|
+
nodeHref?: string | null;
|
66
66
|
}) {
|
67
67
|
const columns: Column<RowType>[] = [
|
68
68
|
{
|
@@ -26,7 +26,7 @@ import {
|
|
26
26
|
useNodesRequestParams,
|
27
27
|
useTableSort,
|
28
28
|
} from '../../utils/hooks';
|
29
|
-
import {
|
29
|
+
import {isUnavailableNode, NodesUptimeFilterValues} from '../../utils/nodes';
|
30
30
|
|
31
31
|
import {
|
32
32
|
getNodes,
|
@@ -39,6 +39,7 @@ import {
|
|
39
39
|
} from '../../store/reducers/nodes/nodes';
|
40
40
|
import {selectFilteredNodes} from '../../store/reducers/nodes/selectors';
|
41
41
|
import {changeFilter, ProblemFilterValues} from '../../store/reducers/settings/settings';
|
42
|
+
import type {AdditionalNodesProps} from '../../types/additionalProps';
|
42
43
|
|
43
44
|
import {isDatabaseEntityType} from '../Tenant/utils/schema';
|
44
45
|
|
@@ -53,10 +54,10 @@ const b = cn('ydb-nodes');
|
|
53
54
|
interface NodesProps {
|
54
55
|
path?: string;
|
55
56
|
type?: EPathType;
|
56
|
-
|
57
|
+
additionalNodesProps?: AdditionalNodesProps;
|
57
58
|
}
|
58
59
|
|
59
|
-
export const Nodes = ({path, type,
|
60
|
+
export const Nodes = ({path, type, additionalNodesProps = {}}: NodesProps) => {
|
60
61
|
const dispatch = useDispatch();
|
61
62
|
|
62
63
|
const isClusterNodes = !path;
|
@@ -153,7 +154,7 @@ export const Nodes = ({path, type, additionalNodesInfo = {}}: NodesProps) => {
|
|
153
154
|
|
154
155
|
const renderTable = () => {
|
155
156
|
const columns = getNodesColumns({
|
156
|
-
getNodeRef:
|
157
|
+
getNodeRef: additionalNodesProps.getNodeRef,
|
157
158
|
});
|
158
159
|
|
159
160
|
if (nodes && nodes.length === 0) {
|
@@ -6,11 +6,13 @@ import ProgressViewer from '../../components/ProgressViewer/ProgressViewer';
|
|
6
6
|
import {TabletsStatistic} from '../../components/TabletsStatistic';
|
7
7
|
import {NodeHostWrapper} from '../../components/NodeHostWrapper/NodeHostWrapper';
|
8
8
|
|
9
|
-
import {isSortableNodesProperty
|
9
|
+
import {isSortableNodesProperty} from '../../utils/nodes';
|
10
10
|
import {formatBytesToGigabyte} from '../../utils/index';
|
11
11
|
|
12
12
|
import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
|
13
13
|
|
14
|
+
import type {NodeAddress} from '../../types/additionalProps';
|
15
|
+
|
14
16
|
const NODES_COLUMNS_IDS = {
|
15
17
|
NodeId: 'NodeId',
|
16
18
|
Host: 'Host',
|
@@ -15,6 +15,7 @@ import type {
|
|
15
15
|
VisibleEntities,
|
16
16
|
} from '../../store/reducers/storage/types';
|
17
17
|
import type {NodesSortParams} from '../../store/reducers/nodes/types';
|
18
|
+
import type {AdditionalNodesProps} from '../../types/additionalProps';
|
18
19
|
import {
|
19
20
|
setInitialState,
|
20
21
|
setVisibleEntities,
|
@@ -45,7 +46,7 @@ import {
|
|
45
46
|
useTableSort,
|
46
47
|
useTypedSelector,
|
47
48
|
} from '../../utils/hooks';
|
48
|
-
import {
|
49
|
+
import {NodesUptimeFilterValues} from '../../utils/nodes';
|
49
50
|
import {DEFAULT_TABLE_SETTINGS} from '../../utils/constants';
|
50
51
|
|
51
52
|
import {StorageGroups} from './StorageGroups/StorageGroups';
|
@@ -59,12 +60,12 @@ import './Storage.scss';
|
|
59
60
|
const b = cn('global-storage');
|
60
61
|
|
61
62
|
interface StorageProps {
|
62
|
-
|
63
|
+
additionalNodesProps?: AdditionalNodesProps;
|
63
64
|
tenant?: string;
|
64
65
|
nodeId?: string;
|
65
66
|
}
|
66
67
|
|
67
|
-
export const Storage = ({
|
68
|
+
export const Storage = ({additionalNodesProps, tenant, nodeId}: StorageProps) => {
|
68
69
|
const dispatch = useDispatch();
|
69
70
|
|
70
71
|
const {autorefresh} = useTypedSelector((state) => state.schema);
|
@@ -188,7 +189,7 @@ export const Storage = ({additionalNodesInfo, tenant, nodeId}: StorageProps) =>
|
|
188
189
|
data={storageNodes}
|
189
190
|
tableSettings={DEFAULT_TABLE_SETTINGS}
|
190
191
|
onShowAll={handleShowAllNodes}
|
191
|
-
|
192
|
+
additionalNodesProps={additionalNodesProps}
|
192
193
|
sort={nodesSort}
|
193
194
|
handleSort={handleNodesSort}
|
194
195
|
/>
|
@@ -5,10 +5,10 @@ import DataTable, {Column, Settings, SortOrder} from '@gravity-ui/react-data-tab
|
|
5
5
|
import type {ValueOf} from '../../../types/common';
|
6
6
|
import type {PreparedStorageNode, VisibleEntities} from '../../../store/reducers/storage/types';
|
7
7
|
import type {HandleSort} from '../../../utils/hooks/useTableSort';
|
8
|
+
import type {AdditionalNodesProps} from '../../../types/additionalProps';
|
8
9
|
|
9
10
|
import {VISIBLE_ENTITIES} from '../../../store/reducers/storage/constants';
|
10
11
|
import {
|
11
|
-
AdditionalNodesInfo,
|
12
12
|
isSortableNodesProperty,
|
13
13
|
isUnavailableNode,
|
14
14
|
NodesUptimeFilterValues,
|
@@ -40,7 +40,7 @@ interface StorageNodesProps {
|
|
40
40
|
visibleEntities: VisibleEntities;
|
41
41
|
nodesUptimeFilter: keyof typeof NodesUptimeFilterValues;
|
42
42
|
onShowAll?: VoidFunction;
|
43
|
-
|
43
|
+
additionalNodesProps?: AdditionalNodesProps;
|
44
44
|
sort?: SortOrder;
|
45
45
|
handleSort?: HandleSort;
|
46
46
|
}
|
@@ -63,11 +63,11 @@ export function StorageNodes({
|
|
63
63
|
visibleEntities,
|
64
64
|
onShowAll,
|
65
65
|
nodesUptimeFilter,
|
66
|
-
|
66
|
+
additionalNodesProps,
|
67
67
|
sort,
|
68
68
|
handleSort,
|
69
69
|
}: StorageNodesProps) {
|
70
|
-
const getNodeRef =
|
70
|
+
const getNodeRef = additionalNodesProps?.getNodeRef;
|
71
71
|
|
72
72
|
const rawColumns: Column<PreparedStorageNode>[] = [
|
73
73
|
{
|
@@ -5,6 +5,7 @@ import cn from 'bem-cn-lite';
|
|
5
5
|
import {Button, Modal} from '@gravity-ui/uikit';
|
6
6
|
|
7
7
|
import type {EPathType} from '../../../../types/api/schema';
|
8
|
+
import type {AdditionalTenantsProps} from '../../../../types/additionalProps';
|
8
9
|
import {Icon} from '../../../../components/Icon';
|
9
10
|
import Overview from '../Overview/Overview';
|
10
11
|
import {Healthcheck} from '../Healthcheck';
|
@@ -16,7 +17,7 @@ interface DetailedOverviewProps {
|
|
16
17
|
type?: EPathType;
|
17
18
|
className?: string;
|
18
19
|
tenantName: string;
|
19
|
-
|
20
|
+
additionalTenantProps?: AdditionalTenantsProps;
|
20
21
|
}
|
21
22
|
|
22
23
|
const b = cn('kv-detailed-overview');
|
@@ -51,7 +52,7 @@ function DetailedOverview(props: DetailedOverviewProps) {
|
|
51
52
|
};
|
52
53
|
|
53
54
|
const renderContent = () => {
|
54
|
-
const {type, tenantName,
|
55
|
+
const {type, tenantName, additionalTenantProps} = props;
|
55
56
|
const isTenant = tenantName === currentSchemaPath;
|
56
57
|
return (
|
57
58
|
<div className={b()}>
|
@@ -60,7 +61,7 @@ function DetailedOverview(props: DetailedOverviewProps) {
|
|
60
61
|
<div className={b('section')}>
|
61
62
|
<TenantOverview
|
62
63
|
tenantName={tenantName}
|
63
|
-
|
64
|
+
additionalTenantProps={additionalTenantProps}
|
64
65
|
/>
|
65
66
|
</div>
|
66
67
|
<div className={b('section')}>
|
@@ -8,6 +8,7 @@ import {useLocation} from 'react-router';
|
|
8
8
|
import {Switch, Tabs} from '@gravity-ui/uikit';
|
9
9
|
|
10
10
|
import type {EPathType} from '../../../types/api/schema';
|
11
|
+
import type {AdditionalTenantsProps, AdditionalNodesProps} from '../../../types/additionalProps';
|
11
12
|
|
12
13
|
import {useTypedSelector} from '../../../utils/hooks';
|
13
14
|
import routes, {createHref} from '../../../routes';
|
@@ -41,8 +42,8 @@ import './Diagnostics.scss';
|
|
41
42
|
|
42
43
|
interface DiagnosticsProps {
|
43
44
|
type?: EPathType;
|
44
|
-
|
45
|
-
|
45
|
+
additionalTenantProps?: AdditionalTenantsProps;
|
46
|
+
additionalNodesProps?: AdditionalNodesProps;
|
46
47
|
}
|
47
48
|
|
48
49
|
const b = cn('kv-tenant-diagnostics');
|
@@ -107,7 +108,7 @@ function Diagnostics(props: DiagnosticsProps) {
|
|
107
108
|
<DetailedOverview
|
108
109
|
type={type}
|
109
110
|
tenantName={tenantNameString}
|
110
|
-
|
111
|
+
additionalTenantProps={props.additionalTenantProps}
|
111
112
|
/>
|
112
113
|
);
|
113
114
|
}
|
@@ -122,7 +123,7 @@ function Diagnostics(props: DiagnosticsProps) {
|
|
122
123
|
<Nodes
|
123
124
|
path={currentSchemaPath}
|
124
125
|
type={type}
|
125
|
-
|
126
|
+
additionalNodesProps={props.additionalNodesProps}
|
126
127
|
/>
|
127
128
|
);
|
128
129
|
}
|
@@ -13,7 +13,8 @@ import {TABLET_STATES, TENANT_DEFAULT_TITLE} from '../../../../utils/constants';
|
|
13
13
|
import {bytesToGB} from '../../../../utils/utils';
|
14
14
|
import {mapDatabaseTypeToDBName} from '../../utils/schema';
|
15
15
|
import {useAutofetcher, useTypedSelector} from '../../../../utils/hooks';
|
16
|
-
import {ETabletVolatileState} from '../../../../types/api/tenant';
|
16
|
+
import type {ETabletVolatileState} from '../../../../types/api/tenant';
|
17
|
+
import type {AdditionalTenantsProps} from '../../../../types/additionalProps';
|
17
18
|
import {getTenantInfo, setDataWasNotLoaded} from '../../../../store/reducers/tenant/tenant';
|
18
19
|
|
19
20
|
import i18n from './i18n';
|
@@ -23,10 +24,10 @@ const b = cn('tenant-overview');
|
|
23
24
|
|
24
25
|
interface TenantOverviewProps {
|
25
26
|
tenantName: string;
|
26
|
-
|
27
|
+
additionalTenantProps?: AdditionalTenantsProps;
|
27
28
|
}
|
28
29
|
|
29
|
-
export function TenantOverview({tenantName,
|
30
|
+
export function TenantOverview({tenantName, additionalTenantProps}: TenantOverviewProps) {
|
30
31
|
const {tenant, loading, wasLoaded} = useTypedSelector((state) => state.tenant);
|
31
32
|
const {autorefresh} = useTypedSelector((state) => state.schema);
|
32
33
|
const dispatch = useDispatch();
|
@@ -118,7 +119,7 @@ export function TenantOverview({tenantName, additionalTenantInfo}: TenantOvervie
|
|
118
119
|
<div className={b('top-label')}>{tenantType}</div>
|
119
120
|
<div className={b('top')}>
|
120
121
|
{renderName()}
|
121
|
-
{
|
122
|
+
{additionalTenantProps?.getMonitoringLink?.(Name, Type)}
|
122
123
|
</div>
|
123
124
|
<div className={b('system-tablets')}>
|
124
125
|
{SystemTablets &&
|
@@ -4,6 +4,7 @@ import cn from 'bem-cn-lite';
|
|
4
4
|
import {useThemeValue} from '@gravity-ui/uikit';
|
5
5
|
|
6
6
|
import type {EPathType} from '../../../types/api/schema';
|
7
|
+
import type {AdditionalTenantsProps, AdditionalNodesProps} from '../../../types/additionalProps';
|
7
8
|
import {TENANT_PAGES_IDS} from '../../../store/reducers/tenant/constants';
|
8
9
|
import {useSetting} from '../../../utils/hooks';
|
9
10
|
import {TENANT_INITIAL_PAGE_KEY} from '../../../utils/constants';
|
@@ -18,8 +19,8 @@ const b = cn('object-general');
|
|
18
19
|
|
19
20
|
interface ObjectGeneralProps {
|
20
21
|
type?: EPathType;
|
21
|
-
|
22
|
-
|
22
|
+
additionalTenantProps?: AdditionalTenantsProps;
|
23
|
+
additionalNodesProps?: AdditionalNodesProps;
|
23
24
|
}
|
24
25
|
|
25
26
|
function ObjectGeneral(props: ObjectGeneralProps) {
|
@@ -32,7 +33,7 @@ function ObjectGeneral(props: ObjectGeneralProps) {
|
|
32
33
|
const {name: tenantName, tenantPage = initialPage} = queryParams;
|
33
34
|
|
34
35
|
const renderTabContent = () => {
|
35
|
-
const {type,
|
36
|
+
const {type, additionalTenantProps, additionalNodesProps} = props;
|
36
37
|
switch (tenantPage) {
|
37
38
|
case TENANT_PAGES_IDS.query: {
|
38
39
|
return <Query path={tenantName as string} theme={theme} type={type} />;
|
@@ -41,8 +42,8 @@ function ObjectGeneral(props: ObjectGeneralProps) {
|
|
41
42
|
return (
|
42
43
|
<Diagnostics
|
43
44
|
type={type}
|
44
|
-
|
45
|
-
|
45
|
+
additionalTenantProps={additionalTenantProps}
|
46
|
+
additionalNodesProps={additionalNodesProps}
|
46
47
|
/>
|
47
48
|
);
|
48
49
|
}
|
@@ -5,6 +5,7 @@ import {useLocation} from 'react-router';
|
|
5
5
|
import qs from 'qs';
|
6
6
|
|
7
7
|
import type {TEvDescribeSchemeResult} from '../../types/api/schema';
|
8
|
+
import type {AdditionalTenantsProps, AdditionalNodesProps} from '../../types/additionalProps';
|
8
9
|
|
9
10
|
import {DEFAULT_IS_TENANT_SUMMARY_COLLAPSED, DEFAULT_SIZE_TENANT_KEY} from '../../utils/constants';
|
10
11
|
import {useTypedSelector} from '../../utils/hooks';
|
@@ -37,8 +38,8 @@ const initialTenantSummaryState = {
|
|
37
38
|
};
|
38
39
|
|
39
40
|
interface TenantProps {
|
40
|
-
|
41
|
-
|
41
|
+
additionalTenantProps?: AdditionalTenantsProps;
|
42
|
+
additionalNodesProps?: AdditionalNodesProps;
|
42
43
|
}
|
43
44
|
|
44
45
|
function Tenant(props: TenantProps) {
|
@@ -124,8 +125,8 @@ function Tenant(props: TenantProps) {
|
|
124
125
|
/>
|
125
126
|
<ObjectGeneral
|
126
127
|
type={preloadedPathType || currentPathType}
|
127
|
-
|
128
|
-
|
128
|
+
additionalTenantProps={props.additionalTenantProps}
|
129
|
+
additionalNodesProps={props.additionalNodesProps}
|
129
130
|
/>
|
130
131
|
</SplitPane>
|
131
132
|
)}
|
@@ -69,42 +69,42 @@ export const createTopicTemplate = (path: string) => {
|
|
69
69
|
return `-- docs: https://ydb.tech/en/docs/yql/reference/syntax/create_topic
|
70
70
|
CREATE TOPIC \`${path}/my_topic\` (
|
71
71
|
CONSUMER consumer1,
|
72
|
-
CONSUMER consumer2 WITH (read_from = Datetime('
|
72
|
+
CONSUMER consumer2 WITH (read_from = Datetime('1970-01-01T00:00:00Z')) -- Sets up the message write time starting from which the consumer will receive data.
|
73
73
|
-- Value type: Datetime OR Timestamp OR integer (unix-timestamp in the numeric format).
|
74
74
|
-- Default value: now
|
75
75
|
) WITH (
|
76
|
-
min_active_partitions =
|
77
|
-
partition_count_limit =
|
78
|
-
retention_period = Interval('
|
79
|
-
retention_storage_mb =
|
76
|
+
min_active_partitions = 1, -- Minimum number of topic partitions.
|
77
|
+
partition_count_limit = 0, -- Maximum number of active partitions in the topic. 0 is interpreted as unlimited.
|
78
|
+
retention_period = Interval('PT18H'), -- Data retention period in the topic. Value type: Interval.
|
79
|
+
retention_storage_mb = 0, -- Limit on the maximum disk space occupied by the topic data.
|
80
80
|
-- When this value is exceeded, the older data is cleared, like under a retention policy.
|
81
81
|
-- 0 is interpreted as unlimited.
|
82
|
-
partition_write_speed_bytes_per_second =
|
83
|
-
partition_write_burst_bytes =
|
84
|
-
|
85
|
-
|
82
|
+
partition_write_speed_bytes_per_second = 1048576, -- Maximum allowed write speed per partition.
|
83
|
+
partition_write_burst_bytes = 0 -- Write quota allocated for write bursts.
|
84
|
+
-- When set to zero, the actual write_burst value is equalled to
|
85
|
+
-- the quota value (this allows write bursts of up to one second).
|
86
86
|
);`;
|
87
87
|
};
|
88
88
|
|
89
89
|
export const alterTopicTemplate = (path: string) => {
|
90
90
|
return `-- docs: https://ydb.tech/en/docs/yql/reference/syntax/alter_topic
|
91
91
|
ALTER TOPIC \`${path}\`
|
92
|
-
ADD CONSUMER new_consumer WITH (read_from =
|
93
|
-
|
94
|
-
|
95
|
-
ALTER CONSUMER consumer1 SET (read_from = Datetime('
|
92
|
+
ADD CONSUMER new_consumer WITH (read_from = Datetime('1970-01-01T00:00:00Z')), -- Sets up the message write time starting from which the consumer will receive data.
|
93
|
+
-- Value type: Datetime OR Timestamp OR integer (unix-timestamp in the numeric format).
|
94
|
+
-- Default value: now
|
95
|
+
ALTER CONSUMER consumer1 SET (read_from = Datetime('1970-01-01T00:00:00Z')),
|
96
96
|
DROP CONSUMER consumer2,
|
97
97
|
SET (
|
98
|
-
min_active_partitions =
|
99
|
-
partition_count_limit =
|
100
|
-
retention_period = Interval('
|
101
|
-
retention_storage_mb =
|
102
|
-
|
103
|
-
|
104
|
-
partition_write_speed_bytes_per_second =
|
105
|
-
partition_write_burst_bytes =
|
106
|
-
|
107
|
-
|
98
|
+
min_active_partitions = 1, -- Minimum number of topic partitions.
|
99
|
+
partition_count_limit = 0, -- Maximum number of active partitions in the topic. 0 is interpreted as unlimited.
|
100
|
+
retention_period = Interval('PT18H'), -- Data retention period in the topic. Value type: Interval.
|
101
|
+
retention_storage_mb = 0, -- Limit on the maximum disk space occupied by the topic data.
|
102
|
+
-- When this value is exceeded, the older data is cleared, like under a retention policy.
|
103
|
+
-- 0 is interpreted as unlimited.
|
104
|
+
partition_write_speed_bytes_per_second = 1048576, -- Maximum allowed write speed per partition.
|
105
|
+
partition_write_burst_bytes = 0 -- Write quota allocated for write bursts.
|
106
|
+
-- When set to zero, the actual write_burst value is equalled to
|
107
|
+
-- the quota value (this allows write bursts of up to one second).
|
108
108
|
);`;
|
109
109
|
};
|
110
110
|
|
@@ -106,9 +106,7 @@ export const Tenants = ({additionalTenantsProps}: TenantsProps) => {
|
|
106
106
|
backend,
|
107
107
|
})}
|
108
108
|
/>
|
109
|
-
{row.Name
|
110
|
-
row.Type &&
|
111
|
-
additionalTenantsProps?.getMonitoringLink?.(row.Name, row.Type)}
|
109
|
+
{additionalTenantsProps?.getMonitoringLink?.(row.Name, row.Type)}
|
112
110
|
</div>
|
113
111
|
);
|
114
112
|
},
|
@@ -2,6 +2,7 @@ import type {ReactNode} from 'react';
|
|
2
2
|
|
3
3
|
import type {InfoViewerItem} from '../components/InfoViewer';
|
4
4
|
import type {ETenantType} from './api/tenant';
|
5
|
+
import type {TSystemStateInfo} from './api/nodes';
|
5
6
|
import type {VersionToColorMap} from './versions';
|
6
7
|
|
7
8
|
export interface AdditionalVersionsProps {
|
@@ -20,5 +21,11 @@ export interface AdditionalClusterProps {
|
|
20
21
|
|
21
22
|
export interface AdditionalTenantsProps {
|
22
23
|
prepareTenantBackend?: (backend: string | undefined) => string | undefined;
|
23
|
-
getMonitoringLink?: (name
|
24
|
+
getMonitoringLink?: (name?: string, type?: ETenantType) => ReactNode;
|
25
|
+
}
|
26
|
+
|
27
|
+
export type NodeAddress = Pick<TSystemStateInfo, 'Host' | 'Endpoints'>;
|
28
|
+
|
29
|
+
export interface AdditionalNodesProps extends Record<string, unknown> {
|
30
|
+
getNodeRef?: (node?: NodeAddress) => string | null;
|
24
31
|
}
|
package/dist/utils/nodes.ts
CHANGED
@@ -18,12 +18,6 @@ export const NodesUptimeFilterTitles = {
|
|
18
18
|
export const isUnavailableNode = (node: NodesPreparedEntity | TSystemStateInfo) =>
|
19
19
|
!node.SystemState || node.SystemState === EFlag.Grey;
|
20
20
|
|
21
|
-
export type NodeAddress = Pick<TSystemStateInfo, 'Host' | 'Endpoints'>;
|
22
|
-
|
23
|
-
export interface AdditionalNodesInfo extends Record<string, unknown> {
|
24
|
-
getNodeRef?: (node?: NodeAddress) => string | null;
|
25
|
-
}
|
26
|
-
|
27
21
|
export const prepareNodesMap = (nodesList?: TNodeInfo[]) => {
|
28
22
|
return nodesList?.reduce<NodesMap>((nodesMap, node) => {
|
29
23
|
if (node.Id && node.Host) {
|