//! Factory for creating load balancing policies use super::{ CacheAwareConfig, CacheAwarePolicy, LoadBalancingPolicy, PowerOfTwoPolicy, RandomPolicy, RoundRobinPolicy, }; use crate::config::PolicyConfig; use std::sync::Arc; /// Factory for creating policy instances pub struct PolicyFactory; impl PolicyFactory { /// Create a policy from configuration pub fn create_from_config(config: &PolicyConfig) -> Arc { match config { PolicyConfig::Random => Arc::new(RandomPolicy::new()), PolicyConfig::RoundRobin => Arc::new(RoundRobinPolicy::new()), PolicyConfig::PowerOfTwo { .. } => Arc::new(PowerOfTwoPolicy::new()), PolicyConfig::CacheAware { cache_threshold, balance_abs_threshold, balance_rel_threshold, eviction_interval_secs, max_tree_size, } => { let config = CacheAwareConfig { cache_threshold: *cache_threshold, balance_abs_threshold: *balance_abs_threshold, balance_rel_threshold: *balance_rel_threshold, eviction_interval_secs: *eviction_interval_secs, max_tree_size: *max_tree_size, }; Arc::new(CacheAwarePolicy::with_config(config)) } } } /// Create a policy by name (for dynamic loading) pub fn create_by_name(name: &str) -> Option> { match name.to_lowercase().as_str() { "random" => Some(Arc::new(RandomPolicy::new())), "round_robin" | "roundrobin" => Some(Arc::new(RoundRobinPolicy::new())), "power_of_two" | "poweroftwo" => Some(Arc::new(PowerOfTwoPolicy::new())), "cache_aware" | "cacheaware" => Some(Arc::new(CacheAwarePolicy::new())), _ => None, } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_create_from_config() { // Test Random let policy = PolicyFactory::create_from_config(&PolicyConfig::Random); assert_eq!(policy.name(), "random"); // Test RoundRobin let policy = PolicyFactory::create_from_config(&PolicyConfig::RoundRobin); assert_eq!(policy.name(), "round_robin"); // Test PowerOfTwo let policy = PolicyFactory::create_from_config(&PolicyConfig::PowerOfTwo { load_check_interval_secs: 60, }); assert_eq!(policy.name(), "power_of_two"); // Test CacheAware let policy = PolicyFactory::create_from_config(&PolicyConfig::CacheAware { cache_threshold: 0.7, balance_abs_threshold: 10, balance_rel_threshold: 1.5, eviction_interval_secs: 30, max_tree_size: 1000, }); assert_eq!(policy.name(), "cache_aware"); } #[test] fn test_create_by_name() { assert!(PolicyFactory::create_by_name("random").is_some()); assert!(PolicyFactory::create_by_name("RANDOM").is_some()); assert!(PolicyFactory::create_by_name("round_robin").is_some()); assert!(PolicyFactory::create_by_name("RoundRobin").is_some()); assert!(PolicyFactory::create_by_name("power_of_two").is_some()); assert!(PolicyFactory::create_by_name("PowerOfTwo").is_some()); assert!(PolicyFactory::create_by_name("cache_aware").is_some()); assert!(PolicyFactory::create_by_name("CacheAware").is_some()); assert!(PolicyFactory::create_by_name("unknown").is_none()); } }