diff --git a/crates/configuration/src/global_settings.rs b/crates/configuration/src/global_settings.rs index 0e27f18861fae89e44bf554c049a6532ba585c60..f6e73028979536592c44c68851f1bdef68c6cd1f 100644 --- a/crates/configuration/src/global_settings.rs +++ b/crates/configuration/src/global_settings.rs @@ -3,10 +3,13 @@ use std::{error::Error, fmt::Display, net::IpAddr, str::FromStr}; use multiaddr::Multiaddr; use serde::{Deserialize, Serialize}; -use crate::shared::{ - errors::{ConfigError, FieldError}, - helpers::{merge_errors, merge_errors_vecs}, - types::Duration, +use crate::{ + shared::{ + errors::{ConfigError, FieldError}, + helpers::{merge_errors, merge_errors_vecs}, + types::Duration, + }, + utils::default_node_spawn_timeout, }; /// Global settings applied to an entire network. @@ -17,7 +20,7 @@ pub struct GlobalSettings { // TODO: parse both case in zombienet node version to avoid renamed ? #[serde(rename = "timeout")] network_spawn_timeout: Duration, - #[serde(default)] + #[serde(default = "default_node_spawn_timeout")] node_spawn_timeout: Duration, local_ip: Option<IpAddr>, } diff --git a/crates/configuration/src/network.rs b/crates/configuration/src/network.rs index d0a976b2fba083ed2b80a98bebe44c5271a73f68..ee67b191e8ae6f59b1f005322479b629d06ccb56 100644 --- a/crates/configuration/src/network.rs +++ b/crates/configuration/src/network.rs @@ -107,6 +107,9 @@ impl NetworkConfig { .cloned() .collect(); + let mut parachains: Vec<ParachainConfig> = + network_config.parachains().into_iter().cloned().collect(); + // Validation checks for relay TryInto::<Chain>::try_into(network_config.relaychain().chain().as_str())?; if relaychain_default_image.is_some() { @@ -139,6 +142,43 @@ impl NetworkConfig { } } + for para in parachains.iter_mut() { + // retrieve the defaults parachain for assigning to collators if needed + let parachain_default_command: Option<Command> = para.default_command().cloned(); + + let parachain_default_image: Option<Image> = para.default_image().cloned(); + + let parachain_default_db_snapshot: Option<AssetLocation> = + para.default_db_snapshot().cloned(); + + let default_args: Vec<Arg> = para.default_args().into_iter().cloned().collect(); + + let mut collators: Vec<NodeConfig> = para.collators().into_iter().cloned().collect(); + + for collator in collators.iter_mut() { + if parachain_default_command.is_some() { + // we modify only nodes which don't already have a command + if collator.command.is_none() { + collator.command = parachain_default_command.clone(); + } + } + + if parachain_default_image.is_some() && collator.image.is_none() { + collator.image = parachain_default_image.clone(); + } + + if parachain_default_db_snapshot.is_some() && collator.db_snapshot.is_none() { + collator.db_snapshot = parachain_default_db_snapshot.clone(); + } + + if !default_args.is_empty() && collator.args().is_empty() { + collator.set_args(default_args.clone()); + } + } + + para.collators = collators; + } + network_config .relaychain .as_mut() @@ -968,7 +1008,7 @@ mod tests { .with_chain("rococo-local") .with_default_command("polkadot") .with_default_image("docker.io/parity/polkadot:latest") - .with_default_args(vec![("-lparachain", "debug").into()]) + .with_default_args(vec![("-lparachain=debug").into()]) .with_node(|node| { node.with_name("alice") .validator(true) diff --git a/crates/configuration/src/parachain.rs b/crates/configuration/src/parachain.rs index ca29aa0b443fd78ab215ffeb6dd781d2bc5236d8..58cd23c863f48f40d630bd98efdf3a2bf732941a 100644 --- a/crates/configuration/src/parachain.rs +++ b/crates/configuration/src/parachain.rs @@ -18,7 +18,7 @@ use crate::{ Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext, U128, }, }, - utils::default_as_true, + utils::{default_as_true, default_initial_balance}, }; #[derive(Debug, Clone, PartialEq)] @@ -61,8 +61,8 @@ impl<'de> Visitor<'de> for RegistrationStrategyVisitor { while let Some(key) = map.next_key::<String>()? { match key.as_str() { - "add_to_genesis" => add_to_genesis = map.next_value()?, - "register_para" => register_para = map.next_value()?, + "addToGenesis" | "add_to_genesis" => add_to_genesis = map.next_value()?, + "registerPara" | "register_para" => register_para = map.next_value()?, _ => { return Err(de::Error::unknown_field( &key, @@ -105,7 +105,7 @@ pub struct ParachainConfig { default = "default_as_true" )] onboard_as_parachain: bool, - #[serde(rename = "balance", default)] + #[serde(rename = "balance", default = "default_initial_balance")] initial_balance: U128, default_command: Option<Command>, default_image: Option<Image>, @@ -124,7 +124,7 @@ pub struct ParachainConfig { bootnodes_addresses: Vec<Multiaddr>, genesis_overrides: Option<serde_json::Value>, #[serde(skip_serializing_if = "std::vec::Vec::is_empty", default)] - collators: Vec<NodeConfig>, + pub collators: Vec<NodeConfig>, } impl ParachainConfig { diff --git a/crates/configuration/src/relaychain.rs b/crates/configuration/src/relaychain.rs index f5bc906212d6e36814f9caac8c04f575640b7e68..a3782cda2798152a2fab1c687fbe3bf6d2582973 100644 --- a/crates/configuration/src/relaychain.rs +++ b/crates/configuration/src/relaychain.rs @@ -2,20 +2,26 @@ use std::{cell::RefCell, error::Error, fmt::Debug, marker::PhantomData, rc::Rc}; use serde::{Deserialize, Serialize}; -use crate::shared::{ - constants::{DEFAULT_TYPESTATE, THIS_IS_A_BUG}, - errors::{ConfigError, FieldError}, - helpers::{merge_errors, merge_errors_vecs}, - macros::states, - node::{self, NodeConfig, NodeConfigBuilder}, - resources::{Resources, ResourcesBuilder}, - types::{Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext}, +use crate::{ + shared::{ + constants::{DEFAULT_TYPESTATE, THIS_IS_A_BUG}, + errors::{ConfigError, FieldError}, + helpers::{merge_errors, merge_errors_vecs}, + macros::states, + node::{self, NodeConfig, NodeConfigBuilder}, + resources::{Resources, ResourcesBuilder}, + types::{ + Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext, + }, + }, + utils::default_command_polkadot, }; /// A relay chain configuration, composed of nodes and fine-grained configuration options. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct RelaychainConfig { chain: Chain, + #[serde(default = "default_command_polkadot")] default_command: Option<Command>, default_image: Option<Image>, default_resources: Option<Resources>, diff --git a/crates/configuration/src/shared/node.rs b/crates/configuration/src/shared/node.rs index cbfa72473d8c5ca7c30d9ab85f7e27a2477c815c..16b3905e9b0ea4cbfe039ce200f167988d8e19de 100644 --- a/crates/configuration/src/shared/node.rs +++ b/crates/configuration/src/shared/node.rs @@ -15,7 +15,7 @@ use crate::{ resources::Resources, types::{Arg, Port}, }, - utils::default_as_true, + utils::{default_as_true, default_initial_balance}, }; /// An environment variable with a name and a value. @@ -69,7 +69,7 @@ pub struct NodeConfig { #[serde(alias = "bootnode", default)] pub(crate) is_bootnode: bool, #[serde(alias = "balance")] - #[serde(default)] + #[serde(default = "default_initial_balance")] initial_balance: U128, #[serde(default)] env: Vec<EnvVar>, diff --git a/crates/configuration/src/shared/types.rs b/crates/configuration/src/shared/types.rs index 2cdf29c7489b52886e2ec69614ce43567e6af6ad..201e198cfc1465f9e779f95b5a7e67fe5b5bc0bb 100644 --- a/crates/configuration/src/shared/types.rs +++ b/crates/configuration/src/shared/types.rs @@ -355,9 +355,13 @@ impl<'de> de::Visitor<'de> for ArgVisitor { where E: de::Error, { + // covers the "-lruntime=debug,parachain=trace" case + // TODO: Make this more generic by adding the scenario in the regex below + if v.starts_with("-l") || v.starts_with("-log") { + return Ok(Arg::Flag(v.to_string())); + } let re = Regex::new("^(?<name_prefix>(?<prefix>-{1,2})(?<name>[a-zA-Z]+(-[a-zA-Z]+)*))((?<separator>=| )(?<value>.+))?$").unwrap(); let captures = re.captures(v); - if let Some(captures) = captures { if let Some(value) = captures.name("value") { return Ok(Arg::Option( @@ -369,7 +373,6 @@ impl<'de> de::Visitor<'de> for ArgVisitor { value.as_str().to_string(), )); } - if let Some(name_prefix) = captures.name("name_prefix") { return Ok(Arg::Flag(name_prefix.as_str().to_string())); } diff --git a/crates/configuration/src/utils.rs b/crates/configuration/src/utils.rs index ced19103e822498612d8b4a13f702329f2b70ce5..5f68d883c647eb208cd614bc83dc833adf9554af 100644 --- a/crates/configuration/src/utils.rs +++ b/crates/configuration/src/utils.rs @@ -1,3 +1,5 @@ +use crate::types::{Command, Duration}; + pub(crate) fn is_true(value: &bool) -> bool { *value } @@ -5,3 +7,15 @@ pub(crate) fn is_true(value: &bool) -> bool { pub(crate) fn default_as_true() -> bool { true } + +pub(crate) fn default_initial_balance() -> crate::types::U128 { + 2_000_000_000_000.into() +} + +pub(crate) fn default_node_spawn_timeout() -> Duration { + 300 +} + +pub(crate) fn default_command_polkadot() -> Option<Command> { + TryInto::<Command>::try_into("polkadot").ok() +}