From 6edc9b752cc09a510a6604c9fcab11536c8704dc Mon Sep 17 00:00:00 2001
From: Simon Delamare <simon.delamare@ens-lyon.fr>
Date: Wed, 20 May 2020 13:04:32 +0200
Subject: [PATCH] [lib] kwollect - populate clusters network metrics from
 network devices metrics content

---
 .../gen/puppet/templates/kwollect-network.erb |  1 -
 lib/refrepo/input_loader.rb                   | 35 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/lib/refrepo/gen/puppet/templates/kwollect-network.erb b/lib/refrepo/gen/puppet/templates/kwollect-network.erb
index 9d7e9864fab..eedf37b4dde 100644
--- a/lib/refrepo/gen/puppet/templates/kwollect-network.erb
+++ b/lib/refrepo/gen/puppet/templates/kwollect-network.erb
@@ -12,7 +12,6 @@ neteq.fetch('metrics', []).each {|metric|
         next if lport.empty?
         port_uid = neteq['linecards'].length > 1 ? "#{linecard_uid}_#{lport_uid}" : lport_uid
         port_name = lport['snmp_name']
-        # TODO: Handle secondary interface
         port_node = lport['uid']
         labels = lport['kind'] == 'node' ? {'interface': lport['port']} : {}
         labels.update({'_device_alias': port_node})
diff --git a/lib/refrepo/input_loader.rb b/lib/refrepo/input_loader.rb
index 1101da4751d..86e71abc1ad 100644
--- a/lib/refrepo/input_loader.rb
+++ b/lib/refrepo/input_loader.rb
@@ -60,6 +60,9 @@ def load_yaml_file_hierarchy(directory = File.expand_path("../../input/grid5000/
   # populate each node with software informations
   add_software(global_hash)
 
+  # populate each cluster with metrics network information
+  add_network_metrics(global_hash)
+
   return global_hash
 end
 
@@ -221,3 +224,35 @@ def add_software(h)
     end
   end
 end
+
+def add_network_metrics(h)
+  # for each cluster
+  h['sites'].each_pair do |site_uid, site|
+    site['clusters'].each_pair do |cluster_uid, cluster|
+
+      # remove any network metrics defined in cluster
+      cluster['metrics'] = cluster.fetch('metrics', []).reject {|m| m['name'] =~ /network_.*_bytes_total/}
+
+      # for each interface of a cluster's node
+      node_uid, node = cluster['nodes'].first
+      node["network_adapters"].each do |iface_uid, iface|
+
+        # get switch attached to interface
+        if iface['mounted'] and not iface['management'] and iface['interface'] == 'Ethernet'
+          switch, _ = net_switch_port_lookup(site, node_uid, iface_uid) || net_switch_port_lookup(site, node_uid)
+        else
+          switch, _ = net_switch_port_lookup(site, node_uid, iface_uid)
+        end
+
+        # for each network metric declared for the switch
+        site.fetch('networks', {}).fetch(switch, {}).fetch('metrics', []).select{|m| m['name'] =~ /network_.*_bytes_total/}.each do |metric|
+
+          # add this metric to cluster's list of available metrics, associated to node interface
+          cluster['metrics'].push(metric.merge(
+            {"labels": {"interface": iface_uid}, "source": {"protocol": "network_equipment"}}
+          ))
+        end
+      end
+    end
+  end
+end
-- 
GitLab