import streamlit as st from app import cfg from app.k8s_client import get_core, get_custom_client, fetch_nodes, fetch_pods @st.cache_resource def clients(): get_core() get_custom_client() @st.cache_data(ttl=cfg.cache_ttl) def cached_nodes(): return fetch_nodes() @st.cache_data(ttl=cfg.cache_ttl) def cached_pods(namespace="all"): return fetch_pods(namespace=namespace) @st.cache_data(ttl=cfg.cache_ttl) def cached_deployments(namespace="all"): from kubernetes import client as _k8s get_core() # ensures kubeconfig is loaded before AppsV1Api is created apps_v1 = _k8s.AppsV1Api() if namespace == "all": items = apps_v1.list_deployment_for_all_namespaces().items else: items = apps_v1.list_namespaced_deployment(namespace=namespace).items return [ { "namespace": d.metadata.namespace, "name": d.metadata.name, "ready": f"{d.status.ready_replicas or 0}/{d.spec.replicas or 0}", "available": d.status.available_replicas or 0, "desired": d.spec.replicas or 0, } for d in items ] @st.cache_data(ttl=cfg.cache_ttl) def cached_namespaces(): return [ns.metadata.name for ns in get_core().list_namespace().items] @st.cache_data(ttl=cfg.cache_ttl) def cached_node_metrics(): try: api = get_custom_client() data = api.list_cluster_custom_object( group="metrics.k8s.io", version="v1beta1", plural="nodes" ) return { item["metadata"]["name"]: { "cpu_usage": item["usage"]["cpu"], "memory_usage": item["usage"]["memory"], } for item in data["items"] } except Exception: return {} def clear(): cached_nodes.clear() cached_pods.clear() cached_deployments.clear() cached_namespaces.clear() cached_node_metrics.clear()