1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

Feature #862: New onedb migrator 3.1.80 to 3.1.85

This commit is contained in:
Carlos Martín 2012-01-10 13:44:56 +01:00
parent 81aa432411
commit ee91fbcee7
2 changed files with 287 additions and 0 deletions

View File

@ -816,6 +816,7 @@ ONEDB_MIGRATOR_FILES="src/onedb/2.0_to_2.9.80.rb \
src/onedb/2.9.90_to_3.0.0.rb \
src/onedb/3.0.0_to_3.1.0.rb \
src/onedb/3.1.0_to_3.1.80.rb \
src/onedb/3.1.80_to_3.1.85.rb \
src/onedb/onedb.rb \
src/onedb/onedb_backend.rb"

View File

@ -0,0 +1,286 @@
# -------------------------------------------------------------------------- *
# Copyright 2002-2011, 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 "rexml/document"
include REXML
module Migrator
def db_version
"3.1.85"
end
def one_version
"OpenNebula 3.1.85"
end
HOST_RIGHTS =
{
0x1 => 0x8, # "CREATE" => "CREATE"
0x2 => 0x4, # "DELETE" => "ADMIN"
0x4 => 0x2, # "USE" => "MANAGE"
0x8 => 0x4, # "MANAGE" => "ADMIN"
0x10 => 0x1 # "INFO" => "USE"
# 0x20 "INFO_POOL"
# 0x40 "INFO_POOL_MINE"
# 0x80 "INSTANTIATE"
# 0x100 "CHOWN"
# 0x200 "DEPLOY"
# 0x400 "CHAUTH"
}
RIGHTS =
{
0x1 => 0x8, # "CREATE" => "CREATE"
0x2 => 0x2, # "DELETE" => "MANAGE"
0x4 => 0x1, # "USE" => "USE"
0x8 => 0x2, # "MANAGE" => "MANAGE"
0x10 => 0x1, # "INFO" => "USE"
# 0x20 "INFO_POOL"
# 0x40 "INFO_POOL_MINE"
0x80 => 0x1, # "INSTANTIATE" => "USE"
0x100 => 0x2, # "CHOWN" => "MANAGE"
0x200 => 0x4, # "DEPLOY" => "ADMIN"
0x400 => 0x4 # "CHAUTH" => "ADMIN"
}
def up
########################################################################
# Update ACL Rules
########################################################################
@db.run "ALTER TABLE acl RENAME TO old_acl;"
@db.run "CREATE TABLE acl (oid INT PRIMARY KEY, user BIGINT, resource BIGINT, rights BIGINT);"
@db.fetch("SELECT * FROM old_acl") do |row|
rights = row[:rights].to_i
new_rights = 0
rights_hash = nil
if ( row[:resource] & 0x2000000000 != 0 ) # Resource contains HOST
rights_hash = HOST_RIGHTS
else
rights_hash = RIGHTS
end
rights_hash.each { |k,v|
if ( rights & k != 0 )
new_rights = new_rights | v
end
}
if ( new_rights != 0 )
@db[:acl].insert(
:oid => row[:oid],
:user => row[:user],
:resource => row[:resource],
:rights => new_rights.to_s)
else
puts " > ACL Rule ##{row[:oid]} will be deleted because it\n" <<
" only contained deprecated rights INFO_POOL or INFO_POOL_MINE"
end
end
@db.run "DROP TABLE old_acl;"
########################################################################
# Add new permission attributes to resources
########################################################################
@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 TEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));"
@db.fetch("SELECT * FROM old_group_pool") do |row|
@db[:group_pool].insert(
:oid => row[:oid],
:name => row[:name],
:body => row[:body],
:uid => "0",
:gid => row[:oid],
:owner_u => "1",
:group_u => "1",
:other_u => "0")
end
@db.run "DROP TABLE old_group_pool;"
@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 TEXT, state INTEGER, last_mon_time INTEGER, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));"
@db.fetch("SELECT * FROM old_host_pool") do |row|
@db[:host_pool].insert(
:oid => row[:oid],
:name => row[:name],
:body => row[:body],
:state => row[:state],
:last_mon_time => row[:last_mon_time],
:uid => "0",
:gid => row[:oid],
:owner_u => "1",
:group_u => "0",
:other_u => "0")
end
@db.run "DROP TABLE old_host_pool;"
@db.run "ALTER TABLE user_pool RENAME TO old_user_pool;"
@db.run "CREATE TABLE IF NOT EXISTS user_pool (oid INTEGER PRIMARY KEY, name VARCHAR(128), body TEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name));"
@db.fetch("SELECT * FROM old_user_pool") do |row|
@db[:user_pool].insert(
:oid => row[:oid],
:name => row[:name],
:body => row[:body],
:uid => "0",
:gid => row[:oid],
:owner_u => "1",
:group_u => "0",
:other_u => "0")
end
@db.run "DROP TABLE old_user_pool;"
@db.run "ALTER TABLE image_pool RENAME TO old_image_pool;"
@db.run "CREATE TABLE image_pool (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) );"
@db.fetch("SELECT * FROM old_image_pool") do |row|
doc = Document.new(row[:body])
# Delete PUBLIC elem
pub_elem = doc.root.delete_element("PUBLIC")
public_value = pub_elem.text
add_permissions(doc, public_value)
@db[:image_pool].insert(
:oid => row[:oid],
:name => row[:name],
:body => doc.root.to_s,
:uid => row[:uid],
:gid => row[:gid],
:owner_u => "1",
:group_u => public_value,
:other_u => "0")
end
@db.run "DROP TABLE old_image_pool;"
@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 TEXT, 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])
# There is no PUBLIC elem
public_value = "0"
add_permissions(doc, public_value)
@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 => "1",
:group_u => public_value,
:other_u => "0")
end
@db.run "DROP TABLE old_vm_pool;"
@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 TEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER, UNIQUE(name,uid));"
@db.fetch("SELECT * FROM old_network_pool") do |row|
doc = Document.new(row[:body])
# Delete PUBLIC elem
pub_elem = doc.root.delete_element("PUBLIC")
public_value = pub_elem.text
add_permissions(doc, public_value)
@db[:network_pool].insert(
:oid => row[:oid],
:name => row[:name],
:body => doc.root.to_s,
:uid => row[:uid],
:gid => row[:gid],
:owner_u => "1",
:group_u => public_value,
:other_u => "0")
end
@db.run "DROP TABLE old_network_pool;"
@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 TEXT, uid INTEGER, gid INTEGER, owner_u INTEGER, group_u INTEGER, other_u INTEGER);"
@db.fetch("SELECT * FROM old_template_pool") do |row|
doc = Document.new(row[:body])
# Delete PUBLIC elem
pub_elem = doc.root.delete_element("PUBLIC")
public_value = pub_elem.text
add_permissions(doc, public_value)
@db[:template_pool].insert(
:oid => row[:oid],
:name => row[:name],
:body => doc.root.to_s,
:uid => row[:uid],
:gid => row[:gid],
:owner_u => "1",
:group_u => public_value,
:other_u => "0")
end
@db.run "DROP TABLE old_template_pool;"
return true
end
def add_permissions(doc, public_value)
perm_elem = doc.root.add_element("PERMISSIONS")
perm_elem.add_element("OWNER_U").text = "1"
perm_elem.add_element("OWNER_M").text = "1"
perm_elem.add_element("OWNER_A").text = "0"
perm_elem.add_element("GROUP_U").text = public_value
perm_elem.add_element("GROUP_M").text = "0"
perm_elem.add_element("GROUP_A").text = "0"
perm_elem.add_element("OTHER_U").text = "0"
perm_elem.add_element("OTHER_M").text = "0"
perm_elem.add_element("OTHER_A").text = "0"
end
end