use async_trait::async_trait;
use std::sync::Arc;
use tokio::sync::Mutex;
use crate::app_state::{AppState, ConnectionStatus};
use crate::device::{
ChassisInfo, CpuInfo, GpuInfo, MemoryInfo, MigGpuInfo, ProcessInfo, VgpuHostInfo,
};
use crate::network::metrics_parser::ParsedProcessRow;
use crate::storage::info::StorageInfo;
pub type CollectionResult = Result<CollectionData, CollectionError>;
#[derive(Clone)]
pub struct CollectionData {
pub gpu_info: Vec<GpuInfo>,
pub cpu_info: Vec<CpuInfo>,
pub memory_info: Vec<MemoryInfo>,
pub process_info: Vec<ProcessInfo>,
pub storage_info: Vec<StorageInfo>,
pub chassis_info: Vec<ChassisInfo>,
pub vgpu_info: Vec<VgpuHostInfo>,
pub mig_info: Vec<MigGpuInfo>,
pub connection_statuses: Vec<ConnectionStatus>,
pub remote_process_info: Vec<ParsedProcessRow>,
}
impl CollectionData {
pub fn new() -> Self {
Self {
gpu_info: Vec::new(),
cpu_info: Vec::new(),
memory_info: Vec::new(),
process_info: Vec::new(),
storage_info: Vec::new(),
chassis_info: Vec::new(),
vgpu_info: Vec::new(),
mig_info: Vec::new(),
connection_statuses: Vec::new(),
remote_process_info: Vec::new(),
}
}
}
impl Default for CollectionData {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, thiserror::Error)]
#[allow(dead_code)]
pub enum CollectionError {
#[error("Connection error: {0}")]
ConnectionError(String),
#[error("Parse error: {0}")]
ParseError(String),
#[error("I/O error: {0}")]
IoError(#[from] std::io::Error),
#[error("Other error: {0}")]
Other(String),
}
#[derive(Debug, Clone)]
pub struct CollectionConfig {
pub interval: u64,
pub first_iteration: bool,
pub hosts: Vec<String>,
}
impl Default for CollectionConfig {
fn default() -> Self {
Self {
interval: 2,
first_iteration: true,
hosts: Vec::new(),
}
}
}
#[async_trait]
#[allow(dead_code)]
pub trait DataCollectionStrategy: Send + Sync {
async fn collect(&self, config: &CollectionConfig) -> CollectionResult;
async fn update_state(
&self,
app_state: Arc<Mutex<AppState>>,
data: CollectionData,
config: &CollectionConfig,
);
fn strategy_type(&self) -> &str;
async fn is_ready(&self) -> bool {
true
}
}