"use client"; import type { CustomResourceSummary, DeploymentInfo, K8sConfigMapSummary, K8sServiceSummary, PodInfo, StatefulSetInfo, } from "@minikura/api"; import { AlertCircle, CheckCircle2, RefreshCw, XCircle } from "lucide-react"; import { K8sPhaseBadge } from "@/components/k8s/k8s-phase-badge"; import { type K8sResourceColumn, K8sResourceTableCard, } from "@/components/k8s/k8s-resource-table-card"; import { PageHeader, PageShell, StatePanel } from "@/components/page-layout"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useK8sResources } from "@/hooks/use-k8s-resources"; const secondaryCell = "text-sm text-muted-foreground"; const podColumns = [ { header: "Name", render: (pod) => pod.name, className: "font-medium" }, { header: "Status", render: (pod) => }, { header: "Ready", render: (pod) => pod.ready }, { header: "Restarts", render: (pod) => pod.restarts }, { header: "Node", render: (pod) => pod.nodeName || "-", className: secondaryCell }, { header: "Age", render: (pod) => pod.age, className: secondaryCell }, ] satisfies readonly K8sResourceColumn[]; const deploymentColumns = [ { header: "Name", render: (deployment) => deployment.name, className: "font-medium" }, { header: "Ready", render: (deployment) => deployment.ready }, { header: "Up-to-date", render: (deployment) => deployment.upToDate ?? deployment.updated, }, { header: "Available", render: (deployment) => deployment.available ?? 0 }, { header: "Age", render: (deployment) => deployment.age, className: secondaryCell }, ] satisfies readonly K8sResourceColumn[]; const statefulSetColumns = [ { header: "Name", render: (statefulSet) => statefulSet.name, className: "font-medium" }, { header: "Ready", render: (statefulSet) => statefulSet.ready }, { header: "Desired", render: (statefulSet) => statefulSet.desired }, { header: "Current", render: (statefulSet) => statefulSet.current }, { header: "Age", render: (statefulSet) => statefulSet.age, className: secondaryCell }, ] satisfies readonly K8sResourceColumn[]; const serviceColumns = [ { header: "Name", render: (service) => service.name, className: "font-medium" }, { header: "Type", render: (service) => {service.type}, }, { header: "Cluster IP", render: (service) => service.clusterIP, className: secondaryCell, }, { header: "External IP", render: (service) => service.externalIP, className: secondaryCell, }, { header: "Ports", render: (service) => service.ports, className: secondaryCell }, { header: "Age", render: (service) => service.age, className: secondaryCell }, ] satisfies readonly K8sResourceColumn[]; const configMapColumns = [ { header: "Name", render: (configMap) => configMap.name, className: "font-medium" }, { header: "Data Keys", render: (configMap) => configMap.data }, { header: "Age", render: (configMap) => configMap.age, className: secondaryCell }, ] satisfies readonly K8sResourceColumn[]; const customResourceColumns = [ { header: "Name", render: (resource) => resource.name, className: "font-medium" }, { header: "Status", render: (resource) => , }, { header: "Age", render: (resource) => resource.age, className: secondaryCell }, ] satisfies readonly K8sResourceColumn[]; export default function K8sResourcesPage() { const { status, pods, deployments, statefulSets, services, configMaps, minecraftServers, reverseProxyServers, initialLoading, refreshing, error, } = useK8sResources(); const pageHeader = (

Cluster link

Connected
{refreshing && } ) : undefined } /> ); if (initialLoading && !status) { return ( {pageHeader} ); } if (error) { return ( {pageHeader} } tone="error" /> ); } if (!status?.initialized) { return ( {pageHeader} } description={ <>

Ensure the operator is running with a valid Kubernetes configuration.

Set{" "} KUBERNETES_SKIP_TLS_VERIFY=true {" "} when using self-signed certificates.

} />
); } return ( {pageHeader} Pods ({pods.length}) Deployments ({deployments.length}) StatefulSets ({statefulSets.length}) Services ({services.length}) ConfigMaps ({configMaps.length}) Minecraft Servers ({minecraftServers.length}) Reverse Proxies ({reverseProxyServers.length}) ); }