""" Pydantic schemas for system stats module """ from pydantic import Field from typing import Optional, List from datetime import datetime from src.shared.base import BaseSchema class CpuStats(BaseSchema): """CPU usage statistics""" usage_percent: float = Field( ..., description="CPU usage percentage (0-100)", ge=0, le=100 ) cores: int = Field( ..., description="Number of CPU cores" ) load_1m: Optional[float] = Field( default=None, description="1-minute load average" ) load_5m: Optional[float] = Field( default=None, description="5-minute load average" ) load_15m: Optional[float] = Field( default=None, description="15-minute load average" ) class MemoryStats(BaseSchema): """Memory usage statistics""" usage_percent: float = Field( ..., description="Memory usage percentage (0-100)", ge=0, le=100 ) total_bytes: int = Field( ..., description="Total memory in bytes" ) used_bytes: int = Field( ..., description="Used memory in bytes" ) available_bytes: int = Field( ..., description="Available memory in bytes" ) class DiskStats(BaseSchema): """Disk usage statistics for a single mount point""" mount_point: str = Field( ..., description="Mount point path" ) device: str = Field( ..., description="Device name (e.g., /dev/sda1)" ) fstype: str = Field( ..., description="Filesystem type (e.g., ext4, xfs)" ) usage_percent: float = Field( ..., description="Disk usage percentage (0-100)", ge=0, le=100 ) total_bytes: int = Field( ..., description="Total disk space in bytes" ) used_bytes: int = Field( ..., description="Used disk space in bytes" ) free_bytes: int = Field( ..., description="Free disk space in bytes" ) class NetworkStats(BaseSchema): """Network I/O statistics""" bytes_sent: int = Field( ..., description="Total bytes sent" ) bytes_recv: int = Field( ..., description="Total bytes received" ) bytes_total: int = Field( ..., description="Total bytes (sent + received)" ) class GpuStats(BaseSchema): """GPU/VRAM statistics (if available)""" available: bool = Field( ..., description="Whether GPU stats are available" ) name: Optional[str] = Field( default=None, description="GPU name" ) usage_percent: Optional[float] = Field( default=None, description="VRAM usage percentage (0-100)" ) total_bytes: Optional[int] = Field( default=None, description="Total VRAM in bytes" ) used_bytes: Optional[int] = Field( default=None, description="Used VRAM in bytes" ) free_bytes: Optional[int] = Field( default=None, description="Free VRAM in bytes" ) class SystemStatsResponse(BaseSchema): """Response model for system stats""" cpu: CpuStats = Field( ..., description="CPU statistics" ) memory: MemoryStats = Field( ..., description="Memory statistics" ) disks: List[DiskStats] = Field( ..., description="Disk statistics for all mounted filesystems" ) network: NetworkStats = Field( ..., description="Network I/O statistics" ) gpu: GpuStats = Field( ..., description="GPU/VRAM statistics" ) hostname: str = Field( ..., description="System hostname" ) queried_at: datetime = Field( ..., description="UTC timestamp when stats were collected" )