173 lines
5.8 KiB
Python
173 lines
5.8 KiB
Python
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
|