1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-01-26 10:03:37 +03:00

Add onedb migrator to 3.8.1

This commit is contained in:
Carlos Martín 2012-10-25 17:38:50 +02:00
parent 762aba6f1b
commit e1991a89fa
2 changed files with 185 additions and 0 deletions

View File

@ -1001,6 +1001,7 @@ ONEDB_MIGRATOR_FILES="src/onedb/2.0_to_2.9.80.rb \
src/onedb/3.5.80_to_3.6.0.rb \
src/onedb/3.6.0_to_3.7.80.rb \
src/onedb/3.7.80_to_3.8.0.rb \
src/onedb/3.8.0_to_3.8.1.rb \
src/onedb/fsck.rb \
src/onedb/onedb.rb \
src/onedb/onedb_backend.rb"

184
src/onedb/3.8.0_to_3.8.1.rb Normal file
View File

@ -0,0 +1,184 @@
# -------------------------------------------------------------------------- #
# Copyright 2002-2012, OpenNebula Project Leads (OpenNebula.org) #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
require 'set'
require "rexml/document"
include REXML
module Migrator
def db_version
"3.8.1"
end
def one_version
"OpenNebula 3.8.1"
end
def up
########################################################################
# Bug : Add VM IDs Collection to Hosts & Images
########################################################################
counters = {}
counters[:host] = {}
counters[:image] = {}
# Initialize all the host counters
@db.fetch("SELECT oid FROM host_pool") do |row|
counters[:host][row[:oid]] = {
:rvms => Set.new
}
end
# Init image counters
@db.fetch("SELECT oid FROM image_pool") do |row|
counters[:image][row[:oid]] = Set.new
end
# 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
# Images used by this VM
vm_doc.root.each_element("TEMPLATE/DISK/IMAGE_ID") do |e|
img_id = e.text.to_i
if counters[:image][img_id].nil?
warn("VM #{row[:oid]} is using Image #{img_id}, but it does not exist")
else
counters[:image][img_id].add(row[:oid])
end
end
# Host resources
# Only states that add to Host resources consumption are
# ACTIVE, SUSPENDED, POWEROFF
next if !([3,5,8].include? state)
# Get hostid
hid = -1
vm_doc.root.each_element("HISTORY_RECORDS/HISTORY[last()]/HID") { |e|
hid = e.text.to_i
}
if counters[:host][hid].nil?
warn("VM #{row[:oid]} is using Host #{hid}, but it does not exist")
else
counters[:host][hid][:rvms].add(row[:oid])
end
end
########################################################################
# Hosts
#
# HOST/HOST_SHARE/RUNNING_VMS
# HOST/VMS/ID
########################################################################
@db.run "CREATE TABLE host_pool_new (oid INTEGER PRIMARY KEY, " <<
"name VARCHAR(128), body TEXT, state INTEGER, " <<
"last_mon_time INTEGER, uid INTEGER, gid INTEGER, " <<
"owner_u INTEGER, group_u INTEGER, other_u INTEGER, " <<
"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])
hid = row[:oid]
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
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
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")
########################################################################
# Image
#
# IMAGE/RUNNING_VMS
# IMAGE/VMS/ID
########################################################################
# 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])
oid = row[:oid]
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
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
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")
return true
end
end