async () => {
const clusterId = "cls_abc123"; // resolved by the agent from conversation
const allPods = await cnap.request({
method: "GET",
path: `/v1/clusters/${clusterId}/kube/api/v1/pods`,
}).then(r => r.body);
// Unit parsers — written by the agent, executed in the sandbox
const parseCpu = (v) => {
if (!v) return 0;
if (v.endsWith("m")) return parseInt(v) / 1000;
return parseFloat(v);
};
const parseMem = (v) => {
if (!v) return 0;
if (v.endsWith("Gi")) return parseFloat(v) * 1024;
if (v.endsWith("Mi")) return parseFloat(v);
if (v.endsWith("Ki")) return parseFloat(v) / 1024;
return parseFloat(v) / (1024 * 1024);
};
const totals = { requests: { cpu: 0, memMi: 0 }, limits: { cpu: 0, memMi: 0 } };
const perPod = [];
for (const pod of allPods.items.filter(p => p.status.phase === "Running")) {
const podRes = { requests: { cpu: 0, memMi: 0 }, limits: { cpu: 0, memMi: 0 } };
for (const c of pod.spec.containers) {
const r = c.resources || {};
podRes.requests.cpu += parseCpu(r.requests?.cpu);
podRes.requests.memMi += parseMem(r.requests?.memory);
podRes.limits.cpu += parseCpu(r.limits?.cpu);
podRes.limits.memMi += parseMem(r.limits?.memory);
}
totals.requests.cpu += podRes.requests.cpu;
totals.requests.memMi += podRes.requests.memMi;
totals.limits.cpu += podRes.limits.cpu;
totals.limits.memMi += podRes.limits.memMi;
perPod.push({
pod: pod.metadata.name,
ns: pod.metadata.namespace,
requests: { cpu: `${Math.round(podRes.requests.cpu * 1000)}m`, mem: `${Math.round(podRes.requests.memMi)}Mi` },
limits: { cpu: `${Math.round(podRes.limits.cpu * 1000)}m`, mem: `${Math.round(podRes.limits.memMi)}Mi` },
});
}
return {
pod_count: perPod.length,
totals: {
requests: { cpu: `${Math.round(totals.requests.cpu * 1000)}m`, mem: `${Math.round(totals.requests.memMi)}Mi` },
limits: { cpu: `${Math.round(totals.limits.cpu * 1000)}m`, mem: `${Math.round(totals.limits.memMi)}Mi` },
},
per_pod: perPod.sort((a, b) => parseInt(b.requests.mem) - parseInt(a.requests.mem)),
};
}