From 8a27c6907c2edb794b8a23322cbe4f24c2a8102d Mon Sep 17 00:00:00 2001 From: Nikos Kontakis <wirednkod@gmail.com> Date: Mon, 11 Sep 2023 11:22:44 +0300 Subject: [PATCH] Move to NetworkConfig and rename to `load_from_toml` --- crates/configuration/src/network.rs | 203 +++++++++++++++------------- 1 file changed, 107 insertions(+), 96 deletions(-) diff --git a/crates/configuration/src/network.rs b/crates/configuration/src/network.rs index 50c9363..f983a43 100644 --- a/crates/configuration/src/network.rs +++ b/crates/configuration/src/network.rs @@ -55,6 +55,109 @@ impl NetworkConfig { Ok(re.replace_all(&toml_string, "$u128_value").to_string()) } + + pub fn load_from_toml(path: &str) -> Result<NetworkConfig, toml::ser::Error> { + let file_str = fs::read_to_string(path).unwrap(); + let re: Regex = Regex::new(r"(?<field_name>(initial_)?balance)\s+=\s+(?<u128_value>\d+)") + .expect(&format!("{} {}", VALID_REGEX, THIS_IS_A_BUG)); + let mut network_config: NetworkConfig = toml::from_str( + re.replace_all(&file_str, "$field_name = \"$u128_value\"") + .as_ref(), + ) + .unwrap(); + + if network_config.relaychain.is_none() { + // TODO: (nikos) handle case where relaychain is None which is not valid + } + + // retrieve the defaults relaychain for assigning to nodes if needed + let relaychain_default_command = network_config + .relaychain + .as_ref() + .unwrap() + .default_command() + .cloned(); + + let relaychain_default_image = network_config + .relaychain + .as_ref() + .unwrap() + .default_image() + .cloned(); + + let relaychain_default_resources = network_config + .relaychain + .as_ref() + .unwrap() + .default_resources() + .cloned(); + + let relaychain_default_db_snapshot = network_config + .relaychain + .as_ref() + .unwrap() + .default_db_snapshot() + .cloned(); + + let default_args = network_config.relaychain().default_args.clone(); + + // if there is some existing defaults and + if relaychain_default_command.is_some() { + // here we've got our own clone of Option<Command> so we just unwrap it because we asserted above it exists + let default_command: Option<crate::shared::types::Command> = relaychain_default_command; + // we take all nodes as mutables + for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { + // we modify only nodes which don't arleady have a command + if node.command.is_none() { + node.command = default_command.clone(); + node.chain_context.default_command = default_command.clone(); + } + } + } + + if relaychain_default_image.is_some() { + let default_image = relaychain_default_image; + for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { + if node.image.is_none() { + node.image = default_image.clone(); + node.chain_context.default_image = default_image.clone(); + } + } + } + + if relaychain_default_resources.is_some() { + let default_resources = relaychain_default_resources; + for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { + if node.resources.is_none() { + node.resources = default_resources.clone(); + node.chain_context.default_resources = default_resources.clone(); + } + } + } + + if relaychain_default_db_snapshot.is_some() { + let default_db_snapshot = relaychain_default_db_snapshot; + for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { + if node.db_snapshot.is_none() { + node.db_snapshot = default_db_snapshot.clone(); + node.chain_context.default_db_snapshot = default_db_snapshot.clone(); + } + } + } + + if !default_args.is_empty() { + for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { + if node.args.is_empty() { + node.args.clone_from(&default_args.clone()); + node.chain_context + .default_args + .clone_from(&default_args.clone()); + } + } + } + + Ok(network_config) + } } states! { @@ -180,97 +283,6 @@ impl NetworkConfigBuilder<Initial> { Self::default() } - pub fn toml_to_network(path: &str) -> Result<NetworkConfig, toml::ser::Error> { - let file_str = fs::read_to_string(path).unwrap(); - - let mut network_config: NetworkConfig = toml::from_str(&file_str).unwrap(); - - if network_config.relaychain.is_none() { - // TODO: (nikos) handle case where relaychain is None which is not valid - } - - // retrieve the defaults relaychain for assigning to nodes if needed - let relaychain_default_command = network_config - .relaychain - .as_ref() - .unwrap() - .default_command() - .cloned(); - - let relaychain_default_image = network_config - .relaychain - .as_ref() - .unwrap() - .default_image() - .cloned(); - - let relaychain_default_resources = network_config - .relaychain - .as_ref() - .unwrap() - .default_resources() - .cloned(); - - let relaychain_default_db_snapshot = network_config - .relaychain - .as_ref() - .unwrap() - .default_db_snapshot() - .cloned(); - - let default_args = network_config.relaychain().default_args.clone(); - - // if there is some existing defaults and - if relaychain_default_command.is_some() { - // here we've got our own clone of Option<Command> so we just unwrap it because we asserted above it exists - let default_command: Option<crate::shared::types::Command> = relaychain_default_command; - // we take all nodes as mutables - for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { - // we modify only nodes which don't arleady have a command - if node.command.is_none() { - node.command = default_command.clone(); - } - } - } - - if relaychain_default_image.is_some() { - let default_image = relaychain_default_image; - for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { - if node.image.is_none() { - node.image = default_image.clone(); - } - } - } - - if relaychain_default_resources.is_some() { - let default_resources = relaychain_default_resources; - for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { - if node.resources.is_none() { - node.resources = default_resources.clone(); - } - } - } - - if relaychain_default_db_snapshot.is_some() { - let default_db_snapshot = relaychain_default_db_snapshot; - for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { - if node.db_snapshot.is_none() { - node.db_snapshot = default_db_snapshot.clone(); - } - } - } - - if !default_args.is_empty() { - for node in network_config.relaychain.as_mut().unwrap().nodes.iter_mut() { - if node.args.is_empty() { - node.args.clone_from(&default_args.clone()); - } - } - } - - Ok(network_config) - } - /// Set the relay chain using a nested [`RelaychainConfigBuilder`]. pub fn with_relaychain( self, @@ -948,8 +960,8 @@ mod tests { #[test] fn the_toml_config_should_be_imported_and_match_a_network() { - let toml_to_network = - NetworkConfigBuilder::toml_to_network("./testing/snapshots/0000-small-network.toml") + let load_from_toml = + NetworkConfigBuilder::load_from_toml("./testing/snapshots/0000-small-network.toml") .unwrap(); let expected = NetworkConfigBuilder::new() @@ -978,7 +990,7 @@ mod tests { }) .build() .unwrap(); - assert_eq!(toml_to_network, expected); + assert_eq!(load_from_toml, expected); } #[test] @@ -987,8 +999,7 @@ mod tests { // let converted_toml = toml::from_str::<toml::Value>(file_str.as_str()).unwrap(); let config = - NetworkConfigBuilder::toml_to_network("./testing/snapshots/0000-small-network.toml") - .unwrap(); + NetworkConfig::load_from_toml("./testing/snapshots/0000-small-network.toml").unwrap(); println!("{:?}", config); } } -- GitLab