use async_trait::async_trait; use crate::scenario::{Application, DynError, StartNodeOptions, StartedNode}; /// Deployer-agnostic control surface for runtime node operations. #[async_trait] pub trait NodeControlHandle: Send + Sync { async fn restart_node(&self, _name: &str) -> Result<(), DynError> { Err("restart_node not supported by this deployer".into()) } async fn start_node(&self, _name: &str) -> Result, DynError> { Err("start_node not supported by this deployer".into()) } async fn start_node_with( &self, _name: &str, _options: StartNodeOptions, ) -> Result, DynError> { Err("start_node_with not supported by this deployer".into()) } async fn stop_node(&self, _name: &str) -> Result<(), DynError> { Err("stop_node not supported by this deployer".into()) } fn node_client(&self, _name: &str) -> Option { None } fn node_pid(&self, _name: &str) -> Option { None } } /// Deployer-agnostic wait surface for cluster readiness checks. #[async_trait] pub trait ClusterWaitHandle: Send + Sync { async fn wait_network_ready(&self) -> Result<(), DynError> { Err("wait_network_ready not supported by this deployer".into()) } }