/
kwollectg5k.rb
103 lines (85 loc) · 4.33 KB
/
kwollectg5k.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
require 'refrepo/hash/hash'
require 'erb'
def generate_puppet_kwollectg5k(options)
puts "Writing kwollect configuration files to: #{options[:output_dir]}"
puts "Using configuration directory: #{options[:conf_dir]}"
puts "For site(s): #{options[:sites].join(', ')}"
if not options[:conf_dir]
options[:conf_dir] = "#{options[:output_dir]}/platforms/production/generators/ipmitools/"
end
if not Pathname("#{options[:conf_dir]}/console-password.yaml").exist?
puts "Warning: No #{options[:conf_dir]}/console-password.yaml file found"
credentials = {}
else
credentials = YAML::load_file("#{options[:conf_dir]}/console-password.yaml")
end
refapi = load_data_hierarchy
puts "Old configurations directory will be stored in /tmp/kwollect-#{Time.now.to_i}"
backup_dir = Pathname("/tmp/kwollect-#{Time.now.to_i}/")
backup_dir.mkpath()
refapi['sites'].each { |site_uid, site|
next unless options[:sites].include?(site_uid)
if File.directory?("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kwollect/#{site_uid}")
FileUtils.mv("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kwollect/#{site_uid}", "#{backup_dir}/")
end
# Metrics configuration for each node
site['clusters'].sort.each { |cluster_uid, cluster|
cluster['nodes'].each_sort_by_node_uid { |node_uid, node|
ipmi_credentials = credentials.fetch(site_uid, {}).fetch(cluster_uid, "").split(" ")
ipmi_credentials.map! { |s| ERB::Util.url_encode(s) }
ipmi_credentials = ipmi_credentials.join(":")
output = ERB.new(File.read(File.expand_path('templates/kwollect-node.erb', File.dirname(__FILE__))), trim_mode: '-').result(binding)
output_file = Pathname("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kwollect/#{site_uid}/#{node_uid}.conf")
output_file.dirname.mkpath()
File.write(output_file, output)
}
}
# Metrics configuration for network device
site['network_equipments'].each { |neteq_uid, neteq|
output = ERB.new(File.read(File.expand_path('templates/kwollect-network.erb', File.dirname(__FILE__))), trim_mode: '-').result(binding)
output_file = Pathname("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kwollect/#{site_uid}/#{neteq_uid}.conf")
output_file.dirname.mkpath()
File.write(output_file, output)
}
# Metrics configuration for PDU
## First, parse all PDU to find nodes that use two PSUs
ports_by_node = {}
site.fetch('pdus', {}).each { |pdu_uid, pdu|
pdu.fetch('metrics', []).each {|metric|
next if metric['source']['protocol'] != 'snmp'
if metric['source']['id'].include?('%PORT%')
pdu.fetch('ports', {}).each {|port_uid, node_uid|
if not ports_by_node.has_key?(node_uid)
ports_by_node[node_uid] = []
end
ports_by_node[node_uid] << "#{pdu_uid}-port-#{port_uid}"
}
end
}
}
## Then, write PDU metrics config
site.fetch('pdus', {}).each { |pdu_uid, pdu|
output = ERB.new(File.read(File.expand_path('templates/kwollect-pdu.erb', File.dirname(__FILE__))), trim_mode: '-').result(binding)
output_file = Pathname("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kwollect/#{site_uid}/#{pdu_uid}.conf")
output_file.dirname.mkpath()
File.write(output_file, output)
}
# Wattmetre mapping configuration
wattmetre_port_per_node = {}
site.fetch('pdus', {}).each { |pdu_uid, pdu|
next if pdu.fetch('metrics', []).none?{|metric| metric['source']['protocol'] == 'wattmetre'}
pdu.fetch('ports', {}).each {|port, node|
if not wattmetre_port_per_node.key?(node)
wattmetre_port_per_node[node] = []
end
wattmetre_port_per_node[node] << "#{pdu_uid}-port#{port}"
}
}
if not wattmetre_port_per_node.empty?
output = ERB.new(File.read(File.expand_path('templates/kwollect-wattmetre-mapping.erb', File.dirname(__FILE__))), trim_mode: '-').result(binding)
output_file = Pathname("#{options[:output_dir]}//platforms/production/modules/generated/files/grid5000/kwollect-wattmetre/#{site_uid}/wattmetre-mapping.conf")
output_file.dirname.mkpath()
File.write(output_file, output)
end
}
end