use sysinfo::Disks;
use crate::storage::info::StorageInfo;
use crate::utils::{filter_docker_aware_disks, get_hostname};
#[allow(dead_code)] pub trait StorageReader: Send + Sync {
fn get_storage_info(&self) -> Vec<StorageInfo>;
}
#[allow(dead_code)] pub struct LocalStorageReader {
hostname: String,
}
impl LocalStorageReader {
#[allow(dead_code)] pub fn new() -> Self {
Self {
hostname: get_hostname(),
}
}
}
impl Default for LocalStorageReader {
fn default() -> Self {
Self::new()
}
}
impl StorageReader for LocalStorageReader {
fn get_storage_info(&self) -> Vec<StorageInfo> {
let disks = Disks::new_with_refreshed_list();
let mut filtered_disks = filter_docker_aware_disks(&disks);
filtered_disks.sort_by(|a, b| {
a.mount_point()
.to_string_lossy()
.cmp(&b.mount_point().to_string_lossy())
});
filtered_disks
.iter()
.enumerate()
.map(|(index, disk)| StorageInfo {
mount_point: disk.mount_point().to_string_lossy().to_string(),
total_bytes: disk.total_space(),
available_bytes: disk.available_space(),
host_id: self.hostname.clone(),
hostname: self.hostname.clone(),
index: index as u32,
})
.collect()
}
}
#[allow(dead_code)] pub fn create_storage_reader() -> Box<dyn StorageReader> {
Box::new(LocalStorageReader::new())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_local_storage_reader_creation() {
let reader = LocalStorageReader::new();
let _ = reader.get_storage_info();
}
#[test]
fn test_local_storage_reader_default() {
let reader = LocalStorageReader::default();
let _ = reader.get_storage_info();
}
#[test]
fn test_create_storage_reader() {
let reader = create_storage_reader();
let info = reader.get_storage_info();
for storage in &info {
assert!(!storage.mount_point.is_empty());
assert!(!storage.hostname.is_empty());
}
}
#[test]
fn test_storage_reader_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<LocalStorageReader>();
}
#[test]
fn test_storage_info_consistency() {
let reader = LocalStorageReader::new();
let info = reader.get_storage_info();
for storage in &info {
assert!(
storage.available_bytes <= storage.total_bytes,
"available_bytes ({}) should not exceed total_bytes ({})",
storage.available_bytes,
storage.total_bytes
);
}
for (expected_index, storage) in info.iter().enumerate() {
assert_eq!(
storage.index, expected_index as u32,
"Storage index should be sequential"
);
}
}
}