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

F #3371: refactor and lint cluster fsck (#3400)

This commit is contained in:
Alejandro Huertas Herrero 2019-06-04 10:11:50 +02:00 committed by Ruben S. Montero
parent b16ea97bae
commit 77417daa2e
3 changed files with 157 additions and 125 deletions

View File

@ -503,8 +503,6 @@ AllCops:
- src/onedb/fsck/marketplace.rb
- src/onedb/fsck/template.rb
- src/onedb/fsck/group.rb
- src/onedb/fsck/cluster.rb
- src/onedb/fsck/cluster_vnc_bitmap.rb
- src/onedb/fsck/host.rb
- src/onedb/fsck/vm.rb
- src/onedb/fsck/marketplaceapp.rb

View File

@ -1,120 +1,39 @@
# Cluster module
module OneDBFsck
# Gather clusters information
def init_cluster
cluster = @data_cluster = {}
@db.fetch("SELECT oid, name FROM cluster_pool") do |row|
@db.fetch('SELECT oid, name FROM cluster_pool') do |row|
cluster[row[:oid]] = {}
cluster[row[:oid]][:name] = row[:name]
cluster[row[:oid]][:hosts] = []
cluster[row[:oid]][:datastores] = Set.new
cluster[row[:oid]][:vnets] = Set.new
end
end
# Check and fix clusters information
def check_fix_cluster
cluster = @data_cluster
create_table(:cluster_pool, :cluster_pool_new)
@db.transaction do
@db.fetch("SELECT * from cluster_pool") do |row|
@db.fetch('SELECT * from cluster_pool') do |row|
cluster_id = row[:oid]
doc = Document.new(row[:body])
doc = Document.new(row[:body])
# Hosts
hosts_elem = doc.root.elements.delete("HOSTS")
hosts_new_elem = doc.root.add_element("HOSTS")
cluster[cluster_id][:hosts].each do |id|
id_elem = hosts_elem.elements.delete("ID[.=#{id}]")
if id_elem.nil?
log_error("Host #{id} is missing from Cluster " <<
"#{cluster_id} host id list")
end
hosts_new_elem.add_element("ID").text = id.to_s
end
hosts_elem.each_element("ID") do |id_elem|
log_error("Host #{id_elem.text} is in Cluster " <<
"#{cluster_id} host id list, but it should not")
end
process_hosts(doc, cluster_id, cluster[cluster_id][:hosts])
# Datastores
ds_elem = doc.root.elements.delete("DATASTORES")
ds_new_elem = doc.root.add_element("DATASTORES")
cluster[cluster_id][:datastores].each do |id|
id_elem = ds_elem.elements.delete("ID[.=#{id}]")
if id_elem.nil?
log_error("Datastore #{id} is missing from Cluster " <<
"#{cluster_id} datastore id list")
end
ds_new_elem.add_element("ID").text = id.to_s
if @db.fetch("SELECT * FROM cluster_datastore_relation " <<
"WHERE cid=#{cluster_id} AND oid=#{id}").empty?
log_error("Table cluster_datastore_relation is " <<
"missing relation cluster #{cluster_id}, " <<
"datastore #{id}")
@db[:cluster_datastore_relation].insert(
cid: cluster_id,
oid: id
)
end
end
ds_elem.each_element("ID") do |id_elem|
log_error("Datastore #{id_elem.text} is in Cluster " <<
"#{cluster_id} datastore id list, but " <<
"it should not")
end
process_ds(doc, cluster_id, cluster[cluster_id][:datastores])
# VNets
vnets_elem = doc.root.elements.delete("VNETS")
vnets_new_elem = doc.root.add_element("VNETS")
cluster[cluster_id][:vnets].each do |id|
id_elem = vnets_elem.elements.delete("ID[.=#{id}]")
if id_elem.nil?
log_error("VNet #{id} is missing from Cluster " <<
"#{cluster_id} vnet id list")
end
vnets_new_elem.add_element("ID").text = id.to_s
if @db.fetch("SELECT * FROM cluster_network_relation " <<
"WHERE cid=#{cluster_id} AND oid=#{id}").empty?
log_error("Table cluster_network_relation is " <<
"missing relation cluster #{cluster_id}, " <<
"vnet #{id}")
@db[:cluster_network_relation].insert(
cid: cluster_id,
oid: id
)
end
end
vnets_elem.each_element("ID") do |id_elem|
log_error("VNet #{id_elem.text} is in Cluster " <<
"#{cluster_id} vnet id list, but it should not")
end
process_vnets(doc, cluster_id, cluster[cluster_id][:vnets])
row[:body] = doc.root.to_s
@ -124,10 +43,111 @@ module OneDBFsck
end
# Rename table
@db.run("DROP TABLE cluster_pool")
@db.run("ALTER TABLE cluster_pool_new RENAME TO cluster_pool")
@db.run('DROP TABLE cluster_pool')
@db.run('ALTER TABLE cluster_pool_new RENAME TO cluster_pool')
end
# Process cluster hosts
#
# @param doc [Document] Document with cluster information
# @param cid [Integer] Cluster ID
# @param hosts [Array] Hosts to process
def process_hosts(doc, cid, hosts)
hosts_elem = doc.root.elements.delete('HOSTS')
hosts_new_elem = doc.root.add_element('HOSTS')
hosts.each do |id|
id_elem = hosts_elem.elements.delete("ID[.=#{id}]")
if id_elem.nil?
log_error("Host #{id} is missing from cluster " \
"#{cid} host id list")
end
hosts_new_elem.add_element('ID').text = id.to_s
end
hosts_elem.each_element('ID') do |id|
id = id.text
log_error("Host #{id} is in cluster #{cid} " \
'host id list, but it should not')
end
end
# Process cluster datastores
#
# @param doc [Document] Document with cluster information
# @param cid [Integer] Cluster ID
# @param datastores [Array] Datastores to process
def process_ds(doc, cid, datastores)
ds_elem = doc.root.elements.delete('DATASTORES')
ds_new_elem = doc.root.add_element('DATASTORES')
datastores.each do |id|
id_elem = ds_elem.elements.delete("ID[.=#{id}]")
if id_elem.nil?
log_error("Datastore #{id} is missing from cluster " \
"#{cid} datastore id list")
end
ds_new_elem.add_element('ID').text = id.to_s
next unless @db.fetch('SELECT * FROM cluster_datastore_relation ' \
"WHERE cid=#{cid} AND oid=#{id}").empty?
log_error('Table cluster_datastore_relation is missing relation ' \
"cluster #{cid}, datastore #{id}")
@db[:cluster_datastore_relation].insert(:cid => cid, :oid => id)
end
ds_elem.each_element('ID') do |id|
id = id.text
log_error("Datastore #{id} is in cluster #{cid} datastore id " \
'list, but it should not')
end
end
# Process cluster virtual networks
#
# @param doc [Document] Document with cluster information
# @param cid [Integer] Cluster ID
# @param vnets [Array] VNets to process
def process_vnets(doc, cid, vnets)
vnets_elem = doc.root.elements.delete('VNETS')
vnets_new_elem = doc.root.add_element('VNETS')
vnets.each do |id|
id_elem = vnets_elem.elements.delete("ID[.=#{id}]")
if id_elem.nil?
log_error("VNet #{id} is missing from cluster #{cid} " \
'vnet id list')
end
vnets_new_elem.add_element('ID').text = id.to_s
next unless @db.fetch('SELECT * FROM cluster_network_relation ' \
"WHERE cid=#{cid} AND oid=#{id}").empty?
log_error('Table cluster_network_relation is missing relation ' \
"cluster #{cid}, vnet #{id}")
@db[:cluster_network_relation].insert(:cid => cid, :oid => id)
end
vnets_elem.each_element('ID') do |id|
id = id.text
log_error("VNet #{id} is in cluster #{cid} vnet id list, " \
'but it should not')
end
end
# Check and fix cluster relations with datastores and VNets
def check_fix_cluster_relations
cluster = @data_cluster
@ -135,41 +155,41 @@ module OneDBFsck
create_table(:cluster_datastore_relation,
:cluster_datastore_relation_new)
@db.fetch("SELECT * from cluster_datastore_relation") do |row|
if (cluster[row[:cid]][:datastores].count(row[:oid]) != 1)
log_error("Table cluster_datastore_relation contains " <<
"relation cluster #{row[:cid]}, datastore " <<
@db.fetch('SELECT * from cluster_datastore_relation') do |row|
if cluster[row[:cid]][:datastores].count(row[:oid]) != 1
log_error('Table cluster_datastore_relation contains ' \
"relation cluster #{row[:cid]}, datastore " \
"#{row[:oid]}, but it should not")
else
@db[:cluster_datastore_relation_new].insert(row)
end
end
@db.run("DROP TABLE cluster_datastore_relation")
@db.run("ALTER TABLE cluster_datastore_relation_new " <<
"RENAME TO cluster_datastore_relation")
@db.run('DROP TABLE cluster_datastore_relation')
@db.run('ALTER TABLE cluster_datastore_relation_new ' \
'RENAME TO cluster_datastore_relation')
end
log_time()
log_time
@db.transaction do
create_table(:cluster_network_relation,
:cluster_network_relation_new)
@db.fetch("SELECT * from cluster_network_relation") do |row|
if (cluster[row[:cid]][:vnets].count(row[:oid]) != 1)
log_error("Table cluster_network_relation contains " <<
"relation cluster #{row[:cid]}, " <<
@db.fetch('SELECT * from cluster_network_relation') do |row|
if cluster[row[:cid]][:vnets].count(row[:oid]) != 1
log_error('Table cluster_network_relation contains ' \
"relation cluster #{row[:cid]}, " \
"vnet #{row[:oid]}, but it should not")
else
@db[:cluster_network_relation_new].insert(row)
end
end
@db.run("DROP TABLE cluster_network_relation")
@db.run("ALTER TABLE cluster_network_relation_new " <<
"RENAME TO cluster_network_relation")
@db.run('DROP TABLE cluster_network_relation')
@db.run('ALTER TABLE cluster_network_relation_new ' \
'RENAME TO cluster_network_relation')
end
end
end
end

View File

@ -1,40 +1,54 @@
# Cluster vnc module
module OneDBFsck
def check_cluster_vnc_bitmap
fixes = @fixes_cluster_vnc_bitmap = {}
cluster_vnc = @data_vm[:vnc]
# Check cluster vnc bitmap
def check_cluster_vnc_bitmap
fixes = @fixes_cluster_vnc_bitmap = {}
cluster_vnc = @data_vm[:vnc]
vnc_pool_size = 65536
@db.fetch("SELECT * FROM cluster_pool") do |row|
@db.fetch('SELECT * FROM cluster_pool') do |row|
cluster_id = row[:oid]
if cluster_vnc[cluster_id]
map = ""
map = ''
vnc_pool_size.times.each do |i|
map << (cluster_vnc[cluster_id].include?(vnc_pool_size - 1 - i) ? "1" : "0")
cluster = cluster_vnc[cluster_id]
if cluster.include?(vnc_pool_size - 1 - i)
map << '1'
else
map << '0'
end
end
map_encoded = Base64::strict_encode64(Zlib::Deflate.deflate(map))
map_encoded = Base64.strict_encode64(Zlib::Deflate.deflate(map))
else
map_encoded = "eJztwYEAAAAAgCCl/ekWqQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqFo8C0Q=="
map_encoded = 'eJztwYEAAAAAgCCl/ekWqQoAAAAAAAAAAAAAAAAAAAAAA' \
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' \
'AAAAAAAAAAAAAAAABqFo8C0Q=='
end
old_map_encoded = @db[:cluster_vnc_bitmap].first(:id => cluster_id)[:map] rescue nil
cluster = @db[:cluster_vnc_bitmap].first(:id => cluster_id)
old_map_encoded = cluster[:map] rescue nil
if old_map_encoded != map_encoded
log_error("Cluster #{cluster_id} has not the proper reserved VNC ports")
log_error("Cluster #{cluster_id} has not the proper " \
'reserved VNC ports')
fixes[cluster_id] = map_encoded
end
end
end
# Fix cluster vnc bitmap
def fix_cluster_vnc_bitmap
@db.transaction do
@fixes_cluster_vnc_bitmap.each do |id, map|
@db[:cluster_vnc_bitmap].where(id: id).update(map: map)
@db[:cluster_vnc_bitmap].where(:id => id).update(:map => map)
end
end
end
end
end