summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorПавел Жуков <33721692+LeaveMyYard@users.noreply.github.com>2023-06-13 13:42:51 +0300
committerПавел Жуков <33721692+LeaveMyYard@users.noreply.github.com>2023-06-13 13:42:51 +0300
commit35197ffad72816e657cc4cd1a8b0b87a29b90ef9 (patch)
tree2634b212b86b41192e3f9d5612b15e3cc4c80aa4
parentb69c44783dbf81dcf7087e4f395f5ce19baf3f8c (diff)
[MAIN-388] Add diff to table formatter
-rw-r--r--robusta_krr/formatters/table.py52
1 files changed, 40 insertions, 12 deletions
diff --git a/robusta_krr/formatters/table.py b/robusta_krr/formatters/table.py
index c510fc2..cae0fb3 100644
--- a/robusta_krr/formatters/table.py
+++ b/robusta_krr/formatters/table.py
@@ -1,4 +1,5 @@
import itertools
+from typing import Any
from rich.table import Table
@@ -25,7 +26,29 @@ def _format_request_str(item: ResourceScan, resource: ResourceType, selector: st
recommended = getattr(item.recommended, selector)[resource]
severity = recommended.severity
- return f"[{severity.color}]" + _format(allocated) + " -> " + _format(recommended.value) + f"[/{severity.color}]"
+ if allocated is None or isinstance(allocated, str) or selector != "requests":
+ diff = ""
+ else:
+ diff_val = recommended.value - allocated
+ diff_sign = "[green]+[/green]" if diff_val > 0 else "[red]-[/red]"
+ diff = f"({diff_sign}{_format(abs(diff_val))}) "
+
+ return (
+ diff + f"[{severity.color}]" + _format(allocated) + " -> " + _format(recommended.value) + f"[/{severity.color}]"
+ )
+
+
+def _format_total_diff(item: ResourceScan, resource: ResourceType, pods_current: int) -> str:
+ selector = "requests"
+ allocated = getattr(item.object.allocations, selector)[resource]
+ recommended = getattr(item.recommended, selector)[resource]
+
+ if allocated is None or isinstance(allocated, str) or selector != "requests":
+ return ""
+ else:
+ diff_val = recommended.value - allocated
+ diff_sign = "[green]+[/green]" if diff_val > 0 else "[red]-[/red]"
+ return f"{diff_sign}{_format(abs(diff_val) * pods_current)}"
@formatters.register(rich_console=True)
@@ -47,8 +70,11 @@ def table(result: Result) -> Table:
caption=f"{result.score} points - {result.score_letter}",
)
+ cluster_count = len(set(item.object.cluster for item in result.scans))
+
table.add_column("Number", justify="right", no_wrap=True)
- table.add_column("Cluster", style="cyan")
+ if cluster_count > 1:
+ table.add_column("Cluster", style="cyan")
table.add_column("Namespace", style="cyan")
table.add_column("Name", style="cyan")
table.add_column("Pods", style="cyan")
@@ -56,6 +82,7 @@ def table(result: Result) -> Table:
table.add_column("Type", style="cyan")
table.add_column("Container", style="cyan")
for resource in ResourceType:
+ table.add_column(f"{resource.name} Diff")
table.add_column(f"{resource.name} Requests")
table.add_column(f"{resource.name} Limits")
@@ -68,21 +95,22 @@ def table(result: Result) -> Table:
last_row = j == len(group_items) - 1
full_info_row = j == 0
- table.add_row(
- f"[{item.severity.color}]{i + 1}.[/{item.severity.color}]",
- item.object.cluster if full_info_row else "",
+ cells: list[Any] = [f"[{item.severity.color}]{i + 1}.[/{item.severity.color}]"]
+ if cluster_count > 1:
+ cells.append(item.object.cluster if full_info_row else "")
+ cells += [
item.object.namespace if full_info_row else "",
item.object.name if full_info_row else "",
f"{item.object.current_pods_count}" if full_info_row else "",
f"{item.object.deleted_pods_count}" if full_info_row else "",
item.object.kind if full_info_row else "",
item.object.container,
- *[
- _format_request_str(item, resource, selector)
- for resource in ResourceType
- for selector in ["requests", "limits"]
- ],
- end_section=last_row,
- )
+ ]
+
+ for resource in ResourceType:
+ cells.append(_format_total_diff(item, resource, item.object.current_pods_count))
+ cells += [_format_request_str(item, resource, selector) for selector in ["requests", "limits"]]
+
+ table.add_row(*cells, end_section=last_row)
return table