From 5864c5c55770e5bfb45a4ddd3672703717e3b42c Mon Sep 17 00:00:00 2001
From: Dimitri DELABROYE <dimitri.delabroye@inria.fr>
Date: Thu, 13 Jun 2019 17:55:28 +0200
Subject: [PATCH] [lib/refrepo/gen/puppet/kavlan] make kavlang5k use data
 instead if input

---
 lib/refrepo.rb                                |  1 +
 lib/refrepo/gen/puppet/kavlang5k.rb           | 29 +++++++++++++-
 .../puppet/templates/kavlan-cluster.conf.erb  | 40 ++++---------------
 .../gen/puppet/templates/kavlan-dhcp.conf.erb | 27 +++++++------
 .../gen/puppet/templates/kavlan.conf.erb      | 10 ++---
 5 files changed, 56 insertions(+), 51 deletions(-)

diff --git a/lib/refrepo.rb b/lib/refrepo.rb
index a23ed171f8..f7137b490b 100644
--- a/lib/refrepo.rb
+++ b/lib/refrepo.rb
@@ -25,3 +25,4 @@ end
 # load sub-parts that are used by many scripts anyway
 require 'refrepo/utils'
 require 'refrepo/input_loader'
+require 'refrepo/data_loader'
diff --git a/lib/refrepo/gen/puppet/kavlang5k.rb b/lib/refrepo/gen/puppet/kavlang5k.rb
index 8c2761ec31..673a5df444 100644
--- a/lib/refrepo/gen/puppet/kavlang5k.rb
+++ b/lib/refrepo/gen/puppet/kavlang5k.rb
@@ -1,5 +1,29 @@
 require 'refrepo/hash/hash'
 
+def kavlan_switch_port_lookup(switch, node_uid, interface='')
+  switch["linecards"].each_with_index do |lc, lc_uid|
+    next if not lc["ports"]
+    lc["ports"].each_with_index do |port, port_uid|
+      if port.is_a?(Hash)
+        switch_remote_port = port["port"] || lc["port"] || ""
+        switch_remote_uid = port["uid"]
+      else
+        switch_remote_port = lc["port"] || ""
+        switch_remote_uid = port
+      end
+      #warn "#{node_uid}, #{switch_uid}, #{lc_uid}, #{port_uid}, #{switch_remote_uid}, #{switch_remote_port}, #{interface}"
+      if switch_remote_uid == node_uid and switch_remote_port == interface
+        # Build port name from snmp_naming_pattern
+        # Example: '3 2 GigabitEthernet%LINECARD%/%PORT%' -> 'GigabitEthernet3/2'
+        pattern = lc.has_key?("kavlan_pattern") ? lc["kavlan_pattern"] : lc["snmp_pattern"]
+        port_name = pattern.sub("%LINECARD%",lc_uid.to_s).sub("%PORT%",port_uid.to_s)
+        return port_name
+      end
+    end
+  end
+  return nil
+end
+
 def generate_puppet_kavlang5k(options)
 
   if not options[:conf_dir]
@@ -12,7 +36,7 @@ def generate_puppet_kavlang5k(options)
   puts "Using configuration directory: #{options[:conf_dir]}"
   puts "For site(s): #{options[:sites].join(', ')}"
 
-  refapi = load_yaml_file_hierarchy
+  refapi = load_data_hierarchy
 
   refapi['sites'].each { |site_uid, site_refapi|
 
@@ -41,7 +65,8 @@ def generate_puppet_kavlang5k(options)
     end
 
     # Look for site's global kavlan
-    kavlan_id = refapi['sites'][site_uid]['kavlans'].each_key.select {|k| k.is_a?(Numeric) and k>9}.pop()
+    # TODO fix dirty convertion to_i below
+    kavlan_id = refapi['sites'][site_uid]['kavlans'].each_key.select {|k| k.to_i > 9}.pop()
     output = ERB.new(File.read(File.expand_path('templates/kavlan-dhcp.conf.erb', File.dirname(__FILE__))), nil, '-').result(binding)
     output_file = Pathname("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kavlan/#{site_uid}/dhcp/dhcpd-0.conf")
     File.write(output_file, output)
diff --git a/lib/refrepo/gen/puppet/templates/kavlan-cluster.conf.erb b/lib/refrepo/gen/puppet/templates/kavlan-cluster.conf.erb
index f588dfe297..66cf295bfb 100644
--- a/lib/refrepo/gen/puppet/templates/kavlan-cluster.conf.erb
+++ b/lib/refrepo/gen/puppet/templates/kavlan-cluster.conf.erb
@@ -3,32 +3,6 @@
 # GENERATED by kavlang5k.rb
 #
 <%
-def net_switch_port_lookup(site, node_uid, interface='')
-  site["networks"].each do |switch_uid, switch|
-    #pp switch_uid
-    switch["linecards"].each do |lc_uid,lc|
-      lc["ports"].each do |port_uid,port|
-        if port.is_a?(Hash)
-          switch_remote_port = port["port"] || lc["port"] || ""
-          switch_remote_uid = port["uid"]
-        else
-          switch_remote_port = lc["port"] || ""
-          switch_remote_uid = port
-        end
-        #warn "#{node_uid}, #{switch_uid}, #{lc_uid}, #{port_uid}, #{switch_remote_uid}, #{switch_remote_port}, #{interface}"
-        if switch_remote_uid == node_uid and switch_remote_port == interface
-            # Build port name from snmp_naming_pattern
-            # Example: '3 2 GigabitEthernet%LINECARD%/%PORT%' -> 'GigabitEthernet3/2'
-            pattern = lc.has_key?("kavlan_pattern") ? lc["kavlan_pattern"] : lc["snmp_pattern"]
-            port_name = pattern.sub("%LINECARD%",lc_uid.to_s).sub("%PORT%",port_uid.to_s)
-            return switch_uid, port_name
-        end
-      end
-    end
-  end
-  return nil
-end
-
 refapi['sites'][site_uid]['clusters'].sort.to_h.each do |cluster_uid, cluster|
 -%>
 <% if cluster['kavlan'] -%>
@@ -36,15 +10,17 @@ refapi['sites'][site_uid]['clusters'].sort.to_h.each do |cluster_uid, cluster|
 <%
     cluster['nodes'].sort.to_h.each do |node_uid, node|
       next if node['status'] and node['status'] == "retired"
-      node['network_adapters'].each do |interface_uid, interface|
-        interface_has_kavlan = interface.has_key?('kavlan') ? interface['kavlan'] : node['kavlan'].has_key?(interface_uid)
+      node['network_adapters'].each do |interface|
+          # puts interface.class
+          # pp interface
+          #nil.crash
+        interface_has_kavlan = interface['kavlan']
         if interface_has_kavlan
-          switch_uid, kavlan_port_name = net_switch_port_lookup(refapi['sites'][site_uid], node_uid, interface_uid)
-          if switch_uid and kavlan_port_name
+          switch_uid = interface['switch']
+          kavlan_port_name = kavlan_switch_port_lookup(refapi['sites'][site_uid]["network_equipments"][switch_uid], node_uid, interface['device'])
 -%>
-<%= node_uid %><%= interface['mounted']? "" : "-"+interface_uid %>.<%= site_uid %>.grid5000.fr <%= kavlan_port_name %> <%= switch_uid %>
+<%= node_uid %><%= interface['mounted']? "" : "-"+interface['device'] %>.<%= site_uid %>.grid5000.fr <%= kavlan_port_name %> <%= switch_uid %>
 <%
-          end
         end
       end
     end
diff --git a/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb b/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
index 2afccec77b..0881016c66 100644
--- a/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
+++ b/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
@@ -11,7 +11,7 @@ option pxelinux.reboottime code 211 = unsigned integer 32;
 option vendorinfo          code 43  = string;
 
 <%
-kavlan = refapi['sites'][site_uid]['kavlans'][kavlan_id]
+kavlan = refapi['sites'][site_uid]['kavlans'][kavlan_id.to_s] # TODO fix needed conversion
 kavlan_ip = IPAddress::IPv4::new(kavlan['network'])
 -%>
 
@@ -32,21 +32,24 @@ refapi['sites'].sort.to_h.each_key do |site|
   refapi['sites'][site].fetch('clusters', []).sort.to_h.each do |cluster_uid, cluster|
     cluster['nodes'].sort.to_h.each do |node_uid, node|
       next if node['status'] and node['status'] == 'retired'
-      node['network_adapters'].each do |interface_uid, interface|
-        if (interface['mountable'] or site == "rennes") and node['kavlan'] and node['kavlan'].has_key?(interface_uid) # TODO: use interface['kavlan']
-          if not interface['mac'] or not node['kavlan'].has_key?(interface_uid) or not node['kavlan'][interface_uid]["kavlan-#{kavlan_id}"]
-            warn "WARN: Cannot fill dhcpd entry for #{node_uid}, interface #{interface_uid} in vlan #{kavlan_id}: " \
-              "Missing mac (#{interface['mac']}) or IP (#{node['kavlan'][interface_uid] and node['kavlan'][interface_uid]["kavlan-#{kavlan_id}"]})"
-            next
-          end
+      node['network_adapters'].each do |interface|
+          if interface['mountable'] and
+             interface['kavlan']
+
+             if not interface['mac'] or
+                not node['kavlan'][interface['device']]["kavlan-#{kavlan_id}"]
+                  warn "WARN: Cannot fill dhcpd entry for #{node_uid}, interface #{interface_uid} in vlan #{kavlan_id}: " \
+              "Missing mac (#{interface['mac']}) or IP (#{node['kavlan'][interface['device']] and node['kavlan'][interface['device']]["kavlan-#{kavlan_id}"]})"
+                  next
+             end
 -%>
-   host <%= node_uid %><%= interface['mounted']? "" : "-"+interface_uid %>-kavlan-<%= kavlan_id %>.<%= site %>.grid5000.fr {
+   host <%= node_uid %><%= interface['mounted']? "" : "-"+interface['device'] %>-kavlan-<%= kavlan_id %>.<%= site %>.grid5000.fr {
      hardware ethernet <%= interface['mac'].downcase() %>;
-     option host-name "<%= node_uid %><%= interface['mounted']? "" : "-"+interface_uid %>-kavlan-<%= kavlan_id %>";
+     option host-name "<%= node_uid %><%= interface['mounted']? "" : "-"+interface['device'] %>-kavlan-<%= kavlan_id %>";
      option domain-name "<%= site %>.grid5000.fr";
      option domain-search "<%= site %>.grid5000.fr", "grid5000.fr";
-     fixed-address <%= node['kavlan'][interface_uid]["kavlan-#{kavlan_id}"] %>;
-<%        if kavlan_id > 9 -%>
+     fixed-address <%= node['kavlan'][interface['device']]["kavlan-#{kavlan_id}"] %>;
+<%        if kavlan_id.to_i > 9 -%>
      next-server kadeploy.<%= site %>.grid5000.fr;
 <%        end -%>
    }
diff --git a/lib/refrepo/gen/puppet/templates/kavlan.conf.erb b/lib/refrepo/gen/puppet/templates/kavlan.conf.erb
index e4372bbf14..36bf1c447b 100644
--- a/lib/refrepo/gen/puppet/templates/kavlan.conf.erb
+++ b/lib/refrepo/gen/puppet/templates/kavlan.conf.erb
@@ -21,7 +21,7 @@
    "vlan": [
        {"value": 100, "name": "PRODUCTION", "type": "NULL"},
 <%
-       site_refapi['kavlans'].each do |kavlan_id, kavlan|
+       site_refapi['kavlans'].sort_by{ |k,v| k.to_i }.each do |kavlan_id, kavlan|
          if kavlan_id.to_i.between?(1, 3)
 -%>
        {"value": 70<%= kavlan_id %>, "name": "KAVLAN-<%= kavlan_id %>", "type": "kavlan-local", "dhcpd": "ssh kavlan-<%= kavlan_id %> sudo /etc/init.d/isc-dhcp-server"},
@@ -32,15 +32,15 @@
 <%
          end
        end
-
-       (10..21).each.reject{ |kavlan_id| site_refapi['kavlans'].include?(kavlan_id) }.each do |kavlan_id|
+       # TODO Fix dirty conversion
+       (10..21).each.reject{ |kavlan_id| site_refapi['kavlans'].keys.map(&:to_i).include?(kavlan_id) }.each do |kavlan_id|
 -%>
        {"value": 7<%= kavlan_id %>, "name": "KAVLAN-<%= kavlan_id %>", "type": "kavlan-remote"},
 <%
        end
 
-       if site_refapi.has_key?('kavlan_topo')
-         Range.new(*site_refapi['kavlan_topo'].split("..").map{|d| Integer(d)}).each do |kavlan_topo_id| -%>
+       if site_refapi['kavlans'].has_key?('topo')
+         Range.new(*site_refapi['kavlans']['topo'].split("..").map{|d| Integer(d)}).each do |kavlan_topo_id| -%>
        {"value": <%= kavlan_topo_id %>, "name": "KAVLAN-<%= kavlan_topo_id %>", "type": "kavlan-topo"},
 <%
          end
-- 
GitLab