Skip to content

Commit 5bdecaa

Browse files
committed
feat(e2e): run real DMQ network with the Haskell implementation
1 parent 4d311b6 commit 5bdecaa

File tree

7 files changed

+110
-27
lines changed

7 files changed

+110
-27
lines changed

mithril-test-lab/mithril-end-to-end/src/devnet/runner.rs

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub struct Devnet {
2424
pub struct PoolNode {
2525
pub db_path: PathBuf,
2626
pub socket_path: PathBuf,
27+
pub dmq_socket_path: PathBuf,
2728
pub pool_env_path: PathBuf,
2829
pub kes_secret_key_path: PathBuf,
2930
pub operational_certificate_path: PathBuf,
@@ -50,6 +51,7 @@ impl PoolNode {
5051
pub struct FullNode {
5152
pub db_path: PathBuf,
5253
pub socket_path: PathBuf,
54+
pub dmq_socket_path: PathBuf,
5355
}
5456

5557
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -198,6 +200,7 @@ impl Devnet {
198200
.map(|n| PoolNode {
199201
db_path: self.artifacts_dir.join(format!("node-pool{n}/db")),
200202
socket_path: self.artifacts_dir.join(format!("node-pool{n}/ipc/node.sock")),
203+
dmq_socket_path: self.artifacts_dir.join(format!("node-pool{n}/ipc/dmq.node.sock")),
201204
pool_env_path: self.artifacts_dir.join(format!("node-pool{n}/pool.env")),
202205
kes_secret_key_path: self
203206
.artifacts_dir
@@ -211,6 +214,7 @@ impl Devnet {
211214
.map(|n| FullNode {
212215
db_path: self.artifacts_dir.join(format!("node-full{n}/db")),
213216
socket_path: self.artifacts_dir.join(format!("node-full{n}/ipc/node.sock")),
217+
dmq_socket_path: self.artifacts_dir.join(format!("node-full{n}/ipc/dmq.node.sock")),
214218
})
215219
.collect::<Vec<_>>();
216220

@@ -226,20 +230,43 @@ impl Devnet {
226230
let mut run_command = Command::new(&run_script_path);
227231
run_command.current_dir(&self.artifacts_dir).kill_on_drop(true);
228232

229-
info!("Starting the Devnet"; "script" => &run_script_path.display());
233+
info!("Starting the Cardano devnet"; "script" => &run_script_path.display());
230234

231235
let status = run_command
232236
.spawn()
233-
.with_context(|| "Failed to start the devnet")?
237+
.with_context(|| "Failed to start the Cardano devnet")?
234238
.wait()
235239
.await
236-
.with_context(|| "Error while starting the devnet")?;
240+
.with_context(|| "Error while starting the Cardano devnet")?;
237241
match status.code() {
238242
Some(0) => Ok(()),
239243
Some(code) => Err(anyhow!(RetryableDevnetError(format!(
240-
"Run devnet exited with status code: {code}"
244+
"Run Cardano devnet exited with status code: {code}"
241245
)))),
242-
None => Err(anyhow!("Run devnet terminated by signal")),
246+
None => Err(anyhow!("Run Cardano devnet terminated by signal")),
247+
}
248+
}
249+
250+
pub async fn run_dmq(&self) -> StdResult<()> {
251+
let run_script = "start-dmq.sh";
252+
let run_script_path = self.artifacts_dir.join(run_script);
253+
let mut run_command = Command::new(&run_script_path);
254+
run_command.current_dir(&self.artifacts_dir).kill_on_drop(true);
255+
256+
info!("Starting the DMQ devnet"; "script" => &run_script_path.display());
257+
258+
let status = run_command
259+
.spawn()
260+
.with_context(|| "Failed to start the DMQ devnet")?
261+
.wait()
262+
.await
263+
.with_context(|| "Error while starting the DMQ devnet")?;
264+
match status.code() {
265+
Some(0) => Ok(()),
266+
Some(code) => Err(anyhow!(RetryableDevnetError(format!(
267+
"Run DMQ devnet exited with status code: {code}"
268+
)))),
269+
None => Err(anyhow!("Run DMQ devnet terminated by signal")),
243270
}
244271
}
245272

@@ -377,6 +404,7 @@ mod tests {
377404
pool_nodes: vec![PoolNode {
378405
db_path: PathBuf::from(r"test/path/node-pool1/db"),
379406
socket_path: PathBuf::from(r"test/path/node-pool1/ipc/node.sock"),
407+
dmq_socket_path: PathBuf::from(r"test/path/node-pool1/ipc/dmq.node.sock"),
380408
pool_env_path: PathBuf::from(r"test/path/node-pool1/pool.env"),
381409
kes_secret_key_path: PathBuf::from(r"test/path/node-pool1/shelley/kes.skey"),
382410
operational_certificate_path: PathBuf::from(
@@ -385,7 +413,8 @@ mod tests {
385413
},],
386414
full_nodes: vec![FullNode {
387415
db_path: PathBuf::from(r"test/path/node-full1/db"),
388-
socket_path: PathBuf::from(r"test/path/node-full1/ipc/node.sock")
416+
socket_path: PathBuf::from(r"test/path/node-full1/ipc/node.sock"),
417+
dmq_socket_path: PathBuf::from(r"test/path/node-full1/ipc/dmq.node.sock")
389418
}]
390419
},
391420
devnet.topology()

mithril-test-lab/mithril-end-to-end/src/main.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ pub struct Args {
137137
#[clap(long)]
138138
use_dmq: bool,
139139

140+
/// DMQ node flavor (used only when 'use_dmq' is set, can be 'haskell' or 'fake')
141+
///
142+
/// 'haskell': will use the DMQ network created within the 'mithril-devnet'
143+
/// 'fake': will use a fake DMQ network within created with the Mithril relay
144+
#[clap(long, default_value = "haskell")]
145+
dmq_node_flavor: Option<String>,
146+
140147
/// Skip cardano binaries download
141148
#[clap(long)]
142149
skip_cardano_bin_download: bool,
@@ -377,6 +384,7 @@ impl App {
377384
aggregate_signature_type: args.aggregate_signature_type,
378385
run_only_mode,
379386
use_dmq,
387+
dmq_node_flavor: args.dmq_node_flavor,
380388
use_relays,
381389
relay_signer_registration_mode,
382390
relay_signature_registration_mode,

mithril-test-lab/mithril-end-to-end/src/mithril/aggregator.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub struct AggregatorConfig<'a> {
4141
pub chain_observer_type: &'a str,
4242
pub leader_aggregator_endpoint: &'a Option<String>,
4343
pub use_dmq: bool,
44+
pub dmq_node_flavor: &'a Option<String>,
4445
}
4546

4647
pub struct Aggregator {
@@ -135,14 +136,32 @@ impl Aggregator {
135136
if let Some(leader_aggregator_endpoint) = aggregator_config.leader_aggregator_endpoint {
136137
env.insert("LEADER_AGGREGATOR_ENDPOINT", leader_aggregator_endpoint);
137138
}
138-
let dmq_node_socket_path = aggregator_config
139-
.work_dir
140-
.join(format!("dmq-aggregator-{}.socket", aggregator_config.index));
139+
let dmq_node_socket_path = if aggregator_config.use_dmq {
140+
match aggregator_config.dmq_node_flavor {
141+
Some(flavor) if flavor == "haskell" => aggregator_config
142+
.full_node
143+
.dmq_socket_path
144+
.to_str()
145+
.unwrap()
146+
.to_string(),
147+
Some(flavor) if flavor == "fake" => aggregator_config
148+
.work_dir
149+
.join(format!("dmq-aggregator-{}.socket", aggregator_config.index))
150+
.to_str()
151+
.unwrap()
152+
.to_string(),
153+
_ => {
154+
return Err(anyhow!(format!(
155+
"Unsupported DMQ node flavor: {:?}",
156+
aggregator_config.dmq_node_flavor
157+
)));
158+
}
159+
}
160+
} else {
161+
"".to_string()
162+
};
141163
if aggregator_config.use_dmq {
142-
env.insert(
143-
"DMQ_NODE_SOCKET_PATH",
144-
dmq_node_socket_path.to_str().unwrap(),
145-
);
164+
env.insert("DMQ_NODE_SOCKET_PATH", dmq_node_socket_path.as_str());
146165
}
147166
let args = vec![
148167
"--db-directory",

mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub struct MithrilInfrastructureConfig {
3838
pub use_p2p_passive_relays: bool,
3939
pub skip_signature_delayer: bool,
4040
pub use_dmq: bool,
41+
pub dmq_node_flavor: Option<String>,
4142
pub use_era_specific_work_dir: bool,
4243
}
4344

@@ -74,6 +75,7 @@ impl MithrilInfrastructureConfig {
7475
use_p2p_passive_relays: false,
7576
skip_signature_delayer: false,
7677
use_dmq: false,
78+
dmq_node_flavor: Some("fake".to_string()),
7779
use_era_specific_work_dir: false,
7880
}
7981
}
@@ -99,6 +101,9 @@ impl MithrilInfrastructure {
99101
pub async fn start(config: &MithrilInfrastructureConfig) -> StdResult<Self> {
100102
let chain_observer_type = "pallas";
101103
config.devnet.run().await?;
104+
if config.use_dmq && config.dmq_node_flavor == Some("haskell".to_string()) {
105+
config.devnet.run_dmq().await?;
106+
}
102107
let devnet_topology = config.devnet.topology();
103108
let aggregator_cardano_nodes = &devnet_topology.full_nodes;
104109
let signer_cardano_nodes = &devnet_topology.pool_nodes;
@@ -263,6 +268,7 @@ impl MithrilInfrastructure {
263268
chain_observer_type,
264269
leader_aggregator_endpoint: &leader_aggregator_endpoint,
265270
use_dmq: config.use_dmq,
271+
dmq_node_flavor: &config.dmq_node_flavor,
266272
})?;
267273

268274
aggregator
@@ -402,6 +408,7 @@ impl MithrilInfrastructure {
402408
enable_certification,
403409
skip_signature_delayer: config.skip_signature_delayer,
404410
use_dmq: config.use_dmq,
411+
dmq_node_flavor: &config.dmq_node_flavor,
405412
})?;
406413
signer.start().await?;
407414

mithril-test-lab/mithril-end-to-end/src/mithril/signer.rs

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
use crate::devnet::PoolNode;
2-
use crate::utils::MithrilCommand;
3-
use crate::{DEVNET_MAGIC_ID, ERA_MARKERS_VERIFICATION_KEY};
4-
use anyhow::Context;
5-
use mithril_common::StdResult;
6-
use mithril_common::entities::PartyId;
7-
use slog_scope::info;
81
use std::collections::HashMap;
92
use std::path::Path;
103
use std::sync::Arc;
4+
5+
use anyhow::{Context, anyhow};
6+
use mithril_common::StdResult;
7+
use mithril_common::entities::PartyId;
8+
use slog_scope::info;
119
use tokio::process::Child;
1210
use tokio::sync::RwLock;
1311

12+
use crate::devnet::PoolNode;
13+
use crate::utils::MithrilCommand;
14+
use crate::{DEVNET_MAGIC_ID, ERA_MARKERS_VERIFICATION_KEY};
15+
1416
#[derive(Debug)]
1517
pub struct SignerConfig<'a> {
1618
pub signer_number: usize,
@@ -27,6 +29,7 @@ pub struct SignerConfig<'a> {
2729
pub enable_certification: bool,
2830
pub skip_signature_delayer: bool,
2931
pub use_dmq: bool,
32+
pub dmq_node_flavor: &'a Option<String>,
3033
}
3134

3235
#[derive(Debug)]
@@ -105,14 +108,29 @@ impl Signer {
105108
} else {
106109
env.insert("PARTY_ID", &party_id);
107110
}
108-
let dmq_node_socket_path = signer_config
109-
.work_dir
110-
.join(format!("dmq-signer-{}.socket", signer_config.signer_number));
111+
let dmq_node_socket_path = if signer_config.use_dmq {
112+
match signer_config.dmq_node_flavor {
113+
Some(flavor) if flavor == "haskell" => {
114+
signer_config.pool_node.dmq_socket_path.to_str().unwrap().to_string()
115+
}
116+
Some(flavor) if flavor == "fake" => signer_config
117+
.work_dir
118+
.join(format!("dmq-signer-{}.socket", signer_config.signer_number))
119+
.to_str()
120+
.unwrap()
121+
.to_string(),
122+
_ => {
123+
return Err(anyhow!(format!(
124+
"Unsupported DMQ node flavor: {:?}",
125+
signer_config.dmq_node_flavor
126+
)));
127+
}
128+
}
129+
} else {
130+
"".to_string()
131+
};
111132
if signer_config.use_dmq {
112-
env.insert(
113-
"DMQ_NODE_SOCKET_PATH",
114-
dmq_node_socket_path.to_str().unwrap(),
115-
);
133+
env.insert("DMQ_NODE_SOCKET_PATH", dmq_node_socket_path.as_str());
116134
}
117135
let args = vec!["-vvv"];
118136

mithril-test-lab/mithril-end-to-end/src/stress_test/aggregator_helpers.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub async fn bootstrap_aggregator(
3838
chain_observer_type,
3939
leader_aggregator_endpoint: &None,
4040
use_dmq: false,
41+
dmq_node_flavor: &None,
4142
})
4243
.unwrap();
4344

mithril-test-lab/mithril-end-to-end/src/stress_test/entities.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ impl AggregatorParameters {
7474
let full_node = FullNode {
7575
db_path: db_path.to_path_buf(),
7676
socket_path: PathBuf::new(),
77+
dmq_socket_path: PathBuf::new(),
7778
};
7879
let tmp_dir = opts
7980
.temporary_path

0 commit comments

Comments
 (0)