use crate::device::{ChassisInfo, ChassisReader};
use crate::utils::get_hostname;
use chrono::Local;
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
#[allow(dead_code)]
pub struct GenericChassisReader {
hostname: String,
cached_gpu_power: Arc<RwLock<Option<f64>>>,
}
impl Default for GenericChassisReader {
fn default() -> Self {
Self::new()
}
}
#[allow(dead_code)]
impl GenericChassisReader {
pub fn new() -> Self {
Self {
hostname: get_hostname(),
cached_gpu_power: Arc::new(RwLock::new(None)),
}
}
pub fn update_gpu_power(&self, total_gpu_power_watts: f64) {
if let Ok(mut power) = self.cached_gpu_power.write() {
*power = Some(total_gpu_power_watts);
}
}
fn get_cached_gpu_power(&self) -> Option<f64> {
self.cached_gpu_power.read().ok().and_then(|p| *p)
}
}
impl ChassisReader for GenericChassisReader {
fn get_chassis_info(&self) -> Option<ChassisInfo> {
let detail = {
#[allow(unused_mut)]
let mut d = HashMap::new();
#[cfg(target_os = "linux")]
d.insert("platform".to_string(), "Linux".to_string());
#[cfg(target_os = "windows")]
d.insert("platform".to_string(), "Windows".to_string());
d
};
let total_power_watts = self.get_cached_gpu_power();
let hostname = self.hostname.clone();
Some(ChassisInfo {
host_id: hostname.clone(),
hostname: hostname.clone(),
instance: hostname,
total_power_watts,
inlet_temperature: None, outlet_temperature: None, thermal_pressure: None, fan_speeds: Vec::new(), psu_status: Vec::new(), detail,
time: Local::now().format("%Y-%m-%d %H:%M:%S").to_string(),
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_generic_chassis_reader_creation() {
let reader = GenericChassisReader::new();
assert!(!reader.hostname.is_empty());
}
#[test]
fn test_update_gpu_power() {
let reader = GenericChassisReader::new();
reader.update_gpu_power(350.5);
let chassis_info = reader.get_chassis_info();
assert!(chassis_info.is_some());
let info = chassis_info.unwrap();
assert_eq!(info.total_power_watts, Some(350.5));
}
#[test]
fn test_chassis_info_without_gpu_power() {
let reader = GenericChassisReader::new();
let chassis_info = reader.get_chassis_info();
assert!(chassis_info.is_some());
let info = chassis_info.unwrap();
assert!(info.total_power_watts.is_none());
assert!(!info.hostname.is_empty());
}
}