pub mod firecracker;
pub mod hybrid;
pub mod local;
pub use firecracker::FirecrackerExecutor;
pub use hybrid::HybridExecutor;
pub use local::LocalExecutor;
use super::{
CommandDefinition, CommandExecutionError, CommandExecutionResult, ExecutionMode, ResourceUsage,
};
#[async_trait::async_trait]
pub trait CommandExecutor {
async fn execute_command(
&self,
definition: &CommandDefinition,
parameters: &std::collections::HashMap<String, String>,
) -> Result<CommandExecutionResult, CommandExecutionError>;
fn supports_mode(&self, mode: &ExecutionMode) -> bool;
fn capabilities(&self) -> ExecutorCapabilities;
}
#[derive(Debug, Clone)]
pub struct ExecutorCapabilities {
pub supports_resource_limits: bool,
pub supports_network_access: bool,
pub supports_file_system: bool,
pub max_concurrent_commands: Option<usize>,
pub default_timeout: Option<u64>,
}
pub fn create_executor(mode: ExecutionMode) -> Box<dyn CommandExecutor> {
match mode {
ExecutionMode::Local => Box::new(LocalExecutor::new()),
ExecutionMode::Firecracker => Box::new(FirecrackerExecutor::new()),
ExecutionMode::Hybrid => Box::new(HybridExecutor::new()),
}
}
pub fn default_resource_usage() -> ResourceUsage {
ResourceUsage {
memory_mb: 0.0,
cpu_time_seconds: 0.0,
disk_mb: 0.0,
network_bytes_sent: 0,
network_bytes_received: 0,
}
}