diff --git a/app/extras/pseudographic.py b/app/extras/pseudographic.py index 668c67a..7962af2 100644 --- a/app/extras/pseudographic.py +++ b/app/extras/pseudographic.py @@ -1,25 +1,26 @@ from rich.console import Console from rich.table import Table +from rich.progress import Progress from database import fetch_all from kubernetes import client, config +import requests + +# Define constants +THINK_K8S_URL = "http://localhost:8000/think/k8s" + +console = Console() # Helper functions for conversions def convert_cpu_to_cores(cpu): - """ - Convert CPU usage to cores for human-readable format. - """ - if "n" in cpu: # Nanocores to cores + if "n" in cpu: return round(int(cpu.replace("n", "")) / 1e9, 4) - elif "u" in cpu: # Microcores to cores + elif "u" in cpu: return round(int(cpu.replace("u", "")) / 1e6, 4) - elif "m" in cpu: # Millicores to cores + elif "m" in cpu: return round(int(cpu.replace("m", "")) / 1000, 4) - return float(cpu) # Already in cores + return float(cpu) def convert_memory_to_mib(memory): - """ - Convert memory to MiB (mebibytes). - """ if "Ki" in memory: return int(memory.replace("Ki", "")) / 1024 elif "Mi" in memory: @@ -29,9 +30,6 @@ def convert_memory_to_mib(memory): return float(memory) def convert_memory_to_gb(memory): - """ - Convert memory to GB (gigabytes) for ephemeral-storage. - """ if "Ki" in memory: return int(memory.replace("Ki", "")) / (1024 ** 2) elif "Mi" in memory: @@ -40,8 +38,8 @@ def convert_memory_to_gb(memory): return int(memory.replace("Gi", "")) return float(memory) +# Display tables def display_metal_nodes(): - console = Console() table = Table(title="🖥️ Metal Nodes", style="bold green") table.add_column("ID", justify="right", style="cyan") table.add_column("Name", style="magenta") @@ -66,7 +64,6 @@ def display_metal_nodes(): console.print(table) def display_virtual_machines(): - console = Console() table = Table(title="💻 Virtual Machines", style="bold blue") table.add_column("ID", justify="right", style="cyan") table.add_column("Name", style="magenta") @@ -91,7 +88,6 @@ def display_virtual_machines(): console.print(table) def display_kubernetes_nodes(): - console = Console() config.load_incluster_config() v1 = client.CoreV1Api() @@ -100,7 +96,7 @@ def display_kubernetes_nodes(): table.add_column("CPU", justify="right", style="yellow") table.add_column("Memory (MiB)", justify="right", style="cyan") table.add_column("Storage (GB)", justify="right", style="green") - table.add_column("Instance Type", style="white") + table.add_column("Instance Type", style="blue") table.add_column("Pods Allocatable", justify="right", style="magenta") nodes = v1.list_node() @@ -119,9 +115,7 @@ def display_kubernetes_nodes(): console.print(table) - def display_namespace_usage(): - console = Console() config.load_incluster_config() metrics_client = client.CustomObjectsApi() @@ -156,10 +150,36 @@ def display_namespace_usage(): console.print(table) +# Fetch and display AI summary +def fetch_ai_summary(): + with Progress() as progress: + task = progress.add_task("[cyan]Thinking about Kubernetes...", total=100) + + try: + for _ in range(10): # Simulate progress + progress.update(task, advance=10) + import time; time.sleep(0.1) + + response = requests.get(THINK_K8S_URL) + progress.update(task, completed=100) + + if response.status_code == 200: + data = response.json() + return data.get("summary", "No summary provided.") + else: + return f"Failed to fetch summary: {response.status_code} {response.text}" + except requests.RequestException as e: + return f"An error occurred while fetching the summary: {str(e)}" + +def display_ai_summary(): + summary = fetch_ai_summary() + console.print("\n[bold magenta]AI Summary of Kubernetes Cluster:[/bold magenta]") + console.print(f"[green]{summary}[/green]\n") + if __name__ == "__main__": - console = Console() console.print("✨ [bold green]Welcome to the Metal Check Dashboard![/bold green] ✨\n") display_metal_nodes() display_virtual_machines() display_kubernetes_nodes() display_namespace_usage() + display_ai_summary()