@@ -64,8 +64,8 @@ interface NodeUsageData {
64
64
65
65
interface WorkloadGroupDetails {
66
66
name : string ;
67
- cpuLimit : number | string ;
68
- memLimit : number | string ;
67
+ cpuLimit : number | undefined ;
68
+ memLimit : number | undefined ;
69
69
resiliencyMode : 'soft' | 'enforced' ;
70
70
description : string ;
71
71
}
@@ -138,8 +138,8 @@ export const WLMDetails = ({
138
138
// === State ===
139
139
const [ groupDetails , setGroupDetails ] = useState < WorkloadGroupDetails | null > ( null ) ;
140
140
const [ resiliencyMode , setResiliencyMode ] = useState < ResiliencyMode > ( ResiliencyMode . SOFT ) ;
141
- const [ cpuLimit , setCpuLimit ] = useState ( DEFAULT_RESOURCE_LIMIT ) ;
142
- const [ memoryLimit , setMemoryLimit ] = useState ( DEFAULT_RESOURCE_LIMIT ) ;
141
+ const [ cpuLimit , setCpuLimit ] = useState < number | undefined > ( ) ;
142
+ const [ memoryLimit , setMemoryLimit ] = useState < number | undefined > ( ) ;
143
143
const [ isSaved , setIsSaved ] = useState ( true ) ;
144
144
const [ nodesData , setNodesData ] = useState < NodeUsageData [ ] > ( [ ] ) ;
145
145
const [ sortedData , setSortedData ] = useState < NodeUsageData [ ] > ( [ ] ) ;
@@ -230,18 +230,14 @@ export const WLMDetails = ({
230
230
if ( workload ) {
231
231
setGroupDetails ( {
232
232
name : workload . name ,
233
- cpuLimit :
234
- workload . resource_limits ?. cpu != null ? formatLimit ( workload . resource_limits . cpu ) : '-' ,
235
- memLimit :
236
- workload . resource_limits ?. memory != null
237
- ? formatLimit ( workload . resource_limits . memory )
238
- : '-' ,
233
+ cpuLimit : formatLimit ( workload . resource_limits ?. cpu ) ,
234
+ memLimit : formatLimit ( workload . resource_limits ?. memory ) ,
239
235
resiliencyMode : workload . resiliency_mode ,
240
236
description : '-' ,
241
237
} ) ;
242
238
setResiliencyMode ( workload . resiliency_mode . toLowerCase ( ) ) ;
243
- setCpuLimit ( formatLimit ( workload . resource_limits . cpu ) ) ;
244
- setMemoryLimit ( formatLimit ( workload . resource_limits . memory ) ) ;
239
+ setCpuLimit ( formatLimit ( workload . resource_limits ? .cpu ) ) ;
240
+ setMemoryLimit ( formatLimit ( workload . resource_limits ? .memory ) ) ;
245
241
}
246
242
} catch ( err ) {
247
243
console . error ( 'Failed to fetch workload group details:' , err ) ;
@@ -291,11 +287,11 @@ export const WLMDetails = ({
291
287
292
288
const statsForGroup = data . workload_groups [ groupId ] ;
293
289
294
- if ( statsForGroup ) {
290
+ if ( statsForGroup && statsForGroup . cpu && statsForGroup . memory ) {
295
291
nodeStatsList . push ( {
296
292
nodeId,
297
- cpuUsage : formatLimit ( statsForGroup . cpu ? .current_usage ) ,
298
- memoryUsage : formatLimit ( statsForGroup . memory ? .current_usage ) ,
293
+ cpuUsage : formatUsage ( statsForGroup . cpu . current_usage ) ,
294
+ memoryUsage : formatUsage ( statsForGroup . memory . current_usage ) ,
299
295
} ) ;
300
296
}
301
297
}
@@ -309,23 +305,32 @@ export const WLMDetails = ({
309
305
310
306
// === Actions ===
311
307
const saveChanges = async ( ) => {
312
- if ( cpuLimit <= 0 || cpuLimit > 100 || memoryLimit <= 0 || memoryLimit > 100 ) {
308
+ const validCpu = cpuLimit === undefined || ( cpuLimit > 0 && cpuLimit <= 100 ) ;
309
+ const validMem = memoryLimit === undefined || ( memoryLimit > 0 && memoryLimit <= 100 ) ;
310
+
311
+ if ( ! resiliencyMode || ( ! validCpu && ! validMem ) ) {
313
312
core . notifications . toasts . addDanger (
314
- 'CPU and Memory limits must be between 0 and 100 (exclusive of 0) '
313
+ 'Resiliency mode is required and at least one of CPU or memory limits must be valid (1–100). '
315
314
) ;
316
315
return ;
317
316
}
318
317
318
+ const resourceLimits : Record < string , number > = { } ;
319
+ if ( cpuLimit !== undefined ) resourceLimits . cpu = cpuLimit / 100 ;
320
+ if ( memoryLimit !== undefined ) resourceLimits . memory = memoryLimit / 100 ;
321
+
322
+ const body : Record < string , any > = {
323
+ resiliency_mode : resiliencyMode . toUpperCase ( ) ,
324
+ } ;
325
+
326
+ if ( Object . keys ( resourceLimits ) . length > 0 ) {
327
+ body . resource_limits = resourceLimits ;
328
+ }
329
+
319
330
try {
320
331
await core . http . put ( `/api/_wlm/workload_group/${ groupName } ` , {
321
332
query : { dataSourceId : dataSource . id } ,
322
- body : JSON . stringify ( {
323
- resiliency_mode : resiliencyMode ,
324
- resource_limits : {
325
- cpu : cpuLimit / 100 ,
326
- memory : memoryLimit / 100 ,
327
- } ,
328
- } ) ,
333
+ body : JSON . stringify ( body ) ,
329
334
} ) ;
330
335
331
336
setIsSaved ( true ) ;
@@ -378,10 +383,16 @@ export const WLMDetails = ({
378
383
}
379
384
} ;
380
385
381
- const formatLimit = ( usage ?: number , defaultValue : number = 0 ) : number => {
382
- return Math . round ( ( usage ?? defaultValue ) * 100 ) ;
386
+ const formatLimit = ( usage ?: number ) : number | undefined => {
387
+ if ( usage == null ) return undefined ;
388
+ return Math . round ( usage * 100 ) ;
389
+ } ;
390
+
391
+ const formatUsage = ( usage : number ) : number => {
392
+ return Math . round ( usage * 100 ) ;
383
393
} ;
384
394
395
+
385
396
return (
386
397
< div style = { { padding : '20px 40px' } } >
387
398
{ isDeleteModalVisible && (
@@ -633,13 +644,14 @@ export const WLMDetails = ({
633
644
{ /* CPU Usage Limit */ }
634
645
< EuiFormRow
635
646
label = "Reject queries when CPU usage exceeds"
636
- isInvalid = { cpuLimit <= 0 || cpuLimit > 100 }
647
+ isInvalid = { cpuLimit !== undefined && ( cpuLimit <= 0 || cpuLimit > 100 ) }
637
648
error = "Value must be between 0 and 100"
638
649
>
639
650
< EuiFieldNumber
640
651
value = { cpuLimit }
641
652
onChange = { ( e ) => {
642
- setCpuLimit ( Number ( e . target . value ) ) ;
653
+ const val = e . target . value ;
654
+ setCpuLimit ( val === '' ? undefined : Number ( val ) ) ;
643
655
setIsSaved ( false ) ;
644
656
} }
645
657
append = "%"
@@ -653,13 +665,14 @@ export const WLMDetails = ({
653
665
{ /* Memory Usage Limit */ }
654
666
< EuiFormRow
655
667
label = "Reject queries when memory usage exceeds"
656
- isInvalid = { memoryLimit <= 0 || memoryLimit > 100 }
668
+ isInvalid = { memoryLimit !== undefined && ( memoryLimit <= 0 || memoryLimit > 100 ) }
657
669
error = "Value must be between 0 and 100"
658
670
>
659
671
< EuiFieldNumber
660
672
value = { memoryLimit }
661
673
onChange = { ( e ) => {
662
- setMemoryLimit ( Number ( e . target . value ) ) ;
674
+ const val = e . target . value ;
675
+ setMemoryLimit ( val === '' ? undefined : Number ( val ) ) ;
663
676
setIsSaved ( false ) ;
664
677
} }
665
678
append = "%"
0 commit comments