diff --git a/crates/orchestrator/src/network.rs b/crates/orchestrator/src/network.rs index 9e3a7d4dde9aa2503402dca93e0ce3385571a914..9d4339c76f7c69b048a5ff9e5651ae4c60ae19b6 100644 --- a/crates/orchestrator/src/network.rs +++ b/crates/orchestrator/src/network.rs @@ -122,7 +122,7 @@ impl<T: FileSystem> Network<T> { let name = name.into(); let relaychain = self.relaychain(); - if self.nodes_by_name.contains_key(&name) { + if self.nodes_iter().any(|n| n.name == name) { return Err(anyhow::anyhow!("Name: {} is already used.", name)); } @@ -178,10 +178,8 @@ impl<T: FileSystem> Network<T> { // // tx_helper::validator_actions::register(vec![&node], &running_node.ws_uri, None).await?; // } - // Add node to the global hash + // Add node to relaychain data self.add_running_node(node.clone(), None); - // add node to relay - self.relay.nodes.push(node); Ok(()) } @@ -487,14 +485,14 @@ impl<T: FileSystem> Network<T> { // remove_parachain() pub fn get_node(&self, name: impl Into<String>) -> Result<&NetworkNode, anyhow::Error> { - let name = &name.into(); - if let Some(node) = self.nodes_by_name.get(name) { + let name = name.into(); + if let Some(node) = self.nodes_iter().find(|&n| n.name == name) { return Ok(node); } let list = self - .nodes_by_name - .keys() + .nodes_iter() + .map(|n| &n.name) .cloned() .collect::<Vec<_>>() .join(", "); @@ -504,6 +502,16 @@ impl<T: FileSystem> Network<T> { )) } + pub fn get_node_mut( + &mut self, + name: impl Into<String>, + ) -> Result<&mut NetworkNode, anyhow::Error> { + let name = name.into(); + self.nodes_iter_mut() + .find(|n| n.name == name) + .ok_or(anyhow::anyhow!("can't find node with name: {name:?}")) + } + pub fn nodes(&self) -> Vec<&NetworkNode> { self.nodes_by_name.values().collect::<Vec<&NetworkNode>>() } @@ -544,4 +552,19 @@ impl<T: FileSystem> Network<T> { pub(crate) fn parachains(&self) -> Vec<&Parachain> { self.parachains.values().collect() } + + pub(crate) fn nodes_iter(&self) -> impl Iterator<Item = &NetworkNode> { + self.relay + .nodes + .iter() + .chain(self.parachains.values().flat_map(|p| &p.collators)) + } + + pub(crate) fn nodes_iter_mut(&mut self) -> impl Iterator<Item = &mut NetworkNode> { + self.relay.nodes.iter_mut().chain( + self.parachains + .iter_mut() + .flat_map(|(_, p)| &mut p.collators), + ) + } }