From 3d36d461326d973d4404144bd563a833aab1d68c Mon Sep 17 00:00:00 2001
From: Javier Viola <363911+pepoviola@users.noreply.github.com>
Date: Thu, 21 Mar 2024 15:23:21 +0100
Subject: [PATCH] remove hashmap `nodes_by_name` (#193)

based on #190

cc: @s0me0ne-unkn0wn
---
 crates/orchestrator/src/network.rs | 39 ++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/crates/orchestrator/src/network.rs b/crates/orchestrator/src/network.rs
index 9e3a7d4..9d4339c 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),
+        )
+    }
 }
-- 
GitLab