@@ -191,6 +191,7 @@ const prepareStorageGroups = (
191
191
const prepareStorageNodeData = (
192
192
node : TNodeInfo ,
193
193
maximumSlotsPerDisk : string ,
194
+ maximumDisksPerNode : string ,
194
195
) : PreparedStorageNode => {
195
196
const missing =
196
197
node . PDisks ?. filter ( ( pDisk ) => {
@@ -218,35 +219,59 @@ const prepareStorageNodeData = (
218
219
VDisks : vDisks ,
219
220
Missing : missing ,
220
221
MaximumSlotsPerDisk : maximumSlotsPerDisk ,
222
+ MaximumDisksPerNode : maximumDisksPerNode ,
221
223
} ;
222
224
} ;
223
225
226
+ /**
227
+ * Calculates the maximum number of VDisk slots per PDisk across all nodes
228
+ * A slot represents a VDisk that can be allocated to a PDisk
229
+ */
224
230
export const calculateMaximumSlotsPerDisk = (
225
231
nodes : TNodeInfo [ ] | undefined ,
226
232
providedMaximumSlotsPerDisk ?: string ,
227
- ) => {
233
+ ) : string => {
228
234
if ( providedMaximumSlotsPerDisk ) {
229
235
return providedMaximumSlotsPerDisk ;
230
236
}
231
237
232
- return String (
233
- Math . max (
234
- 1 ,
235
- ...( nodes || [ ] ) . flatMap ( ( node ) =>
236
- ( node . PDisks || [ ] ) . map (
237
- ( pDisk ) =>
238
- ( node . VDisks || [ ] ) . filter ( ( vDisk ) => vDisk . PDiskId === pDisk . PDiskId )
239
- . length || 0 ,
240
- ) ,
241
- ) ,
242
- ) ,
243
- ) ;
238
+ const safeNodes = nodes || [ ] ;
239
+ const slotsPerDiskCounts = safeNodes . flatMap ( ( node ) => {
240
+ const safePDisks = node . PDisks || [ ] ;
241
+ const safeVDisks = node . VDisks || [ ] ;
242
+
243
+ return safePDisks . map ( ( pDisk ) => {
244
+ const vDisksOnPDisk = safeVDisks . filter ( ( vDisk ) => vDisk . PDiskId === pDisk . PDiskId ) ;
245
+ return vDisksOnPDisk . length || 0 ;
246
+ } ) ;
247
+ } ) ;
248
+
249
+ const maxSlots = Math . max ( 1 , ...slotsPerDiskCounts ) ;
250
+ return String ( maxSlots ) ;
251
+ } ;
252
+
253
+ /**
254
+ * Calculates the maximum number of PDisks per node across all nodes
255
+ */
256
+ export const calculateMaximumDisksPerNode = (
257
+ nodes : TNodeInfo [ ] | undefined ,
258
+ providedMaximumDisksPerNode ?: string ,
259
+ ) : string => {
260
+ if ( providedMaximumDisksPerNode ) {
261
+ return providedMaximumDisksPerNode ;
262
+ }
263
+
264
+ const safeNodes = nodes || [ ] ;
265
+ const disksPerNodeCounts = safeNodes . map ( ( node ) => node . PDisks ?. length || 0 ) ;
266
+ const maxDisks = Math . max ( 1 , ...disksPerNodeCounts ) ;
267
+ return String ( maxDisks ) ;
244
268
} ;
245
269
246
270
// ==== Prepare responses ====
247
271
248
272
export const prepareStorageNodesResponse = ( data : TNodesInfo ) : PreparedStorageResponse => {
249
- const { Nodes, TotalNodes, FoundNodes, NodeGroups, MaximumSlotsPerDisk} = data ;
273
+ const { Nodes, TotalNodes, FoundNodes, NodeGroups, MaximumSlotsPerDisk, MaximumDisksPerNode} =
274
+ data ;
250
275
251
276
const tableGroups = NodeGroups ?. map ( ( { GroupName, NodeCount} ) => {
252
277
if ( GroupName && NodeCount ) {
@@ -259,7 +284,10 @@ export const prepareStorageNodesResponse = (data: TNodesInfo): PreparedStorageRe
259
284
} ) . filter ( ( group ) : group is TableGroup => Boolean ( group ) ) ;
260
285
261
286
const maximumSlots = calculateMaximumSlotsPerDisk ( Nodes , MaximumSlotsPerDisk ) ;
262
- const preparedNodes = Nodes ?. map ( ( node ) => prepareStorageNodeData ( node , maximumSlots ) ) ;
287
+ const maximumDisks = calculateMaximumDisksPerNode ( Nodes , MaximumDisksPerNode ) ;
288
+ const preparedNodes = Nodes ?. map ( ( node ) =>
289
+ prepareStorageNodeData ( node , maximumSlots , maximumDisks ) ,
290
+ ) ;
263
291
264
292
return {
265
293
nodes : preparedNodes ,
0 commit comments