From b2d8530a4b7ad6b8ede165880ae73f2a43534337 Mon Sep 17 00:00:00 2001
From: Laurent Pouilloux <laurent.pouilloux@inria.fr>
Date: Fri, 26 Jan 2024 08:04:34 +0100
Subject: [PATCH] [puppet][clusters] update values from hiera with value from
 refrepo

---
 lib/refrepo/gen/puppet/clusters.rb | 46 ++++++++++++++++++------------
 1 file changed, 28 insertions(+), 18 deletions(-)

diff --git a/lib/refrepo/gen/puppet/clusters.rb b/lib/refrepo/gen/puppet/clusters.rb
index 5a76d4a10a2..d75dfcf55f1 100644
--- a/lib/refrepo/gen/puppet/clusters.rb
+++ b/lib/refrepo/gen/puppet/clusters.rb
@@ -1,39 +1,49 @@
 require 'refrepo/data_loader'
 
 def generate_puppet_clusters(options)
+    
     if not options[:conf_dir]
         options[:conf_dir] = "#{options[:output_dir]}/platforms/production/hieradata/"
     end
-
-    if options[:sites] != G5K_SITES
-        raise "SITE options is not valid as clusters.yaml contains all sites"
-    end 
-    data = load_data_hierarchy
-    data.delete_if { |key| key != 'sites' }
+    # Loading current data from hiera
+    hiera = YAML.load_file("#{options[:conf_dir]}clusters.yaml")['grid5000::clusters']
     
-    yaml_data = {}
+    # Updating data from refrepo
+    refrepo = load_data_hierarchy
+    refrepo.delete_if { |key| key != 'sites' }
     
-    data['sites'].sort.each do |s_uid, s_hash| 
-        yaml_data[s_uid] = {}
+    refrepo['sites'].select{ |k, _v| options[:sites].include? k}.sort.each do |s_uid, s_hash| 
+        if ! hiera.key? s_uid
+            puts "Add #{s_uid}"
+            hiera[s_uid] = {}
+        end
         s_hash['clusters'].sort_by{|c_uid, _c_hash| [c_uid[/(\D+)/, 1], c_uid[/(\d+)/, 1].to_i]}.each do |c_uid, c_hash|
+            if ! hiera[s_uid].key? c_uid
+                puts "  Add #{s_uid}"
+                hiera[s_uid][c_uid] = {}
+            end
             _, f_node = c_hash["nodes"].first
-            queue = f_node['supported_job_types']['queues'].sort.reverse.first
+            queue = f_node['supported_job_types']['queues'].select{|q| q != 'admin'}[0]
             disk_reservation = f_node['storage_devices'].filter{|d| d.key?('reservation')}.length > 0
-            gpu = f_node.key?('gpu_devices') 
+            gpu = f_node.key?('gpu_devices')
             if ! f_node.key?('chassis')
-                puts "no chassis field for #{f_node['uid']}, setting warranty to false" 
+                puts "no chassis field for #{f_node['uid']}, has g5k-checks data been imported ?" 
                 warrantied = false
             else
                 warrantied = f_node['chassis'].key?('warranty_end') ? DateTime.parse(f_node['chassis']['warranty_end']) > DateTime.now : false
             end
-
-            yaml_data[s_uid][c_uid] = {"queue" => queue, 
-                                       "disk_reservation" => disk_reservation,
-                                       "gpu" => gpu,
-                                       "warrantied" => warrantied}
+            c_data = {"queue" => queue, 
+                "disk_reservation" => disk_reservation,
+                "gpu" => gpu,
+                "warrantied" => warrantied}
+            if hiera[s_uid][c_uid] != c_data
+                diff = hiera[s_uid][c_uid].dup.delete_if { |k, v| c_data[k] == v }.merge!(c_data.dup.delete_if { |k, _v| hiera[s_uid][c_uid].has_key?(k) })
+                puts "#{s_uid}-#{c_uid}  Changes detected #{diff}"
+                hiera[s_uid][c_uid] = c_data
+            end
         end
     end
 
     outfile = File.open("#{options[:conf_dir]}clusters.yaml", "w")
-    outfile.write({'grid5000::clusters' => yaml_data}.to_yaml)
+    outfile.write({'grid5000::clusters' => hiera}.to_yaml)
 end
\ No newline at end of file
-- 
GitLab