2
0
Ficheiros
rocm-systems/projects/rocprofiler-compute/tools/config_management/parse_config_template.py
T
2025-10-22 15:17:43 -04:00

114 linhas
3.5 KiB
Python

#!/usr/bin/env python3
"""
Parse panel configuration based on YAML files for an architecture.
Usage:
python parse_config_template.py <dir_path> [output_file.yaml] [--latest-arch ARCH]
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
from typing import Any, Optional
try:
from . import utils as cm_utils
except Exception:
repo_root = Path(__file__).resolve().parents[1]
if str(repo_root) not in sys.path:
sys.path.insert(0, str(repo_root))
try:
import config_management.utils as cm_utils # type: ignore
except Exception:
import utils as cm_utils # type: ignore
AUTOGEN_TEXT = (
"# AUTOGENERATED FILE. Only edit for testing purposes, not for development. "
"Generated by tools/config_management/parse_config_template.py\n"
)
def parse_panel_config(yaml_file: Path) -> Optional[dict]:
"""Parse a single YAML file and extract panel and data source info."""
data = cm_utils.load_yaml(yaml_file)
panel_config = data.get("Panel Config")
if not isinstance(panel_config, dict):
return None
filename = (
yaml_file.name.split("_", 1)[1] if "_" in yaml_file.name else yaml_file.name
)
panel_id = panel_config.get("id")
if panel_id and panel_id >= 100:
panel_id = panel_id // 100
data_sources = []
for ds in panel_config.get("data source", []):
for key, value in ds.items():
if isinstance(value, dict) and "id" in value and "title" in value:
data_sources.append({
"type": key,
"id": value["id"] % 100,
"title": value["title"],
})
return {
"file": filename,
"panel_id": panel_id,
"panel_title": panel_config.get("title"),
"panel_alias": panel_config.get("alias"),
"data_sources": data_sources,
}
def main() -> None:
parser = argparse.ArgumentParser(
description="Parse panel configuration from YAML files"
)
parser.add_argument("directory", help="Directory containing YAML files")
parser.add_argument("output", nargs="?", help="Output YAML file (optional)")
parser.add_argument(
"--latest-arch",
help="Specify this architecture as latest (adds metadata to output)",
)
args = parser.parse_args()
directory = Path(args.directory)
if not directory.is_dir():
print(f"Error: '{args.directory}' is not a valid directory")
sys.exit(1)
results = []
for yaml_file in sorted(directory.glob("*.yaml")):
parsed = parse_panel_config(yaml_file)
if parsed:
results.append(parsed)
if not results:
print("No valid panel configurations found.")
sys.exit(1)
for panel in results:
print(f"\n{'=' * 80}")
print(f"File: {panel['file']}")
print(f"Panel ID: {panel['panel_id']}")
print(f"Panel Title: {panel['panel_title']}")
if panel.get("panel_alias"):
print(f"Panel Alias: {panel['panel_alias']}")
print(f"\nData Sources ({len(panel['data_sources'])}):")
for ds in panel["data_sources"]:
print(f" - {ds['type']}: {ds['id']} - {ds['title']}")
if args.output:
output_data: Any = results
if args.latest_arch:
output_data = {"latest_arch": args.latest_arch, "panels": results}
cm_utils.save_yaml(output_data, args.output, AUTOGEN_TEXT)
print(f"\nResults saved to: {args.output}")
if __name__ == "__main__":
main()