async () => {
// Get all clusters
const clusters = await cnap.request({
method: "GET", path: "/v1/clusters"
}).then(r => r.body.data);
const kube = (clusterId, path) => cnap.request({
method: "GET",
path: `/v1/clusters/${clusterId}/kube/${path}`,
}).then(r => r.body).catch(() => null);
// Parallel fetch across all clusters
const results = await Promise.all(clusters.map(async (cluster) => {
const [nodes, version] = await Promise.all([
kube(cluster.id, "api/v1/nodes"),
kube(cluster.id, "version"),
]);
if (!nodes) return { cluster: cluster.name, status: "unreachable" };
return {
cluster: cluster.name,
k8s_version: version?.gitVersion,
nodes: nodes.items.map(n => ({
name: n.metadata.name,
kubelet: n.status.nodeInfo.kubeletVersion,
os: n.status.nodeInfo.osImage,
runtime: n.status.nodeInfo.containerRuntimeVersion,
kernel: n.status.nodeInfo.kernelVersion,
})),
};
}));
// Find drift
const versions = [...new Set(results.filter(r => r.k8s_version).map(r => r.k8s_version))];
return {
cluster_count: clusters.length,
unique_k8s_versions: versions,
drift_detected: versions.length > 1,
clusters: results,
};
}