From 3cbe03c16dcd6ec4f8f0b2e084da789545fa2e02 Mon Sep 17 00:00:00 2001
From: Matthieu Imbert <matthieu.imbert@inria.fr>
Date: Thu, 7 May 2020 07:51:14 +0200
Subject: [PATCH] [kavlan6] generate dhcpd6 configs

---
 lib/refrepo/gen/puppet/kavlang5k.rb           | 21 +++++++-----
 .../gen/puppet/templates/kavlan-dhcp.conf.erb | 33 +++++++++++++++++++
 2 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/lib/refrepo/gen/puppet/kavlang5k.rb b/lib/refrepo/gen/puppet/kavlang5k.rb
index 673a5df444..8b55f7f030 100644
--- a/lib/refrepo/gen/puppet/kavlang5k.rb
+++ b/lib/refrepo/gen/puppet/kavlang5k.rb
@@ -58,18 +58,21 @@ def generate_puppet_kavlang5k(options)
     File.write(output_file, output)
 
     (1..9).each do |kavlan_id|
-      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-#{kavlan_id}.conf")
-      output_file.dirname.mkpath()
-      File.write(output_file, output)
+      ["dhcpd", "dhcpd6"].each { |dhcpkind|
+        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/#{dhcpkind}-#{kavlan_id}.conf")
+        output_file.dirname.mkpath()
+        File.write(output_file, output)
+      }
     end
 
     # Look for site's global kavlan
     # 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)
-
+    kavlan_id = refapi['sites'][site_uid]['kavlans'].each_key.select {|k| k.to_i > 9}.pop().to_i
+    ["dhcpd", "dhcpd6"].each { |dhcpkind|
+      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/#{dhcpkind}-0.conf")
+      File.write(output_file, output)
+    }
   }
 end
diff --git a/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb b/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
index b8a6b79807..434ec0c0f0 100644
--- a/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
+++ b/lib/refrepo/gen/puppet/templates/kavlan-dhcp.conf.erb
@@ -2,6 +2,7 @@
 # Module : kavlang5k
 # GENERATED by kavlang5k.rb
 
+<% if dhcpkind == 'dhcpd'-%>
 ddns-update-style none;
 option space pxelinux;
 option pxelinux.magic      code 208 = string;
@@ -52,15 +53,34 @@ kavlan = refapi['sites'][site_uid]['kavlans'][kavlan_id.to_s] # TODO fix needed
 kavlan_ip = IPAddress::IPv4::new(kavlan['network'])
 -%>
 
+<% end -%>
+<% kavlan = refapi['sites'][site_uid]['kavlans'][kavlan_id.to_s] # TODO fix needed conversion
+   if dhcpkind == 'dhcpd'
+     kavlan_ip = IPAddress::IPv4::new(kavlan['network']) -%>
 subnet <%= kavlan_ip.network %> netmask <%= kavlan_ip.netmask %> {
+<% elsif dhcpkind == 'dhcpd6'
+     case kavlan_id
+     when 1..3 # local non routed vlan
+       kavlan6_net = kavlan_id + 0x80 - 1
+     when 4..9 # local routed vlan
+       kavlan6_net = kavlan_id + 0x90 - 4
+     else      # global vlan
+       kavlan6_net = kavlan_id + 0xa0 - 10
+     end
+     refapi['sites'][site_uid]
+     kavlan6_ip = "#{refapi['sites'][site_uid]['ipv6']['prefix']}#{sprintf('%02x', kavlan6_net)}::/64" -%>
+subnet6 <%= kavlan6_ip %> {
+<% end -%>
     default-lease-time 86400;
     max-lease-time 604800;
     option domain-name-servers <%= kavlan_id.to_i.between?(1, 3)? kavlan['gateway'] : "dns.#{site_uid}.grid5000.fr" %>;
     option ntp-servers <%= kavlan_id.to_i.between?(1, 3)? kavlan['gateway'] : "ntp.#{site_uid}.grid5000.fr" %>;
     option routers <%= kavlan['gateway'] %>;
+<% if dhcpkind == 'dhcpd' -%>
     option subnet-mask <%= kavlan_ip.netmask %>;
     option broadcast-address <%= kavlan_ip.broadcast %>;
     next-server <%= "kadeploy.#{site_uid}.grid5000.fr" %>;
+<% end -%>
 }
 
 <%
@@ -79,6 +99,8 @@ refapi['sites'].sort.to_h.each_key do |site|
               "Missing mac (#{interface['mac']}) or IP (#{node['kavlan'][interface['device']] and node['kavlan'][interface['device']]["kavlan-#{kavlan_id}"]})"
                   next
              end
+
+             if dhcpkind == 'dhcpd'
 -%>
 host <%= node_uid %><%= interface['mounted']? "" : "-"+interface['device'] %>-kavlan-<%= kavlan_id %>.<%= site %>.grid5000.fr {
   hardware ethernet <%= interface['mac'].downcase() %>;
@@ -91,6 +113,17 @@ host <%= node_uid %><%= interface['mounted']? "" : "-"+interface['device'] %>-ka
 <%     end -%>
 }
 <%
+             elsif dhcpkind == 'dhcpd6'
+-%>
+host <%= node_uid %><%= interface['mounted']? "" : "-"+interface['device'] %>-kavlan-<%= kavlan_id %>-ipv6.<%= site %>.grid5000.fr {
+  hardware ethernet <%= interface['mac'].downcase() %>;
+  option host-name "<%= node_uid %><%= interface['mounted']? "" : "-"+interface['device'] %>-kavlan-<%= kavlan_id %>-ipv6";
+  option domain-name "<%= site %>.grid5000.fr";
+  option domain-search "<%= site %>.grid5000.fr", "grid5000.fr";
+  fixed-address <%= node['kavlan6'][interface['device']]["kavlan-#{kavlan_id}"] %>;
+}
+<%
+             end
         end
       end
     end
-- 
GitLab