import React from "react";
import { Layers, Box, Server, Activity } from "lucide-react";
import type {
PodInfo,
DeploymentInfo,
StatefulSetInfo,
DaemonSetInfo,
JobInfo,
CronJobInfo,
} from "@/lib/tauriCommands";
interface WorkloadOverviewProps {
clusterId: string;
resources: {
pods: PodInfo[];
deployments: DeploymentInfo[];
statefulsets: StatefulSetInfo[];
daemonsets: DaemonSetInfo[];
jobs: JobInfo[];
cronjobs: CronJobInfo[];
};
}
interface SummaryCardProps {
title: string;
value: number;
subtitle?: string;
icon: React.ReactNode;
}
function SummaryCard({ title, value, subtitle, icon }: SummaryCardProps) {
return (
{title}
{icon}
{value}
{subtitle && (
{subtitle}
)}
);
}
export function WorkloadOverview({ resources }: WorkloadOverviewProps) {
const { pods, deployments, statefulsets, daemonsets, jobs, cronjobs } = resources;
const runningPods = pods.filter((p) => p.status === "Running").length;
const pendingPods = pods.filter((p) => p.status === "Pending").length;
const failedPods = pods.filter((p) => p.status === "Failed").length;
const readyDeployments = deployments.filter((d) => d.ready === `${d.replicas}/${d.replicas}`).length;
const readyStatefulSets = statefulsets.filter((s) => {
const parts = s.ready.split("/");
return parts.length === 2 && parts[0] === parts[1];
}).length;
const healthyDaemonSets = daemonsets.filter(
(ds) => ds.desired === ds.ready
).length;
const completedJobs = jobs.filter((j) => {
const parts = j.completions.split("/");
return parts.length === 2 && parts[0] === parts[1];
}).length;
return (
Workload Overview
Summary of all workload resources in the selected namespace
}
/>
}
/>
}
/>
}
/>
}
/>
0 ? `Active: ${cronjobs.reduce((acc, cj) => acc + cj.active, 0)}` : undefined}
icon={}
/>
{pods.length > 0 && (
Pod Status Breakdown
Running: {runningPods}
Pending: {pendingPods}
Failed: {failedPods}
{pods.length - runningPods - pendingPods - failedPods > 0 && (
Other: {pods.length - runningPods - pendingPods - failedPods}
)}
)}
);
}