1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-23 22:50:09 +03:00

Bug #4376: Make the VN_MAD selection interactive

This commit is contained in:
Jaime Melis 2016-04-25 17:47:17 -04:00
parent 5888a4901c
commit 28e390ce66

View File

@ -513,20 +513,18 @@ module Migrator
# Build net_vnmad
net_vnmad = {}
@db.transaction do
@db.fetch("SELECT * FROM vm_pool") do |row|
@db.fetch("SELECT * FROM vm_pool WHERE state != 6") do |row|
doc = Nokogiri::XML(row[:body],nil,NOKOGIRI_ENCODING){|c| c.default_xml.noblanks}
state = row[:state].to_i
if state != 6
vnmads = Set.new
doc.root.xpath("HISTORY_RECORDS/HISTORY/VNMMAD").collect{|v| vnmads << v.text }
vnmads = Set.new
doc.root.xpath("HISTORY_RECORDS/HISTORY/VNMMAD").collect{|v| vnmads << v.text }
doc.root.xpath("TEMPLATE/NIC/NETWORK_ID").each do |net_id|
net_id = net_id.text.to_i
doc.root.xpath("TEMPLATE/NIC/NETWORK_ID").each do |net_id|
net_id = net_id.text.to_i
net_vnmad[net_id] ||= Set.new
net_vnmad[net_id] += vnmads
end
net_vnmad[net_id] ||= Set.new
net_vnmad[net_id] += vnmads
end
end
end
@ -578,13 +576,15 @@ module Migrator
@db.run "CREATE TABLE network_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, pid INTEGER, UNIQUE(name,uid));"
reserved_vlan_ids = Set.new
suggest_patch = false
final_net_vnmad = {}
manual_intervention = false
@db.transaction do
@db.fetch("SELECT * FROM old_network_pool") do |row|
doc = Nokogiri::XML(row[:body],nil,NOKOGIRI_ENCODING){|c| c.default_xml.noblanks}
net_id = row[:oid]
net_id = row[:oid]
net_name = row[:name]
cluster_id = doc.root.xpath('CLUSTERS/ID').first.text.to_i
# Get possible VN_MADs
@ -604,40 +604,74 @@ module Migrator
# Get vnmad
#
# net_vnmad_len == 1 => that one
# net_vnmad_len > 1 => get first one and show warning
# net_vnmad_len > 1 => interactive
# net_vnmad_len == 0 && cluster_vnmad_len == 1 => that one
# net_vnmad_len == 0 && cluster_vnmad_len > 1 => first one and show warning
# net_vnmad_len == 0 && cluster_vnmad_len == 0 => force onedb patch
# net_vnmad_len == 0 && cluster_vnmad_len > 1 => interactive
# net_vnmad_len == 0 && cluster_vnmad_len == 0 => interactive
if net_vnmad_len == 1
vnmad = net_vnmad[net_id].first
elsif net_vnmad_len > 1
vnmad = net_vnmad[net_id].first
other_vnmads = net_vnmad[net_id] - Set[vnmad]
other_vnmads = net_vnmad[net_id]
elsif net_vnmad_len == 0 && cluster_vnmad_len == 1
vnmad = cluster_vnmad[cluster_id].first
elsif net_vnmad_len == 0 && cluster_vnmad_len > 1
vnmad = cluster_vnmad[cluster_id].first
other_vnmads = cluster_vnmad[cluster_id] - Set[vnmad]
other_vnmads = cluster_vnmad[cluster_id]
end
# Ambiguous vnmad, require user input (TODO)
if vnmad && other_vnmads
if !suggest_patch
if vnmad.nil?
if !manual_intervention
manual_intervention = true
puts
puts "Manual Intervention required. Please input the VN_MAD " <<
" for the following networks:"
puts
puts "**************************************************************"
puts "* WARNING WARNING WARNING WARNING WARNING WARNING WARNING *"
puts "**************************************************************"
end
suggest_patch = true
puts "* Net ##{net_id} assigned VN_MAD=#{vnmad}. " <<
"Other options: #{other_vnmads.to_a.join(', ')}"
suggested = if other_vnmads
" (suggested: [#{other_vnmads.to_a.join(', ')}])"
else
""
end
input = ""
while (input.empty?) do
puts "* Net ##{net_id} (#{net_name}) VN_MAD#{suggested}:"
input = STDIN.gets.chomp.strip
if input.match(/[^\w\-.]/)
puts "Invalid char found."
input = ""
end
end
vnmad = input
end
# If VLAN = NO => don't use isolated VN_MADs
if vlan_no && vnmad && ["802.1q", "ovswitch", "vxlan", "ebtables"].include?(vnmad.downcase)
vnmad = "fw"
input = ""
while (input.empty?) do
puts "Net ##{net_id} (#{net_name}) has VN_MAD='#{vnmad}' but it also has VLAN=NO. Change to 'fw'? (y/n)"
input = STDIN.gets.chomp.strip
case input
when 'y'
vnmad = 'fw'
when 'n'
else
puts "Invalid value."
input = ""
end
end
end
if vnmad.nil?
STDERR.puts "Error getting VN_MAD for Network #{net_id}."
exit 1
end
# Create the VN_MAD element:
@ -690,28 +724,6 @@ module Migrator
end
end
patch_cmd = "onedb patch [opts] /usr/lib/one/ruby/onedb/patches/vnmad.rb"
if suggest_patch
puts
puts "If you want to change the above assignments, please run:"
puts patch_cmd
end
net_unassigned = final_net_vnmad.select{|k,v| v.nil?}.keys
if !net_unassigned.empty?
puts
puts "**************************************************************"
puts "* ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR *"
puts "**************************************************************"
puts
puts "You **must** run:"
puts patch_cmd
puts
puts "to assign a vnmad to the following networks:"
net_unassigned.each{|n| puts " - #{n}"}
puts
end
@db.run "DROP TABLE old_network_pool;"
# Fix VMs
@ -720,7 +732,7 @@ module Migrator
@db.run "CREATE TABLE IF NOT EXISTS vm_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, last_poll INTEGER, state INTEGER, lcm_state INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER)"
@db.transaction do
@db.fetch("SELECT * FROM old_vm_pool") do |row|2
@db.fetch("SELECT * FROM old_vm_pool") do |row|
doc = Nokogiri::XML(row[:body],nil,NOKOGIRI_ENCODING){|c| c.default_xml.noblanks}
state = row[:state].to_i
@ -765,9 +777,11 @@ module Migrator
# Create Table
@db.run "CREATE TABLE network_vlan_bitmap (id INTEGER, map LONGTEXT, PRIMARY KEY(id));"
size = 4096
map = ""
4096.times.each do |i|
map << (reserved_vlan_ids.include?(4095 - i) ? "1" : "0")
size.times.each do |i|
map << (reserved_vlan_ids.include?(size - 1 - i) ? "1" : "0")
end
map_encoded = Base64::strict_encode64(Zlib::Deflate.deflate(map))