From 1105ed409d3e95fb608d9ce539983957f28092cc Mon Sep 17 00:00:00 2001 From: Nicolas Saillant Date: Fri, 29 Nov 2024 15:43:57 +0100 Subject: [PATCH] Add Docker information retrieval and reporting to testsuite report script --- .../cgal_testsuite_report.py | 45 ++++ .../list_test_runner_machines | 199 ++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100755 Scripts/developer_scripts/list_test_runner_machines diff --git a/Scripts/developer_scripts/cgal_testsuite_report.py b/Scripts/developer_scripts/cgal_testsuite_report.py index 1ca33b8d9b5..039a1dfc244 100644 --- a/Scripts/developer_scripts/cgal_testsuite_report.py +++ b/Scripts/developer_scripts/cgal_testsuite_report.py @@ -2,6 +2,8 @@ import json from typing import Dict, List from dataclasses import dataclass from datetime import datetime +from collections import defaultdict +import subprocess import re import requests @@ -82,12 +84,15 @@ def fragment_name(platform: PlatformInfo) -> str: def generate_markdown_report(platforms_info: List[PlatformInfo], version: str) -> str: """Generate a markdown report from the platforms information.""" + machines_info = get_docker_info() + update_machines_platforms(machines_info, platforms_info) report = [] report.append("# TestSuite Report") report.append(f"\nGenerated on: { datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") url = TESTSUITE_URL_TEMPLATE.format(version=version) report.append(f"\nCGAL Version: [{version}]({url})\n") + add_machines_summary(report, machines_info) report.append("## Platforms Summary\n") report.append("| Platform | Debug | OS | Tester | Compiler |") report.append("|----------|-------|----|--------|----------|") @@ -113,6 +118,46 @@ def generate_markdown_report(platforms_info: List[PlatformInfo], version: str) - f"\n**Summary**: found {found_tpls} third-party libraries out of {total_tpls}") return "\n".join(report) +def get_docker_info() -> Dict[str, Dict[str, List[str]]]: + """Get Docker container information from test machines.""" + result = subprocess.run(['./list_test_runner_machines', '--table'], + capture_output=True, text=True, check=True) + machines_info = defaultdict(lambda: {'containers': [], 'platforms': set()}) + current_machine = "" + for line in result.stdout.split('\n'): + if line.startswith('## '): + current_machine = line.lstrip('# ').strip() + elif line.startswith('| CGAL-') and current_machine: + container = line.split('|')[1].strip() + machines_info[current_machine]['containers'].append(container) + return dict(machines_info) + +def update_machines_platforms(machines_info: Dict[str, Dict[str, List[str]]], platforms_info: List[PlatformInfo]): + """Update machines info with platform names.""" + machine_mapping = { + 'Friedrich': 'cgaltest@friedrich', + 'friedrich': 'cgaltest@friedrich', + 'cgal': 'lrineau@cgal', + 'cgal (GF)': 'lrineau@cgal', + 'Rubens': 'lrineau@rubens', + 'rubens': 'lrineau@rubens', + 'bonnard': 'lrineau@bonnard' + } + for platform in platforms_info: + if platform.tester in machine_mapping: + machine = machine_mapping[platform.tester] + if machine in machines_info: + machines_info[machine]['platforms'].add(platform.name) + +def add_machines_summary(report: List[str], machines_info: Dict[str, Dict[str, List[str]]]): + """Add machines summary to the report.""" + report.append("\n## Test Machines Summary\n") + report.append("| Machine | Containers Count | Platforms |") + report.append("|---------|-----------------|-----------|") + for machine, info in machines_info.items(): + containers_count = len(info['containers']) + platforms = ', '.join(sorted(info['platforms'])) or '-' + report.append(f"| {machine} | {containers_count} | {platforms} |") def main(): """Main function to generate the testsuite report.""" diff --git a/Scripts/developer_scripts/list_test_runner_machines b/Scripts/developer_scripts/list_test_runner_machines new file mode 100755 index 00000000000..0f7b13d251c --- /dev/null +++ b/Scripts/developer_scripts/list_test_runner_machines @@ -0,0 +1,199 @@ +#!/bin/bash + +TEST_MACHINES=$( + cat <<'HEREDOC' +lrineau@bonnard +lrineau@cgal +cgaltest@friedrich +lrineau@rubens +HEREDOC +) + +cat </dev/null || { + echo 'sed is required' + exit 1 +} + +if [[ $1 == --table ]] && ! command -v pandoc >/dev/null; then + echo 'pandoc is required for the option --table' + exit 1 +fi +if [[ $1 == --column ]] && ! command -v column >/dev/null; then + echo 'column is required for the option --column' + exit 1 +fi +if [[ $1 == --bat ]] && ! command -v bat >/dev/null; then + echo 'bat is required for the option --bat' + exit 1 +fi + +set_pretty_csv_to_md_table() { + pretty_csv() ( + echo + sed '/```/ d; /^$/ d' | pandoc -f tsv -t gfm + ) +} + +set_pretty_csv_to_column() { + pretty_csv() { + echo + column -t -s $'\t' -o $'\t' | sed 's/^\(```[^ ]*\) *\t.*/\1/' + } +} + +set_pretty_csv_to_bat() { + pretty_csv() { + bat --tabs=50 --paging=never --plain -l csv + } +} + +set_pretty_csv_to_cat() { + pretty_csv() { + cat + } +} + +case "$1" in +--table) set_pretty_csv_to_md_table ;; +--column) set_pretty_csv_to_column ;; +--bat) set_pretty_csv_to_bat ;; +--plain) set_pretty_csv_to_cat ;; +'') + if command -v bat >/dev/null; then + set_pretty_csv_to_bat + elif command -v column >/dev/null; then + set_pretty_csv_to_column + else + set_pretty_csv_to_cat + fi + ;; +*) + echo "Unknown option $1" + exit 1 + ;; +esac + +for machine in $TEST_MACHINES; do + USER=${machine%@*} + HOST=${machine#*@} + machine_title $machine + printf '\nusing `%s`\n' "$(ssh $HOST docker --version)" + printf '\nTested images:\n' + machine_tested_images $HOST $USER + printf '\nCGAL test containers:\n' + machine_list_cgal_test_container $HOST $USER | pretty_csv +done