1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

Feature #2586: Optimize onedb upgrade

(cherry picked from commit 57099e26426ae63756f7c8cae91de7fe29ad1608)
This commit is contained in:
Carlos Martín 2014-02-17 15:28:02 +01:00
parent af0f1dda7d
commit 358a59d3a8
7 changed files with 666 additions and 517 deletions

View File

@ -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

View File

@ -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','<DATASTORE><ID>2</ID><UID>0</UID><GID>0</GID><UNAME>#{user_0_name}</UNAME><GNAME>#{group_0_name}</GNAME><NAME>files</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>1</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>1</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><DS_MAD>fs</DS_MAD><TM_MAD>ssh</TM_MAD><BASE_PATH>#{base_path}</BASE_PATH><TYPE>2</TYPE><DISK_TYPE>0</DISK_TYPE><CLUSTER_ID>-1</CLUSTER_ID><CLUSTER></CLUSTER><IMAGES></IMAGES><TEMPLATE><DS_MAD><![CDATA[fs]]></DS_MAD><TM_MAD><![CDATA[ssh]]></TM_MAD><TYPE><![CDATA[FILE_DS]]></TYPE></TEMPLATE></DATASTORE>',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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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