11use crate :: common:: format:: human_size;
2- use crate :: dashboard:: ui:: screens:: cluster:: worker:: UtilizationRenderMode ;
2+ use crate :: dashboard:: ui:: screens:: cluster:: worker:: { CpuScope , CpuViewMode } ;
33use ratatui:: layout:: { Constraint , Rect } ;
44use ratatui:: style:: Style ;
55use ratatui:: widgets:: { Cell , Row , Table } ;
@@ -10,7 +10,7 @@ use tako::resources::ResourceIndex;
1010use crate :: dashboard:: ui:: styles;
1111use crate :: dashboard:: ui:: terminal:: DashboardFrame ;
1212use crate :: dashboard:: ui:: widgets:: progressbar:: {
13- ProgressPrintStyle , get_progress_bar_color , get_progress_bar_cpu_color , render_progress_bar_at,
13+ ProgressPrintStyle , get_cpu_progress_bar_color , render_progress_bar_at,
1414} ;
1515use crate :: dashboard:: utils:: calculate_average;
1616
@@ -22,7 +22,8 @@ pub fn render_cpu_util_table(
2222 cpu_util_list : & [ f64 ] ,
2323 mem_util : & MemoryStats ,
2424 used_cpus : & [ ResourceIndex ] ,
25- util_render_mode : & UtilizationRenderMode ,
25+ util_render_mode : & CpuViewMode ,
26+ cpu_scope : & CpuScope ,
2627 rect : Rect ,
2728 frame : & mut DashboardFrame ,
2829 table_style : Style ,
@@ -36,13 +37,46 @@ pub fn render_cpu_util_table(
3637 let height = ( cpu_util_list. len ( ) as f64 / width as f64 ) . ceil ( ) as usize ;
3738
3839 let mut rows: Vec < Vec < ( f64 , usize , bool ) > > = vec ! [ vec![ ] ; height] ;
39- if * util_render_mode == UtilizationRenderMode :: Worker {
40- rows = get_utilization_sorted_by_usage ( cpu_util_list, used_cpus, height)
41- } else {
42- for ( position, & cpu_util) in cpu_util_list. iter ( ) . enumerate ( ) {
43- let row = position % height;
44- let used = used_cpus. contains ( & ResourceIndex :: new ( position as u32 ) ) ;
45- rows[ row] . push ( ( cpu_util, position, used) ) ;
40+
41+ match util_render_mode {
42+ CpuViewMode :: Global => {
43+ for ( position, & cpu_util) in cpu_util_list. iter ( ) . enumerate ( ) {
44+ let row = position % height;
45+ let used = used_cpus. contains ( & ResourceIndex :: new ( position as u32 ) ) ;
46+ rows[ row] . push ( ( cpu_util, position, used) ) ;
47+ }
48+ }
49+ CpuViewMode :: WorkerManaged => match cpu_scope {
50+ CpuScope :: Node => {
51+ rows = get_utilization_sorted_by_usage ( cpu_util_list, used_cpus, height)
52+ }
53+ CpuScope :: Subset ( managed_cpus) => {
54+ let managed_cpu_util_list: Vec < f64 > = cpu_util_list
55+ . iter ( )
56+ . enumerate ( )
57+ . filter_map ( |( idx, & cpu_util) | {
58+ if managed_cpus. contains ( & ResourceIndex :: new ( idx as u32 ) ) {
59+ Some ( cpu_util)
60+ } else {
61+ None
62+ }
63+ } )
64+ . collect ( ) ;
65+
66+ rows = get_utilization_sorted_by_usage ( & managed_cpu_util_list, used_cpus, height)
67+ }
68+ } ,
69+ CpuViewMode :: WorkerAssigned => {
70+ let mut r = 0 ;
71+ for ( position, & cpu_util) in cpu_util_list. iter ( ) . enumerate ( ) {
72+ let row = r % height;
73+ let used = used_cpus. contains ( & ResourceIndex :: new ( position as u32 ) ) ;
74+
75+ if used {
76+ rows[ row] . push ( ( cpu_util, position, used) ) ;
77+ r += 1 ;
78+ }
79+ }
4680 }
4781 }
4882
@@ -53,10 +87,8 @@ pub fn render_cpu_util_table(
5387 . into_iter ( )
5488 . map ( |( cpu_util, position, used) | {
5589 let progress = cpu_util / 100.00 ;
56- let style = match util_render_mode {
57- UtilizationRenderMode :: Global => get_progress_bar_color ( progress) ,
58- UtilizationRenderMode :: Worker => get_progress_bar_cpu_color ( progress, used) ,
59- } ;
90+
91+ let style = get_cpu_progress_bar_color ( progress, used, util_render_mode) ;
6092
6193 Cell :: from ( render_progress_bar_at (
6294 Some ( format ! ( "{position:>3} " ) ) ,
@@ -73,7 +105,7 @@ pub fn render_cpu_util_table(
73105
74106 let mem_used = mem_util. total - mem_util. free ;
75107 let ( which_util, num_cpus, avg_cpu) =
76- create_title_info ( cpu_util_list, used_cpus, util_render_mode) ;
108+ create_title_info ( cpu_util_list, used_cpus, util_render_mode, cpu_scope ) ;
77109
78110 let title = styles:: table_title ( format ! (
79111 "{} Utilization ({} CPUs), Avg CPU = {:.0}%, Mem = {:.0}% ({}/{})" ,
@@ -133,35 +165,35 @@ fn get_utilization_sorted_by_usage(
133165fn create_title_info (
134166 cpu_util_list : & [ f64 ] ,
135167 used_cpus : & [ ResourceIndex ] ,
136- util_render_mode : & UtilizationRenderMode ,
168+ util_render_mode : & CpuViewMode ,
169+ cpu_manager_state : & CpuScope ,
137170) -> ( String , usize , f64 ) {
138171 let which_util = match util_render_mode {
139- UtilizationRenderMode :: Global => "Node" . to_string ( ) ,
140- UtilizationRenderMode :: Worker => "Worker" . to_string ( ) ,
141- } ;
142-
143- let num_cpus = match util_render_mode {
144- UtilizationRenderMode :: Global => cpu_util_list. len ( ) ,
145- UtilizationRenderMode :: Worker => used_cpus. len ( ) ,
146- } ;
147-
148- let avg_usage = match util_render_mode {
149- UtilizationRenderMode :: Global => calculate_average ( cpu_util_list) ,
150- UtilizationRenderMode :: Worker => {
151- let used_cpu_util_list: Vec < f64 > = cpu_util_list
152- . iter ( )
153- . enumerate ( )
154- . filter_map ( |( idx, utilization) | {
155- if used_cpus. contains ( & ResourceIndex :: new ( idx as u32 ) ) {
156- Some ( * utilization)
157- } else {
158- None
159- }
160- } )
161- . collect ( ) ;
162- calculate_average ( & used_cpu_util_list)
163- }
164- } ;
172+ CpuViewMode :: Global => "Node" ,
173+ CpuViewMode :: WorkerManaged => "Worker Managed" ,
174+ CpuViewMode :: WorkerAssigned => "Worker Assigned" ,
175+ }
176+ . to_string ( ) ;
177+
178+ let filtered_utils: Vec < f64 > = cpu_util_list
179+ . iter ( )
180+ . enumerate ( )
181+ . filter ( |( idx, _util) | {
182+ let res_idx = ResourceIndex :: new ( * idx as u32 ) ;
183+ match util_render_mode {
184+ CpuViewMode :: Global => true ,
185+ CpuViewMode :: WorkerAssigned => used_cpus. contains ( & res_idx) ,
186+ CpuViewMode :: WorkerManaged => match cpu_manager_state {
187+ CpuScope :: Node => true ,
188+ CpuScope :: Subset ( managed) => managed. contains ( & res_idx) ,
189+ } ,
190+ }
191+ } )
192+ . map ( |( _, & util) | util)
193+ . collect ( ) ;
194+
195+ let num_cpus = filtered_utils. len ( ) ;
196+ let avg_usage = calculate_average ( & filtered_utils) ;
165197
166198 ( which_util, num_cpus, avg_usage)
167199}
0 commit comments