diff --git a/crates/configuration/src/global_settings.rs b/crates/configuration/src/global_settings.rs index 607951e8934e88c6f602533158e28fc11d7f03bc..0e27f18861fae89e44bf554c049a6532ba585c60 100644 --- a/crates/configuration/src/global_settings.rs +++ b/crates/configuration/src/global_settings.rs @@ -17,6 +17,7 @@ pub struct GlobalSettings { // TODO: parse both case in zombienet node version to avoid renamed ? #[serde(rename = "timeout")] network_spawn_timeout: Duration, + #[serde(default)] node_spawn_timeout: Duration, local_ip: Option<IpAddr>, } @@ -189,6 +190,38 @@ mod tests { ); } + #[test] + fn global_settings_config_builder_should_succeeds_when_node_spawn_timeout_is_missing() { + let global_settings_config = GlobalSettingsBuilder::new() + .with_bootnodes_addresses(vec![ + "/ip4/10.41.122.55/tcp/45421", + "/ip4/51.144.222.10/tcp/2333", + ]) + .with_network_spawn_timeout(600) + .with_local_ip("10.0.0.1") + .build() + .unwrap(); + + let bootnodes_addresses: Vec<Multiaddr> = vec![ + "/ip4/10.41.122.55/tcp/45421".try_into().unwrap(), + "/ip4/51.144.222.10/tcp/2333".try_into().unwrap(), + ]; + assert_eq!( + global_settings_config.bootnodes_addresses(), + bootnodes_addresses.iter().collect::<Vec<_>>() + ); + assert_eq!(global_settings_config.network_spawn_timeout(), 600); + assert_eq!(global_settings_config.node_spawn_timeout(), 300); + assert_eq!( + global_settings_config + .local_ip() + .unwrap() + .to_string() + .as_str(), + "10.0.0.1" + ); + } + #[test] fn global_settings_builder_should_fails_and_returns_an_error_if_one_bootnode_address_is_invalid( ) { diff --git a/crates/configuration/src/network.rs b/crates/configuration/src/network.rs index 9569f6fdf64dfb5ec1d06e5f2725ccf2f04ec964..d0a976b2fba083ed2b80a98bebe44c5271a73f68 100644 --- a/crates/configuration/src/network.rs +++ b/crates/configuration/src/network.rs @@ -81,9 +81,12 @@ impl NetworkConfig { } // retrieve the defaults relaychain for assigning to nodes if needed - let relaychain_default_command: Option<Command> = + let mut relaychain_default_command: Option<Command> = network_config.relaychain().default_command().cloned(); + if relaychain_default_command.is_none() { + relaychain_default_command = network_config.relaychain().command().cloned(); + } let relaychain_default_image: Option<Image> = network_config.relaychain().default_image().cloned(); @@ -144,14 +147,6 @@ impl NetworkConfig { // Validation checks for parachains network_config.parachains().iter().for_each(|parachain| { - let _ = TryInto::<Chain>::try_into( - parachain - .chain() - .ok_or("chain name must exist") - .unwrap() - .as_str(), - ); - if parachain.default_image().is_some() { let _ = TryInto::<Image>::try_into(parachain.default_image().unwrap().as_str()); } diff --git a/crates/configuration/src/parachain.rs b/crates/configuration/src/parachain.rs index 8dd9c9bcd9a8c3f01041ce59794ff395c4ed690e..ca29aa0b443fd78ab215ffeb6dd781d2bc5236d8 100644 --- a/crates/configuration/src/parachain.rs +++ b/crates/configuration/src/parachain.rs @@ -105,7 +105,7 @@ pub struct ParachainConfig { default = "default_as_true" )] onboard_as_parachain: bool, - #[serde(rename = "balance")] + #[serde(rename = "balance", default)] initial_balance: U128, default_command: Option<Command>, default_image: Option<Image>, @@ -118,7 +118,7 @@ pub struct ParachainConfig { genesis_state_path: Option<AssetLocation>, genesis_state_generator: Option<Command>, chain_spec_path: Option<AssetLocation>, - #[serde(rename = "cumulus_based")] + #[serde(rename = "cumulus_based", default = "default_as_true")] is_cumulus_based: bool, #[serde(skip_serializing_if = "std::vec::Vec::is_empty", default)] bootnodes_addresses: Vec<Multiaddr>, diff --git a/crates/configuration/src/relaychain.rs b/crates/configuration/src/relaychain.rs index f226b79d7ba985e3042989ce3bbf746f37bee898..f5bc906212d6e36814f9caac8c04f575640b7e68 100644 --- a/crates/configuration/src/relaychain.rs +++ b/crates/configuration/src/relaychain.rs @@ -28,6 +28,7 @@ pub struct RelaychainConfig { #[serde(skip_serializing_if = "std::vec::Vec::is_empty", default)] nodes: Vec<NodeConfig>, genesis_overrides: Option<serde_json::Value>, + command: Option<Command>, } impl RelaychainConfig { @@ -66,6 +67,11 @@ impl RelaychainConfig { self.chain_spec_path.as_ref() } + /// The non-default command used for nodes. + pub fn command(&self) -> Option<&Command> { + self.command.as_ref() + } + /// The number of `random nominators` to create for chains using staking, this is used in tandem with `max_nominations` to simulate the amount of nominators and nominations. pub fn random_nominators_count(&self) -> Option<u32> { self.random_nominators_count @@ -118,6 +124,7 @@ impl Default for RelaychainConfigBuilder<Initial> { default_db_snapshot: None, default_args: vec![], chain_spec_path: None, + command: None, random_nominators_count: None, max_nominations: None, genesis_overrides: None, diff --git a/crates/configuration/src/shared/node.rs b/crates/configuration/src/shared/node.rs index 9b11d2709222ae90287996521859e0a9be78d4ad..cbfa72473d8c5ca7c30d9ab85f7e27a2477c815c 100644 --- a/crates/configuration/src/shared/node.rs +++ b/crates/configuration/src/shared/node.rs @@ -66,7 +66,7 @@ pub struct NodeConfig { pub(crate) is_validator: bool, #[serde(alias = "invulnerable", default = "default_as_true")] pub(crate) is_invulnerable: bool, - #[serde(alias = "bootnode")] + #[serde(alias = "bootnode", default)] pub(crate) is_bootnode: bool, #[serde(alias = "balance")] #[serde(default)] diff --git a/crates/examples/examples/0001-simple.toml b/crates/examples/examples/0001-simple.toml new file mode 100644 index 0000000000000000000000000000000000000000..3a0bc70840f658e87a2f2b7dd2d4de71ba0cf6c3 --- /dev/null +++ b/crates/examples/examples/0001-simple.toml @@ -0,0 +1,30 @@ +[settings] +timeout = 1000 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +command = "polkadot" + + [[relaychain.nodes]] + name = "alice" + args = [ "--alice", "-lruntime=debug,parachain=trace" ] + + [[relaychain.nodes]] + name = "bob" + args = [ "--bob", "-lruntime=debug,parachain=trace" ] + +[[parachains]] +id = 100 +addToGenesis = false + + [parachains.collator] + name = "collator01" + image = "{{COL_IMAGE}}" + command = "adder-collator" + args = [ "-lruntime=debug,parachain=trace" ] + +[types.Header] +number = "u64" +parent_hash = "Hash" +post_state = "Hash" \ No newline at end of file diff --git a/crates/examples/examples/simple_network_example.rs b/crates/examples/examples/simple_network_example.rs new file mode 100644 index 0000000000000000000000000000000000000000..676511ce5184003e2fd3a19844debb5194106803 --- /dev/null +++ b/crates/examples/examples/simple_network_example.rs @@ -0,0 +1,23 @@ +// use std::time::Duration; + +use configuration::NetworkConfig; +use orchestrator::Orchestrator; +use provider::NativeProvider; +use support::fs::local::LocalFileSystem; + +#[tokio::main] +async fn main() -> Result<(), Box<dyn std::error::Error>> { + let config = NetworkConfig::load_from_toml("./crates/examples/examples/0001-simple.toml") + .expect("errored?"); + + let fs = LocalFileSystem; + let provider = NativeProvider::new(fs.clone()); + let orchestrator = Orchestrator::new(fs, provider); + orchestrator.spawn(config).await?; + println!("🚀🚀🚀🚀 network deployed"); + // For now let just loop.... + #[allow(clippy::empty_loop)] + loop {} + + // Ok(()) +}