ydb-embedded-ui 1.10.3 → 1.12.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/CHANGELOG.md +37 -0
- package/dist/components/IndexInfoViewer/IndexInfoViewer.tsx +2 -2
- package/dist/components/InfoViewer/InfoViewer.scss +32 -7
- package/dist/components/InfoViewer/InfoViewer.tsx +43 -0
- package/dist/components/InfoViewer/index.ts +1 -0
- package/dist/components/InfoViewer/utils.ts +6 -4
- package/dist/components/Stack/Stack.scss +55 -0
- package/dist/components/Stack/Stack.tsx +35 -0
- package/dist/containers/Storage/DiskStateProgressBar/DiskStateProgressBar.scss +2 -0
- package/dist/containers/Storage/DiskStateProgressBar/DiskStateProgressBar.tsx +5 -0
- package/dist/containers/Storage/Pdisk/Pdisk.scss +2 -19
- package/dist/containers/Storage/Pdisk/Pdisk.tsx +30 -33
- package/dist/containers/Storage/Pdisk/__tests__/colors.tsx +40 -0
- package/dist/containers/Storage/StorageGroups/StorageGroups.scss +31 -3
- package/dist/containers/Storage/StorageGroups/StorageGroups.tsx +72 -33
- package/dist/containers/Storage/Vdisk/Vdisk.js +63 -64
- package/dist/containers/Storage/Vdisk/Vdisk.scss +9 -28
- package/dist/containers/Storage/Vdisk/__tests__/colors.tsx +163 -0
- package/dist/containers/Storage/utils/index.ts +49 -0
- package/dist/services/api.d.ts +9 -0
- package/dist/setupTests.js +8 -0
- package/dist/types/api/schema.ts +6 -14
- package/dist/types/api/storage.ts +164 -0
- package/dist/types/index.ts +1 -0
- package/dist/types/store/storage.ts +11 -0
- package/package.json +28 -5
- package/dist/components/InfoViewer/InfoViewer.js +0 -47
- package/dist/index.test.js +0 -5
package/dist/setupTests.js
CHANGED
@@ -3,3 +3,11 @@
|
|
3
3
|
// expect(element).toHaveTextContent(/react/i)
|
4
4
|
// learn more: https://github.com/testing-library/jest-dom
|
5
5
|
import '@testing-library/jest-dom';
|
6
|
+
|
7
|
+
import {configure as configureUiKit} from '@yandex-cloud/uikit';
|
8
|
+
import {configure as configureYdbUiComponents} from 'ydb-ui-components';
|
9
|
+
import {i18n, Lang} from '../src/utils/i18n';
|
10
|
+
|
11
|
+
i18n.setLang(Lang.En);
|
12
|
+
configureYdbUiComponents({lang: Lang.En});
|
13
|
+
configureUiKit({lang: Lang.En});
|
package/dist/types/api/schema.ts
CHANGED
@@ -91,27 +91,19 @@ export interface TTableDescription {
|
|
91
91
|
export interface TPartitionConfig {
|
92
92
|
/** uint64 */
|
93
93
|
FollowerCount?: string;
|
94
|
-
/**
|
95
|
-
|
96
|
-
* @deprecated use FollowerGroups
|
97
|
-
*/
|
98
|
-
CrossDataCenterFollowerCount?: string;
|
94
|
+
/** @deprecated use FollowerGroups */
|
95
|
+
CrossDataCenterFollowerCount?: number;
|
99
96
|
/** 0 or 1 items */
|
100
97
|
FollowerGroups?: TFollowerGroup[];
|
101
98
|
}
|
102
99
|
|
103
100
|
export interface TFollowerGroup {
|
104
|
-
|
105
|
-
FollowerCount?: string;
|
101
|
+
FollowerCount?: number;
|
106
102
|
AllowLeaderPromotion?: boolean;
|
107
103
|
AllowClientRead?: boolean;
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
* uint32[]
|
112
|
-
* @deprecated use AllowedDataCenters
|
113
|
-
*/
|
114
|
-
AllowedDataCenterNumIDs?: string[];
|
104
|
+
AllowedNodeIDs?: number[];
|
105
|
+
/** @deprecated use AllowedDataCenters */
|
106
|
+
AllowedDataCenterNumIDs?: number[];
|
115
107
|
RequireAllDataCenters?: boolean;
|
116
108
|
LocalNodeOnly?: boolean;
|
117
109
|
RequireDifferentNodes?: boolean;
|
@@ -52,3 +52,167 @@ export interface TPDiskStateInfo {
|
|
52
52
|
Overall?: EFlag;
|
53
53
|
SerialNumber?: string;
|
54
54
|
}
|
55
|
+
|
56
|
+
export enum EVDiskState {
|
57
|
+
Initial = 'Initial',
|
58
|
+
LocalRecoveryError = 'LocalRecoveryError',
|
59
|
+
SyncGuidRecovery = 'SyncGuidRecovery',
|
60
|
+
SyncGuidRecoveryError = 'SyncGuidRecoveryError',
|
61
|
+
OK = 'OK',
|
62
|
+
PDiskError = 'PDiskError',
|
63
|
+
}
|
64
|
+
|
65
|
+
interface TRank {
|
66
|
+
/**
|
67
|
+
* Rank in percents; 0-100% is good; >100% is bad.
|
68
|
+
* Formula for rank calculation is the following:
|
69
|
+
* Rank = actual_value / max_allowed_value * 100
|
70
|
+
*/
|
71
|
+
RankPercent?: number;
|
72
|
+
|
73
|
+
/**
|
74
|
+
* Flag is the Rank transformed to something simple
|
75
|
+
* to understand: Green, Yellow or Red
|
76
|
+
*/
|
77
|
+
Flag?: EFlag;
|
78
|
+
}
|
79
|
+
|
80
|
+
interface TVDiskSatisfactionRank {
|
81
|
+
FreshRank?: TRank;
|
82
|
+
LevelRank?: TRank;
|
83
|
+
}
|
84
|
+
|
85
|
+
interface TVDiskID {
|
86
|
+
GroupID?: number;
|
87
|
+
GroupGeneration?: number;
|
88
|
+
Ring?: number;
|
89
|
+
Domain?: number;
|
90
|
+
VDisk?: number;
|
91
|
+
}
|
92
|
+
|
93
|
+
export interface TVSlotId {
|
94
|
+
NodeId?: number;
|
95
|
+
PDiskId?: number;
|
96
|
+
VSlotId?: number;
|
97
|
+
}
|
98
|
+
|
99
|
+
export interface TVDiskStateInfo {
|
100
|
+
VDiskId?: TVDiskID;
|
101
|
+
/** uint64 */
|
102
|
+
CreateTime?: string;
|
103
|
+
/** uint64 */
|
104
|
+
ChangeTime?: string;
|
105
|
+
PDisk?: TPDiskStateInfo;
|
106
|
+
VDiskSlotId?: number;
|
107
|
+
/** uint64 */
|
108
|
+
Guid?: string;
|
109
|
+
/** uint64 */
|
110
|
+
Kind?: string;
|
111
|
+
NodeId?: number;
|
112
|
+
Count?: number;
|
113
|
+
|
114
|
+
Overall?: EFlag;
|
115
|
+
|
116
|
+
/** Current state of VDisk */
|
117
|
+
VDiskState?: EVDiskState;
|
118
|
+
/** Disk space flags */
|
119
|
+
DiskSpace?: EFlag;
|
120
|
+
/** Compaction satisfaction rank */
|
121
|
+
SatisfactionRank?: TVDiskSatisfactionRank;
|
122
|
+
/** Is VDisk replicated? (i.e. contains all blobs it must have) */
|
123
|
+
Replicated?: boolean;
|
124
|
+
/** Does this VDisk has any yet unreplicated phantom-like blobs? */
|
125
|
+
UnreplicatedPhantoms?: boolean;
|
126
|
+
/** The same for the non-phantom-like blobs. */
|
127
|
+
UnreplicatedNonPhantoms?: boolean;
|
128
|
+
/**
|
129
|
+
* uint64
|
130
|
+
* How many unsynced VDisks from current BlobStorage group we see
|
131
|
+
*/
|
132
|
+
UnsyncedVDisks?: string;
|
133
|
+
/**
|
134
|
+
* uint64
|
135
|
+
* How much this VDisk have allocated on corresponding PDisk
|
136
|
+
*/
|
137
|
+
AllocatedSize?: string;
|
138
|
+
/**
|
139
|
+
* uint64
|
140
|
+
* How much space is available for VDisk corresponding to PDisk's hard space limits
|
141
|
+
*/
|
142
|
+
AvailableSize?: string;
|
143
|
+
/** Does this disk has some unreadable but not yet restored blobs? */
|
144
|
+
HasUnreadableBlobs?: boolean;
|
145
|
+
/** fixed64 */
|
146
|
+
IncarnationGuid?: string;
|
147
|
+
DonorMode?: boolean;
|
148
|
+
/**
|
149
|
+
* fixed64
|
150
|
+
* VDisk actor instance guid
|
151
|
+
*/
|
152
|
+
InstanceGuid?: string;
|
153
|
+
// in reality it is `Donors: TVDiskStateInfo[] | TVSlotId[]`, but this way it is more error-proof
|
154
|
+
Donors?: Array<TVDiskStateInfo | TVSlotId>;
|
155
|
+
|
156
|
+
/** VDisk (Skeleton) Front Queue Status */
|
157
|
+
FrontQueues?: EFlag;
|
158
|
+
|
159
|
+
/** VDisk storage pool label */
|
160
|
+
StoragePoolName?: string;
|
161
|
+
|
162
|
+
/**
|
163
|
+
* uint64
|
164
|
+
* Read bytes per second from PDisk for TEvVGet blobs only
|
165
|
+
*/
|
166
|
+
ReadThroughput?: string;
|
167
|
+
/**
|
168
|
+
* uint64
|
169
|
+
* Write bytes per second to PDisk for TEvVPut blobs and replication bytes only
|
170
|
+
*/
|
171
|
+
WriteThroughput?: string;
|
172
|
+
}
|
173
|
+
|
174
|
+
export interface TBSGroupStateInfo {
|
175
|
+
/** uint32 */
|
176
|
+
GroupID?: string;
|
177
|
+
ErasureSpecies?: string;
|
178
|
+
VDisks?: TVDiskStateInfo[];
|
179
|
+
/** uint64 */
|
180
|
+
ChangeTime?: string;
|
181
|
+
/** uint32 */
|
182
|
+
NodeId?: string; // filled during merge
|
183
|
+
/** uint32 */
|
184
|
+
GroupGeneration?: string;
|
185
|
+
Overall?: EFlag;
|
186
|
+
Latency?: EFlag;
|
187
|
+
/** uint32 */
|
188
|
+
Count?: string; // filled during group count
|
189
|
+
StoragePoolName?: string; // from BS_CONTROLLER
|
190
|
+
}
|
191
|
+
|
192
|
+
export interface TStoragePoolInfo {
|
193
|
+
Overall?: EFlag;
|
194
|
+
Name?: string;
|
195
|
+
Kind?: string;
|
196
|
+
Groups?: TBSGroupStateInfo[];
|
197
|
+
/** uint64 */
|
198
|
+
AcquiredUnits?: string;
|
199
|
+
AcquiredIOPS?: number;
|
200
|
+
/** uint64 */
|
201
|
+
AcquiredThroughput?: string;
|
202
|
+
/** uint64 */
|
203
|
+
AcquiredSize?: string;
|
204
|
+
MaximumIOPS?: number;
|
205
|
+
/** uint64 */
|
206
|
+
MaximumThroughput?: string;
|
207
|
+
/** uint64 */
|
208
|
+
MaximumSize?: string;
|
209
|
+
}
|
210
|
+
|
211
|
+
export interface TStorageInfo {
|
212
|
+
Overall?: EFlag;
|
213
|
+
StoragePools?: TStoragePoolInfo[];
|
214
|
+
/** uint64 */
|
215
|
+
TotalGroups?: string;
|
216
|
+
/** uint64 */
|
217
|
+
FoundGroups?: string;
|
218
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export type RequiredField<Src, Fields extends keyof Src> = Src & Required<Pick<Src, Fields>>;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "ydb-embedded-ui",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.12.0",
|
4
4
|
"files": [
|
5
5
|
"dist"
|
6
6
|
],
|
@@ -9,10 +9,6 @@
|
|
9
9
|
"url": "git@github.com:ydb-platform/ydb-embedded-ui.git"
|
10
10
|
},
|
11
11
|
"dependencies": {
|
12
|
-
"@testing-library/jest-dom": "5.15.0",
|
13
|
-
"@testing-library/react": "11.2.7",
|
14
|
-
"@testing-library/user-event": "12.8.3",
|
15
|
-
"@types/qs": "6.9.7",
|
16
12
|
"@yandex-cloud/i18n": "0.6.0",
|
17
13
|
"@yandex-cloud/paranoid": "1.0.0",
|
18
14
|
"@yandex-cloud/react-data-table": "0.2.1",
|
@@ -63,6 +59,27 @@
|
|
63
59
|
"eslint --fix --quiet"
|
64
60
|
]
|
65
61
|
},
|
62
|
+
"jest": {
|
63
|
+
"verbose": true,
|
64
|
+
"moduleFileExtensions": [
|
65
|
+
"js",
|
66
|
+
"json",
|
67
|
+
"ts",
|
68
|
+
"tsx"
|
69
|
+
],
|
70
|
+
"rootDir": ".",
|
71
|
+
"transform": {
|
72
|
+
"^.+\\.[jt]sx?$": "ts-jest"
|
73
|
+
},
|
74
|
+
"coverageDirectory": "./coverage",
|
75
|
+
"collectCoverageFrom": [
|
76
|
+
"src/**/*.{ts,tsx,js,jsx}"
|
77
|
+
],
|
78
|
+
"testEnvironment": "jsdom",
|
79
|
+
"moduleNameMapper": {
|
80
|
+
"\\.(css|less|scss|sass)$": "jest-transform-css"
|
81
|
+
}
|
82
|
+
},
|
66
83
|
"browserslist": {
|
67
84
|
"production": [
|
68
85
|
">0.2%",
|
@@ -78,7 +95,11 @@
|
|
78
95
|
"devDependencies": {
|
79
96
|
"@commitlint/cli": "^15.0.0",
|
80
97
|
"@commitlint/config-conventional": "^15.0.0",
|
98
|
+
"@testing-library/jest-dom": "^5.15.0",
|
99
|
+
"@testing-library/react": "^11.2.7",
|
100
|
+
"@testing-library/user-event": "^12.8.3",
|
81
101
|
"@types/lodash": "^4.14.178",
|
102
|
+
"@types/qs": "^6.9.7",
|
82
103
|
"@types/react": "^17.0.44",
|
83
104
|
"@types/react-dom": "^17.0.11",
|
84
105
|
"@types/react-router": "^5.1.17",
|
@@ -95,6 +116,7 @@
|
|
95
116
|
"copyfiles": "^2.4.1",
|
96
117
|
"eslint-config-prettier": "^8.3.0",
|
97
118
|
"husky": "^7.0.4",
|
119
|
+
"jest-transform-css": "^4.0.1",
|
98
120
|
"lint-staged": "^12.3.7",
|
99
121
|
"postcss": "^8.4.6",
|
100
122
|
"prettier": "^2.5.1",
|
@@ -102,6 +124,7 @@
|
|
102
124
|
"react-app-rewired": "^2.1.11",
|
103
125
|
"react-dom": "^17.0.2",
|
104
126
|
"stylelint": "^14.3.0",
|
127
|
+
"ts-jest": "^28.0.7",
|
105
128
|
"typescript": "^4.5.5"
|
106
129
|
},
|
107
130
|
"peerDependencies": {
|
@@ -1,47 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import PropTypes from 'prop-types';
|
3
|
-
import cn from 'bem-cn-lite';
|
4
|
-
import './InfoViewer.scss';
|
5
|
-
|
6
|
-
const b = cn('info-viewer');
|
7
|
-
|
8
|
-
class InfoViewer extends React.Component {
|
9
|
-
render() {
|
10
|
-
const {info, className, title} = this.props;
|
11
|
-
|
12
|
-
return (
|
13
|
-
<div className={`${b()} ${className}`}>
|
14
|
-
{title && <div className={b('title')}>{title}</div>}
|
15
|
-
{info && info.length > 0 ? (
|
16
|
-
<div className={b('items')}>
|
17
|
-
{info.map((data, infoIndex) => (
|
18
|
-
<div className={b('row')} key={infoIndex}>
|
19
|
-
<div className={b('label')}>
|
20
|
-
{data.label}
|
21
|
-
<div className={b('dots')}></div>
|
22
|
-
</div>
|
23
|
-
|
24
|
-
<div className={b('value')}>{data.value}</div>
|
25
|
-
</div>
|
26
|
-
))}
|
27
|
-
</div>
|
28
|
-
) : (
|
29
|
-
<div>no {title} data</div>
|
30
|
-
)}
|
31
|
-
</div>
|
32
|
-
);
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
InfoViewer.propTypes = {
|
37
|
-
className: PropTypes.string,
|
38
|
-
info: PropTypes.array.isRequired,
|
39
|
-
title: PropTypes.string,
|
40
|
-
dots: PropTypes.bool,
|
41
|
-
};
|
42
|
-
|
43
|
-
InfoViewer.defaultProps = {
|
44
|
-
className: '',
|
45
|
-
};
|
46
|
-
|
47
|
-
export default InfoViewer;
|