diff options
| 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 |
| commit | 35197ffad72816e657cc4cd1a8b0b87a29b90ef9 (patch) | |
| tree | 2634b212b86b41192e3f9d5612b15e3cc4c80aa4 | |
| parent | b69c44783dbf81dcf7087e4f395f5ce19baf3f8c (diff) | |
[MAIN-388] Add diff to table formatter
| -rw-r--r-- | robusta_krr/formatters/table.py | 52 |
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 |
