From 358a59d3a8f9035c60a9f07887fce4ffc812fdb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Mon, 17 Feb 2014 15:28:02 +0100 Subject: [PATCH] Feature #2586: Optimize onedb upgrade (cherry picked from commit 57099e26426ae63756f7c8cae91de7fe29ad1608) --- src/onedb/3.8.0_to_3.8.1.rb | 101 +++--- src/onedb/3.8.5_to_3.9.80.rb | 570 +++++++++++++++++++--------------- src/onedb/3.9.80_to_3.9.90.rb | 78 +++-- src/onedb/4.0.1_to_4.1.80.rb | 71 +++-- src/onedb/4.2.0_to_4.3.80.rb | 331 +++++++++++--------- src/onedb/onedb.rb | 18 ++ src/onedb/onedb_backend.rb | 14 + 7 files changed, 666 insertions(+), 517 deletions(-) diff --git a/src/onedb/3.8.0_to_3.8.1.rb b/src/onedb/3.8.0_to_3.8.1.rb index 293c537a60..371b47559d 100644 --- a/src/onedb/3.8.0_to_3.8.1.rb +++ b/src/onedb/3.8.0_to_3.8.1.rb @@ -15,6 +15,7 @@ #--------------------------------------------------------------------------- # require 'set' +require 'nokogiri' require "rexml/document" include REXML @@ -29,6 +30,8 @@ module Migrator def up + init_log_time() + ######################################################################## # Bug : Add VM IDs Collection to Hosts & Images ######################################################################## @@ -49,17 +52,17 @@ module Migrator counters[:image][row[:oid]] = Set.new end + log_time() # Aggregate information of the RUNNING vms @db.fetch("SELECT oid,body FROM vm_pool WHERE state<>6") do |row| - vm_doc = Document.new(row[:body]) - - state = vm_doc.root.get_text('STATE').to_s.to_i - lcm_state = vm_doc.root.get_text('LCM_STATE').to_s.to_i + vm_doc = Nokogiri::XML(row[:body]) + state = vm_doc.root.at_xpath('STATE').text.to_i + lcm_state = vm_doc.root.at_xpath('LCM_STATE').text.to_i # Images used by this VM - vm_doc.root.each_element("TEMPLATE/DISK/IMAGE_ID") do |e| + vm_doc.root.xpath("TEMPLATE/DISK/IMAGE_ID").each do |e| img_id = e.text.to_i if counters[:image][img_id].nil? @@ -78,7 +81,7 @@ module Migrator # Get hostid hid = -1 - vm_doc.root.each_element("HISTORY_RECORDS/HISTORY[last()]/HID") { |e| + vm_doc.root.xpath("HISTORY_RECORDS/HISTORY[last()]/HID").each { |e| hid = e.text.to_i } @@ -89,6 +92,8 @@ module Migrator end end + log_time() + ######################################################################## # Hosts # @@ -103,38 +108,41 @@ module Migrator "UNIQUE(name));" # Calculate the host's xml and write them to host_pool_new - @db[:host_pool].each do |row| - host_doc = Document.new(row[:body]) + @db.transaction do + @db[:host_pool].each do |row| + host_doc = Document.new(row[:body]) - hid = row[:oid] + hid = row[:oid] - rvms = counters[:host][hid][:rvms].size + rvms = counters[:host][hid][:rvms].size - # rewrite running_vms - host_doc.root.each_element("HOST_SHARE/RUNNING_VMS") {|e| - if e.text != rvms.to_s - warn("Host #{hid} RUNNING_VMS has #{e.text} \tis\t#{rvms}") - e.text = rvms + # rewrite running_vms + host_doc.root.each_element("HOST_SHARE/RUNNING_VMS") {|e| + if e.text != rvms.to_s + warn("Host #{hid} RUNNING_VMS has #{e.text} \tis\t#{rvms}") + e.text = rvms + end + } + + # re-do list of VM IDs + vms_new_elem = host_doc.root.add_element("VMS") + + counters[:host][hid][:rvms].each do |id| + vms_new_elem.add_element("ID").text = id.to_s end - } - # re-do list of VM IDs - vms_new_elem = host_doc.root.add_element("VMS") + row[:body] = host_doc.to_s - counters[:host][hid][:rvms].each do |id| - vms_new_elem.add_element("ID").text = id.to_s + # commit + @db[:host_pool_new].insert(row) end - - row[:body] = host_doc.to_s - - # commit - @db[:host_pool_new].insert(row) end # Rename table @db.run("DROP TABLE host_pool") @db.run("ALTER TABLE host_pool_new RENAME TO host_pool") + log_time() ######################################################################## # Image @@ -146,39 +154,42 @@ module Migrator # Create a new empty table where we will store the new calculated values @db.run "CREATE TABLE image_pool_new (oid INTEGER PRIMARY KEY, name VARCHAR(128), body TEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name,uid) );" - # Calculate the host's xml and write them to host_pool_new - @db[:image_pool].each do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db[:image_pool].each do |row| + doc = Document.new(row[:body]) - oid = row[:oid] + oid = row[:oid] - rvms = counters[:image][oid].size + rvms = counters[:image][oid].size - # rewrite running_vms - doc.root.each_element("RUNNING_VMS") {|e| - if e.text != rvms.to_s - warn("Image #{oid} RUNNING_VMS has #{e.text} \tis\t#{rvms}") - e.text = rvms + # rewrite running_vms + doc.root.each_element("RUNNING_VMS") {|e| + if e.text != rvms.to_s + warn("Image #{oid} RUNNING_VMS has #{e.text} \tis\t#{rvms}") + e.text = rvms + end + } + + # re-do list of VM IDs + vms_new_elem = doc.root.add_element("VMS") + + counters[:image][oid].each do |id| + vms_new_elem.add_element("ID").text = id.to_s end - } - # re-do list of VM IDs - vms_new_elem = doc.root.add_element("VMS") + row[:body] = doc.to_s - counters[:image][oid].each do |id| - vms_new_elem.add_element("ID").text = id.to_s + # commit + @db[:image_pool_new].insert(row) end - - row[:body] = doc.to_s - - # commit - @db[:image_pool_new].insert(row) end # Rename table @db.run("DROP TABLE image_pool") @db.run("ALTER TABLE image_pool_new RENAME TO image_pool") + log_time() + return true end end diff --git a/src/onedb/3.8.5_to_3.9.80.rb b/src/onedb/3.8.5_to_3.9.80.rb index aa61860e88..6cb2b5ca8b 100644 --- a/src/onedb/3.8.5_to_3.9.80.rb +++ b/src/onedb/3.8.5_to_3.9.80.rb @@ -18,6 +18,8 @@ require 'set' require "rexml/document" include REXML +require 'nokogiri' + class String def red colorize(31) @@ -41,6 +43,8 @@ module Migrator def up + init_log_time() + ######################################################################## # Add Cloning Image ID collection to Images ######################################################################## @@ -71,6 +75,8 @@ module Migrator end end + log_time() + ######################################################################## # Image # @@ -80,38 +86,42 @@ module Migrator @db.run "CREATE TABLE image_pool_new (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name,uid) );" - @db[:image_pool].each do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db[:image_pool].each do |row| + doc = Document.new(row[:body]) - oid = row[:oid] + oid = row[:oid] - n_cloning_ops = counters[:image][oid][:clones].size + n_cloning_ops = counters[:image][oid][:clones].size - # Rewrite number of clones - doc.root.each_element("CLONING_OPS") { |e| - if e.text != n_cloning_ops.to_s - warn("Image #{oid} CLONING_OPS has #{e.text} \tis\t#{n_cloning_ops}") - e.text = n_cloning_ops + # Rewrite number of clones + doc.root.each_element("CLONING_OPS") { |e| + if e.text != n_cloning_ops.to_s + warn("Image #{oid} CLONING_OPS has #{e.text} \tis\t#{n_cloning_ops}") + e.text = n_cloning_ops + end + } + + # re-do list of Images cloning this one + clones_new_elem = doc.root.add_element("CLONES") + + counters[:image][oid][:clones].each do |id| + clones_new_elem.add_element("ID").text = id.to_s end - } - # re-do list of Images cloning this one - clones_new_elem = doc.root.add_element("CLONES") + row[:body] = doc.to_s - counters[:image][oid][:clones].each do |id| - clones_new_elem.add_element("ID").text = id.to_s + # commit + @db[:image_pool_new].insert(row) end - - row[:body] = doc.to_s - - # commit - @db[:image_pool_new].insert(row) end # Rename table @db.run("DROP TABLE image_pool") @db.run("ALTER TABLE image_pool_new RENAME TO image_pool") + log_time() + ######################################################################## # Feature #1565: New cid column in host, ds and vnet tables ######################################################################## @@ -119,27 +129,31 @@ module Migrator @db.run "ALTER TABLE host_pool RENAME TO old_host_pool;" @db.run "CREATE TABLE host_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, state INTEGER, last_mon_time INTEGER, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, cid INTEGER, UNIQUE(name));" - @db.fetch("SELECT * FROM old_host_pool") do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_host_pool") do |row| + doc = Document.new(row[:body]) - cluster_id = doc.root.get_text('CLUSTER_ID').to_s + cluster_id = doc.root.get_text('CLUSTER_ID').to_s - @db[:host_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => row[:body], - :state => row[:state], - :last_mon_time => row[:last_mon_time], - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u], - :cid => cluster_id) + @db[:host_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => row[:body], + :state => row[:state], + :last_mon_time => row[:last_mon_time], + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u], + :cid => cluster_id) + end end @db.run "DROP TABLE old_host_pool;" + log_time() + ######################################################################## # Feature #1565: New cid column # Feature #471: IPv6 addresses @@ -148,28 +162,32 @@ module Migrator @db.run "ALTER TABLE network_pool RENAME TO old_network_pool;" @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, cid INTEGER, UNIQUE(name,uid));" - @db.fetch("SELECT * FROM old_network_pool") do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_network_pool") do |row| + doc = Document.new(row[:body]) - cluster_id = doc.root.get_text('CLUSTER_ID').to_s + cluster_id = doc.root.get_text('CLUSTER_ID').to_s - doc.root.add_element("GLOBAL_PREFIX") - doc.root.add_element("SITE_PREFIX") + doc.root.add_element("GLOBAL_PREFIX") + doc.root.add_element("SITE_PREFIX") - @db[:network_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u], - :cid => cluster_id) + @db[:network_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u], + :cid => cluster_id) + end end @db.run "DROP TABLE old_network_pool;" + log_time() + ######################################################################## # Feature #1617 # New datastore, 2 "files" @@ -181,40 +199,43 @@ module Migrator @db.run "ALTER TABLE datastore_pool RENAME TO old_datastore_pool;" @db.run "CREATE TABLE datastore_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, cid INTEGER, UNIQUE(name));" - @db.fetch("SELECT * FROM old_datastore_pool") do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_datastore_pool") do |row| + doc = Document.new(row[:body]) - type = "0" # IMAGE_DS + type = "0" # IMAGE_DS - system_elem = doc.root.delete_element("SYSTEM") + system_elem = doc.root.delete_element("SYSTEM") - if ( !system_elem.nil? && system_elem.text == "1" ) - type = "1" # SYSTEM_DS + if ( !system_elem.nil? && system_elem.text == "1" ) + type = "1" # SYSTEM_DS + end + + doc.root.add_element("TYPE").text = type + + doc.root.each_element("TEMPLATE") do |e| + e.delete_element("SYSTEM") + e.add_element("TYPE").text = type == "0" ? "IMAGE_DS" : "SYSTEM_DS" + end + + cluster_id = doc.root.get_text('CLUSTER_ID').to_s + + @db[:datastore_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u], + :cid => cluster_id) end - - doc.root.add_element("TYPE").text = type - - doc.root.each_element("TEMPLATE") do |e| - e.delete_element("SYSTEM") - e.add_element("TYPE").text = type == "0" ? "IMAGE_DS" : "SYSTEM_DS" - end - - cluster_id = doc.root.get_text('CLUSTER_ID').to_s - - @db[:datastore_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u], - :cid => cluster_id) end @db.run "DROP TABLE old_datastore_pool;" + log_time() user_0_name = "oneadmin" @@ -241,6 +262,7 @@ module Migrator @db.run "INSERT INTO datastore_pool VALUES(2,'files','200#{user_0_name}#{group_0_name}files110100100fsssh#{base_path}20-1',0,0,1,1,1,-1);" + log_time() ######################################################################## # Feature #1611: Default quotas @@ -254,73 +276,79 @@ module Migrator @db.run "ALTER TABLE user_pool RENAME TO old_user_pool;" @db.run "CREATE TABLE user_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));" - # oneadmin does not have quotas - @db.fetch("SELECT * FROM old_user_pool WHERE oid=0") do |row| - @db[:user_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => row[:body], - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) - end + @db.transaction do + # oneadmin does not have quotas + @db.fetch("SELECT * FROM old_user_pool WHERE oid=0") do |row| + @db[:user_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => row[:body], + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) + end - @db.fetch("SELECT * FROM old_user_pool WHERE oid>0") do |row| - doc = Document.new(row[:body]) + @db.fetch("SELECT * FROM old_user_pool WHERE oid>0") do |row| + doc = Nokogiri::XML(row[:body]) - set_default_quotas(doc) + set_default_quotas(doc) - @db[:user_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) + @db[:user_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) + end end @db.run "DROP TABLE old_user_pool;" + log_time() @db.run "ALTER TABLE group_pool RENAME TO old_group_pool;" @db.run "CREATE TABLE group_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));" + @db.transaction do + # oneadmin group does not have quotas + @db.fetch("SELECT * FROM old_group_pool WHERE oid=0") do |row| + @db[:group_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => row[:body], + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) + end - # oneadmin group does not have quotas - @db.fetch("SELECT * FROM old_group_pool WHERE oid=0") do |row| - @db[:group_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => row[:body], - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) - end + @db.fetch("SELECT * FROM old_group_pool WHERE oid>0") do |row| + doc = Nokogiri::XML(row[:body]) - @db.fetch("SELECT * FROM old_group_pool WHERE oid>0") do |row| - doc = Document.new(row[:body]) + set_default_quotas(doc) - set_default_quotas(doc) - - @db[:group_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) + @db[:group_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) + end end @db.run "DROP TABLE old_group_pool;" + log_time() + ######################################################################## # Bug #1694: SYSTEM_DS is now set with the method adddatastore ######################################################################## @@ -328,84 +356,87 @@ module Migrator @db.run "ALTER TABLE cluster_pool RENAME TO old_cluster_pool;" @db.run "CREATE TABLE cluster_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));" - @db.fetch("SELECT * FROM old_cluster_pool") do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_cluster_pool") do |row| + doc = Document.new(row[:body]) - system_ds = 0 + system_ds = 0 - doc.root.each_element("TEMPLATE") do |e| - elem = e.delete_element("SYSTEM_DS") + doc.root.each_element("TEMPLATE") do |e| + elem = e.delete_element("SYSTEM_DS") - if !elem.nil? - system_ds = elem.text.to_i - end - end - - if system_ds != 0 - updated_body = nil - - @db.fetch("SELECT body FROM datastore_pool WHERE oid=#{system_ds}") do |ds_row| - ds_doc = Document.new(ds_row[:body]) - - type = "0" # IMAGE_DS - - ds_doc.root.each_element("TYPE") do |e| - type = e.text + if !elem.nil? + system_ds = elem.text.to_i end + end - if type != "1" - puts " > Cluster #{row[:oid]} has the "<< - "System Datastore set to Datastore #{system_ds}, "<< - "but its type is not SYSTEM_DS. The System Datastore "<< - "for this Cluster will be set to 0" + if system_ds != 0 + updated_body = nil - system_ds = 0 - else - cluster_id = "-1" + @db.fetch("SELECT body FROM datastore_pool WHERE oid=#{system_ds}") do |ds_row| + ds_doc = Document.new(ds_row[:body]) - ds_doc.root.each_element("CLUSTER_ID") do |e| - cluster_id = e.text + type = "0" # IMAGE_DS + + ds_doc.root.each_element("TYPE") do |e| + type = e.text end - if row[:oid] != cluster_id.to_i + if type != "1" puts " > Cluster #{row[:oid]} has the "<< "System Datastore set to Datastore #{system_ds}, "<< - "but it is not part of the Cluster. It will be added now." + "but its type is not SYSTEM_DS. The System Datastore "<< + "for this Cluster will be set to 0" + + system_ds = 0 + else + cluster_id = "-1" ds_doc.root.each_element("CLUSTER_ID") do |e| - e.text = row[:oid] + cluster_id = e.text end - ds_doc.root.each_element("CLUSTER") do |e| - e.text = row[:name] - end + if row[:oid] != cluster_id.to_i + puts " > Cluster #{row[:oid]} has the "<< + "System Datastore set to Datastore #{system_ds}, "<< + "but it is not part of the Cluster. It will be added now." - updated_body = ds_doc.root.to_s + ds_doc.root.each_element("CLUSTER_ID") do |e| + e.text = row[:oid] + end + + ds_doc.root.each_element("CLUSTER") do |e| + e.text = row[:name] + end + + updated_body = ds_doc.root.to_s + end end end + + if !updated_body.nil? + @db[:datastore_pool].where(:oid => system_ds).update( + :body => updated_body) + end end - if !updated_body.nil? - @db[:datastore_pool].where(:oid => system_ds).update( - :body => updated_body) - end + doc.root.add_element("SYSTEM_DS").text = system_ds.to_s + + @db[:cluster_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) end - - doc.root.add_element("SYSTEM_DS").text = system_ds.to_s - - @db[:cluster_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) end @db.run "DROP TABLE old_cluster_pool;" + log_time() ######################################################################## # Feature #1556: New elem USER_TEMPLATE @@ -418,41 +449,53 @@ module Migrator @db.run "ALTER TABLE vm_pool RENAME TO old_vm_pool;" @db.run "CREATE TABLE 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.fetch("SELECT * FROM old_vm_pool") do |row| + @db.transaction do + @db.fetch("SELECT * FROM old_vm_pool") do |row| - doc = Document.new(row[:body]) - user_template = doc.root.add_element("USER_TEMPLATE") + doc = Nokogiri::XML(row[:body]) + user_template = doc.create_element("USER_TEMPLATE") - doc.root.each_element("TEMPLATE") do |e| - elem = e.delete_element("REQUIREMENTS") + e = doc.root.at_xpath("TEMPLATE") + elem = e.at_xpath("REQUIREMENTS") if !elem.nil? - user_template.add_element("SCHED_REQUIREMENTS").text = elem.text + new_elem = doc.create_element("SCHED_REQUIREMENTS") + new_elem.content = elem.text + elem.remove + + user_template.add_child(new_elem) end - elem = e.delete_element("RANK") + elem = e.at_xpath("RANK") if !elem.nil? - user_template.add_element("SCHED_RANK").text = elem.text + new_elem = doc.create_element("SCHED_RANK") + new_elem.content = elem.text + elem.remove + + user_template.add_child(new_elem) end + + doc.root << user_template + + @db[:vm_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :last_poll => row[:last_poll], + :state => row[:state], + :lcm_state => row[:lcm_state], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) end - - @db[:vm_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :last_poll => row[:last_poll], - :state => row[:state], - :lcm_state => row[:lcm_state], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) end @db.run "DROP TABLE old_vm_pool;" + log_time() ######################################################################## # Feature #1483: Move scheduling attributes @@ -463,43 +506,49 @@ module Migrator @db.run "ALTER TABLE template_pool RENAME TO old_template_pool;" @db.run "CREATE TABLE template_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER);" - @db.fetch("SELECT * FROM old_template_pool") do |row| + @db.transaction do + @db.fetch("SELECT * FROM old_template_pool") do |row| - doc = Document.new(row[:body]) + doc = Nokogiri::XML(row[:body]) - template = nil + template = doc.root.at_xpath("TEMPLATE") - doc.root.each_element("TEMPLATE") do |e| - template = e - end - - doc.root.each_element("TEMPLATE") do |e| - elem = e.delete_element("REQUIREMENTS") + elem = template.at_xpath("REQUIREMENTS") if !elem.nil? - template.add_element("SCHED_REQUIREMENTS").text = elem.text + new_elem = doc.create_element("SCHED_REQUIREMENTS") + new_elem.content = elem.text + elem.remove + + template.add_child(new_elem) end - elem = e.delete_element("RANK") + elem = template.at_xpath("RANK") if !elem.nil? - template.add_element("SCHED_RANK").text = elem.text - end - end + new_elem = doc.create_element("SCHED_RANK") + new_elem.content = elem.text + elem.remove - @db[:template_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) + template.add_child(new_elem) + end + + @db[:template_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) + end end @db.run "DROP TABLE old_template_pool;" + log_time() + ######################################################################## # Feature #1691 Add new attribute NIC/NIC_ID ######################################################################## @@ -507,38 +556,43 @@ module Migrator @db.run "ALTER TABLE vm_pool RENAME TO old_vm_pool;" @db.run "CREATE TABLE 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.fetch("SELECT * FROM old_vm_pool") do |row| - if ( row[:state] != 6 ) # DONE - doc = Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_vm_pool") do |row| + if ( row[:state] != 6 ) # DONE + doc = Nokogiri::XML(row[:body]) - nic_id = 0 + nic_id = 0 - doc.root.each_element("TEMPLATE/NIC") { |e| - e.delete_element("NIC_ID") - e.add_element("NIC_ID").text = (nic_id).to_s + doc.root.xpath("TEMPLATE/NIC").each { |e| + e.xpath("NIC_ID").each {|n| n.remove} + e.add_child(doc.create_element("NIC_ID")).content = + (nic_id).to_s - nic_id += 1 - } + nic_id += 1 + } - row[:body] = doc.root.to_s + row[:body] = doc.root.to_s + end + + @db[:vm_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => row[:body], + :uid => row[:uid], + :gid => row[:gid], + :last_poll => row[:last_poll], + :state => row[:state], + :lcm_state => row[:lcm_state], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) end - - @db[:vm_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => row[:body], - :uid => row[:uid], - :gid => row[:gid], - :last_poll => row[:last_poll], - :state => row[:state], - :lcm_state => row[:lcm_state], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) end @db.run "DROP TABLE old_vm_pool;" + log_time() + ######################################################################## # # Banner for the new /var/lib/one/vms directory @@ -563,38 +617,38 @@ module Migrator # VM quotas - doc.root.each_element("VM_QUOTA/VM/CPU") do |e| - e.text = "-1" if e.text.to_f == 0 + doc.root.xpath("VM_QUOTA/VM/CPU").each do |e| + e.content = "-1" if e.text.to_f == 0 end - doc.root.each_element("VM_QUOTA/VM/MEMORY") do |e| - e.text = "-1" if e.text.to_i == 0 + doc.root.xpath("VM_QUOTA/VM/MEMORY").each do |e| + e.content = "-1" if e.text.to_i == 0 end - doc.root.each_element("VM_QUOTA/VM/VMS") do |e| - e.text = "-1" if e.text.to_i == 0 + doc.root.xpath("VM_QUOTA/VM/VMS").each do |e| + e.content = "-1" if e.text.to_i == 0 end # VNet quotas - doc.root.each_element("NETWORK_QUOTA/NETWORK/LEASES") do |e| - e.text = "-1" if e.text.to_i == 0 + doc.root.xpath("NETWORK_QUOTA/NETWORK/LEASES").each do |e| + e.content = "-1" if e.text.to_i == 0 end # Image quotas - doc.root.each_element("IMAGE_QUOTA/IMAGE/RVMS") do |e| - e.text = "-1" if e.text.to_i == 0 + doc.root.xpath("IMAGE_QUOTA/IMAGE/RVMS").each do |e| + e.content = "-1" if e.text.to_i == 0 end # Datastore quotas - doc.root.each_element("DATASTORE_QUOTA/DATASTORE/IMAGES") do |e| - e.text = "-1" if e.text.to_i == 0 + doc.root.xpath("DATASTORE_QUOTA/DATASTORE/IMAGES").each do |e| + e.content = "-1" if e.text.to_i == 0 end - doc.root.each_element("DATASTORE_QUOTA/DATASTORE/SIZE") do |e| - e.text = "-1" if e.text.to_i == 0 + doc.root.xpath("DATASTORE_QUOTA/DATASTORE/SIZE").each do |e| + e.content = "-1" if e.text.to_i == 0 end end end diff --git a/src/onedb/3.9.80_to_3.9.90.rb b/src/onedb/3.9.80_to_3.9.90.rb index 2c11a48328..e51f471b7a 100644 --- a/src/onedb/3.9.80_to_3.9.90.rb +++ b/src/onedb/3.9.80_to_3.9.90.rb @@ -14,8 +14,7 @@ # limitations under the License. # #--------------------------------------------------------------------------- # -require "rexml/document" -include REXML +require "nokogiri" class String def red @@ -39,6 +38,7 @@ module Migrator end def up + init_log_time() ######################################################################## # Feature #1631: Add ACTION to history entries @@ -47,49 +47,57 @@ module Migrator @db.run "ALTER TABLE vm_pool RENAME TO old_vm_pool;" @db.run "CREATE TABLE 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.fetch("SELECT * FROM old_vm_pool") do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_vm_pool") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.each_element("HISTORY_RECORDS/HISTORY") do |e| - update_history(e) + doc.root.xpath("HISTORY_RECORDS/HISTORY").each do |e| + update_history(e) + end + + @db[:vm_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :last_poll => row[:last_poll], + :state => row[:state], + :lcm_state => row[:lcm_state], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) end - - @db[:vm_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :last_poll => row[:last_poll], - :state => row[:state], - :lcm_state => row[:lcm_state], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) end @db.run "DROP TABLE old_vm_pool;" + log_time() + @db.run "ALTER TABLE history RENAME TO old_history;" @db.run "CREATE TABLE history (vid INTEGER, seq INTEGER, body MEDIUMTEXT, stime INTEGER, etime INTEGER,PRIMARY KEY(vid,seq));" - @db.fetch("SELECT * FROM old_history") do |row| - doc = Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_history") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.each_element("/HISTORY") do |e| - update_history(e) + doc.root.xpath("/HISTORY").each do |e| + update_history(e) + end + + @db[:history].insert( + :vid => row[:vid], + :seq => row[:seq], + :body => doc.root.to_s, + :stime => row[:stime], + :etime => row[:etime]) end - - @db[:history].insert( - :vid => row[:vid], - :seq => row[:seq], - :body => doc.root.to_s, - :stime => row[:stime], - :etime => row[:etime]) end @db.run "DROP TABLE old_history;" + log_time() + ######################################################################## # Banner for drivers renamed ######################################################################## @@ -135,16 +143,18 @@ module Migrator end def update_history(history_elem) - history_elem.add_element("ACTION").text = "0" # NONE_ACTION + # NONE_ACTION + history_elem.add_child( + history_elem.document.create_element("ACTION")).content = "0" # History reason enum has changed from # NONE, ERROR, STOP_RESUME, USER, CANCEL to # NONE, ERROR, USER - history_elem.each_element("REASON") do |reason_e| + history_elem.xpath("REASON").each do |reason_e| reason = reason_e.text.to_i - if reason > 1 # STOP_RESUME, USER, CANCEL - reason_e.text = "2" # USER + if reason > 1 # STOP_RESUME, USER, CANCEL + reason_e.content = "2" # USER end end end diff --git a/src/onedb/4.0.1_to_4.1.80.rb b/src/onedb/4.0.1_to_4.1.80.rb index f44fe554cf..965d93ef92 100644 --- a/src/onedb/4.0.1_to_4.1.80.rb +++ b/src/onedb/4.0.1_to_4.1.80.rb @@ -15,9 +15,9 @@ #--------------------------------------------------------------------------- # require 'fileutils' -require 'rexml/document' require 'openssl' +require "nokogiri" module Migrator def db_version @@ -42,30 +42,35 @@ module Migrator puts "Please copy the files manually." end + init_log_time() + @db.run "ALTER TABLE user_pool RENAME TO old_user_pool;" @db.run "CREATE TABLE user_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));" - @db.fetch("SELECT * FROM old_user_pool") do |row| - doc = REXML::Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_user_pool") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.each_element("TEMPLATE") do |e| - e.add_element("TOKEN_PASSWORD").text = - OpenSSL::Digest::SHA1.hexdigest( rand().to_s ) + doc.root.at_xpath("TEMPLATE") + .add_child(doc.create_element("TOKEN_PASSWORD")) + .content = OpenSSL::Digest::SHA1.hexdigest( rand().to_s ) + + @db[:user_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) end - - @db[:user_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) end @db.run "DROP TABLE old_user_pool;" + log_time() + ######################################################################## # Feature #1613 ######################################################################## @@ -73,27 +78,31 @@ module Migrator @db.run "ALTER TABLE datastore_pool RENAME TO old_datastore_pool;" @db.run "CREATE TABLE datastore_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, cid INTEGER, UNIQUE(name));" - @db.fetch("SELECT * FROM old_datastore_pool") do |row| - doc = REXML::Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_datastore_pool") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.add_element("TOTAL_MB").text = "0" - doc.root.add_element("FREE_MB").text = "0" - doc.root.add_element("USED_MB").text = "0" + doc.root.add_child(doc.create_element("TOTAL_MB")).content = "0" + doc.root.add_child(doc.create_element("FREE_MB")).content = "0" + doc.root.add_child(doc.create_element("USED_MB")).content = "0" - @db[:datastore_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u], - :cid => row[:cid]) + @db[:datastore_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u], + :cid => row[:cid]) + end end @db.run "DROP TABLE old_datastore_pool;" + log_time() + return true end end diff --git a/src/onedb/4.2.0_to_4.3.80.rb b/src/onedb/4.2.0_to_4.3.80.rb index 96ffc65e27..be408b512c 100644 --- a/src/onedb/4.2.0_to_4.3.80.rb +++ b/src/onedb/4.2.0_to_4.3.80.rb @@ -15,6 +15,7 @@ #--------------------------------------------------------------------------- # require 'rexml/document' +require 'nokogiri' TM_MAD_CONF = { "dummy" => { @@ -78,6 +79,8 @@ module Migrator def up + init_log_time() + ######################################################################## # Feature #1742 & #1612 ######################################################################## @@ -85,29 +88,36 @@ module Migrator @db.run "ALTER TABLE user_pool RENAME TO old_user_pool;" @db.run "CREATE TABLE user_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));" - @db.fetch("SELECT * FROM old_user_pool") do |row| - doc = REXML::Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_user_pool") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.add_element("GROUPS").add_element("ID").text = row[:gid].to_s + g_elem = doc.create_element("GROUPS") + g_elem.add_child(doc.create_element("ID")).content = row[:gid].to_s - # oneadmin does not have quotas - if row[:oid] != 0 - redo_vm_quotas(doc, "uid=#{row[:oid]}") + doc.root.add_child(g_elem) + + # oneadmin does not have quotas + if row[:oid] != 0 + redo_vm_quotas(doc, "uid=#{row[:oid]}") + end + + @db[:user_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) end - - @db[:user_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) end @db.run "DROP TABLE old_user_pool;" + log_time() + ######################################################################## # Feature #1612 ######################################################################## @@ -115,37 +125,41 @@ module Migrator @db.run "ALTER TABLE group_pool RENAME TO old_group_pool;" @db.run "CREATE TABLE group_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));" - # oneadmin group does not have quotas - @db.fetch("SELECT * FROM old_group_pool WHERE oid=0") do |row| - @db[:group_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => row[:body], - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) - end + @db.transaction do + # oneadmin group does not have quotas + @db.fetch("SELECT * FROM old_group_pool WHERE oid=0") do |row| + @db[:group_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => row[:body], + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) + end - @db.fetch("SELECT * FROM old_group_pool WHERE oid>0") do |row| - doc = REXML::Document.new(row[:body]) + @db.fetch("SELECT * FROM old_group_pool WHERE oid>0") do |row| + doc = Nokogiri::XML(row[:body]) - redo_vm_quotas(doc, "gid=#{row[:oid]}") + redo_vm_quotas(doc, "gid=#{row[:oid]}") - @db[:group_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:oid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) + @db[:group_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:oid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) + end end @db.run "DROP TABLE old_group_pool;" + log_time() + ######################################################################## # Bug #2330 & Feature #1678 ######################################################################## @@ -154,61 +168,64 @@ module Migrator @db.run "CREATE TABLE datastore_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, cid INTEGER, UNIQUE(name));" #tm_mads = {} + @db.transaction do + @db.fetch("SELECT * FROM old_datastore_pool") do |row| + doc = REXML::Document.new(row[:body]) - @db.fetch("SELECT * FROM old_datastore_pool") do |row| - doc = REXML::Document.new(row[:body]) - - doc.root.each_element("TEMPLATE/HOST") do |e| - e.name = "BRIDGE_LIST" - end - - tm_mad = "" - doc.root.each_element("TM_MAD"){ |e| tm_mad = e.text } - - type = 0 - doc.root.each_element("TYPE"){ |e| type = e.text.to_i } - - if (type == 1) # System DS - doc.root.each_element("TEMPLATE") do |e| - e.add_element("SHARED").text = - (tm_mad == "ssh" ? "NO" : "YES") + doc.root.each_element("TEMPLATE/HOST") do |e| + e.name = "BRIDGE_LIST" end - else - #tm_mads[row[:oid].to_i] = tm_mad - conf = TM_MAD_CONF[tm_mad] + tm_mad = "" + doc.root.each_element("TM_MAD"){ |e| tm_mad = e.text } - if conf.nil? - puts - puts "ATTENTION: manual intervention required".red - puts <<-END + type = 0 + doc.root.each_element("TYPE"){ |e| type = e.text.to_i } + + if (type == 1) # System DS + doc.root.each_element("TEMPLATE") do |e| + e.add_element("SHARED").text = + (tm_mad == "ssh" ? "NO" : "YES") + end + else + #tm_mads[row[:oid].to_i] = tm_mad + + conf = TM_MAD_CONF[tm_mad] + + if conf.nil? + puts + puts "ATTENTION: manual intervention required".red + puts <<-END The Datastore ##{row[:oid]} #{row[:name]} is using the custom TM MAD '#{tm_mad}'. You will need to define new configuration parameters in oned.conf for this driver, see http://opennebula.org/documentation:rel4.4:upgrade - END - else - doc.root.each_element("TEMPLATE") do |e| - e.add_element("LN_TARGET").text = conf[:ln_target] - e.add_element("CLONE_TARGET").text = conf[:clone_target] + END + else + doc.root.each_element("TEMPLATE") do |e| + e.add_element("LN_TARGET").text = conf[:ln_target] + e.add_element("CLONE_TARGET").text = conf[:clone_target] + end end end - end - @db[:datastore_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u], - :cid => row[:cid]) + @db[:datastore_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u], + :cid => row[:cid]) + end end @db.run "DROP TABLE old_datastore_pool;" + log_time() + ######################################################################## # Feature #2392 ######################################################################## @@ -216,49 +233,57 @@ http://opennebula.org/documentation:rel4.4:upgrade @db.run "ALTER TABLE vm_pool RENAME TO old_vm_pool;" @db.run "CREATE TABLE 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.fetch("SELECT * FROM old_vm_pool") do |row| - doc = REXML::Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_vm_pool") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.each_element("HISTORY_RECORDS/HISTORY") do |e| - update_history(e) + doc.root.xpath("HISTORY_RECORDS/HISTORY").each do |e| + update_history(e) + end + + @db[:vm_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :uid => row[:uid], + :gid => row[:gid], + :last_poll => row[:last_poll], + :state => row[:state], + :lcm_state => row[:lcm_state], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u]) end - - @db[:vm_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :uid => row[:uid], - :gid => row[:gid], - :last_poll => row[:last_poll], - :state => row[:state], - :lcm_state => row[:lcm_state], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u]) end @db.run "DROP TABLE old_vm_pool;" + log_time() + @db.run "ALTER TABLE history RENAME TO old_history;" @db.run "CREATE TABLE history (vid INTEGER, seq INTEGER, body MEDIUMTEXT, stime INTEGER, etime INTEGER,PRIMARY KEY(vid,seq));" - @db.fetch("SELECT * FROM old_history") do |row| - doc = REXML::Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_history") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.each_element("/HISTORY") do |e| - update_history(e) + doc.root.xpath("/HISTORY").each do |e| + update_history(e) + end + + @db[:history].insert( + :vid => row[:vid], + :seq => row[:seq], + :body => doc.root.to_s, + :stime => row[:stime], + :etime => row[:etime]) end - - @db[:history].insert( - :vid => row[:vid], - :seq => row[:seq], - :body => doc.root.to_s, - :stime => row[:stime], - :etime => row[:etime]) end @db.run "DROP TABLE old_history;" + log_time() + ######################################################################## # Feature #1678 ######################################################################## @@ -266,29 +291,32 @@ http://opennebula.org/documentation:rel4.4:upgrade @db.run "ALTER TABLE host_pool RENAME TO old_host_pool;" @db.run "CREATE TABLE host_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body MEDIUMTEXT, state INTEGER, last_mon_time INTEGER, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, cid INTEGER, UNIQUE(name));" - @db.fetch("SELECT * FROM old_host_pool") do |row| - doc = REXML::Document.new(row[:body]) + @db.transaction do + @db.fetch("SELECT * FROM old_host_pool") do |row| + doc = Nokogiri::XML(row[:body]) - doc.root.each_element("HOST_SHARE") do |e| - e.add_element("DATASTORES") + doc.root.at_xpath("HOST_SHARE") + .add_child(doc.create_element("DATASTORES")) + + @db[:host_pool].insert( + :oid => row[:oid], + :name => row[:name], + :body => doc.root.to_s, + :state => row[:state], + :last_mon_time => row[:last_mon_time], + :uid => row[:uid], + :gid => row[:gid], + :owner_u => row[:owner_u], + :group_u => row[:group_u], + :other_u => row[:other_u], + :cid => row[:cid]) end - - @db[:host_pool].insert( - :oid => row[:oid], - :name => row[:name], - :body => doc.root.to_s, - :state => row[:state], - :last_mon_time => row[:last_mon_time], - :uid => row[:uid], - :gid => row[:gid], - :owner_u => row[:owner_u], - :group_u => row[:group_u], - :other_u => row[:other_u], - :cid => row[:cid]) end @db.run "DROP TABLE old_host_pool;" + log_time() + # TODO: # For Feature #1678, VMs have new disk elements: # VM/DISK/CLONE_TARGET @@ -309,20 +337,23 @@ http://opennebula.org/documentation:rel4.4:upgrade vms_limit = "-1" vol_limit = "-1" - doc.root.each_element("VM_QUOTA/VM/CPU") { |e| + doc.root.xpath("VM_QUOTA/VM/CPU").each { |e| cpu_limit = e.text } - doc.root.each_element("VM_QUOTA/VM/MEMORY") { |e| + doc.root.xpath("VM_QUOTA/VM/MEMORY").each { |e| mem_limit = e.text } - doc.root.each_element("VM_QUOTA/VM/VMS") { |e| + doc.root.xpath("VM_QUOTA/VM/VMS").each { |e| vms_limit = e.text } - doc.root.delete_element("VM_QUOTA") - vm_quota = doc.root.add_element("VM_QUOTA") + doc.root.xpath("VM_QUOTA").each { |e| + e.remove + } + + vm_quota = doc.root.add_child(doc.create_element("VM_QUOTA")) # VM quotas cpu_used = 0 @@ -331,26 +362,26 @@ http://opennebula.org/documentation:rel4.4:upgrade vol_used = 0 @db.fetch("SELECT body FROM vm_pool WHERE #{where_filter} AND state<>6") do |vm_row| - vmdoc = REXML::Document.new(vm_row[:body]) + vmdoc = Nokogiri::XML(vm_row[:body]) # VM quotas - vmdoc.root.each_element("TEMPLATE/CPU") { |e| + vmdoc.root.xpath("TEMPLATE/CPU").each { |e| cpu_used += e.text.to_f } - vmdoc.root.each_element("TEMPLATE/MEMORY") { |e| + vmdoc.root.xpath("TEMPLATE/MEMORY").each { |e| mem_used += e.text.to_i } - vmdoc.root.each_element("TEMPLATE/DISK") { |e| + vmdoc.root.xpath("TEMPLATE/DISK").each { |e| type = "" - e.each_element("TYPE") { |t_elem| + e.xpath("TYPE").each { |t_elem| type = t_elem.text.upcase } if ( type == "SWAP" || type == "FS") - e.each_element("SIZE") { |size_elem| + e.xpath("SIZE").each { |size_elem| vol_used += size_elem.text.to_i } end @@ -363,38 +394,40 @@ http://opennebula.org/documentation:rel4.4:upgrade cpu_limit != "-1" || mem_limit != "-1" || vms_limit != "-1" || vol_limit != "-1" ) # VM quotas - vm_elem = vm_quota.add_element("VM") + vm_elem = vm_quota.add_child(doc.create_element("VM")) - vm_elem.add_element("CPU").text = cpu_limit - vm_elem.add_element("CPU_USED").text = sprintf('%.2f', cpu_used) + vm_elem.add_child(doc.create_element("CPU")).content = cpu_limit + vm_elem.add_child(doc.create_element("CPU_USED")).content = sprintf('%.2f', cpu_used) - vm_elem.add_element("MEMORY").text = mem_limit - vm_elem.add_element("MEMORY_USED").text = mem_used.to_s + vm_elem.add_child(doc.create_element("MEMORY")).content = mem_limit + vm_elem.add_child(doc.create_element("MEMORY_USED")).content = mem_used.to_s - vm_elem.add_element("VMS").text = vms_limit - vm_elem.add_element("VMS_USED").text = vms_used.to_s + vm_elem.add_child(doc.create_element("VMS")).content = vms_limit + vm_elem.add_child(doc.create_element("VMS_USED")).content = vms_used.to_s - vm_elem.add_element("VOLATILE_SIZE").text = vol_limit - vm_elem.add_element("VOLATILE_SIZE_USED").text = vol_used.to_s + vm_elem.add_child(doc.create_element("VOLATILE_SIZE")).content = vol_limit + vm_elem.add_child(doc.create_element("VOLATILE_SIZE_USED")).content = vol_used.to_s end end def update_history(history_elem) hid = nil - history_elem.each_element("HID") do |e| + history_elem.xpath("HID").each do |e| hid = e.text end - new_elem = history_elem.add_element("CID") - new_elem.text = "-1" # Cluster None + new_elem = history_elem.add_child( + history_elem.document.create_element("CID")) + + new_elem.content = "-1" # Cluster None if hid.nil? return end @db.fetch("SELECT cid FROM host_pool WHERE oid = #{hid}") do |row| - new_elem.text = row[:cid].to_s + new_elem.content = row[:cid].to_s end end diff --git a/src/onedb/onedb.rb b/src/onedb/onedb.rb index faf6dd3f4b..1b59e7ecf9 100644 --- a/src/onedb/onedb.rb +++ b/src/onedb/onedb.rb @@ -16,6 +16,8 @@ require 'onedb_backend' +LOG_TIME = false + class OneDB def initialize(ops) if ops[:backend] == :sqlite @@ -133,6 +135,8 @@ class OneDB result = nil i = 0 + timea = Time.now + while ( matches.size > 0 ) if ( matches.size > 1 ) raise "There are more than one file that match \ @@ -143,10 +147,18 @@ class OneDB puts " > Running migrator #{file}" if ops[:verbose] + time0 = Time.now + load(file) @backend.extend Migrator result = @backend.up + time1 = Time.now + + if LOG_TIME + puts " > Time for #{file}: #{time1 - time0}s" + end + if !result raise "Error while upgrading from #{version} to " << " #{@backend.db_version}" @@ -166,6 +178,12 @@ class OneDB puts "Database already uses version #{version}" end + timeb = Time.now + + if LOG_TIME + puts " > Total time: #{timeb - timea}s" if ops[:verbose] + end + return 0 rescue Exception => e diff --git a/src/onedb/onedb_backend.rb b/src/onedb/onedb_backend.rb index 3832bc20ab..ba9fdf5629 100644 --- a/src/onedb/onedb_backend.rb +++ b/src/onedb/onedb_backend.rb @@ -129,6 +129,20 @@ class OneDBBacKEnd return found end + + def init_log_time() + @block_n = 0 + @time0 = Time.now + end + + def log_time() + if LOG_TIME + @time1 = Time.now + puts " > #{db_version} Time for block #{@block_n}: #{@time1 - @time0}s" + @time0 = Time.now + @block_n += 1 + end + end end class BackEndMySQL < OneDBBacKEnd