@@ -191,6 +191,7 @@ const prepareStorageGroups = (
191191const prepareStorageNodeData = (
192192 node : TNodeInfo ,
193193 maximumSlotsPerDisk : string ,
194+ maximumDisksPerNode : string ,
194195) : PreparedStorageNode => {
195196 const missing =
196197 node . PDisks ?. filter ( ( pDisk ) => {
@@ -218,35 +219,59 @@ const prepareStorageNodeData = (
218219 VDisks : vDisks ,
219220 Missing : missing ,
220221 MaximumSlotsPerDisk : maximumSlotsPerDisk ,
222+ MaximumDisksPerNode : maximumDisksPerNode ,
221223 } ;
222224} ;
223225
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+ */
224230export const calculateMaximumSlotsPerDisk = (
225231 nodes : TNodeInfo [ ] | undefined ,
226232 providedMaximumSlotsPerDisk ?: string ,
227- ) => {
233+ ) : string => {
228234 if ( providedMaximumSlotsPerDisk ) {
229235 return providedMaximumSlotsPerDisk ;
230236 }
231237
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 ) ;
244268} ;
245269
246270// ==== Prepare responses ====
247271
248272export const prepareStorageNodesResponse = ( data : TNodesInfo ) : PreparedStorageResponse => {
249- const { Nodes, TotalNodes, FoundNodes, NodeGroups, MaximumSlotsPerDisk} = data ;
273+ const { Nodes, TotalNodes, FoundNodes, NodeGroups, MaximumSlotsPerDisk, MaximumDisksPerNode} =
274+ data ;
250275
251276 const tableGroups = NodeGroups ?. map ( ( { GroupName, NodeCount} ) => {
252277 if ( GroupName && NodeCount ) {
@@ -259,7 +284,10 @@ export const prepareStorageNodesResponse = (data: TNodesInfo): PreparedStorageRe
259284 } ) . filter ( ( group ) : group is TableGroup => Boolean ( group ) ) ;
260285
261286 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+ ) ;
263291
264292 return {
265293 nodes : preparedNodes ,
0 commit comments