diff --git a/share/linters/.rubocop.yml b/share/linters/.rubocop.yml index d8c9f60b13..74d8883edf 100644 --- a/share/linters/.rubocop.yml +++ b/share/linters/.rubocop.yml @@ -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 diff --git a/src/onedb/fsck/cluster.rb b/src/onedb/fsck/cluster.rb index 4de9ddb767..f9d415a438 100644 --- a/src/onedb/fsck/cluster.rb +++ b/src/onedb/fsck/cluster.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 diff --git a/src/onedb/fsck/cluster_vnc_bitmap.rb b/src/onedb/fsck/cluster_vnc_bitmap.rb index 80c2513ed8..723faff8d3 100644 --- a/src/onedb/fsck/cluster_vnc_bitmap.rb +++ b/src/onedb/fsck/cluster_vnc_bitmap.rb @@ -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