From 77f678d8b71d8c914014ff9a78bd39c2c4a21974 Mon Sep 17 00:00:00 2001
From: Simon Delamare <simon.delamare@ens-lyon.fr>
Date: Mon, 4 May 2020 11:39:28 +0200
Subject: [PATCH] [lib] Update kwollect generator to support PDU

---
 lib/refrepo/gen/puppet/kwollectg5k.rb         | 25 ++++++++++
 .../gen/puppet/templates/kwollect-node.erb    |  2 +
 .../gen/puppet/templates/kwollect-pdu.erb     | 46 +++++++++++++++++++
 3 files changed, 73 insertions(+)
 create mode 100644 lib/refrepo/gen/puppet/templates/kwollect-pdu.erb

diff --git a/lib/refrepo/gen/puppet/kwollectg5k.rb b/lib/refrepo/gen/puppet/kwollectg5k.rb
index 1eec6bcf572..4a97397b47e 100644
--- a/lib/refrepo/gen/puppet/kwollectg5k.rb
+++ b/lib/refrepo/gen/puppet/kwollectg5k.rb
@@ -47,6 +47,31 @@ def generate_puppet_kwollectg5k(options)
       File.write(output_file, output)
     }
 
+    # Metrics configuration for PDU
+    ## First, parse all PDU to find nodes that use two PSUs
+    ports_by_node = {}
+    site.fetch('pdus', {}).each { |pdu_uid, pdu|
+      pdu.fetch('metrics', []).each {|metric|
+        next if metric['source']['protocol'] != 'snmp'
+        if metric['source']['id'].include?('%PORT%')
+          pdu['ports'].each {|port_uid, node_uid|
+            if not ports_by_node.has_key?(node_uid)
+              ports_by_node[node_uid] = []
+            end
+            ports_by_node[node_uid] << "#{pdu_uid}-port-#{port_uid}"
+          }
+        end
+      }
+    }
+    ## Then, write PDU metrics config
+    site.fetch('pdus', {}).each { |pdu_uid, pdu|
+
+      output = ERB.new(File.read(File.expand_path('templates/kwollect-pdu.erb', File.dirname(__FILE__))), nil, '-').result(binding)
+      output_file = Pathname("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kwollect/#{site_uid}/#{pdu_uid}.conf")
+      output_file.dirname.mkpath()
+      File.write(output_file, output)
+    }
+
     # Wattmetre mapping configuration
     wattmetre_port_per_node = {}
     site.fetch('pdus', {}).each { |pdu_uid, pdu|
diff --git a/lib/refrepo/gen/puppet/templates/kwollect-node.erb b/lib/refrepo/gen/puppet/templates/kwollect-node.erb
index 4d8f82a8087..b7d7363b21d 100644
--- a/lib/refrepo/gen/puppet/templates/kwollect-node.erb
+++ b/lib/refrepo/gen/puppet/templates/kwollect-node.erb
@@ -5,8 +5,10 @@
 
 <%-
 cluster.fetch('metrics', []).each {|metric|
+  # These are "virtual" metrics available for a node, but collected elsewhere
   next if metric['source']['protocol'] == "wattmetre"
   next if metric['source']['protocol'] == "network_equipment"
+  next if metric['source']['protocol'] == "pdu"
 
   if metric['source']['protocol'] == "ipmisensor"
     auth = ipmi_credentials+"@"
diff --git a/lib/refrepo/gen/puppet/templates/kwollect-pdu.erb b/lib/refrepo/gen/puppet/templates/kwollect-pdu.erb
new file mode 100644
index 00000000000..2a87b87c7ea
--- /dev/null
+++ b/lib/refrepo/gen/puppet/templates/kwollect-pdu.erb
@@ -0,0 +1,46 @@
+#
+# This file was generated from reference-repository.git
+# Do not edit this file by hand. Your changes will be overwritten.
+#
+
+<%-
+pdu.fetch('metrics', []).each {|metric|
+  next if metric['source']['protocol'] != 'snmp'
+  if metric['source']['id'].include?('%PORT%')
+    pdu['ports'].each {|port_uid, node_uid|
+      # Map metric to node only for single PSU
+      single_port = ports_by_node[node_uid].length == 1
+-%>
+- name: <%= metric['name'] %>
+  device_id: <%= pdu_uid %>-port-<%= port_uid %>
+<%- if single_port -%>
+  device_alias: <%= node_uid %>
+<%- end -%>
+  url: snmp://<%= pdu.fetch('snmp_community', 'public')%>@<%= pdu_uid %>.<%= site_uid %>.grid5000.fr/<%= metric['source']['id'].sub('%PORT%',  "#{port_uid}") %>
+  update_every: <%= metric['period'] > 0 ? metric['period'] : metric['optional_period'] %>
+<%- if metric['period'] == 0 -%>
+  optional: true
+<%- end -%>
+<%- if metric.has_key?('scale_factor') -%>
+  scale_factor: <%= metric['scale_factor'] %>
+<%- end -%>
+
+<%-
+    }
+  else
+-%>
+- name: <%= metric['name'] %>
+  device_id: <%= pdu_uid %>
+  url: snmp://<%= pdu.fetch('snmp_community', 'public')%>@<%= pdu_uid %>.<%= site_uid %>.grid5000.fr/<%= metric['source']['id'] %>
+  update_every: <%= metric['period'] > 0 ? metric['period'] : metric['optional_period'] %>
+<%- if metric['period'] == 0 -%>
+  optional: true
+<%- end -%>
+<%- if metric.has_key?('scale_factor') -%>
+  scale_factor: <%= metric['scale_factor'] %>
+<%- end -%>
+
+<%-
+  end
+}
+-%>
-- 
GitLab