Skip to content

Commit 92737f1

Browse files
committed
Merge branch 'wiki_network_sriov' into 'master'
[wiki] Add SR-IOV information and improve network tables See merge request grid5000/reference-repository!269
2 parents c7fc050 + a0fc584 commit 92737f1

File tree

2 files changed

+73
-19
lines changed

2 files changed

+73
-19
lines changed

lib/refrepo/gen/wiki/generators/hardware.rb

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,18 @@ def generate_totals
160160
text: v['interface'],
161161
sort: v['interface']
162162
},
163+
{
164+
text: v['driver'], sort: v['driver']
165+
},
163166
{
164167
text: t, sort: t
165168
}
166169
]
167170
}.uniq
168171

169172
net_models = interfaces.inject(Hash.new(0)){ |h, v| h[v] += 1; h }
170-
net_models.sort_by { |k, v| k.first[:sort] }.each { |k, v|
173+
# Sort by interface type (eth or IB) and then by driver
174+
net_models.sort_by { |k, v| [k.first[:sort], k[1][:sort]] }.each { |k, v|
171175
init(data, 'net_models', k)
172176
data['net_models'][k][site_uid] += v
173177
}
@@ -280,8 +284,11 @@ def generate_totals
280284
generated_content += "\n== Nodes with several Ethernet interfaces ==\n"
281285
generated_content += generate_interfaces
282286

287+
generated_content += "\n== Nodes with SR-IOV support ==\n"
288+
generated_content += generate_sriov_interfaces
289+
283290
generated_content += "\n== Network interface models ==\n"
284-
table_columns = ['Type', 'Model'] + sites + ['Cards total']
291+
table_columns = ['Type', 'Driver', 'Model'] + sites + ['Cards total']
285292
generated_content += MW.generate_table(table_options, table_columns, get_table_data(data, 'net_models'))
286293

287294
generated_content += "\n= Storage ="
@@ -458,7 +465,7 @@ def generate_interfaces
458465
interfaces['25g_count'] = node_interfaces.select { |v| v['rate'] == 25_000_000_000 }.count
459466
interfaces['10g_count'] = node_interfaces.select { |v| v['rate'] == 10_000_000_000 }.count
460467
interfaces['1g_count'] = node_interfaces.select { |v| v['rate'] == 1_000_000_000 }.count
461-
interfaces['details'] = node_interfaces.map{ |v| v['device'] + (v['name'].nil? ? '' : '/' + v['name']) + ' (' + G5K.get_rate(v['rate']) + ')' }.sort.join(', ')
468+
interfaces['details'] = node_interfaces.map{ |v| v['name'] + ' (' + G5K.get_rate(v['rate']) + ')' }.sort.join(', ')
462469
queues = cluster_hash['queues'] - ['admin', 'default', 'testing']
463470
interfaces['queues'] = (queues.nil? || (queues.empty? ? '' : queues[0] + G5K.pluralize(queues.count, ' queue')))
464471
interface_add(network_interfaces, node_uid, interfaces) if node_interfaces.count > 1
@@ -489,6 +496,49 @@ def generate_interfaces
489496
MW.generate_table(table_options, table_columns, table_data)
490497
end
491498

499+
def generate_sriov_interfaces
500+
table_data = []
501+
@global_hash["sites"].sort.to_h.each { |site_uid, site_hash|
502+
site_hash.fetch("clusters").sort.to_h.each { |cluster_uid, cluster_hash|
503+
network_interfaces = {}
504+
cluster_hash.fetch('nodes').sort.to_h.each { |node_uid, node_hash|
505+
next if node_hash['status'] == 'retired'
506+
if node_hash['network_adapters']
507+
node_interfaces = node_hash['network_adapters'].select{ |v|
508+
v['sriov'] and
509+
v['enabled'] == true and
510+
(v['mounted'] == true or v['mountable'] == true) and
511+
v['management'] == false
512+
}
513+
514+
interfaces = {}
515+
interfaces['details'] = node_interfaces.map{ |v| v['name'] + " (#{v['sriov_totalvfs']} VFs)" }.sort.join(', ')
516+
interfaces['vfs_sum'] = node_interfaces.map{ |v| v['sriov_totalvfs'] }.sum
517+
interface_add(network_interfaces, node_uid, interfaces) if node_interfaces.count > 0
518+
end
519+
}
520+
521+
# One line for each group of nodes with the same interfaces
522+
network_interfaces.sort.to_h.each { |num, interfaces|
523+
table_data << [
524+
"[[#{site_uid.capitalize}:Network|#{site_uid.capitalize}]]",
525+
"[[#{site_uid.capitalize}:Hardware##{cluster_uid}" + "|#{cluster_uid}" + (network_interfaces.size==1 ? '' : '-' + G5K.nodeset(num)) + "]]",
526+
num.count,
527+
"data-sort-value=\"#{interfaces['vfs_sum']}\"|#{interfaces['details']}"
528+
]
529+
}
530+
}
531+
}
532+
# Sort by site and cluster name
533+
table_data.sort_by! { |row|
534+
[row[0], row[1]]
535+
}
536+
537+
table_options = 'class="wikitable sortable" style="text-align: center;"'
538+
table_columns = ["Site", "Cluster", "Nodes", "Interfaces (max number of Virtual Functions)"]
539+
MW.generate_table(table_options, table_columns, table_data)
540+
end
541+
492542
# This methods adds the array interfaces to the hash
493543
# network_interfaces. If nodes 2,3,7 have the same interfaces, they
494544
# will be gathered in the same key and we will have

lib/refrepo/gen/wiki/generators/site_hardware.rb

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ def get_hardware(sites)
344344
}.map{|v| {
345345
'rate' => v['rate'],
346346
'interface' => v['interface'],
347+
'sriov' => v['sriov'],
347348
'used' => (v['enabled'] and (v['mounted'] or v['mountable']))
348349
}
349350
}
@@ -356,6 +357,7 @@ def get_hardware(sites)
356357
}.map{ |e|
357358
get_network_info(e, false)
358359
}.join('+&nbsp;')
360+
hard['used_networks'] += ', SR-IOV available' if network.any? { |e| e['sriov'] }
359361

360362
hard['network_throughput'] = network.select { |e|
361363
e['used'] == true
@@ -373,6 +375,7 @@ def get_hardware(sites)
373375
'rate' => v['rate'],
374376
'interface' => v['interface'],
375377
'driver' => v['driver'],
378+
'sriov' => v['sriov'],
376379
'unwired' => v['enabled'] == false,
377380
'unavailable_for_experiment' => v['mountable'] == false,
378381
'no_kavlan' => (v['interface'] == 'Ethernet' &&
@@ -386,33 +389,34 @@ def get_hardware(sites)
386389
}
387390
nic_c = 0
388391
hard['network_description'] = network_description.map do |e|
389-
s = e['count'] > 1 ? "\n* " : ''
390-
s += e['unavailable_for_experiment'] ? '<span style="color:grey">' : ''
392+
desc = []
391393
if e['name'].nil? or e['name'] == e['device']
392-
s += e['device']
394+
desc.append(e['device'])
393395
else
394-
s += e['device'] + "/" + e['name']
396+
desc.append(e['device'] + "/" + e['name'])
395397
end
396-
s += ', '
397-
s += e['interface']
398-
s += ', '
398+
desc.append(e['interface'])
399+
399400
if !(e['unwired'] and e['unavailable_for_experiment'])
400-
s += 'configured rate: ' + (e['unwired'] ? 'n/c' : G5K.get_rate(e['rate']))
401-
s += ', '
401+
desc.append('configured rate: ' + (e['unwired'] ? 'n/c' : G5K.get_rate(e['rate'])))
402402
end
403403
if !(e['model'] == 'N/A N/A' and e['unavailable_for_experiment']) # don't include interface model if not available
404404
e['model'] = 'N/A' if e['model'] == 'N/A N/A'
405-
s += 'model: '+ e['model'] + ', '
405+
desc.append('model: '+ e['model'])
406406
end
407-
s += 'driver: ' + e['driver'] if e['driver']
408-
if e['unavailable_for_experiment']
409-
s += ' - unavailable for experiment'
407+
desc.append('driver: ' + e['driver']) if e['driver']
408+
desc.append('SR-IOV enabled') if e['sriov'] and not e['unavailable_for_experiment']
409+
# Generate final string and then adjust
410+
s = desc.join(', ')
411+
if e['no_kavlan']
412+
s += ' - no KaVLAN'
413+
elsif e['unavailable_for_experiment']
414+
s = '<span style="color:grey">' + s + ' - unavailable for experiment</span>'
410415
elsif e['device'] =~ /eth/
411-
s += ' [[Advanced_KaVLAN#A_simple_multi_NICs_example|(multi NICs example)]]' if !nic_c.zero? and not e.fetch('no_kavlan')
416+
s += ' [[Advanced_KaVLAN#A_simple_multi_NICs_example|(multi NICs example)]]' if !nic_c.zero?
412417
nic_c += 1
413418
end
414-
s += ' - no KaVLAN' if e['no_kavlan']
415-
s += e['unavailable_for_experiment'] ? '</span>' : ''
419+
s = "\n* " + s
416420
s
417421
end.join('<br />')
418422

0 commit comments

Comments
 (0)