mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-16 22:50:10 +03:00
parent
b16ea97bae
commit
77417daa2e
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user