private void renderNodesOneType(
                final TreeMap<Integer, NodeInfo> nodeInfos,
                final TreeMap<Integer, NodeInfo> otherNodeInfos,
                final NodeType nodeType,
                final Timer timer,
                final ClusterStateBundle stateBundle,
                final ClusterStatsAggregator statsAggregator,
                final double minMergeCompletionRatio,
                final int maxPrematureCrashes,
                final Map<String, Double> feedBlockLimits,
                final EventLog eventLog,
                final String pathPrefix,
                final String dominantVtag,
                final String name) {
            final ClusterState state = stateBundle.getBaselineClusterState();
            final long currentTime = timer.getCurrentTimeInMillis();
            addTableHeader(name, nodeType);
            for (final NodeInfo nodeInfo : nodeInfos.values()) {
                HtmlTable.Row row = new HtmlTable.Row();
                long timeSinceContact = nodeInfo.getTimeOfFirstFailingConnectionAttempt() == 0
                        ? 0 : currentTime - nodeInfo.getTimeOfFirstFailingConnectionAttempt();

                addNodeIndex(pathPrefix, nodeInfo, row);
                addReportedState(nodeInfo, row);
                addWantedState(nodeInfo, row);
                addCurrentState(state, nodeInfo, row);
                addBuildTagVersion(dominantVtag, nodeInfo, row);
                addFailedConnectionAttemptCount(nodeInfo, row, timeSinceContact);
                addTimeSinceFirstFailing(nodeInfo, row, timeSinceContact);
                addStatePendingTime(currentTime, nodeInfo, row);
                addClusterStateVersion(stateBundle, nodeInfo, row);
                addPrematureCrashes(maxPrematureCrashes, nodeInfo, row);
                addEventsLastWeek(eventLog, currentTime, nodeInfo, row);
                addBucketSpacesStats(nodeType, statsAggregator, minMergeCompletionRatio, nodeInfo, row);
                addResourceUsage(nodeInfo, feedBlockLimits, row);
                addStartTime(nodeInfo, row);
                addRpcAddress(nodeInfo, row);

                table.addRow(row);
                if (nodeType.equals(NodeType.STORAGE)) {
                    var warnings = Stream.of(feedBlockWarningIfNodeIsBlocking(stateBundle, nodeInfo),
                                             contentNodeIssueWarningIfDistributorsReportErrors(stateBundle, nodeInfo, otherNodeInfos, statsAggregator))
                            .filter(Optional::isPresent)
                            .map(Optional::get)
                            .toList();
                    addNodeMessages(warnings, row);
                }
            }
        }
Renders web page with cluster status.
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java