from __future__ import annotations from datetime import datetime from typing import Optional, List, Dict, Any from pydantic import BaseModel, Field, ConfigDict class DiskInfo(BaseModel): """Informations sur un disque/partition""" mount_point: str filesystem: Optional[str] = None total_gb: float used_gb: float free_gb: float usage_percent: float class NetworkInterface(BaseModel): """Informations sur une interface réseau""" name: str ip_address: Optional[str] = None mac_address: Optional[str] = None status: Optional[str] = None class HostMetricsBase(BaseModel): """Schéma de base pour les métriques d'hôte""" metric_type: str = Field(..., description="Type de métrique (system_info, full, etc.)") # CPU cpu_count: Optional[int] = None cpu_model: Optional[str] = None cpu_cores: Optional[int] = None cpu_threads: Optional[int] = None cpu_threads_per_core: Optional[int] = None cpu_sockets: Optional[int] = None cpu_mhz: Optional[float] = None cpu_max_mhz: Optional[float] = None cpu_min_mhz: Optional[float] = None cpu_load_1m: Optional[float] = None cpu_load_5m: Optional[float] = None cpu_load_15m: Optional[float] = None cpu_usage_percent: Optional[float] = None cpu_temperature: Optional[float] = None # Memory memory_total_mb: Optional[int] = None memory_used_mb: Optional[int] = None memory_free_mb: Optional[int] = None memory_usage_percent: Optional[float] = None swap_total_mb: Optional[int] = None swap_used_mb: Optional[int] = None swap_usage_percent: Optional[float] = None # Disk disk_info: Optional[List[Dict[str, Any]]] = None disk_devices: Optional[List[Dict[str, Any]]] = None disk_root_total_gb: Optional[float] = None disk_root_used_gb: Optional[float] = None disk_root_usage_percent: Optional[float] = None # Storage stacks lvm_info: Optional[Dict[str, Any]] = None zfs_info: Optional[Dict[str, Any]] = None # System info os_name: Optional[str] = None os_version: Optional[str] = None kernel_version: Optional[str] = None hostname: Optional[str] = None uptime_seconds: Optional[int] = None uptime_human: Optional[str] = None # Network network_info: Optional[List[Dict[str, Any]]] = None class HostMetricsCreate(HostMetricsBase): """Schéma pour créer des métriques""" host_id: str raw_data: Optional[Dict[str, Any]] = None collection_source: Optional[str] = None collection_duration_ms: Optional[int] = None error_message: Optional[str] = None class HostMetricsOut(HostMetricsBase): """Schéma de sortie pour les métriques""" id: int host_id: str collected_at: datetime created_at: datetime collection_source: Optional[str] = None collection_duration_ms: Optional[int] = None error_message: Optional[str] = None model_config = ConfigDict(from_attributes=True) class HostMetricsSummary(BaseModel): """Résumé des métriques pour affichage dans la carte d'hôte""" host_id: str host_name: Optional[str] = None last_collected: Optional[datetime] = None # Résumé CPU cpu_usage_percent: Optional[float] = None cpu_load_1m: Optional[float] = None cpu_temperature: Optional[float] = None cpu_model: Optional[str] = None cpu_count: Optional[int] = None cpu_cores: Optional[int] = None cpu_threads: Optional[int] = None cpu_max_mhz: Optional[float] = None # Résumé mémoire memory_usage_percent: Optional[float] = None memory_total_mb: Optional[int] = None memory_used_mb: Optional[int] = None # Résumé disque (partition racine) disk_root_usage_percent: Optional[float] = None disk_root_total_gb: Optional[float] = None disk_root_used_gb: Optional[float] = None disk_info: Optional[List[Dict[str, Any]]] = None disk_devices: Optional[List[Dict[str, Any]]] = None # Storage stacks lvm_info: Optional[Dict[str, Any]] = None zfs_info: Optional[Dict[str, Any]] = None # Système os_name: Optional[str] = None uptime_human: Optional[str] = None # Statut de la collecte collection_status: str = "unknown" # success, failed, pending, unknown error_message: Optional[str] = None class BuiltinPlaybookDefinition(BaseModel): """Définition d'un builtin playbook""" id: str = Field(..., description="Identifiant unique du builtin playbook") name: str = Field(..., description="Nom affiché") description: str = Field(..., description="Description du playbook") playbook_file: str = Field(..., description="Nom du fichier playbook Ansible") category: str = Field(..., description="Catégorie (metrics, maintenance, etc.)") icon: str = Field(default="fas fa-cog", description="Icône FontAwesome") color: str = Field(default="blue", description="Couleur du bouton") collect_metrics: bool = Field(default=False, description="Si true, les résultats sont stockés comme métriques") schedule_enabled: bool = Field(default=True, description="Peut être planifié") visible_in_ui: bool = Field(default=True, description="Visible dans l'interface") class BuiltinPlaybookExecutionRequest(BaseModel): """Requête d'exécution d'un builtin playbook""" builtin_id: str = Field(..., description="ID du builtin playbook") target: str = Field(..., description="Cible (host ou groupe)") extra_vars: Optional[Dict[str, Any]] = None class BuiltinPlaybookExecutionResult(BaseModel): """Résultat d'exécution d'un builtin playbook""" success: bool builtin_id: str target: str execution_time: float metrics_saved: bool = False hosts_processed: int = 0 error: Optional[str] = None log_path: Optional[str] = None