private void addNodeMessages(List<NodeMessage> nodeMessages, HtmlTable.Row nodeRow) {
            if (nodeMessages.isEmpty()) {
                return;
            }
            for (var msg : nodeMessages) {
                HtmlTable.Row feedBlockRow = new HtmlTable.Row();
                var severityProperty = (msg.severity() == MessageSeverity.ERROR) ? ERROR_PROPERTY : WARNING_PROPERTY;
                var cell = new HtmlTable.Cell(msg.rawMessage()).addProperties(severityProperty);
                cell.addProperties(new HtmlTable.CellProperties().setColSpan(NUM_NODE_TABLE_COLUMNS));
                feedBlockRow.addCell(cell);
                table.addRow(feedBlockRow);
            }
            // Retroactively make the node index cell span multiple rows so it's obvious (hopefully)
            // what node the feed block state is related to. Must also include original non-warning row,
            // which contains all the juicy bits of information we all know and love.
            nodeRow.cells.get(0).addProperties(new HtmlTable.CellProperties().setRowSpan(nodeMessages.size() + 1));
        }
Renders web page with cluster status.
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java