From cf1af4a913776289dcb72f1b80f83c2013eae738 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Gaidamour?= <jeremie.gaidamour@inria.fr>
Date: Wed, 2 Mar 2016 09:07:33 +0100
Subject: [PATCH] [dev] Custom iterators

---
 generators/bind/bind.rb                     |  2 +-
 generators/dhcp/templates/dhcp.erb          |  2 +-
 generators/lib/hash/hash.rb                 | 19 +++++++++++++
 generators/oar-properties/oar-properties.rb | 30 +++++++++------------
 4 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/generators/bind/bind.rb b/generators/bind/bind.rb
index 8b7804c14ac..2c2a218b3b7 100644
--- a/generators/bind/bind.rb
+++ b/generators/bind/bind.rb
@@ -36,7 +36,7 @@ global_hash["sites"].each { |site_uid, site_hash|
 
   site_hash.fetch("clusters").sort.each { |cluster_uid, cluster_hash|
 
-    cluster_hash.fetch('nodes').sort_by { |item| item.to_s.split(/(\d+)/).map { |e| [e.to_i, e] } }.each { |node_uid, node_hash|
+    cluster_hash.fetch('nodes').each_sort_by_node_uid { |node_uid, node_hash|
 
       network_interfaces = {}
       node_hash.fetch('network_interfaces').each { |net_uid, net_hash|
diff --git a/generators/dhcp/templates/dhcp.erb b/generators/dhcp/templates/dhcp.erb
index 74c2c763310..1a44ab01179 100644
--- a/generators/dhcp/templates/dhcp.erb
+++ b/generators/dhcp/templates/dhcp.erb
@@ -9,7 +9,7 @@
 %>
 group {
 <%
-    data.fetch('nodes').sort_by { |item| item.to_s.split(/(\d+)/).map { |e| [e.to_i, e] } }.each { |node_uid, node_hash| 
+    data.fetch('nodes').each_sort_by_node_uid { |node_uid, node_hash| 
       network_interface != 'bmc' ? node_uid_net = node_uid : node_uid_net = node_uid + '-bmc'
 
       # Get ip and mac addresses
diff --git a/generators/lib/hash/hash.rb b/generators/lib/hash/hash.rb
index 68265a2e85a..730f4e1a1fd 100644
--- a/generators/lib/hash/hash.rb
+++ b/generators/lib/hash/hash.rb
@@ -90,4 +90,23 @@ class ::Hash
     return array.reverse.inject(value) { |a, n| { n => a } }
   end
 
+  # Custom iterator. Same as "each" but it sorts keys by node_uid (ie. graphene-10 after graphene-9)
+  def each_sort_by_node_uid
+    self.sort_by { |item| item.to_s.split(/(\d+)/).map { |e| [e.to_i, e] } }.each { |key, value|
+      yield key, value
+    }
+  end
+
+  # Custom iterator. Only consider entries corresponding to cluster_list and node_list. Sorted by node_uid.
+  def each_filtered_node_uid(cluster_list, node_list)
+    self.each_sort_by_node_uid { |node_uid, properties| 
+      cluster_uid = node_uid.split(/-/).first
+      
+      if (! cluster_list || cluster_list.include?(cluster_uid)) &&
+          (! node_list || node_list.include?(node_uid))
+        yield node_uid, properties
+      end
+    }
+  end
+
 end
diff --git a/generators/oar-properties/oar-properties.rb b/generators/oar-properties/oar-properties.rb
index a82c7befea0..09fae64784d 100755
--- a/generators/oar-properties/oar-properties.rb
+++ b/generators/oar-properties/oar-properties.rb
@@ -126,27 +126,21 @@ nodelist_properties["to_be_updated"] = {}
 
 nodelist_properties["ref"].each { |site_uid, site_properties| 
   
-  site_properties.sort_by { |item| item.to_s.split(/(\d+)/).map { |e| [e.to_i, e] } }.each { |node_uid, node_properties_ref|
-    cluster_uid = node_uid.split(/-/).first
-
-    if (! options[:clusters] || options[:clusters].include?(cluster_uid)) &&
-        (! options[:nodes] || options[:nodes].include?(node_uid))
-      
-      node_properties_oar = nodelist_properties["oar"][site_uid][node_uid]
+  site_properties.each_filtered_node_uid(options[:clusters], options[:nodes]) { |node_uid, node_properties_ref|
       
-      diff      = diff_node_properties(node_properties_ref, node_properties_oar)
-      diff_keys = diff.map{ |hashdiff_array| hashdiff_array[1] }
-
-      nodelist_properties["to_be_updated"][node_uid] = node_properties_ref.select { |key, value| diff_keys.include?(key) }
+    node_properties_oar = nodelist_properties["oar"][site_uid][node_uid]
       
-      if (options[:verbose])
-        #puts "#{node_uid}: #{diff}"
-        puts "#{node_uid}: #{diff_keys}"
-      end
-
+    diff      = diff_node_properties(node_properties_ref, node_properties_oar)
+    diff_keys = diff.map{ |hashdiff_array| hashdiff_array[1] }
+    
+    nodelist_properties["to_be_updated"][node_uid] = node_properties_ref.select { |key, value| diff_keys.include?(key) }
+    
+    if (options[:verbose])
+      #puts "#{node_uid}: #{diff}"
+      puts "#{node_uid}: #{diff_keys}"
     end
-
-    }
+    
+  }
   
 }
 
-- 
GitLab