- Fix YAML tags in auth config struct (json -> yaml) - Update CLI configs to use pre-hashed API keys - Remove double hashing in WebSocket client - Fix port mapping (9102 -> 9103) in CLI commands - Update permission keys to use jobs:read, jobs:create, etc. - Clean up all debug logging from CLI and server - All user roles now authenticate correctly: * Admin: Can queue jobs and see all jobs * Researcher: Can queue jobs and see own jobs * Analyst: Can see status (read-only access) Multi-user authentication is now fully functional.
213 lines
7.5 KiB
Bash
Executable file
213 lines
7.5 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Artifact Management Script
|
|
# Manage local benchmark artifacts
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
LOCAL_ARTIFACTS_DIR="$PROJECT_ROOT/.local-artifacts"
|
|
|
|
# Create artifacts directory if it doesn't exist
|
|
mkdir -p "$LOCAL_ARTIFACTS_DIR"
|
|
|
|
case "${1:-help}" in
|
|
"list")
|
|
echo "=== Benchmark Runs ==="
|
|
if [ -d "$LOCAL_ARTIFACTS_DIR" ]; then
|
|
ls -lt "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | while read -r line; do
|
|
run_dir=$(echo "$line" | awk '{print $9}')
|
|
if [ -n "$run_dir" ]; then
|
|
timestamp=$(basename "$run_dir" | sed 's/run_//')
|
|
echo "Run: $timestamp"
|
|
echo " Path: $run_dir"
|
|
if [ -f "$run_dir/report.html" ]; then
|
|
echo " Report: $run_dir/report.html"
|
|
fi
|
|
if [ -f "$run_dir/prometheus_metrics.txt" ]; then
|
|
metrics_count=$(grep -c "benchmark_" "$run_dir/prometheus_metrics.txt" 2>/dev/null || echo "0")
|
|
echo " Metrics: $metrics_count benchmarks"
|
|
fi
|
|
echo ""
|
|
fi
|
|
done
|
|
else
|
|
echo "No artifacts found"
|
|
fi
|
|
;;
|
|
|
|
"clean")
|
|
echo "=== Cleaning Artifacts ==="
|
|
case "${2:-all}" in
|
|
"all")
|
|
echo "Removing all artifacts..."
|
|
rm -rf "$LOCAL_ARTIFACTS_DIR"
|
|
echo "All artifacts removed"
|
|
;;
|
|
"old")
|
|
keep_count="${3:-10}"
|
|
echo "Keeping last $keep_count runs, removing older ones..."
|
|
cd "$LOCAL_ARTIFACTS_DIR"
|
|
ls -1t run_* 2>/dev/null | tail -n +$((keep_count + 1)) | while read -r run; do
|
|
echo "Removing: $run"
|
|
rm -rf "$run"
|
|
done
|
|
;;
|
|
"run")
|
|
run_id="${3:-}"
|
|
if [ -z "$run_id" ]; then
|
|
echo "Usage: $0 clean run <run_id>"
|
|
echo "Available runs:"
|
|
ls -1 "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | sed 's/.*run_//' || echo "No runs found"
|
|
exit 1
|
|
fi
|
|
run_dir="$LOCAL_ARTIFACTS_DIR/run_$run_id"
|
|
if [ -d "$run_dir" ]; then
|
|
echo "Removing run: $run_id"
|
|
rm -rf "$run_dir"
|
|
else
|
|
echo "Run not found: $run_id"
|
|
fi
|
|
;;
|
|
*)
|
|
echo "Usage: $0 clean [all|old|run <run_id>]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
"compare")
|
|
run1="${2:-}"
|
|
run2="${3:-}"
|
|
if [ -z "$run1" ] || [ -z "$run2" ]; then
|
|
echo "Usage: $0 compare <run_id1> <run_id2>"
|
|
echo "Available runs:"
|
|
ls -1 "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | sed 's/.*run_//' || echo "No runs found"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== Comparing Runs ==="
|
|
echo "Run 1: $run1"
|
|
echo "Run 2: $run2"
|
|
echo ""
|
|
|
|
metrics1="$LOCAL_ARTIFACTS_DIR/run_$run1/prometheus_metrics.txt"
|
|
metrics2="$LOCAL_ARTIFACTS_DIR/run_$run2/prometheus_metrics.txt"
|
|
|
|
if [ ! -f "$metrics1" ] || [ ! -f "$metrics2" ]; then
|
|
echo "One or both runs not found"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Benchmark Comparison:"
|
|
printf "%-40s %-15s %-15s %-10s\n" "Benchmark" "Run 1 (ns)" "Run 2 (ns)" "Change"
|
|
printf "%-40s %-15s %-15s %-10s\n" "--------" "----------" "----------" "------"
|
|
|
|
grep "benchmark_time_per_op" "$metrics1" | while read -r line1; do
|
|
benchmark=$(echo "$line1" | sed 's/.*benchmark="\([^"]*\)".*/\1/')
|
|
value1=$(echo "$line1" | awk '{print $2}')
|
|
|
|
line2=$(grep "benchmark_time_per_op.*benchmark=\"$benchmark\"" "$metrics2" || true)
|
|
if [ -n "$line2" ]; then
|
|
value2=$(echo "$line2" | awk '{print $2}')
|
|
|
|
# Calculate percentage change
|
|
if [ "$value1" != "0" ]; then
|
|
change=$(echo "scale=2; (($value2 - $value1) / $value1) * 100" | bc 2>/dev/null || echo "N/A")
|
|
printf "%-40s %-15s %-15s %-10s\n" "$benchmark" "$value1" "$value2" "${change}%"
|
|
else
|
|
printf "%-40s %-15s %-15s %-10s\n" "$benchmark" "$value1" "$value2" "N/A"
|
|
fi
|
|
fi
|
|
done
|
|
;;
|
|
|
|
"export")
|
|
run_id="${2:-}"
|
|
format="${3:-json}"
|
|
if [ -z "$run_id" ]; then
|
|
echo "Usage: $0 export <run_id> [json|csv]"
|
|
echo "Available runs:"
|
|
ls -1 "$LOCAL_ARTIFACTS_DIR"/run_* 2>/dev/null | sed 's/.*run_//' || echo "No runs found"
|
|
exit 1
|
|
fi
|
|
|
|
run_dir="$LOCAL_ARTIFACTS_DIR/run_$run_id"
|
|
if [ ! -d "$run_dir" ]; then
|
|
echo "Run not found: $run_id"
|
|
exit 1
|
|
fi
|
|
|
|
output_file="$LOCAL_ARTIFACTS_DIR/export_${run_id}.$format"
|
|
|
|
case "$format" in
|
|
"json")
|
|
echo "Exporting run $run_id to JSON..."
|
|
python3 -c "
|
|
import json
|
|
import sys
|
|
|
|
metrics = []
|
|
with open('$run_dir/prometheus_metrics.txt', 'r') as f:
|
|
for line in f:
|
|
if line.startswith('benchmark_time_per_op'):
|
|
parts = line.strip().split()
|
|
benchmark = parts[0].split('benchmark=\"')[1].rstrip('\"')
|
|
value = parts[1]
|
|
metrics.append({
|
|
'benchmark': benchmark,
|
|
'time_per_op_ns': int(value),
|
|
'run_id': '$run_id'
|
|
})
|
|
|
|
export_data = {
|
|
'run_id': '$run_id',
|
|
'timestamp': '$run_id',
|
|
'metrics': metrics
|
|
}
|
|
|
|
with open('$output_file', 'w') as f:
|
|
json.dump(export_data, f, indent=2)
|
|
"
|
|
;;
|
|
"csv")
|
|
echo "Exporting run $run_id to CSV..."
|
|
echo "benchmark,time_per_op_ns,run_id" > "$output_file"
|
|
grep "benchmark_time_per_op" "$run_dir/prometheus_metrics.txt" | while read -r line; do
|
|
benchmark=$(echo "$line" | sed 's/.*benchmark="\([^"]*\)".*/\1/')
|
|
value=$(echo "$line" | awk '{print $2}')
|
|
echo "$benchmark,$value,$run_id" >> "$output_file"
|
|
done
|
|
;;
|
|
*)
|
|
echo "Unsupported format: $format"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo "Exported to: $output_file"
|
|
;;
|
|
|
|
"help"|*)
|
|
echo "Artifact Management Tool"
|
|
echo ""
|
|
echo "Usage: $0 <command> [args]"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " list List all benchmark runs"
|
|
echo " clean [all|old|run] Clean artifacts"
|
|
echo " all Remove all artifacts"
|
|
echo " old [count] Keep last N runs (default: 10)"
|
|
echo " run <run_id> Remove specific run"
|
|
echo " compare <run1> <run2> Compare two benchmark runs"
|
|
echo " export <run_id> [format] Export run data (json|csv)"
|
|
echo " help Show this help"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 list"
|
|
echo " $0 clean old 5"
|
|
echo " $0 compare 20241204_220000 20241204_230000"
|
|
echo " $0 export 20241204_220000 json"
|
|
;;
|
|
esac
|