ydb-embedded-ui 22.3.0 → 22.4.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.
Files changed (302) hide show
  1. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.d.ts +10 -1
  2. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js +75 -13
  3. package/dist/components/DiskCapacityInfo/DiskCapacityInfo.js.map +1 -1
  4. package/dist/components/DiskCapacityInfo/i18n/index.d.ts +1 -1
  5. package/dist/components/DiskPopup/DiskPopup.d.ts +25 -0
  6. package/dist/components/DiskPopup/DiskPopup.js +44 -0
  7. package/dist/components/DiskPopup/DiskPopup.js.map +1 -0
  8. package/dist/components/DiskPopup/DiskPopup.scss +203 -0
  9. package/dist/components/DiskPopup/i18n/en.json +3 -0
  10. package/dist/components/DiskPopup/i18n/index.d.ts +2 -0
  11. package/dist/components/DiskPopup/i18n/index.js +4 -0
  12. package/dist/components/DiskPopup/i18n/index.js.map +1 -0
  13. package/dist/components/DiskStatus/DiskStatus.d.ts +31 -0
  14. package/dist/components/DiskStatus/DiskStatus.js +61 -0
  15. package/dist/components/DiskStatus/DiskStatus.js.map +1 -0
  16. package/dist/components/DiskStatus/DiskStatus.scss +59 -0
  17. package/dist/components/DiskStatus/i18n/en.json +6 -0
  18. package/dist/components/DiskStatus/i18n/index.d.ts +2 -0
  19. package/dist/components/DiskStatus/i18n/index.js +4 -0
  20. package/dist/components/DiskStatus/i18n/index.js.map +1 -0
  21. package/dist/components/EntityStatus/EntityStatus.d.ts +1 -0
  22. package/dist/components/EntityStatus/EntityStatus.js +1 -1
  23. package/dist/components/EntityStatus/EntityStatus.js.map +1 -1
  24. package/dist/components/EvictVDiskButton/i18n/en.json +1 -1
  25. package/dist/components/FullNodeViewer/i18n/index.d.ts +1 -1
  26. package/dist/components/HoverPopup/HoverPopup.d.ts +2 -1
  27. package/dist/components/HoverPopup/HoverPopup.js +49 -17
  28. package/dist/components/HoverPopup/HoverPopup.js.map +1 -1
  29. package/dist/components/HoverPopup/usePopupPriority.d.ts +4 -0
  30. package/dist/components/HoverPopup/usePopupPriority.js +30 -0
  31. package/dist/components/HoverPopup/usePopupPriority.js.map +1 -0
  32. package/dist/components/PDiskInfo/PDiskLogSize.d.ts +5 -0
  33. package/dist/components/PDiskInfo/PDiskLogSize.js +20 -0
  34. package/dist/components/PDiskInfo/PDiskLogSize.js.map +1 -0
  35. package/dist/components/PDiskInfo/PDiskLogSize.scss +12 -0
  36. package/dist/components/PDiskInfo/getPDiskDetails.d.ts +4 -0
  37. package/dist/components/PDiskInfo/getPDiskDetails.js +33 -0
  38. package/dist/components/PDiskInfo/getPDiskDetails.js.map +1 -0
  39. package/dist/components/PDiskInfo/i18n/en.json +64 -2
  40. package/dist/components/PDiskInfo/i18n/index.d.ts +1 -1
  41. package/dist/components/PDiskInfo/statuses.d.ts +7 -0
  42. package/dist/components/PDiskInfo/statuses.js +185 -0
  43. package/dist/components/PDiskInfo/statuses.js.map +1 -0
  44. package/dist/components/PDiskPopup/PDiskPopup.d.ts +4 -7
  45. package/dist/components/PDiskPopup/PDiskPopup.js +28 -99
  46. package/dist/components/PDiskPopup/PDiskPopup.js.map +1 -1
  47. package/dist/components/PDiskPopup/i18n/en.json +2 -12
  48. package/dist/components/PDiskPopup/i18n/index.d.ts +1 -1
  49. package/dist/components/StorageGroupInfo/StorageGroupInfo.d.ts +3 -3
  50. package/dist/components/StorageGroupInfo/StorageGroupInfo.js +78 -218
  51. package/dist/components/StorageGroupInfo/StorageGroupInfo.js.map +1 -1
  52. package/dist/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  53. package/dist/components/StorageGroupInfo/i18n/en.json +1 -9
  54. package/dist/components/StorageGroupInfo/i18n/index.d.ts +1 -1
  55. package/dist/components/VDisk/VDisk.d.ts +2 -1
  56. package/dist/components/VDisk/VDisk.js +23 -32
  57. package/dist/components/VDisk/VDisk.js.map +1 -1
  58. package/dist/components/VDisk/VDiskWithDonorsStack.d.ts +1 -1
  59. package/dist/components/VDisk/VDiskWithDonorsStack.js +2 -1
  60. package/dist/components/VDisk/VDiskWithDonorsStack.js.map +1 -1
  61. package/dist/components/VDisk/getFlagStatusText.d.ts +2 -0
  62. package/dist/components/VDisk/getFlagStatusText.js +18 -0
  63. package/dist/components/VDisk/getFlagStatusText.js.map +1 -0
  64. package/dist/components/VDisk/i18n/en.json +1 -1
  65. package/dist/components/VDisk/i18n/index.d.ts +1 -1
  66. package/dist/components/VDiskInfo/getVDiskDetails.d.ts +5 -0
  67. package/dist/components/VDiskInfo/getVDiskDetails.js +29 -0
  68. package/dist/components/VDiskInfo/getVDiskDetails.js.map +1 -0
  69. package/dist/components/VDiskInfo/i18n/en.json +3 -1
  70. package/dist/components/VDiskInfo/i18n/index.d.ts +1 -1
  71. package/dist/components/VDiskPopup/VDiskPopup.d.ts +6 -8
  72. package/dist/components/VDiskPopup/VDiskPopup.js +106 -240
  73. package/dist/components/VDiskPopup/VDiskPopup.js.map +1 -1
  74. package/dist/components/VDiskPopup/VDiskPopup.scss +3 -10
  75. package/dist/components/VDiskPopup/i18n/en.json +6 -22
  76. package/dist/components/VDiskPopup/i18n/index.d.ts +1 -1
  77. package/dist/components/VDiskStatus/VDiskReplicationStatus.d.ts +8 -0
  78. package/dist/components/VDiskStatus/VDiskReplicationStatus.js +32 -0
  79. package/dist/components/VDiskStatus/VDiskReplicationStatus.js.map +1 -0
  80. package/dist/components/VDiskStatus/VDiskStatus.d.ts +16 -0
  81. package/dist/components/VDiskStatus/VDiskStatus.js +20 -0
  82. package/dist/components/VDiskStatus/VDiskStatus.js.map +1 -0
  83. package/dist/components/VDiskStatus/VDiskStatus.scss +32 -0
  84. package/dist/components/VDiskStatus/i18n/en.json +33 -0
  85. package/dist/components/VDiskStatus/i18n/index.d.ts +1 -0
  86. package/dist/components/VDiskStatus/i18n/index.js +5 -0
  87. package/dist/components/VDiskStatus/i18n/index.js.map +1 -0
  88. package/dist/components/VDiskStatus/index.d.ts +2 -0
  89. package/dist/components/VDiskStatus/index.js +3 -0
  90. package/dist/components/VDiskStatus/index.js.map +1 -0
  91. package/dist/components/VDiskStatus/statuses.d.ts +4 -0
  92. package/dist/components/VDiskStatus/statuses.js +120 -0
  93. package/dist/components/VDiskStatus/statuses.js.map +1 -0
  94. package/dist/components/capacityMetricsColumns/i18n/en.json +4 -4
  95. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js +6 -1
  96. package/dist/containers/Cluster/ClusterDrawerHealthcheck.js.map +1 -1
  97. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js +1 -1
  98. package/dist/containers/Clusters/ClusterDrawerHealthcheck.js.map +1 -1
  99. package/dist/containers/Header/Header.js +8 -2
  100. package/dist/containers/Header/Header.js.map +1 -1
  101. package/dist/containers/Header/StorageGroupLeftControls.d.ts +1 -0
  102. package/dist/containers/Header/StorageGroupLeftControls.js +23 -0
  103. package/dist/containers/Header/StorageGroupLeftControls.js.map +1 -0
  104. package/dist/containers/Header/i18n/en.json +3 -1
  105. package/dist/containers/Header/i18n/index.d.ts +1 -1
  106. package/dist/containers/Operations/constants.d.ts +1 -1
  107. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js +4 -4
  108. package/dist/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.js.map +1 -1
  109. package/dist/containers/PDiskPage/i18n/index.d.ts +1 -1
  110. package/dist/containers/Storage/Disks/Disks.js +36 -9
  111. package/dist/containers/Storage/Disks/Disks.js.map +1 -1
  112. package/dist/containers/Storage/PDisk/PDisk.d.ts +2 -1
  113. package/dist/containers/Storage/PDisk/PDisk.js +2 -2
  114. package/dist/containers/Storage/PDisk/PDisk.js.map +1 -1
  115. package/dist/containers/Storage/PDisk/i18n/index.d.ts +1 -1
  116. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js +7 -2
  117. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/columns.js.map +1 -1
  118. package/dist/containers/Storage/PaginatedStorageGroupsTable/columns/i18n/index.d.ts +1 -1
  119. package/dist/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  120. package/dist/containers/Storage/StorageExpertModePanel/i18n/index.d.ts +1 -1
  121. package/dist/containers/Storage/StorageGroupStateLabel.d.ts +4 -0
  122. package/dist/containers/Storage/StorageGroupStateLabel.js +9 -0
  123. package/dist/containers/Storage/StorageGroupStateLabel.js.map +1 -0
  124. package/dist/containers/Storage/utils/getStorageGroupStateLabel.d.ts +2 -0
  125. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js +35 -0
  126. package/dist/containers/Storage/utils/getStorageGroupStateLabel.js.map +1 -0
  127. package/dist/containers/StorageGroupPage/StorageGroupPage.js +17 -12
  128. package/dist/containers/StorageGroupPage/StorageGroupPage.js.map +1 -1
  129. package/dist/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  130. package/dist/containers/StorageGroupPage/i18n/en.json +3 -1
  131. package/dist/containers/StorageGroupPage/i18n/index.d.ts +1 -1
  132. package/dist/containers/Tenant/Diagnostics/Overview/Overview.d.ts +2 -1
  133. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js +4 -1
  134. package/dist/containers/Tenant/Diagnostics/Overview/Overview.js.map +1 -1
  135. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.d.ts +2 -1
  136. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js +11 -2
  137. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.js.map +1 -1
  138. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.d.ts +2 -1
  139. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js +9 -8
  140. package/dist/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.js.map +1 -1
  141. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.d.ts +16 -1
  142. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js +56 -19
  143. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.js.map +1 -1
  144. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  145. package/dist/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/index.d.ts +1 -1
  146. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/i18n/index.d.ts +1 -1
  147. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.d.ts +3 -1
  148. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js +3 -3
  149. package/dist/containers/Tenant/Healthcheck/components/HealthcheckDrawer.js.map +1 -1
  150. package/dist/containers/Tenant/TenantDrawerHealthcheck.js +8 -1
  151. package/dist/containers/Tenant/TenantDrawerHealthcheck.js.map +1 -1
  152. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js +8 -1
  153. package/dist/containers/Tenants/DatabaseDrawerHealthcheck.js.map +1 -1
  154. package/dist/containers/VDiskPage/i18n/index.d.ts +1 -1
  155. package/dist/lib.d.ts +1 -1
  156. package/dist/lib.js.map +1 -1
  157. package/dist/store/configureStore.d.ts +2 -2
  158. package/dist/store/defaultStore.d.ts +1 -1
  159. package/dist/store/reducers/header/types.d.ts +1 -1
  160. package/dist/store/reducers/index.d.ts +2 -2
  161. package/dist/store/reducers/pdisk/types.d.ts +1 -0
  162. package/dist/store/reducers/pdisk/utils.js +6 -1
  163. package/dist/store/reducers/pdisk/utils.js.map +1 -1
  164. package/dist/store/reducers/storage/prepareGroupsDisks.d.ts +1 -0
  165. package/dist/store/reducers/storage/prepareGroupsDisks.js +7 -18
  166. package/dist/store/reducers/storage/prepareGroupsDisks.js.map +1 -1
  167. package/dist/store/reducers/storage/utils.js +4 -0
  168. package/dist/store/reducers/storage/utils.js.map +1 -1
  169. package/dist/store/reducers/streamingQuery/streamingQuery.js +2 -4
  170. package/dist/store/reducers/streamingQuery/streamingQuery.js.map +1 -1
  171. package/dist/styles/mixins.scss +22 -0
  172. package/dist/types/api/pdisk.d.ts +4 -0
  173. package/dist/types/api/pdisk.js.map +1 -1
  174. package/dist/types/api/vdisk.d.ts +8 -0
  175. package/dist/types/api/vdisk.js +7 -0
  176. package/dist/types/api/vdisk.js.map +1 -1
  177. package/dist/types/store/nodesList.d.ts +4 -2
  178. package/dist/uiFactory/types.d.ts +5 -2
  179. package/dist/utils/bytesParsers/formatBytes.d.ts +3 -1
  180. package/dist/utils/bytesParsers/formatBytes.js +12 -3
  181. package/dist/utils/bytesParsers/formatBytes.js.map +1 -1
  182. package/dist/utils/disks/constants.d.ts +1 -0
  183. package/dist/utils/disks/constants.js +4 -0
  184. package/dist/utils/disks/constants.js.map +1 -1
  185. package/dist/utils/disks/diskInfo/getDiskLocationItems.d.ts +16 -0
  186. package/dist/utils/disks/diskInfo/getDiskLocationItems.js +30 -0
  187. package/dist/utils/disks/diskInfo/getDiskLocationItems.js.map +1 -0
  188. package/dist/utils/disks/diskInfo/i18n/en.json +9 -0
  189. package/dist/utils/disks/diskInfo/i18n/index.d.ts +2 -0
  190. package/dist/utils/disks/diskInfo/i18n/index.js +4 -0
  191. package/dist/utils/disks/diskInfo/i18n/index.js.map +1 -0
  192. package/dist/utils/disks/iconCalculators.d.ts +5 -0
  193. package/dist/utils/disks/iconCalculators.js +1 -1
  194. package/dist/utils/disks/iconCalculators.js.map +1 -1
  195. package/dist/utils/disks/prepareDisks.d.ts +6 -2
  196. package/dist/utils/disks/prepareDisks.js +22 -35
  197. package/dist/utils/disks/prepareDisks.js.map +1 -1
  198. package/dist/utils/disks/types.d.ts +9 -2
  199. package/dist/utils/hooks/useNodeMetadata.d.ts +2 -0
  200. package/dist/utils/hooks/useNodeMetadata.js +15 -0
  201. package/dist/utils/hooks/useNodeMetadata.js.map +1 -0
  202. package/dist/utils/nodes.js +6 -2
  203. package/dist/utils/nodes.js.map +1 -1
  204. package/dist/utils/storageMetrics.d.ts +2 -2
  205. package/dist/utils/storageMetrics.js +22 -10
  206. package/dist/utils/storageMetrics.js.map +1 -1
  207. package/dist/utils/timeParsers/formatDuration.d.ts +4 -1
  208. package/dist/utils/timeParsers/formatDuration.js +16 -1
  209. package/dist/utils/timeParsers/formatDuration.js.map +1 -1
  210. package/dist/utils/timeParsers/i18n/en.json +5 -1
  211. package/dist/utils/timeParsers/i18n/index.d.ts +1 -1
  212. package/dist/utils/timeParsers/i18n/ru.json +5 -1
  213. package/package.json +2 -2
  214. package/src/components/DiskCapacityInfo/DiskCapacityInfo.tsx +106 -15
  215. package/src/components/DiskPopup/DiskPopup.scss +203 -0
  216. package/src/components/DiskPopup/DiskPopup.tsx +123 -0
  217. package/src/components/DiskPopup/i18n/en.json +3 -0
  218. package/src/components/DiskPopup/i18n/index.ts +5 -0
  219. package/src/components/DiskStatus/DiskStatus.scss +59 -0
  220. package/src/components/DiskStatus/DiskStatus.tsx +149 -0
  221. package/src/components/DiskStatus/i18n/en.json +6 -0
  222. package/src/components/DiskStatus/i18n/index.ts +5 -0
  223. package/src/components/EntityStatus/EntityStatus.tsx +1 -1
  224. package/src/components/EvictVDiskButton/i18n/en.json +1 -1
  225. package/src/components/HoverPopup/HoverPopup.tsx +67 -20
  226. package/src/components/HoverPopup/usePopupPriority.ts +39 -0
  227. package/src/components/PDiskInfo/PDiskLogSize.scss +12 -0
  228. package/src/components/PDiskInfo/PDiskLogSize.tsx +37 -0
  229. package/src/components/PDiskInfo/getPDiskDetails.tsx +37 -0
  230. package/src/components/PDiskInfo/i18n/en.json +64 -8
  231. package/src/components/PDiskInfo/statuses.ts +209 -0
  232. package/src/components/PDiskPopup/PDiskPopup.tsx +62 -147
  233. package/src/components/PDiskPopup/i18n/en.json +2 -12
  234. package/src/components/StorageGroupInfo/StorageGroupInfo.scss +21 -0
  235. package/src/components/StorageGroupInfo/StorageGroupInfo.tsx +121 -260
  236. package/src/components/StorageGroupInfo/i18n/en.json +1 -9
  237. package/src/components/VDisk/VDisk.tsx +31 -34
  238. package/src/components/VDisk/VDiskWithDonorsStack.tsx +2 -0
  239. package/src/components/VDisk/getFlagStatusText.ts +19 -0
  240. package/src/components/VDisk/i18n/en.json +1 -1
  241. package/src/components/VDiskInfo/getVDiskDetails.tsx +41 -0
  242. package/src/components/VDiskInfo/i18n/en.json +3 -10
  243. package/src/components/VDiskPopup/VDiskPopup.scss +3 -10
  244. package/src/components/VDiskPopup/VDiskPopup.tsx +197 -421
  245. package/src/components/VDiskPopup/i18n/en.json +6 -22
  246. package/src/components/VDiskStatus/VDiskReplicationStatus.tsx +77 -0
  247. package/src/components/VDiskStatus/VDiskStatus.scss +32 -0
  248. package/src/components/VDiskStatus/VDiskStatus.tsx +38 -0
  249. package/src/components/VDiskStatus/i18n/en.json +33 -0
  250. package/src/components/VDiskStatus/i18n/index.ts +7 -0
  251. package/src/components/VDiskStatus/index.ts +7 -0
  252. package/src/components/VDiskStatus/statuses.ts +139 -0
  253. package/src/components/capacityMetricsColumns/i18n/en.json +4 -4
  254. package/src/containers/Cluster/ClusterDrawerHealthcheck.tsx +6 -0
  255. package/src/containers/Clusters/ClusterDrawerHealthcheck.tsx +1 -0
  256. package/src/containers/Header/Header.tsx +11 -3
  257. package/src/containers/Header/StorageGroupLeftControls.tsx +38 -0
  258. package/src/containers/Header/i18n/en.json +3 -1
  259. package/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +13 -2
  260. package/src/containers/Storage/Disks/Disks.tsx +66 -12
  261. package/src/containers/Storage/PDisk/PDisk.tsx +3 -0
  262. package/src/containers/Storage/PaginatedStorageGroupsTable/columns/columns.tsx +24 -3
  263. package/src/containers/Storage/StorageExpertModePanel/components/SpaceLegend.scss +14 -82
  264. package/src/containers/Storage/StorageGroupStateLabel.tsx +22 -0
  265. package/src/containers/Storage/utils/getStorageGroupStateLabel.ts +49 -0
  266. package/src/containers/StorageGroupPage/StorageGroupPage.scss +9 -13
  267. package/src/containers/StorageGroupPage/StorageGroupPage.tsx +53 -25
  268. package/src/containers/StorageGroupPage/i18n/en.json +3 -1
  269. package/src/containers/Tenant/Diagnostics/Overview/Overview.tsx +5 -1
  270. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/SchemaObjectInfo.tsx +12 -1
  271. package/src/containers/Tenant/Diagnostics/Overview/SchemaObjectInfo/prepareSchemaObjectInfo.tsx +11 -10
  272. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/StreamingQueryInfo.tsx +83 -20
  273. package/src/containers/Tenant/Diagnostics/Overview/StreamingQueryInfo/i18n/en.json +5 -1
  274. package/src/containers/Tenant/Healthcheck/components/HealthcheckDrawer.tsx +5 -2
  275. package/src/containers/Tenant/TenantDrawerHealthcheck.tsx +10 -0
  276. package/src/containers/Tenants/DatabaseDrawerHealthcheck.tsx +10 -0
  277. package/src/lib.ts +1 -0
  278. package/src/store/reducers/header/types.ts +3 -1
  279. package/src/store/reducers/pdisk/types.ts +1 -0
  280. package/src/store/reducers/pdisk/utils.ts +6 -3
  281. package/src/store/reducers/storage/prepareGroupsDisks.ts +7 -22
  282. package/src/store/reducers/storage/utils.ts +4 -0
  283. package/src/store/reducers/streamingQuery/streamingQuery.ts +2 -4
  284. package/src/styles/mixins.scss +22 -0
  285. package/src/types/api/pdisk.ts +4 -0
  286. package/src/types/api/vdisk.ts +9 -0
  287. package/src/types/store/nodesList.ts +7 -7
  288. package/src/uiFactory/types.ts +9 -2
  289. package/src/utils/bytesParsers/formatBytes.ts +23 -4
  290. package/src/utils/disks/constants.ts +5 -0
  291. package/src/utils/disks/diskInfo/getDiskLocationItems.ts +50 -0
  292. package/src/utils/disks/diskInfo/i18n/en.json +9 -0
  293. package/src/utils/disks/diskInfo/i18n/index.ts +5 -0
  294. package/src/utils/disks/iconCalculators.ts +1 -1
  295. package/src/utils/disks/prepareDisks.ts +21 -47
  296. package/src/utils/disks/types.ts +10 -2
  297. package/src/utils/hooks/useNodeMetadata.ts +21 -0
  298. package/src/utils/nodes.ts +6 -1
  299. package/src/utils/storageMetrics.ts +27 -14
  300. package/src/utils/timeParsers/formatDuration.ts +22 -1
  301. package/src/utils/timeParsers/i18n/en.json +5 -1
  302. package/src/utils/timeParsers/i18n/ru.json +5 -1
@@ -0,0 +1,149 @@
1
+ import type {IconData, LabelProps} from '@gravity-ui/uikit';
2
+ import {Icon, Label, Tooltip} from '@gravity-ui/uikit';
3
+ import {capitalize} from 'lodash';
4
+
5
+ import {EFlag, isCapacityAlert} from '../../types/api/enums';
6
+ import {normalizeCapacityAlert} from '../../utils/capacityAlerts';
7
+ import {cn} from '../../utils/cn';
8
+ import {formatPDiskType} from '../../utils/disks/getPDiskType';
9
+ import {getDisplaySeverityColor} from '../../utils/disks/helpers';
10
+ import {getFlagIconWithColor} from '../../utils/disks/iconCalculators';
11
+ import {normalizeMediaType} from '../../utils/disks/normalizeMediaType';
12
+ import {calculateSpaceSeverity} from '../../utils/disks/severityCalculators';
13
+ import {EFlagToLabelTheme} from '../EntityStatus/EntityStatus';
14
+ import {getFlagStatusText} from '../VDisk/getFlagStatusText';
15
+
16
+ import i18n from './i18n';
17
+
18
+ import './DiskStatus.scss';
19
+
20
+ const b = cn('ydb-disk-status');
21
+
22
+ export interface DiskStatusLabelData {
23
+ value: string;
24
+ title?: string;
25
+ theme?: LabelProps['theme'];
26
+ icon?: IconData;
27
+ tooltip?: string;
28
+ dangerHeavy?: boolean;
29
+ }
30
+
31
+ export type TitledDiskStatusLabelData = Omit<DiskStatusLabelData, 'title' | 'value'> & {
32
+ title: string;
33
+ value?: string;
34
+ };
35
+
36
+ export function DiskStatusLabel({
37
+ value,
38
+ theme = 'normal',
39
+ icon,
40
+ title,
41
+ tooltip,
42
+ dangerHeavy,
43
+ size = 's',
44
+ iconSize = 12,
45
+ className,
46
+ }: (DiskStatusLabelData | TitledDiskStatusLabelData) &
47
+ Pick<LabelProps, 'size' | 'className'> & {iconSize?: number}) {
48
+ const label = (
49
+ <Label
50
+ size={size}
51
+ theme={theme}
52
+ className={b('label', {'danger-heavy': dangerHeavy}, className)}
53
+ icon={icon ? <Icon data={icon} size={iconSize} /> : undefined}
54
+ value={title ? value : undefined}
55
+ >
56
+ {title ?? value}
57
+ </Label>
58
+ );
59
+ return tooltip ? (
60
+ <Tooltip content={tooltip} placement="top">
61
+ <span tabIndex={0} className={b('tooltip')}>
62
+ {label}
63
+ </span>
64
+ </Tooltip>
65
+ ) : (
66
+ label
67
+ );
68
+ }
69
+
70
+ export function DiskTypeLabel({type, size}: {type?: string} & Pick<LabelProps, 'size'>) {
71
+ if (!type?.trim()) {
72
+ return null;
73
+ }
74
+ const mediaType = normalizeMediaType(type);
75
+ const value = formatPDiskType(mediaType) ?? mediaType;
76
+ let tooltip: string | undefined;
77
+ switch (mediaType) {
78
+ case 'HDD':
79
+ tooltip = i18n('context_hdd');
80
+ break;
81
+ case 'SSD':
82
+ tooltip = i18n('context_ssd');
83
+ break;
84
+ case 'NVME':
85
+ tooltip = i18n('context_nvme');
86
+ break;
87
+ }
88
+ return (
89
+ <DiskStatusLabel
90
+ value={value}
91
+ tooltip={tooltip}
92
+ size={size}
93
+ className={b('type', {
94
+ hdd: mediaType === 'HDD',
95
+ ssd: mediaType === 'SSD',
96
+ nvme: mediaType === 'NVME',
97
+ })}
98
+ />
99
+ );
100
+ }
101
+
102
+ export function DiskCapacityAlertLabel({
103
+ value,
104
+ emptyText = i18n('value_no-data'),
105
+ }: {
106
+ value?: string;
107
+ emptyText?: string;
108
+ }) {
109
+ const capacityAlert = normalizeCapacityAlert(value);
110
+ if (!capacityAlert) {
111
+ return <DiskStatusLabel size="xs" value={emptyText} theme="unknown" />;
112
+ }
113
+ const color = isCapacityAlert(capacityAlert)
114
+ ? getDisplaySeverityColor(
115
+ calculateSpaceSeverity({CapacityAlert: capacityAlert}),
116
+ ).toLowerCase()
117
+ : undefined;
118
+ return (
119
+ <DiskStatusLabel
120
+ size="xs"
121
+ value={capitalize(capacityAlert.replaceAll('_', ' '))}
122
+ className={b('capacity-alert', {color})}
123
+ />
124
+ );
125
+ }
126
+
127
+ export function DiskFlagLabel({
128
+ flag,
129
+ title,
130
+ icon,
131
+ emptyText = i18n('value_no-data'),
132
+ }: {
133
+ flag?: EFlag;
134
+ title?: string;
135
+ icon?: IconData;
136
+ emptyText?: string;
137
+ }) {
138
+ const resolvedFlag = flag || EFlag.Grey;
139
+ return (
140
+ <DiskStatusLabel
141
+ value={resolvedFlag === EFlag.Grey ? emptyText : getFlagStatusText(resolvedFlag)}
142
+ title={title}
143
+ theme={EFlagToLabelTheme[resolvedFlag] ?? 'normal'}
144
+ icon={icon ?? getFlagIconWithColor(resolvedFlag)?.icon}
145
+ dangerHeavy={resolvedFlag === EFlag.Red}
146
+ size="xs"
147
+ />
148
+ );
149
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "value_no-data": "Not available",
3
+ "context_hdd": "Hard disk drive",
4
+ "context_ssd": "Solid-state drive connected over SATA or SAS interface",
5
+ "context_nvme": "Solid-state drive connected over NVMe interface"
6
+ }
@@ -0,0 +1,5 @@
1
+ import {registerKeysets} from '../../../utils/i18n';
2
+
3
+ import en from './en.json';
4
+
5
+ export default registerKeysets('ydb-disk-status', {en});
@@ -14,7 +14,7 @@ import './EntityStatus.scss';
14
14
 
15
15
  const b = cn('ydb-entity-status');
16
16
 
17
- const EFlagToLabelTheme: Record<EFlag, LabelProps['theme']> = {
17
+ export const EFlagToLabelTheme: Record<EFlag, LabelProps['theme']> = {
18
18
  [EFlag.Red]: 'danger',
19
19
  [EFlag.Blue]: 'success',
20
20
  [EFlag.Green]: 'success',
@@ -3,7 +3,7 @@
3
3
  "action_evict-short": "Evict",
4
4
  "action_force-evict": "Evict anyway",
5
5
  "title_evict-dialog": "Evict VDisk?",
6
- "confirm_evict": "The VDisk will be evicted from the PDisk. All data will be moved to another PDisk.",
6
+ "confirm_evict": "The VDisk will be evicted from the PDisk. This VDisk will be replaced by a new one in the group. Data will be replicated to the new disk. The old VDisk will serve as a donor until replication is complete, and then it will be removed.",
7
7
  "alert_evict": "This operation cannot be cancelled.",
8
8
  "alert_not-allowed": "You don't have enough rights to evict VDisk",
9
9
  "alert_donor-mode-impossible": "Evicting a donor VDisk is not possible"
@@ -8,26 +8,38 @@ import {YDB_POPOVER_CLASS_NAME} from '../../utils/constants';
8
8
  import {useEventHandler} from '../../utils/hooks/useEventHandler';
9
9
 
10
10
  import {getPopupScrollContainer} from './getPopupScrollContainer';
11
+ import {usePopupPriority} from './usePopupPriority';
11
12
 
12
13
  const DEBOUNCE_TIMEOUT = 100;
13
14
 
14
- function useVisibleAnchor(anchorElement: HTMLElement | null, open: boolean) {
15
+ function useVisibleAnchor(
16
+ anchorElement: HTMLElement | null,
17
+ open: boolean,
18
+ onHidden: VoidFunction,
19
+ ) {
15
20
  const [visibleAnchor, setVisibleAnchor] = React.useState<HTMLElement | null>(null);
21
+ // Mouse events can arrive before React renders the observer's next visibility state.
22
+ const visibleAnchorRef = React.useRef<HTMLElement | null>(null);
16
23
 
17
24
  React.useLayoutEffect(() => {
18
25
  setVisibleAnchor(null);
26
+ visibleAnchorRef.current = null;
19
27
  if (!open || !anchorElement) {
20
28
  return undefined;
21
29
  }
22
30
 
23
31
  const observer = new IntersectionObserver(([entry]) => {
24
- setVisibleAnchor(entry.isIntersecting ? anchorElement : null);
32
+ visibleAnchorRef.current = entry.isIntersecting ? anchorElement : null;
33
+ setVisibleAnchor(visibleAnchorRef.current);
34
+ if (!entry.isIntersecting) {
35
+ onHidden();
36
+ }
25
37
  });
26
38
  observer.observe(anchorElement);
27
39
  return () => observer.disconnect();
28
- }, [anchorElement, open]);
40
+ }, [anchorElement, open, onHidden]);
29
41
 
30
- return anchorElement !== null && visibleAnchor === anchorElement;
42
+ return [anchorElement !== null && visibleAnchor === anchorElement, visibleAnchorRef] as const;
31
43
  }
32
44
 
33
45
  type HoverPopupProps = {
@@ -37,6 +49,7 @@ type HoverPopupProps = {
37
49
  anchorRef?: React.RefObject<HTMLElement>;
38
50
  onShowPopup?: VoidFunction;
39
51
  onHidePopup?: VoidFunction;
52
+ onClosePopup?: VoidFunction;
40
53
  delayOpen?: number;
41
54
  delayClose?: number;
42
55
  contentClassName?: string;
@@ -50,6 +63,7 @@ export const HoverPopup = ({
50
63
  anchorRef,
51
64
  onShowPopup,
52
65
  onHidePopup,
66
+ onClosePopup,
53
67
  placement = ['top', 'bottom', 'left', 'right'],
54
68
  contentClassName,
55
69
  delayClose = DEBOUNCE_TIMEOUT,
@@ -60,6 +74,8 @@ export const HoverPopup = ({
60
74
  const [isFocused, setIsFocused] = React.useState(false);
61
75
 
62
76
  const anchor = React.useRef<HTMLSpanElement>(null);
77
+ const {activate, zIndex} = usePopupPriority();
78
+ const bringToFront = useEventHandler(() => activate(anchorRef?.current || anchor.current));
63
79
 
64
80
  const reportedOpenRef = React.useRef(false);
65
81
 
@@ -113,9 +129,33 @@ export const HoverPopup = ({
113
129
  setIsPopupContentHovered(false);
114
130
  setIsFocused(false);
115
131
  reportOpen(false, true);
116
- }, [debouncedHandleHidePopup, debouncedHandleShowPopup, reportOpen]);
132
+ onClosePopup?.();
133
+ }, [debouncedHandleHidePopup, debouncedHandleShowPopup, onClosePopup, reportOpen]);
117
134
 
118
- const onMouseEnter = () => {
135
+ const hideClippedPopup = useEventHandler(() => {
136
+ debouncedHandleShowPopup.cancel();
137
+ setIsPopupContentHovered(false);
138
+ setIsFocused(false);
139
+ debouncedHandleHidePopup();
140
+ });
141
+
142
+ const internalOpen = isPopupVisible || isPopupContentHovered || isFocused;
143
+ const open = Boolean(internalOpen || showPopup);
144
+
145
+ const anchorElement = anchorRef?.current || anchor.current;
146
+ // Release only this popup's hover source; a hovered peer can keep the pair open.
147
+ const [isAnchorVisible, visibleAnchorRef] = useVisibleAnchor(
148
+ anchorElement,
149
+ open,
150
+ hideClippedPopup,
151
+ );
152
+ const container = getPopupScrollContainer(anchorElement);
153
+
154
+ const onMouseEnter = (event: React.MouseEvent<HTMLSpanElement>) => {
155
+ if (event.buttons !== 0) {
156
+ return;
157
+ }
158
+ bringToFront();
119
159
  debouncedHandleHidePopup.cancel();
120
160
  debouncedHandleShowPopup();
121
161
  };
@@ -125,11 +165,21 @@ export const HoverPopup = ({
125
165
  debouncedHandleHidePopup();
126
166
  };
127
167
 
128
- const onPopupMouseEnter = React.useCallback(() => {
129
- debouncedHandleHidePopup.cancel();
130
- setIsPopupContentHovered(true);
131
- reportOpen(true);
132
- }, [reportOpen, debouncedHandleHidePopup]);
168
+ const onPopupMouseEnter = React.useCallback(
169
+ (event: React.MouseEvent<HTMLDivElement>) => {
170
+ // An exiting popup can still receive events during its close animation.
171
+ if (!open || visibleAnchorRef.current !== anchorElement) {
172
+ return;
173
+ }
174
+ if (event.buttons === 0) {
175
+ bringToFront();
176
+ }
177
+ debouncedHandleHidePopup.cancel();
178
+ setIsPopupContentHovered(true);
179
+ reportOpen(true);
180
+ },
181
+ [bringToFront, reportOpen, debouncedHandleHidePopup, open, visibleAnchorRef, anchorElement],
182
+ );
133
183
 
134
184
  const onPopupMouseLeave = React.useCallback(() => {
135
185
  setIsPopupContentHovered(false);
@@ -137,9 +187,13 @@ export const HoverPopup = ({
137
187
  }, [debouncedHandleHidePopup]);
138
188
 
139
189
  const onPopupContextMenu = React.useCallback(() => {
190
+ if (!open || visibleAnchorRef.current !== anchorElement) {
191
+ return;
192
+ }
193
+ bringToFront();
140
194
  setIsFocused(true);
141
195
  reportOpen(true);
142
- }, [reportOpen]);
196
+ }, [bringToFront, reportOpen, open, visibleAnchorRef, anchorElement]);
143
197
 
144
198
  const onPopupBlur = React.useCallback(() => {
145
199
  setIsFocused(false);
@@ -149,14 +203,6 @@ export const HoverPopup = ({
149
203
  closePopup();
150
204
  }, [closePopup]);
151
205
 
152
- const internalOpen = isPopupVisible || isPopupContentHovered || isFocused;
153
- const open = Boolean(internalOpen || showPopup);
154
-
155
- const anchorElement = anchorRef?.current || anchor.current;
156
- // Clipping a paired disk must not clear the shared hover state via onHidePopup.
157
- const isAnchorVisible = useVisibleAnchor(anchorElement, open);
158
- const container = getPopupScrollContainer(anchorElement);
159
-
160
206
  return (
161
207
  <React.Fragment>
162
208
  <span ref={anchor} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>
@@ -165,6 +211,7 @@ export const HoverPopup = ({
165
211
  {anchorElement ? (
166
212
  <Popup
167
213
  container={container}
214
+ zIndex={zIndex}
168
215
  // Keep portal typography when the page uses a different font.
169
216
  floatingStyles={{fontFamily: 'var(--g-text-body-font-family)'}}
170
217
  anchorElement={anchorElement}
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+
3
+ // Only the previously active popup needs updating when another one is entered.
4
+ const activePopups = new WeakMap<Document, VoidFunction>();
5
+
6
+ export function usePopupPriority() {
7
+ const [active, setActive] = React.useState(false);
8
+ const documentRef = React.useRef<Document>();
9
+ const deactivate = React.useCallback(() => setActive(false), []);
10
+ const activate = React.useCallback(
11
+ (element: HTMLElement | null) => {
12
+ if (!element) {
13
+ return;
14
+ }
15
+ const doc = element.ownerDocument;
16
+ const previous = activePopups.get(doc);
17
+ if (previous !== deactivate) {
18
+ previous?.();
19
+ activePopups.set(doc, deactivate);
20
+ }
21
+ documentRef.current = doc;
22
+ setActive(true);
23
+ },
24
+ [deactivate],
25
+ );
26
+
27
+ React.useEffect(
28
+ () => () => {
29
+ const doc = documentRef.current;
30
+ if (doc && activePopups.get(doc) === deactivate) {
31
+ activePopups.delete(doc);
32
+ }
33
+ },
34
+ [deactivate],
35
+ );
36
+
37
+ // Keep tooltips, menus and modal dialogs (Gravity UI's default 1000) above cards.
38
+ return {activate, zIndex: active ? 999 : 998};
39
+ }
@@ -0,0 +1,12 @@
1
+ .ydb-pdisk-log-size {
2
+ width: 100%;
3
+
4
+ white-space: nowrap;
5
+
6
+ &__progress {
7
+ flex: 0 0 auto;
8
+
9
+ width: var(--ydb-pdisk-log-size-progress-width, 100px);
10
+ margin: 0;
11
+ }
12
+ }
@@ -0,0 +1,37 @@
1
+ import {Flex, Progress} from '@gravity-ui/uikit';
2
+
3
+ import {cn} from '../../utils/cn';
4
+ import {formatStorageMetricPair} from '../../utils/storageMetrics';
5
+ import {parseOptionalNonNegativeNumber} from '../../utils/utils';
6
+
7
+ import {pDiskInfoKeyset as i18n} from './i18n';
8
+
9
+ import './PDiskLogSize.scss';
10
+
11
+ const b = cn('ydb-pdisk-log-size');
12
+
13
+ export function PDiskLogSize({used, total}: {used?: string; total?: string}) {
14
+ const usedSize = parseOptionalNonNegativeNumber(used);
15
+ const totalSize = parseOptionalNonNegativeNumber(total);
16
+ const percentage =
17
+ usedSize !== undefined && totalSize !== undefined && totalSize > 0
18
+ ? Math.min(100, (usedSize / totalSize) * 100)
19
+ : undefined;
20
+
21
+ if (percentage === undefined) {
22
+ return formatStorageMetricPair(usedSize, totalSize, 2);
23
+ }
24
+
25
+ return (
26
+ <Flex gap={1} alignItems="center" className={b()}>
27
+ <Progress
28
+ className={b('progress')}
29
+ value={percentage}
30
+ theme="success"
31
+ size="s"
32
+ aria-label={i18n('log-size')}
33
+ />
34
+ <span>{formatStorageMetricPair(usedSize, totalSize, 2)}</span>
35
+ </Flex>
36
+ );
37
+ }
@@ -0,0 +1,37 @@
1
+ import {formatBytes} from '../../utils/bytesParsers';
2
+ import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
3
+ import type {DiskDetailItem} from '../../utils/disks/diskInfo/getDiskLocationItems';
4
+ import type {PreparedPDisk} from '../../utils/disks/types';
5
+ import {parseOptionalNonNegativeNumber} from '../../utils/utils';
6
+ import {DiskFlagLabel} from '../DiskStatus/DiskStatus';
7
+
8
+ import {PDiskLogSize} from './PDiskLogSize';
9
+ import {pDiskInfoKeyset as i18n} from './i18n';
10
+
11
+ export function getPDiskRuntimeItems(data: PreparedPDisk): DiskDetailItem[] {
12
+ return [
13
+ {id: 'device', name: i18n('device'), content: <DiskFlagLabel flag={data.Device} />},
14
+ {id: 'realtime', name: i18n('realtime'), content: <DiskFlagLabel flag={data.Realtime} />},
15
+ ];
16
+ }
17
+
18
+ export function getPDiskLogItems(data: PreparedPDisk): DiskDetailItem[] {
19
+ const systemSize = parseOptionalNonNegativeNumber(data.SystemSize);
20
+ return [
21
+ {
22
+ id: 'log-size',
23
+ name: i18n('log-size'),
24
+ content: <PDiskLogSize used={data.LogUsedSize} total={data.LogTotalSize} />,
25
+ note: i18n('context_log-size'),
26
+ },
27
+ {
28
+ id: 'system-size',
29
+ name: i18n('system-size'),
30
+ content:
31
+ systemSize === undefined
32
+ ? EMPTY_DATA_PLACEHOLDER
33
+ : formatBytes({value: systemSize, fixedDecimalPlaces: 2}),
34
+ note: i18n('context_system-size'),
35
+ },
36
+ ];
37
+ }
@@ -4,23 +4,79 @@
4
4
  "guid": "GUID",
5
5
  "serial-number": "Serial Number",
6
6
  "shared-with-os": "SharedWithOs",
7
-
8
7
  "drive-status": "Drive Status",
9
8
  "state": "State",
10
9
  "device": "Device",
11
10
  "realtime": "Realtime",
12
-
13
- "value_no-data": "No data",
14
-
11
+ "value_no-data": "Not Available",
15
12
  "space": "Space",
16
13
  "usage": "Usage",
17
14
  "slots": "Slots",
18
15
  "log-size": "Log Size",
19
16
  "system-size": "System Size",
20
-
21
17
  "links": "Links",
22
-
23
18
  "developer-ui": "Developer UI",
24
-
25
- "yes": "Yes"
19
+ "yes": "Yes",
20
+ "context_slots": "The number of VDisks residing on this PDisk",
21
+ "context_log-size": "The size of the Common Log shared by the residing VDisks",
22
+ "context_system-size": "The size reserved for the PDisk system components. Includes SysLog",
23
+ "value_unknown": "Unknown",
24
+ "value_ok": "Ok",
25
+ "value_initial": "Initial",
26
+ "value_initial-format-read": "Initial Format Read",
27
+ "value_initial-sys-log-read": "Initial Sys Log Read",
28
+ "value_initial-common-log-read": "Initial Common Log Read",
29
+ "value_open-file-error": "Open File Error",
30
+ "value_device-io-error": "Device Io Error",
31
+ "value_stopped": "Stopped",
32
+ "value_initial-format-read-error": "Initial Format Read Error",
33
+ "value_initial-sys-log-read-error": "Initial Sys Log Read Error",
34
+ "value_initial-sys-log-parse-error": "Initial Sys Log Parse Error",
35
+ "value_common-logger-init-error": "Common Logger Init Error",
36
+ "value_initial-common-log-read-error": "Initial Common Log Read Error",
37
+ "value_initial-common-log-parse-error": "Initial Common Log Parse Error",
38
+ "value_chunk-quota-error": "Chunk Quota Error",
39
+ "value_active": "Active",
40
+ "value_inactive": "Inactive",
41
+ "value_to-be-removed": "To be removed",
42
+ "value_faulty": "Faulty",
43
+ "value_broken": "Broken",
44
+ "value_decommit-none": "No decommission",
45
+ "value_decommit-pending": "Decommission pending",
46
+ "value_decommit-rejected": "Decommission rejected",
47
+ "value_decommit-imminent": "Decommission imminent",
48
+ "label_maintenance": "Maintenance",
49
+ "value_maintenance-none": "None",
50
+ "value_maintenance-unset": "Unset",
51
+ "value_maintenance-no-new-vdisks": "No new VDisks",
52
+ "value_maintenance-long-term": "Long term",
53
+ "context_unknown": "Value of status is unknown (default)",
54
+ "context_state-normal": "The PDisk is operating normally",
55
+ "context_state-initial": "The PDisk actor is starting and has not yet begun reading disk metadata",
56
+ "context_initial-format-read": "The PDisk is reading and validating its format record",
57
+ "context_initial-sys-log-read": "The PDisk is reading its system log during startup",
58
+ "context_initial-common-log-read": "The PDisk is reading VDisk common log during startup",
59
+ "context_open-file-error": "The PDisk could not open its backing device",
60
+ "context_device-io-error": "The PDisk encountered a fatal physical device I/O error",
61
+ "context_stopped": "The PDisk was explicitly stopped by a control request",
62
+ "context_initial-format-read-error": "The format record could not be read or validated",
63
+ "context_initial-sys-log-read-error": "The system log could not be read",
64
+ "context_initial-sys-log-parse-error": "The system log was read but could not be parsed",
65
+ "context_common-logger-init-error": "The PDisk failed to initialize the VDisk common log writer",
66
+ "context_initial-common-log-read-error": "VDisk common log could not be read",
67
+ "context_initial-common-log-parse-error": "VDisk common log was read but could not be parsed",
68
+ "context_chunk-quota-error": "The PDisk failed to calculate or initialize chunk quotas",
69
+ "context_active": "Working as expected",
70
+ "context_inactive": "New groups are not created over this drive, but existing ones continue to work as expected",
71
+ "context_to-be-removed": "Same as INACTIVE, but drive is counted in fault model as not working",
72
+ "context_faulty": "Drive is expected to become BROKEN soon, new groups are not created, old groups are asynchronously moved out from this drive",
73
+ "context_broken": "Drive is not working, groups are automatically moved out of this drive upon reception of this status",
74
+ "context_decommit-none": "The PDisk is not being decommissioned",
75
+ "context_decommit-pending": "Decommissioning is planned; allocation of new VDisks is blocked, existing VDisks are not moved",
76
+ "context_decommit-rejected": "The PDisk is operational but cannot receive VDisks moved from the other decommitted PDisks",
77
+ "context_decommit-imminent": "Active phase of decommissioning, existing VDisks are moved from the PDisk asynchronously",
78
+ "context_maintenance-none": "There is no active maintenance request for this PDisk",
79
+ "context_maintenance-unset": "No maintenance status has been explicitly provided",
80
+ "context_maintenance-no-new-vdisks": "Allocation of new VDisks is blocked, existing VDisks are not moved",
81
+ "context_maintenance-long-term": "Device is requested for a long-term maintenance, existing VDisks are moved from the PDisk asynchronously"
26
82
  }