From 6049caa198e8a40e858168820d541dbc2c1b536c Mon Sep 17 00:00:00 2001 From: giwaov Date: Fri, 1 May 2026 12:51:19 +0100 Subject: [PATCH] fix(quake): prepare local service volume dirs --- crates/quake/src/setup.rs | 42 +++++++++++++++++++++++++++++++++++-- crates/quake/src/testnet.rs | 7 ++++++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/crates/quake/src/setup.rs b/crates/quake/src/setup.rs index ec3a06c..1cb6dda 100644 --- a/crates/quake/src/setup.rs +++ b/crates/quake/src/setup.rs @@ -344,9 +344,23 @@ pub(crate) fn generate_jwt_secret(testnet_dir: &Path, force: bool) -> Result<()> /// can write to mounted volumes. Required on Linux where bind-mount permissions are strict. pub(crate) fn set_local_testnet_directory_permissions( testnet_dir: &Path, + monitoring_dir: &Path, node_names: &[String], ) -> Result<()> { let logs_dir = testnet_dir.join("logs"); + let writable_dirs = [ + logs_dir.clone(), + monitoring_dir.join("data").join("grafana"), + monitoring_dir.join("data").join("prometheus"), + testnet_dir.join("blockscout").join("logs"), + testnet_dir.join("blockscout").join("dets"), + ]; + + for dir in &writable_dirs { + fs::create_dir_all(dir) + .with_context(|| format!("Failed to create directory: {}", dir.display()))?; + } + for name in node_names { let reth_dir = testnet_dir.join(name).join("reth"); fs::create_dir_all(&reth_dir) @@ -358,8 +372,6 @@ pub(crate) fn set_local_testnet_directory_permissions( #[cfg(unix)] { let perms = fs::Permissions::from_mode(0o777); - fs::set_permissions(&logs_dir, perms.clone()) - .with_context(|| format!("Failed to set permissions on {}", logs_dir.display()))?; for name in node_names { let node_dir = testnet_dir.join(name); if node_dir.exists() { @@ -374,6 +386,10 @@ pub(crate) fn set_local_testnet_directory_permissions( })?; } } + for dir in &writable_dirs { + fs::set_permissions(dir, perms.clone()) + .with_context(|| format!("Failed to set permissions on {}", dir.display()))?; + } } Ok(()) } @@ -1237,6 +1253,28 @@ mod tests { ); } + #[test] + fn local_testnet_directory_permissions_create_service_volume_dirs() { + let dir = tempdir().unwrap(); + let testnet_dir = dir.path().join("localdev"); + let monitoring_dir = dir.path().join("monitoring"); + let node_names = vec!["validator1".to_string()]; + + set_local_testnet_directory_permissions(&testnet_dir, &monitoring_dir, &node_names) + .unwrap(); + + for path in [ + monitoring_dir.join("data").join("grafana"), + monitoring_dir.join("data").join("prometheus"), + testnet_dir.join("blockscout").join("logs"), + testnet_dir.join("blockscout").join("dets"), + testnet_dir.join("validator1").join("reth"), + testnet_dir.join("validator1").join("sockets"), + ] { + assert!(path.is_dir(), "expected {} to exist", path.display()); + } + } + #[test] fn generate_app_private_keys_creates_correct_number() { let dir = tempdir().unwrap(); diff --git a/crates/quake/src/testnet.rs b/crates/quake/src/testnet.rs index 5c4dc28..155d2ce 100644 --- a/crates/quake/src/testnet.rs +++ b/crates/quake/src/testnet.rs @@ -511,7 +511,12 @@ impl Testnet { // For local testnets, create EL reth dirs and set permissions so containers (user arc) can write if self.infra_data.infra_type == InfraType::Local { let node_names: Vec = self.manifest.nodes.keys().cloned().collect(); - setup::set_local_testnet_directory_permissions(&self.dir, &node_names)?; + let monitoring_dir = self.quake_dir.join("monitoring"); + setup::set_local_testnet_directory_permissions( + &self.dir, + &monitoring_dir, + &node_names, + )?; } // In remote mode, provision the Control Center server