diff --git a/linera-service/src/cli/main.rs b/linera-service/src/cli/main.rs index 18360c60856..b92e28434a6 100644 --- a/linera-service/src/cli/main.rs +++ b/linera-service/src/cli/main.rs @@ -1893,6 +1893,7 @@ async fn run(options: &ClientOptions) -> Result { no_build, docker_image_name, build_mode, + path, with_faucet, faucet_chain, faucet_port, @@ -1916,6 +1917,7 @@ async fn run(options: &ClientOptions) -> Result { *faucet_port, *faucet_amount, *dual_store, + path, ) .boxed() .await?; diff --git a/linera-service/src/cli/net_up_utils.rs b/linera-service/src/cli/net_up_utils.rs index 4dd8ebbd9af..242533f8f6c 100644 --- a/linera-service/src/cli/net_up_utils.rs +++ b/linera-service/src/cli/net_up_utils.rs @@ -123,6 +123,7 @@ pub async fn handle_net_up_kubernetes( faucet_port: NonZeroU16, faucet_amount: Amount, dual_store: bool, + path: &Option, ) -> anyhow::Result<()> { if num_initial_validators < 1 { panic!("The local test network must have at least one validator."); @@ -140,6 +141,7 @@ pub async fn handle_net_up_kubernetes( let shutdown_notifier = CancellationToken::new(); tokio::spawn(listen_for_shutdown_signals(shutdown_notifier.clone())); + let path_provider = PathProvider::new(path)?; let config = LocalKubernetesNetConfig { network: Network::Grpc, testing_prng_seed, @@ -153,6 +155,7 @@ pub async fn handle_net_up_kubernetes( build_mode, policy_config, dual_store, + path_provider, }; let (mut net, client) = config.instantiate().await?; let faucet_service = print_messages_and_create_faucet( diff --git a/linera-service/src/cli_wrappers/local_kubernetes_net.rs b/linera-service/src/cli_wrappers/local_kubernetes_net.rs index 2027f599bb9..5393d818321 100644 --- a/linera-service/src/cli_wrappers/local_kubernetes_net.rs +++ b/linera-service/src/cli_wrappers/local_kubernetes_net.rs @@ -13,7 +13,6 @@ use linera_base::{ data_types::Amount, }; use linera_client::client_options::ResourceControlPolicyConfig; -use tempfile::{tempdir, TempDir}; use tokio::process::Command; #[cfg(with_testing)] use {linera_base::command::current_binary_parent, tokio::sync::OnceCell}; @@ -69,6 +68,7 @@ pub struct LocalKubernetesNetConfig { pub build_mode: BuildMode, pub policy_config: ResourceControlPolicyConfig, pub dual_store: bool, + pub path_provider: PathProvider, } /// A wrapper of [`LocalKubernetesNetConfig`] to create a shared local Kubernetes network @@ -82,7 +82,6 @@ pub struct LocalKubernetesNet { network: Network, testing_prng_seed: Option, next_client_id: usize, - tmp_dir: Arc, binaries: BuildArg, no_build: bool, docker_image_name: String, @@ -92,6 +91,7 @@ pub struct LocalKubernetesNet { num_initial_validators: usize, num_shards: usize, dual_store: bool, + path_provider: PathProvider, } #[cfg(with_testing)] @@ -114,6 +114,7 @@ impl SharedLocalKubernetesNetTestingConfig { binaries = BuildArg::Directory(binaries_dir); } } + let path_provider = PathProvider::create_temporary_directory().unwrap(); Self(LocalKubernetesNetConfig { network, testing_prng_seed: Some(37), @@ -127,6 +128,7 @@ impl SharedLocalKubernetesNetTestingConfig { build_mode: BuildMode::Release, policy_config: ResourceControlPolicyConfig::Testnet, dual_store: false, + path_provider, }) } } @@ -160,6 +162,7 @@ impl LineraNetConfig for LocalKubernetesNetConfig { self.num_initial_validators, self.num_shards, self.dual_store, + self.path_provider, )?; let client = net.make_client().await; @@ -276,11 +279,8 @@ impl LineraNet for LocalKubernetesNet { } async fn make_client(&mut self) -> ClientWrapper { - let path_provider = PathProvider::TemporaryDirectory { - tmp_dir: self.tmp_dir.clone(), - }; let client = ClientWrapper::new( - path_provider, + self.path_provider.clone(), self.network, self.testing_prng_seed, self.next_client_id, @@ -340,12 +340,12 @@ impl LocalKubernetesNet { num_initial_validators: usize, num_shards: usize, dual_store: bool, + path_provider: PathProvider, ) -> Result { Ok(Self { network, testing_prng_seed, next_client_id: 0, - tmp_dir: Arc::new(tempdir()?), binaries, no_build, docker_image_name, @@ -355,19 +355,23 @@ impl LocalKubernetesNet { num_initial_validators, num_shards, dual_store, + path_provider, }) } async fn command_for_binary(&self, name: &'static str) -> Result { let path = resolve_binary(name, env!("CARGO_PKG_NAME")).await?; let mut command = Command::new(path); - command.current_dir(self.tmp_dir.path()); + command.current_dir(self.path_provider.path()); Ok(command) } fn configuration_string(&self, server_number: usize) -> Result { let n = server_number; - let path = self.tmp_dir.path().join(format!("validator_{n}.toml")); + let path = self + .path_provider + .path() + .join(format!("validator_{n}.toml")); let port = 19100 + server_number; let internal_port = 20100; let metrics_port = 21100; @@ -450,13 +454,11 @@ impl LocalKubernetesNet { .join("kubernetes") .join("linera-validator") .join("working"); - fs_err::copy( - self.tmp_dir.path().join("genesis.json"), - base_dir.join("genesis.json"), - )?; + let path = self.path_provider.path(); + fs_err::copy(path.join("genesis.json"), base_dir.join("genesis.json"))?; let kubectl_instance_clone = self.kubectl_instance.clone(); - let tmp_dir_path_clone = self.tmp_dir.path().to_path_buf(); + let tmp_dir_path_clone = path.to_path_buf(); let num_shards = self.num_shards; let mut validators_initialization_futures = Vec::new();