Bruno Charest 6d8432169b
Some checks failed
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled
Add enhanced terminal history panel UI with animations, keyboard navigation, advanced filtering, search highlighting, and improved storage metrics display with detailed filesystem tables and ZFS/LVM support
2025-12-21 12:31:08 -05:00

179 lines
5.9 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
# Stockage détaillé (avec métadonnées de collecte)
storage_details: 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
# Stockage détaillé
storage_details: 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