From f023dd3a9553cc2160d7b0e4a6d00c52060dd86c Mon Sep 17 00:00:00 2001
From: Florent Didier <florent.didier@inria.fr>
Date: Mon, 29 Jan 2018 16:54:10 +0100
Subject: [PATCH] [dev] disk_reservation.rb: add this wiki generator

---
 generators/wiki/disk_reservation.rb | 71 +++++++++++++++++++++++++++++
 1 file changed, 71 insertions(+)
 create mode 100644 generators/wiki/disk_reservation.rb

diff --git a/generators/wiki/disk_reservation.rb b/generators/wiki/disk_reservation.rb
new file mode 100644
index 00000000000..ea1b9cadc02
--- /dev/null
+++ b/generators/wiki/disk_reservation.rb
@@ -0,0 +1,71 @@
+# coding: utf-8
+require_relative '../lib/input_loader'
+require_relative './wiki_generator'
+require_relative './mw_utils'
+
+class DiskReservationGenerator < WikiGenerator
+
+  def initialize(page_name)
+    super(page_name)
+  end
+
+  def generate_content
+    table_columns = ["Site", "Cluster", "Number of nodes", "Number of reservable disks per node"]
+    table_data = []
+    global_hash = load_yaml_file_hierarchy(File.expand_path("../../input/grid5000/", File.dirname(__FILE__)))
+
+    # Loop over Grid'5000 sites
+    global_hash["sites"].each { |site_uid, site_hash|
+      site_hash.fetch("clusters").each { |cluster_uid, cluster_hash|
+        disk_info = {}
+        cluster_hash.fetch('nodes').sort.each { |node_uid, node_hash|
+          next if node_hash['status'] == 'retired'
+           reservable_disks = node_hash['storage_devices'].select{ |k, v| v['reservation'] == true }.count
+          add(disk_info, node_uid, reservable_disks)
+        }
+
+        # One line for each group of nodes with the same number of reservable disks
+        disk_info.each { |num, reservable_disks|
+        table_data << [
+          "[[#{site_uid.capitalize}:Hardware|#{site_uid.capitalize}]]",
+          "[https://api.grid5000.fr/stable/sites/#{site_uid}/clusters/#{cluster_uid}/nodes.json?pretty=1 #{cluster_uid}" + (disk_info.size== 1 ? '' : '-' + G5K.nodeset(num)) + "]",
+          num.count,
+          reservable_disks
+          ] if reservable_disks > 0
+        }
+      }
+    }
+    # Sort by site and cluster name
+    table_data.sort_by! { |row|
+      [row[0], row[1]]
+    }
+
+    # Table construction
+    table_options = 'class="wikitable sortable"'
+    @generated_content = MW.generate_table(table_options, table_columns, table_data)
+    @generated_content += MW.italic(MW.small("Generated from the Grid5000 APIs on " + Time.now.strftime("%Y-%m-%d")))
+    @generated_content += MW::LINE_FEED
+  end
+
+  # This methods adds the array disk to the hash
+  # disk_info. If nodes 2,3,7 have the same disk, they
+  # will be gathered in the same key and we will have
+  # disk_info[[2,3,7]] = disk
+  def add(disk_info, node_uid, disk)
+    num1 = node_uid.split('-')[1].to_i
+    if disk_info.has_value?(disk) == false
+      disk_info[[num1]] = disk
+    else
+      num2 = disk_info.key(disk)
+      disk_info.delete(num2)
+      disk_info[num2.push(num1)] = disk
+    end
+  end
+end
+
+generator = DiskReservationGenerator.new("Generated/DiskReservation")
+
+options = WikiGenerator::parse_options
+if (options)
+  exit(WikiGenerator::exec(generator, options))
+end
-- 
GitLab