Files
serv_benchmark/backend/app/schemas/benchmark.py
2025-12-14 10:40:54 +01:00

110 lines
3.2 KiB
Python

"""
Linux BenchTools - Benchmark Schemas
"""
from pydantic import BaseModel, Field
from typing import Optional
from app.schemas.hardware import HardwareData
class CPUResults(BaseModel):
"""CPU benchmark results"""
events_per_sec: Optional[float] = Field(None, ge=0)
duration_s: Optional[float] = Field(None, ge=0)
score: Optional[float] = Field(None, ge=0, le=10000)
class MemoryResults(BaseModel):
"""Memory benchmark results"""
throughput_mib_s: Optional[float] = Field(None, ge=0)
score: Optional[float] = Field(None, ge=0, le=10000)
class DiskResults(BaseModel):
"""Disk benchmark results"""
read_mb_s: Optional[float] = Field(None, ge=0)
write_mb_s: Optional[float] = Field(None, ge=0)
iops_read: Optional[int] = Field(None, ge=0)
iops_write: Optional[int] = Field(None, ge=0)
latency_ms: Optional[float] = Field(None, ge=0)
score: Optional[float] = Field(None, ge=0, le=10000)
class NetworkResults(BaseModel):
"""Network benchmark results"""
upload_mbps: Optional[float] = Field(None, ge=0)
download_mbps: Optional[float] = Field(None, ge=0)
ping_ms: Optional[float] = Field(None, ge=0)
jitter_ms: Optional[float] = Field(None, ge=0)
packet_loss_percent: Optional[float] = Field(None, ge=0, le=100)
score: Optional[float] = Field(None, ge=0, le=10000)
class GPUResults(BaseModel):
"""GPU benchmark results"""
glmark2_score: Optional[int] = Field(None, ge=0)
score: Optional[float] = Field(None, ge=0, le=10000)
class BenchmarkResults(BaseModel):
"""Complete benchmark results"""
cpu: Optional[CPUResults] = None
memory: Optional[MemoryResults] = None
disk: Optional[DiskResults] = None
network: Optional[NetworkResults] = None
gpu: Optional[GPUResults] = None
global_score: float = Field(..., ge=0, le=10000, description="Global score (0-10000)")
class BenchmarkPayload(BaseModel):
"""Complete benchmark payload from client script"""
device_identifier: str = Field(..., min_length=1, max_length=255)
bench_script_version: str = Field(..., min_length=1, max_length=50)
hardware: HardwareData
results: BenchmarkResults
class BenchmarkResponse(BaseModel):
"""Response after successful benchmark submission"""
status: str = "ok"
device_id: int
benchmark_id: int
message: Optional[str] = None
class BenchmarkDetail(BaseModel):
"""Detailed benchmark information"""
id: int
device_id: int
hardware_snapshot_id: int
run_at: str
bench_script_version: str
global_score: float
cpu_score: Optional[float] = None
memory_score: Optional[float] = None
disk_score: Optional[float] = None
network_score: Optional[float] = None
gpu_score: Optional[float] = None
details: dict # details_json parsed
class Config:
from_attributes = True
class BenchmarkSummary(BaseModel):
"""Summary benchmark information for lists"""
id: int
run_at: str
global_score: float
cpu_score: Optional[float] = None
memory_score: Optional[float] = None
disk_score: Optional[float] = None
network_score: Optional[float] = None
gpu_score: Optional[float] = None
bench_script_version: Optional[str] = None
class Config:
from_attributes = True