Commit d9e9bb19 authored by MICHON Nicolas's avatar MICHON Nicolas
Browse files

[dev] Added wiki generator for cpu parameters + utility module for future mediawiki generators

parent e5b24939
sagittaire:
cpu_codename: N/A
sol:
cpu_codename: N/A
granduc:
cpu_codename: Merom
chinqchint:
cpu_codename: Penryn
genepi:
cpu_codename: Penryn
griffon:
cpu_codename: Penryn
talc:
cpu_codename: Penryn
parapide:
cpu_codename: Nehalem
edel:
cpu_codename: Nehalem
suno:
cpu_codename: Nehalem
parapluie:
cpu_codename: N/A
chirloute:
cpu_codename: Westmere
graphene:
cpu_codename: Nehalem
chimint:
cpu_codename: Westmere
hercule:
cpu_codename: Sandy Bridge
orion:
cpu_codename: Sandy Bridge
taurus:
cpu_codename: Sandy Bridge
econome:
cpu_codename: Sandy Bridge
petitprince:
cpu_codename: Sandy Bridge
graphite:
cpu_codename: Sandy Bridge
paranoia:
cpu_codename: Sandy Bridge
graphique:
cpu_codename: Haswell
parasilo:
cpu_codename: Haswell
paravance:
cpu_codename: Haswell
graoully:
cpu_codename: Haswell
grimoire:
cpu_codename: Haswell
grisou:
cpu_codename: Haswell
nova:
cpu_codename: Broadwell
grimani:
cpu_codename: Haswell
uva:
cpu_codename: Westmere
uvb:
cpu_codename: Dunnington
chetemi:
cpu_codename: Broadwell
chifflet:
cpu_codename: Broadwell
require "optparse"
require "mediawiki_api"
require_relative '../lib/input_loader'
require_relative './mw_utils'
options = {}
opt_parse = OptionParser.new do |opts|
opts.banner = "Usage: cpuParameters.rb --api-user user --api-password password"
opts.on('-u=user', '--api-user=user', String, 'User for HTTP authentication ') do |user|
options[:user] = user
end
opts.on('-p=pwd', '--api-password=pwd', String, 'Password for HTTP authentication') do |pwd|
options[:pwd] = pwd
end
end
opt_parse.parse!
if (options[:user].nil? || options[:pwd].nil?)
puts opt_parse.to_s
exit
end
target_page = "Template:CPUParameters"
table_columns = ["Installation date", "Site", "Cluster", "CPU Family", "CPU Version", "Core Codename", "Frequency", "Server type", "HT enabled", "Turboboost enabled", "P-State driver", "C-State driver"]
table_data = []
#Static cluster information not present in the ref-repo
cluster_data = YAML::load_file(File.join(File.dirname(File.expand_path(__FILE__)), 'clusters_data.yml'))
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|
node_hash = cluster_hash.fetch('nodes').first[1]
cpu_family = node_hash["processor"]["model"] rescue ""
cpu_version = node_hash["processor"]["version"] rescue ""
cpu_freq = node_hash["processor"]["clock_speed"] / 1000000000.0 rescue 0.0 #GHz
ht_enabled = node_hash["bios"]["configuration"]["ht_enabled"] rescue false
turboboost_enabled = node_hash["bios"]["configuration"]["turboboost_enabled"] rescue false
pstate_driver = node_hash["operating_system"]["pstate_driver"] rescue ""
cstate_driver = node_hash["operating_system"]["cstate_driver"] rescue ""
cpu_codename = cluster_data[cluster_uid]["cpu_codename"] rescue ""
#One line per cluster
table_data << [
DateTime.new(*cluster_hash["created_at"].to_s.scan(/\d+/).map {|i| i.to_i}).strftime("%Y-%m-%d"),
site_uid,
cluster_uid,
cpu_family,
cpu_version,
cpu_codename,
cpu_freq.to_s + " GHz",
cluster_hash["model"],
ht_enabled ? "{{Yes}}" : "{{No}}",
turboboost_enabled ? "{{Yes}}" : "{{No}}",
pstate_driver,
cstate_driver
]
}
}
#Sort by cluster date
table_data.sort_by! { |row|
DateTime.parse(row[0])
}
#Table construction
table_options = 'class="G5KDataTable" border="1" style="text-align: center;"'
page_text = MW.generate_table(table_options, table_columns, table_data)
page_text += MW.italic(MW.small("Generated from the Grid5000 APIs on " + Time.now.strftime("%Y-%m-%d")))
#Finally Create/modify the page on mediawiki
client = MediawikiApi::Client.new(MW::BASE_URL)
client.log_in(options[:user], options[:pwd])
client.edit({"title" => target_page, "text" => page_text })
#Defines MediaWiki helpers
module MW
BASE_URL = "https://www.grid5000.fr/mediawiki/api.php"
TABLE_START = "{|"
TABLE_END = "|}"
TABLE_ROW = "|-"
TABLE_HEADER = "!"
INLINE_CELL = "||"
TABLE_CELL = "|"
LINE_FEED = "\n"
HTML_LINE_FEED = "<br />"
def self.generate_table(table_options, columns, rows)
table_text = MW::TABLE_START + table_options
table_text += MW::LINE_FEED + MW::TABLE_ROW + MW::LINE_FEED
columns.each { |col|
table_text += MW::TABLE_HEADER + MW::TABLE_CELL + col + MW::LINE_FEED
}
rows.each { |row|
table_text += MW::TABLE_ROW + MW::LINE_FEED
row.each_with_index{ |cell, i|
if (i == 0)
table_text += MW::TABLE_CELL
else
table_text += MW::INLINE_CELL
end
table_text += cell.to_s
}
table_text += MW::LINE_FEED
}
table_text += MW::LINE_FEED + MW::TABLE_END
return table_text
end
def self.small(text)
"<small>" + text + "</small>"
end
def self.big(text)
"<big>" + text + "</big>"
end
def self.italic(text)
"''" + text + "''"
end
def self.bold(text)
"'''" + text + "'''"
end
end
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment