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:
parent
762aba6f1b
commit
e1991a89fa
@ -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
184
src/onedb/3.8.0_to_3.8.1.rb
Normal 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
|
Loading…
x
Reference in New Issue
Block a user