@@ -30,6 +30,10 @@ class TableRow(NamedTuple):
3030 mem_limit_percent : float
3131 mem_usage : int
3232 mem_usage_percent : float
33+ storage_request : int
34+ storage_request_percent : float
35+ storage_limit : int
36+ storage_limit_percent : float
3337
3438
3539def parse_cpu (size_str : str , fallback_unit : str | None ) -> int :
@@ -110,7 +114,14 @@ def get_summary_pod_resources() -> dict[str, dict[str, int]]:
110114 continue
111115 resource_dict = resources .get (
112116 namespace ,
113- {"cpu_request" : 0 , "cpu_limit" : 0 , "mem_request" : 0 , "mem_limit" : 0 },
117+ {
118+ "cpu_request" : 0 ,
119+ "cpu_limit" : 0 ,
120+ "mem_request" : 0 ,
121+ "mem_limit" : 0 ,
122+ "storage_request" : 0 ,
123+ "storage_limit" : 0 ,
124+ },
114125 )
115126
116127 cpu_request = (
@@ -133,6 +144,16 @@ def get_summary_pod_resources() -> dict[str, dict[str, int]]:
133144 if container .resources .limits
134145 else None
135146 )
147+ storage_request = (
148+ container .resources .requests .get ("ephemeral-storage" )
149+ if container .resources .requests
150+ else None
151+ )
152+ storage_limit = (
153+ container .resources .limits .get ("ephemeral-storage" )
154+ if container .resources .limits
155+ else None
156+ )
136157
137158 resource_dict ["cpu_request" ] += (
138159 parse_cpu (cpu_request , fallback_unit = "unit" ) if cpu_request else 0
@@ -144,6 +165,12 @@ def get_summary_pod_resources() -> dict[str, dict[str, int]]:
144165 parse_memory (mem_request ) if mem_request else 0
145166 )
146167 resource_dict ["mem_limit" ] += parse_memory (mem_limit ) if mem_limit else 0
168+ resource_dict ["storage_request" ] += (
169+ parse_memory (storage_request ) if storage_request else 0
170+ )
171+ resource_dict ["storage_limit" ] += (
172+ parse_memory (storage_limit ) if storage_limit else 0
173+ )
147174
148175 resources [namespace ] = resource_dict
149176
@@ -161,7 +188,10 @@ def get_pod_metrics() -> dict[str, dict[str, int]]:
161188 for item in metrics ["items" ]:
162189 ns_name = item ["metadata" ]["namespace" ]
163190
164- ns_metrics = all_metrics .get (ns_name , {"cpu_usage" : 0 , "mem_usage" : 0 })
191+ ns_metrics = all_metrics .get (
192+ ns_name ,
193+ {"cpu_usage" : 0 , "mem_usage" : 0 },
194+ )
165195
166196 for container in item ["containers" ]:
167197 ns_metrics ["cpu_usage" ] += parse_cpu (
@@ -180,7 +210,7 @@ def get_cluster_capacity() -> dict[str, int]:
180210 v1 = client .CoreV1Api ()
181211
182212 nodes = v1 .list_node ()
183- total_capacity = {"cpu" : 0 , "memory" : 0 }
213+ total_capacity = {"cpu" : 0 , "memory" : 0 , "storage" : 0 }
184214
185215 for node in nodes .items :
186216 total_capacity ["cpu" ] += parse_cpu (
@@ -191,6 +221,10 @@ def get_cluster_capacity() -> dict[str, int]:
191221 node .status .capacity .get ("memory" , "0" ),
192222 fallback_unit = "b" ,
193223 )
224+ total_capacity ["storage" ] += parse_memory (
225+ node .status .capacity .get ("ephemeral-storage" , "0" ),
226+ fallback_unit = "b" ,
227+ )
194228
195229 return total_capacity
196230
@@ -233,7 +267,10 @@ def build_table(
233267 table : list [TableRow ] = []
234268
235269 for namespace , resource_dict in resources .items ():
236- metric_dict = metrics .get (namespace , {"cpu_usage" : 0 , "mem_usage" : 0 })
270+ metric_dict = metrics .get (
271+ namespace ,
272+ {"cpu_usage" : 0 , "mem_usage" : 0 },
273+ )
237274
238275 row = TableRow (
239276 namespace ,
@@ -249,6 +286,10 @@ def build_table(
249286 resource_dict ["mem_limit" ] / total_capacity ["memory" ] * 100 ,
250287 metric_dict ["mem_usage" ],
251288 metric_dict ["mem_usage" ] / total_capacity ["memory" ] * 100 ,
289+ resource_dict ["storage_request" ],
290+ resource_dict ["storage_request" ] / total_capacity ["storage" ] * 100 ,
291+ resource_dict ["storage_limit" ],
292+ resource_dict ["storage_limit" ] / total_capacity ["storage" ] * 100 ,
252293 )
253294 table .append (row )
254295
@@ -266,13 +307,17 @@ def sort_table(table: list[TableRow], sort_key: str) -> list[TableRow]:
266307 "mem-request" : lambda row : row .mem_request ,
267308 "mem-limit" : lambda row : row .mem_limit ,
268309 "mem-usage" : lambda row : row .mem_usage ,
310+ "storage-request" : lambda row : row .storage_request ,
311+ "storage-limit" : lambda row : row .storage_limit ,
269312 "n" : lambda row : row .namespace ,
270313 "cr" : lambda row : row .cpu_request ,
271314 "cl" : lambda row : row .cpu_limit ,
272315 "cu" : lambda row : row .cpu_usage ,
273316 "mr" : lambda row : row .mem_request ,
274317 "ml" : lambda row : row .mem_limit ,
275318 "mu" : lambda row : row .mem_usage ,
319+ "sr" : lambda row : row .storage_request ,
320+ "sl" : lambda row : row .storage_limit ,
276321 }
277322
278323 # Ensure the provided sort_key is valid
@@ -290,6 +335,8 @@ def add_total_row(table: list[TableRow]) -> list[TableRow]:
290335 total_mem_request = sum (row .mem_request for row in table )
291336 total_mem_limit = sum (row .mem_limit for row in table )
292337 total_mem_usage = sum (row .mem_usage for row in table )
338+ total_storage_request = sum (row .storage_request for row in table )
339+ total_storage_limit = sum (row .storage_limit for row in table )
293340
294341 total_row = TableRow (
295342 namespace = "Total Used" ,
@@ -305,6 +352,10 @@ def add_total_row(table: list[TableRow]) -> list[TableRow]:
305352 mem_limit_percent = sum (row .mem_limit_percent for row in table ),
306353 mem_usage = total_mem_usage ,
307354 mem_usage_percent = sum (row .mem_usage_percent for row in table ),
355+ storage_request = total_storage_request ,
356+ storage_request_percent = sum (row .storage_request_percent for row in table ),
357+ storage_limit = total_storage_limit ,
358+ storage_limit_percent = sum (row .storage_limit_percent for row in table ),
308359 )
309360
310361 table .append (total_row )
@@ -329,6 +380,10 @@ def add_capacity_row(
329380 mem_limit_percent = 100.0 ,
330381 mem_usage = 0 ,
331382 mem_usage_percent = 0 ,
383+ storage_request = total_capacity ["storage" ],
384+ storage_request_percent = 100.0 ,
385+ storage_limit = total_capacity ["storage" ],
386+ storage_limit_percent = 100.0 ,
332387 )
333388
334389 table .append (capacity_row )
@@ -365,6 +420,10 @@ def print_table(table: list[TableRow]) -> None:
365420 Column ("%" , justify = "right" ),
366421 Column ("Mem Usage" ),
367422 Column ("%" , justify = "right" ),
423+ Column ("Storage Req" ),
424+ Column ("%" , justify = "right" ),
425+ Column ("Storage Lim" ),
426+ Column ("%" , justify = "right" ),
368427 ]
369428
370429 rich_table = Table (* headers , box = box .SIMPLE )
@@ -386,6 +445,13 @@ def print_table(table: list[TableRow]) -> None:
386445 calc_severity (row .mem_limit_percent , row .namespace != "Total Capacity" ),
387446 format_mem (row .mem_usage ),
388447 calc_severity (row .mem_usage_percent , row .namespace != "Total Capacity" ),
448+ format_mem (row .storage_request ),
449+ calc_severity (
450+ row .storage_request_percent ,
451+ row .namespace != "Total Capacity" ,
452+ ),
453+ format_mem (row .storage_limit ),
454+ calc_severity (row .storage_limit_percent , row .namespace != "Total Capacity" ),
389455 ]
390456 rich_table .add_row (* pretty_row )
391457
@@ -411,6 +477,10 @@ def print_csv(table: list[TableRow]) -> None:
411477 "mem_limit_percent" ,
412478 "mem_usage" ,
413479 "mem_usage_percent" ,
480+ "storage_request" ,
481+ "storage_request_percent" ,
482+ "storage_limit" ,
483+ "storage_limit_percent" ,
414484 ]
415485 writer .writerow (headers )
416486
@@ -431,6 +501,10 @@ def print_csv(table: list[TableRow]) -> None:
431501 row .mem_limit_percent ,
432502 row .mem_usage ,
433503 row .mem_usage_percent ,
504+ row .storage_request ,
505+ row .storage_request_percent ,
506+ row .storage_limit ,
507+ row .storage_limit_percent ,
434508 ],
435509 )
436510
@@ -459,13 +533,17 @@ def parse_args() -> argparse.Namespace:
459533 "mem-request" ,
460534 "mem-limit" ,
461535 "mem-usage" ,
536+ "storage-request" ,
537+ "storage-limit" ,
462538 "n" ,
463539 "cr" ,
464540 "cl" ,
465541 "cu" ,
466542 "mr" ,
467543 "ml" ,
468544 "mu" ,
545+ "sr" ,
546+ "sl" ,
469547 ],
470548 help = "sort by specified field" ,
471549 )
0 commit comments