Skip to content

Commit f946aea

Browse files
authored
Merge pull request #108 from ethpandaops/feat/add-unknown-clients
feat(fork-readiness): display unknown consensus clients that lack min version config
2 parents 75d4181 + 82e3607 commit f946aea

File tree

1 file changed

+69
-8
lines changed
  • frontend/src/pages/xatu-data/fork-readiness

1 file changed

+69
-8
lines changed

frontend/src/pages/xatu-data/fork-readiness/index.tsx

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,10 @@ function ForkReadiness() {
105105
return (
106106
availableForks
107107
.map(fork => {
108-
const clientReadiness = Object.entries(fork.data.min_client_versions || {})
108+
const knownClientNames = Object.keys(fork.data.min_client_versions || {});
109+
110+
// Process known clients
111+
const knownClientReadiness = Object.entries(fork.data.min_client_versions || {})
109112
.map(([clientName, minVersion]) => {
110113
const clientNodes = nodes.filter(n => n.consensus_client === clientName);
111114
const readyNodes = clientNodes.filter(n => {
@@ -139,8 +142,47 @@ function ForkReadiness() {
139142
})),
140143
};
141144
})
142-
.filter(client => client.totalNodes > 0) // Only show clients with nodes
143-
.sort((a, b) => b.totalNodes - a.totalNodes);
145+
.filter(client => client.totalNodes > 0); // Only show clients with nodes
146+
147+
// Find and group unknown clients
148+
const unknownNodes = nodes.filter(n => !knownClientNames.includes(n.consensus_client));
149+
const unknownClientGroups = {};
150+
151+
// Group unknown nodes by consensus_client
152+
unknownNodes.forEach(node => {
153+
if (!unknownClientGroups[node.consensus_client]) {
154+
unknownClientGroups[node.consensus_client] = [];
155+
}
156+
unknownClientGroups[node.consensus_client].push(node);
157+
});
158+
159+
// Create readiness entries for unknown clients
160+
const unknownClientReadiness = Object.entries(unknownClientGroups).map(
161+
([clientName, clientNodes]) => ({
162+
name: clientName,
163+
totalNodes: clientNodes.length,
164+
readyNodes: 0, // Unknown clients are never ready
165+
readyPercentage: 0, // Always 0% ready
166+
minVersion: 'Not configured',
167+
isUnknown: true, // Flag to identify unknown clients
168+
nodes: clientNodes.map(n => ({
169+
name: n.client_name,
170+
version: n.consensus_version,
171+
isReady: false, // Always not ready
172+
})),
173+
}),
174+
);
175+
176+
// Combine and sort all clients (unknown clients always last)
177+
const clientReadiness = [...knownClientReadiness, ...unknownClientReadiness].sort(
178+
(a, b) => {
179+
// Unknown clients always come after known clients
180+
if (a.isUnknown && !b.isUnknown) return 1;
181+
if (!a.isUnknown && b.isUnknown) return -1;
182+
// Within the same category, sort by total nodes
183+
return b.totalNodes - a.totalNodes;
184+
},
185+
);
144186

145187
const totalNodes = clientReadiness.reduce((acc, client) => acc + client.totalNodes, 0);
146188
const readyNodes = clientReadiness.reduce((acc, client) => acc + client.readyNodes, 0);
@@ -354,8 +396,18 @@ function ForkReadiness() {
354396
{CLIENT_METADATA[client.name]?.name || client.name}
355397
</div>
356398
<div className="text-xs font-mono text-tertiary mt-0.5">
357-
min v{client.minVersion} · {client.readyPercentage.toFixed(1)}%
358-
ready ({client.readyNodes}/{client.totalNodes})
399+
{client.isUnknown ? (
400+
<>
401+
<span className="text-warning">Not configured</span> · 0%
402+
ready ({client.readyNodes}/{client.totalNodes})
403+
</>
404+
) : (
405+
<>
406+
min v{client.minVersion} ·{' '}
407+
{client.readyPercentage.toFixed(1)}% ready (
408+
{client.readyNodes}/{client.totalNodes})
409+
</>
410+
)}
359411
</div>
360412
</div>
361413
</div>
@@ -504,9 +556,18 @@ function ForkReadiness() {
504556
{CLIENT_METADATA[client.name]?.name || client.name}
505557
</div>
506558
<div className="text-xs font-mono text-tertiary mt-0.5">
507-
min v{client.minVersion} ·{' '}
508-
{client.readyPercentage.toFixed(1)}% ready (
509-
{client.readyNodes}/{client.totalNodes})
559+
{client.isUnknown ? (
560+
<>
561+
<span className="text-warning">Not configured</span>{' '}
562+
· 0% ready ({client.readyNodes}/{client.totalNodes})
563+
</>
564+
) : (
565+
<>
566+
min v{client.minVersion} ·{' '}
567+
{client.readyPercentage.toFixed(1)}% ready (
568+
{client.readyNodes}/{client.totalNodes})
569+
</>
570+
)}
510571
</div>
511572
</div>
512573
</div>

0 commit comments

Comments
 (0)